<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>weblog.masukomi.org</title>
    <link>https://weblog.masukomi.org/</link>
    <description>Recent content on weblog.masukomi.org</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <copyright>&amp;copy Kay Rhodes (masukomi.org) 2022</copyright>
    <lastBuildDate>Sat, 06 Jun 2026 00:00:00 -0400</lastBuildDate><atom:link href="https://weblog.masukomi.org/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>The Thing About Local LLMs</title>
      <link>https://weblog.masukomi.org/posts/the_thing_about_local_llms/</link>
      <pubDate>Sat, 06 Jun 2026 00:00:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/posts/the_thing_about_local_llms/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-reality-of-local-models&#34;&gt;The Reality of Local Models&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-mathematical-reality-of-no&#34;&gt;The Mathematical Reality of No&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#pi-changes-things&#34;&gt;Pi Changes Things&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#the-system-prompt&#34;&gt;The System Prompt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#extensions-over-skills&#34;&gt;Extensions over Skills&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#overriding-everything&#34;&gt;Overriding Everything&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#conversation-trees&#34;&gt;Conversation Trees&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;Someone responded to &lt;a href=&#34;https://weblog.masukomi.org/posts/getting_started_with_pi/&#34;&gt;yesterday&amp;rsquo;s post about the Pi coding agent&lt;/a&gt;, asking if I was using it with local models. I&amp;rsquo;ve done a &lt;em&gt;lot&lt;/em&gt; of testing with them, and I can say with great confidence that the hype about using them is mostly just that.&lt;/p&gt;
&lt;p&gt;At the same time, &lt;a href=&#34;https://pi.dev&#34;&gt;Pi&lt;/a&gt; is a &lt;em&gt;truly&lt;/em&gt; remarkable tool that is not &lt;em&gt;only&lt;/em&gt; your best option for working with local LLMs, but also - in my opinion - your best option for working with &lt;em&gt;any&lt;/em&gt; LLM.&lt;/p&gt;
&lt;h2 id=&#34;the-reality-of-local-models&#34;&gt;The Reality of Local Models&lt;/h2&gt;
&lt;p&gt;Unless you&amp;rsquo;re rich and can afford a beefy PC with multiple top-of-the-line GPU cards, there are very few edge cases where running a local LLM model makes sense.&lt;/p&gt;
&lt;p&gt;The videos claiming you can run them on a normal laptop or a Raspberry Pi are only &lt;strong&gt;technically&lt;/strong&gt; correct. Practically they are all lies. They have all had the delay between prompt and response edited out, and are probably running models that aren&amp;rsquo;t even remotely comparable to what you get from cloud providers.&lt;/p&gt;
&lt;p&gt;You &lt;em&gt;can&lt;/em&gt; run tiny models and get… bearable response times, but they&amp;rsquo;re 💩 for coding.&lt;/p&gt;
&lt;p&gt;My wife has a gaming PC with 1 good GPU, and in &lt;em&gt;theory&lt;/em&gt; we can get load Qwen3-Coder-Next 30b models into its memory, and get output similar to one of Anthtropic&amp;rsquo;s Sonnet models. I believe that, &lt;em&gt;but&lt;/em&gt; what&amp;rsquo;s unclear is how bearable the delay will be.&lt;/p&gt;
&lt;p&gt;She and her research partner Rhyannon (👋), have some things they want to investigate that involve or are facilitated by using local models, so we&amp;rsquo;re going to be seeing what that looks like and how usable it is.&lt;/p&gt;
&lt;h2 id=&#34;the-mathematical-reality-of-no&#34;&gt;The Mathematical Reality of No&lt;/h2&gt;
&lt;p&gt;So far, my experience has been that even on a maxed out mac laptop the &lt;em&gt;only&lt;/em&gt; use cases that are practical are background processes where you don&amp;rsquo;t actually care when it finishes. Apple&amp;rsquo;s claims about their &amp;ldquo;Neural Engine&amp;rdquo; are just hype. Yes, it&amp;rsquo;s probably better than CPUs without something like that, but good models are &lt;strong&gt;large&lt;/strong&gt; - like &lt;em&gt;really&lt;/em&gt; large - and if you want to use that model interactively you need to load the whole thing into the GPUs VRAM.&lt;/p&gt;
&lt;p&gt;The back-of-the-napkin equation is pretty straightforward: &lt;code&gt;M = Np * Bp&lt;/code&gt; where&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Symbol&lt;/th&gt;
          &lt;th&gt;Description&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;M&lt;/td&gt;
          &lt;td&gt;Memory in Gb&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Np&lt;/td&gt;
          &lt;td&gt;Number of parameters in Billions&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Bp&lt;/td&gt;
          &lt;td&gt;Bytes per parameter&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Some pre-calculated examples for models you might want to use:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;model&lt;/th&gt;
          &lt;th style=&#34;text-align: right&#34;&gt;Model VRAM Size&lt;/th&gt;
          &lt;th style=&#34;text-align: right&#34;&gt;Activation Mem&lt;/th&gt;
          &lt;th style=&#34;text-align: right&#34;&gt;Total Needed&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;qwen3:4b&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;8GB&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;~3.2GB&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;11.2GB&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;quen3:8b&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;16GB&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;~6.4GB&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;22.4GB&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;llama3.2:3b&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;6GB&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;~2.4GB&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;8.4GB&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;llama3.2:1b&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;2GB&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;~0.8Gb&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;2.8GB&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;On top of that we need to consider &amp;ldquo;Activation memory&amp;rdquo; - temp data used during inference or training. That&amp;rsquo;s generally another &lt;code&gt;~20-40%&lt;/code&gt;. In the table above I&amp;rsquo;ve used 40% to make sure we have &amp;ldquo;enough&amp;rdquo;. Note that Training (not something we&amp;rsquo;re discussing) requires 2-4x the parameter memory. Note that that extra &lt;code&gt;20-40%&lt;/code&gt; is required for &lt;em&gt;each&lt;/em&gt; agent and subagent hitting the system at the same time because they each have their own unique blob of text that inference needs to be run on. As soon as you exceed the VRAM of your GPU you start having massive performance penalties.&lt;/p&gt;
&lt;p&gt;Quantization of models helps lower the VRAM requirements, but the fact of the matter is that you need &lt;em&gt;way&lt;/em&gt; more VRAM dedicated to the GPU than &lt;em&gt;any&lt;/em&gt; laptop can provide.&lt;/p&gt;
&lt;h2 id=&#34;pi-changes-things&#34;&gt;Pi Changes Things&lt;/h2&gt;
&lt;p&gt;I think Pi isn&amp;rsquo;t just the &lt;strong&gt;right&lt;/strong&gt; paradigm / approach for coding agents. I also think that it&amp;rsquo;s minimalism is &lt;strong&gt;required&lt;/strong&gt; for doing &lt;strong&gt;anything&lt;/strong&gt; interactive with a local LLM. The things it can do to accommodate restrictive hardware end up working out a lot like accommodations for people with physical disabilities. Yes, it helps them, but it &lt;em&gt;also&lt;/em&gt; helps everyone else.&lt;/p&gt;
&lt;p&gt;All the other coding agents are financially motivated to use more of your tokens. Anthropic doesn&amp;rsquo;t care how wasteful Claude is of tokens as it does its work. The more it wastes the more you end up paying. Pi enables a lot of important things that minimize token usage:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;trivially small &amp;amp; modifiable &amp;ldquo;system prompt&amp;rdquo;&lt;/li&gt;
&lt;li&gt;encourages putting code in extensions not skills&lt;/li&gt;
&lt;li&gt;ability to override &lt;strong&gt;everything&lt;/strong&gt; with custom code&lt;/li&gt;
&lt;li&gt;the ability to treat interactions with the LLM as a tree&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;the-system-prompt&#34;&gt;The System Prompt&lt;/h3&gt;
&lt;p&gt;It&amp;rsquo;s been said that the thing that &lt;em&gt;truly&lt;/em&gt; differentiates the Agentic platforms is &lt;em&gt;not&lt;/em&gt; the models. It&amp;rsquo;s all the infrastructure and hidden prompts the vendors have built &lt;em&gt;around&lt;/em&gt; their models.&lt;/p&gt;
&lt;p&gt;The system prompt is one of those. It&amp;rsquo;s included at the start of every session and sucks down thousands of tokens. Claude&amp;rsquo;s changes between releases without warning, includes content dynamically generated by the agent (presumably more token usage) and there&amp;rsquo;s no easy way to see what it is. I&amp;rsquo;ve tried overriding it with the &lt;code&gt;--system-prompt-file a_file.md&lt;/code&gt; flag and &lt;code&gt;--system-prompt &amp;quot;some text&amp;quot;&lt;/code&gt; but it failed to follow the instructions I put in the prompt in both cases.&lt;/p&gt;
&lt;p&gt;Pi&amp;rsquo;s system prompt is known, tiny, and modifiable.&lt;/p&gt;
&lt;h3 id=&#34;extensions-over-skills&#34;&gt;Extensions over Skills&lt;/h3&gt;
&lt;p&gt;Agentic Skills are ultimately just Markdown documents that have to be read in and reasoned about before the system makes some non-deterministic choices about what to do, and what tools to use to do it with. You can&amp;rsquo;t &lt;em&gt;actually&lt;/em&gt; control it&amp;rsquo;s actions. It&amp;rsquo;s like giving instructions to a grade-schooler. It doesn&amp;rsquo;t matter how precise those instructions are, you can never be 100% sure they&amp;rsquo;ll be interpreted correctly, or consistently every time they&amp;rsquo;re read. Also, that reading uses tokens.&lt;/p&gt;
&lt;p&gt;Pi extensions are code. You &lt;em&gt;invoke&lt;/em&gt; them via a prompt just like skills, but once its invoked it&amp;rsquo;s just a matter of waiting for the code to finish its run and either hand something back to pi for further processing, or tell it it&amp;rsquo;s done. It doesn&amp;rsquo;t matter how complex the extension is, it doesn&amp;rsquo;t use any tokens unless you&amp;rsquo;re explicitly asking it to interact with the model.&lt;/p&gt;
&lt;h3 id=&#34;overriding-everything&#34;&gt;Overriding Everything&lt;/h3&gt;
&lt;p&gt;It&amp;rsquo;s not so much that you can override everything, because &lt;em&gt;most&lt;/em&gt; things in Claude code - for example - seem possible to be overridden with custom versions given a sufficient application of Markdown (and prayers). It&amp;rsquo;s that you can override everything &lt;em&gt;with deterministic code&lt;/em&gt; instead of throwing a block of Markdown text at it and hoping it interprets it correctly. Additionally, you don&amp;rsquo;t have to pay the token cost of processing those markdown instructions because - with Extensions - it doesn&amp;rsquo;t exist.&lt;/p&gt;
&lt;h3 id=&#34;conversation-trees&#34;&gt;Conversation Trees&lt;/h3&gt;
&lt;p&gt;Models have no memory. The ever-growing history of your conversation with an LLM in each session keeps getting sent to the LLM with each successive prompt. It has to read in the entire thing from scratch with every new prompt. In addition to just being wasteful, this can be problematic when the human or the agent have gone down side quests that either didn&amp;rsquo;t pan out, or weren&amp;rsquo;t relevant to the primary task at hand.&lt;/p&gt;
&lt;p&gt;A good example of this is the human asking the agent to explain something it just did. It&amp;rsquo;s useful to you, but each successive prompt to the LLM will have that useless blob of text to process.&lt;/p&gt;
&lt;p&gt;Pi&amp;rsquo;s &lt;a href=&#34;https://pi.dev/docs/latest/sessions#branching-with-tree&#34;&gt;sessions are stored as trees&lt;/a&gt;. This means that, in the example above, you could run &lt;code&gt;/tree&lt;/code&gt; and jump the context back to just before you asked it to explain. More significantly, if you and the Agent had been exploring some way of solving a coding problem only to find that your thinking was bad, or that it wasn&amp;rsquo;t possible, you could jump back so that those &amp;ldquo;bad&amp;rdquo; ideas were no longer things that had to be considered on each successive prompt.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Some Plugins To Get Started With Pi</title>
      <link>https://weblog.masukomi.org/posts/getting_started_with_pi/</link>
      <pubDate>Wed, 03 Jun 2026 00:00:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/posts/getting_started_with_pi/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#agentic-functionality&#34;&gt;Agentic Functionality&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#pi-subagents&#34;&gt;pi-subagents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#pi-agent-flow&#34;&gt;pi-agent-flow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#search&#34;&gt;Search&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#pi-web-access&#34;&gt;pi-web-access&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#pi-kagi-api&#34;&gt;pi-kagi-api&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#integrations&#34;&gt;Integrations&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#pi-mcp-adapter&#34;&gt;pi-mcp-adapter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#rpiv-args&#34;&gt;rpiv-args&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#pi-chrome&#34;&gt;pi-chrome&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#observability&#34;&gt;Observability&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#pi-kanban&#34;&gt;pi-kanban&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#pi-bar&#34;&gt;pi-bar&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#human-interaction&#34;&gt;Human Interaction&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#rpiv-ask-user-question&#34;&gt;rpiv-ask-user-question&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#plannotator&#34;&gt;plannotator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#rpiv-btw&#34;&gt;rpiv-btw&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#pi-permission-system&#34;&gt;pi-permission-system&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#pi-markdown-preview&#34;&gt;pi-markdown-preview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#resource-minimizization&#34;&gt;Resource Minimizization&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#pi-lean-ctx&#34;&gt;pi-lean-ctx&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#code-helpers&#34;&gt;Code Helpers&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#pi-simplify&#34;&gt;pi-simplify&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#potentially-cool-things&#34;&gt;Potentially Cool things&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#pi-hermes&#34;&gt;pi-hermes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#pi-studio&#34;&gt;pi-studio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#pi-actors&#34;&gt;pi-actors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#gentle-engram&#34;&gt;gentle-engram&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#pi-smart-fetch&#34;&gt;pi-smart-fetch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#pi-tldr&#34;&gt;pi-tldr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#pi-agent-browser-native&#34;&gt;pi-agent-browser-native&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#something-custom&#34;&gt;Something Custom&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;I see the &lt;a href=&#34;https://pi.dev/&#34;&gt;Pi coding agent&lt;/a&gt; a lot like emacs &amp;amp; vim. It&amp;rsquo;s filled with possibilities, but the bare bones version is only &lt;em&gt;technically&lt;/em&gt; usable. To really get the kind of interactions you want you need to add some useful packages.&lt;/p&gt;
&lt;p&gt;What follows is the collection of extensions &lt;em&gt;I&amp;rsquo;ve&lt;/em&gt; ended up with.&lt;/p&gt;
&lt;h2 id=&#34;agentic-functionality&#34;&gt;Agentic Functionality&lt;/h2&gt;
&lt;p&gt;⚠️ &lt;code&gt;pi-subagents&lt;/code&gt; &amp;amp; &lt;code&gt;pi-agent-flow&lt;/code&gt; are likely incompatible with each other. &lt;code&gt;pi-subagents&lt;/code&gt; is the most popular one, and has other extensions specifically designed to work with it. I&amp;rsquo;ve been using it without any problems.&lt;/p&gt;
&lt;h3 id=&#34;pi-subagents&#34;&gt;pi-subagents&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;pi-subagents&lt;/code&gt; lets Pi delegate work to focused child agents. Use it for code review, scouting, implementation, parallel audits, saved workflows, background jobs, and anything else that benefits from a second or third set of model eyes.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install with &lt;code&gt;pi install npm:pi-subagents&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pi.dev/packages/pi-subagents&#34;&gt;Package Details&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;pi-agent-flow&#34;&gt;pi-agent-flow&lt;/h3&gt;
&lt;p&gt;Long conversations can get messy—context bloats, tool calls get duplicated, and the real signal gets lost in the noise. Pi Agent Flow solves this by forking each task into a focused, isolated child process with only the context it actually needs.&lt;/p&gt;
&lt;p&gt;See &lt;a href=&#34;https://github.com/tuanhung303/pi-agent-flow#readme&#34;&gt;configuration details in README&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install with &lt;code&gt;pi install npm:pi-agent-flow&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pi.dev/packages/pi-agent-flow&#34;&gt;Package Details&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;search&#34;&gt;Search&lt;/h3&gt;
&lt;p&gt;Pi can&amp;rsquo;t search the web by default, because that isn&amp;rsquo;t just a matter of scraping search results from web pages. Ultimately you need to connect to a server that has an API that you can invoke to do web search stuff.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve listed two options below.&lt;/p&gt;
&lt;h4 id=&#34;pi-web-access&#34;&gt;pi-web-access&lt;/h4&gt;
&lt;p&gt;Web search, content extraction, and video understanding for Pi agent. Zero-config Exa search, optional browser-cookie Gemini Web, or bring your own API keys.&lt;/p&gt;
&lt;p&gt;⚠️ WARNING: defaults to using &lt;a href=&#34;https://exa.ai/&#34;&gt;Exa&lt;/a&gt; for web search, which is free for ≤ 1,000 searches per &lt;em&gt;month&lt;/em&gt;, and has a &lt;a href=&#34;https://exa.ai/pricing&#34;&gt;complex pricing system&lt;/a&gt; that isn&amp;rsquo;t obvious how it&amp;rsquo;ll play out. I &lt;em&gt;think&lt;/em&gt; the Exa integration also needs the &lt;a href=&#34;https://exa.ai/docs/reference/exa-mcp&#34;&gt;Exa MCP server&lt;/a&gt;. Instead of trying to figure all that out I gave it an API key for my Google Gemini account.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Zero Config&lt;/strong&gt;  — Works out of the box with Exa MCP (no API key needed). Add API keys for Exa, Perplexity, or Gemini API for more control, or opt into browser-cookie access for Gemini Web.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Video Understanding&lt;/strong&gt;  — Point it at a YouTube video or local screen recording and ask questions about what&amp;rsquo;s on screen. Full transcripts, visual descriptions, and frame extraction at exact timestamps.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Smart Fallbacks&lt;/strong&gt;  — Every capability has a fallback chain. Search tries Exa, then Perplexity, then Gemini API, then Gemini Web when browser cookies are enabled. YouTube tries Gemini Web when enabled, then API, then Perplexity. Blocked pages retry through Jina Reader and Gemini extraction. Something always works.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GitHub Cloning&lt;/strong&gt;  — GitHub URLs are cloned locally instead of scraped. The agent gets real file contents and a local path to explore, not rendered HTML.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;install with &lt;code&gt;pi install npm:pi-web-access&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/nicobailon/pi-web-access#readme&#34;&gt;Package Details&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;pi-kagi-api&#34;&gt;pi-kagi-api&lt;/h4&gt;
&lt;p&gt;Already have a Kagi account? This is less functional than &lt;code&gt;pi-web-access&lt;/code&gt; but… 🤷‍♀️&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://kagi.com/api/pricing&#34;&gt;API pricing&lt;/a&gt; is currently $0.012/request for &amp;ldquo;search&amp;rdquo; and $0.004/request for &amp;ldquo;extract&amp;rdquo; to get clean content from any URL.&lt;/p&gt;
&lt;p&gt;⚠️ There are multiple packages with this name. You want &lt;a href=&#34;https://pi.dev/packages/@mjakl/pi-kagi-api&#34;&gt;this one by mjakl&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install with &lt;code&gt;pi install npm:@mjakl/pi-kagi-api&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;Follow the instructions in the repo&amp;rsquo;s &lt;a href=&#34;https://github.com/mjakl/pi-kagi-api#readme&#34;&gt;README&lt;/a&gt; to generate an API key and save it so that this packaeg can use it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/mjakl/pi-kagi-api&#34;&gt;Package Details&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;integrations&#34;&gt;Integrations&lt;/h2&gt;
&lt;h3 id=&#34;pi-mcp-adapter&#34;&gt;pi-mcp-adapter&lt;/h3&gt;
&lt;p&gt;Let&amp;rsquo;s you use MCP servers&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install with &lt;code&gt;pi install npm:pi-mcp-adapter&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pi.dev/packages/pi-mcp-adapter&#34;&gt;Package Details&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;rpiv-args&#34;&gt;rpiv-args&lt;/h3&gt;
&lt;p&gt;Enables you to create skills that take arguments.&lt;/p&gt;
&lt;p&gt;Pass arguments to your skills like a shell command. &lt;code&gt;rpiv-args&lt;/code&gt; adds &lt;code&gt;$1&lt;/code&gt;, &lt;code&gt;$ARGUMENTS&lt;/code&gt;, &lt;code&gt;$@&lt;/code&gt;, &lt;code&gt;${@:N}&lt;/code&gt;, and &lt;code&gt;${@:N:L}&lt;/code&gt; placeholders to &lt;a href=&#34;https://github.com/badlogic/pi-mono&#34;&gt;Pi Agent&lt;/a&gt; skills - write &lt;code&gt;/skill:deploy api production&lt;/code&gt; and your skill body sees &lt;code&gt;$1&lt;/code&gt; = &lt;code&gt;api&lt;/code&gt;, &lt;code&gt;$2&lt;/code&gt; = &lt;code&gt;production&lt;/code&gt;. Skills without placeholders are untouched, so installing &lt;code&gt;rpiv-args&lt;/code&gt;  is safe for any existing skill collection.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install with &lt;code&gt;pi install npm:@juicesharp/rpiv-args&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/juicesharp/rpiv-mono/tree/main/packages/rpiv-args&#34;&gt;Package Details&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;pi-chrome&#34;&gt;pi-chrome&lt;/h3&gt;
&lt;p&gt;Enables &lt;a href=&#34;https://pi.dev&#34;&gt;Pi&lt;/a&gt; to use your existing signed-in Chrome profile after explicit authorization.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pi-chrome&lt;/code&gt; is backed by a small MIT-licensed Chrome extension that runs inside the Chrome profile &lt;strong&gt;you already use&lt;/strong&gt; — including every site you&amp;rsquo;re already signed into. Agents can inspect or control Chrome only after you run &lt;code&gt;/chrome authorize&lt;/code&gt;  in the current Pi session.&lt;/p&gt;
&lt;p&gt;Note: installing the required extension in chrome is a little weird. Read the docs in the repo&amp;rsquo;s README carefully.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install with &lt;code&gt;pi install npm:pi-chrome&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/tianrendong/pi-chrome#readme&#34;&gt;Package Details&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;observability&#34;&gt;Observability&lt;/h2&gt;
&lt;h3 id=&#34;pi-kanban&#34;&gt;pi-kanban&lt;/h3&gt;
&lt;p&gt;Click around a fully interactive dashboard with synthesized sessions, tasks, and subagents — no install.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install with &lt;code&gt;pi install npm:pi-kanban&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pi.dev/packages/pi-kanban?name=kanban&#34;&gt;Package Details&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;pi-bar&#34;&gt;pi-bar&lt;/h3&gt;
&lt;p&gt;A wee status bar extension at the bottom that tells you model, effort level, % of context used, and more. Not as fancy as &lt;a href=&#34;https://github.com/nicobailon/pi-powerline-footer&#34;&gt;pi-powerline-footer&lt;/a&gt; but also won&amp;rsquo;t require as many resources for things you don&amp;rsquo;t really info on.&lt;/p&gt;
&lt;p&gt;See the &lt;a href=&#34;https://github.com/kenbanks-peng/pi-bar#readme&#34;&gt;README&lt;/a&gt; for a screenshot, and instructions on how to configure the colors.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install with &lt;code&gt;pi install npm:@npm-ken/pi-bar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kenbanks-peng/pi-bar#readme&#34;&gt;Package Details&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;human-interaction&#34;&gt;Human Interaction&lt;/h2&gt;
&lt;h3 id=&#34;rpiv-ask-user-question&#34;&gt;rpiv-ask-user-question&lt;/h3&gt;
&lt;p&gt;Let the model ask you structured clarifying questions instead of guessing. &lt;code&gt;rpiv-ask-user-question&lt;/code&gt; adds the ask_user_question tool to Pi Agent - a tabbed dialog with single- and multi-select questions, side-by-side previews, per-option notes, and a Submit tab that reviews answers before they go back to the model.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install with &lt;code&gt;pi install npm:@juicesharp/rpiv-ask-user-question&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pi.dev/packages/@juicesharp/rpiv-ask-user-question&#34;&gt;Package Details&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;plannotator&#34;&gt;plannotator&lt;/h3&gt;
&lt;p&gt;(Plan + Annotator)
Provides an interactive way to annotate the agent&amp;rsquo;s plans via a nice web UI instead of it just spewing uneditable text to you in chat. The results are SO much better than trying to read plan details in the terminal. This tool is available for most agentic platforms.&lt;/p&gt;
&lt;p&gt;Check out the demo videos linked &lt;a href=&#34;https://github.com/backnotprop/plannotator#readme&#34;&gt;in the GitHub readme&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install With &lt;code&gt;pi install npm:@plannotator/pi-extension&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pi.dev/packages/@plannotator/pi-extension&#34;&gt;Package Details&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;rpiv-btw&#34;&gt;rpiv-btw&lt;/h3&gt;
&lt;p&gt;Ask a side question without polluting the main conversation. &lt;code&gt;rpiv-btw&lt;/code&gt; adds &lt;code&gt;/btw &amp;lt;question&amp;gt;&lt;/code&gt; to &lt;a href=&#34;https://github.com/badlogic/pi-mono&#34;&gt;Pi Agent&lt;/a&gt; - a lightweight side agent picks up a &lt;strong&gt;read-only clone&lt;/strong&gt; of your current conversation and answers in a panel at the bottom of the terminal. The side agent remembers its own &lt;code&gt;/btw&lt;/code&gt;  thread for follow-ups, while your main chat keeps going - its transcript is never polluted.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install with &lt;code&gt;pi install npm:@juicesharp/rpiv-btw&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pi.dev/packages/@juicesharp/rpiv-btw&#34;&gt;Package Details&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;pi-permission-system&#34;&gt;pi-permission-system&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Hides disallowed tools&lt;/strong&gt;  before the agent starts — no wasted turns probing for blocked tools&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Enforces allow / ask / deny&lt;/strong&gt;  at tool-call time with UI confirmation dialogs&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Controls bash commands&lt;/strong&gt;  with wildcard pattern matching ( &lt;code&gt;git *: ask&lt;/code&gt;, &lt;code&gt;rm -rf *: deny&lt;/code&gt; )&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gates MCP and skill access&lt;/strong&gt;  at server, tool, and skill-name granularity&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Protects sensitive file patterns&lt;/strong&gt; — cross-cutting &lt;code&gt;path&lt;/code&gt; rules deny &lt;code&gt;.env&lt;/code&gt;, &lt;code&gt;~/.ssh/*&lt;/code&gt; , etc. across all tools and bash at once&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Guards external paths&lt;/strong&gt; — prompts before file tools or bash commands reach outside &lt;code&gt;cwd&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Forwards prompts from subagents&lt;/strong&gt; — &lt;code&gt;ask&lt;/code&gt;  policies work even in non-UI execution contexts&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Broadcasts UI prompt events&lt;/strong&gt; — &lt;code&gt;permissions:ui_prompt&lt;/code&gt;  fires only when the permission system is about to invoke the active user-facing permission UI&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Native &lt;a href=&#34;https://github.com/gotgenes/pi-subagents&#34;&gt;&lt;code&gt;@gotgenes/pi-subagents&lt;/code&gt;&lt;/a&gt; integration&lt;/strong&gt; — in-process child sessions register with the permission system automatically, enabling per-agent policy enforcement and &lt;code&gt;ask&lt;/code&gt; \-state forwarding to the parent UI without configuration&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install with &lt;code&gt;pi install npm:@gotgenes/pi-permission-system&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/gotgenes/pi-packages/tree/main/packages/pi-permission-system#readme&#34;&gt;Package Details&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;pi-markdown-preview&#34;&gt;pi-markdown-preview&lt;/h3&gt;
&lt;p&gt;Preview assistant responses and local Markdown, LaTeX, code, diff, and other text-based files from pi in the terminal, browser, or as PDF, with math rendering, syntax highlighting, Mermaid, and theme-aware styling.&lt;/p&gt;
&lt;p&gt;Mostly I think this is going to be useful when it gives you big complicated responses and some syntax highlighting would help.&lt;/p&gt;
&lt;p&gt;See &lt;a href=&#34;https://github.com/omaclaren/pi-markdown-preview#usage&#34;&gt;Usage Instructions&lt;/a&gt; in the repo&amp;rsquo;s README.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install With &lt;code&gt;pi install npm:pi-markdown-preview&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;⚠️ Requires pandoc to be installed&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/omaclaren/pi-markdown-preview#readme&#34;&gt;Package Details&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;resource-minimizization&#34;&gt;Resource Minimizization&lt;/h2&gt;
&lt;h3 id=&#34;pi-lean-ctx&#34;&gt;pi-lean-ctx&lt;/h3&gt;
&lt;p&gt;Pi Coding Agent extension that provides ctx_-prefixed tools backed by &lt;a href=&#34;https://leanctx.com/&#34;&gt;lean-ctx&lt;/a&gt; for 60–90% token savings.&lt;/p&gt;
&lt;p&gt;Whenever it&amp;rsquo;s invoked it outputs how many tokens were saved. I&amp;rsquo;ve everything from no savings up to about 90%. Regardless if it meets that advertised 60+, it&amp;rsquo;s still saving tokens.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install with &lt;code&gt;pi install npm:pi-lean-ctx&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;⚠️ Requires lean-ctx to be installed. Follow the instructions for installing it as an MCP
After installing &lt;code&gt;lean-ctx&lt;/code&gt; &lt;em&gt;and&lt;/em&gt; &lt;code&gt;pi-lean-ctx&lt;/code&gt; run &lt;code&gt;lean-ctx onboard&lt;/code&gt;, then follow the instructions.&lt;/p&gt;
&lt;p&gt;If &lt;code&gt;lean-ctx doctor&lt;/code&gt; shows a conflict on the Dashboard Port you can &lt;em&gt;theoretically&lt;/em&gt; set it with the &lt;code&gt;LEAN_CTX_PROXY_PORT&lt;/code&gt; environment variable. &lt;em&gt;However&lt;/em&gt; I haven&amp;rsquo;t made this work.
Instead if i want to see the dashboard I run &lt;code&gt;lean-ctx dashboard --port=3334&lt;/code&gt; (or whatever port you want to use if the default (3333) is being used by something else.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pi.dev/packages/pi-lean-ctx&#34;&gt;Package Details&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;code-helpers&#34;&gt;Code Helpers&lt;/h2&gt;
&lt;h3 id=&#34;pi-simplify&#34;&gt;pi-simplify&lt;/h3&gt;
&lt;p&gt;When invoked, &lt;code&gt;/simplify&lt;/code&gt; detects changed files (via &lt;code&gt;git diff&lt;/code&gt; ) and instructs the agent to review them with these principles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Preserve functionality&lt;/strong&gt; : never change what the code does&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Apply project standards&lt;/strong&gt; : follow conventions from CLAUDE.md / AGENTS.md&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Enhance clarity&lt;/strong&gt; : reduce complexity, eliminate redundancy, improve naming&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Maintain balance&lt;/strong&gt; : avoid over-simplification&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install with &lt;code&gt;pi install npm:pi-simplify&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://pi.dev/packages/pi-simplify&#34;&gt;Package Details&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;potentially-cool-things&#34;&gt;Potentially Cool things&lt;/h2&gt;
&lt;p&gt;These look cool, but I haven&amp;rsquo;t tried them.&lt;/p&gt;
&lt;h3 id=&#34;pi-hermes&#34;&gt;pi-hermes&lt;/h3&gt;
&lt;p&gt;I like the idea of Hermes, but I&amp;rsquo;m not convinced it&amp;rsquo;s worth using because I haven&amp;rsquo;t seen any answers to the question of how works without bloating the context window. Only install this if you&amp;rsquo;re willing to take that risk.&lt;/p&gt;
&lt;p&gt;Your Pi agent normally forgets everything when you close a session. &lt;strong&gt;This extension fixes that.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;🔍 &lt;strong&gt;Search every conversation&lt;/strong&gt;  — &amp;ldquo;what did we discuss about auth?&amp;rdquo; finds it instantly&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🧠 &lt;strong&gt;Persistent memory&lt;/strong&gt;  — facts, preferences, corrections survive across sessions&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Learns from failures&lt;/strong&gt;  — remembers what didn&amp;rsquo;t work so you don&amp;rsquo;t repeat mistakes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🏷️ &lt;strong&gt;Categorized memories&lt;/strong&gt;  — failures, corrections, insights, conventions, and tool quirks organized for fast retrieval&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🛡️ &lt;strong&gt;Secret scanning&lt;/strong&gt;  — API keys and tokens are blocked from being saved&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;📚 &lt;strong&gt;Procedural skills&lt;/strong&gt; — the agent saves &lt;em&gt;how&lt;/em&gt;  it solved problems, not just what&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;⚡ &lt;strong&gt;Background learning&lt;/strong&gt;  — reviews every 10 turns, saves what matters&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🔄 &lt;strong&gt;Auto-consolidation&lt;/strong&gt;  — merges entries when full, never loses data&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install with &lt;code&gt;pi install npm:pi-hermes-memory&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/chandra447/pi-hermes-memory#readme&#34;&gt;Package Details&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;pi-studio&#34;&gt;pi-studio&lt;/h3&gt;
&lt;p&gt;Extension for &lt;a href=&#34;https://pi.dev&#34;&gt;pi&lt;/a&gt; that opens a local two-pane browser workspace for working with prompts, responses, live working details, Markdown and LaTeX documents, interactive HTML previews, code files, REPL sessions, and other common text-based files side by side. Annotate responses and files, add local comments, write, edit, run prompts, send code to a REPL, browse prompt and response history, request critiques, and use live preview for code, Markdown, LaTeX, and interactive HTML.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a video in the repo&amp;rsquo;s README.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install with &lt;code&gt;pi install npm:pi-studio&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/omaclaren/pi-studio#readme&#34;&gt;Package Details&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;pi-actors&#34;&gt;pi-actors&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;pi-actors&lt;/code&gt;  turns trusted local programs, scripts, recipes, services, pipelines, and sub-agents into addressable actors that agents can spawn, message, inspect, and compose.&lt;/p&gt;
&lt;p&gt;It is not just a command registry. A tool is a verb. An actor is a noun with time: address, lifecycle, state, logs, mailbox, artifacts, and an interaction contract.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-nil&#34; data-lang=&#34;nil&#34;&gt;program / process / service
→ command template
→ actor recipe
→ spawn
→ run:&amp;lt;id&amp;gt;
→ message / inspect / artifacts
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;Install with &lt;code&gt;pi install npm:@llblab/pi-actors&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pi.dev/packages/@llblab/pi-actors&#34;&gt;Package Details&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;gentle-engram&#34;&gt;gentle-engram&lt;/h3&gt;
&lt;p&gt;How It Works&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Agent completes significant work (bugfix, architecture decision, etc.)&lt;/li&gt;
&lt;li&gt;Agent calls mem_save → title, type, What/Why/Where/Learned&lt;/li&gt;
&lt;li&gt;Engram persists to SQLite with FTS5 indexing&lt;/li&gt;
&lt;li&gt;Next session: agent searches memory, gets relevant context&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Full details on session lifecycle, topic keys, and memory hygiene → &lt;a href=&#34;https://github.com/Gentleman-Programming/engram/blob/main/docs/ARCHITECTURE.md&#34;&gt;docs/ARCHITECTURE.md&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install With &lt;code&gt;pi install npm:gentle-engram&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;⚠️ requires the go binary to be installed. See the repo&amp;rsquo;s README for instructions.&lt;/li&gt;
&lt;li&gt;You may also need to run &lt;code&gt;engram setup pi&lt;/code&gt; after installing the binary. It&amp;rsquo;s not clear.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/Gentleman-Programming/engram#readme&#34;&gt;Package Details&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;pi-smart-fetch&#34;&gt;pi-smart-fetch&lt;/h3&gt;
&lt;p&gt;Better web fetching for agents. I really want to try this, I&amp;rsquo;m just unsure how it&amp;rsquo;ll interact with &lt;code&gt;pi-web-access&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The &amp;ldquo;Defuddle extraction&amp;rdquo; uses &lt;a href=&#34;https://github.com/kepano/defuddle&#34;&gt;defuddle&lt;/a&gt; which appears to be a variant on the readability algorithm to download just the contents of the web pages.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;*Features&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🔐 &lt;strong&gt;Browser-like TLS/SSL + HTTP fingerprints&lt;/strong&gt;  — better success on bot-defended pages&lt;/li&gt;
&lt;li&gt;🧹 &lt;strong&gt;Defuddle extraction&lt;/strong&gt;  — clean readable content instead of noisy HTML&lt;/li&gt;
&lt;li&gt;🧠 &lt;strong&gt;Useful metadata&lt;/strong&gt;  — title, author, site, language, published date when available&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;Downloads + large file support&lt;/strong&gt;  — stream attachments and binaries to temp files&lt;/li&gt;
&lt;li&gt;🔁 &lt;strong&gt;Client-side &lt;code&gt;&amp;lt;meta&amp;gt;&lt;/code&gt;  redirects&lt;/strong&gt;  — follows sane meta refresh redirects with loop limits&lt;/li&gt;
&lt;li&gt;🔗 &lt;strong&gt;Alternate content fallback&lt;/strong&gt; — when extraction produces no/thin content, follows qualified &lt;code&gt;&amp;lt;link rel=&amp;quot;alternate&amp;quot; type=&amp;quot;...&amp;quot;&amp;gt;&lt;/code&gt; entries in &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;  that match the requested output format&lt;/li&gt;
&lt;li&gt;⚡ &lt;strong&gt;Batch fetch&lt;/strong&gt;  — fetch many URLs with bounded concurrency&lt;/li&gt;
&lt;li&gt;📝 &lt;strong&gt;Multiple output formats&lt;/strong&gt; — &lt;code&gt;markdown&lt;/code&gt;, &lt;code&gt;html&lt;/code&gt;, &lt;code&gt;text&lt;/code&gt;, &lt;code&gt;json&lt;/code&gt;, &lt;code&gt;raw&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!--listend--&gt;
&lt;ul&gt;
&lt;li&gt;Install with &lt;code&gt;pi install npm:pi-smart-fetch&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/Thinkscape/agent-smart-fetch#readme&#34;&gt;Package Details&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;pi-tldr&#34;&gt;pi-tldr&lt;/h3&gt;
&lt;p&gt;During a prompt, pi displays a TLDR box like:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-nil&#34; data-lang=&#34;nil&#34;&gt;╭ tldr ─────────────────────────────────────────────╮
│ Inspecting the extension package structure        │
╰───────────────────────────────────────────────────╯
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The TLDR updates as pi works, including during tool calls and final responses.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install with &lt;code&gt;pi install npm:pi-tldr&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pi.dev/packages/pi-tldr&#34;&gt;Package Details&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;pi-agent-browser-native&#34;&gt;pi-agent-browser-native&lt;/h3&gt;
&lt;p&gt;Allows pi to drive Chrome &amp;amp; maybe other browsers. Not sure. There&amp;rsquo;s a lot in the docs. One thing it does do is allow you to take screenshots of the browser.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install with &lt;code&gt;pi install npm:pi-agent-browser-native&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/fitchmultz/pi-agent-browser-native#readme&#34;&gt;Package Details&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;something-custom&#34;&gt;Something Custom&lt;/h2&gt;
&lt;p&gt;One of the &lt;em&gt;key&lt;/em&gt; features of pi is its knowledge and ability to modify itself, and invoking this is surprisingly easy to do.&lt;/p&gt;
&lt;p&gt;For example, macOS ships with a positively ancient version of Ruby. I - like many others - use the &lt;a href=&#34;https://rbenv.org/&#34;&gt;rbenv&lt;/a&gt; Ruby version manager. pi was attempting to run some ruby commands to test things and they all kept failing because the version of ruby was too old. So, I started a new session, and told pi to create an extension that used whatever ruby version was specified in the &lt;code&gt;.ruby-version&lt;/code&gt; file or the default supplied by rbenv. A little later I realized I needed to make sure it invoked &lt;code&gt;bundle&lt;/code&gt; and &lt;code&gt;gem&lt;/code&gt; via the current rbenv specified version of ruby too.&lt;/p&gt;
&lt;p&gt;Now, it just uses the right versions all the time.&lt;/p&gt;
&lt;p&gt;So, don&amp;rsquo;t be afraid to just tell it to make you what you need if someone else hasn&amp;rsquo;t already created it.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Touchability Graphic</title>
      <link>https://weblog.masukomi.org/posts/touchability_graphic/</link>
      <pubDate>Sun, 31 May 2026 00:00:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/posts/touchability_graphic/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#example&#34;&gt;Example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#templates&#34;&gt;Templates&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#blank-template-images&#34;&gt;Blank template images&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#pre-divided-little-person&#34;&gt;Pre-divided little person&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#versions-of-the-person&#34;&gt;Versions of the person&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;The &amp;ldquo;Touch Meme&amp;rdquo; has been floating around the internet for a while, and it&amp;rsquo;s difficult - if not impossible - to find its origin. Over time the graphic has become degraded with JPEG artifacts.&lt;/p&gt;
&lt;p&gt;However, it&amp;rsquo;s proven a useful tool within the autism community for conveying where we&amp;rsquo;re comfortable being touched and by who.&lt;/p&gt;
&lt;p&gt;In order for people to have a nice clean starting point, I&amp;rsquo;ve recreated the graphic, with a few changes, and made it available in vector and rasterized formats. I&amp;rsquo;ve also created a version of the person pre-divided into sections so that you only need to use a &amp;ldquo;Paint Bucket&amp;rdquo; tool to fill in the parts with the colors appropriate for you.&lt;/p&gt;
&lt;h2 id=&#34;example&#34;&gt;Example&lt;/h2&gt;
&lt;p&gt;We each have very specific feelings about what parts of our body we&amp;rsquo;re ok with being touched by different groups of people.
For example, I don&amp;rsquo;t want strangers touching me at all but because our society demands it, I&amp;rsquo;m &amp;ldquo;Ehh&amp;rdquo; about shaking hands with acquaintances, and have learned to deal with the fact that touchy people may touch my arms. I&amp;rsquo;m fine with lovers touching my groin, but it&amp;rsquo;s a &amp;ldquo;hell no&amp;rdquo; from everyone else.&lt;/p&gt;
&lt;p&gt;Think about how you feel about each of these groups touching various parts of your body, and fill in the various body parts to represent how you feel about it.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a quick side-by-side of the blank template, and how I chose to fill it out.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2026/05/31/touchability_example.jpg&#34;
    alt=&#34;example of the empty template beside an example of it filled in&#34;&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;templates&#34;&gt;Templates&lt;/h2&gt;
&lt;h3 id=&#34;blank-template-images&#34;&gt;Blank template images&lt;/h3&gt;
&lt;p&gt;Download any of these to modify or fill in as you see fit. Note that the font used is &amp;ldquo;Marker Felt&amp;rdquo;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://weblog.masukomi.org/images/2026/05/31/touchability_template.jpg&#34;&gt;JPEG Format&lt;/a&gt; ← If you&amp;rsquo;re not sure, download this one.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://weblog.masukomi.org/images/2026/05/31/touchability_template.svg&#34;&gt;SVG Format&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://weblog.masukomi.org/images/2026/05/31/touchability_template.afdesign&#34;&gt;Affinity Designer Format&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;pre-divided-little-person&#34;&gt;Pre-divided little person&lt;/h3&gt;
&lt;p&gt;So that you can easily fill it the appropriate sections with the Paint Bucket tool. The colors are intended to be replaced with the ones that are appropriate for you. Fill them in then, copy-paste the colored person into the larger template so that folks can see what the colors mean and what group of people they apply to.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2026/05/31/person_with_color_sections.jpg&#34;
    alt=&#34;one of the people from the template pre-divided into sections.&#34;&gt;
&lt;/figure&gt;

&lt;h4 id=&#34;versions-of-the-person&#34;&gt;Versions of the person&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://weblog.masukomi.org/images/2026/05/31/person_with_color_sections.jpg&#34;&gt;JPEG Format&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://weblog.masukomi.org/images/2026/05/31/person_with_color_sections.svg&#34;&gt;SVG Format&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://weblog.masukomi.org/images/2026/05/31/person_with_color_sections.afdesign&#34;&gt;Affinity Designer Format&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>The Memory Of Media</title>
      <link>https://weblog.masukomi.org/posts/the_memory_of_media/</link>
      <pubDate>Sat, 30 May 2026 00:00:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/posts/the_memory_of_media/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#all-answers-are-misleading&#34;&gt;All Answers Are Misleading&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#favorite-media&#34;&gt;Favorite Media&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#movies&#34;&gt;Movies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#books&#34;&gt;Books&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#music&#34;&gt;Music&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#albums&#34;&gt;Albums&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#songs&#34;&gt;Songs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#art&#34;&gt;Art&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;Someone asked me about some of my favorite media, and I started to compile a list in my head, but then I realized two things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;any answer I give will be misleading.&lt;/li&gt;
&lt;li&gt;explaining &lt;em&gt;why&lt;/em&gt; is an excellent opportunity to shine a light on what it&amp;rsquo;s like to have Severely Deficient Autobiographical Memory.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;all-answers-are-misleading&#34;&gt;All Answers Are Misleading&lt;/h2&gt;
&lt;p&gt;Picking favorite media, is at some level a matter of making subjective qualitative judgements about media you&amp;rsquo;ve consumed. You might immediately think of two or three movies you really enjoyed and compare memories of them in your head. I can&amp;rsquo;t do that. Movies are one of the things I remember best, but even with movies I&amp;rsquo;ve seen again and again it&amp;rsquo;s just a collection of frozen moments and an emotion.&lt;/p&gt;
&lt;p&gt;When describing SDAM memory recall &lt;a href=&#34;https://sassysmith.substack.com/p/why-im-still-learning-from-readers?r=8cfml3&amp;amp;utm_campaign=post&amp;amp;utm_medium=web&amp;amp;triedRedirect=true&#34;&gt;Sassy Smith&lt;/a&gt; said&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The visual detail might be missing, the narrative thread might be gone, and the sense of who was there, what unfolded, what someone said, all of that might be inaccessible. Yet the emotion tied to that event, or the body sensation connected to it, might be present.&lt;/p&gt;
&lt;p&gt;…Some of that is probably my own experience shaping the lens. I have aphantasia, SDAM and alexithymia, so the idea of re-experiencing an emotion from a past memory is genuinely foreign to me. I don’t step back into the moment. I don’t re-feel what I felt then, and when I’ve spoken with others who share similar experiences, that’s largely what I’ve heard reflected back.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;My experience is very similar to hers, when I try and recall media I enjoyed, it&amp;rsquo;s mostly just an emotion, and one or two blurry frozen moments. I can tell you I loved Ender&amp;rsquo;s Game (the book) and that it hit me hard. I can&amp;rsquo;t tell you &lt;strong&gt;why&lt;/strong&gt;. I remember the pivotal moment just before the end. I &lt;strong&gt;know&lt;/strong&gt; that it was only as impactful as it was because of what came before it, but what came before it? I&amp;rsquo;m not sure. I know there was physical and mental training. I remember that Ender&amp;rsquo;s brother is a twisted man. I remember he had a sister who wasn&amp;rsquo;t. That&amp;rsquo;s it.&lt;/p&gt;
&lt;p&gt;When I&amp;rsquo;m making a list of favorite media I&amp;rsquo;m comparing little balls of emotion. I&amp;rsquo;m picking things that effected me strongly at whatever point in my life I encountered them. Would they effect me similarly today? Probably not, because I&amp;rsquo;m a different person now, but I can&amp;rsquo;t bring back the memory of the thing to consider through more experienced eyes. I can only say &amp;ldquo;this movie evoked strong emotion&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Before I move on, I should mention one curious twist of SDAM as it plays out in my head. Looking back, a movie may just be an emotion and a sense of like or dislike, but &lt;em&gt;re-watching&lt;/em&gt; that movie is different. Sometimes, the act of watching it is a series of specific pointers that trigger more normal memories: obscure facts about the actors, a future event in the film, a weird thing I noticed in the background in the scene they&amp;rsquo;re about to switch to. It depends on the film, and / or how many times I&amp;rsquo;ve seen it.&lt;/p&gt;
&lt;h2 id=&#34;favorite-media&#34;&gt;Favorite Media&lt;/h2&gt;
&lt;p&gt;As mentioned above, my memory of most of these is just a small detached emotion. Because of that, it&amp;rsquo;s not possible for me to rank any of these. They&amp;rsquo;re just things I consumed that effected me meaningfully. The lists are also inherently limited by what I can recall at the moment.&lt;/p&gt;
&lt;p&gt;The thing you need to understand about the descriptions I&amp;rsquo;ve added by each: it is - in most cases - all I have. That&amp;rsquo;s the &lt;em&gt;entire&lt;/em&gt; memory of the thing; that plus a little sense of emotion.&lt;/p&gt;
&lt;h3 id=&#34;movies&#34;&gt;Movies&lt;/h3&gt;
&lt;p&gt;You would think that watching a movie many times would cause me to recall it better, but that&amp;rsquo;s not really the case. I&amp;rsquo;ve seen Batman (the Tim Burton, and Michael Keaton one) maybe hundreds of times when I was a teen. It was literally the only movie I owned. At one point I had the entire script memorized. Now? I remember almost none of it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.imdb.com/title/tt0317705/&#34;&gt;The Incredibles&lt;/a&gt;
I&amp;rsquo;ve watched it at least ten times. There&amp;rsquo;s something wholesome about this. Something about family.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.imdb.com/title/tt0112495/&#34;&gt;Beyond Rangoon&lt;/a&gt;
This movie hit me hard in 1995. All I remember is that it&amp;rsquo;s about a white woman stumbling into political bullshit in Burma, and how badly it effects people.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.imdb.com/title/tt0110413&#34;&gt;Léon: The Professional&lt;/a&gt;
I remember flashes of the first five minutes or so, a couple moments later in the film, and that it hit me hard.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.imdb.com/title/tt0095250&#34;&gt;The Big Blue&lt;/a&gt;
I remember that it was about a competitive free diver who&amp;rsquo;d been hired for something. I remember that it left me unmoving, and unable to speak for a long time afterwards.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.imdb.com/title/tt0119116&#34;&gt;The Fifth Element&lt;/a&gt;
I adore this film, but the &amp;ldquo;I love you&amp;rdquo; bit at the end is cheap, and unearned, and completely undermines it. Unlike most films, I remember entire scenes from this. I have watched it many, many times.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.imdb.com/title/tt0112682&#34;&gt;The City of Lost Children&lt;/a&gt;
Weird in wonderful ways. Touching. Darkly funny. &amp;ldquo;Je suis l&amp;rsquo;original!&amp;rdquo; Trained fleas. A gentle giant. A little girl seeking her brother. A scientist trying to dream. A green mist. Trained fleas with a dark secret.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.imdb.com/title/tt0211915&#34;&gt;Amélie&lt;/a&gt;
Gods what a wonderful film: quirky, silly, intriguing, mischievous, kind. I can remember most of the characters, and many of the moments.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.imdb.com/title/tt0113243&#34;&gt;Hackers&lt;/a&gt;
It&amp;rsquo;s… a thing. Ridiculousness, seriousness, and naivete all mashed together in all the best ways. I&amp;rsquo;m not sure how much of my love of this movie is nostalgia and how much is the movie itself. I remember many scenes of this.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.imdb.com/title/tt0107688/&#34;&gt;The Nightmare Before Christmas&lt;/a&gt;
In no small part because I love Danny Elfman&amp;rsquo;s music. I remember many moments from this, and have seen it many times.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;books&#34;&gt;Books&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://amzn.to/4fgRERU&#34;&gt;Ender&amp;rsquo;s Game&lt;/a&gt;
An emotional gut punch. A twisted brother. A sister who was good, but I&amp;rsquo;m not sure why. An incredible twist. Yes, I&amp;rsquo;m aware the author is &lt;em&gt;very&lt;/em&gt; problematic, but unlike JKR he&amp;rsquo;s not using the sales of his creations to fund a genocide.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://amzn.to/4vjidL5&#34;&gt;The Harmony of Falling Snow&lt;/a&gt;
This book is my cozy place. I&amp;rsquo;ve read it maybe four times in the past year. I remember more of it than most any other media at the moment. Partially because I keep reading it. Partially because our world sucks, and I so desperately want to escape to theirs.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.amazon.com/MAGIC-HEALING-Crossroads-Adventure/dp/B00M0K6TXA&#34;&gt;The Magic And The Healing&lt;/a&gt;
I&amp;rsquo;ve read this many times, although it may have been a decade since I last did. I remember many moments from it, but not how the moments connect to each other. Like The Harmony of Falling Snow, it&amp;rsquo;s a world I wanted to escape to. I think it would be more meaningful to the me of my 20s than the me of my 50s, but it&amp;rsquo;s still an excellent book. I remember that it&amp;rsquo;s sequel was ok, but not as good.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://amzn.to/3RCNVEw&#34;&gt;The Summer Tree&lt;/a&gt;
I think I was still a teen when I read this. I remember thinking that &lt;em&gt;this&lt;/em&gt; was so much more deserving of love and adoration than The Hobbit. &lt;em&gt;This&lt;/em&gt; was the fantasy series people should have been making movies of. Now, I don&amp;rsquo;t remember much. I remember a man sacrificing himself on a tree in some way that went beyond the flesh. I remember a cliff. A long ride on horseback. Characters that were a thousand times more fleshed out and meaningful than anything Tolkien wrote.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://vyriadurav.itch.io/catnip&#34;&gt;Catnip&lt;/a&gt;
This is light popcorn fare, without the emotional impact of the others on this list, but I keep coming back to it. A little bit because it&amp;rsquo;s a polyamorous trans story. A little bit because it&amp;rsquo;s just cozy and hopeful. The &lt;a href=&#34;https://vyriadurav.itch.io/catnip-audiobook-edition&#34;&gt;audiobook&lt;/a&gt; is really good too.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;music&#34;&gt;Music&lt;/h3&gt;
&lt;p&gt;Music is… difficult for me to recommend. My relationship to it is &lt;em&gt;very&lt;/em&gt; autistic, and for a while I was working very hard to be a professional studio musician. I relate to it, and use it in different ways. I&amp;rsquo;ll take a song and put it on repeat for a month on two as I work on a project. I couldn&amp;rsquo;t play a song from memory, but the moment any of the songs / albums below start playing I know &lt;em&gt;exactly&lt;/em&gt; where it&amp;rsquo;s going.&lt;/p&gt;
&lt;h4 id=&#34;albums&#34;&gt;Albums&lt;/h4&gt;
&lt;p&gt;I&amp;rsquo;ve listened to all of these hundreds, of times.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://zapmama.bandcamp.com/album/adventures-in-afropea&#34;&gt;Zap Mamma: Adventures in Afropea 1&lt;/a&gt;
There never was a 2, and I think the band broke up leaving only one person to continue making music under this name afterwards. The other albums aren&amp;rsquo;t terrible, but they aren&amp;rsquo;t even remotely the same, or as good.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://music.youtube.com/playlist?list=OLAK5uy_mjr_ZVEdbDoLnkUKhYTB7mhG5yRZ2JRmo&#34;&gt;Bad Brains: I against I&lt;/a&gt;
Much more mainstream, and less punk than their other albums.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.youtube.com/playlist?list=PLKP69acNLdj96-cpyT65c7yGSMP2tWWZ-&#34;&gt;Pop Will Eat Itself: Cure For Sanity&lt;/a&gt;
So many good songs on this album: &amp;ldquo;X, Y, &amp;amp; Zee&amp;rdquo;, &amp;ldquo;92° F (The 3rd Degree)&amp;rdquo;, &amp;ldquo;Nightmare at 20,000 Feet&amp;rdquo; Everything on this album is burned into my synapses.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://orbitalofficial.bandcamp.com/album/orbital-2&#34;&gt;Orbital: Orbital 2&lt;/a&gt;
I still remember &amp;ldquo;Halcyon + On + On&amp;rdquo; playing over the intro to Hackers.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://anidifranco.bandcamp.com/album/ani-difranco&#34;&gt;Ani Difranco: Ani Difranco&lt;/a&gt;
I like all of her stuff, but this is the album I listened to the most. Like her, I&amp;rsquo;m not as frustrated and angry as I was when this album came out. But it&amp;rsquo;s still an incredible album.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://music.youtube.com/playlist?list=OLAK5uy_kX3ei2wl2iDD77kgmf1EcL0z9ZF8e4bq0&amp;amp;si=0BNTCGR-Age9DKZG&#34;&gt;The Suitcase Junket: Dying Star&lt;/a&gt;
Saw him doing his one-man-band thing on the side of the road during a town festival in Cambridge MA. Bought two CDs on the spot. This was one of them.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://music.youtube.com/playlist?list=OLAK5uy_kT4WsarfRaytnvA8aSj-Wq-JtcFN8JQyc&amp;amp;si=TQzC6oeYd_J3wngh&#34;&gt;The Dave Brubek Quartet: Time Out&lt;/a&gt;
Recorded in 1959 and still as amazing as ever. &amp;ldquo;Take Five&amp;rdquo; is - of course - my favorite.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://music.youtube.com/playlist?list=OLAK5uy_lSza7aA85vMKSEiQ0wDr1nkAXpwO80x9Q&amp;amp;si=RmUN75dOLwjSO9yD&#34;&gt;Metallica: Master of Puppets&lt;/a&gt;
I rarely listen to Metallica anymore, but this album has a special place in my heart. At one point I knew it so well that I could isolate the instruments in my head and listen to any one of them individually in my head.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Recent additions, not so firmly entrenched in my brain.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.youtube.com/playlist?list=PLLza5YQl0LgCmmvmhdlrYDRQr1G5t3vD9&#34;&gt;Sofi Tukker: Soft Animals&lt;/a&gt;
I like a lot of their stuff, but this is the album I&amp;rsquo;ve listened to the most.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;songs&#34;&gt;Songs&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://youtu.be/Ic5vxw3eijY&#34;&gt;Estelle: American Boy&lt;/a&gt;
Without exaggeration, I&amp;rsquo;ve listened to this thousands of times.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://youtu.be/qlrpeYdm9Ec?&#34;&gt;WING: Dopamine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://youtu.be/-HMu5SS46_Y&#34;&gt;Hiss, WING: Object&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://youtu.be/59Q_lhgGANc&#34;&gt;Jain: Makeba&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://music.youtube.com/watch?v=B9FzVhw8_bY&#34;&gt;The Dead South: In Hell I&amp;rsquo;ll Be In Good Company&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://youtu.be/VYOjWnS4cMY&#34;&gt;Childish Gambino: This is America&lt;/a&gt;
Not because I listen to it often, or because I particularly love it, but because I think it and its accompanying video are more relevant with every passing day.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;art&#34;&gt;Art&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Auguste_Rodin&#34;&gt;Auguste Rodin&lt;/a&gt;
No sculpture has ever moved me like his can.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Pablo_Picasso&#34;&gt;Pablo Picasso&lt;/a&gt;
A master of the line, but also someone I have a personal connection to.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Ansel_Adams&#34;&gt;Ansel Adams&lt;/a&gt;
How can you not love what he saw?&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Robert_Mapplethorpe&#34;&gt;Robert Mapelthorpe&lt;/a&gt;
Some of his stuff I don&amp;rsquo;t care about. Some hit me hard when I first encountered it.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Pierre-Auguste_Renoir&#34;&gt;Pierre-August Renoir&lt;/a&gt;
I don&amp;rsquo;t want a picture of his hanging on my wall, but there&amp;rsquo;s something beautiful about his work.&lt;/li&gt;
&lt;li&gt;Nancy Angell / Angell-Rickenbacker
My mom. Incredibly talented. Sadly unknown, despite having a few pieces in museums.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Yes, We Cook For Our Dogs</title>
      <link>https://weblog.masukomi.org/posts/yes_we_cook_for_our_dogs/</link>
      <pubDate>Sat, 02 May 2026 00:00:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/posts/yes_we_cook_for_our_dogs/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#why-we-do-it&#34;&gt;Why We Do It&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#what-we-do&#34;&gt;What We Do&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#how-often&#34;&gt;How Often?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#what-are-they-like&#34;&gt;What Are They Like?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#treats&#34;&gt;Treats&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#is-this-really-healthy-safe&#34;&gt;Is This Really Healthy / Safe?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#downsides&#34;&gt;Downsides&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#warning&#34;&gt;Warning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#should-you-do-it&#34;&gt;Should You Do It?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;We cook for our dogs. Not because of any nutritional ideology, or because we think our dogs are too good for kibble. No, we cook for them because we didn&amp;rsquo;t have any other option, and once we saw the effect, we couldn&amp;rsquo;t morally stop.&lt;/p&gt;
&lt;h2 id=&#34;why-we-do-it&#34;&gt;Why We Do It&lt;/h2&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2026/05/02/ben.jpg&#34;
    alt=&#34;A photograph of a happy black and white springer spaniel border collie mix&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;That&amp;rsquo;s Ben. Ben was a Springer-Spaniel Border Collie mix. He&amp;rsquo;d been through some traumatizing stuff before Wifey got him, but with enough years of love and affection, he grew into a sweet lovable semi-neurotic doofus. He also grew old. Eventually, food stopped being interesting to him. We tried everything we could get our hands on. Cheap filler laden crap. Stupidly expensive freeze-dried organic whatever. At best we&amp;rsquo;d get two days worth of interest from him, and then he&amp;rsquo;d go back to not eating.&lt;/p&gt;
&lt;p&gt;But then Wifey found &lt;a href=&#34;https://amzn.to/4cVGUWd&#34;&gt;Feed Your Best Friend Better: Easy, Nutritious Meals and Treats for Dogs&lt;/a&gt;&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2026/05/02/feed_your_best_friend_better.jpg&#34;
    alt=&#34;The cover of Feed Your Best Friend Better&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Everything changed after that. He was interested in food again. Admittedly, sometimes Wifey would have to hand-feed him to convince him to &lt;em&gt;keep&lt;/em&gt; eating, but he &lt;em&gt;would&lt;/em&gt; keep eating. Once he started eating, his quality of life didn&amp;rsquo;t &lt;em&gt;just&lt;/em&gt; reset to where it was before he stopped eating. It was like the clock got rolled back by &lt;em&gt;years&lt;/em&gt;. He started running, and rolling, and playing with our other dog. He had energy and enthusiasm.&lt;/p&gt;
&lt;p&gt;The effects on our younger dog weren&amp;rsquo;t nearly as pronounced because she was already young and spry, but we knew that under the covers it was making a huge difference in keeping her vibrant and alive, and would do so for the rest of her life. When Ben finally passed, we couldn&amp;rsquo;t - in good conscience - stop cooking for Lita, or our latest dog Maui.&lt;/p&gt;
&lt;h2 id=&#34;what-we-do&#34;&gt;What We Do&lt;/h2&gt;
&lt;p&gt;We always have a different breakfast and dinner meal in the fridge. When choosing the next ones we&amp;rsquo;ll cook we try to make sure to rotate through different proteins and starches. For example, breakfast might be a tub of &amp;ldquo;Chicken Thighs and Tabbouleh&amp;rdquo; while dinner is &amp;ldquo;Beef and Sweet Potato&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;This book, and another one we use, has a lot of recipes for treats. We ignore all of those. We make the &amp;ldquo;meals&amp;rdquo;. One of our dogs is 30lbs (13kg), and the other is 40lbs (18kg), so we typically double the recipes and end up making about 2.5 US Gallons worth of food in each batch. We divide it into two Tupperware tubs. One goes into the freezer, and the other is probably going to be their next meal.&lt;/p&gt;
&lt;p&gt;The recipes are really simple, and many of them can be simplified even more. For example, dogs don&amp;rsquo;t really care if you chop the parsley leaves, so I&amp;rsquo;ve stopped bothering. I just rinse them to get rid of the grit, then rip off the leaves, and put half the pile into each batch.&lt;/p&gt;
&lt;p&gt;Most of the meals involve chopping a bunch of chicken or tubers which end up in two big pots on the stove. The only notable changes we make to the recipes is never using garlic powder because garlic is toxic to dogs, and frequently replacing water with low or no sodium broth.&lt;/p&gt;
&lt;p&gt;Slow cooker meals can&amp;rsquo;t be doubled, but are generally &lt;em&gt;very&lt;/em&gt; easy to make and give us another option for getting different proteins and starches into their systems.&lt;/p&gt;
&lt;h3 id=&#34;how-often&#34;&gt;How Often?&lt;/h3&gt;
&lt;p&gt;A tub usually lasts us about four days. So, we end up cooking roughly two meals a week. Remember, each one is doubled so there&amp;rsquo;s a frozen half waiting when the first tub runs out. That being said, we try and cook ahead a little bit extra, so that when the time comes to grab something from the freezer we don&amp;rsquo;t have to just repeat what they just ate. We can rotate to a meal with a different protein and starch.&lt;/p&gt;
&lt;h2 id=&#34;what-are-they-like&#34;&gt;What Are They Like?&lt;/h2&gt;
&lt;p&gt;Generally, pretty bland and uninteresting to a humans. We need salt. They don&amp;rsquo;t. They&amp;rsquo;re generally 1 part meat, 1 part starch, and a handful or two of veggies. After getting familiar with what ingredients are safe for dogs, and the ratios it&amp;rsquo;s pretty easy to just make up a recipe on the fly from whatever meat you have available + random pantry things.&lt;/p&gt;
&lt;p&gt;A couple of them are pretty tasty though. I always steal a couple bites of the &amp;ldquo;Chicken Thighs and Tabouleh&amp;rdquo; when its fresh, and when we&amp;rsquo;re feeding them &amp;ldquo;Overnight Oats&amp;rdquo; (yogurt, honey, lemon, oats, apples) I always steal a bite or four while filling their bowls.&lt;/p&gt;
&lt;h2 id=&#34;treats&#34;&gt;Treats&lt;/h2&gt;
&lt;p&gt;There&amp;rsquo;s only one treat we make for our dogs, and I don&amp;rsquo;t remember where we found it. Take one large tub of plain yogurt. One jar of all natural&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; smooth peanut butter. Mix with a stiff spoon, pour into &lt;a href=&#34;https://amzn.to/4t8OXoA&#34;&gt;massive silicone ice-cube molds&lt;/a&gt;, let freeze for about 24 hours.&lt;/p&gt;
&lt;p&gt;We have found literally no treat that is higher value than this. Well, none that&amp;rsquo;s healthy to give to them with any regularity. One dog bites off pieces and devours his in under two minutes. The other dog slowly licks hers until it gradually disappears many minutes later.&lt;/p&gt;
&lt;h2 id=&#34;is-this-really-healthy-safe&#34;&gt;Is This Really Healthy / Safe?&lt;/h2&gt;
&lt;p&gt;We&amp;rsquo;re not vets, but what I can tell you is that we&amp;rsquo;ve been doing this with three dogs now for over a decade. They get blood-work and a checkup every year, and every year our vet pronounces them healthy, .&lt;/p&gt;
&lt;p&gt;New vets, and new vet-techs &lt;em&gt;will&lt;/em&gt; be skeptical because most people who cook for their dogs do some weird ass things that don&amp;rsquo;t actually correspond to what a dog needs to be healthy. For example, they&amp;rsquo;re not vegetarians, so trying to give them a meat free diet is not great. Similarly, there are problems with raw diets too.&lt;/p&gt;
&lt;p&gt;Additionally, you have to be vigilant about constantly rotating the things their eating. No meal you make will have all the nutrients they need. It&amp;rsquo;s just like feeding humans. Dog diets aren&amp;rsquo;t that different from ours, they just have a couple more things that are toxic, and - proportionally - need a lot more meat than we do.&lt;/p&gt;
&lt;p&gt;Side note: every year they ask us how much we feed them at each meal, and every year we have to explain to them that whatever number we give them is meaningless because it doesn&amp;rsquo;t correspond to the caloric density of kibble which they&amp;rsquo;ve been trained on, and the calories, and nutrients they get from the same volume changes with literally every meal.&lt;/p&gt;
&lt;h2 id=&#34;downsides&#34;&gt;Downsides&lt;/h2&gt;
&lt;p&gt;There are two pretty obvious downsides.&lt;/p&gt;
&lt;p&gt;Cooking two or three more meals every week sucks if you don&amp;rsquo;t have a House Spouse. Most people I know are too drained at the end of the day to cook their own meals, never-mind cook for the dogs.&lt;/p&gt;
&lt;p&gt;Meat isn&amp;rsquo;t cheap. Veggies aren&amp;rsquo;t cheap. Dog meals use a lot of meat, and a good amount of veggies. We can only afford to cook for our dogs because we have tech-money coming into our household.&lt;/p&gt;
&lt;p&gt;Less obvious is dialing in the proportions. Guidance for kibble volume &lt;em&gt;does&lt;/em&gt; not apply. The caloric density is not only completely different, but it varies from meal to meal. Because we&amp;rsquo;re rotating constantly I&amp;rsquo;ve found a volume that works for each dog, and I always give them that volume. For some meals this means they&amp;rsquo;re getting less calories, for some meals they get more, but the constant rotation and the fact that we have two different meals every day evens this out in the end.&lt;/p&gt;
&lt;p&gt;The only way to know how much to give you dog is to just watch their body weight very carefully. I don&amp;rsquo;t mean weighing them. I mean just looking down and making sure their ribs are just barely visible, and that their abdomens curve in behind them. If one of our dogs wasn&amp;rsquo;t a short-hair we&amp;rsquo;d probably have to weigh them every couple weeks.&lt;/p&gt;
&lt;p&gt;Checking the shape of our black dog as I&amp;rsquo;m putting together their bowls has just become part of my routine.&lt;/p&gt;
&lt;h2 id=&#34;warning&#34;&gt;Warning&lt;/h2&gt;
&lt;p&gt;Many people into healthy dog diet things swear by garlic powder for allergies and stuff like that. There is zero research to support this, and plenty of research showing that small amounts of garlic or onion can lead to kidney failure. &lt;em&gt;Do Not&lt;/em&gt; feed your dogs &lt;em&gt;any&lt;/em&gt; member of the &lt;a href=&#34;https://en.wikipedia.org/wiki/Allium&#34;&gt;Allium family&lt;/a&gt;: onion, garlic, scallions, shallots, leeks, or chives. The same goes for grapes and raisins.&lt;/p&gt;
&lt;p&gt;If your dog consumes any of these you should induce vomiting immediately. You should know how, and have the things you&amp;rsquo;ll need to do so on hand. We have &lt;a href=&#34;https://amzn.to/426kQmW&#34;&gt;60ml Irrigation Piston Syringes&lt;/a&gt; in our first-aid kits, and use that to get &lt;a href=&#34;https://www.ellicottvets.com/hydrogen-peroxide-dosage-dogs-weight/&#34;&gt;the appropriate amount of Hydrogen Peroxide&lt;/a&gt; down their throats.&lt;/p&gt;
&lt;p&gt;Unfortunately the cookbook referenced above seems to want to add garlic powder to almost every meal.&lt;/p&gt;
&lt;h2 id=&#34;should-you-do-it&#34;&gt;Should You Do It?&lt;/h2&gt;
&lt;p&gt;If you can afford to buy extra meat and veggies every week, then yes. You absolutely should. Even when Wifey and I were both working and really &lt;em&gt;really&lt;/em&gt; didn&amp;rsquo;t want to cook a dog meal in addition to our own, we knew what a huge difference it made to their quality of life, and continued to do it.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;All Natural Peanut Butter: There are so many random ingredients thrown into peanut butter these days that it&amp;rsquo;s not worth the effort of buying anything except all-natural peanut butter that only has 1 ingredient (peanuts). Artificial sweeteners are toxic, and salt isn&amp;rsquo;t good for them, so keep it simple and buy the healthy stuff.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Making Useful Structured Commits That Become Changelogs</title>
      <link>https://weblog.masukomi.org/posts/working_with_git_com_to_create_changelogs/</link>
      <pubDate>Sat, 04 Apr 2026 00:00:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/posts/working_with_git_com_to_create_changelogs/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#what-should-be-in-your-commit&#34;&gt;What Should Be In Your Commit?&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#titles&#34;&gt;Titles&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#start-with-structure&#34;&gt;Start with structure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#keep-it-concise&#34;&gt;Keep it concise&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#different-text-for-different-audiences&#34;&gt;Different Text for Different Audiences&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#body&#34;&gt;Body&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#example-config&#34;&gt;Example Config&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#changelogs&#34;&gt;Changelogs&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#the-goal&#34;&gt;The goal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#making-it-happen&#34;&gt;Making it Happen&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#1-dot-figure-out-what-to-look-for&#34;&gt;1. Figure out what to look for&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#2-dot-apply-modifiers&#34;&gt;2. Apply modifiers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#3-dot-generate-output&#34;&gt;3. Generate Output&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#consistency-consistency-consistency&#34;&gt;Consistency Consistency Consistency&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#summary&#34;&gt;Summary&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#bonus&#34;&gt;Bonus&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://git-com.masukomi.org&#34;&gt;git-com&lt;/a&gt; is a tool that makes it easy to create structured commit messages. It exists because of two roles I&amp;rsquo;ve played at work:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;release manager&lt;/li&gt;
&lt;li&gt;Leading a support engineering team tasked with putting out production fires.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Both of these jobs involved investigating what actually ended up in a release.
With the support engineering role I needed to find out what got added that might have broken a thing. With the release manager role I needed to find out what actually got added as compared to what was promised, or never mentioned. Then, I needed to create a document to convey those changes.&lt;/p&gt;
&lt;p&gt;Having a readable structured commit history would have been &lt;em&gt;huge&lt;/em&gt; for me back then. Now that I do have one it&amp;rsquo;s proving invaluable.&lt;/p&gt;
&lt;p&gt;This post discusses how to think about creating and utilizing structured commits in a way that will help you accomplish two goals:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;finding specific changes in your history&lt;/li&gt;
&lt;li&gt;conveying what changed to others via generated changelogs&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;None of this &lt;em&gt;requires&lt;/em&gt; git-com, but using it will definitely facilitate the process, and it&amp;rsquo;s written from the perspective of someone using it.&lt;/p&gt;
&lt;h2 id=&#34;what-should-be-in-your-commit&#34;&gt;What Should Be In Your Commit?&lt;/h2&gt;
&lt;p&gt;git-com is intentionally not opinionated about this. What is &amp;ldquo;useful&amp;rdquo; or &amp;ldquo;good&amp;rdquo; varies wildly from project to project.&lt;/p&gt;
&lt;p&gt;The one guiding thing I can say with a &lt;em&gt;lot&lt;/em&gt; of confidence is that you should &lt;strong&gt;never add structured data to your git commit messages that you don&amp;rsquo;t need.&lt;/strong&gt; Leave off the &amp;ldquo;nice to have&amp;rdquo; items. Every &amp;ldquo;unnecessary&amp;rdquo; step you make someone take (even you) when creating a git commit is another tiny piece of built up resentment.&lt;/p&gt;
&lt;h3 id=&#34;titles&#34;&gt;Titles&lt;/h3&gt;
&lt;p&gt;Getting the title &amp;ldquo;right&amp;rdquo; is the &lt;em&gt;most&lt;/em&gt; important thing. There are many cases where the title is the only thing you&amp;rsquo;re going to see until you dig in for more info. Thus the title needs to convey the most critical information in order for you to know if you &lt;em&gt;want&lt;/em&gt; to get more info. The title is frequently the only thing that gets written in a commit, &lt;em&gt;and&lt;/em&gt; they&amp;rsquo;ll show up in your changelog, or become the starting point for what shows up.&lt;/p&gt;
&lt;p&gt;There is, however a significant limitation on git titles: They &lt;em&gt;should&lt;/em&gt; be ≤ 72 characters. Ideally they should be around 50.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; That makes for a tricky balance.&lt;/p&gt;
&lt;p&gt;Additionally, you need to think about what will be useful to the tooling that will take the commit messages and convert them into a changelog.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve addressed these problems in two ways.&lt;/p&gt;
&lt;h4 id=&#34;start-with-structure&#34;&gt;Start with structure&lt;/h4&gt;
&lt;p&gt;All my git-com generated commit messages start with &lt;code&gt;[&amp;lt;change type&amp;gt;]&lt;/code&gt;. This serves two purposes.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The square brackets draw your visual attention. They say &amp;ldquo;hey this is most critical bit of this line&amp;rdquo;&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s not something I&amp;rsquo;ll bother with when making a quickie &amp;ldquo;corrected spelling errors&amp;rdquo; type commit, and thus it becomes easy to distinguish &amp;ldquo;stuff worth conveying to others&amp;rdquo; from &amp;ldquo;one of the many little changes that got made but aren&amp;rsquo;t worth talking about&amp;rdquo;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Because the contents of those square brackets come from a limited set of choices defined in my &lt;code&gt;.git-com.yaml&lt;/code&gt; file, it also serves as a way for my changelog generator to easily distinguish between a changelog worthy commit and something that just happens to start with square brackets. This also means that you can have commits in your git log that, by virtue of having no structure don&amp;rsquo;t end up in the changelog.&lt;/p&gt;
&lt;p&gt;Personally I use &lt;code&gt;git commit -m &amp;quot;corrected spelling errors&amp;quot;&lt;/code&gt; for things not worth conveying, but if you want to build the habit of always using &lt;code&gt;git-com&lt;/code&gt; you have two options.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;use a specific change type that will be visible in your commits but excluded later. E.g. &lt;code&gt;[meh]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;make the change type option &amp;ldquo;skippable&amp;rdquo;. The skip option appears first so you can just whack the enter key if you don&amp;rsquo;t care about choosing something from the list.
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;allow-empty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;empty-selection-text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Skip&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Neither of these is &amp;ldquo;better&amp;rdquo;. I like the idea of having trivial commits start with &lt;code&gt;[meh]&lt;/code&gt; It sounds entertaining. On the other hand, I can see the argument that you&amp;rsquo;d want to draw as little attention as possible to commits that aren&amp;rsquo;t noteworthy. That way humans scanning &lt;code&gt;git log&lt;/code&gt; output don&amp;rsquo;t have their eyes drawn to unimportant things.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m &lt;em&gt;firmly&lt;/em&gt; of the belief that the &lt;em&gt;type&lt;/em&gt; of change is the most important thing to have in a commits title in order to help anyone who needs to look through the log to find something specific.&lt;/p&gt;
&lt;p&gt;I also believe that change type is an excellent way of breaking down changelogs of software products. I don&amp;rsquo;t want features, fixes, and tweaks to all be mixed together in a jumble of a list. Sometimes I want to know what cool features a project has added. Sometimes I just want to know if they fixed a specific bug.&lt;/p&gt;
&lt;h4 id=&#34;keep-it-concise&#34;&gt;Keep it concise&lt;/h4&gt;
&lt;p&gt;Not because of the character limit, but as a way of being nice to future humans. The freeform portion of the title should contain &lt;em&gt;only&lt;/em&gt; enough information for a reader to know if it&amp;rsquo;s worth their attention.&lt;/p&gt;
&lt;p&gt;Ex. &amp;ldquo;full-text search refinements&amp;rdquo; not &amp;ldquo;reworked our use of faceted search to prioritize items we sell&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Additional details like that can be added to the commit body. Just give me enough information to be able to determine if this commit is the one I care about or need more details on.&lt;/p&gt;
&lt;h4 id=&#34;different-text-for-different-audiences&#34;&gt;Different Text for Different Audiences&lt;/h4&gt;
&lt;p&gt;Git logs and changelogs are things generated for different audiences. Git logs are for geeks looking into the details of a codebase. Changelogs are for people who use your tool, or maybe for stakeholders within your company who have been involved in guiding the tool. They have different needs.&lt;/p&gt;
&lt;p&gt;Because of this, it&amp;rsquo;s important to keep in mind that the text that appears in your git logs isn&amp;rsquo;t necessarily the text you want to show in your changelogs. With regards to the structured text this is easily handled with aliases, and leads to some interesting possibilities.&lt;/p&gt;
&lt;p&gt;Git wants &lt;em&gt;short&lt;/em&gt; titles, so find short ways to represent things like change type in actual commits. &amp;ldquo;feature&amp;rdquo; is a lot longer than &amp;ldquo;add&amp;rdquo; or &amp;ldquo;feat&amp;rdquo;, and you don&amp;rsquo;t really need to indicate that &amp;ldquo;feat&amp;rdquo; is an abbreviation by adding a period (&amp;ldquo;feat.&amp;rdquo;).&lt;/p&gt;
&lt;p&gt;Personally I&amp;rsquo;ve settled on&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;add&lt;/li&gt;
&lt;li&gt;fix&lt;/li&gt;
&lt;li&gt;clean-up&lt;/li&gt;
&lt;li&gt;refactor&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You&amp;rsquo;ll note that the last two &lt;em&gt;could&lt;/em&gt; be shorter. I &lt;em&gt;want&lt;/em&gt; them to be shorter, but &amp;ldquo;cleanup&amp;rdquo; annoys me, and &amp;ldquo;clean&amp;rdquo; feels wrong. I also haven&amp;rsquo;t thought of a shorter way to say &amp;ldquo;refactor&amp;rdquo;. What you end up will be the result of a highly subjective balancing act.&lt;/p&gt;
&lt;p&gt;However, as I noted before, the thing in your git commit message doesn&amp;rsquo;t have to be identical to what&amp;rsquo;s displayed in the changelog. So you can put short things in the commit message that end up as longer things in the final communication. You can also put in things that will be excluded. Like fixes to a security issue no-one noticed yet.&lt;/p&gt;
&lt;p&gt;My changelog generation tool reads in my &lt;code&gt;.git-com.yaml&lt;/code&gt; file and leverages the fact that it supports the concept of &amp;ldquo;meta elements&amp;rdquo;. These are elements that exist within the config but aren&amp;rsquo;t for consideration as part of your commit message.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;meta_element_changelog&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;display_aliases&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;fix&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;fixed&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;added&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;refactor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;refactored&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;clean-up&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;cleaned&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;When building the changelog it finds commits with &lt;code&gt;[add]&lt;/code&gt; and groups them under an &lt;code&gt;added&lt;/code&gt; heading because of the mapping in &lt;code&gt;display_aliases&lt;/code&gt;, but this could be anything. Maybe &amp;ldquo;add&amp;rdquo; commits end up under &amp;ldquo;❇️ New Features&amp;rdquo;, or the other way around. Maybe &lt;code&gt;❇️&lt;/code&gt; in a commit title indicates new coolness and gets grouped under &amp;ldquo;added&amp;rdquo;. Keep in mind that users of git-com are usually choosing from a pick list, so you don&amp;rsquo;t have to know how to type special characters like ❇️ to have them added in the commit message.&lt;/p&gt;
&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Other Representations&lt;/p&gt;
&lt;p&gt;Note: square brackets aren&amp;rsquo;t the &amp;ldquo;right&amp;rdquo; solution here. They&amp;rsquo;re just &lt;em&gt;a&lt;/em&gt; solution. Here&amp;rsquo;s some other ways you might handle the same thing. What&amp;rsquo;s important is that you find a way to represent things that you and your team (if working with others) can agree makes sense and isn&amp;rsquo;t annoying.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# &amp;lt;optional breaking change&amp;gt; &amp;lt;change type&amp;gt; &amp;lt;separator&amp;gt; &amp;lt;freeform text&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;⚠️ &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;feature&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; → full text search
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# nonbreaking version…&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;feature&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; → lists recently completed items
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Minimal Emojis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# &amp;lt;indicator structure&amp;gt; &amp;lt;change type&amp;gt; &amp;lt;separator&amp;gt; &amp;lt;freeform text&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# ℹ️                    (fix, add, etc.) :           blah blah&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ℹ️ fix: now supports linked worktree directories
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# FULL EMOJIFICATION 🤪&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# &amp;lt;indicator structure&amp;gt; &amp;lt;change type&amp;gt; &amp;lt;separator&amp;gt; &amp;lt;freeform text&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# ℹ️                    (❎, ❇️, ♻️ etc.) ▶️       blah blah&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ℹ️❎▶️   now supports linked worktree directories
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# maybe add special emoji to indicate a breaking change&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# &amp;lt;indicator structure&amp;gt; &amp;lt;change type&amp;gt;&amp;lt;optional breaking change&amp;gt;&amp;lt;separator&amp;gt; &amp;lt;freeform text&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ℹ️❇️⚠️▶️ full text search
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Breaking because it might require a db upgrade or something noted in the commit body&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;body&#34;&gt;Body&lt;/h3&gt;
&lt;p&gt;Here&amp;rsquo;s where things get &lt;em&gt;extremely&lt;/em&gt; subjective.&lt;/p&gt;
&lt;p&gt;Obviously you need block of freeform text for people to (optionally) describe what the commit is about, but the question of what - if any - structured data you should include is where things get complicated.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve chosen to go with a multi-select for portions of the codebase that are involved in the change. The list of options for this is &lt;em&gt;very&lt;/em&gt; different for each project I use &lt;code&gt;git-com&lt;/code&gt; in, but what they have in common is that each item represents a significant distinct part of the codebase, and it&amp;rsquo;s mostly sorted so that the frequent items are near the top.&lt;/p&gt;
&lt;p&gt;This data never shows up in changelogs, and I rarely ever read it. I do this because of my time spent hunting down production bugs at work.&lt;/p&gt;
&lt;p&gt;For example, let&amp;rsquo;s say the look of our site had become borked. I&amp;rsquo;d have a pretty good guess it was changes related to the &amp;ldquo;css&amp;rdquo; portion of our codebase or maybe something in the &amp;ldquo;ui&amp;rdquo; layer. It would have been invaluable to me to be able to run a command like this and find commits since the last release that included changes to the relevant sections of the codebase.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git log v1.2.0..HEAD --grep &lt;span class=&#34;s2&#34;&gt;&amp;#34; (css|ui)&amp;#34;&lt;/span&gt; --extended-regexp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here&amp;rsquo;s what I see when I run that in a codebase that uses those two keywords in its &amp;ldquo;Code Sections&amp;rdquo; (see example below)&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2026/04/04/git_log_grepping_for_codebase_section.png&#34;
    alt=&#34;screenshot of two git log entries showing highlighted grep matches in the Code Sections line of each one.&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Commits since a release in matching sections of the codebase.&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;If a search like that overlapped with too much of the freeform text I could limit the results to the &amp;ldquo;Code Sections&amp;rdquo; metadata line by doing this.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git log v1.2.0..HEAD --grep &lt;span class=&#34;s2&#34;&gt;&amp;#34;Code Sections:.*(css|ui)&amp;#34;&lt;/span&gt; --extended-regexp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I experimented with Tags and &amp;ldquo;Code Sections&amp;rdquo; it ended up feeling like unnecessary paperwork that I was resenting. Again, my advice is to only add sections that you have real use for.&lt;/p&gt;
&lt;h4 id=&#34;example-config&#34;&gt;Example Config&lt;/h4&gt;
&lt;p&gt;The list below is from the &lt;a href=&#34;https://backupbrain.app/&#34;&gt;BackupBrain&lt;/a&gt; webapp which is currently focused on managing, and archiving bookmarks.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;code-sections&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;multi-select&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;allow-empty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;modifiable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;record-as&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;joined-string&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;before-string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;\nCode Sections: &amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;destination&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;instructions&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Which section(s) of the codebase?&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;options&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;bookmarks&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;archives&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;ui&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;ux&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;css&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;meta&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;tests&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;migrations&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;infrastructure&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;tags&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;oauth&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;changelogs&#34;&gt;Changelogs&lt;/h2&gt;
&lt;p&gt;I have plans for creating a Changelog generator that can read in a project&amp;rsquo;s &lt;code&gt;.git-com.yaml&lt;/code&gt; and extrapolate the rules it needs to read and format a changelog. Until then though, you&amp;rsquo;ll have to approach this problem on your own. The changelog tool I&amp;rsquo;m currently using is called &lt;code&gt;git-com-changelog&lt;/code&gt; and can be &lt;a href=&#34;https://github.com/masukomi/masuconfigs/blob/master/bin/git-scripts/git-com-changelog&#34;&gt;found here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;the-goal&#34;&gt;The goal&lt;/h3&gt;
&lt;p&gt;Creating changelogs from commit messages has been &lt;em&gt;the&lt;/em&gt; most useful and meaningful thing I&amp;rsquo;ve done with &lt;code&gt;git-com&lt;/code&gt;. It doesn&amp;rsquo;t &lt;em&gt;just&lt;/em&gt; give me good changelogs. It&amp;rsquo;s also wired into my release tooling so that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;new version tags include the changelog in their body&lt;/li&gt;
&lt;li&gt;my CHANGELOG file gets the latest info prepended to the top with markdown or org-mode formatting depending on the file-type.&lt;/li&gt;
&lt;li&gt;my Github Releases inherit the changelog text from the tag to populate their bodies.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For some of my tools, cutting a new release means typing &lt;code&gt;release v1.2.3&lt;/code&gt; and that&amp;rsquo;s it. Changelogs get updated when needed, tags get cut when needed, releases are created with changelogs in their body, artifacts get built and attached to the release, homebrew formulas get updated and pushed.&lt;/p&gt;
&lt;p&gt;Changelog example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;v1.7.0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[fixed]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- hitting ESC at a confirmation now exits
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- tweaked how lefthook&amp;#39;s go-tester works
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- commits work in linked worktrees
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- maintains yaml element ordering when adding an option
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[added]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- final validation now leads to edit if NO is chosen
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- added some lefthook files
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- now supports include-empty attribute
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- stores commit message for reuse when pre-commit hooks fail
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- stores &amp;amp; offers up commit messages from failed commits
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[refactored]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- faster startup
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- hook output now streams live
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[cleaned]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- backporting some notes from web site
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- removed instructions.org
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;making-it-happen&#34;&gt;Making it Happen&lt;/h3&gt;
&lt;p&gt;Getting from commits raw commits to useful changelogs is surprisingly easy. There are three aspects to the processing.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;read &lt;code&gt;.git-com.yaml&lt;/code&gt; to figure out what goes into a prompt&lt;/li&gt;
&lt;li&gt;optionally read the contents of the &lt;code&gt;meta_element_changelog&lt;/code&gt; section to get processing rules &amp;amp; modifiers.&lt;/li&gt;
&lt;li&gt;gather commits, filter, group (optionally) and output.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;1-dot-figure-out-what-to-look-for&#34;&gt;1. Figure out what to look for&lt;/h4&gt;
&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Limiting your input&lt;/p&gt;
&lt;p&gt;You don&amp;rsquo;t want to reprocess your entire git history every time. So, I recommend that your changelog tool can take standard parameters for limiting the commits it has to work through. I&amp;rsquo;ve chosen to go with a &lt;code&gt;--from&lt;/code&gt; and an optional &lt;code&gt;--to&lt;/code&gt; parameter. My tool just passes those limiting bounds on to &lt;code&gt;git log&lt;/code&gt; when asking for commits to process. This is especially useful when you start building automated changelogs into your build process.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# everything between the v1.5.0 tag and the v1.7.0 tag&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git com-changelog -f v1.5.0 -t v1.7.0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# everything from v1.5.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git com-changelog -f v1.5.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Knowing what &amp;rsquo;s worth considering&lt;/p&gt;
&lt;p&gt;The first step is knowing what structured data you can always count on existing in a commit worth including. In my case it&amp;rsquo;s a commit message whose title starts with a change-type indicator &lt;code&gt;[foo]&lt;/code&gt; where &amp;ldquo;foo&amp;rdquo; is any of the currently supported change type options.&lt;/p&gt;
&lt;p&gt;So, for me that means reading in the project&amp;rsquo;s &lt;code&gt;.git-com.yml&lt;/code&gt;, and asking for the contents of the &lt;code&gt;change-type&lt;/code&gt; element&amp;rsquo;s &lt;code&gt;options&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;change-type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;destination&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;select&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;modifiable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;instructions&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;What kind of change?&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;before-string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;[&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;after-string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;]&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;format&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;%-12s&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;options&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;fix&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;refactor&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;clean-up&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;2-dot-apply-modifiers&#34;&gt;2. Apply modifiers&lt;/h4&gt;
&lt;p&gt;Note: This is completely custom, but I think it&amp;rsquo;s an idea worth copying.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git-com&lt;/code&gt; supports the inclusion of custom YAML in its config file as long as the top level element begins with &lt;code&gt;meta_element_&lt;/code&gt; I&amp;rsquo;ve been using &lt;code&gt;meta_element_changelog&lt;/code&gt; to store project specific configuration / behavioral instructions for my changelog generator.&lt;/p&gt;
&lt;p&gt;None of the following is built into &lt;code&gt;git-com&lt;/code&gt;, but my changelog generation is based on the &lt;code&gt;git-com&lt;/code&gt; configuration at the time of invocation, so it makes sense to store it all together. You can make your own &lt;code&gt;meta_element_foo&lt;/code&gt; with whatever information you find useful for helping generate a great changelog.&lt;/p&gt;
&lt;p&gt;I have 4 types of assorted modifiers.&lt;/p&gt;
&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;display_aliases&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;These provide a display alias for the heading each type of commit will be grouped under. For example you can see that any commit with a change-type of &amp;ldquo;add&amp;rdquo; will be displayed under a heading of &amp;ldquo;added&amp;rdquo;, but it could be something fancier like &amp;ldquo;❇️ New Features&amp;rdquo;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;meta_element_changelog&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;display_aliases&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;fix&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;fixed&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;added&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;refactor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;refactored&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;clean-up&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;cleaned&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;retired_aliases&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Because ideas and conventions change over time, &lt;code&gt;clean-up&lt;/code&gt; may get replaced with something like &lt;code&gt;clean&lt;/code&gt;. This happened a lot as I was getting started with &lt;code&gt;git-com&lt;/code&gt; and figuring out what worked, and didn&amp;rsquo;t work for me.&lt;/p&gt;
&lt;p&gt;As a result, I&amp;rsquo;ve added in support for &lt;code&gt;retired_aliases&lt;/code&gt;. So, if &lt;code&gt;clean-up&lt;/code&gt; changed to &lt;code&gt;clean&lt;/code&gt; then I&amp;rsquo;d change my &lt;code&gt;meta_element_changelog&lt;/code&gt; section like this.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;meta_element_changelog&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;retired_aliases&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;clean-up&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;clean&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;display_aliases&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;fix&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;fixed&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;added&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;refactor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;refactored&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;clean&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;cleaned&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note that under &lt;code&gt;display_aliases&lt;/code&gt; &lt;code&gt;clean-up&lt;/code&gt; has been replaced with the new term which would have been added to the options of &lt;code&gt;change_type&lt;/code&gt; at the top of the config. The new &lt;code&gt;retired_aliases&lt;/code&gt; section tells the code that if it finds a line with &lt;code&gt;clean-up&lt;/code&gt; as the change type it should replace it with &lt;code&gt;clean&lt;/code&gt; and then process as if it was &lt;code&gt;clean&lt;/code&gt; all along.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&amp;ldquo;permissive&amp;rdquo; mode&lt;/p&gt;
&lt;p&gt;My changelog tool has a &amp;ldquo;permissive&amp;rdquo; mode that can be toggled with a command line argument. It basically means &amp;ldquo;hey, if find a change type that isn&amp;rsquo;t in the list, just consider it valid.&amp;rdquo; It&amp;rsquo;s good for testing but I don&amp;rsquo;t recommend it in practice.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;exclusions&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;While I don&amp;rsquo;t use it, I&amp;rsquo;ve added support for an optional &amp;ldquo;exclusions&amp;rdquo; list. After applying any &lt;code&gt;retired_aliases&lt;/code&gt; it checks if the current change-type is in the exclusions list and skips it if it is.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;meta_element_changelog&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;display_aliases&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;fix&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;fixed&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;added&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;refactor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;refactored&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;clean-up&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;cleaned&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;exclusions&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;security&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;meh&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Given the list above, and commit with a change-type of &amp;ldquo;security&amp;rdquo; or &amp;ldquo;meh&amp;rdquo; would be excluded from the changelog.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;3-dot-generate-output&#34;&gt;3. Generate Output&lt;/h4&gt;
&lt;p&gt;Most of you will be generating markdown flavored files, &lt;em&gt;but&lt;/em&gt; if you want to use this with &lt;code&gt;git tag&lt;/code&gt;, you need a way to generate useful output with no markdown headings. The problem is that any line that starts with &lt;code&gt;#&lt;/code&gt; is considered a comment by git, and is completely ignored. This means all your markdown headings will be stripped.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve solved this by having it generate output without markup by default (like in the example above). It also supports &lt;code&gt;--markdown&lt;/code&gt; and &lt;code&gt;--org&lt;/code&gt; flags. Most of you won&amp;rsquo;t need the org one.&lt;/p&gt;
&lt;p&gt;Because I like grouping similar changes (again, see the example) I create a &amp;ldquo;hash&amp;rdquo; / &amp;ldquo;dictionary&amp;rdquo; with keys for each encountered change-type, then build up a list of all the commit titles as its value (after stripping off the change type).&lt;/p&gt;
&lt;p&gt;Then I just iterate over the collection. I use any &lt;code&gt;display_aliases&lt;/code&gt; I found to change the heading text. For example changing &amp;ldquo;fix&amp;rdquo; to &amp;ldquo;fixed&amp;rdquo;, or &amp;ldquo;add&amp;rdquo; to &amp;ldquo;added&amp;rdquo;. For each line I apply the appropriate markup if the user requested it. That&amp;rsquo;s about it.&lt;/p&gt;
&lt;h4 id=&#34;consistency-consistency-consistency&#34;&gt;Consistency Consistency Consistency&lt;/h4&gt;
&lt;p&gt;The more projects you work on the more critical it becomes to have a consistent structure to your commit titles across projects. I can leverage my changelog generator across all of my projects because they&amp;rsquo;re always the same.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[&amp;lt;change_type&amp;gt;]&amp;lt;space&amp;gt;&amp;lt;freeform_text&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;For example:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[fix]     commits work in linked worktrees
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If I start using a different structure in one of my projects I&amp;rsquo;ll have to create a new changelog generator or make modifications to the existing one specifically to accommodate the second format.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Make commit titles include a small piece of consistent structured text that&amp;rsquo;s easy for humans and code to pick out.
Having this be the change-type of the commit is a great place to start.&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t gather data you don&amp;rsquo;t need.
Ignore temptation to add steps to your &lt;code&gt;git-com&lt;/code&gt; config that make future you and collaborators enter / choose info that isn&amp;rsquo;t &lt;em&gt;really&lt;/em&gt; needed. You&amp;rsquo;ll just get annoyed.&lt;/li&gt;
&lt;li&gt;The more important it is for you to fix bugs quickly, the more important it becomes to leave yourself hints in the commit body that&amp;rsquo;ll help you track down problematic changes quickly&lt;/li&gt;
&lt;li&gt;Creating a changelog generator is relatively easy, but you need something that understands the format that you&amp;rsquo;ve come up with for your commits.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;bonus&#34;&gt;Bonus&lt;/h2&gt;
&lt;p&gt;Using &lt;code&gt;git-com&lt;/code&gt;&amp;rsquo;s &lt;code&gt;format&lt;/code&gt; functionality makes it much easier to quickly skim changes because everything&amp;rsquo;s aligned.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;❯ git log --oneline v1.6.0..v1.7.0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;3382062 (HEAD -&amp;gt; main, tag: v1.7.0) changelog.org → CHANGELOG.org
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;8ddaa76 (origin/main, origin/HEAD) added a commented out lefthook pre-commit that&amp;#39;ll always fail
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;23d3f40 [add]       stores &amp;amp; offers up commit messages from failed commits
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2324d4e [add]       stores commit message for reuse when pre-commit hooks fail
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;1203fdd [refactor]  hook output now streams live
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;0a1ad2c [fix]       maintains yaml element ordering when adding an option
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;7489d58 [fix]       commits work in linked worktrees
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;3611a23 [refactor]  faster startup
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;906284d [fix]       tweaked how lefthook&amp;#39;s go-tester works
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;0f01ecc [add]       added tag &amp;amp; release handling to homebrew tap script
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;5010937 [add]       added changelog.org file
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Martijn Hols has a really nice blog post about &lt;a href=&#34;https://martijnhols.nl/blog/how-to-write-a-good-git-commit-message&#34;&gt;How to write a good commit message&lt;/a&gt;.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Your Privacy And Mozilla</title>
      <link>https://weblog.masukomi.org/posts/your_privacy_and_mozilla/</link>
      <pubDate>Mon, 12 Jan 2026 00:00:00 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/posts/your_privacy_and_mozilla/</guid>
      <description>&lt;p&gt;The other day I stumbled across a reminder that in February of 2025 &lt;a href=&#34;https://github.com/mozilla/bedrock/commit/d459addab846d8144b61939b7f4310eb80c5470e&#34;&gt;Mozilla &lt;em&gt;deleted&lt;/em&gt; the following piece of their FAQ.&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Does Firefox sell your personal data?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Nope. Never have, never will. And we protect you from many of the advertisers who do. Firefox products are designed to protect your privacy. That’s a promise.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Some people have tried to defend them pointing to the current entry on their privacy FAQ (Jan 2026).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;It seems like every company on the web is buying and selling my data. You’re probably no different.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We never sell your personal data. Unlike other big tech companies that collect and profit off your personal information, we’re built with privacy as the default. We don’t know your age, gender, precise location, or other information Big Tech collects and profits from.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here&amp;rsquo;s the thing. &lt;em&gt;That doesn&amp;rsquo;t mean what you think it does.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Back in 2010, I used to work in a company that did targeted advertising. We didn&amp;rsquo;t &lt;em&gt;need&lt;/em&gt; your &amp;ldquo;personal&amp;rdquo; data, and we didn&amp;rsquo;t &lt;em&gt;want&lt;/em&gt; it. The tech was &lt;em&gt;so&lt;/em&gt; good that it honestly wouldn&amp;rsquo;t have helped us. We just needed to be able to drop a cookie on you like all advertisers did. We didn&amp;rsquo;t even really need to do that, it was just easier. We could reconcile two &amp;ldquo;identities&amp;rdquo; resulting from different browsers / VPN / whatever and mush them back together.&lt;/p&gt;
&lt;p&gt;Knowing your name? Your precise location? Advertisers didn&amp;rsquo;t care about any of that. They just wanted to know if you were someone likely to buy what they were selling. If we stuck their ad in front of the right person the odds of it getting a click increased. And we were &lt;em&gt;really&lt;/em&gt; good. Like &lt;em&gt;scary&lt;/em&gt; good.&lt;/p&gt;
&lt;p&gt;There was a - probably apocryphal - story that Target had hired a company to do targeted advertising for them and send out coupons to pregnant mothers. New moms spend a &lt;em&gt;lot&lt;/em&gt; of money on baby products, and Target wanted to get them to &lt;em&gt;start&lt;/em&gt; those years of shopping with them. According to the story, a woman was sent coupons for baby products before she even realized she was pregnant.&lt;/p&gt;
&lt;p&gt;The thing was, it didn&amp;rsquo;t matter if it was actually a true story or not, because we &lt;em&gt;knew&lt;/em&gt; that it was &lt;em&gt;entirely possible&lt;/em&gt; with the tech we had &lt;em&gt;in 2010&lt;/em&gt;. We could predict, with &lt;em&gt;scary accuracy&lt;/em&gt; what you would buy within the next month. With larger purchases, like cars, we could predict it about a year out.&lt;/p&gt;
&lt;p&gt;We had &lt;em&gt;zero&lt;/em&gt; personally identifiable data. We didn&amp;rsquo;t need it, and having it would have been a liability.&lt;/p&gt;
&lt;p&gt;So, Mozilla telling you they&amp;rsquo;re not selling your &amp;ldquo;personal&amp;rdquo; data? It&amp;rsquo;s a misleading statement to make you feel they have your best interests at heart. They don&amp;rsquo;t. If they did, they would say that they don&amp;rsquo;t sell &lt;em&gt;or share&lt;/em&gt; &amp;ldquo;your data&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Obviously, no-one wants their personal data being sold, but the people who want to know what you&amp;rsquo;re planning? They don&amp;rsquo;t need it, and they don&amp;rsquo;t care anyway. If they wanted to send something to your home they could just buy a mailing list targeted to your demographic. Anyone can do it.&lt;/p&gt;
&lt;p&gt;Similarly, TikTok being Chinese owned and getting your data? That&amp;rsquo;s just more misleading political bullshit. China - along with anyone else who wanted it - already &lt;em&gt;had&lt;/em&gt; your data. Selling your data is big business in the US. We have no meaningful laws against it, and no meaningful penalties for leaking your private data.&lt;/p&gt;
&lt;p&gt;The only meaningful privacy statement is a claim that a company &lt;em&gt;will not share your data&lt;/em&gt; and &lt;em&gt;will not work with advertisers&lt;/em&gt;. Anything less is misleading bullshit. Even if you disagree, Mozilla &lt;em&gt;removed their promise to never sell your personal data.&lt;/em&gt; That&amp;rsquo;s pretty telling.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re actually concerned about this, then - hopefully obviously - switching to Chrome is not a good idea. It&amp;rsquo;s controlled by one of the world&amp;rsquo;s largest advertising companies (Google) who has taken active steps to prevent good ad-blockers like UBlock Origin from working.&lt;/p&gt;
&lt;p&gt;There are alternatives though:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.waterfox.com/&#34;&gt;Waterfox&lt;/a&gt; is a downstream fork of Firefox that disables their AI bullshit, exposes some hidden settings, and sets the privacy defaults to where most people would reasonably expect them.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://librewolf.net/&#34;&gt;LibreWolf&lt;/a&gt; is another downstream fork of Firefox for people who want to take additional steps to protect their privacy online. It has stricter defaults for cookies, tracking, and fingerprinting, which sounds great, but is likely to have some negative impacts on your browsing experience. Obviously, they also disable Mozilla&amp;rsquo;s AI features.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Its important to the health of the internet, and to the freedom of information, for us to use a browser &lt;em&gt;not&lt;/em&gt; controlled by one of the worlds largest advertising companies; a browser that isn&amp;rsquo;t controlled by a company that limits what people see based on the whims of local governments.&lt;/p&gt;
&lt;p&gt;Right now, Firefox based browsers are the best option we have, but Mozilla.com (the for profit company) has been focusing all its energy on increasing profits, and Mozilla.org (the non-profit who gets all the press) very clearly does whatever Mozilla.com says. Mozilla&amp;rsquo;s users very clearly &lt;em&gt;do not want&lt;/em&gt; AI shoved into their browsers, but they&amp;rsquo;re doing it anyway. Mozilla&amp;rsquo;s users &lt;em&gt;want&lt;/em&gt; privacy, and Mozilla.org promotes the idea that they&amp;rsquo;ll protect yours, but they work with advertisers, and refuse to say they won&amp;rsquo;t sell or share your &lt;em&gt;data&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s time for Mozilla to die. It has been corrupted from within. It&amp;rsquo;s time for the downstream forks to work together to create a &amp;ldquo;hard fork&amp;rdquo; of Firefox, a core codebase build on shared beliefs that users, and their privacy matter. LibreWolf, and Waterfox can still put their own spin on that. Making a version catered to the desires of &lt;em&gt;their&lt;/em&gt; users.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>New Year New Tools</title>
      <link>https://weblog.masukomi.org/posts/new_year_new_tools/</link>
      <pubDate>Mon, 05 Jan 2026 00:00:00 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/posts/new_year_new_tools/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#wheeeeee&#34;&gt;Wheeeeee&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#cleandiff&#34;&gt;Cleandiff&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#why&#34;&gt;Why&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#git-com&#34;&gt;git-com&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#why&#34;&gt;Why&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#options-parser&#34;&gt;options_parser&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#why&#34;&gt;Why&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#oho--bonus&#34;&gt;oho (bonus)&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#why&#34;&gt;Why?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#credit-where-it-s-due&#34;&gt;Credit Where It&amp;rsquo;s Due&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;wheeeeee&#34;&gt;Wheeeeee&lt;/h2&gt;
&lt;p&gt;Ringing in the new year with new tools!&lt;/p&gt;
&lt;h3 id=&#34;cleandiff&#34;&gt;Cleandiff&lt;/h3&gt;
&lt;img style=&#34;max-width: 8em;&#34; src=&#34;https://weblog.masukomi.org/images/2026/01/05/cleandiff_logo.svg&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://cleandiffapp.com/&#34;&gt;CleanDiff&lt;/a&gt; is a graphical diffing tool that pays attention to word instead of lines.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2026/01/05/screenshot_with_sidebar.png&#34;
    alt=&#34;a screenshot of the cleandiff app&#34;&gt;
&lt;/figure&gt;

&lt;h4 id=&#34;why&#34;&gt;Why&lt;/h4&gt;
&lt;p&gt;Two reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I hate looking at diffs of changed lines and knowing something changed, but having to hunt for &lt;em&gt;what&lt;/em&gt; that something is.&lt;/li&gt;
&lt;li&gt;Too much noise. In addition to wanting to see the specific &amp;ldquo;word&amp;rdquo; or &amp;ldquo;character&amp;rdquo; that changed, I don&amp;rsquo;t want to have to scroll through the entire document to get to it, &lt;em&gt;or&lt;/em&gt; the opposite problem where something like &lt;code&gt;git diff&lt;/code&gt; shows you a tiny bit of context, but not &lt;em&gt;enough&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;git-com&#34;&gt;git-com&lt;/h3&gt;
&lt;img style=&#34;max-width: 8em;&#34; src=&#34;https://weblog.masukomi.org/images/2026/01/05/git_com_logo.svg&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://git-com.masukomi.org/&#34;&gt;git-com&lt;/a&gt; is a tool for creating structured commit messages that&amp;rsquo;s easy to configure for each project. A simple YAML document at the repo&amp;rsquo;s root drives an interactive UI with select lists and text fields to easily populate your commit message with structured, and repeatable elements.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[front-end] bug-fix: item listing works with large minimum font size
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Text elements started overlapping each other when a user had a
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;minimum font size set in their browser.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Tags: accessibility, css
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That commit message could have been created with the following elements&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;code-section&amp;gt; &amp;lt;work-type&amp;gt;: &amp;lt;title&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;description&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;tags&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;why&#34;&gt;Why&lt;/h4&gt;
&lt;p&gt;This is yet another entry in a collection of tools to help answer questions about what&amp;rsquo;s changed in a codebase. Sometimes it&amp;rsquo;s that simple. Sometimes it&amp;rsquo;s trying to find where a bug introduced. Sometimes it&amp;rsquo;s to be able to have an accurate accounting for stakeholders.&lt;/p&gt;
&lt;p&gt;Good commit messages have saved me countless hours of spelunking when I was in charge of a support-engineering team (putting out fires in production), and as a release manager trying to figure out what &lt;em&gt;actually&lt;/em&gt; made it into the impending release.&lt;/p&gt;
&lt;p&gt;In things like my dotfiles repo, they&amp;rsquo;ve been useful for just knowing what part of my system a commit pertains to. In my writing it lets me know which book I was making changes in, and if it was new writing, or edits.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Codebase Example&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[fix] was erroring if run from a subdirectory
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[fix] icon in readme on github
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[fix] removed unecessary blank line from .git-com.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[fix] removed flag from script to update homebrew tap
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[add] added quick-start to docs
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[clean-up] simplified .git-com.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Writing Example:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[ji-woo] renamed 2 of the container kids
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[thimble] finished telling taylor&amp;#39;s dad about thimble
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[thimble] few days worth of editing and adding
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[worldbook] added info re cats barely growing
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[worldbook] added / updated content warning stuff
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[nicole] finished off day after meeting ji-woo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;options-parser&#34;&gt;options_parser&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/masukomi/options_parser&#34;&gt;options_parser&lt;/a&gt; is a new options parser for Ruby&lt;/p&gt;
&lt;p&gt;It supports&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;auto-generated help docs&lt;/li&gt;
&lt;li&gt;required &amp;amp; optional arguments&lt;/li&gt;
&lt;li&gt;short and/or long variations&lt;/li&gt;
&lt;li&gt;arguments that take values, or just act as flags&lt;/li&gt;
&lt;li&gt;separating flag from value with space or equals&lt;/li&gt;
&lt;li&gt;auto-conversion to integer or float as defined by the &lt;code&gt;value_type&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;trailing arguments
Ex. `command -n 4 &amp;ndash; file_1.txt file_2.txt`&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A simple example&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;options&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;OptionsParser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;Parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;ss&#34;&gt;command&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;myapp&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;ss&#34;&gt;description&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Does something useful&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nb&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;ss&#34;&gt;short&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;-f&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;ss&#34;&gt;long&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;--file&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;ss&#34;&gt;value_type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;ss&#34;&gt;help&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Input file path&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;options&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;ss&#34;&gt;:file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;parse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;ARGV&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Oddly, this isn&amp;rsquo;t the first options parsing library I&amp;rsquo;ve written. I wrote one for Crystal that allowed you to create &amp;ldquo;sentence-like human interfaces to your apps&amp;rdquo;. It had a similarly creative name: &lt;a href=&#34;https://github.com/masukomi/sentence_options&#34;&gt;sentence_options&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Alas, everything pales in comparison to what &lt;a href=&#34;https://raku.org/&#34;&gt;Raku&lt;/a&gt; comes with in its standard library. 😿&lt;/p&gt;
&lt;h4 id=&#34;why&#34;&gt;Why&lt;/h4&gt;
&lt;p&gt;Because - &lt;a href=&#34;https://en.wiktionary.org/wiki/IMNSHO&#34;&gt;IMNSHO&lt;/a&gt; - Ruby&amp;rsquo;s &lt;code&gt;optparse&lt;/code&gt; is a clusterfuck of confusing code, bad docs, and limited functionality. &lt;em&gt;And&lt;/em&gt; I was writing a script that took two arguments and processed commit messages created with &lt;code&gt;git-com&lt;/code&gt; and converted them into a rough changelog for the next release of &lt;code&gt;git-com&lt;/code&gt;. 😜&lt;/p&gt;
&lt;h3 id=&#34;oho--bonus&#34;&gt;oho (bonus)&lt;/h3&gt;
&lt;p&gt;Not technically &amp;ldquo;new&amp;rdquo; but somewhere along the way &lt;a href=&#34;https://github.com/masukomi/oho&#34;&gt;oho&lt;/a&gt; (the world&amp;rsquo;s greatest tool for converting escape codes to HTML) developed &lt;a href=&#34;https://en.wikipedia.org/wiki/Software_rot&#34;&gt;bit rot&lt;/a&gt;. Two key regular expressions that definitely &lt;em&gt;used&lt;/em&gt; to work, started either matching too much, or too little and completely hosing the output as a result.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve updated it, and found - and fixed - a couple edge cases it wasn&amp;rsquo;t handling well.&lt;/p&gt;
&lt;h4 id=&#34;why&#34;&gt;Why?&lt;/h4&gt;
&lt;p&gt;oho was created because - as a release manager - I found myself maintaining a growing arsenal of CLI tools that could spelunk through our git logs and generate useful information for stakeholders.&lt;/p&gt;
&lt;p&gt;Just copy-pasting from the terminal - and loosing all the colors - lost a lot of important context and made it hard for stakeholders to focus on what they needed to. I needed a way to capture the colors and formatted output my tools were producing.&lt;/p&gt;
&lt;p&gt;Oho lets me go from colorful terminal output to HTML which can then be converted to PDF. People are weird about being given raw HTML files, but PDF is something they&amp;rsquo;re comfortable with.&lt;/p&gt;
&lt;h2 id=&#34;credit-where-it-s-due&#34;&gt;Credit Where It&amp;rsquo;s Due&lt;/h2&gt;
&lt;p&gt;Cleandiff wouldn&amp;rsquo;t have been possible without my &lt;a href=&#34;https://dacharycarey.com/&#34;&gt;amazing wife&lt;/a&gt; bringing &lt;a href=&#34;https://fenestro.xyz&#34;&gt;Fenestro&lt;/a&gt; back to life by porting it to Go, and without her creation of the &lt;a href=&#34;https://github.com/dacharyc/tokendiff&#34;&gt;tokendiff&lt;/a&gt; diffing algorithm (&lt;a href=&#34;https://dacharycarey.com/2025/12/29/diff-algorithm-spelunking/&#34;&gt;geeky details here&lt;/a&gt;) the results wouldn&amp;rsquo;t be nearly as nice.&lt;/p&gt;
&lt;img style=&#34;max-width: 8em;&#34; src=&#34;https://weblog.masukomi.org/images/2026/01/05/fenestro_logo.svg&#34;&gt;
&lt;p&gt;Fenestro is a fancy web-view you can throw lots of HTML files at really quickly, and then switch between them by clicking on its sidebar. It used to be in Swift, but then it stopped compiling as the language moved forwards. Now it&amp;rsquo;s written in Go and leverages the &lt;a href=&#34;https://wails.io/&#34;&gt;Wails GUI framework&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To make Cleandiff I simply took her work with Fenestro, and Tokendiff, and combined it with everything I&amp;rsquo;d learned making, and refining the proof of concept for Cleandiff, and slapped it all together into one app.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Amazon To Bookwyrm Browser Extension</title>
      <link>https://weblog.masukomi.org/2025/12/28/amazon-to-bookwyrm-browser-extension/</link>
      <pubDate>Sun, 28 Dec 2025 00:00:00 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/2025/12/28/amazon-to-bookwyrm-browser-extension/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#why-this-exists&#34;&gt;Why this exists&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#what-it-does-and-why&#34;&gt;What it does and why&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#why-only-amazon&#34;&gt;Why Only Amazon?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#why-only-firefox&#34;&gt;Why only Firefox?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#geekery&#34;&gt;Geekery&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve created a Firefox extension to make it easy to populate BookWyrm&amp;rsquo;s &amp;ldquo;Create Book&amp;rdquo; form with information from Amazon.&lt;/p&gt;
&lt;p&gt;This post describes the approach taken, and provides info for anyone who wishes to create a fork that can extract data from other web sites.&lt;/p&gt;
&lt;p&gt;If you just want the extension, you can find it here the Firefox Addons site: &lt;a href=&#34;https://addons.mozilla.org/amazon-to-bookwyrm&#34;&gt;https://addons.mozilla.org/amazon-to-bookwyrm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;⚠️ Note: This post is being written &lt;strong&gt;before&lt;/strong&gt; the extension has made its way through the approval process. If that link doesn&amp;rsquo;t work, you can either try tomorrow or - if you&amp;rsquo;re a geek - install it from the source code (see below).&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/12/28/amazon_screenshot.png&#34;
    alt=&#34;A screenshot of the extension being used on an Amazon book&amp;#39;s product listing.&#34;&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;why-this-exists&#34;&gt;Why this exists&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://joinbookwyrm.com&#34;&gt;BookWyrm&lt;/a&gt; is a wonderful federated book review platform, but adding a new book that doesn&amp;rsquo;t already exist in the database requires manually entering all the book&amp;rsquo;s metadata. This is tedious and time-consuming, especially when all that information already exists on Amazon.&lt;/p&gt;
&lt;p&gt;Most of the books I read &lt;em&gt;aren&amp;rsquo;t&lt;/em&gt; in BookWyrm&amp;rsquo;s database yet, and needing to manually look up and enter all the data for a book has prevented me from leaving a lot of reviews that I really wanted to make.&lt;/p&gt;
&lt;p&gt;So, I created a browser extension to copy the data from Amazon.&lt;/p&gt;
&lt;h2 id=&#34;what-it-does-and-why&#34;&gt;What it does and why&lt;/h2&gt;
&lt;p&gt;It would be lovely to use Amazon&amp;rsquo;s books API to get nice structured data for books. However, that API requires AWS account credentials, and isn&amp;rsquo;t free. Running a service that used their API to populate a site like BookWyrm would probably violate their Terms of Service too. We shouldn&amp;rsquo;t expect to see this kind of functionality within BookWyrm itself, because it&amp;rsquo;s likely its creators would get in trouble with Amazon.&lt;/p&gt;
&lt;p&gt;So, this plugin just reads the HTML of an Amazon product page you&amp;rsquo;re viewing, and checks known locations for the information you&amp;rsquo;ll need to populate the &amp;ldquo;Create Book&amp;rdquo; form on your BookWyrm instance.&lt;/p&gt;
&lt;p&gt;It does &lt;em&gt;not&lt;/em&gt; submit the form, because you &lt;em&gt;really&lt;/em&gt; need to verify the data it extract. There are lots of edge cases that can lead to odd results. Series - for example - is the biggest offender. When looking at a book in a series, some authors/publishers will set up the book data such that it only shows the series name, some include which book in the series, or how many books with different formatting, some put it in the title. Using Brandon Sanderson&amp;rsquo;s &amp;ldquo;The Final Empire&amp;rdquo; as an example, here are all the ways - so far - that I&amp;rsquo;ve seen a book be recorded.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;title: The Final Empire, series: Mistborn&lt;/li&gt;
&lt;li&gt;title: The Final Empire, series: Book 1 of 7: Mistborn&lt;/li&gt;
&lt;li&gt;title: The Final Empire, series: Part of: Mistborn (7 books)&lt;/li&gt;
&lt;li&gt;title: The Final Empire: Mistborn Book 1, series: Book 1 of 7: Mistborn&lt;/li&gt;
&lt;li&gt;title: The Final Empire (Mistborn Book 1), series: Book 1 of 7: Mistborn&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And all sorts of other combinations of the above. Extracting the &amp;ldquo;correct&amp;rdquo; data is pretty hard when there&amp;rsquo;s no consistency in how that data appears in the source.&lt;/p&gt;
&lt;p&gt;We don&amp;rsquo;t want to be filling your BookWyrm instance with bad data. So, please take the time to validate all of the data that&amp;rsquo;s been copied over before submitting, and obviously search for the book on your BookWyrm instance before jumping to the creation of a new one. Much better to use / improve an existing book that others have been reading / reviewing than to create a duplicate.&lt;/p&gt;
&lt;h3 id=&#34;why-only-amazon&#34;&gt;Why Only Amazon?&lt;/h3&gt;
&lt;p&gt;It doesn&amp;rsquo;t &lt;em&gt;currently&lt;/em&gt; support other sites for one simple reason: &lt;em&gt;tons&lt;/em&gt; of indie authors &lt;em&gt;only&lt;/em&gt; publish their books on Amazon. This is largely because it&amp;rsquo;s a requirement if you want your book to be available via Kindle Unlimited. There are lots of reasons this is terrible for authors, and publishers, and readers, but that&amp;rsquo;s a separate discussion. What&amp;rsquo;s important for the purposes of this plugin is that regardless of how you feel about them, Amazon is the one place where you can consistently go and find the book you want to import to BookWyrm.&lt;/p&gt;
&lt;p&gt;It &lt;em&gt;currently&lt;/em&gt; only supports amazon.com and amazon.co.uk because most - or all - of the other amazon sites are in languages I can&amp;rsquo;t read and thus I can&amp;rsquo;t verify the extension will work on them.&lt;/p&gt;
&lt;h3 id=&#34;why-only-firefox&#34;&gt;Why only Firefox?&lt;/h3&gt;
&lt;p&gt;Because that&amp;rsquo;s what I use. Well, technically I use &lt;a href=&#34;https://www.waterfox.com/&#34;&gt;Waterfox&lt;/a&gt; because Mozilla seems determined to make Firefox awful. I &lt;em&gt;might&lt;/em&gt; make a Chrome extension, but - for many reasons - I don&amp;rsquo;t like using Chrome, so I&amp;rsquo;m not strongly motivated to go through all the work. 😉&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re a motivated geek, I&amp;rsquo;ll happily accept a Pull Request that creates a &amp;ldquo;chrome&amp;rdquo; folder with a chrome extension that reuses the core code, or just fork it and change it to be just a Chrome extension. Have fun.&lt;/p&gt;
&lt;h2 id=&#34;geekery&#34;&gt;Geekery&lt;/h2&gt;
&lt;p&gt;The GitHub repo can be found here: &lt;a href=&#34;https://github.com/masukomi/firefox_amazon_to_bookwyrm/&#34;&gt;https://github.com/masukomi/firefox_amazon_to_bookwyrm/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve endeavored to put all the info you&amp;rsquo;ll need to get started with modifying this to work on other sites.&lt;/p&gt;
&lt;p&gt;Please fork it, make changes, submit Pull Requests, all the good stuff.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Creating A Shorthand</title>
      <link>https://weblog.masukomi.org/2025/11/17/creating-a-shorthand/</link>
      <pubDate>Mon, 17 Nov 2025 00:00:00 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/2025/11/17/creating-a-shorthand/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#why-make-a-shorthand-or-custom-cursive-orthography&#34;&gt;Why make a shorthand or custom cursive orthography?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#what-i-made&#34;&gt;What I made&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#set-some-goals&#34;&gt;Set Some Goals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#understand-your-limitations&#34;&gt;Understand your limitations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#understand-that-everything-is-a-tradeoff&#34;&gt;Understand that everything is a tradeoff&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#fonts-for-shorthands&#34;&gt;Fonts for Shorthands&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#it-s-hard-to-be-simple&#34;&gt;It&amp;rsquo;s hard to be simple&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#learn-from-those-who-came-before&#34;&gt;Learn from those who came before&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#stand-on-their-shoulders&#34;&gt;Stand on their shoulders&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#prioritize-your-goals&#34;&gt;Prioritize your goals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#it-will-never-be-perfect&#34;&gt;It will never be perfect&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#no-one-cares&#34;&gt;No-one cares&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#keep-track-of-your-changes&#34;&gt;Keep track of your changes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#it-doesn-t-even-have-to-be-useful-dot&#34;&gt;It doesn&amp;rsquo;t even have to be useful.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#resources&#34;&gt;Resources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#looking-back-on-korthic&#34;&gt;Looking Back on Korthic&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;A look back on the experience of creating my own shorthand, and advice for those who might want to attempt the create one of their own.&lt;/p&gt;
&lt;h2 id=&#34;why-make-a-shorthand-or-custom-cursive-orthography&#34;&gt;Why make a shorthand or custom cursive orthography?&lt;/h2&gt;
&lt;p&gt;There are lots of reasons one might want to. Kids create secret cyphers for sharing notes with friends, or keeping their diaries private. Adults do that too, but some of us do it for the challenge, and some of us do it because the existing options just don&amp;rsquo;t work well for our brains, or bodies.&lt;/p&gt;
&lt;p&gt;Creating your own shorthand is a fun and creative exercise. Creating a &lt;em&gt;cursive&lt;/em&gt; shorthand brings a series of additional challenges related to how letters connect, and how words flow across the page. I&amp;rsquo;ll write more about this below.&lt;/p&gt;
&lt;p&gt;Writing longhand is also incredibly rewarding, because it uses different parts of your brain, and forces you to interact with language differently. Doing so in a script that&amp;rsquo;s designed specifically for your needs, and desires feels great.&lt;/p&gt;
&lt;h2 id=&#34;what-i-made&#34;&gt;What I made&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://korthic.fyi/&#34;&gt;Korthic Shorthand&lt;/a&gt; is a cursive shorthand created to solve the problems I was encountering using standard printed, or cursive English lettering. It&amp;rsquo;s a 1:1 substitution for the Latin alphabet, just like longhand is a 1:1 substitution for printed letters.&lt;/p&gt;
&lt;p&gt;As shorthands go, it&amp;rsquo;s very simple. No phonetic spellings, and only two &amp;ldquo;shortened forms&amp;rdquo; for common words.&lt;/p&gt;
&lt;p&gt;I suspect that future versions of it &lt;em&gt;will&lt;/em&gt; have phonetic spellings, but for reasons I&amp;rsquo;ll get into later, I chose to release it without that.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/11/17/korthic_alphabet.png&#34;
    alt=&#34;A screenshot of the Korthic alphabet.&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;A screenshot of the Korthic alphabet.&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;set-some-goals&#34;&gt;Set Some Goals&lt;/h2&gt;
&lt;p&gt;The most important thing you can do is describe the problem you&amp;rsquo;re trying to solve, and set some goals.&lt;/p&gt;
&lt;p&gt;I had the following goals for Korthic:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a cursive that doesn&amp;rsquo;t bother my wrists after many pages of writing&lt;/li&gt;
&lt;li&gt;(mostly) stays on a horizontal line&lt;/li&gt;
&lt;li&gt;works well on tablets&lt;/li&gt;
&lt;li&gt;produces words whose meaning is unambiguous and easy to read.&lt;/li&gt;
&lt;li&gt;no memorizing long lists of special cases&lt;/li&gt;
&lt;li&gt;aesthetics that make me smile&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that &lt;em&gt;speed&lt;/em&gt; was &lt;em&gt;not&lt;/em&gt; something I was striving for. I don&amp;rsquo;t need to transcribe written speech. I need something that&amp;rsquo;ll be &amp;ldquo;fast enough&amp;rdquo; for me to write scenes for my novels without frustrating me.&lt;/p&gt;
&lt;p&gt;My aesthetic goals are purely subjective. More importantly, they&amp;rsquo;re not subject to what anyone else thinks. I &lt;em&gt;only&lt;/em&gt; need to make myself happy. That being said, I have received unprompted compliments on it from people who happened to see me writing.&lt;/p&gt;
&lt;h2 id=&#34;understand-your-limitations&#34;&gt;Understand your limitations&lt;/h2&gt;
&lt;p&gt;In my case there were two big limitations that I was trying to overcome. The first is that after only a couple pages of printing my wrist starts to hurt. Writing in standard cursive solves this, but at speed I end up with words whose letters I have trouble trying to decipher. Transcribing my scribbles became an exercise in frustration.&lt;/p&gt;
&lt;p&gt;However, writing many pages in both forms taught me about what I could realistically expect of myself.&lt;/p&gt;
&lt;p&gt;Precision was, very clearly, &lt;em&gt;not&lt;/em&gt; something I could rely on.&lt;/p&gt;
&lt;p&gt;Grafoni - for example - looks great. It&amp;rsquo;s got a printed and cursive form, and both look clear, and &lt;em&gt;seem&lt;/em&gt; easy to read.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/11/17/grafoni_example.png&#34;
    alt=&#34;An example of Grafoni&amp;#39;s two writing styles&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;An example of Grafoni&amp;#39;s two writing styles&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;I was excited to use it, until I looked closer.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/11/17/grafoni_alphabet.png&#34;
    alt=&#34;the Grafoni Alphabet shows that almost every shape comes in three sizes, and the size you draw the shape at indicates what letter it represents.&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;The Grafoni Alphabet.&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;After writing enough pages of cursive English, it was clear to me that I&amp;rsquo;d never be able to clearly write different upwards curves of slightly different lengths and be able to tell one from another. I gave Grafoni a try, just to be sure, but I walked away confident it&amp;rsquo;d never meet my requirement of creating words with unambiguous spellings.&lt;/p&gt;
&lt;p&gt;I &lt;em&gt;can&lt;/em&gt; differentiated between &amp;ldquo;wide&amp;rdquo; and &amp;ldquo;small&amp;rdquo; letters though. In Korthic the &amp;ldquo;t&amp;rdquo; and the &amp;ldquo;o&amp;rdquo; are both downward curves like a &amp;ldquo;u&amp;rdquo; but the &amp;ldquo;o&amp;rdquo; is always written significantly wider. There are a couple other letter pairs like this. How wide my &amp;ldquo;o&amp;rdquo; is drawn can differ significantly from word to word, but it&amp;rsquo;s still pretty obvious that my &amp;ldquo;t&amp;rdquo; shape is trying to be a &amp;ldquo;small&amp;rdquo; letter and my &amp;ldquo;o&amp;rdquo; is trying to be a &amp;ldquo;wide&amp;rdquo; letter.  In the end&lt;/p&gt;
&lt;h2 id=&#34;understand-that-everything-is-a-tradeoff&#34;&gt;Understand that everything is a tradeoff&lt;/h2&gt;
&lt;p&gt;Gregg shorthand - for example - prioritizes speed over most things. It&amp;rsquo;s a brilliant cursive shorthand, with lots to lots to learn from studying it, but it also has hundreds of &amp;ldquo;shortened forms&amp;rdquo; it expects you to memorize. For example, the word &amp;ldquo;husband&amp;rdquo; is written like a lower case &amp;ldquo;i&amp;rdquo; with a tiny bit of flourish. Its spelling is phonetic, and it has a bunch of special rules, and shapes that are similar enough that I&amp;rsquo;m reasonably confident anything I tried to write quickly with it would be very hard to read.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/11/17/gregg_shorthand_example.png&#34;
    alt=&#34;An example of Gregg Shorthand&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;An example of Gregg Shorthand&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Fast meant using phonetic spelling so that you don&amp;rsquo;t have to write every letter. It meant memorizing and using &amp;ldquo;shortened forms&amp;rdquo; for common words. The phonetic spelling is limited, and the result is that it&amp;rsquo;s really hard to guess the correct pronunciation when you encounter a person&amp;rsquo;s name in Gregg Shorthand. It meant big looping shapes that required almost no lifts of your pen except to start a new word.&lt;/p&gt;
&lt;h2 id=&#34;fonts-for-shorthands&#34;&gt;Fonts for Shorthands&lt;/h2&gt;
&lt;p&gt;Creating a font has become surprisingly easy. Especially with apps like &lt;a href=&#34;https://birdfont.org/&#34;&gt;BirdFont&lt;/a&gt;, and the idea of having a font for your shorthand is probably enticing.  The problem is that font systems are fundamentally all about letters fitting into a grid. Chinese characters &lt;em&gt;seem&lt;/em&gt; like an exception to this, but they&amp;rsquo;re really not. Yes they represent words, but functionally they&amp;rsquo;re just more complicated characters on a grid.&lt;/p&gt;
&lt;p&gt;A font could be created for something that resembles characters in a line, like Grafoni. Something that was made up of central shapes with &lt;a href=&#34;https://en.wikipedia.org/wiki/Diacritic&#34;&gt;diacritics&lt;/a&gt; around them - think letters or Chinese characters with marks nearby -  could also be made into a font, as long as the characters proceed linearly.&lt;/p&gt;
&lt;p&gt;However, many shorthands have a tendency to wander vertically as one letter / sound connects to the next and that&amp;rsquo;s just not compatible with how fonts work.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;So, if you&amp;rsquo;d like to be able to type on your keyboard and have it look like your shorthand, then you&amp;rsquo;ll need to guarantee that what you design is extremely linear.&lt;/p&gt;
&lt;h2 id=&#34;it-s-hard-to-be-simple&#34;&gt;It&amp;rsquo;s hard to be simple&lt;/h2&gt;
&lt;p&gt;The more you want your writing to flow from one word to the next, the harder it is to have unique shapes. Grafoni and Gregg are good examples of this. Both systems have very few shapes&lt;/p&gt;
&lt;p&gt;Grafoni&amp;rsquo;s creator decided that with precise control of width, or height, one could solve the problem of reusing the same shapes. And, as you can see above, has three sizes for each shape.&lt;/p&gt;
&lt;p&gt;Gregg also reuses shapes, but - in my opinion - it&amp;rsquo;s far more clever about it. Gregg understood that speed and precision were at odds with each other. With Gregg, there are only small and large shapes, and the difference is pretty obvious in practice. Additionally, he understood that it&amp;rsquo;s hard to maintain angular joins when moving fast, and incorporated the natural curve that would result when trying to draw an obtuse angle quickly.&lt;/p&gt;
&lt;p&gt;Gregg shorthand is a master-class of clever decisions, and practical compromises needed to enable professional stenographers accurately capture the live speech of people accurately enough for court documents.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/11/17/gregg_alphabet.png&#34;
    alt=&#34;A page from Gregg Shorthand Anniversary Edition showing the basic alphabet.&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Gregg Shorthand Alphabet.&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Fast writing is inevitably going to be a lot of big and small loops, and horizontal lines. Making an abrupt change of direction, or lifting the pen to reposition it slows things down.&lt;/p&gt;
&lt;p&gt;Because I was designing a cursive, where I wanted all the letters to connect, I encountered two big problems. The first was that it was difficult to find &lt;em&gt;different&lt;/em&gt; shapes for letters that didn&amp;rsquo;t cause the pen to move up or down. The second was that any shape that ended up at a different level than it started causes words to spread vertically.&lt;/p&gt;
&lt;p&gt;You can keep the number of shapes low, by introducing rules like Gregg&amp;rsquo;s that make it clear that in this situation a loop means this, but in that situation it means something else. Or, you can demand precision like Grafoni does.&lt;/p&gt;
&lt;p&gt;Precision wasn&amp;rsquo;t an option for me. I&amp;rsquo;d learned that I can manage two sizes of a shape, and that mirroring shapes - either literally, or by drawing them in a different direction -  was a practical form of reuse. Combined, these mean that any one shape can be used four times. Unfortunately it wasn&amp;rsquo;t until writing this paragraph that I actually put those facts together. This is - in no small part - because Korthic didn&amp;rsquo;t start from scratch, but is an iteratively modified descendent of Orthic.&lt;/p&gt;
&lt;p&gt;My need for different letter shapes meant I only partially solved the problem. Here are some of the rules Korthic employs to help get around its problems.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&amp;ldquo;n&amp;rdquo; is just a bigger &amp;ldquo;i&amp;rdquo;, but when there&amp;rsquo;s just one in isolation it can be hard to tell which was intended.  Context solves the problem most of the time. If you see a word that can be &amp;ldquo;one&amp;rdquo; or &amp;ldquo;oie&amp;rdquo; it&amp;rsquo;s a pretty safe bet that the author intended &amp;ldquo;one&amp;rdquo;. However, unambiguous letters was one of my primary goals. To address this, I added a rule that a dot over the &amp;ldquo;i&amp;rdquo; shape meant it was definitely an &amp;ldquo;i&amp;rdquo;. That rule also leverages a rule that English speakers will have already internalized.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;ldquo;l&amp;rdquo; and &amp;ldquo;r&amp;rdquo; are both little loops on the line, but &amp;ldquo;r&amp;rdquo; is always drawn counter-clockwise and &amp;ldquo;l&amp;rdquo; is always drawn clockwise. This means that as you are writing from left to right, the &amp;ldquo;r&amp;rdquo; will always be on top of the line, and the &amp;ldquo;l&amp;rdquo; will always be on the bottom.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;ldquo;c&amp;rdquo; and &amp;ldquo;s&amp;rdquo; are similar in that the direction they&amp;rsquo;re drawn in results in them being mirror images of each other.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;ldquo;p&amp;rdquo;, &amp;ldquo;d&amp;rdquo;, and &amp;ldquo;k&amp;rdquo; can all be drawn upwards or downwards, and you can exit the large circle of an &amp;ldquo;h&amp;rdquo; at any point. Whenever a word is trending too far up or down, and it encounters one of these letters, it gives you an opportunity to shift the word in the opposite direction.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not perfect though. Korthic&amp;rsquo;s &amp;ldquo;u&amp;rdquo; is a downward slant, and the word &amp;ldquo;succubus&amp;rdquo; provides me with no real opportunity to counteract the downward slant of its three separate &amp;ldquo;u&amp;rdquo;. I can&amp;rsquo;t allow users to optionally write &amp;ldquo;u&amp;rdquo; in an upward direction, because that&amp;rsquo;s a &amp;ldquo;y&amp;rdquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;ldquo;c&amp;rdquo; and &amp;ldquo;s&amp;rdquo; both allow you to continue writing along their baseline, or to angle back up to the height of where they started.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;learn-from-those-who-came-before&#34;&gt;Learn from those who came before&lt;/h2&gt;
&lt;p&gt;Taking the time to learn the basics of Gregg was one of the most valuable steps in my journey to creating Korthic. I think &lt;em&gt;anyone&lt;/em&gt; attempting to create a cursive of their own should take the time to do the same. Even though Gregg doesn&amp;rsquo;t work for my brain, and I ended up creating something that can&amp;rsquo;t possibly compete with Gregg&amp;rsquo;s speed, its lessons still informed many of my choices.&lt;/p&gt;
&lt;p&gt;Trying to learn Grafoni was also &lt;em&gt;very&lt;/em&gt; informative. It confirmed my belief that carefully controlling size was &lt;em&gt;not&lt;/em&gt; something I was capable of. Gregg taught me that &amp;ldquo;obviously small&amp;rdquo; and &amp;ldquo;obviously large&amp;rdquo; don&amp;rsquo;t require precision, and are distinctions that I &lt;em&gt;can&lt;/em&gt; make when writing. This means that, for me every shape could - in theory - be used twice.&lt;/p&gt;
&lt;p&gt;Gregg also taught me how to mirror a shape for reuse, and that the direction you draw a shape in can be a clear signal as to which letter you intended. That&amp;rsquo;s how I ended up with &amp;ldquo;r&amp;rdquo; and &amp;ldquo;l&amp;rdquo; being identical shapes, that are still clearly distinguishable in actual practice.&lt;/p&gt;
&lt;p&gt;My advice is to download, and skim through lots of shorthands. Find ones that look close to what you want, and try to use them. Make notes on what works, and doesn&amp;rsquo;t work in each one. It&amp;rsquo;s ok if these opinions are completely subjective, irrational, and / or emotional. You don&amp;rsquo;t have to justify your hot-takes to anyone. You&amp;rsquo;re just trying to find out what your brain likes, and learn from other people&amp;rsquo;s &amp;ldquo;mistakes&amp;rdquo; or &amp;ldquo;brilliant ideas&amp;rdquo;.&lt;/p&gt;
&lt;h3 id=&#34;stand-on-their-shoulders&#34;&gt;Stand on their shoulders&lt;/h3&gt;
&lt;p&gt;In your travels through existing shorthands you&amp;rsquo;ll likely find something that seems close to what you want. For your first shorthand, consider taking that almost - but not quite - shorthand, and modifying it according to the lessons you&amp;rsquo;ve picked up in your explorations.&lt;/p&gt;
&lt;p&gt;Creating a truly usable &lt;a href=&#34;https://en.wikipedia.org/wiki/Orthography&#34;&gt;orthography&lt;/a&gt; is a one of those subtly complex arts that you won&amp;rsquo;t &lt;em&gt;really&lt;/em&gt; understand until you&amp;rsquo;ve done it a few times. Working from someone else&amp;rsquo;s foundation means starting from a point that&amp;rsquo;s already worked through many of the complications, and is known to work for at least someone. In a way it&amp;rsquo;s like having a safety net. When you try something that inevitably fails, you can have confidence that it&amp;rsquo;s just the thing you tried, and not the whole system, or its fundamental thinking that needs to be abandoned.&lt;/p&gt;
&lt;h2 id=&#34;prioritize-your-goals&#34;&gt;Prioritize your goals&lt;/h2&gt;
&lt;p&gt;Clarity was more important than speed, and - as I worked on Korthic - I learned that after ease of use, aesthetics were the key to making me smile. Because of this, my &amp;ldquo;e&amp;rdquo; ended up being extremely flexible. It went from a simple line that went down off of a horizontal line, to &lt;em&gt;any&lt;/em&gt; near-perpendicular intersection of two lines without crossing.&lt;/p&gt;
&lt;h2 id=&#34;it-will-never-be-perfect&#34;&gt;It will never be perfect&lt;/h2&gt;
&lt;p&gt;The 1800&amp;rsquo;s seemed to be the Golden Age of shorthands, but it wasn&amp;rsquo;t a time of collaboration and iterative improvement. Instead each shorthand of the era starts with a small treatise on why it&amp;rsquo;s &amp;ldquo;objectively perfect&amp;rdquo; and &amp;ldquo;obviously superior&amp;rdquo; to every shorthand that came before it, or sometimes just to the one its author had a grudge against.&lt;/p&gt;
&lt;p&gt;The truth is that different people have different minds, and different bodies. No shorthand is perfect for everyone. Korthic isn&amp;rsquo;t even perfect for me. It&amp;rsquo;s &amp;ldquo;u&amp;rdquo; being a downward slant results in words like &amp;ldquo;succubus&amp;rdquo; that go down, down, down and never get a chance to come back up. The &amp;ldquo;d&amp;rdquo; involves too much careful drawing for such a common letter.&lt;/p&gt;
&lt;p&gt;But, it works for me, it solved my problems with readability, and wrist strain, and it makes me smile. Will I keep using it? Probably. Will I change it? Probably.&lt;/p&gt;
&lt;h2 id=&#34;no-one-cares&#34;&gt;No-one cares&lt;/h2&gt;
&lt;p&gt;No-one cares about physical writing anymore. Cursive is a dying art. So much so that &lt;a href=&#34;https://www.smithsonianmag.com/smart-news/can-you-read-this-cursive-handwriting-the-national-archives-wants-your-help-180985833/&#34;&gt;the US National Archives is desperate for people who can read cursive&lt;/a&gt;, and help them transcribe historical letters from the US Civil War.&lt;/p&gt;
&lt;p&gt;The more technology advances the less need we people see for physically writing. Whisper can transcribe audio with great accuracy and speaker detection at many times the speed of its speakers. A good keyboard and a little practice will enable novices to type over 120 words per minute, and &lt;a href=&#34;https://en.wikipedia.org/wiki/Stenotype&#34;&gt;stenotype machines&lt;/a&gt; allow professional stenographers to reach upwards of 375 words per minute.&lt;/p&gt;
&lt;p&gt;Even the people who are fascinated by shorthands won&amp;rsquo;t really care. They might say &amp;ldquo;oh neat&amp;rdquo; and wander off, but it&amp;rsquo;s unlikely anyone else will actually &lt;em&gt;use&lt;/em&gt; what you create. Accepting this is incredibly freeing. People aren&amp;rsquo;t going to nitpick your creation, and it doesn&amp;rsquo;t have to satisfy &lt;em&gt;anyone&lt;/em&gt; but you.&lt;/p&gt;
&lt;p&gt;Thomas Hill&amp;rsquo;s shorthand is a great example of this. He created it for himself, and it was never shared with the world until after his death in 1860. It&amp;rsquo;s a wild shorthand as you can see by this example R4 Unit &lt;a href=&#34;https://www.reddit.com/r/FastWriting/comments/1mkkozh/the_bizarre_and_beautiful_shorthand_of_thomas_hill/&#34;&gt;shared on Reddit&lt;/a&gt;. Short vowels are single dots, and long vowels are double dots, and in both cases their position relative to their &amp;ldquo;seat&amp;rdquo; (a concept Thomas seems to have come up with) and that relative position indicates &lt;em&gt;which&lt;/em&gt; vowel sound it makes. Furthermore, there are only seven pages of documentation.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/11/17/thomas_hill_shorthand.jpg&#34;
    alt=&#34;an exaple of writing in Thomas Hill&amp;#39;s Shorthand. Every word is one stroke with only a handful of shapes and surronded by dots. Some words are even just dots.&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Thomas Hill&amp;#39;s Shorthand&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;I love that - unlike his contemporaries - Thomas didn&amp;rsquo;t feel compelled to try and convince the world that his shorthand was &amp;ldquo;obviously&amp;rdquo; the best. He seems to have just made something for himself and left it at that. The only reason we know anything about it is that his estate published it along with some of his writings after his death.&lt;/p&gt;
&lt;h2 id=&#34;keep-track-of-your-changes&#34;&gt;Keep track of your changes&lt;/h2&gt;
&lt;p&gt;I did two things which really helped me.&lt;/p&gt;
&lt;p&gt;The most useful thing I did was to shrink down the key for the Alphabet that you see at the top of this page, and put it in the top right corner of every page I wrote in my tablet. This served two purposes. First, it was a reference for learning. This was especially useful when I changed how a letter was drawn. Second it&amp;rsquo;s a key to reading things written in old versions of Korthic.&lt;/p&gt;
&lt;p&gt;The other thing I did was to keep a change-log of my modifications.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/11/17/korthic_changelog.png&#34;
    alt=&#34;A screenshot of the top of my changelog page. The writing is hard to read, but it shows the modifications I made to how I drew characters in each version.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;The change-log was useful because - more than once - I considered using a shape for a letter that I&amp;rsquo;d already tried, and discarded. This saved me from trying it again. It also helped me to objectively see which letters I was struggling with.&lt;/p&gt;
&lt;h2 id=&#34;it-doesn-t-even-have-to-be-useful-dot&#34;&gt;It doesn&amp;rsquo;t even have to be useful.&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&#34;https://www.reddit.com/r/neography/&#34;&gt;Neography subreddit&lt;/a&gt; is filled with people creating random writing systems they find it fun. For example, check out this Hangul inspired way of writing English that was &lt;a href=&#34;https://www.reddit.com/r/neography/comments/rvjj67/a_writing_system_i_developed_over_the_last_few/&#34;&gt;shared by CPhiltrus&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/11/17/hangul_inspired_script.jpg&#34;
    alt=&#34;A sentence written in a Hangul inspired orthography, along with a key and its transcription. It says I am a bit late but Happy New Year.&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Hangul Inspired Orthography&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Or this &amp;ldquo;unnamed geometric cypher&amp;rdquo; &lt;a href=&#34;https://www.reddit.com/r/neography/comments/1p14bl5/unnamed_geometric_cypher/&#34;&gt;shared by LMAONAISE&lt;/a&gt;&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/11/17/unnamed-geometric-cypher.jpg&#34;
    alt=&#34;A line of circles each having one or more small circles attached with lines coming out at angles that are multiples of 45°&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Unnamed Geometric Cypher&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Lots of people create writings systems for their &lt;a href=&#34;https://en.wikipedia.org/wiki/Constructed_language&#34;&gt;conlangs&lt;/a&gt; that no-one will ever use but them. Here&amp;rsquo;s an example of a font I created for a way of writing my conlang.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/11/17/oho-example-text.png&#34;
    alt=&#34;Some example sentences in my conlang Oho&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Some example sentences in Oho&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;resources&#34;&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.reddit.com/r/FastWriting&#34;&gt;FastWriting subreddit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.reddit.com/r/shorthand/&#34;&gt;Shorthand subreddit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.reddit.com/r/neography/&#34;&gt;Neography subreddit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.stenophile.com/shorthands&#34;&gt;Stenophile.com&amp;rsquo;s list of shorthands&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;looking-back-on-korthic&#34;&gt;Looking Back on Korthic&lt;/h2&gt;
&lt;p&gt;Creating Korthic taught me a lot. I ended up with isn&amp;rsquo;t anything like what I started out trying to create, and where my creation diverged from my goals.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/11/17/favorite_korthic_words.png&#34;
    alt=&#34;An image with three words in standard english and Korthic. Month is drawn as a long flowey word. I&amp;#39;ve is drawn as all sharp angles. In between them Know is drawn as a long curve with a bump, and two crossing lines.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;In the image above, you can see that &amp;ldquo;Month&amp;rdquo; and &amp;ldquo;I&amp;rsquo;ve&amp;rdquo; are radically different looking words. &amp;ldquo;Month&amp;rdquo; has long flowing curves which is what I set out to design. &amp;ldquo;I&amp;rsquo;ve&amp;rdquo; is all straight lines and sharp angles. I was specifically trying to avoid shapes like &amp;ldquo;I&amp;rsquo;ve&amp;rdquo; has. Sharp angles cause motion to come to an abrupt stop. The horizontal line on the right was drawn after completing the &amp;ldquo;V&amp;rdquo; and repositioning my stylus. That slows things down, &lt;em&gt;and&lt;/em&gt; introduces a little more wrist strain. &amp;ldquo;Know&amp;rdquo; is somewhere in between with a flowing curve, a sharp angle, and two crossing lines.&lt;/p&gt;
&lt;p&gt;Despite all the functional downsides, and the fact that &amp;ldquo;I&amp;rsquo;ve&amp;rdquo; looks nothing like what I was aiming for, I love it. I love the shapes that have emerged as a result of deciding that an &amp;ldquo;E&amp;rdquo; is any line that emerges from another at a near-perpindicular angle. I love the way &amp;ldquo;I&amp;rsquo;ve&amp;rdquo; looks. I love that &amp;ldquo;w&amp;rdquo; is two crossing lines that sometimes find themselves on curves. &amp;ldquo;I&amp;rsquo;ve&amp;rdquo; absolutely &lt;em&gt;not&lt;/em&gt; what I wanted in my orthography, but I had the self awareness to recognize that it made me smile despite going against my rules, and I allowed myself to embrace shapes like that as I designed it.&lt;/p&gt;
&lt;p&gt;Korthic is still evolving. The shapes of letters are changing as my speed increases. I&amp;rsquo;m pretty sure that I&amp;rsquo;ll reach a tipping point with &amp;ldquo;d&amp;rdquo; that forces it into some simpler shape, and the downward motion that &amp;ldquo;u&amp;rdquo; introduces is problematic, and annoying. On top of that, I think I want to come up with a phonetic system for writing that sidesteps the insanity of English spelling.&lt;/p&gt;
&lt;p&gt;But, I&amp;rsquo;m proud of it, and it makes my life better every time I sit down to write. I hope that putting it out there encourages someone to try their hand at creating a script for their everyday writing. If that&amp;rsquo;s you, I hope you have fun. I hope I get to see what you come up with.&lt;/p&gt;
&lt;p&gt;If you have questions, don&amp;rsquo;t hesitate to reach out to me on the fediverse: &lt;a href=&#34;https://connectified.com/@masukomi&#34;&gt;@masukomi@connectified.com&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;I&amp;rsquo;m oversimplifying the capabilities of modern fonts, but not by a lot. Practically speaking, unless you&amp;rsquo;re a font expert, or willing to do something that&amp;rsquo;ll only be viewable in web browsers with a lot of JavaScript creating a font for something like Gregg Shorthand just isn&amp;rsquo;t possible. Assume that you can only create fonts for othographies that work / look like languages you&amp;rsquo;ve seen fonts for already. English, Korean, Chinese, Hindi, Tamil, Arabic, etc.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Leaving Their Clouds</title>
      <link>https://weblog.masukomi.org/2025/11/02/leaving-their-clouds/</link>
      <pubDate>Sun, 02 Nov 2025 00:00:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2025/11/02/leaving-their-clouds/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#intro&#34;&gt;Intro&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#why-bother&#34;&gt;Why Bother?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#is-it-worth-the-effort&#34;&gt;Is it worth the effort?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#home-assistant&#34;&gt;Home Assistant&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#future-proofing&#34;&gt;Future Proofing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#required-cloud&#34;&gt;Required Cloud&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#voice-assistants&#34;&gt;Voice Assistants&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#the-voice-assistant-pipeline&#34;&gt;The Voice Assistant Pipeline&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#instructions&#34;&gt;Instructions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#privacy-concerns&#34;&gt;Privacy Concerns&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#incidental-hilarity&#34;&gt;Incidental Hilarity&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#something-to-listen&#34;&gt;Something To listen&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#note-about-the-home-assistant-voice-preview&#34;&gt;Note about the Home Assistant Voice Preview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#talking-to-your-phone&#34;&gt;Talking To Your Phone&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#wake-words&#34;&gt;Wake Words&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#radios&#34;&gt;Radios&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#protocols&#34;&gt;Protocols&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#wifi&#34;&gt;WiFi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#zigbee-and-zigbee2mqtt&#34;&gt;Zigbee &amp;amp; Zigbee2MQTT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#matter&#34;&gt;Matter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#z-wave&#34;&gt;Z-Wave&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#bluetooth&#34;&gt;Bluetooth&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#hardware&#34;&gt;Hardware&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#lights&#34;&gt;Lights&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#smart-switches&#34;&gt;Smart Switches&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#smart-home-device-shopping-gotchas&#34;&gt;Smart Home Device Shopping Gotchas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#automating-things&#34;&gt;Automating Things&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#cost&#34;&gt;Cost&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#replaced-things&#34;&gt;Replaced Things&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#new-things&#34;&gt;New Things&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;intro&#34;&gt;Intro&lt;/h2&gt;
&lt;p&gt;There are so many wonderful things about a &amp;ldquo;smart home&amp;rdquo; if you can afford it. There are so many tiny quality-of-life improvements that really add up. Being able to turn off the lights at night by talking to the air instead of having to walk naked from the switch to bed, and then climb under the sheets in the dark made us giddy for weeks.&lt;/p&gt;
&lt;p&gt;The problem is that - for most people - the ownership of their smart home devices is an illusion. &lt;a href=&#34;https://support.google.com/googlenest/answer/16233096&#34;&gt;Google just killed the ability to control two generations of Nest thermostats&lt;/a&gt; from your phone. &lt;a href=&#34;https://www.home-assistant.io/blog/2023/09/22/philips-hue-force-users-upload-data-to-cloud/&#34;&gt;Phillips changed the terms of service&lt;/a&gt; such that you need to create an account, and agree to share you data with them. This change didn&amp;rsquo;t &lt;em&gt;just&lt;/em&gt; affect new users. People who were using their lights without accounts, and without sharing data with Phillips were suddenly forced to go along with these changes if they wanted to keep using their very expensive lights.&lt;/p&gt;
&lt;p&gt;Voice assistants were always a privacy concern, but the companies they were attached to at least &lt;em&gt;pretended&lt;/em&gt; to not be immoral. Now, we&amp;rsquo;re seeing their true colors and there are significant reasons to be worried about always on listening devices, especially when living under authoritarian governments.&lt;/p&gt;
&lt;p&gt;So, we set about reclaiming the control, and privacy, we should have had all along. We&amp;rsquo;ve almost entirely separated ourselves from the corporate clouds, but doing so was &lt;em&gt;way&lt;/em&gt; more work, and learning than either of us anticipated.&lt;/p&gt;
&lt;p&gt;This blog post exists in the hope that it can guide others through the process without so much frustration, and forced learning. It&amp;rsquo;s not a step-by-step guide to setting things up. There are plenty of those out there already. Instead, this is the collection of all the things that would have been helpful to know before embarking on this journey.&lt;/p&gt;
&lt;h2 id=&#34;why-bother&#34;&gt;Why Bother?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Protecting Your Investment.&lt;/strong&gt;
Removes the potential for a company to make your devices unusable as a result of dropping support, changing behavior out from under you, not updating their phone app, or changing Terms of Service to something unacceptable&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Controlling who can see your data.&lt;/strong&gt;
Stops companies from selling your personal data to law enforcement &amp;amp; random companies.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Removing yourself from the hacking targets.&lt;/strong&gt;
Unless you&amp;rsquo;re famous or politically powerful, Hackers are far more likely to go after a company server with millions of people&amp;rsquo;s records instead of hunting down one random individual&amp;rsquo;s setup. Hackers regularly break into large company&amp;rsquo;s data centers and steal potentially useful information. When you remove yourself from these systems you&amp;rsquo;re no longer a target.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;No surprise updates.&lt;/strong&gt;
Companies push changes in behavior and functionality to smart devices all the time. You &lt;em&gt;can&lt;/em&gt; update your devices still, but most of the time there&amp;rsquo;s no good reason to. You have a functional piece of hardware that&amp;rsquo;s no longer connected to servers you don&amp;rsquo;t control. Remote access and/or control from the manufacturer&amp;rsquo;s servers is no longer a thing you have to worry about, so there&amp;rsquo;s not a lot of reason to update and risk things changing or breaking.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Better control.&lt;/strong&gt;
Apple&amp;rsquo;s Home app is maddeningly dumbed down, and if you don&amp;rsquo;t like the way they present info, or allow you to interact with the devices there&amp;rsquo;s nothing you can do about it.&lt;/p&gt;
&lt;p&gt;Home Assistant is not only &lt;em&gt;much&lt;/em&gt; easer to interact with, it allows you to make custom dashboards of just the information you want.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Centralized control.&lt;/strong&gt;
Some apps do a great job of integrating with Apple Home. Some don&amp;rsquo;t even bother. Some, expose some controls and info but not all.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Complete control.&lt;/strong&gt;
With Home Assistant you have complete control over all of your devices in one place. If a device exposes some functionality, then Home Assistant will provide that in the UI. Each &amp;ldquo;Integration&amp;rdquo; is custom coded for the specific devices and / or protocols. It&amp;rsquo;s no longer a matter of hoping that the Home app from Apple, Google, or Amazon anticipated the needs and capabilities of whatever random device you&amp;rsquo;re connecting.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Better Automation&lt;/strong&gt;
Home Assistant provides a simple, and user friendly UI for creating scripts and automations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cost savings&lt;/strong&gt;
You&amp;rsquo;re going to save a ton on the devices you buy going forwards. An extreme example of this is the Air Exchanger we need to install to address CO₂ buildup in our house. An exchanger with decent efficacy and energy efficiency, runs around $3k, however the last time I checked, a smart one with decent controls was $10k. Worse, spending that money is a bet that the company would keep existing and supporting the cloud software it was talking to for the next 30 years. Most companies don&amp;rsquo;t last that long.&lt;/p&gt;
&lt;p&gt;Instead, We&amp;rsquo;ll be buying the $3k exchanger, and installing some cheap (&amp;lt;$100 each) sensors around the house that will monitor the air quality and turn it on and off as needed.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;is-it-worth-the-effort&#34;&gt;Is it worth the effort?&lt;/h2&gt;
&lt;p&gt;We think so. We&amp;rsquo;re happier knowing that Phillips and other companies will no longer be selling our data. We&amp;rsquo;re happier knowing that none of our devices will randomly stop working because the company went out of business, or got bored and wandered off like Google did with the Nest thermostats.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re happy to be reducing our reliance on companies that have repeated proven they&amp;rsquo;ll compromise their morals, and treating their customers with basic human decency for cash, or political clout.&lt;/p&gt;
&lt;p&gt;Apple has already removed apps from the App store that let people inform their neighbors when ICE is in the neighborhood, even though that&amp;rsquo;s completely legal in the US. Apple and Google have both broken their own encryption to give governments access to people&amp;rsquo;s messages in exchange for the ability to sell to their citizens.&lt;/p&gt;
&lt;p&gt;On a more personal level, women and trans people are being increasingly targeted in the US, and both companies have done immoral things to help authoritarian governments. There&amp;rsquo;s nothing stopping Apple or Google from telling their listening devices to report in whenever someone mentions keywords like &amp;ldquo;Abortion&amp;rdquo;, or &amp;ldquo;Transgender&amp;rdquo;, or mentioning the name of any group the government decides in unsavory.&lt;/p&gt;
&lt;h2 id=&#34;home-assistant&#34;&gt;Home Assistant&lt;/h2&gt;
&lt;p&gt;The key to making this all work is &lt;a href=&#34;https://www.home-assistant.io/&#34;&gt;Home Assistant&lt;/a&gt;. It&amp;rsquo;s a completely open-source replacement for the &amp;ldquo;Home&amp;rdquo; apps managed by Google, Apple, Amazon, or anyone else. It&amp;rsquo;ll also replace all 3rd party cloud integrations, like Phillips Hue&amp;rsquo;s.&lt;/p&gt;
&lt;p&gt;The key thing you need to understand about a &amp;ldquo;Smart Home&amp;rdquo; is that your devices need some centralized &amp;ldquo;server&amp;rdquo; to talk to and be controlled by. Usually each brand talks to some &amp;ldquo;cloud&amp;rdquo; server owned by whoever made the device. If the company looses interest in maintaining that product, or goes out of business your devices will stop working. By redirecting those devices to a server you control, you regain a ton of control and privacy.&lt;/p&gt;
&lt;p&gt;Because this is for your home, Home Assistant needs to run on a device that will &lt;em&gt;always&lt;/em&gt; be on. You don&amp;rsquo;t want to loose access to your lights because someone closed the lid on their laptop.&lt;/p&gt;
&lt;p&gt;While you &lt;em&gt;can&lt;/em&gt; just use an old computer, most people tend to go with a &lt;a href=&#34;https://www.raspberrypi.com/&#34;&gt;Raspberry Pi&lt;/a&gt; comes in. For the non-geeks it&amp;rsquo;s just a teeny affordable computer that we can install Home Assistant on, stick in the basement, and forget about. Right now - November 2025 - the most expensive tricked-out version of the Pi (the Pi 5 with a whopping 16Gb of RAM) is ~$130 USD, plus a wee bit more for a power supply and a case to keep it safe.&lt;/p&gt;
&lt;p&gt;Other options are the &lt;a href=&#34;https://support.nabucasa.com/hc/en-us/categories/24638797677853-Home-Assistant-Green&#34;&gt;Home Assistant Green&lt;/a&gt;, and the &lt;a href=&#34;https://support.nabucasa.com/hc/en-us/categories/24734575925149-Home-Assistant-Yellow&#34;&gt;Home Assistant Yellow&lt;/a&gt;. Seeed Studio has &lt;a href=&#34;https://www.seeedstudio.com/blog/2024/07/23/home-assistant-green-vs-yellow-vs-blue/&#34;&gt;a blog post comparing the two&lt;/a&gt;. Ultimately, they&amp;rsquo;re not too different from the Pi. It&amp;rsquo;s just a teeny cheap, low-power computer that can act as the central hub for your smart home.&lt;/p&gt;
&lt;h3 id=&#34;future-proofing&#34;&gt;Future Proofing&lt;/h3&gt;
&lt;p&gt;Switching to Home Assistant isn&amp;rsquo;t locking you in to another ecosystem. Anyone can code up a competing piece of home automation software that you could switch to it at zero cost. If the core team of developers stops working on it, some geeks are guaranteed to fork the project and keep it going. It&amp;rsquo;s a technology agnostic central communications hub.&lt;/p&gt;
&lt;h2 id=&#34;required-cloud&#34;&gt;Required Cloud&lt;/h2&gt;
&lt;p&gt;If you want to communicate with your smart home devices when you&amp;rsquo;re away from home, you&amp;rsquo;ll need something that can bridge your internal network with the wider internet. Practically speaking this isn&amp;rsquo;t possible without involving a 3rd party.&lt;/p&gt;
&lt;p&gt;The easiest, way is to use &lt;a href=&#34;https://www.nabucasa.com/&#34;&gt;Nabu Casa&lt;/a&gt;. Nabu Casa is a company created by the people behind Home Assistant. It offers some basic cloud services - like backups, and accessing your local Home Assistant remotely, and they sell some useful hardware devices. Profits from it get funneled back into the Home Assistant project.&lt;/p&gt;
&lt;p&gt;This is completely optional.&lt;/p&gt;
&lt;p&gt;There is one glaring asterisks though, and it concerns Voice Assistants.&lt;/p&gt;
&lt;h2 id=&#34;voice-assistants&#34;&gt;Voice Assistants&lt;/h2&gt;
&lt;p&gt;Dealing with the question of what to do about a voice assistant was the most intellectually, and emotionally draining part of this. Mostly, it&amp;rsquo;s because I was misled by the many, &lt;em&gt;many&lt;/em&gt; videos on YouTube talking about how you can run an LLM powered voice assistant on your Raspberry Pi, and how easy it is to do.&lt;/p&gt;
&lt;p&gt;These videos are all lies… kind-of. It &lt;em&gt;is&lt;/em&gt; easy to do. It &lt;em&gt;is&lt;/em&gt; possible. It&amp;rsquo;s also &lt;em&gt;completely useless&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the thing. There are two types of voice assistants. The ones that are &lt;em&gt;not&lt;/em&gt; powered by LLMs are an extremely limited set of hard-coded options that require very precise input, and have &lt;em&gt;no&lt;/em&gt; memory. For example, unless you give every device in your home a unique name, you can&amp;rsquo;t say &amp;ldquo;turn off X&amp;rdquo; instead you have to say something like &amp;ldquo;Turn off Kay&amp;rsquo;s Stand Lamp in Kay&amp;rsquo;s office&amp;rdquo;. Everything has to be very specific and very specifically worded. If you thought Siri&amp;rsquo;s limitations were frustrating, this will drive you mad.&lt;/p&gt;
&lt;p&gt;Then, there are ones powered by LLMs. This is what you want if you don&amp;rsquo;t want to be pulling out your hair and constantly complaining about how stupid your device is. This is what Apple promised with Siri, but never delivered. Not only can they figure out what you meant without precise wording, they retain context. For example. You could say &amp;ldquo;Are the lights on in Kay&amp;rsquo;s office?&amp;rdquo; and then, if it said &amp;ldquo;Yes&amp;rdquo; you could tell it to &amp;ldquo;turn them off&amp;rdquo; and it would know what you were talking about.&lt;/p&gt;
&lt;p&gt;Even better, when you configure the LLM you set up a prompt that it will use to initiate all new conversations. That prompt can give it guidance on how to respond, and specific instructions to help it work around any frustrating edge cases that come up.&lt;/p&gt;
&lt;p&gt;For example. We have a script called &amp;ldquo;Goodnight&amp;rdquo;. When I first said &amp;ldquo;Ok Nabu. Goodnight&amp;rdquo; The LLM thought I was just wishing it a good night. So, I added the following to its prompt.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Always check if there is a Script, Device, Area, or Scene that matches the user&amp;rsquo;s input and attempt to use that first. For example, if the only thing the user says is &amp;ldquo;Goodnight&amp;rdquo; and there is a script with that name, assume they want you to run the &amp;ldquo;Goodnight&amp;rdquo; script, and they&amp;rsquo;re not just wishing you a good night.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I &lt;em&gt;could&lt;/em&gt; have just changed what words I used and said &amp;ldquo;run the goodnight script&amp;rdquo; and it would have figured it out, but we &lt;em&gt;like&lt;/em&gt; laying in bed and just saying &amp;ldquo;goodnight&amp;rdquo; to our voice assistant and having it shut down our house.&lt;/p&gt;
&lt;p&gt;Unfortunately there are two problems with LLM powered voice assistants. The first is that you need &lt;em&gt;fast&lt;/em&gt; response times. Waiting twenty seconds (sometimes more) for it to turn on a light, is &lt;em&gt;not&lt;/em&gt; practical. The second problem is that most people don&amp;rsquo;t understand just how &lt;em&gt;unbelievably&lt;/em&gt; computationally expensive it is to process someone&amp;rsquo;s text and infer what should be done in response to that input.&lt;/p&gt;
&lt;p&gt;Unless you&amp;rsquo;re willing to drop $7k or more on a &lt;em&gt;beefy&lt;/em&gt; home computer with a nice GPU it&amp;rsquo;s just not a realistic option. So, you need to shuttle your info off to a cloud LLM provider. Trust me. I spent days trying to make it usable with the LLM running on a maxed-out MacBook Pro with an M1. For simple - very specific - requests the best I got was about 10 seconds between asking for something and having it done. More often it was twenty seconds or more. I didn&amp;rsquo;t even try on the Pi.&lt;/p&gt;
&lt;p&gt;For the hardware geeks out there: &lt;em&gt;No&lt;/em&gt; networking a bunch of computers to share the processing load is not an option. The latency induced by the machines talking to each other is so great that even adding a second device &lt;em&gt;destroys&lt;/em&gt; response times.&lt;/p&gt;
&lt;h3 id=&#34;the-voice-assistant-pipeline&#34;&gt;The Voice Assistant Pipeline&lt;/h3&gt;
&lt;p&gt;At a high level you need four things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a device with a microphone&lt;/li&gt;
&lt;li&gt;something to convert speech to text&lt;/li&gt;
&lt;li&gt;an LLM to process that text and take action&lt;/li&gt;
&lt;li&gt;something to convert the text response from the LLM into a voice&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The speech-to-text and text-to-speech &lt;em&gt;can&lt;/em&gt; be run on the Pi. It adds roughly one to two seconds of delay to do so. These capabilities are handled by Whisper, and Piper respectively. These are both open source projects and trivial to set up on the Pi. But, I wouldn&amp;rsquo;t recommend bothering, unless you&amp;rsquo;re &lt;em&gt;also&lt;/em&gt; going to drop a huge wad of cash on an in-home AI server.&lt;/p&gt;
&lt;p&gt;Instead, I&amp;rsquo;d recommend doing what we&amp;rsquo;ve done and sign up to Nabu Casa&amp;rsquo;s &lt;a href=&#34;https://www.nabucasa.com/&#34;&gt;Home Assistant cloud&lt;/a&gt;. In addition to giving us backups, and a way to access our Home Assistant from any device, they also handle the speech-to-text and text-to-speech. Currently this costs $6.50 a month or $65 a year.&lt;/p&gt;
&lt;p&gt;Once Home Assistant Cloud converts our speech to text, that text gets handed of to an LLM cloud provider. We&amp;rsquo;ve gone with Open AI because it was easy, and it really doesn&amp;rsquo;t matter who you use. You don&amp;rsquo;t need the best model. You just need a relatively recent model that knows how to work with &amp;ldquo;tools&amp;rdquo; and is running on servers with enough power to respond quickly.&lt;/p&gt;
&lt;h4 id=&#34;instructions&#34;&gt;Instructions&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.home-assistant.io/voice_control/voice_remote_cloud_assistant/&#34;&gt;Setting up Speech to Text and Text-to-Speech with Home Assistant Cloud&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.home-assistant.io/integrations/openai_conversation/&#34;&gt;Configuring Open AI to do the thinking&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Gotchas&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Homophone&#34;&gt;Homophones&lt;/a&gt;, and words that just sound &lt;em&gt;really similar&lt;/em&gt; to other words are the biggest source of annoyances. During the speech-to-text processing words can get transcribed incorrectly. For example my office is called &amp;ldquo;Kay&amp;rsquo;s Office&amp;rdquo;, so I say things like &amp;ldquo;Turn on Kay&amp;rsquo;s office lights&amp;rdquo;. The problem is that &amp;ldquo;Kay&amp;rsquo;s&amp;rdquo; sounds a lot like &amp;ldquo;case&amp;rdquo;, and &amp;ldquo;keys&amp;rdquo;. It&amp;rsquo;s also indistinguishable from &amp;ldquo;K&amp;rsquo;s&amp;rdquo;. If it gets transcribed as &amp;ldquo;Case office&amp;rdquo; - for example - the voice assistant will fail to find an area with that name, and won&amp;rsquo;t be able to do what I asked. I&amp;rsquo;ve also found case-sensitivity to be an issue.&lt;/p&gt;
&lt;p&gt;Home assistant allows you to specify aliases for devices. In order to figure out what the common mistakes are going to be, I recommend using the &amp;ldquo;Assist&amp;rdquo; feature in the Home Assistant app on your phone. It&amp;rsquo;s just like talking to a device on your counter, except that it shows you the words it thought you said. Try invoking something it has problems multiple times, and catch all the ways it screws it up.&lt;/p&gt;
&lt;p&gt;Creating aliases works if you have an LLM or not, but I&amp;rsquo;ve found a better - and easier to manage - solution is to add something like this to your prompt.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If the user ever mentions a device or area name with &amp;ldquo;K&amp;rsquo;s&amp;rdquo;, or &amp;ldquo;case&amp;rdquo;, or &amp;ldquo;keys&amp;rdquo; in it, assume they meant &amp;ldquo;Kay&amp;rsquo;s&amp;rdquo;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;To deal with the case-sensitivity I added this.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When comparing the names of Devices, Areas, Scripts, Automations, and other things, always do so in a case-insensitive manner. For example, you should consider &amp;ldquo;Kay&amp;rsquo;s Lights&amp;rdquo; and &amp;ldquo;kAy&amp;rsquo;s lIGhtS&amp;rdquo; to be the same.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;privacy-concerns&#34;&gt;Privacy Concerns&lt;/h4&gt;
&lt;p&gt;Courts have subpoenaed data from essentially - if not literally - every cloud provider out there who has data from our smart devices. &lt;a href=&#34;https://www.pbs.org/newshour/nation/amazon-releases-echo-data-murder-case-dropping-first-amendment-argument&#34;&gt;Alexa recordings have been used in at least one murder case&lt;/a&gt;, even though no-one was &lt;em&gt;trying&lt;/em&gt; to invoke Alexa. So, why were there any recordings to begin with? Even if the systems deemed it an accidental invocation, why were those voice recordings &lt;em&gt;saved&lt;/em&gt;?&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Home Assistant doesn&amp;rsquo;t have this problem. Unlike Siri, Alexa, and Google, there will never be an occasion where the device sends audio to the servers without you knowing, because you&amp;rsquo;re either pressing a button on your phone to make it listen, or you&amp;rsquo;re speaking to a puck on your counter, and that puck will always make a sound to let you know it&amp;rsquo;s been activated and is listening.&lt;/p&gt;
&lt;p&gt;You can turn off the activation sound, but why would you? I hated that Siri sometimes tried to do something out of the blue, or all the times I &lt;em&gt;thought&lt;/em&gt; it was listening as I tried to set a timer, but it was actually ignoring me and no timer got set.&lt;/p&gt;
&lt;h4 id=&#34;incidental-hilarity&#34;&gt;Incidental Hilarity&lt;/h4&gt;
&lt;p&gt;Humans can carry on conversations with multiple people, and know which bits are intended for which listener. Voice assistants aren&amp;rsquo;t so smart. They just listen until there&amp;rsquo;s a long enough pause. In our house this has resulted in a number of accidental instructions to the voice assistant, when I invoke it while talking to Wifey.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the most recent example:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Me: OK Nabu, turn on Kay&amp;rsquo;s office lights.
Wifey: Where&amp;rsquo;s the cat?&lt;/p&gt;
&lt;p&gt;Voice Assistant:  Ok. I&amp;rsquo;ve turned on Kay&amp;rsquo;s office lights. I&amp;rsquo;m not sure where the cat is. She might be somewhere cozy or hiding out of site. Let&amp;rsquo;s have  a look around.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;something-to-listen&#34;&gt;Something To listen&lt;/h3&gt;
&lt;p&gt;You&amp;rsquo;re going to need something similar to an Apple Home Pod, or Amazon Echo to sit around listening for commands. You can&amp;rsquo;t reprogram those to go to bypass their respective clouds and talk to your Home Assistant server instead. So, you&amp;rsquo;re going to need something new.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/11/02/home_assistant_voice_preview.png&#34;
    alt=&#34;a picture of a white rectangular puck with a circular dial and ring of LEDs.&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;The Home Assistant Voice Preview&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The easiest option is the &lt;a href=&#34;https://www.home-assistant.io/voice-pe/&#34;&gt;Home Assistant Voice Preview&lt;/a&gt;. It costs about $60, and we&amp;rsquo;ve been pretty happy with ours. You&amp;rsquo;re not going to want to play music on it - although you can - but as a voice assistant device it completely out-classes the $700 Apple Home Pod, and it&amp;rsquo;s all because of that silly little ring of LEDs.&lt;/p&gt;
&lt;p&gt;The first reason is that it makes it obvious that it&amp;rsquo;s actually working. When you invoke it the lights rotate clockwise. When it&amp;rsquo;s thinking it flashes. When it&amp;rsquo;s responding the lights rotate counterclockwise. You never have to wonder if your words have gone into a void and will never be responded to.&lt;/p&gt;
&lt;p&gt;The second reason is that when you set a timer the ring lights up, and then gradually turns off sections. With just a glance you can easily know that there&amp;rsquo;s about ¼ of your timer left to go.&lt;/p&gt;
&lt;p&gt;For the DIY geeks out there, it has a Grove port on the bottom so you can easily connect your home-made sensors.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/11/02/atom_echo.jpg&#34;
    alt=&#34;a photo showing the top and bottom of a small white cube with speaker holes, a button, and some ports and holes for header pins on the bottom.&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;The Atom Echo&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Another option is the $13 &lt;a href=&#34;https://shop.m5stack.com/products/atom-echo-smart-speaker-dev-kit&#34;&gt;Atom Echo&lt;/a&gt;. The speaker on this is tiny and sounds awful, and isn&amp;rsquo;t very loud, but the reviews are good, and if you just want a cheap device that&amp;rsquo;ll sit nearby, listen to you, and respond, this seems like a good choice. I&amp;rsquo;m thinking of getting one for my desk.&lt;/p&gt;
&lt;p&gt;Unlike a microphone plugged into your computer, or Raspberry Pi, both of these devices have chips specifically dedicated to noticing when the Wake Word (&amp;ldquo;Ok Nabu&amp;rdquo; by default) is spoken.&lt;/p&gt;
&lt;h4 id=&#34;note-about-the-home-assistant-voice-preview&#34;&gt;Note about the Home Assistant Voice Preview&lt;/h4&gt;
&lt;p&gt;At the time of writing (November 2025) the setup has one really rocky step. You connect your phone to it as part of its setup, but then it gives you a poorly named text field where you need to enter the IP address of the device that it&amp;rsquo;s talking to. This means you&amp;rsquo;ll have to log into your router first to see what IP address gets assigned to the puck.&lt;/p&gt;
&lt;h3 id=&#34;talking-to-your-phone&#34;&gt;Talking To Your Phone&lt;/h3&gt;
&lt;p&gt;I can only speak to the situation on iOS, but I believe the same ideas apply to Android too.&lt;/p&gt;
&lt;p&gt;Apple &lt;em&gt;wants&lt;/em&gt; you to be locked into their ecosystem. As a result, there&amp;rsquo;s no way to replace Siri with any other voice assistant. There&amp;rsquo;s no way to have your phone always listening and have &amp;ldquo;Ok Nabu&amp;rdquo; work. Worse, when you tell iOS to &lt;em&gt;stop&lt;/em&gt; listening all the time, multiple things stop working, or start being really buggy.&lt;/p&gt;
&lt;p&gt;When I&amp;rsquo;m in the car it will no longer read text messages to me. It shows that they came in on the screen, but won&amp;rsquo;t automatically speak them. I assume this applies to headphones when I&amp;rsquo;m walking around too, but I haven&amp;rsquo;t tried that. More frustrating is that pushing the button to invoke Siri only seems to work about ¼ of the time. It&amp;rsquo;s not uncommon for me to have to press it 5 times before the little Siri listening animation appears, unless it&amp;rsquo;s connected to the car, in which case it always works.&lt;/p&gt;
&lt;p&gt;Fortunately the Home Assistant phone app has enabled all the integrations, so there are lots of ways to create Shortcuts that can live on your main screens, or buttons that&amp;rsquo;ll live on the control panel.&lt;/p&gt;
&lt;h3 id=&#34;wake-words&#34;&gt;Wake Words&lt;/h3&gt;
&lt;p&gt;There are multiple built-in options if you don&amp;rsquo;t like invoking the listening pucks with &amp;ldquo;Ok Nabu&amp;rdquo;, and if you&amp;rsquo;re geeky and willing to spend about ten minutes training a new one and loading it onto your device you can make &lt;em&gt;anything&lt;/em&gt; into a custom wake words.&lt;/p&gt;
&lt;h2 id=&#34;radios&#34;&gt;Radios&lt;/h2&gt;
&lt;p&gt;Most smart home devices aren&amp;rsquo;t plugged into ethernet, and don&amp;rsquo;t use WiFi, but you still need to be able to control them remotely. So, you need a radio transmitter that can speak the appropriate language on the appropriate frequencies to integrate with your devices.&lt;/p&gt;
&lt;p&gt;The short short version is that you&amp;rsquo;ll need an antenna for whatever radio + digital protocol(s) your devices need, and you can&amp;rsquo;t reuse the same antenna for different protocols.&lt;/p&gt;
&lt;h3 id=&#34;protocols&#34;&gt;Protocols&lt;/h3&gt;
&lt;p&gt;Digital communication protocols are like languages. Radio protocols are more about radio frequencies and hardware.&lt;/p&gt;
&lt;p&gt;If you prefer video over text, check out this video: &lt;a href=&#34;https://youtu.be/RX7nGsvw1M0&#34;&gt;Matter vs ZigBee vs WiFi vs Bluetooth vs Thread vs ZWave - Which is the BEST Smart Home Network?&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&#34;wifi&#34;&gt;WiFi&lt;/h4&gt;
&lt;p&gt;The same thing your laptop uses to talk to the internet. Wifi devices will probably talk to your existing network. The problem with WiFi is that it&amp;rsquo;s &lt;em&gt;really&lt;/em&gt; power hungry and will drain batteries way faster than any of the alternatives. Don&amp;rsquo;t use WiFi devices unless they&amp;rsquo;re always plugged in.&lt;/p&gt;
&lt;h4 id=&#34;zigbee-and-zigbee2mqtt&#34;&gt;Zigbee &amp;amp; Zigbee2MQTT&lt;/h4&gt;
&lt;p&gt;Zigbee - sometimes noted as ZHA - is a digital communication protocol, &lt;em&gt;and&lt;/em&gt; a radio communication protocol. &lt;a href=&#34;https://www.zigbee2mqtt.io/&#34;&gt;Zigbee2MQTT&lt;/a&gt; - usually just noted as Z2MQTT.&lt;/p&gt;
&lt;p&gt;To understand the high-level difference between the two I recommend watching &lt;a href=&#34;https://youtu.be/4GG4cAMdtQI&#34;&gt;Zigbee2MQTT vs ZHA (Zigbee Home Automation) - Which should you use for your Smart Home?&lt;/a&gt; The basic summary is that Z2MQTT is slightly more powerful, but not in a way that most people will care about, and beginners should really just use ZHA.&lt;/p&gt;
&lt;p&gt;What&amp;rsquo;s cool about Zigbee is that it&amp;rsquo;s low power, and creates a mesh network. All the devices that are constantly plugged in like light bulbs and power outlets act as relays to devices that need to be extremely conservative about their power usage, like battery powered air quality monitors.&lt;/p&gt;
&lt;p&gt;Also, there&amp;rsquo;s a wonderful &lt;a href=&#34;https://zigbee.blakadder.com/&#34;&gt;directory of Zigbee Compatible Devices&lt;/a&gt; that&amp;rsquo;ll help you find things you &lt;em&gt;know&lt;/em&gt; will work.&lt;/p&gt;
&lt;p&gt;The most important thing to know is that Zigbee (ZHA) is what &lt;em&gt;most&lt;/em&gt; Hue light bulbs use. So, if you&amp;rsquo;ve already got a bunch of Hue bulbs, this is what you want.&lt;/p&gt;
&lt;p&gt;Note that sometimes adding a ZHA device can take longer than you would expect. They&amp;rsquo;ve &lt;em&gt;very&lt;/em&gt; responsive once added, but finding them on the network the first time can take up to a minute.&lt;/p&gt;
&lt;h4 id=&#34;matter&#34;&gt;Matter&lt;/h4&gt;
&lt;p&gt;Matter has been getting hyped by Apple and Google, but it&amp;rsquo;s &lt;em&gt;only&lt;/em&gt; a digital communication protocol. It can - theoretically - be run over any radio protocol. But in practice it can work over the Thread radio protocol or Wi-Fi.&lt;/p&gt;
&lt;p&gt;If you choose to try and integrate with Matter devices you&amp;rsquo;ll need to make sure those devices have Thread radios in them, and that you have an antenna that can speak Thread.&lt;/p&gt;
&lt;h4 id=&#34;z-wave&#34;&gt;Z-Wave&lt;/h4&gt;
&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Z-Wave&#34;&gt;Z-Wave&lt;/a&gt; is another radio + communication protocol that works over a mesh network. It&amp;rsquo;s not as energy efficient as Zigbee, but it&amp;rsquo;s a decent option.&lt;/p&gt;
&lt;h4 id=&#34;bluetooth&#34;&gt;Bluetooth&lt;/h4&gt;
&lt;p&gt;Bluetooth is terrible for smart home devices. It works, but unless you live in a shoebox, you&amp;rsquo;re going to have issues with range. Bluetooth devices also have a tendency to only work with an app made by the manufacturer. As soon as they stop maintaining that app, or the servers it uses, your device becomes useless.&lt;/p&gt;
&lt;p&gt;For example, we have Aranet CO2 sensors. They use Bluetooth. Home Assistant has an integration for them that works great, but unless it&amp;rsquo;s a few feet away from the Pi our Home Assistant is running on, they may as well not exist. Even our phones can&amp;rsquo;t see all of them at once.&lt;/p&gt;
&lt;h3 id=&#34;hardware&#34;&gt;Hardware&lt;/h3&gt;
&lt;p&gt;If you have Zigbee - ZHA or Z2MQTT - devices I recommend the SONOFF Zigbee 3.0 USB Dongle Plus Gateway (~$40). You&amp;rsquo;ll also want to get a USB extension cable so that you can physically separate it from what it&amp;rsquo;s plugged into, and other devices in order to minimize radio interference. My understanding is that it can &lt;em&gt;only&lt;/em&gt; do ZHA &lt;em&gt;or&lt;/em&gt; Z2MQTTT, but not both.&lt;/p&gt;
&lt;p&gt;If you have Z-Wave or Thread devices I recommend the &lt;a href=&#34;https://www.home-assistant.io/connect/zwa-2/&#34;&gt;Home Assistant Connect ZWA-2&lt;/a&gt; antenna (~$70). Note, it can be configured to speak Z-Wave &lt;em&gt;or&lt;/em&gt; Thread, but not both. If you have both types of devices you can use two antennas.&lt;/p&gt;
&lt;p&gt;Once you plug these in to your Home Assistant computer they&amp;rsquo;ll show up in the Devices and Integrations screen automatically. They&amp;rsquo;re both trivial to add in, and add devices to.&lt;/p&gt;
&lt;p&gt;We have a Zigbee ZHA antenna because we already had a bunch of Hue lights, and a Z-Wave antenna to talk to our new thermostats.&lt;/p&gt;
&lt;h2 id=&#34;lights&#34;&gt;Lights&lt;/h2&gt;
&lt;p&gt;Most of you will have smart lights. You&amp;rsquo;ll likely have Hue lights too. This makes the decision of what radio &amp;amp; communication protocol to use pretty easy. You want Zigbee ZHA.&lt;/p&gt;
&lt;p&gt;The vast majority of Hue bulbs speak ZHA already. All you have to do is delete them from your Hue app, and they&amp;rsquo;ll automatically go into pairing mode. Then add them to the Zigbee integration in Home Assistant. The only Hue lights we had that weren&amp;rsquo;t findable by new Home Assistant setup were some white-only ones. Check &lt;a href=&#34;https://zigbee.blakadder.com/&#34;&gt;the database&lt;/a&gt; if you&amp;rsquo;re wondering if yours are supported.&lt;/p&gt;
&lt;p&gt;Once you&amp;rsquo;ve separated yourself from the Phillips Hue cloud - or any equivalent system - things suddenly get &lt;em&gt;much&lt;/em&gt; cheaper. For example, I just bought &lt;a href=&#34;https://amzn.to/47FUbzD&#34;&gt;4 full color light bulbs from Third Reality&lt;/a&gt; for $30. &lt;a href=&#34;https://amzn.to/4nFZ7ul&#34;&gt;A three-pack from Hue&lt;/a&gt; costs $100.&lt;/p&gt;
&lt;h2 id=&#34;smart-switches&#34;&gt;Smart Switches&lt;/h2&gt;
&lt;p&gt;You can make a room&amp;rsquo;s &amp;ldquo;dumb&amp;rdquo; lights &amp;ldquo;smart&amp;rdquo; by replacing the wall switch with a &amp;ldquo;Smart&amp;rdquo; switch. This is significantly better than something like a Hue switch, because it&amp;rsquo;s not reliant on the software. It works as a regular switch even if your Home Assistant server is down.&lt;/p&gt;
&lt;p&gt;I love this, but there&amp;rsquo;s another way to achieve the same result. Instead of replacing the switch you can easily wire in a small smart control unit in the wall behind it.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/11/02/sonoff_switch_boxes.jpg&#34;
    alt=&#34;a photo of four small white plastic boxes with a white button, and an orange band across the bottom. There are four holes in the orange band where you wire it in between your switch and the wires coming from the wall.&#34;&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;smart-home-device-shopping-gotchas&#34;&gt;Smart Home Device Shopping Gotchas&lt;/h2&gt;
&lt;p&gt;Now that you&amp;rsquo;re freed from needing to use a particular manufacturer&amp;rsquo;s device, you&amp;rsquo;ll have a lot more options. However, you need to be careful about the protocol. In my experience most of the manufacturers spam keywords on Amazon. For example, search for &amp;ldquo;Zigbee lights&amp;rdquo; and you&amp;rsquo;ll get a bunch of lights that don&amp;rsquo;t speak Zigbee, but instead work with Apple HomeKit, Google Home, Matter, or whatever.&lt;/p&gt;
&lt;p&gt;Be sure that whatever you&amp;rsquo;re about to buy specifically states that it&amp;rsquo;ll work with whatever radio setup you have, and remember that Zigbee ZHA and Zigbee2MQTT are different things. Look for &amp;ldquo;Home Assistant&amp;rdquo; in the reviews too. It&amp;rsquo;s always a good sign when you find it.&lt;/p&gt;
&lt;p&gt;The other thing to watch out for is no-name fly-by-night Chinese resellers. When buying Zigbee compatible products for example, you&amp;rsquo;ll spend a little more for a brand name like Sonoff or Innr, but these are companies that are trying to build a name for themselves and make quality products. Read people&amp;rsquo;s reviews.&lt;/p&gt;
&lt;h2 id=&#34;automating-things&#34;&gt;Automating Things&lt;/h2&gt;
&lt;p&gt;Home assistant has a concept of &amp;ldquo;Automations&amp;rdquo; and &amp;ldquo;Scripts&amp;rdquo;. The distinction wasn&amp;rsquo;t obvious to me at first, but it&amp;rsquo;s ultimately quite simple. An &amp;ldquo;Automation&amp;rdquo; is a collection of instructions that&amp;rsquo;s triggered by some event (time, sensor reading, whatever). A &amp;ldquo;Script&amp;rdquo; is a collection of instructions that&amp;rsquo;s triggered by &lt;em&gt;you&lt;/em&gt; (pushing a button on your phone, voice control, whatever).&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s our &amp;ldquo;Evening Vibes&amp;rdquo; Automation. Sunset triggers the closing of the shades in our bedroom and living room, and turns on the living room lights. Note that window shades / blinds are referred to as &amp;ldquo;Covers&amp;rdquo; in Home Assistant.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/11/02/automation_example.png&#34;
    alt=&#34;a screenshot of an automation showing a simple UI that does what was just described.&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Automation Example&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Here&amp;rsquo;s our &amp;ldquo;Ready For Bed&amp;rdquo; Script. When we say, &amp;ldquo;Ok Nabu. Ready for bed.&amp;rdquo; it&amp;rsquo;ll turn on the lights in our offices, and the bedroom. Both of us have reason to make a stop in our offices before going to bed, and it also helps us to see the way to the stairs.&lt;/p&gt;
&lt;p&gt;Note that we haven&amp;rsquo;t specified which lights. We&amp;rsquo;ve just instructed it to turn on the lights in an Area. If we add or remove lights from that area the script will do the right thing.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/11/02/script_example.png&#34;
    alt=&#34;a screenshot of the Script showing what was described.&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Script Example&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;There are also Blueprints and Scenes. According to Home Assistant, &amp;ldquo;Blueprints are reusable automations and scripts that can be easily shared.&amp;rdquo; while &amp;ldquo;Scenes capture entities&amp;rsquo; states, so you can re-experience the same scene later on. For example, a &amp;lsquo;Watching TV&amp;rsquo; scene that dims the living room lights, sets a warm white color and turns on the TV.&amp;rdquo;&lt;/p&gt;
&lt;h2 id=&#34;cost&#34;&gt;Cost&lt;/h2&gt;
&lt;p&gt;Note: We already had a Raspberry Pi with Home Assistant on it. A new top-of-the-line Pi 5 would be $130, + $15 for MicroSD cards, + another $30 or so for a case and plug.&lt;/p&gt;
&lt;h3 id=&#34;replaced-things&#34;&gt;Replaced Things&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Zigbee antenna to replace need for Hue hub &amp;amp; our connection to Phillips servers.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://amzn.to/3JDUvqF&#34;&gt;$40 Sonoff Zigbee 3.0 Antenna Dongle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://amzn.to/3LdhJV9&#34;&gt;$12 Fancy USB-A Extension cables.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;4 Hue lights weren&amp;rsquo;t Zigbee compatible.
&lt;a href=&#34;https://amzn.to/47HC5xi&#34;&gt;$30 for a four pack&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wall plugs
We had Meross plugs but one of them started acting up, and the Meross integration isn&amp;rsquo;t officially supported, and, and, and… it was just easier to replace them.
&lt;a href=&#34;https://amzn.to/4qL41sU&#34;&gt;$35 2 pack from Innr&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open AI
less than 1¢ USD per day.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nabu Casa Subscription
$6.50 per month, or $65 per year. There&amp;rsquo;s a free trial to make sure it does what you want.&lt;/p&gt;
&lt;p&gt;This isn&amp;rsquo;t technically required, but it was a good solution for giving us remote access, and offsite backups. Also, it supports the ongoing development of Home Assistant.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Listening Devices
We had one Home Pod that we replaced with Home Assistant Voice Preview Edition for $60. However, because our phones can no longer act as always on listening devices, we added two additional &amp;ldquo;pucks&amp;rdquo;. One in the living room, and one in the bedroom, for a total of $180.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yale WiFi adapter
When we bought our Yale lock it had a Apple Home Kit module in it. That &lt;em&gt;only&lt;/em&gt; talks to Home Kit, but we were able to swap in a &lt;a href=&#34;https://amzn.to/4hIg5H1&#34;&gt;$62 WiFi module&lt;/a&gt;. This isn&amp;rsquo;t great, because Yale is a complete shit-show when it comes to their management of smart devices, we&amp;rsquo;re still tied to their cloud, and the company has been sold twice since we bought the lock.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Grand Total for replacement hardware: $359 + subscriptions to Open AI and Nabu Casa.&lt;/p&gt;
&lt;h3 id=&#34;new-things&#34;&gt;New Things&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Z-Wave Antenna
$70 &lt;a href=&#34;https://www.home-assistant.io/connect/zwa-2/&#34;&gt;Home Assistant Connect ZWA-2&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Z-Wave Thermostats
&lt;a href=&#34;https://amzn.to/3LooG5C&#34;&gt;4 Honeywell T6 Pro Z-Wave Thermostats&lt;/a&gt; @ ~$170 each.
⚠ This is a discontinued product. I didn&amp;rsquo;t really care because it had good reviews, thermostats get discontinued all the time, and we have no need of their support and / or servers because it&amp;rsquo;s entirely locally controlled.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;4 new lights for the fan in my office
&lt;a href=&#34;https://amzn.to/47n4HNt&#34;&gt;$41 four pack of Zigbee lights&lt;/a&gt; from a brand I&amp;rsquo;d never heard of.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DIY CO₂ sensors
Combining an ESP32-C6 board ($6) from Seeed Studio that can speak Zigbee ZHA with an SCD-41 CO₂ sensor from Adafruit ($50) plus some wires to connect them ($15 for a spool set that&amp;rsquo;ll probably take years to use up), and a 3D printed enclosure.&lt;/p&gt;
&lt;p&gt;~$57 per sensor&lt;/p&gt;
&lt;p&gt;Just requires soldering 4 wires, flashing the ESP32-C6 board - just plug it in and visit a web page - and sticking it in an enclosure.&lt;/p&gt;
&lt;p&gt;Pre-built alternatives range from $200-$300 each.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note: we didn&amp;rsquo;t actually need the Z-Wave antenna. There are Zigbee thermostats, but life conspired such that we ended up with the antenna and decided to use it instead of returning it.&lt;/p&gt;
&lt;p&gt;Total cost of new additions: $962, but $680 of that was the thermostats.&lt;/p&gt;
&lt;p&gt;What that bought us: control over our thermostats + the ability to automate them &amp;amp; see what the temperature is in the various heating zones of our house, better lighting in one room, and addressing one of the prerequisites to getting an Air Exchanger so that we stop having to open windows in the middle of the winter.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;As a developer I understand that companies store recordings of accidental and intentional activations for training purposes. Apple claimed everything was anonymous, but leaks revealed that wasn&amp;rsquo;t true. Since then Apple has been going out of its way to help the US government&amp;rsquo;s authoritarian plans. There is no reason to believe they won&amp;rsquo;t give them access to recordings of anyone the government is interested in.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Vulvic Thoughts</title>
      <link>https://weblog.masukomi.org/2025/10/22/vulvic-thoughts/</link>
      <pubDate>Wed, 22 Oct 2025 00:00:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2025/10/22/vulvic-thoughts/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#thoughts-and-observations-i-ve-had-since-acquiring-a-vagina&#34;&gt;Thoughts, and observations I&amp;rsquo;ve had since acquiring a vagina&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#hygene&#34;&gt;Hygene&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#peeing&#34;&gt;Peeing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#toilet-paper&#34;&gt;Toilet paper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#scent&#34;&gt;Scent&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#sex&#34;&gt;Sex&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#cravings&#34;&gt;Cravings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#motions&#34;&gt;Motions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#orgasms&#34;&gt;Orgasms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#oral-sex&#34;&gt;Oral Sex&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#intercourse&#34;&gt;Intercourse&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#misc&#34;&gt;Misc&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#shaving&#34;&gt;Shaving&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#nerve-mapping&#34;&gt;Nerve Mapping&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#visuals&#34;&gt;Visuals&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;thoughts-and-observations-i-ve-had-since-acquiring-a-vagina&#34;&gt;Thoughts, and observations I&amp;rsquo;ve had since acquiring a vagina&lt;/h2&gt;
&lt;p&gt;⚠ This post contains unfiltered descriptions of many things related to a vulva. These are things you &lt;em&gt;do not&lt;/em&gt; discuss in &amp;ldquo;polite&amp;rdquo; society. If you don&amp;rsquo;t want to hear details - pleasant and not - about having a pussy then you should not keep reading. Please note. Some of this knowledge is cursed.&lt;/p&gt;
&lt;p&gt;Most of this stuff will be well known to vagina-havers, but maybe interesting to hear the discovery of. Some of this stuff is very specific to the experience of getting a custom vagina install.&lt;/p&gt;
&lt;h3 id=&#34;hygene&#34;&gt;Hygene&lt;/h3&gt;
&lt;h4 id=&#34;peeing&#34;&gt;Peeing&lt;/h4&gt;
&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Urethral Opening&lt;/p&gt;
&lt;p&gt;As anyone with even a passing familiarity with female genitals knows, the urethra is not on the outside.&lt;/p&gt;
&lt;p&gt;I never really thought about the implications of that until I had to deal with it. It&amp;rsquo;s so clean for penis-havers. The opening&amp;rsquo;s right out there with nothing in the way. You pee. You maybe have a single drop you shake off. The end.&lt;/p&gt;
&lt;p&gt;I suspect how this plays out is different for every vagina-haver based on body fat, and the shape and thickness of your labia minora, and majora. I dunno, I haven&amp;rsquo;t really watched videos on the subject.&lt;/p&gt;
&lt;p&gt;In my case, the labia minora spread apart when I sit on the toilet, and pee just kinda &amp;ldquo;&lt;a href=&#34;https://youtu.be/kiVVzxoPTtg&#34;&gt;finds a way&lt;/a&gt;&amp;rdquo; out. It&amp;rsquo;s like turning a ravine upside-down, and the water that was at the bottom either drops out directly, or runs down the sides.&lt;/p&gt;
&lt;p&gt;When tissue is engorged from arousal, or overheating, or whatever. Then the walls are pressing in, and it sounds like you&amp;rsquo;ve put your thumb over the end of a garden-hose.&lt;/p&gt;
&lt;p&gt;Also, without metaphorically - or literally - hosing it down, there&amp;rsquo;s no way to remove &lt;em&gt;all&lt;/em&gt; the pee. There&amp;rsquo;s gonna be a small amount left in there, clinging to the inner walls. So, that&amp;rsquo;s… a thing.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Water Flows Downhill&lt;/p&gt;
&lt;p&gt;You know what&amp;rsquo;s lower than your vulva when sitting on a toilet? Your butt cheeks. Some of the pee goes &amp;ldquo;out&amp;rdquo;, but sometimes some of it runs &amp;ldquo;down&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;No-one warned me about this!&lt;/p&gt;
&lt;p&gt;I was not prepared to wipe a stream that traveled a few inches down my butt cheek.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Temperature Matters&lt;/p&gt;
&lt;p&gt;Pee is &lt;em&gt;your&lt;/em&gt; body temperature when it leaves you, and there&amp;rsquo;s not a lot of wind in a toilet bowl. Sometimes this means it gently runs across a small bit of flesh and I don&amp;rsquo;t feel it until it reaches a hair.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;toilet-paper&#34;&gt;Toilet paper&lt;/h4&gt;
&lt;p&gt;Toilet paper obviously something created, and promoted, by a men. It&amp;rsquo;s fine for the butt, but it&amp;rsquo;s a fucking terrible solution to the problem of cleaning or drying labia after peeing.&lt;/p&gt;
&lt;p&gt;The stuff disintegrates and sticks to whatever it&amp;rsquo;s touching if it even &lt;em&gt;sees&lt;/em&gt; moisture. Using it to dry a bunch of wet fleshy folds behind a bunch of hairs is a terrible idea. Any penis-havers reading this should try pouring water onto a sidewalk and then trying to dry it with toilet paper. It&amp;rsquo;s &lt;em&gt;at least&lt;/em&gt; that bad.&lt;/p&gt;
&lt;p&gt;I always wondered why my wife used such big wodges of it to dry herself. Now I know. It&amp;rsquo;s the only way to not get pee all over your fingers.&lt;/p&gt;
&lt;p&gt;Also, I &lt;em&gt;keep&lt;/em&gt; finding teeny pieces of it stuck to my labia. Not like every time, but still… If I was sexually active I&amp;rsquo;d be terrified of letting anyone play around down there without taking a shower first. I keep my &lt;a href=&#34;https://amzn.to/4ngJrNS&#34;&gt;upside-down peri-bottle&lt;/a&gt; around because we don&amp;rsquo;t have a bidet, and sometimes I feel like &amp;ldquo;fuck it. Get out the hose&amp;rdquo;&lt;/p&gt;
&lt;h4 id=&#34;scent&#34;&gt;Scent&lt;/h4&gt;
&lt;p&gt;I mean this in a good way. My pussy smells like pussy. At least, like I remember cis. pussy smelling. It&amp;rsquo;s been a while.&lt;/p&gt;
&lt;p&gt;But, it&amp;rsquo;s also a warm, dark, moist place which is party-central for bacteria that make scents. Maybe I&amp;rsquo;m being overly-sensitive. But I feel like a daily shower is a requirement now, not just a social norm.&lt;/p&gt;
&lt;h3 id=&#34;sex&#34;&gt;Sex&lt;/h3&gt;
&lt;h4 id=&#34;cravings&#34;&gt;Cravings&lt;/h4&gt;
&lt;p&gt;For context: I don&amp;rsquo;t really care what anyone has between their legs, but I&amp;rsquo;m attracted to girl-shaped-people: femme, butch, cis, trans, whatever. &amp;ldquo;Guy&amp;rdquo; things are turn-offs: facial hair, big muscles, deep voices, toxic-masculinity, patriarchy, etc.&lt;/p&gt;
&lt;p&gt;With the exception of one guy - nearly 30 years ago - I&amp;rsquo;ve never craved cock… &lt;em&gt;until&lt;/em&gt; acquiring a pussy. A few after surgery - when my hormones were going crazy - I wanted nothing more than to be &lt;em&gt;fucking railed&lt;/em&gt; by a big hard cock &lt;em&gt;in my pussy&lt;/em&gt;. Now, my hormones are back to very cis-female levels, but I keep getting an occasional craving to be fucked with a cock. Not a cock-shaped-dildo, a cock.&lt;/p&gt;
&lt;p&gt;To be clear, the idea of being fucked by a &lt;em&gt;guy&lt;/em&gt; is a massive turn-off. Additionally I could barely fit a thimble in my pussy, never-mind a cock, so this isn&amp;rsquo;t even &lt;em&gt;possible&lt;/em&gt;. And yet…&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s just very confusing, and I don&amp;rsquo;t know where it&amp;rsquo;s coming from. On top of that is the thought that even if I &lt;em&gt;did&lt;/em&gt; have a trans girlfriend with a penis that she actually wanted to use I wouldn&amp;rsquo;t be able to satisfy the craving anyway, so what the hell am I supposed to do with any of this?!&lt;/p&gt;
&lt;p&gt;No, don&amp;rsquo;t say anal. My butt&amp;rsquo;s afraid of anything that big. Plus it&amp;rsquo;s not what I keep craving.&lt;/p&gt;
&lt;h4 id=&#34;motions&#34;&gt;Motions&lt;/h4&gt;
&lt;p&gt;I&amp;rsquo;m not sure what I expected. So much importance is placed on the clit. Especially regarding a guy&amp;rsquo;s ability to find it, and make it feel good.&lt;/p&gt;
&lt;p&gt;What I &lt;em&gt;wasn&amp;rsquo;t&lt;/em&gt; expecting was that some of the things that I saw in porn, but didn&amp;rsquo;t make any sense were real, and not just for show. Like, slapping your mons just above the clit, or taking all your fingers and rubbing the flesh covering the clit without directly touching it.&lt;/p&gt;
&lt;p&gt;I wasn&amp;rsquo;t expecting my clit to be so damn sensitive that I rarely touch it directly. I was expecting that to be the focus of fun-time. Maybe that&amp;rsquo;s just a &lt;em&gt;me&lt;/em&gt; thing though. Don&amp;rsquo;t get me wrong, things feel great, but not directly.&lt;/p&gt;
&lt;h4 id=&#34;orgasms&#34;&gt;Orgasms&lt;/h4&gt;
&lt;p&gt;I described the sensation &lt;a href=&#34;https://weblog.masukomi.org/2025/08/11/bottom-surgery-with-dr.-purohit/#masturbation-and-orgasm&#34;&gt;in my surgical post&lt;/a&gt;, but despite the sensation having changed quite a lot before surgery, I wasn&amp;rsquo;t prepared for how radically different things would feel after.&lt;/p&gt;
&lt;p&gt;Personally, I think it&amp;rsquo;s &lt;em&gt;so&lt;/em&gt; much better, but I imagine most guys wouldn&amp;rsquo;t agree. It feels &lt;em&gt;so…&lt;/em&gt; Feminine? Soft? Glowey? Liquid? Not at all like the thrusting targeted burst of before.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t really have any expectations with regards to multiple orgasms, beyond it being a possibility, but the whole &amp;ldquo;you can just keep going, and it just keeps feeling good until you come again&amp;rdquo; is… interesting.&lt;/p&gt;
&lt;h4 id=&#34;oral-sex&#34;&gt;Oral Sex&lt;/h4&gt;
&lt;p&gt;I&amp;rsquo;ll tell you when / if I find out, but I can&amp;rsquo;t wait to find out.&lt;/p&gt;
&lt;h4 id=&#34;intercourse&#34;&gt;Intercourse&lt;/h4&gt;
&lt;p&gt;Don&amp;rsquo;t know. Won&amp;rsquo;t know. Despite the cravings, there&amp;rsquo;s nowhere to stick a penis-shaped thing.&lt;/p&gt;
&lt;p&gt;I still think minimal depth - that ended up as zero - was the right decision for me. Feel free to hit me up &lt;a href=&#34;https://connectified.com/@masukomi&#34;&gt;on Mastodon / The Fediverse&lt;/a&gt; if you are contemplating going for minimal depth and have questions around that decision.&lt;/p&gt;
&lt;h3 id=&#34;misc&#34;&gt;Misc&lt;/h3&gt;
&lt;h4 id=&#34;shaving&#34;&gt;Shaving&lt;/h4&gt;
&lt;p&gt;Why is it so difficult?! Maybe I just need to practice more.&lt;/p&gt;
&lt;p&gt;Shaving a scrotum is hard, but it makes sense why.&lt;/p&gt;
&lt;h4 id=&#34;nerve-mapping&#34;&gt;Nerve Mapping&lt;/h4&gt;
&lt;p&gt;Tissue got moved around, and repurposed. This has a couple weird side effects.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t &lt;em&gt;actually&lt;/em&gt; know where the pee comes out. I&amp;rsquo;ve tried looking when I&amp;rsquo;m peeing but it&amp;rsquo;s around a curve, so I can&amp;rsquo;t see it directly. What I know is that the skin it&amp;rsquo;s exiting past &lt;em&gt;was&lt;/em&gt; roughly 1cm up from the base of my penis, just below the left-most point. That&amp;rsquo;s a &lt;em&gt;weird&lt;/em&gt; place to feel pee exiting.&lt;/p&gt;
&lt;p&gt;What&amp;rsquo;s worse, is that I can&amp;rsquo;t find this place with my finger. Touching with my finger feels completely different, so I can&amp;rsquo;t do anything to tell my brain where it really is, and remap it. I &lt;em&gt;could&lt;/em&gt; try touching &lt;em&gt;while&lt;/em&gt; I&amp;rsquo;m peeing but that sounds like a very messy proposition.&lt;/p&gt;
&lt;p&gt;Normally you&amp;rsquo;d remap nerves by showing your brain - usually visually - where the sensation is coming from, and doing this repeatedly until the brain &amp;ldquo;gets it&amp;rdquo;. There are multiple places where I&amp;rsquo;ve done this either through sight or touch, and it&amp;rsquo;s actually hard to think of where feelings in those places &lt;em&gt;used&lt;/em&gt; to come from.&lt;/p&gt;
&lt;p&gt;Then there&amp;rsquo;s the itching. Every now and then I get a little itch, and I have &lt;em&gt;absolutely no idea&lt;/em&gt; where to scratch. Worse, running my fingers around in an attempt to chase the sensation down doesn&amp;rsquo;t really work. I don&amp;rsquo;t even know if it&amp;rsquo;s a real itch or just a phantom itch.&lt;/p&gt;
&lt;h4 id=&#34;visuals&#34;&gt;Visuals&lt;/h4&gt;
&lt;p&gt;The outsides look great, but after five-and-a-half months I still haven&amp;rsquo;t caught sight of my urethra or my clit. It&amp;rsquo;s really hard to hold my phone and photograph with one hand while sufficiently spreading things with the other, and - to my eyes - things look a bit weird in that area with everything pulled back. I honestly don&amp;rsquo;t know because I&amp;rsquo;ve never seen a cis woman spread things apart in this manner (nothing like you see in porn).&lt;/p&gt;
&lt;p&gt;Things feel great, and work great, so I&amp;rsquo;m not complaining - plus someone staring at the insides like that would be weird - but I really do wonder WTF my clit looks like, and why I haven&amp;rsquo;t found my urethra yet. The latter &lt;em&gt;should&lt;/em&gt; be easy but…&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The Sex You Enjoy Is Irrelevant To Your Queerness</title>
      <link>https://weblog.masukomi.org/2025/08/26/the-sex-you-enjoy-is-irrelevant-to-your-queerness/</link>
      <pubDate>Tue, 26 Aug 2025 00:00:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2025/08/26/the-sex-you-enjoy-is-irrelevant-to-your-queerness/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#preface&#34;&gt;Preface&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#some-simple-facts&#34;&gt;Some Simple Facts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#putting-it-all-together&#34;&gt;Putting it all together&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#conclusion&#34;&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#what-about-the-edge-cases&#34;&gt;What about the edge cases?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#conversion-therapy-bullshit&#34;&gt;Conversion Therapy Bullshit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;preface&#34;&gt;Preface&lt;/h2&gt;
&lt;p&gt;Lesbians on the internet are mad at me for suggesting that being a lesbian is about who you&amp;rsquo;re attracted to / capable of loving and not about what sex acts you can enjoy the physical sensations of.&lt;/p&gt;
&lt;p&gt;Apparently conversion therapy people claim that if a lesbian can find sex with a guy pleasurable they&amp;rsquo;re actually straight and/or like guys.&lt;/p&gt;
&lt;p&gt;The conversion therapists are fucking stupid, and ignorant.&lt;/p&gt;
&lt;p&gt;This post is all about showing that the things that pleasure you in the bedroom have no bearing on your queerness. You&amp;rsquo;re whatever flavor of queer you say you are, and the things that make your body &lt;em&gt;feel&lt;/em&gt; good are only coincidentally relevant to the gender(s) that you&amp;rsquo;re attracted to and capable of loving.&lt;/p&gt;
&lt;p&gt;Note: While this post is centered around lesbians, the general concept &amp;amp; conclusions are relevant to all queer folk.&lt;/p&gt;
&lt;h2 id=&#34;some-simple-facts&#34;&gt;Some Simple Facts&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;re a queer ally you&amp;rsquo;ll agree these are all true. If you&amp;rsquo;re a homophobic or transphobic bigot, you won&amp;rsquo;t. This post is for the former group. Bigots can fuck right-the-hell off.&lt;/p&gt;
&lt;p&gt;Furthermore for all the flavors of lesbian presented below, I&amp;rsquo;m assuming there are other lesbians who find them attractive and can fall in love with them.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Many women have spent years having sex with guys and sometimes finding that sex enjoyable prior to coming out as lesbians. We still accept their claims of being a lesbian as valid. Thus having enjoyable sex with a guy doesn&amp;rsquo;t invalidate being lesbian.&lt;/li&gt;
&lt;li&gt;Ace lesbians exist and are valid, thus you can be a lesbian without wanting to have sex with women.&lt;/li&gt;
&lt;li&gt;Trans-femme lesbians exist and are valid, thus enjoying sex that involves a penis doesn&amp;rsquo;t make you not a lesbian.&lt;/li&gt;
&lt;li&gt;Trans women are women, even when they boymode, and even when they haven&amp;rsquo;t started hormones. Thus looking physically male, and still being physically male doesn&amp;rsquo;t make someone any less of a lesbian.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; Yes, this makes a lot of people uncomfortable, but tough shit. Accepting trans people means accepting some - currently - uncomfortable ideas, and throwing out a lot of puritanical bullshit.&lt;/li&gt;
&lt;li&gt;You can fall in love with a woman, who comes out as a trans man, and it doesn&amp;rsquo;t suddenly make you straight, even if you still love them after surgery. Continuing to enjoy sex with them doesn&amp;rsquo;t make you straight either.&lt;/li&gt;
&lt;li&gt;Flat chested lesbians exist, thus it&amp;rsquo;s not about needing boobs for sex / attraction. Also, &lt;a href=&#34;https://en.wikipedia.org/wiki/Gynecomastia&#34;&gt;Gynocomastia&lt;/a&gt; (AMAB guys w/ natural boobs) exists and the presence of boobs isn&amp;rsquo;t an exclusive feature of women. Cis women come flat and chesty, and so do cis men.&lt;/li&gt;
&lt;li&gt;Trans-masc lesbians exist (yes really) and are valid, and thus it&amp;rsquo;s possible to be a lesbian and be attracted to butch-ass women with beards and muscles.&lt;/li&gt;
&lt;li&gt;Cis &lt;a href=&#34;https://en.wikipedia.org/wiki/Bearded_lady&#34;&gt;bearded women&lt;/a&gt; exist (various reasons, not just intersex) and thus - again - it&amp;rsquo;s possible to be attracted to lesbians with beards.&lt;/li&gt;
&lt;li&gt;Non-binary lesbians exist thus invalidate all arguments about boy/girl bodies.&lt;/li&gt;
&lt;li&gt;Intersex lesbians exist and they take the concepts of sex, gender, and queerness out back, and have their way with them until they&amp;rsquo;re begging for more, and can&amp;rsquo;t remember their names.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;putting-it-all-together&#34;&gt;Putting it all together&lt;/h2&gt;
&lt;p&gt;NONE of these facts have &lt;em&gt;any&lt;/em&gt; bearing on what a given person finds physically attractive. It doesn&amp;rsquo;t mean a femme-loving lesbian is any less of a lesbian if they&amp;rsquo;re not attracted to bearded muscle-mommies.&lt;/p&gt;
&lt;p&gt;NONE of this has &lt;em&gt;any&lt;/em&gt; bearing on who a person finds &lt;em&gt;emotionally&lt;/em&gt; attractive or lovable. You do you kid. Love who you&amp;rsquo;re gonna love.&lt;/p&gt;
&lt;p&gt;NONE of this means that lesbians aren&amp;rsquo;t only attracted to women.&lt;/p&gt;
&lt;p&gt;ALL of this together means that what a person finds &lt;em&gt;physically&lt;/em&gt; pleasurable has nothing to do with gender, and thus nothing to do with their queerness.&lt;/p&gt;
&lt;p&gt;If you say the physical stuff a person enjoys matters to someone being a lesbian or not you&amp;rsquo;re invalidating the existence of 1 or more groups of lesbians who are ace / trans-femme / trans-masc / non-binary / intersex / flat-chested. Probably a bunch of other groups I haven&amp;rsquo;t thought of yet too.&lt;/p&gt;
&lt;p&gt;If trans women are women, and butch women are women, and trans-masc men are men, and femmy men are men, and intersex people exist then you can&amp;rsquo;t argue that the physical aspects of the body that pleasures someone is relevant to that person&amp;rsquo;s sexuality.&lt;/p&gt;
&lt;p&gt;The only thing that&amp;rsquo;s left is &amp;ldquo;who are you attracted to and/or capable of loving?&amp;rdquo; if you&amp;rsquo;re a girl who&amp;rsquo;s attracted to girls, you&amp;rsquo;re a lesbian regardless of the physical attributes or acts you find pleasing.&lt;/p&gt;
&lt;p&gt;Lesbians, and straight men can enjoy getting pounded by cock, just like gay men, and straight women can enjoy pussy. It &lt;em&gt;sounds&lt;/em&gt; nonsensical, but it&amp;rsquo;s the only possible conclusion of accepting that intersex and transgender bodies are valid.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;If you want to be an ally of &lt;em&gt;all&lt;/em&gt; queer people, you HAVE to accept that the physical aspects of attraction and pleasure are separate from gender, and the flavor of queerness someone claims to be. You have to accept that the &lt;em&gt;only&lt;/em&gt; thing that matters is what gender(s) a person is capable of loving and / or being attracted to.&lt;/p&gt;
&lt;p&gt;That is to say, if you say you&amp;rsquo;re a woman who&amp;rsquo;s only attracted to / capable of loving women, you&amp;rsquo;re a lesbian, regardless of what your partner&amp;rsquo;s body looks like, or what makes you feel good in bed.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re a guy only attracted to / capable of loving guys you&amp;rsquo;re gay, regardless of what your partner&amp;rsquo;s body looks like, or what makes you feel good in bed.&lt;/p&gt;
&lt;p&gt;Pan people are pan, bi people are bi, and straight people are straight, regardless of what their partners&amp;rsquo; bodies look like, or what makes them feel good in bed. People are whatever they claim to be because everything else falls apart when faced with the reality that intersex and trans people exist, and are valid.&lt;/p&gt;
&lt;h2 id=&#34;what-about-the-edge-cases&#34;&gt;What about the edge cases?&lt;/h2&gt;
&lt;p&gt;What about aro-ace, intersex, and nonbinary folks? They are whatever the hell they tell you they are, regardless of what their bodies look like or what their partners&amp;rsquo; bodies look like.&lt;/p&gt;
&lt;p&gt;What about the people who love enbys and/or intersex folks? Again, they&amp;rsquo;re whatever the hell they tell you they are.&lt;/p&gt;
&lt;h2 id=&#34;conversion-therapy-bullshit&#34;&gt;Conversion Therapy Bullshit&lt;/h2&gt;
&lt;p&gt;I &lt;em&gt;hate&lt;/em&gt; that I have to add this, but it&amp;rsquo;s been made painfully clear that I do.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This is the opposite&lt;/em&gt; of what the conversion therapists are saying. They&amp;rsquo;re arguing that you are whatever makes you feel good in bed. I&amp;rsquo;m arguing that you are whatever you say you are &lt;em&gt;regardless&lt;/em&gt; of what makes you feel good in bed.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m arguing that liking &amp;ldquo;manly&amp;rdquo; women has nothing to do with liking men, because &amp;ldquo;manly&amp;rdquo; women, are no less women than femmy women. I&amp;rsquo;m saying that enjoying your trans girlfriends cock has nothing to do with liking men, because your trans girlfriend is a valid girl. I&amp;rsquo;m saying that liking femmy women makes you no &lt;em&gt;more&lt;/em&gt; of a lesbian than liking butch girls, because women are women.&lt;/p&gt;
&lt;p&gt;Cis human bodies are too fucking variable to be relevant to the question of sexuality. Trans human bodies throw everything on its head. The only relevant question about someone&amp;rsquo;s body is &amp;ldquo;do you find that one attractive?&amp;rdquo; The possession of penis / vagina / testes / ovaries / womb provably doesn&amp;rsquo;t make someone man or woman or male or female. Birth defects, surgeries, and intersex people are the most obvious reasons why. Things like being tall, muscled, bearded, short, effeminate, etc. all exist in male, female, and intersex people. So liking a body with specific features is irrelevant to your sexuality. It&amp;rsquo;s just what you like in a body.&lt;/p&gt;
&lt;p&gt;If you still think this is &amp;ldquo;conversion therapy bullshit&amp;rdquo;, I&amp;rsquo;d like to encourage you to read what I &lt;em&gt;actually&lt;/em&gt; said &lt;em&gt;without&lt;/em&gt; assuming I&amp;rsquo;m implying something I haven&amp;rsquo;t said. Read it with the knowledge that I&amp;rsquo;m autistic, and thus am absolutely shit at the game of saying one thing and meaning another.&lt;/p&gt;
&lt;p&gt;A conversion therapist who tries to use my arguments will fail, because they all boil down to &amp;ldquo;you&amp;rsquo;re queer if you say you are&amp;rdquo; or &amp;ldquo;you&amp;rsquo;re a lesbian if you&amp;rsquo;re a girl who only likes girls&amp;rdquo; &lt;em&gt;regardless of anything else&lt;/em&gt;.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;You can&amp;rsquo;t argue that a pre-op, pre-hormone trans woman (i.e. physically male in all respects) who likes women isn&amp;rsquo;t a lesbian AND support the belief that trans women are women. They&amp;rsquo;re simply incompatible claims. Boymoding doesn&amp;rsquo;t make trans women male, any more than it makes cis women, or intersex women male. To argue that is to argue that gender is the product of clothes and/or makeup and thus we are whatever we wear.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Looking For Beta Readers</title>
      <link>https://weblog.masukomi.org/2025/08/17/looking-for-beta-readers/</link>
      <pubDate>Sun, 17 Aug 2025 00:00:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2025/08/17/looking-for-beta-readers/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#why-i-need-readers&#34;&gt;Why I Need Readers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#what-i-need-and-don-t-need&#34;&gt;What I Need &amp;amp; Don&amp;rsquo;t Need&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#what-you-d-be-reading&#34;&gt;What You&amp;rsquo;d Be Reading&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#description&#34;&gt;Description&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#content-warning&#34;&gt;Content Warning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#a-quick-note-about-the-catgirls&#34;&gt;A Quick Note About The Catgirls&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#how-to-contact-me&#34;&gt;How To Contact Me&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;I need beta readers for my books!&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re interested in spicy, sapphic, polyamorous, slice-of-life stories set in a world where catgirls exist, and not everyone&amp;rsquo;s kind to them, then keep reading!&lt;/p&gt;
&lt;p&gt;This page will explain what I&amp;rsquo;m looking for, and what to expect.&lt;/p&gt;
&lt;p&gt;The only credentials you need are to be open minded about queer and poly stuff, and interested in reading a book like the one described below.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re a professional proofreader, editor, sensitivity reader, etc. who would be interested in working on stories like that, I &lt;em&gt;absolutely&lt;/em&gt; want you to send me your info &amp;amp; rates, but I&amp;rsquo;m not quite ready for you &lt;em&gt;yet&lt;/em&gt;. See &amp;ldquo;How To Contact Me&amp;rdquo; below.&lt;/p&gt;
&lt;h2 id=&#34;why-i-need-readers&#34;&gt;Why I Need Readers&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve had some of my technical writing published before, but this is the first &lt;em&gt;novel&lt;/em&gt; I&amp;rsquo;m putting out into the world, and frankly I&amp;rsquo;m scared. I think it&amp;rsquo;s pretty decent, but I don&amp;rsquo;t know if the story, or the writing style, will work for others. I want to find out if this is worth paying a real editor $$$ to go through a whole bunch of words with a fine-toothed comb, &lt;em&gt;or&lt;/em&gt; if there are glaring problems that need some real revision.&lt;/p&gt;
&lt;p&gt;No worries if you&amp;rsquo;re not interested in reading something that hasn&amp;rsquo;t made it through a professional editor. I&amp;rsquo;ll still need people to read it after editing.&lt;/p&gt;
&lt;h2 id=&#34;what-i-need-and-don-t-need&#34;&gt;What I Need &amp;amp; Don&amp;rsquo;t Need&lt;/h2&gt;
&lt;p&gt;Right now I&amp;rsquo;m looking for high level feedback about what works and what doesn&amp;rsquo;t. I need readers who are willing to set politeness aside and give me &lt;em&gt;honest&lt;/em&gt;, and constructive feedback. I mean this literally. I&amp;rsquo;m autistic. If you try to not hurt my feelings I won&amp;rsquo;t understand what you&amp;rsquo;re hinting at. Kindness, is - of course - always appreciated.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m specifically &lt;em&gt;not&lt;/em&gt; looking for feedback on basic grammar and punctuation. I&amp;rsquo;ll be hiring someone to tackle that problem. Hopefully my grammar&amp;rsquo;s good enough that you won&amp;rsquo;t want to huck your e-reader into the wall.&lt;/p&gt;
&lt;p&gt;This book (tentatively &amp;ldquo;Alex&amp;rsquo;s Story&amp;rdquo;) is ~147k words, or about 1.5 average novels in length. If you don&amp;rsquo;t finish it, that&amp;rsquo;s fine. Just give me feedback on what you read, and why you ended up not finishing.&lt;/p&gt;
&lt;h2 id=&#34;what-you-d-be-reading&#34;&gt;What You&amp;rsquo;d Be Reading&lt;/h2&gt;
&lt;h3 id=&#34;description&#34;&gt;Description&lt;/h3&gt;
&lt;p&gt;In a world that can&amp;rsquo;t decide if catgirls should be treated as demons, slaves, or people, Alex is an autistic catgirl who can&amp;rsquo;t always speak. She finds herself falling for Lex, a coworker with a loving partner and an amazing kid. It&amp;rsquo;s a relationship Alex wouldn&amp;rsquo;t dream of harming, but the universe forces her to admit her feelings, and discover that Lex is polyamorous, and willing to take a chance on her, if she&amp;rsquo;s willing to take a chance on loving someone who already has a partner, and kid she loves.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s a cozy, sapphic, mildly-spicy, polyamorous, slice-of-life story about finding the place where you belong, and the people who&amp;rsquo;ll love you for who you are.&lt;/p&gt;
&lt;h3 id=&#34;content-warning&#34;&gt;Content Warning&lt;/h3&gt;
&lt;p&gt;Much like the rising tide of fascism and transphobia in the real world, this story is set against the backdrop of bigotry the characters must exist within, but have no hope of changing.&lt;/p&gt;
&lt;p&gt;The main characters live with the consequences and/or challenges of autism, mutism, selective mutism, limb-loss, severe scarring, and anxiety. This isn&amp;rsquo;t &amp;ldquo;disability porn&amp;rdquo;, or a cheap attempt to pull at your heart-strings. They&amp;rsquo;re simply the things these people live with, and - in a couple cases - the things that help bring them together.&lt;/p&gt;
&lt;p&gt;It involves characters who are lesbian, asexual, demisexual, nonbinary, Latina, East Asian, Caucasian, catgirls, humans, and even some straight white married couples.&lt;/p&gt;
&lt;p&gt;While this is - overall - a cozy tale of finding love, it touches briefly on memories of childhood bullying, suicide, suicidal ideation, and a house fire that results in death and severe injury. In the &amp;ldquo;present day&amp;rdquo; there is a scene that deals with the immediate consequences of a nearby bombing of innocent people.&lt;/p&gt;
&lt;p&gt;None of these are core elements of the story, and none of them are explored in detail, but they are notable moments that effect, or have effected, the character&amp;rsquo;s lives.&lt;/p&gt;
&lt;h3 id=&#34;a-quick-note-about-the-catgirls&#34;&gt;A Quick Note About The Catgirls&lt;/h3&gt;
&lt;p&gt;While the books I&amp;rsquo;m working on &lt;em&gt;do&lt;/em&gt; involve catgirls, this is not what I&amp;rsquo;d consider &amp;ldquo;furry&amp;rdquo; fiction. It&amp;rsquo;s just a world where some people happen to have some catlike physical attributes.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s simply following in the grand tradition of sci-fi stories that follow people who are almost - but not quite - like us as a means to hold up a mirror to the world around us.&lt;/p&gt;
&lt;h2 id=&#34;how-to-contact-me&#34;&gt;How To Contact Me&lt;/h2&gt;
&lt;p&gt;The best way to contact me is on the Fediverse at &lt;a href=&#34;https://connectified.com/@masukomi&#34;&gt;@masukomi@connectified.com&lt;/a&gt; .&lt;/p&gt;
&lt;p&gt;Email works too, but I&amp;rsquo;m effing terrible with email. Please send info to &lt;a href=&#34;mailto:masukomi@masukomi.org&#34;&gt;masukomi@masukomi.org&lt;/a&gt; and put &amp;ldquo;About your book&amp;rdquo; in the subject line. I&amp;rsquo;ll try and have my mail app notify me when anything like that comes in.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re interested in reading, let me know if you&amp;rsquo;d prefer an ePub or PDF file.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Bottom Surgery With Dr. Purohit</title>
      <link>https://weblog.masukomi.org/2025/08/11/bottom-surgery-with-dr.-purohit/</link>
      <pubDate>Mon, 11 Aug 2025 00:00:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2025/08/11/bottom-surgery-with-dr.-purohit/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#which-surgery&#34;&gt;Which Surgery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#summary-and-thoughts-after-five-months&#34;&gt;Summary &amp;amp; Thoughts After Five Months&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#high-level&#34;&gt;High Level&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#photos&#34;&gt;Photos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#things-i-d-wish-i-d-known&#34;&gt;Things I&amp;rsquo;d wish I&amp;rsquo;d known&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#questions-comments&#34;&gt;Questions / Comments&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#notes-from-the-healing&#34;&gt;Notes from the Healing&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#week-1&#34;&gt;Week 1&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#may-19th-pre-surgery&#34;&gt;May 19th, Pre-surgery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#may-19th-post-surgery--w-pic&#34;&gt;May 19th, Post-surgery (w/pic)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-may-20th&#34;&gt;Posts from May 20th&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-may-21st--w-pic&#34;&gt;Posts from May 21st (w/pic)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-may-22nd&#34;&gt;Posts from May 22nd&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-may-23rd&#34;&gt;Posts from May 23rd&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-may-24th--w-pic&#34;&gt;Posts from May 24th (w/pic)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-day-25th&#34;&gt;Posts from Day 25th&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#week-2&#34;&gt;Week 2&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-may-26th&#34;&gt;Posts from May 26th&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-may-27th-catheter-removal-day&#34;&gt;Posts from May 27th Catheter Removal Day&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-day-28th&#34;&gt;Posts from Day 28th&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-day-29th&#34;&gt;Posts from Day 29th&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-may-30th--w-pic&#34;&gt;Posts from May 30th (w/ pic)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-may-31st&#34;&gt;Posts from May 31st&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-june-1st&#34;&gt;Posts from June 1st&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#week-3&#34;&gt;Week 3&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-june-2nd--heading-home-plus-doctor-s-visit&#34;&gt;Posts from June 2nd (heading home + doctor&amp;rsquo;s visit)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-june-3rd--w-pic&#34;&gt;Posts from June 3rd (w/pic)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-june-4th&#34;&gt;Posts from June 4th&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-june-5th&#34;&gt;Posts from June 5th&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-june-6th&#34;&gt;Posts from June 6th&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-june-7th--w-pic&#34;&gt;Posts from June 7th (w/pic)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-june-8th&#34;&gt;Posts from June 8th&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#week-4&#34;&gt;Week 4&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-june-9th&#34;&gt;Posts from June 9th&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-june-11th&#34;&gt;Posts from June 11th&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-june-12th&#34;&gt;Posts from June 12th&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-june-14th&#34;&gt;Posts from June 14th&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-june-15th&#34;&gt;Posts from June 15th&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#week-5&#34;&gt;Week 5&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-day-june-16th&#34;&gt;Posts from Day June 16th&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-june-17th&#34;&gt;Posts from June 17th:&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#week-6&#34;&gt;Week 6&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-june-23rd&#34;&gt;Posts from June 23rd&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-june-26th&#34;&gt;Posts from June 26th&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-june-27th&#34;&gt;Posts from June 27th&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-june-28th&#34;&gt;Posts from June 28th&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#week-7&#34;&gt;Week 7&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#june-30th--dr-s-checkup&#34;&gt;June 30th (Dr&amp;rsquo;s Checkup)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-july-1st&#34;&gt;Posts from July 1st&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-july-4th&#34;&gt;Posts from July 4th&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#week-8&#34;&gt;Week 8&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-july-8th&#34;&gt;Posts from July 8th&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-july-9th&#34;&gt;Posts from July 9th&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-july-12th&#34;&gt;Posts from July 12th&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#week-9&#34;&gt;Week 9&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-july-17th&#34;&gt;Posts from July 17th&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-july-20th&#34;&gt;Posts from July 20th&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#week-10&#34;&gt;Week 10&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-july-21st&#34;&gt;Posts from July 21st&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-july-23rd&#34;&gt;Posts from July 23rd&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-july-24th&#34;&gt;Posts from July 24th&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#week-11&#34;&gt;Week 11&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-july-28th&#34;&gt;Posts from July 28th&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#posts-from-august-7th&#34;&gt;Posts from August 7th&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#week-12-three-months&#34;&gt;Week 12 Three Months&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#week-22-five-months&#34;&gt;Week 22 ~Five Months&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#soreness-and-limitations&#34;&gt;Soreness &amp;amp; Limitations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#masturbation-and-orgasm&#34;&gt;Masturbation &amp;amp; Orgasm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#internal-structures&#34;&gt;Internal Structures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#depth&#34;&gt;Depth&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#nerve-damage&#34;&gt;Nerve Damage&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-end&#34;&gt;The End?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;For trans-femme bottom surgery, it&amp;rsquo;s expected that - for the most part - you&amp;rsquo;ll be able to return to your normal life approximately three months after surgery.&lt;/p&gt;
&lt;p&gt;This post strives to document what that actually looks like, what you can expect, and also what to expect if you choose to work with Dr. Purohit and his team for your bottom surgery.&lt;/p&gt;
&lt;p&gt;If you know me in real life, and haven&amp;rsquo;t already been following the details of this journey you probably shouldn&amp;rsquo;t read this. If you&amp;rsquo;re a coworker or potential employer of mine you &lt;em&gt;definitely&lt;/em&gt; shouldn&amp;rsquo;t read this.&lt;/p&gt;
&lt;p&gt;⚠ WARNING
This post contains post-surgical photos of a neovagina. They&amp;rsquo;re all hidden behind spoilers and I&amp;rsquo;ve tried to describe what you&amp;rsquo;ll see before clicking so you&amp;rsquo;re not suddenly faced with a bunch of vulva pics at various stages of healing.&lt;/p&gt;
&lt;h2 id=&#34;which-surgery&#34;&gt;Which Surgery&lt;/h2&gt;
&lt;p&gt;I went for minimal-depth Vaginoplasty for a variety of reasons. This is sometimes conflated with Vulvoplasty, or Zero-Depth Vaginoplasty. These are &lt;em&gt;not&lt;/em&gt; the same thing.&lt;/p&gt;
&lt;p&gt;With minimal depth you &lt;em&gt;will&lt;/em&gt; end up with a short vaginal canal. How short is primarily dependent upon how much material your surgeon has to work with, and what kind of labia minora you ask for. Frequently it&amp;rsquo;s somewhere around 2½ inches (6.35cm).&lt;/p&gt;
&lt;p&gt;This surgery does not require dilation to maintain whatever depth you end up with.&lt;/p&gt;
&lt;h2 id=&#34;summary-and-thoughts-after-five-months&#34;&gt;Summary &amp;amp; Thoughts After Five Months&lt;/h2&gt;
&lt;p&gt;For those of you who aren&amp;rsquo;t interested in reading my daily commentary, or seeing the progress photos here&amp;rsquo;s my basic take-away.&lt;/p&gt;
&lt;h3 id=&#34;high-level&#34;&gt;High Level&lt;/h3&gt;
&lt;p&gt;I&amp;rsquo;m thrilled with the aesthetics. I think Dr. Purohit, and his support team are excellent, and I would highly recommend them.&lt;/p&gt;
&lt;p&gt;They did a good job, and were very responsive when I ran into problems. See day&amp;rsquo;s 13-15 below for details on problems &amp;amp; how they handled them.&lt;/p&gt;
&lt;p&gt;My body doesn&amp;rsquo;t seem to be particularly good at dissolving stitches in between my labia minora. The expectation was that after roughly six weeks all the stitches would be dissolved. Twelve weeks in and the stitches in the touchable areas inside me have only barely begun to dissolve. Some research said it can take up to twelve months. They were mostly gone after 16 weeks.&lt;/p&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-description-of-stich-unpleasantness&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-description-of-stich-unpleasantness&#34;&gt;
    Description of Stich unpleasantness
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-description-of-stich-unpleasantness&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;p&gt;[written at the 3 month mark] Sticking a finger inside me feels like sticking it into a bristle brush. I find it emotionally disturbing, and only do so during my daily cleaning.&lt;/p&gt;
&lt;p&gt;Most of the time I can&amp;rsquo;t feel the stitches unless I stick a finger in me. However, sometimes I wake up in the middle of the night feeling one of them poking me and have to reach in and move things around.&lt;/p&gt;
&lt;p&gt;I believe the stitches near the clit are keeping the nearby tissue hypersensitive.&lt;/p&gt;
&lt;p&gt;Edit: ~4 months in the stitches were dissolved but could still be felt under the surface. ~5 months in they were completely undetectable.&lt;/p&gt;

    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;p&gt;It should be noted that I do have non-trivial scaring below my vagina. This was entirely &lt;em&gt;my&lt;/em&gt; fault. I slipped and ripped those stitches (day&amp;rsquo;s 13-15 below).&lt;/p&gt;
&lt;p&gt;For observations about masturbation and orgasm, see &lt;a href=&#34;#week-22-five-months&#34;&gt;Week 22&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;photos&#34;&gt;Photos&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;:
In many of these photos you will see a shiny white patch at the bottom of the V shaped surgical scar. The white is just an artifact of the light reflecting off the shiny surface of the scar tissue. Again, that large area of scar tissue was entirely my fault. The vertical line you see to either side of my vulva is more typical of the expected scaring.&lt;/p&gt;
&lt;p&gt;The scar is as wide as it is near the bottom of the V because I ripped a number of stitches at the end of week one. This is the result of my own stupidity and should not reflect on Dr. Purohit&amp;rsquo;s work.&lt;/p&gt;
&lt;p&gt;This picture&amp;rsquo;s a little misleading. The labia minora happen to be in V shape today, but that&amp;rsquo;s not standard. (see next pic)&lt;/p&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-week-12&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-week-12&#34;&gt;
    Week 12
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-week-12&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/week_12.jpg&#34;
    alt=&#34;vulva photo 12 weeks after surgery&#34;&gt;
&lt;/figure&gt;

    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;p&gt;The arrangement of my Labia Minora seems to change on a day-to-day basis. Sometimes they look more like Week 12 above, and sometimes they&amp;rsquo;re more like Week 15 below.&lt;/p&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-week-22&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-week-22&#34;&gt;
    Week 22
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-week-22&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/week_22.jpg&#34;
    alt=&#34;vulva photo 22 weeks after surgery. The labia minora curve in towards the center in a way that&amp;#39;s reminiscent of a french braid.&#34;&gt;
&lt;/figure&gt;

    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;p&gt;Here&amp;rsquo;s what things look like with my legs mostly closed.&lt;/p&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-week-12-vulva-legs-closed&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-week-12-vulva-legs-closed&#34;&gt;
    Week 12 Vulva Legs Closed
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-week-12-vulva-legs-closed&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/week_12_legs_together.jpg&#34;
    alt=&#34;vulva photo 12 weeks after surgery with legs mostly closed&#34;&gt;
&lt;/figure&gt;

    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;p&gt;And what they look like when I&amp;rsquo;m standing.&lt;/p&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-week-12-standing&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-week-12-standing&#34;&gt;
    Week 12 Standing
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-week-12-standing&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/week_12_frontal.jpg&#34;
    alt=&#34;a vulva photo taken from the front while standing&#34;&gt;
&lt;/figure&gt;

    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;p&gt;And a demonstration of how little depth I have.&lt;/p&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-finger-inserted-into-vagina&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-finger-inserted-into-vagina&#34;&gt;
    Finger inserted into vagina
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-finger-inserted-into-vagina&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;p&gt;This photo shows my finger &lt;em&gt;fully&lt;/em&gt; inserted. I couldn&amp;rsquo;t press it in any farther if I wanted to.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/week_21_depth.jpg&#34;
    alt=&#34;a photo of a finger inserted as far as it will go into my vagina. it goes in barely past the fingernail&#34;&gt;
&lt;/figure&gt;
    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;p&gt;⚠️ odd looking internals&lt;/p&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-clitoral-detail-view&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-clitoral-detail-view&#34;&gt;
    Clitoral detail view
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-clitoral-detail-view&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;p&gt;I thought maybe my clit would settle into a more normal shape as the swelling went down, but after five months I&amp;rsquo;m reasonably confident that this is just what things look like. That horseshoe looking thing up at the top? That&amp;rsquo;s my clit. It looks weird, but it feels amazing.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/inside_view.jpg&#34;
    alt=&#34;a close-up of a horseshoe shaped clit.&#34;&gt;
&lt;/figure&gt;
    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;h3 id=&#34;things-i-d-wish-i-d-known&#34;&gt;Things I&amp;rsquo;d wish I&amp;rsquo;d known&lt;/h3&gt;
&lt;p&gt;In no particular order…&lt;/p&gt;
&lt;p&gt;There is a very long period when you&amp;rsquo;ll look fine, and &lt;em&gt;feel&lt;/em&gt; ok, but you really aren&amp;rsquo;t. Even ten weeks in a trivial amount of standing or moving can leave you sore and needing to lay down. Stairs are evil, because they don&amp;rsquo;t hurt to go up or down, and they&amp;rsquo;ll make you far more sore than a little walking around.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve spent a lot of time frustrated and wishing I could help out more around the house but really not being able to.&lt;/p&gt;
&lt;p&gt;The feeling of the catheter moving when you shift or walk is worse than the soreness from the surgery.&lt;/p&gt;
&lt;p&gt;They can&amp;rsquo;t repair ripped stitches. There are good reasons for this, but I didn&amp;rsquo;t know them when I ripped some, and I &lt;em&gt;really&lt;/em&gt; wish they could have. Don&amp;rsquo;t take &lt;em&gt;any&lt;/em&gt; chances with how you sit or move.&lt;/p&gt;
&lt;p&gt;Three months isn&amp;rsquo;t the point when &amp;ldquo;You&amp;rsquo;ll be able to do all your normal things.&amp;rdquo; Three months is where you can reasonably expect to survive going to a standard desk job, as long as you don&amp;rsquo;t have to walk there. You&amp;rsquo;ll still need to sit on a donut.&lt;/p&gt;
&lt;p&gt;A data point I wish I&amp;rsquo;d had was that cyclists find that they can&amp;rsquo;t comfortably ride a bicycle until after six to eight months. Most folks who responded to &lt;a href=&#34;https://www.reddit.com/r/Transgender_Surgeries/comments/1lwqetq/ladies_who_bike_how_long_did_it_take_you_to_be/&#34;&gt;that reddit thread&lt;/a&gt; needed to wait until eight months.&lt;/p&gt;
&lt;p&gt;At months I was able to spend a few hours a day at my desk as long as I had my donut.&lt;/p&gt;
&lt;h3 id=&#34;questions-comments&#34;&gt;Questions / Comments&lt;/h3&gt;
&lt;p&gt;If you have any questions feel free to ping me on Mastodon / The Fediverse at &lt;a href=&#34;https://connectified.com/@masukomi&#34;&gt;@masukomi@connectified.com&lt;/a&gt; If you&amp;rsquo;re not on the fediverse, then… sorry 🤷‍♀️.&lt;/p&gt;
&lt;h2 id=&#34;notes-from-the-healing&#34;&gt;Notes from the Healing&lt;/h2&gt;
&lt;p&gt;What follows is a mostly an edited version of the diary-style entires I posted to Mastodon during my recovery. &lt;em&gt;However&lt;/em&gt;, I&amp;rsquo;ve also added photos from the relevant weeks.&lt;/p&gt;
&lt;p&gt;It should be noted that we later learned that what I describe as &amp;ldquo;discomfort&amp;rdquo; from soreness and/or aching is what most people would describe as a 3-4 on the pain scale. A single Extra Strength Tylenol was sufficient to address it.&lt;/p&gt;
&lt;p&gt;⚠ WARNING: what follows is extremely TMI. It goes into detail about things most people are uncomfortable discussing, including wounds, bodily functions, physical arousal, and more. The photos from the first few weeks are &lt;em&gt;not&lt;/em&gt; easy to look at. This is intended for other trans-femme people considering bottom surgery.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note for folks who followed this as it happened on Mastodon&lt;/strong&gt;
Feel free to skim the text and just look for photo buttons or headings that say &amp;ldquo;(w/pic)&amp;rdquo;. I&amp;rsquo;ve made sure there&amp;rsquo;s at least one photo from every week.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If you&amp;rsquo;re just looking for progress pics&lt;/strong&gt; the first few weeks have &amp;ldquo;(w/pic)&amp;rdquo; added to the daily posts. After I stopped posting daily each of the weekly updates has a picture.&lt;/p&gt;
&lt;h3 id=&#34;week-1&#34;&gt;Week 1&lt;/h3&gt;
&lt;h4 id=&#34;may-19th-pre-surgery&#34;&gt;May 19th, Pre-surgery&lt;/h4&gt;
&lt;p&gt;Had to go in at 5:30 AM, and wait in a tiny lobby downstairs until everything actually opened upstairs.&lt;/p&gt;
&lt;p&gt;I was called a few minutes after going upstairs and registering, but my wife wasn&amp;rsquo;t allowed to join me initially. They took me into a bay, and a series of people came in and ask questions, had me sign things, and gave me a gown and socks to wear.&lt;/p&gt;
&lt;p&gt;They were being very reasonable, but as an autistic person this was an incredibly stressful experience. To many things being thrown at me too quickly with no preparation or knowledge of what to expect. I really wish I could have had my wife with me for support. If I&amp;rsquo;d known she was going to be allowed to come in later I would have advocated for her being there from the start because of my autism.&lt;/p&gt;
&lt;p&gt;Eventually the let her in and things got a &lt;em&gt;lot&lt;/em&gt; better because she acted as my support human.&lt;/p&gt;
&lt;p&gt;When Dr. Purohit came in I showed him the photos I&amp;rsquo;d collected since we&amp;rsquo;d last talked, including a surgical result from one of the other surgeons at Mt. Sinai that I really wanted him to try and come close to.&lt;/p&gt;
&lt;p&gt;He said that what I wanted shouldn&amp;rsquo;t be a problem.&lt;/p&gt;
&lt;p&gt;What he didn&amp;rsquo;t say was that by asking for more prominent labia minora I&amp;rsquo;d be sacrificing depth. It would be a while before I discovered this.&lt;/p&gt;
&lt;p&gt;I was then led into the surgical room which had about a dozen people in it, and looked &lt;em&gt;nothing&lt;/em&gt; like what you see on TV.&lt;/p&gt;
&lt;p&gt;They lead me to a table that looked like a stick-figure with separate adjustable areas for your arms and legs.&lt;/p&gt;
&lt;p&gt;The anesthesiologist said something, they put a mask on me, and I was unconscious within seconds.&lt;/p&gt;
&lt;h4 id=&#34;may-19th-post-surgery--w-pic&#34;&gt;May 19th, Post-surgery (w/pic)&lt;/h4&gt;
&lt;p&gt;Surgery took about 4½ hours.&lt;/p&gt;
&lt;p&gt;I woke up in what I assume was some post-surgical ward. I could see a blue curtain in the direction of my feet, and hear a nurse moving around to my left, but I couldn&amp;rsquo;t move my head. My throat was sore from the breathing tube and I really wanted some water, but I couldn&amp;rsquo;t talk.&lt;/p&gt;
&lt;p&gt;I found I could lift my right hand though, and I finger-spelled &amp;ldquo;w.a.t.e.r&amp;rdquo; to the nurse. Unfortunately, she didn&amp;rsquo;t know sign, but she guessed, and I gave her a thumbs up. She gave me some water, and then I passed out again.&lt;/p&gt;
&lt;p&gt;I woke up in a private room.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Posts from May 19th&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Surgery went well. I’m not on anything more powerful than Advil and I feel zero pain. Literally. A feels like I overworked some muscles. That may change tomorrow as things start to swell.&lt;/p&gt;
&lt;p&gt;All the anxious stress hurting my belly and jaw clenching is gone.&lt;/p&gt;
&lt;p&gt;Nurses are practically giddy about the quantity and quality of the “textbook pee” I’m producing.&lt;/p&gt;
&lt;p&gt;Actually I lied, I am in pain. My throat is really sore from the breathing tube.&lt;/p&gt;
&lt;p&gt;I’ve also learned that there are no lights in this room that can be controlled from the bed, and I’m not allowed to leave the bed.&lt;/p&gt;
&lt;p&gt;It’s getting quite dim but my eReader has backlight so I’m good. Also I think I’ll probably fall asleep soon anyway.&lt;/p&gt;
&lt;p&gt;In more entertaining news. They have me wrapped up in gauze and tape such that I look like an actress in a low budget 80’s sci-fi movie.&lt;/p&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-compression-bandages&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-compression-bandages&#34;&gt;
    compression bandages
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-compression-bandages&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/week_1_day_0.jpg&#34;
    alt=&#34;Photo of my lower torso and upper legs.&#34;&gt;
&lt;/figure&gt;

    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;h4 id=&#34;posts-from-may-20th&#34;&gt;Posts from May 20th&lt;/h4&gt;
&lt;p&gt;I asked if I should expect more pain in coming days. She said probably not to expect change from surgical site. Normally what’s most noticed to catheter (yup) and intestinal gas (yup).&lt;/p&gt;
&lt;p&gt;She did say I may still be working through remnants of anesthesia so it’s possible pain will increase when that’s fully gone, but also that it should be manageable with drugs.&lt;/p&gt;
&lt;p&gt;Also I’m not allowed to lay on my side. 😔&lt;/p&gt;
&lt;p&gt;I should note that engaging muscles at site does hurt, so my first time out of bed may be miserable. 🤷‍♀️&lt;/p&gt;
&lt;p&gt;Had a visit from a urologist I hadn’t met before.  (3rd female doc I’ve seen so far). My job for today is to lay in bed.&lt;/p&gt;
&lt;p&gt;She seemed surprised I’m already passing gas. Personally I’m thrilled because gas has been the most uncomfortable thing so far.&lt;/p&gt;
&lt;p&gt;Mentioned it hurts when I engage groin muscles. She said “yeah we don’t want you doing that.”😉&lt;/p&gt;
&lt;p&gt;Humorous note: had a spark of pain after shifting which brain told me was at the base of my 🍆.  No idea where it actually was as everything is still hidden by inches of gauze.&lt;/p&gt;
&lt;p&gt;Also doc just leaned over and looked at and felt felt my groin (gauze really) without preamble which was … “oh um. Ok. That’s a first😄” in my head.&lt;/p&gt;
&lt;p&gt;Good news. Surgeon just stopped by and said I can walk around later today. Very happy about this because my lower back needs to move.&lt;/p&gt;
&lt;p&gt;I got a visit from a lovely service dog named Jemma, but I think she&amp;rsquo;d had enough for the day.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/week_1_jemma_service_dog.jpg&#34;
    alt=&#34;a black lab and the jeans covered leg of her handler. She&amp;#39;s looking up at him, not quite sure what he wants.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;I walked! I was rudiculously light-headed after laying down for ~30 hrs. but… I walked and it didn’t hurt&lt;/p&gt;
&lt;p&gt;Will repeat in ~1 hr. Still might get discharged today but won’t know until evening&lt;/p&gt;
&lt;p&gt;Been having trouble getting a nurse to come this afternoon. Not sure what’s going on. IV machine ran out like an hour ago and beeped at me incessantly (we hates it precious) finally got someone to come and walk me again 1hr later than planned.&lt;/p&gt;
&lt;p&gt;I’m officially sick of this place and want to go home.  Seems like I will be discharged this evening 🤞&lt;/p&gt;
&lt;p&gt;Walking gives me a minor headache and makes me soooooo tried&lt;/p&gt;
&lt;p&gt;[Note] I didn&amp;rsquo;t get discharged. I wish I had, because there was an elderly woman across the hall who listened to her television at full volume for the next 30 hours.&lt;/p&gt;
&lt;h4 id=&#34;posts-from-may-21st--w-pic&#34;&gt;Posts from May 21st (w/pic)&lt;/h4&gt;
&lt;p&gt;Last night was miserable. Pressure bandages are stuck to my belly. Every time I breathe in it expands and pulls on them. Eventually this lead to me only breathing very shallowly when half asleep.&lt;/p&gt;
&lt;p&gt;Eventually replaced the lidocaine patch nurse and I couldn’t figure use foot but that took hours.&lt;/p&gt;
&lt;p&gt;Neighbor still listening to TV at full volume until a bossy nurse went and turned it down on my behalf at 11pm.&lt;/p&gt;
&lt;p&gt;Woke up with sore jaws as of clenching all night.&lt;/p&gt;
&lt;p&gt;Groin finally hurting.  I desperately want this pressure bandage off. Convinced I’ll feel better when it’s gone. Hopefully not wrong. At least I’ll be able to breathe without it pressing on my belly.&lt;/p&gt;
&lt;p&gt;Also NEED to get the fuck away from the sound of stupid laugh tracks - even at lower volume. It’s maddening.&lt;/p&gt;
&lt;p&gt;Oh and I felt like I was going to barf last night, which would have been terrible time I move so slowly so they gave me a bucket and some anti-nausea meds.&lt;/p&gt;
&lt;p&gt;I think the pressure dressing was part of that problem too, with every breath pulling down on my belly.&lt;/p&gt;
&lt;p&gt;Drugs were given. Pain wandered off. Now just bored. Waiting for doctors to come and finally remove pressure dressing.&lt;/p&gt;
&lt;p&gt;New nurse was talking about how I should be walking and was like “let us know if you’re light headed when you’re walking” to which I asked “am I supposed to be walking without you?” And he was like “…no”&lt;/p&gt;
&lt;p&gt;I replied that I’d walk whenever he came to walk me.&lt;/p&gt;
&lt;p&gt;I am a lean mean farting machine.&lt;/p&gt;
&lt;p&gt;I magically convert food into farts…and boredom, so much boredom.&lt;/p&gt;
&lt;p&gt;I got bored and asked to be taken for a walk. Went well, although got accidentally misgendered by assistant.&lt;/p&gt;
&lt;p&gt;Breakfast came finally. I asked for fruit plate because I figured they couldn’t fuck it up. [Note: I&amp;rsquo;ve been editing out most of the complaints about the food.]&lt;/p&gt;
&lt;p&gt;Eating is still uncomfortable with pressure bandage pulling against tummy.&lt;/p&gt;
&lt;p&gt;In ~1hr pressure dressing will be removed. They are just waiting for some labs to come back. Then I get to walk and hopefully not bleed. Then - dear gods, I hope - I will get to be discharged.&lt;/p&gt;
&lt;p&gt;I have never hated broadcast television more than I do right now.&lt;/p&gt;
&lt;p&gt;It’s melting my brain and I’m not even watching it. Had to listen to three episodes of Andy Griffith show already. I don’t understand how it’s even on TV still.&lt;/p&gt;
&lt;p&gt;They have removed the pressure dressing. I have a picture of my new bits! They are very bruised but otherwise doing well.&lt;/p&gt;
&lt;p&gt;there is no more pressure on my tummy from the tape. I am so happy.&lt;/p&gt;
&lt;p&gt;Unfortunately, they have given me MiraLAX which I now need to drink. I hate that stuff.&lt;/p&gt;
&lt;p&gt;Drinking lots of it for my colonoscopy (unrelated), traumatized me.&lt;/p&gt;
&lt;p&gt;⚠ The following photo includes fresh stitches, minor bleeding, and a catheter tube&lt;/p&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-first-photo-after-removing-pressure-bandages&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-first-photo-after-removing-pressure-bandages&#34;&gt;
    First Photo After Removing Pressure Bandages
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-first-photo-after-removing-pressure-bandages&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/week_1_day_2.jpg&#34;
    alt=&#34;the first photo of my neovagina. It&amp;#39;s not as bad as I expected. You can tell where flaps of skin have been stitched together in a V by a dark red line, but there&amp;#39;s only minor bruising thanks to the pressure bandages.&#34;&gt;
&lt;/figure&gt;

    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;p&gt;They said I&amp;rsquo;d be discharged today. I&amp;rsquo;m still waiting on I don’t know what for that to happen. Maybe we’re still waiting on the surgeon to say the photo looks good. Maybe you’re waiting on some other stuff. I thought the other stuff had already been taken care of.&lt;/p&gt;
&lt;p&gt;They said someone would come to check if I was bleeding after walking. No-one did. Of course, no one asked me to go walking either.&lt;/p&gt;
&lt;p&gt;And more positive news the old lady who listened to TV at maximum volume appears to have left.&lt;/p&gt;
&lt;p&gt;Also, I have been instructed on how to empty my catheter. The very helpful nurse was trying to encourage me to get up and walk whenever I felt like it.  Wanted me to work towards being more independent. Didn’t seem to really understand that that is not medically advised for me right now. Too much walking Will increase swelling.&lt;/p&gt;
&lt;p&gt;They only want me to walk 150 to 200 steps a day.&lt;/p&gt;
&lt;p&gt;I feel like the ultimate whiny kid but I just want to get out of here. I am so sick of listening to the beeping machines and other people’s televisions and laying here.&lt;/p&gt;
&lt;p&gt;I want to go home and be with my wife and dogs because it feels like there is no point in me being here any longer. I’m just waiting for permission to go and being subjected to terrible food.&lt;/p&gt;
&lt;p&gt;😭&lt;/p&gt;
&lt;p&gt;Whine.&lt;/p&gt;
&lt;p&gt;Kept having occasional little twinges of sharp pain, like a teeny poke with a needle. 🪡 couldn’t figure out why, so went hunting. Found the culprit.&lt;/p&gt;
&lt;p&gt;It’s just the nerves doing their healing thing, but I think I just didn’t realize where the end of the stitches were.&lt;/p&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-peeking-past-bandages&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-peeking-past-bandages&#34;&gt;
    Peeking Past Bandages
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-peeking-past-bandages&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/day_2_bandage_pull_back.jpg&#34;
    alt=&#34;pulling back the disposable underwear and roll of gauze to reveal the top right edge of the surgical V&#34;&gt;
&lt;/figure&gt;

    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;p&gt;I’ve been officially discharged!&lt;/p&gt;
&lt;p&gt;Of course, this means my wife is driving into the city during rush-hour and then back out shortly there after while it will still be going, but I don’t care that I will have to spend more time in the car.&lt;/p&gt;
&lt;p&gt;Soon… soon I will be free! Soon I will have these IV things removed from my hands! So I will not have to listen to other people‘s televisions!&lt;/p&gt;
&lt;p&gt;Side note: doctor from urology came and checked, and I have not been bleeding despite walking. So yay for that.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/day_2_ekg_patch.jpg&#34;
    alt=&#34;an EKG patch on my upper chest.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;We made it to the Air BnB, and I pooped, which was unexpected, and huge, and lead to bleeding. Finally in bed and warm and  blissfully quiet.&lt;/p&gt;
&lt;p&gt;Tummy’s unhappy, but I’ll eat some bread soon and see how that goes.&lt;/p&gt;
&lt;h4 id=&#34;posts-from-may-22nd&#34;&gt;Posts from May 22nd&lt;/h4&gt;
&lt;p&gt;Wifey piled blankets on me &amp;amp; gave me fuzzy socks because I was freezing, and black dog has been glued to me all night, with black and white dog splitting time between wifey and i.&lt;/p&gt;
&lt;p&gt;My biggest problem is digestive. Intestines and tummy unhappy. Pain is completely managed with single Tylenol every 4 hrs which is 🤯 completely mind-blowing. Although the packing is an uncomfortable pressure.&lt;/p&gt;
&lt;p&gt;(We’re in different bedrooms while I recover)&lt;/p&gt;
&lt;p&gt;Black dog keeps wanting to hang out between my legs. I’m ok with this.&lt;/p&gt;
&lt;p&gt;Turns out the only sensitive areas are pretty well protected, except for the catheter tube.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/day_3_black_dog.jpg&#34;
    alt=&#34;a first person perspective photo showing a pale blue fuzzy blanket covering my legs with a black dog curled between my shins looking back at me.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Was telling wifey that it doesn’t feel like anything’s changed. There is discomfort from the packing and from the catheter, but I never really felt much from that region anyways, and I don’t feel much from it right now.&lt;/p&gt;
&lt;p&gt;when I do feel something from the nerves, they are still informing me that it is in the old configuration that is being touched.  That’s not going to change until I start touching it and knowing what I’m touching.&lt;/p&gt;
&lt;p&gt;I have seen the photo. Other people have seen the real thing and commented on it.&lt;/p&gt;
&lt;p&gt;When I sat on the toilet and looked down there was no limp noodle. There were two swollen labia majora, which was cool but also doesn’t really tell me much.&lt;/p&gt;
&lt;p&gt;From my angle it was just two bumps. Also I was very preoccupied with what was going on with my butt and how weird the stupid catheter tube feels.&lt;/p&gt;
&lt;p&gt;I know things have changed, and yet it doesn’t feel like it.&lt;/p&gt;
&lt;p&gt;I  have every confidence that this will change once it is safe and healthy for me to start feeling around down there.&lt;/p&gt;
&lt;p&gt;Until then, it’s just weird.&lt;/p&gt;
&lt;p&gt;Side note: I can’t really look at it because my underwear is holding gauze rolls in place and those are holding the catheter in place, so everything of interest is completely obscured.&lt;/p&gt;
&lt;p&gt;I don’t intend to remove the gauze until I have to poo or shower. I am not really bleeding and I don’t have an infinite supply of gauze logs.🪵&lt;/p&gt;
&lt;p&gt;I have showered. It was exhausting, but I’m glad I did.&lt;/p&gt;
&lt;p&gt;Still not touching my bits because everything is fragile and I don’t want to make anything less clean.&lt;/p&gt;
&lt;p&gt;BUT I caught a glimpse of myself in the mirror and that was nice. Also, boobs, 😜&lt;/p&gt;
&lt;p&gt;I thought I had to poo. I was wrong, but finding out involved removing things and accidentally wiggling the catheter, and now I have a very unhappy urethra.&lt;/p&gt;
&lt;p&gt;Not having to get up to pee is pretty cool, but not cool enough to keep wearing one of these fuckers. I can’t wait until I get it removed Wednesday.&lt;/p&gt;
&lt;p&gt;The packing is constantly uncomfortable and the catheter is usually not noticeable, but when it is it’s VERY noticeable and very unpleasant.&lt;/p&gt;
&lt;p&gt;In other news: I read through the surgeons notes about the procedure they performed. I have no idea what 50% of the words mean, but as far as I can tell, they encountered no problems.&lt;/p&gt;
&lt;p&gt;Also, I theoretically have a clit, clitoral hood, vagina, labia minora, and labia majora. I can only personally confirm the latter, and the fact that I am no longer the owner of a wet noodle… despite what some of my nerve endings might think.&lt;/p&gt;
&lt;p&gt;Pretty happy about the no wet noodle part. That thing was annoying.&lt;/p&gt;
&lt;h4 id=&#34;posts-from-may-23rd&#34;&gt;Posts from May 23rd&lt;/h4&gt;
&lt;p&gt;I am not cut out for bed rest. This is maddening. I need to move. Is 3:30 pm and every hour of sleep has been a struggle.&lt;/p&gt;
&lt;p&gt;Also my lower back really hurts but I’m not allowed to lay on my side.&lt;/p&gt;
&lt;p&gt;Somehow, I didn’t expect laying in bed to be the hardest part of recovery.&lt;/p&gt;
&lt;h4 id=&#34;posts-from-may-24th--w-pic&#34;&gt;Posts from May 24th (w/pic)&lt;/h4&gt;
&lt;p&gt;Got some disposable post-partum underwear from Target. Large elastic things. Tried it out last night to see how it compares to the ones the hospital sent me home with.&lt;/p&gt;
&lt;p&gt;Woke up with serious sensory issues from how snug they are. Too tight on my skin, and they pulled the gauze logs 🪵 too tight against me.&lt;/p&gt;
&lt;p&gt;Probably fine for allistic people.&lt;/p&gt;
&lt;p&gt;I brought a bunch of normal panties I can wear after Wednesday morning, when I get rid of the catheter and can switch to pads for the tiny bit of blood.&lt;/p&gt;
&lt;p&gt;catheters still suck, but repeated tests have shown that I can poop all by myself, just like the big kids. 👧&lt;/p&gt;
&lt;p&gt;I dunno why, but anything that results in significant catheter wiggling just exhausts me.&lt;/p&gt;
&lt;p&gt;Decided I’m taking daily showers anyway just because it’s something I can do that involves standing up for a while, doesn’t use up my limited step budget, and feels good.&lt;/p&gt;
&lt;p&gt;Got some good photos today. Thought I’d update status for anyone planning on getting a surgery like this.&lt;/p&gt;
&lt;p&gt;~5.5 days since surgery&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bleeding: ~1/2 teaspoon a day&lt;/li&gt;
&lt;li&gt;Bruising: lots&lt;/li&gt;
&lt;li&gt;Swelling: plenty but well within expectations&lt;/li&gt;
&lt;li&gt;Pain: none at site w/ minimal tylenol&lt;/li&gt;
&lt;li&gt;Bowels: happy. Pooping daily&lt;/li&gt;
&lt;li&gt;Mobility: great (all things considered)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other:
Random pain in outer right thigh. Nurse says it&amp;rsquo;s not clot but also 🤷‍♀️ I have significant numbness in inner right thigh, as well as catheter discomfort, and internal discomfort from swelling.&lt;/p&gt;
&lt;p&gt;[Future edit: The bruises in this picture look miserable. You&amp;rsquo;d expect this to feel absolutely miserable. It didn&amp;rsquo;t. A single Tylenol really was enough to address the soreness.]&lt;/p&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-heavy-bruising-and-catheter-tube&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-heavy-bruising-and-catheter-tube&#34;&gt;
    Heavy bruising and Catheter Tube
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-heavy-bruising-and-catheter-tube&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/week_1_day_5.jpg&#34;
    alt=&#34;Photo of my groin showing heavy bruising and a bright blue catheter tube coming out from between swolen labia majora. The stitched V looks like a jagged dark line drawn by a drunken toddler.&#34;&gt;
&lt;/figure&gt;

    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;p&gt;Commentary:
Pain levels feel too good to be true. Had “oh shit“ moment wondering if no pain was related to numbness. It’s not. Just thigh &amp;amp; a little area on upper right pubic mound. Clearly nerve damage but nerves heal on unpredictable timescales so who knows when / if this will improve. Labia majoria have good sensitivity but I’ve been careful to only touch during my freak out.&lt;/p&gt;
&lt;p&gt;Looks: 🤷‍♀️ too swollen to guess.&lt;/p&gt;
&lt;p&gt;New neovaginas are NOT pretty things. Like really. There’s something in there that looks like a chrysalis &amp;amp; I have no idea if it’s clit or labia minora. Not willing to touch yet to find out. That means no spreading to see either.&lt;/p&gt;
&lt;p&gt;[Future Edit: It&amp;rsquo;s the labia minora.]&lt;/p&gt;
&lt;p&gt;Random:
150 steps a day is a ridiculously low number and mentally hard to deal with. My lower back is also regularly pissed. And my sleep is effed.&lt;/p&gt;
&lt;p&gt;Long showers are the bestest physical and mental health thing I’ve found.&lt;/p&gt;
&lt;p&gt;The head of my 🍆 itches. I started to reach out and scratch it. 🤦‍♀️&lt;/p&gt;
&lt;p&gt;Fortunately I stopped myself before I touched anything (especially the damn catheter) but then I realized I have no idea where the eff to address that itch anyway.🤔&lt;/p&gt;
&lt;h4 id=&#34;posts-from-day-25th&#34;&gt;Posts from Day 25th&lt;/h4&gt;
&lt;p&gt;I pooped and then took a shower. It did not end well.&lt;/p&gt;
&lt;p&gt;TIL that there’s an implicit connection between catheter wiggles and executive dysfunction. Wiggle it enough times in a short enough period and you can no longer make decisions… or I can’t at least.&lt;/p&gt;
&lt;h3 id=&#34;week-2&#34;&gt;Week 2&lt;/h3&gt;
&lt;h4 id=&#34;posts-from-may-26th&#34;&gt;Posts from May 26th&lt;/h4&gt;
&lt;p&gt;Woke up this morning having an erotic dream and feeling my bits responding.&lt;/p&gt;
&lt;p&gt;Hasn’t happened in ages.&lt;/p&gt;
&lt;p&gt;Also seems unlikely my testosterone levels have gone up, although my blood pressure isn’t being pushed down by Spiro anymore.&lt;/p&gt;
&lt;p&gt;Was also odd in that - having not touched anything (stitches still there and still bleeding ) - I don’t really know what’s going on down there when this happens. There’s a feeling of pressure - which is probably being effected by the packing - from some erectile tissue somewhere, but I don’t know where &amp;amp; the nerves will keep sending confusing signals until I get the go ahead to start fondling things &amp;amp; retraining my brain.&lt;/p&gt;
&lt;p&gt;I’m like “well something’s happening &amp;amp; it feels interesting but…” 🤷‍♀️&lt;/p&gt;
&lt;p&gt;In other news: 📰&lt;/p&gt;
&lt;p&gt;Discovered some discharge this morning (puss?). Called home health care nurse agency for advice and they’re sending someone today instead of tomorrow, so yay for having resources to help.&lt;/p&gt;
&lt;p&gt;No symptoms of infection elsewhere in body. So I’m not worried, but I’m unwilling to brush off infection stuff and hope it’ll fix itself&lt;/p&gt;
&lt;p&gt;Woohoo! 🎉 nurse says is reasonable discharge given location and doesn’t look like an infection.&lt;/p&gt;
&lt;p&gt;Also noted that my swelling and bruising have gone down greatly and that that means things will be more sensitive which would explain increased discomfort with catheter wiggles.&lt;/p&gt;
&lt;p&gt;Related: the saline water she used for some cleaning was very cold. 🥶&lt;/p&gt;
&lt;p&gt;Also nurse suggested that my leg pain was likely due to placement of straps on leg during surgery and may take a few weeks to stop.&lt;/p&gt;
&lt;p&gt;[Future edit: It went away eventually. I think it took about 2 weeks.]&lt;/p&gt;
&lt;p&gt;Took another shower. It was a learning experience.&lt;/p&gt;
&lt;p&gt;Lesson 1&lt;/p&gt;
&lt;p&gt;Needed to shave above cooch because the intersection of autistic skin sensitivities and constant pressure and shifting from gauze log 🪵 on hairs is 😭.&lt;/p&gt;
&lt;p&gt;Used electric razor but there’s swelling, the top of the stitches is &lt;em&gt;right there&lt;/em&gt; at the edge of what I’m shaving, &amp;amp; I can’t see anything clearly that far away. Hands were shaking as a result.&lt;/p&gt;
&lt;p&gt;Don’t think I will need to redo soon but will ask wifey to do it if I do.&lt;/p&gt;
&lt;p&gt;Lesson 2&lt;/p&gt;
&lt;p&gt;Tylenol was scheduled for 30 mins later. I should have waited until after that was taken and kicked in.&lt;/p&gt;
&lt;p&gt;At end of 4hrs I can feel throbbing and more discomfort even when laying around. Showering plus increased sensitivity from less swelling + increased sensitivity from basically no pain meds + shower = groin that feels like I did kegel exercises with 20lb dumbbells attached.&lt;/p&gt;
&lt;p&gt;It occurs to me that they gave me a dilator and I have yet to look at it.&lt;/p&gt;
&lt;p&gt;Honestly I wasn’t expecting one. Most minimal depth girlies don’t need to dilate, and he sacrificed depth for labia so I’m really shallow (theoretically).&lt;/p&gt;
&lt;p&gt;I think the swelling was hiding more pain than I realized. Currently have Tylenol and Advil coursing through my veins and still feel uncomfortable throbbing. And when I move the catheter is more likely to make me make bad sounds. I think the swelling may have been helping hold it in a specific position.&lt;/p&gt;
&lt;p&gt;I forsee a THC+CBD gummy being added to bedtime regiment tonight.&lt;/p&gt;
&lt;h4 id=&#34;posts-from-may-27th-catheter-removal-day&#34;&gt;Posts from May 27th Catheter Removal Day&lt;/h4&gt;
&lt;p&gt;Took the THC+CBD gummy. Sleep came fast and easy but dang… I was not a fan of those brief moments of semi-consciousness between REM cycles.&lt;/p&gt;
&lt;p&gt;I do NOT enjoy altered mental states. At least not the recreational drug induced kind.&lt;/p&gt;
&lt;p&gt;Nurse suggested I update doc with photo re discharge yesterday.&lt;/p&gt;
&lt;p&gt;He just responded:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There is a little bit of breakdown on the backwall.  We&amp;rsquo;ll take a look tomorrow. Minimize movement. Overall looks amazing!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We have no idea what “breakdown” or “backwall” mean here but. 🤷‍♀️ we’ll find out tomorrow and “looks amazing” is good.&lt;/p&gt;
&lt;p&gt;[Future edit: Breakdown meant ripped stitches. Backwall was just what they call the area at the bottom of the V. I don&amp;rsquo;t know why.]&lt;/p&gt;
&lt;p&gt;For two days now by body has been convinced that my 🍆 is laying vertically up my abdomen and it’s driving me buggy.&lt;/p&gt;
&lt;p&gt;I am honestly, a little afraid that my 🧠 will be stuck, thinking this until I am allowed to touch my bits freely and that might be a week or two for all I know. 😨&lt;/p&gt;
&lt;p&gt;I guess I will find out tomorrow.&lt;/p&gt;
&lt;p&gt;It’s a weird, icky, and somewhat dysphoria inducing sensation, and I don’t like it.&lt;/p&gt;
&lt;h4 id=&#34;posts-from-day-28th&#34;&gt;Posts from Day 28th&lt;/h4&gt;
&lt;p&gt;I am back at the AirB&amp;amp;B doing something I’ve been dreaming of for days now: laying here with nothing on my lower half save socks.&lt;/p&gt;
&lt;p&gt;My autistic skin sensory issues have been so SO upset about having underwear and gauze rolls pressed against my crotch and hips for 9 days with only brief breaks for showering.&lt;/p&gt;
&lt;p&gt;IT IS FUCKING GLORIOUS&lt;/p&gt;
&lt;p&gt;I’m allowed to touch myself!&lt;/p&gt;
&lt;p&gt;Was also instructed to gently clean the various folds and such out with q-tips.&lt;/p&gt;
&lt;p&gt;Going to wait until after I shower later, but I am thrilled to begin The Great Nerve Remapping Project.&lt;/p&gt;
&lt;p&gt;[Future edit: I did actually draw a little diagram noting which bits of penile tissue ended up where, but it turned out to be far less interesting than I&amp;rsquo;d hoped.]&lt;/p&gt;
&lt;p&gt;She said clit may be hypersensitive for a while and not so enjoyable to touch. Also I should expect~6 weeks until all the stitches are healed and no more bleeding.&lt;/p&gt;
&lt;p&gt;So the quest for the Next Great Orgasm will have to wait. 😢&lt;/p&gt;
&lt;p&gt;This was expected, but…&lt;/p&gt;
&lt;p&gt;9 days out, there’s enough swelling in the labia majora still that my urethra has no hope of sending a stream straight out. Instead it’s like someone’s pointing a garden sprayer at my anus and everything in between gets wet.&lt;/p&gt;
&lt;p&gt;This would be vaguely humorous, except that the only open wound I have is at the bottom of the my vagina. I.e. directly in that path.&lt;/p&gt;
&lt;p&gt;I left my upside down peri bottle at home. 🤦‍♀️ Should have another tomorrow.&lt;/p&gt;
&lt;p&gt;Cleaned with Q-tips. Can confirm there will be no Happy Fun Times involving Ms. Clit for quite some time.&lt;/p&gt;
&lt;p&gt;Mostly “hypersensitive” but there’s one spot right by a stitch that’s “FAAAAAAAAAAAK!!!!!!!!!!!” When you barely brush it. It’s been maybe ten minutes and I can still feel the ghost of that touch.&lt;/p&gt;
&lt;p&gt;But hey. On the upside: nerves seem to be working there. 👍😄&lt;/p&gt;
&lt;h4 id=&#34;posts-from-day-29th&#34;&gt;Posts from Day 29th&lt;/h4&gt;
&lt;p&gt;Bladder control seems to be 👍. Almost had an accident last night though because after ~9 days with the catheter I’d learned to just relax when I felt the need to pee.&lt;/p&gt;
&lt;p&gt;Felt the need to pee as I was about to lie in bed. Started to relax. Then brain was shouting “NOOOOO!” and I managed to clamp down and not wet myself.&lt;/p&gt;
&lt;p&gt;Physician’s Assistant said stitches will probably take about 6 weeks to heal. Also said that things will likely be hypersensitive until a little before then. So, masturbation should poorly wait until then.&lt;/p&gt;
&lt;p&gt;UNFORTUNATELY my adrenal gland appears to be freaking out about the sudden decrease in testosterone from testes and is overcompensating and making me horny AF. Especially when I wake up (nap or night).&lt;/p&gt;
&lt;p&gt;😭SO HORNY, but touching would hurt terribly and probably damage something.😭😭😭&lt;/p&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-unexpected-notes-from-horniness-extra-tmi&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-unexpected-notes-from-horniness-extra-tmi&#34;&gt;
    Unexpected Notes From Horniness (extra TMI)
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-unexpected-notes-from-horniness-extra-tmi&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;p&gt;I identify as a lesbian. The idea of being fucked by a guy is a massive turn-off.&lt;/p&gt;
&lt;p&gt;However, for the next couple days I wanted nothing more than to be &lt;em&gt;fucking railed&lt;/em&gt; by a big hard cock. I &lt;em&gt;desperately&lt;/em&gt; wanted to masturbate too. Looking back on this from 12 weeks out, I&amp;rsquo;m very glad I resisted the temptation. If this happens to you, trust me, you &lt;em&gt;definitely&lt;/em&gt; should not try at this point. Just deal with being horny.&lt;/p&gt;

    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;p&gt;Today I got to experience the “wonderful” bit of puberty (2nd) where a young woman learns the hard way how to place a pad so that it’s far enough forwards to get all the stuff at the top and far enough back to get all the stuff at the bottom.&lt;/p&gt;
&lt;p&gt;There’s a reason I’m wearing disposable underwear. 🩲&lt;/p&gt;
&lt;p&gt;I wouldn’t say this experience is necessarily “euphoria giving“  but it is making me smile. This is helped by the fact that I know I won’t have to deal with the quantities of 🩸 that a teen girl does.&lt;/p&gt;
&lt;p&gt;Status update: labia majora swelling has gone down enough that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I can see most of the labia minora when spreading my legs&lt;/li&gt;
&lt;li&gt;I’m only peeing in the right side of myself&lt;/li&gt;
&lt;li&gt;I wasn’t afraid to spread things enough during special cleaning to access my vaginal canal and clean it with a q-tip&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We have applied Manuka Honey 🍯 (as per physician suggestion) to where the stitches pulled apart at the bottom.&lt;/p&gt;
&lt;p&gt;I am non-jokingly afraid of ants 🐜 in my current location.&lt;/p&gt;
&lt;p&gt;Still can’t play around with my bits, so still getting weird signals. 🧠 keeps telling me that my 🍆 is laying weird and I need to adjust it.&lt;/p&gt;
&lt;p&gt;🤦‍♀️&lt;/p&gt;
&lt;p&gt;I can’t wait for day 42 when I can (hopefully) fondle things, if for no other reason than to get my brain to stop giving me stupid misinformation about my genitalia.&lt;/p&gt;
&lt;p&gt;Thought while I got ready for bed:&lt;/p&gt;
&lt;p&gt;Despite the cost and discomfort, I have a vagina, and that’s incredible, and amazing, and wonderful.&lt;/p&gt;
&lt;p&gt;And it would have never been possible without the years of incredible support my wife has given me. She is incredible, and amazing and wonderful too.&lt;/p&gt;
&lt;p&gt;I’m a very VERY lucky girl in so many ways. I’ll try to not lose sight of that.&lt;/p&gt;
&lt;h4 id=&#34;posts-from-may-30th--w-pic&#34;&gt;Posts from May 30th (w/ pic)&lt;/h4&gt;
&lt;p&gt;Interesting observation re waking up horny.&lt;/p&gt;
&lt;p&gt;Pre-hormones: morning wood was frustrating and dysphoria inducing&lt;/p&gt;
&lt;p&gt;On HRT: it just didn’t happen, and that made me very happy.&lt;/p&gt;
&lt;p&gt;Post-op (w/ adrenal gland overcompensating): I just feel horny with no negative anything. Well, none beyond my inability to do anything about it.&lt;/p&gt;
&lt;p&gt;Nurse came by. Then I applied honey 🍯 (so weird) and took updated pics. Things are healing SO fast. It’s a little hard to believe.&lt;/p&gt;
&lt;p&gt;I’ve decided I’m not going to share pics (at least not here) but I &lt;strong&gt;want&lt;/strong&gt; to because I just can’t convey how fucking impressive this is, and I want to be like “holy shit! Look at how amazing this is!”&lt;/p&gt;
&lt;p&gt;Pretty sure most folks would be grossed out by the early day pics with all the swelling and bruising and bulgy Frankenstein stitches.&lt;/p&gt;
&lt;p&gt;[Future Edit: this post is all about the pics, so here you go.]&lt;/p&gt;
&lt;p&gt;⚠ While not bloody this does show a small open wound where the stitches have ripped.&lt;/p&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-week-1-healing-progress&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-week-1-healing-progress&#34;&gt;
    Week 1 Healing Progress
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-week-1-healing-progress&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;p&gt;The orange goo near the bottom of the V is just honey. I forgot to take the picture before applying it. The labia minora are pretty swolen still.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/week_1_pre_rip.jpg&#34;
    alt=&#34;Vulva pic. Skin has begun to seal up along parts of the stitches. There is a small rip at the bottom of the V that is covered by honey.&#34;&gt;
&lt;/figure&gt;
    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;p&gt;Deep cleaning status update:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;swelling continues to decrease visibly every day.&lt;/li&gt;
&lt;li&gt;was able to spread labia minora enough to see into where my urethra is hiding. Still haven’t found it, but lighting wasn’t great.&lt;/li&gt;
&lt;li&gt;vaginal canal / “dimple” continues to be the source of most blood (i think) And is VERY sensitive in a way can’t explain yet.&lt;/li&gt;
&lt;li&gt;anything made with the corona continues to be uncomfortably hypersensitive&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;posts-from-may-31st&#34;&gt;Posts from May 31st&lt;/h4&gt;
&lt;p&gt;Status update: nothing particularly notable today. Just continued gradual improvement.&lt;/p&gt;
&lt;p&gt;Full night’s sleep with stress dreams related to inability to position my bottom half as I want, and real desire to go home.&lt;/p&gt;
&lt;p&gt;Been low energy and grumpy  😾 all day. Had a video call with friends we haven’t spoken with in months. It exhausted me.&lt;/p&gt;
&lt;p&gt;I had a minor accident trying to sit on the bathtub edge. Ripped open multiple stitches at the bottom of the V. Left a disturbing blood splatter on the tile.&lt;/p&gt;
&lt;p&gt;Bleeding hasn’t continued notably.&lt;/p&gt;
&lt;p&gt;🤞Hoping they’ll have me come in to fix it Monday as it looks significantly worse like this.&lt;/p&gt;
&lt;p&gt;[Future Edit: It gets worse, and I later learned that it&amp;rsquo;s not safe to re-stitch a wound that has ripped open if the rip is just superficial like mine was.]&lt;/p&gt;
&lt;p&gt;⚠ Warning: this photo contains minor blood in the open wound where the bottom of the V has ripped farther open.&lt;/p&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-ripped-stitches-the-beginning&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-ripped-stitches-the-beginning&#34;&gt;
    Ripped Stitches - The beginning
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-ripped-stitches-the-beginning&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/week_2_rip.jpg&#34;
    alt=&#34;the stitches at the bottom of the V have spread apart and are bleeding a little. It&amp;#39;s a bit disturbing.&#34;&gt;
&lt;/figure&gt;

    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;h4 id=&#34;posts-from-june-1st&#34;&gt;Posts from June 1st&lt;/h4&gt;
&lt;p&gt;Massive relief.&lt;/p&gt;
&lt;p&gt;Messaged surgeon a pic and explanation, then messaged his Physicians Assistant when I couldn’t find a working number for the office.&lt;/p&gt;
&lt;p&gt;He asked me to call scheduling woman (wonderful lady) and ask her to get me in first thing Monday. 🎉&lt;/p&gt;
&lt;p&gt;Left her a voicemail. Hasn’t happened yet, but 🤞&lt;/p&gt;
&lt;p&gt;Was afraid it was going to get blown off since it &lt;em&gt;will&lt;/em&gt; heal fine, it just won’t heal pretty. I&amp;rsquo;ve read too many horror stories of uncaring surgeons.&lt;/p&gt;
&lt;h3 id=&#34;week-3&#34;&gt;Week 3&lt;/h3&gt;
&lt;h4 id=&#34;posts-from-june-2nd--heading-home-plus-doctor-s-visit&#34;&gt;Posts from June 2nd (heading home + doctor&amp;rsquo;s visit)&lt;/h4&gt;
&lt;p&gt;Have avoided looking at my cooch today. I know it’s not THAT bad but I’m afraid anyway.&lt;/p&gt;
&lt;p&gt;Misread Dr.’s note. He wasn’t asking for me to have her schedule something first thing in the morning. He was asking me to talk to her first thing in the morning to schedule something. 🤦‍♀️ needless to say she hasn’t called back yet, but I suspect a call early morning.&lt;/p&gt;
&lt;p&gt;…&lt;/p&gt;
&lt;p&gt;Physician’s assistant took one look at it. Said “it’s already healing up” advised me to keep putting Manuka honey on it and sent me on my way.&lt;/p&gt;
&lt;p&gt;Not entirely thrilled with this outcome, but on the other hand, no new stitches.&lt;/p&gt;
&lt;p&gt;OK so, this is a little silly, but before surgery I bought a bunch of underwear, the kinds I couldn’t really wear with dangly bits.&lt;/p&gt;
&lt;p&gt;The plan was to ride home wearing my “celebratory underwear”. Well I’m basically not bleeding today and we’re heading home shortly so …&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/day_14_celebratory_undrewear.jpg&#34;
    alt=&#34;mirror selfie showing me pulling up the bottom edge of my black tshirt to better reveal the salmon colored boy shorts I&amp;#39;m wearing.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Side note: feeling annoyingly useless as wifey packs the entire car by herself since I’m not allowed to lift anything &amp;gt; 10lbs (4.5Kg) and I’m pretty sure I’m already way over my step limit for the day.&lt;/p&gt;
&lt;p&gt;On top of that, I can’t even drive us home. :/&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/day_14_riding_home.jpg&#34;
    alt=&#34;A selfie with me, two dogs, and way too much stuff crammed into our car on the way home.&#34;&gt;
&lt;/figure&gt;

&lt;h4 id=&#34;posts-from-june-3rd--w-pic&#34;&gt;Posts from June 3rd (w/pic)&lt;/h4&gt;
&lt;p&gt;I don’t know what things looked like when I went into the doctor today. I hadn’t taken a photo yesterday or this morning.&lt;/p&gt;
&lt;p&gt;But, for reasons, I just took one now, and I have ripped so many stitches open.&lt;/p&gt;
&lt;p&gt;There is a ripped open area under my vagina that looks like the fucking Joker’s smile (without exaggeration).&lt;/p&gt;
&lt;p&gt;Things are mostly healed , as stitches heal from the inside out, but I fear I may have really fucked things up aesthetically…&lt;/p&gt;
&lt;p&gt;⚠ Warning wide wound where stitches unraveled. No blood, but very unpleasant to look at. I recommend &lt;em&gt;not&lt;/em&gt; looking.&lt;/p&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-the-rip-got-wider&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-the-rip-got-wider&#34;&gt;
    The rip got wider
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-the-rip-got-wider&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/week_2.jpg&#34;
    alt=&#34;more stitches have come out near the bottom of the V expanding the exposed wound.&#34;&gt;
&lt;/figure&gt;

    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;p&gt;I first I thought it was the extra physical exertion today in helping as I could too leave the AirBnB BUT I realized that I basically haven’t bled at all today. Just a tiny bit of spotting.&lt;/p&gt;
&lt;p&gt;I think things may have just unraveled between the initial rip and this morning.&lt;/p&gt;
&lt;p&gt;That is an incredibly disturbing thought. I don’t like it.&lt;/p&gt;
&lt;p&gt;In the morning, I will email the person who looked at me today, and ask her what she saw. Not that it changes anything, but…&lt;/p&gt;
&lt;p&gt;As an aside, it has been explained to me that getting stitches to pull things back together the way they were was never really a thing they could do. There is too high of a risk of stitching bad microscopic things into / under your skin in this scenario.&lt;/p&gt;
&lt;p&gt;Good news, bad news.&lt;/p&gt;
&lt;p&gt;Good news: despite the fact that I have completely forgotten to medicate myself all day today, my cooch does not hurt.&lt;/p&gt;
&lt;p&gt;Bad news: I’ve also forgotten to hydrate myself all day, and my head really hurts. 🤦‍♀️&lt;/p&gt;
&lt;p&gt;Bonus, annoyed news:  I’m really sick of having to lay down and re-apply honey every time I pee because I’m still peeing all over myself and washing away the honey with either the pee, or the peri bottle as a wash myself afterwards.&lt;/p&gt;
&lt;p&gt;Also, I lost my underwear. I know where new underwear is, but that’s not the point. I had a pair of underwear to put on after I applied honey and then life happened and now I don’t know where that pair of underwear has gone.&lt;/p&gt;
&lt;p&gt;At my dog suggestion, I got my ass out of bed again. I went to hang out in our plant room, which doesn’t have many plans these days.&lt;/p&gt;
&lt;p&gt;The cat came and found me. In the process of getting into this position, she made sure to shove at least three of her feet directly onto my healing cooch.&lt;/p&gt;
&lt;p&gt;It was not pleasant. I did not make happy sounds. That’s I don’t know if it was all 4 feet.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/day_15_cat.jpg&#34;
    alt=&#34;A picture of my cat’s rump and her very long fluffy tail that dangles down between my thighs and over my crotch. She is settled between my shins on a wedge pillow, but all you can see is cat and blanket, covered knees.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;I was squeezing my legs together, unconsciously &amp;amp; was putting pressure on my groin, which caused my brain to inform me that my left testicle is being uncomfortably compressed.&lt;/p&gt;
&lt;p&gt;🤦‍♀️&lt;/p&gt;
&lt;p&gt;I understand the confusing nerve input about penis bits because some of them still exist and are wired up and I am unable to retrain my 🧠 yet, but this is just weird. Even more so because when I spread my legs in response, the sensation went away. 🤔&lt;/p&gt;
&lt;p&gt;When swelling is really bad the difference between yesterday and today can be pretty obvious, but after two weeks I have passed that point.&lt;/p&gt;
&lt;p&gt;Now my barometer for how much the swelling has gone down is how much I pee on myself when I go to the bathroom.&lt;/p&gt;
&lt;p&gt;I’ve gone from garden hose spray of all things below, to strong trickle down one side. So… progress. 🎉&lt;/p&gt;
&lt;p&gt;Today I kept getting seconds of nothing on me and getting excited. Someday soon I shall pee without having to wash myself afterwards. 🤞&lt;/p&gt;
&lt;h4 id=&#34;posts-from-june-4th&#34;&gt;Posts from June 4th&lt;/h4&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-sexy-dream-things&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-sexy-dream-things&#34;&gt;
    sexy dream things
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-sexy-dream-things&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;p&gt;Took a nap. Woke up horny again. Why when I wake up?!&lt;/p&gt;
&lt;p&gt;First waking was good and bad because I was dreaming I was masturbating and SO close to coming 😸 but then I woke up and couldn’t touch myself to finish the job 😾&lt;/p&gt;
&lt;p&gt;So my 🧠 doubled down on taunting me.&lt;/p&gt;
&lt;p&gt;Second time a recurring dream visitor tried to seduce me (very successfully) and it almost hurt to push her away and tell her no because I hadn’t discussed it with wifey.&lt;/p&gt;
&lt;p&gt;2 thoughts&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I appreciate that my subconscious won’t cheat either, but gods damn it I’m so ducking horny &amp;amp; can’t do anything! When is this going back to normal?!&lt;/li&gt;
&lt;li&gt;why do I have a recurring visitor in my dreams who keeps trying to seduce me? I don’t think she ever talks, but I am confident we know each other pretty well. Which makes sense given that I’m demisexual. A stranger trying to seduce me wouldn’t get anywhere even in my dreams.&lt;/li&gt;
&lt;/ol&gt;

    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;p&gt;And since i’m already deep in TMI territory…&lt;/p&gt;
&lt;p&gt;The most physically uncomfortable part of this whole fucking thing has been my autistic skin hypersensitivity going absolutely insane about having underwear on me almost 24/7. My pubic mound is so very, VERY uncomfortable I keep having to just take off my underwear and sit here with nothing touching it.&lt;/p&gt;
&lt;p&gt;So I’ve spent a lot of time laying with everything covered except my crotch. Soooo frustrating and uncomfortable&lt;/p&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-lying-around-without-underwear&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-lying-around-without-underwear&#34;&gt;
    lying around without underwear
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-lying-around-without-underwear&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/day_unknown_no_undies.jpg&#34;
    alt=&#34;First person perspective, photo as I laid on a couch at the Airbnb. You can see the bottom of my nightshirt. It has been pulled up to just above my pubic mound.  You can see the top of my labia majora and the top of my thighs, and then a thick fuzzy blanket.&#34;&gt;
&lt;/figure&gt;

    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;p&gt;I can’t sleep without underwear though because I can’t guarantee my butt will stay on the pee pad and i’d mess up a pillow between my legs.&lt;/p&gt;
&lt;p&gt;Today I tried shaving extra extra well so there would be no little hairs for the underwear to brush against, and wearing normal underwear instead of the temporary underwear and wearing a thinner pad. I was just throwing everything at it, hoping it would work, but now I am laying here with my cooch exposed to the world again.&lt;/p&gt;
&lt;h4 id=&#34;posts-from-june-5th&#34;&gt;Posts from June 5th&lt;/h4&gt;
&lt;p&gt;Status Update:
My labia minora no longer look like overinflated worms practicing &lt;a href=&#34;https://en.wikipedia.org/wiki/Japanese_bondage&#34;&gt;Shibari&lt;/a&gt;! Instead they look like… labia minora 🎉&lt;/p&gt;
&lt;p&gt;Ok, technically the bottom bits are still a bit “inflated” looking but overall, it’s amazing and I’m so effing happy.&lt;/p&gt;
&lt;p&gt;Ripped stitches are healing well.&lt;/p&gt;
&lt;p&gt;[Future edit: See the picture on June 7th]&lt;/p&gt;
&lt;p&gt;I’m no longer bleeding on anything. Instead I’m “honeying”. I’m not applying it after peeing in the middle of the night, but other than that I’m being a good girl and always applying afterwards.&lt;/p&gt;
&lt;p&gt;I’m still upset about not being aware of how much depth I would be sacrificing in order to have pretty labia, BUT I think he may have done a tremendous job on the aesthetics. Although, there’s something weird going on with my right labia minora in that it seems to just blend into my clit. That seems unlikely to be what’s really going on because why would he/they do that?  Hard to be sure because pushing my clit around for a better look-see is guarantee to not feel good because of that one stitch.&lt;/p&gt;
&lt;h4 id=&#34;posts-from-june-6th&#34;&gt;Posts from June 6th&lt;/h4&gt;
&lt;p&gt;Another day, another chance to be completely blown away by the human body’s ability to heal.&lt;/p&gt;
&lt;p&gt;I’m ~50. I don’t heal even remotely as quickly as I did in my 20s and yet every morning, I can see visible improvements at the surgical site.&lt;/p&gt;
&lt;p&gt;Wifey had not seen for a couple days and happened to bring me something as I was applying honey last night. The “wow” and look of surprise on her face when she saw the recent changes was humorous, and also helped confirm that I wasn’t just being overly hopeful.&lt;/p&gt;
&lt;p&gt;Deep Cleaning Discovery:
Things seemed healed enough to try spreading more and getting a better look. Turns out, that really sensitive bit that I thought was my clit, but oddly seemed to flow into my right labia minora? Turns out, that’s not my clit. That’s just a puffy side of my clitoral hood. I found the real deal hidden up inside. Haven’t seen it, but i definitely &lt;span class=&#34;underline&#34;&gt;felt&lt;/span&gt; it. So,  woo hoo! Can’t wait to have fun with that.&lt;/p&gt;
&lt;p&gt;Honestly I was trying to find my urethra, to better understand why I’m still peeing on myself. Still haven’t found that. I suspect that my eyesight’s just too poor to see it with a mirror (too far away) and I’m gonna have to ask wifey to get all up in there and investigate after the stitches are gone.&lt;/p&gt;
&lt;p&gt;Side note: I know this is ridiculous given the circumstances, but I feel so stupid being ~50 years old and suddenly discovering my own clit, or mistaking labia for it.&lt;/p&gt;
&lt;h4 id=&#34;posts-from-june-7th--w-pic&#34;&gt;Posts from June 7th (w/pic)&lt;/h4&gt;
&lt;p&gt;still waking up horny as a teen-ager. Still incapable of doing anything about it.&lt;/p&gt;
&lt;p&gt;~23 days left until stitches are all dissolved. 😭&lt;/p&gt;
&lt;p&gt;[Future Edit: that date passed a while ago, so many stitches left in me. 😭😭😭]&lt;/p&gt;
&lt;p&gt;In other news: wifey gave me a thick pillow to shove between my legs so that i can sleep on my side.&lt;/p&gt;
&lt;p&gt;I seem to be spending the whole night with it there as i rotate between my back and other side.&lt;/p&gt;
&lt;p&gt;Feels a little silly waking up with a giant pillow sticking up between your legs.&lt;/p&gt;
&lt;p&gt;I’ve decided to go without a pad or honey today. I think i’m getting a rash down by my 🍑🕳 from too much moisture. 🤔 Maybe i need to blow-dry the area after rinsing myself (peri bottle) after every pee. ugh. I’ve just been using a towell for drying since getting home, but maybe not thoroughly enough. 🙁&lt;/p&gt;
&lt;p&gt;Note: If you looked at the last one, I promise this one is a &lt;em&gt;lot&lt;/em&gt; better. The wound is almost entirely sealed up.&lt;/p&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-swelling-be-going-down&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-swelling-be-going-down&#34;&gt;
    Swelling be going down
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-swelling-be-going-down&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/week_3.jpg&#34;
    alt=&#34;open wound is almost entirely healed over. Swelling has dropped dramatically and the labia minora look pretty normal now.&#34;&gt;
&lt;/figure&gt;

    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;h4 id=&#34;posts-from-june-8th&#34;&gt;Posts from June 8th&lt;/h4&gt;
&lt;p&gt;I forgot to put on a glove while applying honey.&lt;/p&gt;
&lt;p&gt;The results were entirely predictable . 😾&lt;/p&gt;
&lt;h3 id=&#34;week-4&#34;&gt;Week 4&lt;/h3&gt;
&lt;p&gt;Honestly, this looks worse than the last one. Don&amp;rsquo;t click.&lt;/p&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-week-four-status-photo&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-week-four-status-photo&#34;&gt;
    Week Four Status Photo
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-week-four-status-photo&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;p&gt;The black spot at the bottom of the V is a stitch. The small rip near the top of the left arm of the V hides a stitch. The swelling is just pushing the flesh out around it.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/week_4.jpg&#34;
    alt=&#34;the bottom of the V is shiny and it looks as if some things have started to pull apart. You can make out black stitches near the top of each arm of the V and at the very bottom of the V.&#34;&gt;
&lt;/figure&gt;
    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;h4 id=&#34;posts-from-june-9th&#34;&gt;Posts from June 9th&lt;/h4&gt;
&lt;p&gt;I didn’t wake up horny AF this morning!&lt;/p&gt;
&lt;p&gt;Progress! Or… or just a one-off. Only time will tell. 🤷‍♀️&lt;/p&gt;
&lt;p&gt;🤔 just realized that that&amp;rsquo;s a kinda weird thing to be excited about.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Hooray. I wasn&amp;rsquo;t horny!&amp;rdquo; - me&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Doubly so in a world where most folks seem pretty obsessed with sex. I mean, I&amp;rsquo;m a fan too but like… under the right circumstances. When the vibe is right. Not like &amp;ldquo;hey stranger. you&amp;rsquo;ve got a hot bod. let&amp;rsquo;s fuck.&amp;rdquo; My demi ass can&amp;rsquo;t fathom that anymore.&lt;/p&gt;
&lt;p&gt;I’d been working towards hair free bits, but hadn’t completed the long process before surgery.&lt;/p&gt;
&lt;p&gt;This morning I was thinking how much I was looking forward to being able to get my cooch hairs lazered because there are some now that I’m really not thrilled about attempting to shave.&lt;/p&gt;
&lt;p&gt;This evening I remembered I’d have to shave them to get them lasered.  🤦‍♀️&lt;/p&gt;
&lt;h4 id=&#34;posts-from-june-11th&#34;&gt;Posts from June 11th&lt;/h4&gt;
&lt;p&gt;just had a realization that I should have had a while ago&lt;/p&gt;
&lt;p&gt;base facts:
I’m having to keep things as dry as possible to deal with this rash.
I’m putting honey on my ripped stitches to aid in healing.
When I have honey on me I have to wear underwear and a pad to keep from accidentally honeying things.
Underwear and pad help trap in moisture.&lt;/p&gt;
&lt;p&gt;realization:
The rash is a massive pain in the ass. Literally and figuratively.
The only downside to pausing honey, is longer healing time on the stitches.
There are a LOT of downsides to anything that increases the time it takes getting rid of this rash, and most of them are REALLY uncomfortable.&lt;/p&gt;
&lt;p&gt;If i stop putting on honey (temporarily) I can run around with no underwear (I have pee pads on the sitting places just in case of whatever) and get maximal exposure and drying time.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m going commando baby!&lt;/p&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-going-commando&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-going-commando&#34;&gt;
    Going Commando
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-going-commando&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;p&gt;I seem to have accidentally deleted the original unpixelated version of this.&lt;/p&gt;
&lt;p&gt;my crotch has been pixelated.&lt;/p&gt;
&lt;p&gt;In the distance you can see a flower bouquet.
&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/week_4_commando.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;

    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;p&gt;[Future edit: Going commando felt nice, but it didn&amp;rsquo;t help with the rash. The only thing that helped was when I finally got some baby powder.]&lt;/p&gt;
&lt;h4 id=&#34;posts-from-june-12th&#34;&gt;Posts from June 12th&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;rashes suck.&lt;/li&gt;
&lt;li&gt;rashes between your ass cheeks suck more.&lt;/li&gt;
&lt;li&gt;babies with diaper rash deserve more empathy&lt;/li&gt;
&lt;li&gt;still peeing on myself. Still getting gradually better but it&amp;rsquo;s a slow improvement now. Spraying myself down with a peri-bottle afterwards &amp;amp; the resulting moisture is probably half of the problem with the rash.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;posts-from-june-14th&#34;&gt;Posts from June 14th&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;having trouble focusing&lt;/li&gt;
&lt;li&gt;baby powder seems to be helping rash but it’s slow going&lt;/li&gt;
&lt;li&gt;got exhausted after taking shower and doing minor tasks afterwards that mostly involved standing up&lt;/li&gt;
&lt;li&gt;sat vertically while getting into a recliner and it didn’t feel terrible.&lt;/li&gt;
&lt;li&gt;tired of not participating in life.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;posts-from-june-15th&#34;&gt;Posts from June 15th&lt;/h4&gt;
&lt;p&gt;I woke up feeling like I&amp;rsquo;d crossed another healing threshold. Things just feel more &amp;ldquo;normal&amp;rdquo; today. The rash is finally uner control, and my vulva looks so good.&lt;/p&gt;
&lt;p&gt;I think the swelling is completely gone in my labia minora, and mostly gone in the labia majora. I finally have a good sense of what his work will look like in the end. I asked for pretty, visible labia, and he&amp;rsquo;s done a spectacular job.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m still healing where I ripped stitches, but it looks healthy, and now that the rash is under control I&amp;rsquo;m willing to take a chance and start applying honey again even though that means wearing underwear and pads again.&lt;/p&gt;
&lt;p&gt;I want to share pics and be like “OMG Look Look! Isn’t this amazing!” but also, I don’t want to be sharing pussy pics on social media. Doubly so when there is still unpleasant looking section where the stitches have ripped.&lt;/p&gt;
&lt;h3 id=&#34;week-5&#34;&gt;Week 5&lt;/h3&gt;
&lt;p&gt;Things are technically healing, but in some ways it also looks worse. I recommend not clicking.&lt;/p&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-week-5-status-photo&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-week-5-status-photo&#34;&gt;
    Week 5 Status Photo
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-week-5-status-photo&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;p&gt;Swelling has gone down, but that&amp;rsquo;s revealed the stitch at the top left of the V and the black spot at the bottom of the V has revealed more of the actual stitch. I&amp;rsquo;m happy with the progress, but it doesn&amp;rsquo;t look good.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/week_5.jpg&#34;
    alt=&#34;exactly what I just described.&#34;&gt;
&lt;/figure&gt;
    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;h4 id=&#34;posts-from-day-june-16th&#34;&gt;Posts from Day June 16th&lt;/h4&gt;
&lt;p&gt;I’m so weak. I think i’ve lost muscle mass everywhere it’s possible to loose muscle mass.&lt;/p&gt;
&lt;p&gt;I hate exercise, but I think that once I can, I’m going to have to start actually committing time to it. Otherwise I’ll continue to have the stamina of a… thing with very little stamina.&lt;/p&gt;
&lt;p&gt;blerg.  I was told that even at the 2 month mark I still shouldn’t use even the elyptical, and that’s about as low impact as you can get and still involve the legs.&lt;/p&gt;
&lt;p&gt;😮‍💨&lt;/p&gt;
&lt;h4 id=&#34;posts-from-june-17th&#34;&gt;Posts from June 17th:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;rash is under control. Hard to tell if completely gone because skin color between butt cheeks has always been darker than surrounding skin. Continuing to be vigilant with drying and use baby powder.&lt;/li&gt;
&lt;li&gt;really REALLY sick of process of keeping everything dry after using the bathroom&lt;/li&gt;
&lt;li&gt;healing around un-ripped stitches looks amazing. ripped area still making slow progress.&lt;/li&gt;
&lt;li&gt;no-one tells you that keeping a pad against your vulva 24hrs a day will make it all gross and sweaty. 😝&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In other news, I think I finally caught sight of my urethra. 🎉 Except, it seems to be pointed forwards, not out. If I’m right… well I’m pretty much guaranteed to always have messy bathroom visits which… I’m just going to hope I’m wrong on that.  My surgeon IS  a urologist, so 🤞 he didn’t eff that up.&lt;/p&gt;
&lt;p&gt;I’ll revisit this issue after the stiches are all gone. Right now i’m being extra cautious about not spreading things wide and accidentally ripping stitches, so the view is a bit compromised.&lt;/p&gt;
&lt;p&gt;[Future edit: I wasn&amp;rsquo;t right. It&amp;rsquo;s pointed the way it should be.]&lt;/p&gt;
&lt;h3 id=&#34;week-6&#34;&gt;Week 6&lt;/h3&gt;
&lt;p&gt;Finally not disturbing to look at, although there is still a little healing to be done at the bottom of the V.&lt;/p&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-week-6-status-photo&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-week-6-status-photo&#34;&gt;
    Week 6 Status Photo
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-week-6-status-photo&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;p&gt;The labia minora look pretty normal at this point except for the odd stitching weirdness on one of the. When I took this I thought the swelling was mostly gone. I was wrong. There&amp;rsquo;s still a fair amount of swelling that will go down.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/week_6.jpg&#34;
    alt=&#34;Decreased swelling, far less gross, a tiny bit of open wound at the bottom of the V.&#34;&gt;
&lt;/figure&gt;
    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;h4 id=&#34;posts-from-june-23rd&#34;&gt;Posts from June 23rd&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;waking up horny stopped after roughly 3.5 weeks. Libido has returned to normal (hardly any).&lt;/li&gt;
&lt;li&gt;have been dealing with a weird discomfort for about a week but it hasn’t shown up today, so 🤞&lt;/li&gt;
&lt;li&gt;there are lots of stiff suture ends poking out inside of me. occasionally uncomfortable. incredibly off-putting when I feel like exploring. ~1wk left until they’re all disolved.&lt;/li&gt;
&lt;li&gt;sitting is getting gradually less uncomfortable.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I wouldn’t say this is giving me “trans joy” per-se. More trans relief, trans contentment, trans finally-ness.&lt;/p&gt;
&lt;p&gt;Deep sigh of relief.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/day_36.jpg&#34;
    alt=&#34;A first person perspective photo showing the bottom of my t-shirt, the boy shorts underwear I&amp;#39;m wearing, and my extended legs. Of note, is the complete lack of bulge between my legs.&#34;&gt;
&lt;/figure&gt;

&lt;h4 id=&#34;posts-from-june-26th&#34;&gt;Posts from June 26th&lt;/h4&gt;
&lt;p&gt;One of the most surprising things about my surgery is how “normal” everything feels. Sure, there are details that are different and things I’m still learning, but you’d thinking that suddenly not dangly bits would take some getting used to.  But, I’ve never felt like “wow it’s weird not having that there anymore”.  It’s just weirdly… normal feeling. That idea seems so implausible to me, and yet…&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;body has closed up / sealed off all the ripped stitches except for a bit the width of my index finger at the bottom of the V&lt;/li&gt;
&lt;li&gt;still disturbing to slide a finger in and feel all the sutures that are tied off in there. Stiff little fibers poking out.  Sometimes I’ll shift and they’ll poke me from in there.&lt;/li&gt;
&lt;li&gt;sitting up’s still uncomfortable without donut, or very squishy chair.&lt;/li&gt;
&lt;li&gt;keep feeling like i’ve recently slammed a hard bicycle seat into my perineum&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;posts-from-june-27th&#34;&gt;Posts from June 27th&lt;/h4&gt;
&lt;p&gt;The problem with taking a picture of your vulva every day is that you go to open the photos app on your phone later that day and get a jump-scare like “HOSHIT VULVA!!”  because I don’t reallly expect to see amateur porn looking images in my photos album.&lt;/p&gt;
&lt;p&gt;Then I have to remind myself to “Hide” the image.&lt;/p&gt;
&lt;p&gt;side note: why Apple? Why can’t I have private albums? PLURAL Without some weird gyrations to get things in there?&lt;/p&gt;
&lt;h4 id=&#34;posts-from-june-28th&#34;&gt;Posts from June 28th&lt;/h4&gt;
&lt;p&gt;I think maybe, &lt;span class=&#34;underline&#34;&gt;maaaaybe&lt;/span&gt; I’ll be able to stop applying honey in a couple days. Everything’s so close to being healed across the top.  🤞&lt;/p&gt;
&lt;p&gt;Still feeling discomfort when I walk / do too much. Stairs seem to be especially prone to making things uncomfortable. Every now and then I’ll take a Tylenol to address that, but it’s not really bad. it’s more, why be in discomfort if you don’t need to be, and NOT being in discomfort will help healing.&lt;/p&gt;
&lt;h3 id=&#34;week-7&#34;&gt;Week 7&lt;/h3&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-week-7-status-photo&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-week-7-status-photo&#34;&gt;
    Week 7 Status Photo
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-week-7-status-photo&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;p&gt;The white you see at the bottom of the V here is almost entirely reflected light. In fact there&amp;rsquo;s very little white there.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/week_7a.jpg&#34;
    alt=&#34;Swelling has continued to go down, but the patch at the bottom of the V looks shiny and white.&#34;&gt;
&lt;/figure&gt;
    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;h4 id=&#34;june-30th--dr-s-checkup&#34;&gt;June 30th (Dr&amp;rsquo;s Checkup)&lt;/h4&gt;
&lt;p&gt;A friend took the day off of work to drive me the ~4hrs into Manhattan, and ~4hrs back. We haven&amp;rsquo;t spent a lot of time together since Covid so it was nice to catch up.&lt;/p&gt;
&lt;p&gt;Riding in the car was fine as long as I stayed extremely reclined.&lt;/p&gt;
&lt;p&gt;Met with the &lt;a href=&#34;https://en.wikipedia.org/wiki/Physician_assistant&#34;&gt;Physicians Assitant&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;She seemed quite pleased with the healing. Despite how good the labia minora look there’s still a fair amount of expected swelling going on behind the scenes.&lt;/p&gt;
&lt;p&gt;My urethra’s pointed the right way, &amp;amp; peeing will continue to get less messy as swelling goes down.&lt;/p&gt;
&lt;p&gt;Things are going well enough that there’s no need to make the trip to NYC again in 2-3 months&lt;/p&gt;
&lt;p&gt;There are still a LOT of stiches poking out inside, but she didn’t hesitate to reach in spread things wide when investigating. So, I don&amp;rsquo;t need to be as delicate with everything as I have been.&lt;/p&gt;
&lt;h4 id=&#34;posts-from-july-1st&#34;&gt;Posts from July 1st&lt;/h4&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-very-tmi-neovagina-surprises&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-very-tmi-neovagina-surprises&#34;&gt;
    Very TMI neovagina surprises
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-very-tmi-neovagina-surprises&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;p&gt;Happy Surprises&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;My pussy smells like pussy.&lt;/li&gt;
&lt;li&gt;Stick a finger inside, and it feels all slick and moist like a normal pussy.&lt;/li&gt;
&lt;li&gt;When aroused, the output of the cowpers gland (makes &amp;lsquo;pre-cum&amp;rsquo;) is plenty sufficent to play with yourself.&lt;/li&gt;
&lt;li&gt;How ridiculously &amp;ldquo;normal&amp;rdquo; the new configuration of bits feels.&lt;/li&gt;
&lt;li&gt;How effing good it looks even just 6 weeks out.&lt;/li&gt;
&lt;/ol&gt;
    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;h4 id=&#34;posts-from-july-4th&#34;&gt;Posts from July 4th&lt;/h4&gt;
&lt;p&gt;I’ve found blow-drying my crotch and butt-crack after a shower to be  very effective in the fight against rash from sweaty bits squished against me pre-surgery, and extra-cautious maintenance post-surgery.&lt;/p&gt;
&lt;p&gt;After six weeks, I find my 🧠 is still throwing out confused ⚠️warnings because my subsconscious can’t understand why it’s not feeling anything on the dangly bits as the warm air blows over me.&lt;/p&gt;
&lt;p&gt;🤦‍♀️&lt;/p&gt;
&lt;h3 id=&#34;week-8&#34;&gt;Week 8&lt;/h3&gt;
&lt;p&gt;Finally everything&amp;rsquo;s healed over!&lt;/p&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-week-8-status-photo&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-week-8-status-photo&#34;&gt;
    Week 8 Status Photo
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-week-8-status-photo&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;p&gt;Labia minora doing funky curvy things.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/week_8.jpg&#34;
    alt=&#34;there&amp;#39;s white at the bottom of the V but this time it&amp;#39;s actually there. The V is entirely healed over but still a dark pink color.&#34;&gt;
&lt;/figure&gt;
    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;h4 id=&#34;posts-from-july-8th&#34;&gt;Posts from July 8th&lt;/h4&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-mildly-disturbing-mental-imagery-re-stitches&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-mildly-disturbing-mental-imagery-re-stitches&#34;&gt;
    Mildly Disturbing Mental imagery re stitches
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-mildly-disturbing-mental-imagery-re-stitches&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;p&gt;Stitches are supposed to take ~6 weeks to dissolve. Sometimes less, sometimes more. It&amp;rsquo;s been 7.&lt;/p&gt;
&lt;p&gt;Problem is that sticking my finger inside myself becomes more disturbing every time I wash. So many stitches tied off in there - especially in the &amp;ldquo;dimple&amp;rdquo; - that it feels like pressing my finger into a slippery coarse-hair brush that muscles are pressing into my finger. I have to psyche myself up to wash in there, and it feels wildly Wrong™&lt;/p&gt;
&lt;p&gt;I know this will pass. I know they will dissolve, but in the meantime I&amp;rsquo;ve been developing serious mental hurdles about interacting with anything below the surface. Fortunately the hurdles are tied to the sensation of the &amp;ldquo;bristles&amp;rdquo; but I have no doubt there&amp;rsquo;ll be some spillover that lingers after they&amp;rsquo;re gone.&lt;/p&gt;
&lt;p&gt;Even writing this makes me want to shudder.&lt;/p&gt;
&lt;p&gt;Things will get better. This will pass… eventually. I just have to persevere.&lt;/p&gt;

    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;h4 id=&#34;posts-from-july-9th&#34;&gt;Posts from July 9th&lt;/h4&gt;
&lt;p&gt;Today was… difficult. Things hurt, and I was exhausted, but as i awkwardly struggled to get out of my chair right now, and accidentally pointed my bare ass at the window I thought &amp;ldquo;but I&amp;rsquo;ve got a great vagina&amp;rdquo;&lt;/p&gt;
&lt;p&gt;So. Yeah.&lt;/p&gt;
&lt;p&gt;Worth it.&lt;/p&gt;
&lt;h4 id=&#34;posts-from-july-12th&#34;&gt;Posts from July 12th&lt;/h4&gt;
&lt;p&gt;My groin has been sore for days. I don’t really understand why.  I’ve been taking extra care to not push things since it started but… 🤷‍♀️&lt;/p&gt;
&lt;p&gt;New phase of healing i guess. I remember the dr. saying something about swelling interfering with the ability to feel certain discomforts. I wonder if this is more of the same. Like the swelling has reduced enough on some internal stuff that I can now feel things I couldn’t before.&lt;/p&gt;
&lt;h3 id=&#34;week-9&#34;&gt;Week 9&lt;/h3&gt;
&lt;p&gt;More gradual healing.&lt;/p&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-week-9-status-photo&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-week-9-status-photo&#34;&gt;
    Week 9 Status Photo
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-week-9-status-photo&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;p&gt;The scar looks shiny because I&amp;rsquo;d just applied scar gel.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/week_9.jpg&#34;
    alt=&#34;improved healing. The red coloring of the scar has lightened since the last time and the labia have shrunk a little.&#34;&gt;
&lt;/figure&gt;
    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;h4 id=&#34;posts-from-july-17th&#34;&gt;Posts from July 17th&lt;/h4&gt;
&lt;p&gt;Two (+ a bit) month update:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;My default state seems to be &amp;ldquo;somewhat sore&amp;rdquo; lately.&lt;/li&gt;
&lt;li&gt;orgasm is achievable but really difficult because of the soreness, and the fact that reaching inside is a major turn-off with all those stitches still undissolved.&lt;/li&gt;
&lt;li&gt;found a site that claims some of the more robust stitches can take up to 6 months to dissolve.  I&amp;rsquo;m not expecting that since my doc&amp;rsquo;s assistant predicted more like 6 weeks, but we&amp;rsquo;re closing in on 9 weeks now…&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Theoretically folks can go back to their desk jobs around the 2 month mark, so I&amp;rsquo;ve been putting that to the test in the mornings by going downstairs to my office. It&amp;rsquo;s been great to finally get back there, but I haven&amp;rsquo;t lasted beyond lunch.&lt;/p&gt;
&lt;p&gt;I can&amp;rsquo;t sit in a normal chair without a donut and sitting straight is doable but time limited. So, I&amp;rsquo;m leaning back, but that doesn&amp;rsquo;t work great with a donut.&lt;/p&gt;
&lt;p&gt;I feel bad for anyone who has to go back after 2 months. It&amp;rsquo;s doable, but not comfortable.&lt;/p&gt;
&lt;p&gt;Today I pushed how far I can walk when someone came to talk about helping clean up our flower beds.  I didn&amp;rsquo;t even go far, but I bailed early and let Wifey finish off the conversation without me.&lt;/p&gt;
&lt;p&gt;Now I&amp;rsquo;m back upstairs after lunch feeling regret.&lt;/p&gt;
&lt;h4 id=&#34;posts-from-july-20th&#34;&gt;Posts from July 20th&lt;/h4&gt;
&lt;p&gt;Body: Hey. How about a sharp stabby pain to the cooch?
Me: Um. No thank you.
Body: tough shit. 🔪🔪🔪&lt;/p&gt;
&lt;p&gt;Apparently I have attempted to do too much yesterday &amp;amp; today. I have retired upstairs, to lay on my back, and taken a Tylenol.&lt;/p&gt;
&lt;h3 id=&#34;week-10&#34;&gt;Week 10&lt;/h3&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-week-10-status-plus-inside-look&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-week-10-status-plus-inside-look&#34;&gt;
    Week 10 Status Plus Inside Look
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-week-10-status-plus-inside-look&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;p&gt;Things are healing nicely. If you look closely at the top of the labia minora you can see a tiny white stitch getting ready to come loose.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/week_10.jpg&#34;
    alt=&#34;more healing, and a small white stitch has appeared on the labia minora.&#34;&gt;
&lt;/figure&gt;
&lt;p&gt;I don&amp;rsquo;t really know what to call this bit of flesh behind the clitoral hood. If it&amp;rsquo;s my clit it&amp;rsquo;s a very long clit. If not, then I don&amp;rsquo;t know what it is. Unfortunately even two weeks after this I can&amp;rsquo;t really tell because of the stitches and swelling in there.&lt;/p&gt;
&lt;p&gt;[Future edit: Not my clit. Just swollen labia minora.]&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/week_10_clit.jpg&#34;&gt;
&lt;/figure&gt;

    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;p&gt;It was somewhere during week 10 that the sensation when I pee no longer felt notable. It&amp;rsquo;s just become &amp;ldquo;normal&amp;rdquo;.&lt;/p&gt;
&lt;h4 id=&#34;posts-from-july-21st&#34;&gt;Posts from July 21st&lt;/h4&gt;
&lt;p&gt;9 week update:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;inside still filled with stitches 😢&lt;/li&gt;
&lt;li&gt;felt like yesterday was first real setback after pushing self too hard day before&lt;/li&gt;
&lt;li&gt;Managed a whole day in office chair without it feeling notable&lt;/li&gt;
&lt;li&gt;still can&amp;rsquo;t sit in chair comfortable without donut&lt;/li&gt;
&lt;li&gt;still sleeping in different bed because sleep schedule still completely effed&lt;/li&gt;
&lt;li&gt;daily soreness decreasing overall&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;posts-from-july-23rd&#34;&gt;Posts from July 23rd&lt;/h4&gt;
&lt;p&gt;We were just having one of our morning, breakfast discussions and came to the realization that despite being over 50 years old, I am only today learning that I don’t actually I have an understanding of the concept of pain that matches up with anyone else else’s.&lt;/p&gt;
&lt;p&gt;While, I think I was in essentially no pain after surgery I may have actually been at a three or four? For like a month?&lt;/p&gt;
&lt;p&gt;Why did no-one ever give me a pain scale with descriptive words?&lt;/p&gt;
&lt;p&gt;Apparently most everything i call “discomfort” other people consider mild(ish) forms of “pain”&lt;/p&gt;
&lt;p&gt;I still don’t understand, and I don’t actually know what to do about it, but apparently that’s a thing.&lt;/p&gt;
&lt;p&gt;In related news: Yesterday evening I was laying on the couch, experiencing a pretty decent amount of “discomfort” in my ingual canals, and unconsciously attempted to adjust my (tucked) testicles… that don’t exist. 🤦‍♀️&lt;/p&gt;
&lt;p&gt;All this came about because wifey said  “People who haven&amp;rsquo;t had major surgery don&amp;rsquo;t generally have a concept  of real pain”‡ And I responded that I had had major surgery, but hadn&amp;rsquo;t actually experienced any notable pain so I guess I still didn’t.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s so much shit that everyone assumes &amp;ldquo;everybody knows&amp;rdquo; but never actually gets discussed.&lt;/p&gt;
&lt;p&gt;&amp;ndash;
‡  paraphrased, &amp;amp; chronic pain had already been discussed&lt;/p&gt;
&lt;h4 id=&#34;posts-from-july-24th&#34;&gt;Posts from July 24th&lt;/h4&gt;
&lt;p&gt;I wanted to be helpful, so I tried to make waffles today. I gathered all the ingredients, then made sure to sit down while mixing everything I could.&lt;/p&gt;
&lt;p&gt;By the time I was done melting butter and warming milk my groin was very unhappy.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s so frustrating.  I feel &lt;span class=&#34;underline&#34;&gt;mostly&lt;/span&gt; fine when I’m just siting around and it’s driving me buggy not helping.&lt;/p&gt;
&lt;p&gt;Then, both batches of waffles came out all dark and terrible smelling. We haven’t figured out why.&lt;/p&gt;
&lt;h3 id=&#34;week-11&#34;&gt;Week 11&lt;/h3&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-week-11-status-photo&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-week-11-status-photo&#34;&gt;
    Week 11 Status Photo
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-week-11-status-photo&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/week_11.jpg&#34;
    alt=&#34;Another day, another vulva. Healing continues. Nothing terribly notable going on in this one.&#34;&gt;
&lt;/figure&gt;

    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;h4 id=&#34;posts-from-july-28th&#34;&gt;Posts from July 28th&lt;/h4&gt;
&lt;p&gt;Week 10 update:
Week 9… was not good. Doing too much walking and stairs 2 Saturdays ago set me back, and I keep thinking I&amp;rsquo;m ok again, but i&amp;rsquo;m not, and i try to do things and the end result is that after feeding dogs, and cleaning catbox, I couldn&amp;rsquo;t sit in my office chair for 2hrs today.&lt;/p&gt;
&lt;p&gt;Gave up. went upstairs to take drugs, and flop on my back&lt;/p&gt;
&lt;h4 id=&#34;posts-from-august-7th&#34;&gt;Posts from August 7th&lt;/h4&gt;
&lt;p&gt;In 4 days it will have been 3 months since the surgery. That&amp;rsquo;s when you&amp;rsquo;re theoretically ready to start doing regular activities again. I&amp;rsquo;m not there, but it&amp;rsquo;s frustrating because I generally feel fine. I &lt;span class=&#34;underline&#34;&gt;want&lt;/span&gt; to help run around doing things, but I can&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;I made waffles this weekend and all the little back and forth this weekend made me ache &amp;amp; by the end I had no fucks left to give.&lt;/p&gt;
&lt;p&gt;I circumnavigated the house yesterday &amp;amp; went to the end of the driveway &amp;amp; back. I felt the results for a while afterwards.&lt;/p&gt;
&lt;p&gt;But, I can sit at my desk all day now as long as I have my donut. Normal walking around the house in short bursts doesn&amp;rsquo;t really bother me unless I&amp;rsquo;ve pushed myself too far doing something specific. So that&amp;rsquo;s good.&lt;/p&gt;
&lt;p&gt;Stairs still have way more of an effect afterwards than I expect. I don&amp;rsquo;t notice anything when using them.&lt;/p&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-more-stitches-tmi-and-negative-mental-health-stuff&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-more-stitches-tmi-and-negative-mental-health-stuff&#34;&gt;
    More Stitches TMI and negative mental health stuff
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-more-stitches-tmi-and-negative-mental-health-stuff&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;p&gt;The region is &lt;span class=&#34;underline&#34;&gt;very sensitive&lt;/span&gt; once you gain access, but as soon as I do I&amp;rsquo;m touching the Upper Bristle Forest (UBF) which is situated directly against incredibly sensitive flesh.&lt;/p&gt;
&lt;p&gt;Stitches do seem to &lt;span class=&#34;underline&#34;&gt;finally&lt;/span&gt; be starting to dissolve in there, but the UBF is like a patch of really stiff 2 day beard stubble, except it&amp;rsquo;s pressed against the most sensitive part of your anatomy.&lt;/p&gt;
&lt;p&gt;Sticking a finger in there is the most disturbing un-erotic thing I&amp;rsquo;ve ever felt.&lt;/p&gt;
&lt;p&gt;Between it and the Lower Bristle Forest (LBF) in the front of my dimple (dorsal side of anterior wall) I don&amp;rsquo;t really know what I feel like inside.&lt;/p&gt;
&lt;p&gt;Again, stitches were supposed to be dissolved in 6 weeks. At the current rate I expect at least 1mo more before they&amp;rsquo;re gone. Prolly 2.&lt;/p&gt;
&lt;p&gt;Cleaning is an unpleasant &amp;ldquo;get in. get out&amp;rdquo; operation.&lt;/p&gt;

    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-tmi-masturbation&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-tmi-masturbation&#34;&gt;
    TMI Masturbation
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-tmi-masturbation&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;p&gt;Orgasm is achievable but physically hampered because I can&amp;rsquo;t touch anything inside without rubbing bristles. So, I just have to rub my vulva which means wiggling the nearby scar tissue back and forth which, makes me feel sore, which isn&amp;rsquo;t really a turn-on.&lt;/p&gt;
&lt;p&gt;The clitoral tissue is definitely doing its job, but if I don&amp;rsquo;t reach inside it&amp;rsquo;s separated by nearly 1cm of tissue that gets compressed when rubbing so it&amp;rsquo;s anything but &amp;ldquo;direct&amp;rdquo; stimulation.&lt;/p&gt;

    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;h3 id=&#34;week-12-three-months&#34;&gt;Week 12 Three Months&lt;/h3&gt;
&lt;p&gt;All the week 12 photos were shown in the summary at the top, but here&amp;rsquo;s the status photo since you&amp;rsquo;re so far away from the top of the page now.&lt;/p&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-week-12-status-photo&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-week-12-status-photo&#34;&gt;
    Week 12 status photo
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-week-12-status-photo&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;p&gt;What&amp;rsquo;s notable here is how the labia minora are no longer doing the curvy thing so much as a mirrored V shape. It seems to vary from day to day what they&amp;rsquo;ll be doing when I take a picture.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/week_12.jpg&#34;
    alt=&#34;The culmination of 3 months of healing.&#34;&gt;
&lt;/figure&gt;
    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;p&gt;And here&amp;rsquo;s a somewhat silly picture showing how I do maintenance with a mirror held between my feet.&lt;/p&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-how-i-do-maintenance&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-how-i-do-maintenance&#34;&gt;
    How I do maintenance
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-how-i-do-maintenance&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/week_12_maintenance.jpg&#34;
    alt=&#34;A first person perspective photo showing a square mirror held between my feet that is reflecting my vulva back towards the camera.&#34;&gt;
&lt;/figure&gt;

    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;p&gt;So, how are things going after three months of healing?&lt;/p&gt;
&lt;p&gt;Pretty well. Most days I wake up feeling fine, or feeling mildly sore. Walking fast causes soreness, walking too much causes soreness, sitting on any firm seat or surface without a donut is uncomfortable. Lots of walking in a short amount of time causes soreness, as does too many stairs.&lt;/p&gt;
&lt;p&gt;I can ride in the car without a donut but I still have to be pretty reclined if I do. I can drive with a donut, but not for very long. I suspect my max is somewhere around thirty or forty minutes right now.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m able to help out around the house a little. I can chop veggies at the kitchen island without worry. I can take the dogs around the house once without soreness. I&amp;rsquo;ll see if I can do twice tomorrow.&lt;/p&gt;
&lt;p&gt;Peeing isn&amp;rsquo;t nearly as messy as it was. ⅔ of the time it just runs out the bottom of my slit. ⅓ of the time it runs in a stream down one butt cheek. I&amp;rsquo;m informed that this isn&amp;rsquo;t abnormal for cis girls, although I haven&amp;rsquo;t surveyed many.&lt;/p&gt;
&lt;p&gt;Masturbation still isn&amp;rsquo;t worth the effort most of the time. Things are too sore. The clitoral region is still hypersensitive, and reaching inside is still disturbing to be because of all the stitches.&lt;/p&gt;
&lt;p&gt;My &amp;ldquo;dimple&amp;rdquo; (a.k.a. vaginal canal) is only about 1cm deep, and this makes me sad. While I have no desire to use dildos or have sex with guys I did want to be able to feel what it was like to have something &amp;ldquo;inside&amp;rdquo; me.&lt;/p&gt;
&lt;p&gt;I still think it was the right choice to go with minimal depth, but if I could go back in time and talk to old me, I&amp;rsquo;d tell her to masturbate regularly so that I wouldn&amp;rsquo;t loose any &amp;ldquo;material&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;When Dr. Purohit measured me five weeks before surgery he measured approximately 9cm (3.5 inches). I assume that was from base to the corona (bottom of the head). Before restarting HRT 2 years ago I was probably about 15cm (5.9 inches) over the same section.&lt;/p&gt;
&lt;p&gt;The more I didn&amp;rsquo;t masturbate the more uncomfortable erections became, and the less I masturbated. The surgeons would have had a lot more to work with if I&amp;rsquo;d kept things up regularly.&lt;/p&gt;
&lt;p&gt;When I first got aroused after surgery the erectile tissue hurt just like it had before. Now, I&amp;rsquo;m happy to report that things just feel good when I&amp;rsquo;m aroused, and there&amp;rsquo;s plenty of natural lube to have fun. It wouldn&amp;rsquo;t be enough to lube up a full vagina, but for what I&amp;rsquo;m working with it works just fine. And yes, my panties get wet just like any cis girl&amp;rsquo;s.&lt;/p&gt;
&lt;p&gt;Unfortunately the stitches put a damper on reaching in and having any direct fun. It&amp;rsquo;s &lt;em&gt;such&lt;/em&gt; a disturbing sensation to feel those stitches.&lt;/p&gt;
&lt;p&gt;Speaking of, I don&amp;rsquo;t really know what things feel like down in my &amp;ldquo;dimple&amp;rdquo;. I&amp;rsquo;m pretty sure there&amp;rsquo;s nothing particularly arousing down there, but &lt;em&gt;holy shit&lt;/em&gt; are there a lot of stitches hiding just out of sight. I&amp;rsquo;ll revisit when they finally dissolve but I don&amp;rsquo;t have high hopes at the moment. I think it&amp;rsquo;ll just be an interesting area to play with that will feel good, but nothing that&amp;rsquo;d make me come.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t regret getting the surgery for a moment. I don&amp;rsquo;t regret not getting full depth.&lt;/p&gt;
&lt;p&gt;My advice to ladies getting bottom surgery is to go easy on yourself, both in terms of how you push yourself, and in terms of how much time you give yourself to heal when things are sore. You&amp;rsquo;re going to spend a frustrating amount of time on your back, but it&amp;rsquo;ll be worth it.&lt;/p&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-disturbing-description-of-masturbation-and-orgasm-after-3-months&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-disturbing-description-of-masturbation-and-orgasm-after-3-months&#34;&gt;
    Disturbing description of Masturbation and Orgasm after 3 months
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-disturbing-description-of-masturbation-and-orgasm-after-3-months&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;p&gt;Orgasm is achievable but physically hampered because I can&amp;rsquo;t touch anything inside without rubbing bristles. So, I just have to rub my vulva which means wiggling the nearby scar tissue back and forth which, makes me feel sore, which is definitely a turn-off.&lt;/p&gt;
&lt;p&gt;The clitoral tissue is definitely doing its job, but if I don&amp;rsquo;t reach inside it&amp;rsquo;s separated by nearly 1cm of tissue that gets compressed when rubbing so it&amp;rsquo;s anything but &amp;ldquo;direct&amp;rdquo; stimulation.&lt;/p&gt;

    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;p&gt;Masturbation gets better by Week 22…&lt;/p&gt;
&lt;h3 id=&#34;week-22-five-months&#34;&gt;Week 22 ~Five Months&lt;/h3&gt;
&lt;p&gt;Things are looking, and feeling better. The exposed portion of the stitches around my clit and my vaginal canal - a.k.a. my &amp;ldquo;dimple&amp;rdquo; - finally dissolved a little way into month four, which I&amp;rsquo;m incredibly thankful for. I think they&amp;rsquo;re still there under the surface, but I can&amp;rsquo;t detect them anymore so I&amp;rsquo;m thrilled.&lt;/p&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-week-22-status-photo&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-week-22-status-photo&#34;&gt;
    Week 22 status photo
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-week-22-status-photo&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/week_22.jpg&#34;&gt;
&lt;/figure&gt;

    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;h4 id=&#34;soreness-and-limitations&#34;&gt;Soreness &amp;amp; Limitations&lt;/h4&gt;
&lt;p&gt;Up until roughly four months after surgery I was &lt;em&gt;always&lt;/em&gt; sore. Now, I only notice the soreness when I press against my vulva (wiping, and masturbation).&lt;/p&gt;
&lt;p&gt;When I do something that taxes my groin too much - like carrying a 50lb (~22.5kg) bag - it does make me want to lay down for a while and not move, &lt;em&gt;but&lt;/em&gt; the discomfort doesn&amp;rsquo;t linger into the next day. At three months something like that could make me useless for a week.&lt;/p&gt;
&lt;p&gt;Sitting is improved, but I still use my donut when in my office chair or if I&amp;rsquo;m in the car for more than an hour. Squishy seats like the couch are fine, but harder surfaces are a problem. When I sit on something hard and flat it feels as if my vulva is a sphere that&amp;rsquo;s being pressed against. It&amp;rsquo;s as if he made the whole area bulge out farther. He didn&amp;rsquo;t, but it feels like that. I can only assume this is the result of internal swelling that hasn&amp;rsquo;t gone down.&lt;/p&gt;
&lt;h4 id=&#34;masturbation-and-orgasm&#34;&gt;Masturbation &amp;amp; Orgasm&lt;/h4&gt;
&lt;p&gt;Masturbation becomes more enjoyable as the soreness decreases. Earlier on, reaching orgasm involved pushing through the soreness. Now, I still feel the soreness while masturbating but it&amp;rsquo;s not enough to really hamper the experience. Also, my &lt;a href=&#34;https://en.wikipedia.org/wiki/Bulbourethral_gland&#34;&gt;bulbourethral glands&lt;/a&gt; continue to produce enough &amp;ldquo;lube&amp;rdquo; that - unless I&amp;rsquo;m using a toy - I don&amp;rsquo;t need to add any.&lt;/p&gt;
&lt;p&gt;Orgasms are &lt;em&gt;fucking amazing&lt;/em&gt;. Here&amp;rsquo;s how I described it to my wife:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;First, I want you to imagine a fluid with the viscosity of lube. Suspended in that fluid are glittery sparkles, each one of those sparkles represents a tingly sensation.&lt;/p&gt;
&lt;p&gt;Orgasms are a warm pressure that builds, until you can&amp;rsquo;t hold it any more and that warm glittery fluid spreads out through your body bringing warmth and pleasant tingles.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I had hints of that sensation before surgery, but now it&amp;rsquo;s so much more, and so much better.&lt;/p&gt;
&lt;p&gt;That being said, orgasms take a &lt;em&gt;lot&lt;/em&gt; more work to achieve, and &lt;em&gt;really&lt;/em&gt; require you to be in the right headspace. I haven&amp;rsquo;t been able to orgasm with a toy either, but maybe I just need to buy a &amp;ldquo;Magic Wand&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;The soreness isn&amp;rsquo;t really a problem &lt;em&gt;during&lt;/em&gt; masturbation, but after the last one I was sore in a way that I imagine a straight girl might be after being railed by a linebacker for two hours.&lt;/p&gt;
&lt;p&gt;On a related note, I discovered that slapping the labia over and around your clit isn&amp;rsquo;t just a weird thing porn stars do to turn on straight guys. It actually feels good. Who knew. I didn&amp;rsquo;t.&lt;/p&gt;
&lt;h4 id=&#34;internal-structures&#34;&gt;Internal Structures&lt;/h4&gt;
&lt;p&gt;While the outside looks great, things look non-standard inside. Mostly with regards to the clitoris. First off, there&amp;rsquo;s no &amp;ldquo;bean&amp;rdquo;. There&amp;rsquo;s a bit that&amp;rsquo;s extra sensitive, and is where you&amp;rsquo;d expect to find said &amp;ldquo;bean&amp;rdquo; but there&amp;rsquo;s nothing external there. Meanwhile the &amp;ldquo;&lt;a href=&#34;https://en.wikipedia.org/wiki/Bulb_of_vestibule&#34;&gt;bulbs&lt;/a&gt;&amp;rdquo; of the clitoris seem extra… bulbous. They look like an inflatable horseshoe going around a non-existent bean.&lt;/p&gt;
&lt;p&gt;I really have to reach in and spread to see these. Like, not in the way you&amp;rsquo;d see in straight porn, where the woman puts a finger on each side of the labia and pulls. Doing that looks relatively normal.&lt;/p&gt;
&lt;p&gt;To see the things I&amp;rsquo;m talking about requires going caving with a headlamp and safety gear, so maybe it&amp;rsquo;s normal looking and I&amp;rsquo;m just ignorant.&lt;/p&gt;
&lt;p&gt;Regardless of what things look like inside. Everything &lt;em&gt;feels&lt;/em&gt; good. The &amp;ldquo;bulbs&amp;rdquo; feel good. The non-bean feels good although it&amp;rsquo;s wicked sensitive and touching it directly is too much.&lt;/p&gt;
&lt;h4 id=&#34;depth&#34;&gt;Depth&lt;/h4&gt;
&lt;p&gt;I spoke earlier about depth. Before the surgery Dr. Purohit suggested that I&amp;rsquo;d probably end up with enough depth to get my middle finger in roughly to the middle knuckle, or about 2.5&amp;quot; (~6cm).&lt;/p&gt;
&lt;p&gt;As you can see, I ended up with essentially &lt;em&gt;no&lt;/em&gt; depth.  Pressure in my &amp;ldquo;dimple&amp;rdquo; doesn&amp;rsquo;t feel good.&lt;/p&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-demonstration-of-depth-of-my-dimple&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-demonstration-of-depth-of-my-dimple&#34;&gt;
    Demonstration of depth of my dimple
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-demonstration-of-depth-of-my-dimple&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    &lt;p&gt;This photo shows my finger &lt;em&gt;fully&lt;/em&gt; inserted. I couldn&amp;rsquo;t press it in any farther if I wanted to.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/08/11/week_21_depth.jpg&#34;
    alt=&#34;a photo of a finger inserted as far as it will go into my vagina. it goes in barely past the fingernail&#34;&gt;
&lt;/figure&gt;
    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;p&gt;In theory I &lt;em&gt;could&lt;/em&gt; do the same kind of dilation therapy an intersex person with a shallow vagina might, but I don&amp;rsquo;t really feel like pressing a hard rod into myself for twenty minutes a day, every day for however long it takes in order to have a cavity with no particular sensitivity.&lt;/p&gt;
&lt;h4 id=&#34;nerve-damage&#34;&gt;Nerve Damage&lt;/h4&gt;
&lt;p&gt;No change from before, but it is more detectable because the rest of me isn&amp;rsquo;t constantly sore. There&amp;rsquo;s a roughly circular area about 6&amp;quot; (~15cm) in diameter to the right of my vulva where I can&amp;rsquo;t feel anything at all. At this point I think it&amp;rsquo;s going to be permanent.&lt;/p&gt;
&lt;h3 id=&#34;the-end&#34;&gt;The End?&lt;/h3&gt;
&lt;p&gt;I&amp;rsquo;ll probably update this in a few months, but for now, this is the end.&lt;/p&gt;
&lt;p&gt;If anyone on Dr. Purohit&amp;rsquo;s team is reading this, THANK YOU. You were wonderful.&lt;/p&gt;
&lt;p&gt;And, if you made it this far 🙇‍♀️ Thank you for your time. If you&amp;rsquo;re on Mastodon / The Fediverse, please drop me a line at &lt;a href=&#34;https://connectified.com/@masukomi&#34;&gt;@masukomi@connectified.com&lt;/a&gt; and let me know what you thought.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The Interesting Problems With Hall Passes</title>
      <link>https://weblog.masukomi.org/2025/07/07/the-interesting-problems-with-hall-passes/</link>
      <pubDate>Mon, 07 Jul 2025 00:00:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2025/07/07/the-interesting-problems-with-hall-passes/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-interesting-problems-with-hall-passes&#34;&gt;The Interesting Problems With Hall Passes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#consequences&#34;&gt;Consequences&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;A &amp;ldquo;Hall Pass&amp;rdquo; - for those not familiar with the term - is an agreement between partners in a monogamous relationship that a given partner would be allowed to have sex with one or more specific celebrities if the opportunity arose.&lt;/p&gt;
&lt;p&gt;I was pondering this concept in the shower, and the more I considered it, the more interestingly problematic it became.&lt;/p&gt;
&lt;h2 id=&#34;the-interesting-problems-with-hall-passes&#34;&gt;The Interesting Problems With Hall Passes&lt;/h2&gt;
&lt;p&gt;A Hall Pass is an acknowledgement that&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;you or your partner find someone outside of your relationship sexually attractive.&lt;/li&gt;
&lt;li&gt;you or your partner would like to have sex with someone outside of your relationship.&lt;/li&gt;
&lt;li&gt;one partner craves something sexually that the other can&amp;rsquo;t provide.&lt;/li&gt;
&lt;li&gt;one partner is - theoretically - ok with the other partner having sex with someone outside their relationship.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Additionally Hall Passes are frequently discussed, and compared, publicly.&lt;/p&gt;
&lt;p&gt;But, here&amp;rsquo;s where it gets interesting. Hall Passes are an exclusively monogamous concept&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;. Monogamy is an agreement between two people to &lt;em&gt;not&lt;/em&gt; have sex or romantic relationships with other people.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It&amp;rsquo;s a cultural expectation that a monagamous person would get jealous if their partner made romantic or sexual advances towards another person.&lt;/li&gt;
&lt;li&gt;Sleeping with someone outside the relationship is not only a very common reason to dissolve the relationship, but if the couple is married it&amp;rsquo;s commonly a reason for a judge to defer to the person &amp;ldquo;cheated on&amp;rdquo; in matters of children and finances.&lt;/li&gt;
&lt;li&gt;Even if someone executed their Hall Pass with full consent, I suspect it would cause significant emotional problems within the relationship afterwards.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you have granted your partner a Hall Pass, you are explicitly stating that you are a practitioner of &lt;a href=&#34;https://en.wikipedia.org/wiki/Non-monogamy&#34;&gt;Ethical Non-Monogamy&lt;/a&gt;. That means you are explicitly &lt;em&gt;not&lt;/em&gt; monogamous. Furthermore, it means that your relationship with your partner is &lt;em&gt;also&lt;/em&gt; explicitly non-monogamous.&lt;/p&gt;
&lt;h2 id=&#34;consequences&#34;&gt;Consequences&lt;/h2&gt;
&lt;p&gt;The consequences are socially interesting.&lt;/p&gt;
&lt;p&gt;Anyone who professes to be monogamous but has also granted a Hall Pass is either lying about being monogamous OR lying about granting their partner that freedom. I&amp;rsquo;d encourage anyone who &lt;em&gt;has&lt;/em&gt; granted their partner a Hall Pass to spend some time introspecting, and trying to honestly answer which case is true.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re lying about the Hall Pass to your partner: Does your partner know you didn&amp;rsquo;t really mean it? Why did you think that was an acceptable thing to lie to them about knowing that it would seriously harm your relationship if they believed you and/or acted on it.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re lying about being monogamous it opens up lot more questions.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Have you publicly stated that (ethical) non-monogamy is bad / evil despite the fact that you&amp;rsquo;re non-monogamous?&lt;/li&gt;
&lt;li&gt;Why are you preventing yourself from receiving additional comfort, or love, or sexual enjoyment?&lt;/li&gt;
&lt;li&gt;Does your partner know? If not, will you tell them?&lt;/li&gt;
&lt;li&gt;Do you, or will you, publicly speak out in support of Ethical Non-monogamy so that other people like you can live their lives openly and proudly?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyone who has talked about their or their partner&amp;rsquo;s Hall Pass is publicly acknowledging their support of Ethical Non-monogamy. The concept of a &amp;ldquo;Hall Pass&amp;rdquo; is very popular in western culture, but western culture is also dominated by Christianity, which - despite the bible condoning it&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; - is very against non-monogamous relationships. So, if you&amp;rsquo;re a Christian who has received or granted a Hall Pass, what does that mean regarding your relationship to your church and/or religion?&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Technically &amp;ldquo;closed&amp;rdquo; polyamorous relationships exist, where the multiple partners agree there won&amp;rsquo;t be any romantic and/or sexual additions to the group. A Hall Pass &lt;em&gt;could&lt;/em&gt; theoretically exist in this form of ethical non-monogamy, but closed poly relationships seem to be pretty atypical.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;There are over 40 instances of non-monogamous relationships which the bible not only condones but lays out rules for. Admittedly, those were polygamous and the women didn&amp;rsquo;t generally have a choice, but the point here is that the Bible is very supportive of non-monogamous relationships.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>2025 Reading List</title>
      <link>https://weblog.masukomi.org/2025/06/22/2025-reading-list/</link>
      <pubDate>Sun, 22 Jun 2025 00:00:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2025/06/22/2025-reading-list/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-books&#34;&gt;The books&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#jan-june&#34;&gt;Jan-June&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#july-update&#34;&gt;July Update&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#october-update&#34;&gt;October Update&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;The following is a list of books I&amp;rsquo;ve read in 2025 along with some quick thoughts. It&amp;rsquo;s almost entirely comprised of sapphic romance. Book&amp;quot;s tagged with 🌟 are ones I think you should definitely consider reading.&lt;/p&gt;
&lt;p&gt;Most of the links are Amazon affiliate links, just because they&amp;rsquo;re shorter and easier to deal with. Amazon refuses to give me any money anyway so I don&amp;rsquo;t really care if you use them. 😉&lt;/p&gt;
&lt;h2 id=&#34;the-books&#34;&gt;The books&lt;/h2&gt;
&lt;h3 id=&#34;jan-june&#34;&gt;Jan-June&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;🌟[poly][sapphic] &lt;a href=&#34;https://amzn.to/46dJzbY&#34;&gt;The Homecoming&lt;/a&gt; (Constellation Book 4) by Sabrina Blaum
Loved it. Read it again months later and loved it just as much.
Told through a series of flashbacks this is the story of a mixed race, age-gap, throuple and what happens when one of them gets in a terrible car accident that leaves her in a medically induced coma. Through the flashbacks we learn how they came together. The present-day story-line is about the complexities of them all dealing with families who don&amp;rsquo;t know, and or don&amp;rsquo;t accept what they are to each other, or that they&amp;rsquo;re even gay. I love absolutely everything about this book.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/3T6dOtQ&#34;&gt;The Deal&lt;/a&gt; (Constellation Book 2)
Good. Don&amp;rsquo;t remember much of it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[non-binary] &lt;a href=&#34;https://amzn.to/3G9Jw6u&#34;&gt;Graceless&lt;/a&gt; (Grace Notes Book 2) by Ruby Landers
While the author is great, and this series is great, I disliked this book because one of the characters in the relationship (Lane) is a non-binary person who&amp;rsquo;s written male as fuck. Straight girls, and bi girls may enjoy this, but their male behavior / personality was a total turn-off for me. That being said, I&amp;rsquo;d still recommend reading it if you plan on reading Book 3. Because Cassidy&amp;rsquo;s character development is &lt;em&gt;huge&lt;/em&gt; in this and it makes Book 3 all the better.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/44718YF&#34;&gt;Saving Graces&lt;/a&gt; (Grace Notes Book 3)
Good, follows the story of the female protagonist in Graceless. Unfortunately you&amp;rsquo;ll get a lot more out of it if you read book 2 first.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🌟[sapphic] &lt;a href=&#34;https://amzn.to/44hh2jq&#34;&gt;Wolf Shirt &amp;amp; High Heels&lt;/a&gt; (Kissing At Work Book 1) by Evie Marque
Loved it. Way better than the blurb suggests. I loved the depth of characters, and complexity of the relationships between the protagonist and her love interest as well as her ex and her friends.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🌟[poly][sapphic] &lt;a href=&#34;https://amzn.to/4eeppAT&#34;&gt;Rhymes with Couple&lt;/a&gt;: A Carlsbad Village Lesbian Romance by Sabrina Kane
Loved it. There are a lot of books where &amp;ldquo;polyamory&amp;rdquo; is just a &amp;ldquo;permission to have sex with other people&amp;rdquo;. This book doesn&amp;rsquo;t. Despite feeling like it&amp;rsquo;s 90% steamy sex scenes (🥵), it is undeniably built on a foundation of love and respect between all three characters.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🌟[poly][sapphic] &lt;a href=&#34;https://amzn.to/3ZKAweJ&#34;&gt;Nanny in the Middle&lt;/a&gt;: a sapphic why choose romance (Love in Massachusetts) by Adrian J. Smith
Three women with kids roughly the same age love each other dearly, but aren&amp;rsquo;t romantically involved. One of them has a toxic ex who keeps causing nannys to leave. New nanny comes in, stands up to the ex, and brings everyone together. It&amp;rsquo;s complicated and a little messy in all the best ways.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/4lfHe4y&#34;&gt;Not in the Plan&lt;/a&gt;: A totally addictive and consuming lesbian romance by Dana Hawkins
Had to abandon this. Great writing. Great characters who I really wanted to watch the relationship about. However, there comes a point where Mack - a writer - believes its wrong to continue using inspiration from Charlie&amp;rsquo;s stories in her book, but continues doing so, and continues not admitting it. Mack has a good reason, but I just can&amp;rsquo;t handle spending so much time in the head of someone who feels they&amp;rsquo;re doing something hurtful and continues doing it and hiding it. I&amp;rsquo;m sure it all works out but…&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/44dnPKM&#34;&gt;The Princess Match&lt;/a&gt; by Clare Lydon
Really liked it. Good believable characters. Will probably read again someday. It&amp;rsquo;s the story of an in-the-closet British princess who falls for the captain of a popular women&amp;rsquo;s football (soccer) team.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/4l0JuNK&#34;&gt;The Librarian&amp;rsquo;s Gargoyle&lt;/a&gt;: A Cozy Sapphic Monster Romantasy by Evelyn Shine
Really enjoyed this. Can&amp;rsquo;t wait for the next book in the series. The protagonist just wants to be left alone to work in the local library and tutor kids while searching for magic she knows exists. Her parents mostly ignore her until marrying her off would make for a lucrative trade alliance. She grows up spending countless hours in the arms of a stone gargoyle she doesn&amp;rsquo;t know is alive. The plot unfolds as her parents get her fired and announce she is to be wed, while shades start attacking her for reasons unknown.&lt;/p&gt;
&lt;p&gt;Set in 1912 Paris, this does &lt;em&gt;not&lt;/em&gt; feel like a period piece. The time period feels more like a tool to enable the protagonist to plausibly be married off and have no real choice in the matter. Definitely deals with the idea of women being only valued for the offspring they can produce, and alliances they can buy.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a tiny bit too much action for me to call it &amp;ldquo;cozy&amp;rdquo;, but it&amp;rsquo;s &lt;em&gt;almost&lt;/em&gt; cozy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[poly][sapphic][manga][yuri] There&amp;rsquo;s Weird Voices Coming From The Room Next Door!
A erotic lesbian polyamorous story about falling in love with your neighbors. Fun, not too serious. &lt;a href=&#34;https://bookwyrm.social/user/masukomi/review/7221490/s/a-erotic-lesbian-polyamorous-story-about-falling-in-love-with-your-neighbors#anchor-7221490&#34;&gt;My full review on Bookwyrm&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/4kTBdeo&#34;&gt;Conflict of Interest&lt;/a&gt; (Portland Police Bureau Series Book 1) by Jae
I actually re-read this this year but I haven&amp;rsquo;t written about it before, so here you go.&lt;/p&gt;
&lt;p&gt;A psychologist is raped, and slowly learns to trust and love the female detective investigating her case. The detective&amp;rsquo;s a child of rape, and afraid of relationships as a result of childhood trauma.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s a very enjoyable slow burn, with no sex until the very end. The story is all about learning to trust, support, and accept, and it&amp;rsquo;s wonderfully done.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/40jj8Om&#34;&gt;Next of Kin&lt;/a&gt;: A Romantic Suspense Novel (Portland Police Bureau Series Book 2)
Kade&amp;rsquo;s focused on her career as an Assistant District Attorney who&amp;rsquo;s tired of dating men who don&amp;rsquo;t respect her career and see her as a beautiful trophy to win, and a way to access her family&amp;rsquo;s wealth. Lieutenant Del Vasquez is an older, down-to-earth butch Lesbian, who lets Kade know she&amp;rsquo;d love to date her, despite Kade&amp;rsquo;s claims of being straight.&lt;/p&gt;
&lt;p&gt;Meanwhile, Aiden - one of the main characters from Conflict of Interest - discovers she has a rebellious half-sister named Evan from the same rapist father, and her partner is the sister&amp;rsquo;s psychologist (until they find out). The sister coincidentally begins a relationship with Kade&amp;rsquo;s niece, and complications ensure when the neice&amp;rsquo;s homophobic parents catch them in the bedroom.&lt;/p&gt;
&lt;p&gt;The main story of Kade &amp;amp; Del is driven by an unknown stalker obsessed with Kade, who becomes increasingly upset with Del&amp;rsquo;s presence. The sub-plot is driven by the complicated fallout of Evan being caught, and Aiden learning to be a supportive big sister to a troubled girl.&lt;/p&gt;
&lt;p&gt;I love that this &lt;em&gt;isn&amp;rsquo;t&lt;/em&gt; an &amp;ldquo;oh I was a lesbian all along&amp;rdquo; story for Kade. Once she admits to herself that she has feelings for Del she identifies herself as bisexual. Better, it&amp;rsquo;s not because of an unwillingness or fear of admitting she&amp;rsquo;s a lesbian. She&amp;rsquo;s actually, confidently bi.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s lots to love about this book.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/4lhYBSj&#34;&gt;Change of Pace&lt;/a&gt; (Portland Police Bureau Series Book 3)
A ~50 page novella exploring the question of what happens when Kade&amp;rsquo;s stuck-up rich mother visits unexpectedly and has to spend a day with Kade and Del help their very normal - although mostly lesbian - friends as they help Aiden and Dawn (from Conflict of Interest and Next of Kin) move to a new place.&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t bother reading this if you haven&amp;rsquo;t read the first two books in the series. If you&amp;rsquo;ve read them you&amp;rsquo;ll enjoy this.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://amzn.to/4lfJwAG&#34;&gt;An Election&lt;/a&gt; - John Scalzi
I don&amp;rsquo;t remember much of this novella beyond it being comedic and entertaining.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/4lc3H2A&#34;&gt;The Song in My Heart&lt;/a&gt; by Tracey Richardson
I don&amp;rsquo;t remember any of this, but I gave it 4 stars.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[hetero] &lt;a href=&#34;https://amzn.to/4lk0A8V&#34;&gt;How I Proposed to my Wife&lt;/a&gt;: An Alien Sex Story ebook by John Scalzi
Normally I&amp;rsquo;m a fan of Scalzi, but I didn&amp;rsquo;t really like this at all.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/43XnLQF&#34;&gt;Wrong Number, Right Woman&lt;/a&gt; (Unexpected Love Book 3)
Shy butch lacking self-confidence is accidentally texted by an outgoing straight girl looking for her friends opinion on an outfit for a date. They end up chatting, and straight girl discovers she&amp;rsquo;s not so straight after all.&lt;/p&gt;
&lt;p&gt;This book is so sweet, and you&amp;rsquo;re absolutely rooting for both of the characters the whole way.&lt;/p&gt;
&lt;p&gt;Bonus points for trans representation in the form of a well written best friend who just happens to be trans.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/3HQJDVc&#34;&gt;Lucky Yellow Shoes&lt;/a&gt; (Unexpected Love Book 4) by Jae
A ~30 page novella follow-up to Wrong Number, Right Woman.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/44hkI4I&#34;&gt;Chemistry Lessons&lt;/a&gt; (Unexpected Love Book 5) by Jae
Two best friends go on a date to prove to their friend group that they&amp;rsquo;re not a good match romantically. Surprise, they are.&lt;/p&gt;
&lt;p&gt;I enjoyed this, like I enjoy everything Jae writes. Good. Not extraordinary.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/4k47A8K&#34;&gt;The Principal&amp;rsquo;s Office&lt;/a&gt; (Unexpected Love Book 6) by Jae
A ~20 page novella follow-up to Chemistry Lessons&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/4jZDUcY&#34;&gt;Bachelorette Number Twelve&lt;/a&gt; (Heart-to-Heart Medical Romance Series Book 1)
An enjoyable, and believable enemies-to-lovers story between an ice queen doctor and one of the nurses in the same ER.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t remember a ton from this book.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/3G8PLHO&#34;&gt;Impulse Buy&lt;/a&gt; (Heart-to-Heart Medical Romance Series Book 2) by Jae
A ~40 page novella followup to Bachelorette Number Twelve that I don&amp;rsquo;t remember anything about.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic][asexual] &lt;a href=&#34;https://amzn.to/4lhfdcW&#34;&gt;Perfect Rhythm&lt;/a&gt; (Fair Oaks Book 1) by Jae
I really liked this. Famous pop star (Leo) is tired of people wanting her for her fame, and re-unites with childhood friend (Holly) when she returns to her hometown after her father has a stroke. Things are complicated by the fact that Holly&amp;rsquo;s ace, and has a hard time believing Leo could ever be happy in a relationship with someone who couldn&amp;rsquo;t fulfill her sexual needs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/40dG2GW&#34;&gt;Not the Marrying Kind&lt;/a&gt; (Fair Oaks Book 2) by Jae
A complicated relationship between a butch baker and a neighborhood florist who is terrified to come out of the closet and disappoint her family.&lt;/p&gt;
&lt;p&gt;Doesn&amp;rsquo;t need to be read after Perfect Rhythm, but is better if you do.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/405kVXx&#34;&gt;Dreamer&lt;/a&gt; by Kris Byrant
I abandoned this half way through. The characters are interesting, and the plot twist (happens early on) is fine but I don&amp;rsquo;t like the way the resulting complications are handled. The more elements from before the twist overlap with post-twist things the less believable I found the character responses to them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[gay][aliens] &lt;a href=&#34;https://amzn.to/4kROZ0P&#34;&gt;Earth Fathers Are Weird&lt;/a&gt; by Lyn Gala
I loved this, and I generally can&amp;rsquo;t relate to male-male romance stories at all. Human Air-Force pilot gets saved by alien &amp;ldquo;cops&amp;rdquo; during an accidental invasion. He gets a job as a &amp;ldquo;nanny&amp;rdquo; to pay for a trip back, and starts caring for his tentacled employer, and eventually the kids they raise.&lt;/p&gt;
&lt;p&gt;The universal translators are crap when it comes to translating to and from English. This is a key plot point, and the resulting conversations where both sides are dealing with a limited and problematic vocabulary to communicate are &lt;em&gt;very&lt;/em&gt; well handled.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s sweet, and warm, with lots of heart, and love. And yes, there is tentacle sex. Not much, but surprisingly hot. Well, surprising for me because I&amp;rsquo;m not into tentacle sex &lt;em&gt;or&lt;/em&gt; sex with guys.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/4k8ocfH&#34;&gt;Release the Stars&lt;/a&gt; by Harper Bliss
Good, but not particularly memorable for me.
Charlie moves to Hollywood to write for a TV show after ex dumps her for a man. She vows to never date someone who isn&amp;rsquo;t &amp;ldquo;100% lesbian&amp;rdquo;, then proceeds to get seduced by a bi actress (Ava) she&amp;rsquo;s been crushing on for years. A lot of this is about Charlie&amp;rsquo;s fear of being dumped for a man again, and her hangup about only dating lesbians while being incredibly attracted to Ava who would love to have a real relationship with her.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/3ZIbBIQ&#34;&gt;And Then She Kissed Me&lt;/a&gt; by Harper Bliss
A sweet friend-to-lovers story with lots of moments of accepting supportive family.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/45viT6r&#34;&gt;The Duet&lt;/a&gt;: A Lesbian Age-Gap Rock Star Romance by Harper Bliss
Falling in love while singing a bad-ass duet on stage every night. An enjoyable age-gap romance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/3ZEh0k7&#34;&gt;Still The One&lt;/a&gt; by Harper Bliss
A friends-to-enemies-to-lovers story. I don&amp;rsquo;t remember much but I&amp;rsquo;m pretty sure it was relatively enjoyable, and on par with Harper Bliss&amp;rsquo;s other writing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/3ZGlwPc&#34;&gt;Something In The Wine&lt;/a&gt; by Jae
Annie&amp;rsquo;s brother Jake is an annoying practical joker. When he sets Annie up on a date with his friend Drew, they&amp;rsquo;re both pissed at him because Annie&amp;rsquo;s straight, and Drew&amp;rsquo;s a butch lesbian. They decide to pretend the date worked out, friendship, and then love ensue.&lt;/p&gt;
&lt;p&gt;This book had a lot of heart, and I really enjoyed it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/44qWZ34&#34;&gt;Departure from the Script&lt;/a&gt; (The Hollywood Series Book 2) by Jae
Photographer meets aspiring actress. Thank you becomes friendship, becomes love.&lt;/p&gt;
&lt;p&gt;A nice story.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/44q2qzk&#34;&gt;Damage Control&lt;/a&gt; (The Hollywood Series Book 3) by Jae
Famous actress (Grace) hires PR agent (Lauren) for &amp;ldquo;damage control&amp;rdquo; when papparazi share pictures of her and another woman.&lt;/p&gt;
&lt;p&gt;The basic plot is that Grace&amp;rsquo;s Mom has been her agent since she was a child actress, but Grace is a closeted lesbian as a result of her Mom being a controlling homophobe who&amp;rsquo;s instilled Grace with the fear that her career and everything else in her life will fall apart if anyone thought she was gay.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s a good story of Grace overcoming that fear, and breaking out of the toxic relationship with her mother.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/44bjzvv&#34;&gt;Just Physical&lt;/a&gt; (The Hollywood Series Book 5) by Jae
Jill&amp;rsquo;s an actress with Multiple Sclerosis refuses to let anyone in her heart because she doesn&amp;rsquo;t want to doom them to a life of supporting her physically if her MS progresses. She meets a stunt woman named Crash who&amp;rsquo;s willing to love her despite everything, but can Jill accept that it&amp;rsquo;s ok to let herself be loved despite her MS?&lt;/p&gt;
&lt;p&gt;Duh, of course she can. But, it&amp;rsquo;s a good story.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sappic][autistic] &lt;a href=&#34;https://amzn.to/3TB21E0&#34;&gt;The Woman Next Door&lt;/a&gt; by Harper Bliss
Olivia is an autistic book translator happily living in the woods with her cats and routines. Marie&amp;rsquo;s a surgeon who&amp;rsquo;s not into relationships, just good sex, but her world falls apart when a patient dies on her table. She goes to her family&amp;rsquo;s summer home and meets Olivia who has no interest in one-night-stands, or anything that would change her routines. Definitely not moving back to the city with Marie.&lt;/p&gt;
&lt;p&gt;Overall I liked this book, but I hated that the author refused to acknowledge, or even hint at the fact that Olivia was autistic. This isn&amp;rsquo;t a character that &amp;ldquo;could be read as autistic&amp;rdquo;. This is a character who can&amp;rsquo;t be read any other way.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/3GbxOZ9&#34;&gt;Good Bones&lt;/a&gt; (A Renovation Romance Book 2)
Abandoned. I couldn&amp;rsquo;t deal with the older woman&amp;rsquo;s on-again off-again feelings about dating a younger woman, or anyone. I didn&amp;rsquo;t find it believable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/3HQEYCC&#34;&gt;Twisted Lives&lt;/a&gt; by Ali Spooner
Abandoned. The characters were good, but everything happened implausibly fast. Bet runs away from an abusive husband with her kid, and breaks down on the side of the road by Alex&amp;rsquo;s driveway. Alex finds her stranded, and offers her a place to stay for the night. 24 hours later Bet&amp;rsquo;s kid has accepted Alex as her new 2nd mom, and Bet is throughly in love with her. The characters are decent, the story is even decent, but the speed at which everything happens is completely unbelievable and made it impossible for me to stay in the story.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/4477o2B&#34;&gt;Nothing to Loose&lt;/a&gt; by Clare Lydon
Scarlet&amp;rsquo;s life finishes falling apart when a flood destroys her home and the mayor (Joy) takes her in. Joy&amp;rsquo;s optimism meets Scarlet&amp;rsquo;s spiraling doom, and they find they really enjoy spending time with each other.&lt;/p&gt;
&lt;p&gt;I really enjoyed this one.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🌟[sapphic] &lt;a href=&#34;https://amzn.to/44seccy&#34;&gt;Broken Beyond Repair&lt;/a&gt;: A Sapphic Celebrity Ice Queen Romance (A South Downs Romance Book 1) by Emily Banting&lt;/p&gt;
&lt;p&gt;This one won a pile of awards and deserved every one. Beatrice is an actress who has closed off her heart and acted like a bitch to everyone around her. It&amp;rsquo;s eventually revealed that she&amp;rsquo;s had good reason, but there&amp;rsquo;s more going on than she knows.&lt;/p&gt;
&lt;p&gt;Sydney is her latest personal assistant, and Beatrice&amp;rsquo;s polar opposite, but she&amp;rsquo;s damn good at her job, and eventually cracks Beatrice&amp;rsquo;s protective shell.&lt;/p&gt;
&lt;p&gt;This is probably the best &amp;ldquo;Ice Queen&amp;rdquo; story I&amp;rsquo;ve read so far, because your heart goes out to Beatrice as the story gradually reveals &lt;em&gt;why&lt;/em&gt; she acts the way she does.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/449hn7E&#34;&gt;Teacher&amp;rsquo;s Pet&lt;/a&gt; (A Sweet Lesbian Romance)
Katie&amp;rsquo;s dates keep bailing the moment they find out she has a young kid. Lana is her daughter&amp;rsquo;s teacher, who helps her out of a jam. It really is a &amp;ldquo;sweet lesbian romance&amp;rdquo;. My only complaint was that it was too short.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sappic][trans] &lt;a href=&#34;https://amzn.to/3HT3O4T&#34;&gt;The Hatchling&lt;/a&gt; by Vyria Durav
You can &lt;a href=&#34;https://vyriadurav.itch.io/&#34;&gt;buy all of Vyria&amp;rsquo;s stuff&lt;/a&gt; directly via itch.io.&lt;/p&gt;
&lt;p&gt;A fantasy story of man teased for being effeminate. He&amp;rsquo;s forced to act as the healer for an obnoxious group of hunters who go after a dragon, despite the fact he thinks dragon&amp;rsquo;s shouldn&amp;rsquo;t be hunted. Long story short, he meets the dragon, is taken in and turned into a female dragon, and takes his revenge when they won&amp;rsquo;t leave them alone.&lt;/p&gt;
&lt;p&gt;Like all of Vyria&amp;rsquo;s stories, my only complaint is that I wish it was twice as long as it is, with more time for everything to build in the reader&amp;rsquo;s head.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[genderfluid] &lt;a href=&#34;https://amzn.to/3T6dyLr&#34;&gt;Only Mostly Dead&lt;/a&gt; by Allie Temple
Paused reading, but intend to come back. I stopped because there was &amp;ldquo;we need to save the world&amp;rdquo; stuff happening than I was in the mood for, but it&amp;rsquo;s a well written tale of a ghost and a very genderfluid reaper. In this story reapers aren&amp;rsquo;t from our dimension and can take on any shape they want.&lt;/p&gt;
&lt;p&gt;Honestly it was pretty good, just not what I wanted at the moment.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/4efbpXl&#34;&gt;Thankful&lt;/a&gt; (A Sweet Thanksgiving Romance) by Edie Bryant
Lesbian doesn&amp;rsquo;t tell straight best friend she&amp;rsquo;s into her because doesn&amp;rsquo;t want to ruin friendship. Straight best friend later discovers she&amp;rsquo;s bi after best friend moves away,but doesn&amp;rsquo;t tell her.&lt;/p&gt;
&lt;p&gt;Events happen, they learn they&amp;rsquo;re both into each other. And then the story falls apart for me because bi girl is like &amp;ldquo;OMG Yes my life&amp;rsquo;s dreams!&amp;rdquo; and suddenly &amp;ldquo;OMG we can&amp;rsquo;t be together because I think mom doesn&amp;rsquo;t approve of us as a couple.&amp;rdquo; Which… there was more going on but still it&amp;rsquo;s SO hot &amp;amp; cold for someone you&amp;rsquo;ve loved all your life that it&amp;rsquo;s hard to believe, and made her feel like a cruel jerk.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/3T13hjJ&#34;&gt;Fluid Bonding&lt;/a&gt;: a sapphic paranormal romance by Sienna Eggler
Secret telepath meets secret half-vampire. When their feelings grow they eventually admit what they are. I really enjoyed this.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic][transgender] Gone Was the Glow: prequel (St. Acton) by Sienna Eggler
This was good.&lt;/p&gt;
&lt;p&gt;Evangeline (Evan) is witch / half-vampire is mourning the loss of an incredible relationship with a butch werewolf who - after years together - went out one day and never came back.  Svenja is the werewolf PI - born not made thank you very much - who Evan hired to figure out what happened.&lt;/p&gt;
&lt;p&gt;Years later the half-vampire from fluid bonding helps kick off the story, by tracking down her half-sister (Evan) and kicking off a quest to find and eliminate their evil full-vampire father. Evan calls in Svenja, who moonlights as a monster hunter, while she&amp;rsquo;s falling in love with a woman who works at Evan&amp;rsquo;s school.&lt;/p&gt;
&lt;p&gt;The only problem I had was with the description of Svenja&amp;rsquo;s gender. At one point I thought they were female. Then I thought they were a trans man. In the end they&amp;rsquo;re a trans-masc person who dresses like a butch female? I think? I don&amp;rsquo;t really care &lt;em&gt;what&lt;/em&gt; they are, but the confusion around their gender wasn&amp;rsquo;t a plot point. It was just confusing writing and I wished it had been better established how I should be thinking about them early on in the story.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[agender][asexual] &lt;a href=&#34;https://amzn.to/4l2Jr3N&#34;&gt;The Thread That Binds&lt;/a&gt;: (The Eternal Library Book 1) by Cedar McCloud
Abandoned 40% through. Good characters. Good writing. The problem? One of the main characters is scrying day after day through the history of a book trying to find what happened to it. When ey - the story uses e/ey/eir for most characters - finally do she discovers that it contains some dangerous power that could be terrible in the wrong hands. Instead of going and talking to the people who hid it, or asking &lt;em&gt;any&lt;/em&gt; questions at all ey rush to tell their narcisistic boss who the story has established e doesn&amp;rsquo;t like, and doesn&amp;rsquo;t fully trust.&lt;/p&gt;
&lt;p&gt;The entire remaining story would be based on something that is completely unreasonable for the main character to have done.&lt;/p&gt;
&lt;p&gt;My full review &lt;a href=&#34;https://bookwyrm.social/user/masukomi/review/7770207#anchor-7770207&#34;&gt;here on Bookwyrm&lt;/a&gt; also discusses my problems with the author&amp;rsquo;s handling of the characters in an agender society.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/4k30Jwn&#34;&gt;Heart&amp;rsquo;s Claim&lt;/a&gt;: A Sapphic Shifter Romance (Where Our Paths May Cross Book 1) by Issy Waldrom
Our dimension collides with one of magic, fae, and dragons. Some people see the overlap, and remember. Some never saw. Our protagonist is protected from an evil character by a dragon, whom she later meets again in our world and rescues in another. Interesting things happen from there.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s hard to describe, but it&amp;rsquo;s good. After reading it I have some problems related to the villain, but nothing that would make me say don&amp;rsquo;t read it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic][transgender] &lt;a href=&#34;https://amzn.to/4neJXx8&#34;&gt;Esper And The Witch&lt;/a&gt; by Issy Waldrom.
The cover and many of the scenes make you think this is an &lt;a href=&#34;https://en.wikipedia.org/wiki/Isekai&#34;&gt;isekai&lt;/a&gt;, but I assure you it isn&amp;rsquo;t. It just happens that magic users in this world get visual status alerts when they &amp;ldquo;level&amp;rdquo; as if they were in a video game, but they&amp;rsquo;re not.&lt;/p&gt;
&lt;p&gt;Alex is slowly turning into a girl and doesn&amp;rsquo;t know why, but it&amp;rsquo;s also what he&amp;rsquo;s always wanted. He doesn&amp;rsquo;t know that magic exists. His coworker Selena does, and she tries to help support their transition without telling them. This story gradually intersects with the story of a kitsune named Esper who has snuck into the city and keeps waking up in someone&amp;rsquo;s bed.&lt;/p&gt;
&lt;p&gt;I really enjoyed this story. I loved the feel of Alex and Sabrina&amp;rsquo;s relationship. It&amp;rsquo;s sweet, and I&amp;rsquo;ll probably read it again. I&amp;rsquo;d love to see more stories in this world.&lt;/p&gt;
&lt;p&gt;However, at the end of the book we learn about the incident that kicked everything into motion, and it just confused me and left me wondering how Alex ended up at his job, why the kitsune went into the city, and so many more things. Also, the &amp;ldquo;Mother&amp;rdquo; of Selena&amp;rsquo;s magical family feels like an over-the-top Disney villain and I still don&amp;rsquo;t understand what her motivations are.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic][bisexual][transgender][poly] &lt;a href=&#34;https://amzn.to/4lcbxJy&#34;&gt;What Lies Within&lt;/a&gt; by Issy Waldrom
I really enjoyed this book, but the books blurb is a problem. It makes you think you&amp;rsquo;re going to be following the story of some guy who&amp;rsquo;s really unhappy with his life as a magical guardian. That&amp;rsquo;s not what the story is about &lt;em&gt;at all&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;In the setup we learn that the main character Frasier is in love with his roommate and male best Uriah, who loves him back. Frasier&amp;rsquo;s teased for being effeminate and was abused by his parents at a young age when they caught him running around in a dress.&lt;/p&gt;
&lt;p&gt;Things rapidly escalate after Frasier&amp;rsquo;s parents try to force him into an arranged marriage with Julia. Julia&amp;rsquo;s family is in dire straits and needs this arranged marriage. After meeting him, Julia likes Frasier and thinks he and Uriah are a great couple, and hints at the fact that the three of them might all be able to be together. Uria knows Frasier is trans even if Frasier hasn&amp;rsquo;t admitted it, and is doing their best to support them accepting this.&lt;/p&gt;
&lt;p&gt;Magic happens. Frasier&amp;rsquo;s trans ghost friend Felicia gets bound to him. Frasier starts transforming into a woman and calls herself Callie. They get trapped in a dying world, become a happy polycule, magic things happen. A new character is added to the group. Powers are gained. Secrets are revealed.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll probably reread this one. My only complaint is that characters are &lt;em&gt;way&lt;/em&gt; to accepting of things they shouldn&amp;rsquo;t be. For example (very minor spoiler) after knowing the Julia for like two days, a Vampire (don&amp;rsquo;t ask) offers to make Julia into a Vampire in order to give her powers (why?) but notes that she&amp;rsquo;ll only be able to feed off of Callie. Callie has no problem with being tied to someone she barely knows for the rest of her life. Julia doesn&amp;rsquo;t either once she confirms being out in the daylight isn&amp;rsquo;t a problem. Uriah doesn&amp;rsquo;t have an issue with this either. That was the biggest one but there were other &amp;ldquo;why are you just going ahead with this?&amp;rdquo; moments that you&amp;rsquo;ll just have to roll with.&lt;/p&gt;
&lt;p&gt;The vaguely annoying part is that all of those moments could have been given more pages between something being presented and acting on it, and it could have been believable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic][transgender] &lt;a href=&#34;https://amzn.to/4lmltAr&#34;&gt;Dawn Weaver&lt;/a&gt;: A tale of Dragon Riders (Soul Flames Book 1)
I abandoned this one 60% of the way through because it was becoming a story of a fantasy party who gradually gain incredible powers in order to save the world against impossible odds and it was just too much for me. I prefer things that aren&amp;rsquo;t completely over-the-top heroic fiction.&lt;/p&gt;
&lt;p&gt;The characters are good. It&amp;rsquo;s one of the few stories with a magical gender change that doesn&amp;rsquo;t feel like &lt;a href=&#34;https://en.wikipedia.org/wiki/Deus_ex_machina&#34;&gt;deus ex machina&lt;/a&gt;. If you want a D&amp;amp;D type story about saving the world against an evil villain give this a go. The gender transformation is honestly a minor side issue to the whole story.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🌟[sapphic][transgender][poly] &lt;a href=&#34;https://amzn.to/4neM1oS&#34;&gt;Catnip&lt;/a&gt; by Vyria Durav
You can &lt;a href=&#34;https://vyriadurav.itch.io/&#34;&gt;buy all of Vyria&amp;rsquo;s stuff&lt;/a&gt; directly via itch.io.&lt;/p&gt;
&lt;p&gt;This is a short comfort-read for me, which I reread recently. It&amp;rsquo;s not very thinky. It&amp;rsquo;s just cute.&lt;/p&gt;
&lt;p&gt;The earth has been decimated by capitalism. The rich evacuate. One rich egotistical character with a cult of personality following sets up a new colony on Venus. You need to just ignore the science and go with this.&lt;/p&gt;
&lt;p&gt;Hundreds of years later Sol is the first person sent there in advance of the rest of his polycule to prepare for everyone else&amp;rsquo;s arrival.&lt;/p&gt;
&lt;p&gt;Sol meets an AI named Alexis, falls into a vat of goo, and starts turning into a catgirl. As this proceeds Sol falls in love with the AI, realizes he&amp;rsquo;s been trans the whole time and just too thick to get any of the hints the folks in his polycule have been giving him. The more Sol changes, the happier he is, until he starts accepting himself as a girl and calling herself Callie.&lt;/p&gt;
&lt;p&gt;Meanwhile they&amp;rsquo;re trying to reclaim Alexis&amp;rsquo; missing memories, and unravel the mystery of what happened to the people in the colony.&lt;/p&gt;
&lt;p&gt;The relationship between Callie and Alexis is adorable. The story is fun. The rest of the polycule is only tangentially involved in the story via occasional video calls as they travel, and then at the very end.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic][transgender][poly] &lt;a href=&#34;https://amzn.to/4kYWdAu&#34;&gt;The Dragon and Her princess&lt;/a&gt; by Vyria Durav
You can &lt;a href=&#34;https://vyriadurav.itch.io/&#34;&gt;buy all of Vyria&amp;rsquo;s stuff&lt;/a&gt; directly via itch.io.&lt;/p&gt;
&lt;p&gt;Prince Darius is miserable as a prince, and disliked by his father, until he&amp;rsquo;s kidnapped by a dragon, agrees to marry her for story reasons, and wakes up transformed into a female dragon.&lt;/p&gt;
&lt;p&gt;Love and joy are found. Bad men are overthrown. The poly aspect of this is only in the epilogue.&lt;/p&gt;
&lt;p&gt;This is a fun, enjoyable read, but like much of Vyria&amp;rsquo;s stuff it would be much better if it was at least twice as long. Everything just happens too quickly. It&amp;rsquo;s plausible, but I want more build-up, and time to enjoy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/445P9Mt&#34;&gt;Taming of a Rebel&lt;/a&gt; by Eada Friesian
&amp;ldquo;Ice Queen&amp;rdquo; Miranda suddenly finds herself taking care of her sister&amp;rsquo;s kid. Taking care of the kid leads to meeting Tori a mother at the child&amp;rsquo;s daycare. Tori&amp;rsquo;s determined to meet her soulmate by the time she&amp;rsquo;s 30. Miranda&amp;rsquo;s determined to not accept anyone&amp;rsquo;s help despite how desperately she needs it.&lt;/p&gt;
&lt;p&gt;The relationship is complicated, and nothing goes smoothly, and I love this for that. I love how the two kids get along so well, and how much Tori comes to love Miranda&amp;rsquo;s niece.&lt;/p&gt;
&lt;p&gt;I really recommend this.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[hetero][transgender] &lt;a href=&#34;https://amzn.to/4ndupK3&#34;&gt;Chef&amp;rsquo;s Choice&lt;/a&gt; by T.J. Alexander.
Rich trans guy Jean-Pierre needs to have a girlfriend to be good enough to get a bigoted grandfather&amp;rsquo;s estate. In a desperate &amp;ldquo;because she was there&amp;rdquo; moment he ends up hiring Luna (a trans woman) to be his girlfriend for the duration of a phone call. This leads to hiring her to help him in some cooking challenge, which leads to them falling in love.&lt;/p&gt;
&lt;p&gt;They&amp;rsquo;re not at all alike, and a lot of the story&amp;rsquo;s complications center around the fact that Jean-Pierre has had zero support in his transition and has no community or found family. Luna is out and proud.&lt;/p&gt;
&lt;p&gt;Overall good, not great.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[poly][sapphic][agender] &lt;a href=&#34;https://amzn.to/44deDWK&#34;&gt;Triple Sec&lt;/a&gt; by T.J. Alexander
Mel&amp;rsquo;s a jaded butch lesbian bartender. She&amp;rsquo;s seduced by a hot femme named Bebe, who turns out to have &lt;em&gt;very&lt;/em&gt; non-binary / agender spouse named Kade. Mel decides to give Bebe a chance despite her spouse, and their very different worlds.&lt;/p&gt;
&lt;p&gt;The relationship between the three of them is complex and real feeling, and I love how Mel comes to respect and stand up for Kade despite how wildly different they are.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not my favorite poly story, but there&amp;rsquo;s a lot of good things in this book.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/3ZJdKUz&#34;&gt;Storm In Her Heart&lt;/a&gt; by KC Luck
Athena finds herself trapped in a winter storm with Kate, an ex-cop turned beer delivery driver who she&amp;rsquo;s been becoming close friends with. With them are Athena&amp;rsquo;s niece Lacey and her roommate love interest Max.&lt;/p&gt;
&lt;p&gt;The characters feel real, and I loved how different each one felt. The relationships felt nuanced and real, and the love felt earned.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🌟[sapphic] &lt;a href=&#34;https://amzn.to/4n8Hu7j&#34;&gt;Not for a Moment&lt;/a&gt; By: Cheyenne Blue
Andi doesn&amp;rsquo;t want to get involved with a woman with kids. She&amp;rsquo;s got too much trauma from her own childhood that she doesn&amp;rsquo;t want to pass on. Sarah&amp;rsquo;s Mom&amp;rsquo;s a bitch, and Andi ends up pretending to be her live-in partner to get her off her back one evening when they&amp;rsquo;re hanging out. Unfortunately she ends up needing to keep the ruse up to prevent Sara&amp;rsquo;s Mom from taking custody of her daughter Noa.&lt;/p&gt;
&lt;p&gt;Messy adult relationships with believable baggage, and Andi trapped in a situation she doesn&amp;rsquo;t want to be in, but also can&amp;rsquo;t walk away from because of how cruel it would be to let Noa be taken from Sarah.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://amzn.to/45voJEQ&#34;&gt;When the Moon Hits Your Eye&lt;/a&gt; by John Scalzi
Explores the question of &amp;ldquo;What would happen if the moon inexplicably turns to cheese?&amp;rdquo; Written in a series of little vignettes, this was a fun read.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/3T3WFkr&#34;&gt;A Breathless Place&lt;/a&gt; by Harper Bliss
Izzy Addler lost her voice ten years ago and no longer feels the need the need to keep living. She hasn&amp;rsquo;t let anyone know her plan. As one of her last acts she allows a writer named Leila come and help her finish her biography.&lt;/p&gt;
&lt;p&gt;This is the story of them falling in love, but is that enough when the only thing that ever gave Izzy life is gone?&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m upset that the fact that Izzy&amp;rsquo;s suicidal isn&amp;rsquo;t mentioned. That&amp;rsquo;s a hell of a trigger warning to skip, and I was &lt;em&gt;not&lt;/em&gt; prepared for it when I started reading. That being said, it&amp;rsquo;s a really well done book that handles the subject with grace. Recommended if you can deal with the subject matter.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/4lm5ZfD&#34;&gt;A Family Affair&lt;/a&gt; by Harper Bliss
Kate&amp;rsquo;s marriage is falling apart. After too many rounds of failed In Vitro Fertilization they&amp;rsquo;ve given up on their dream of ever having a baby. Kevin throws himself into the remodeling of their house, but can&amp;rsquo;t bring himself to spend any time with Kate. Kate is left alone in her stepmother&amp;rsquo;s home, spending time with her sister-in-law Stella.&lt;/p&gt;
&lt;p&gt;They bond, and then with the help of too much alcohol cross a line they immediately regret. Stella loves her brother. Kate loves her husband, even if their marriage is functionally dead. Neither of them wants to hurt him or their family, and yet…&lt;/p&gt;
&lt;p&gt;This isn&amp;rsquo;t about the taboo of an affair. This is about finding love when you&amp;rsquo;re hurting and alone.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve read this twice now and definitely recommend it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/3T061xL&#34;&gt;The Love We Make&lt;/a&gt; by Harper Bliss
An interesting and complicated romance between a very autistic coded actress (Nora Levine), and the new CEO of the production company that makes the TV show she works on (Mimi St James).&lt;/p&gt;
&lt;p&gt;Nora is a complicated character with strict routines, hard boundaries, and family trauma. Mimi loves her family more than anything, even though all her kids are grown.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s an interesting story that&amp;rsquo;s refreshingly different. Not for everyone, but I liked it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/40b57lS&#34;&gt;I Hope I Don&amp;rsquo;t Fall In Love With You&lt;/a&gt; by Harper Bliss
I don&amp;rsquo;t remember any of this.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/4ncYGbR&#34;&gt;Nothing Heals Me Like You Do&lt;/a&gt; by Harper Bliss
After being kicked out of her home Justine got herself off the streets and started a homeless shelter for queer youth. Now they want to make a movie about her life story, and she&amp;rsquo;s happy to sell the rights to it if it means more funding for the shelter.&lt;/p&gt;
&lt;p&gt;This is an age-gap romance between Justine, and the actress playing the part of her ex at a critical point in her life. Will Justine take a chance on someone so much younger, who grew up with family acceptance, and a privileged life?&lt;/p&gt;
&lt;p&gt;I liked this. Complicated emotions and lives make for good stories.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] The entire &lt;a href=&#34;https://amzn.to/44hCRzm&#34;&gt;Pink Bean series&lt;/a&gt; by Harper Bliss
Overall Good, but not great.&lt;/p&gt;
&lt;p&gt;The only one I recommend against is Love Without Limits. In prior books Caitlin has been set up as a polyamorous woman who has spent years educating people about ethical non-monogamy. Unfortunately the author seems to believe that polyamory and &amp;ldquo;lets sleep with other people&amp;rdquo; are the same thing. There&amp;rsquo;s no polyamory in this book. It&amp;rsquo;s just an open relationship. Which is fine, but it feels really out of character for her partner Josephine, especially the opening sex scene, and everything about this book sits wrong with me. It feels disrespectful to poly people, and dismissive of the idea of loving multiple partners.&lt;/p&gt;
&lt;p&gt;I believe I also skipped Beneath the Surface because it deals with an alcoholic main character, and how that effects her relationship. Unfortunately this isn&amp;rsquo;t noted in the blurb.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🌟&lt;a href=&#34;https://amzn.to/4n4WEKO&#34;&gt;Sex at Dawn&lt;/a&gt; by Christopher Ryan, and Cacilda Jetha
A look at the sex and the people and events that have changed our perception of it from pre-history until now.&lt;/p&gt;
&lt;p&gt;This is an excellent book, and I think everyone should read it, but every time I try and push a little farther through it I find myself pissed off by yet another moment in history where capitalism, male ego, and / or misogyny has fucked over women and society.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[heterosexual][bisexual][poly] &lt;a href=&#34;https://amzn.to/4njVCei&#34;&gt;The Harmony of Falling Snow&lt;/a&gt; A Polyamorous Romantasy (Songs of Niaretya Book 1) by Andora Brokaw
You can get this &lt;a href=&#34;https://frazzled-hedgehog.itch.io/the-harmony-of-falling-snow&#34;&gt;directly from the author on itch.io&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t have high expectations of this going in for two reasons: 1. It&amp;rsquo;s a story about two guys and a girl, and I&amp;rsquo;m not into guys. 2. Stories like this tend to do a poor job of deploying magic.&lt;/p&gt;
&lt;p&gt;I was happily surprised with what I found. Even better, there were over 500 pages of mostly &amp;ldquo;cozy&amp;rdquo; entertaining content.&lt;/p&gt;
&lt;p&gt;This is the story of Maggie, a woman deported from earth back to a magical world she&amp;rsquo;s never known. Her only contact is Yuri, an ex who left her and broke her heart, and he happens to help recently deported people settle into their new lives.&lt;/p&gt;
&lt;p&gt;In the intervening years Yuri fell in love with Vil, who he asks to host Maggie, but it too chicken-shit to admit that she&amp;rsquo;s his ex before she&amp;rsquo;s already there.&lt;/p&gt;
&lt;p&gt;Maggie grew up on earth believing that monogamy was the only &amp;ldquo;right&amp;rdquo; way. Here in the new world polyamory is the default. Unsurprisingly Maggie develops feelings for both men, and struggles with accepting that maybe it&amp;rsquo;s ok to love two people at once.&lt;/p&gt;
&lt;p&gt;Along the way we find out about Yuri&amp;rsquo;s mental health issues, the family secret he&amp;rsquo;s magically prevented from talking about, a group fighting for democracy in their land, and much more.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s a really sweet tale, where magic is never used as a crutch. It&amp;rsquo;s mostly just an element of the world until the climax when their individual powers - especially Maggie&amp;rsquo;s - become a very big deal.&lt;/p&gt;
&lt;p&gt;Loved the characters. Loved the writing. Can&amp;rsquo;t wait to read whatever the author puts out next.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic][transgender] &lt;a href=&#34;https://amzn.to/44gJguw&#34;&gt;Princess Fox and Iron Wolf&lt;/a&gt; by Liliana Chaos
You can get this &lt;a href=&#34;https://bottledchaos.itch.io/princess-fox-and-iron-wolf&#34;&gt;directly from the author on itch.io&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A fun tale about someone whose dumb luck finds them stumbling into their transness, accidentally becoming a villian&amp;rsquo;s minion, and totally crushing on the hot villainess who kidnapped her.&lt;/p&gt;
&lt;p&gt;Like many superhero books, things come a little too easily to the protagonist, but that&amp;rsquo;s kind-of the point of this book. It&amp;rsquo;s not about dark struggles, or questions of morality. It&amp;rsquo;s just some fun escapism.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic][transgender] &lt;a href=&#34;https://amzn.to/4exoefV&#34;&gt;That Night I Got Dragged Home By A Werewolf&lt;/a&gt; by Autumn Wolff
You can get this &lt;a href=&#34;https://autumnwolff.itch.io/werewolf&#34;&gt;directly from the author on itch.io&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I thought this was going to be a fairly normal transbian romance with a girlfriend that just happens to be a werewolf. That wasn&amp;rsquo;t even remotely true. This is way more in line with a typical urban fantasy. Magic powers, evil forces trying to kill the lovers, breaking curses, etc. It&amp;rsquo;s not bad. Some things are accepted and jumped into too quickly without any pause to think, which I wasn&amp;rsquo;t a huge fan of. Other than that, if you like typical urban fantasy stuff, you&amp;rsquo;ll like this.&lt;/p&gt;
&lt;p&gt;Loved the handling of the main character being a transgender woman with bottom dysphoria who still wants to have sexy-time with her lover.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🌟[sapphic][transgender] &lt;a href=&#34;https://amzn.to/3G05wkq&#34;&gt;The Postman Becomes A Bunny Goddess In Another World&lt;/a&gt; by Autumn Wolff&lt;/p&gt;
&lt;p&gt;You can get this &lt;a href=&#34;https://autumnwolff.itch.io/bunny&#34;&gt;directly from the author on itch.io&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The coziest of cozy novels. It&amp;rsquo;s sweet, low stakes, with characters you just want to snuggle up to. &lt;a href=&#34;https://bookwyrm.social/user/masukomi/review/7807502/s/a-sapphic-romance-that-feels-like-snuggling-a-fuzzy-bunny#anchor-7807502&#34;&gt;Here&amp;rsquo;s my full review.&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;july-update&#34;&gt;July Update&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;🌟[hetero][furry] &lt;a href=&#34;https://amzn.to/3IqdDHO&#34;&gt;My Minotaur Husband&lt;/a&gt; by Lyonne Riley&lt;/p&gt;
&lt;p&gt;You can &lt;a href=&#34;https://www.lyonneriley.com/product-page/my-minotaur-husband-epub&#34;&gt;get this directly from the author&lt;/a&gt; in eBook or signed paperback.&lt;/p&gt;
&lt;p&gt;Surprisingly sweet. In this world, Humans are highly desirable, but also almost extinct. A sweet shy minotaur named Theo puts in an application to date Celeste. It&amp;rsquo;s a short, adorable tale of dating &amp;ldquo;the shy guy&amp;rdquo; and finding he&amp;rsquo;s kind and caring and everything you wanted. It&amp;rsquo;s also filled with spicy scenes as Celeste and Theo gradually work up to the point where she can be filled with Theo who is, quite literally, hung like a bull.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not generally into &amp;ldquo;boy kissing&amp;rdquo; books, but Theo is just such a sweet guy that I didn&amp;rsquo;t have a problem with it. Also, as one reviewer said &amp;ldquo;consent is sexy&amp;rdquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;october-update&#34;&gt;October Update&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://amzn.to/47dSyJa&#34;&gt;The Kick-Ass Writer&lt;/a&gt; by Chuck Wendig
Meh. Didn&amp;rsquo;t really learn anything. Extremely male-centric viewpoint and filled with abelist language. Also his humor is basically to insert obviously over-the-top remarks in a way that&amp;rsquo;s funny once or twice but after the 40th time you just want him to shut the fuck up.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/3LfDUK1&#34;&gt;Upheaval - As we know it&lt;/a&gt; by Rita Potter
Pretty good, I liked the characters, but annoyed it was split into two books because absolutely &lt;em&gt;nothing&lt;/em&gt; is resolved by the end of the first one. I have the second one but I haven&amp;rsquo;t read it.&lt;/p&gt;
&lt;p&gt;A bunch of lesbians are having a party in an underground bunker when something happens to cause everyone above-ground to die. They emerge, find dead bodies, try to work out what&amp;rsquo;s happening, and the book ends.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[heterosexual][poly] &lt;a href=&#34;https://amzn.to/4ohPbYK&#34;&gt;Seduced by the Werewolves&lt;/a&gt; by Lyonne Riley
I think I unknowingly stumbled into some omegaverse adjacent stuff. It&amp;rsquo;s kinda sweet but the sexual relationships are extremely hierarchical.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t remember a lot from this. A woman ends up dating four male werewolves who are already in a relationship, her boss is an ass, lots of sex, knotting. Sweet vibe overall, but hierarchy in the bedroom was a turn off.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[heterosexual] &lt;a href=&#34;https://amzn.to/48vLudl&#34;&gt;My Ogre Husband by Lyonne Riley&lt;/a&gt;
Abandoned it 90% through. Just lost interest. Another in her series of series about humans being endangered, and coveted by &amp;ldquo;monsters&amp;rdquo;. Egorr is a sweet guy but I was just struggling to care much about this story.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[heterosexual?] &lt;a href=&#34;https://amzn.to/4nlbbBe&#34;&gt;Programmed for Love&lt;/a&gt; by Lyonne Riley
Woman falls in love with Android despite it being taboo. Android falls in love with woman despite thinking he&amp;rsquo;s not capable of such a thing.&lt;/p&gt;
&lt;p&gt;They work on a long haul space-ship, starting, and maintaining a taboo relationship. Meanwhile, someone&amp;rsquo;s trying to sabotage the ship and kill them all.&lt;/p&gt;
&lt;p&gt;Only complaint was that it was too short.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[heterosexual][poly] &lt;a href=&#34;https://amzn.to/4o206pQ&#34;&gt;Hour of the Lion&lt;/a&gt; by Cherise Sinclair
I have a seriously hard time believing this was written by a woman. The premise was good, but it was so much about what toxic male&amp;rsquo;s idea of relationships is that I just couldn&amp;rsquo;t keep reading.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[bisexual][poly] &lt;a href=&#34;https://amzn.to/48B0tTs&#34;&gt;Keeping the Human&amp;rsquo;s Heart&lt;/a&gt; by Lyonne Riley
Humans and trolls are at war. A human woman is forced to fight, gets injured, runs far away, and eventually hides in a farm building belonging to a couple of troll guys. One of them sees her as a pet (initially), the other sees her more as a person, they both find their hearts - and bodies - drawn to her. They keep her around even though doing so is a risk. Complications arise.&lt;/p&gt;
&lt;p&gt;I liked this one a lot.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[heterosexual] &lt;a href=&#34;https://amzn.to/4ot9D9d&#34;&gt;Bred by the Dragon&lt;/a&gt; by Lyonne Riley
Human woman works at surrogate agency because humans are compatible with all &amp;ldquo;monsters&amp;rdquo;. He falls in love with her. They run away together despite it breaking all the rules.&lt;/p&gt;
&lt;p&gt;Ok, not great.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[heterosexual] &lt;a href=&#34;https://amzn.to/47cOokG&#34;&gt;Winning the Orc&amp;rsquo;s Heart&lt;/a&gt; by Lyonne Riley
Action, adventure, fantasy, magic, true love. A fun romp. Human woman gets captured and taken prisoner. Orc guy feels drawn to her, and frees her when she&amp;rsquo;s being given to someone and he can&amp;rsquo;t stand the idea of what&amp;rsquo;s going to happen to her.&lt;/p&gt;
&lt;p&gt;The book is basically a series of chase sequences while the two characters fall in love despite the fact they &amp;ldquo;can&amp;rsquo;t possibly be together&amp;rdquo;, but it&amp;rsquo;s well done.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[heterosexual] &lt;a href=&#34;https://amzn.to/4qeGUqb&#34;&gt;So I Married an Alien&lt;/a&gt; by Lyonne Riley
Mail order alien husband. Alien guy applies to program just to get away from his horrible life. Human woman applies because she&amp;rsquo;s tired of being lonely. They fall in love, complications ensue when she discovers why he left his home and has trouble believing he really cared.&lt;/p&gt;
&lt;p&gt;Good, not great.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[heterosexual] &lt;a href=&#34;https://amzn.to/4qxU3en&#34;&gt;Healing the Orc&amp;rsquo;s Heart&lt;/a&gt; by Lyonne Riley&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Healing the Orc&amp;rsquo;s Heart is a super steamy, hurt/comfort monster romance novella that takes place during a war between humans and trollkin, so it contains wartime themes. It features size difference, language barrier, a soft, big-hearted healer FMC, and a grumpy orc MMC.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Pretty good.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/3WcUqgl&#34;&gt;Fire and Ice&lt;/a&gt; by Jess Mahler&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A PI looking for a missing kid in a city of monsters is met with a fae challenge. If she wishes to find the boy, she must endure the touch of fire and ice&amp;hellip;&lt;/p&gt;
&lt;p&gt;An F/f short story featuring temperature play and a prejudiced woman learning to do better.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It&amp;rsquo;s well done, and I&amp;rsquo;d love to see more about the world but it&amp;rsquo;s basically just setup, one BDSM scene, the end.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://amzn.to/4n8B5rq&#34;&gt;A Magical Girl Retires&lt;/a&gt; by Park Seolyeon &amp;amp; translated by Anton Hur
My first thought was &amp;ldquo;this sounds like it&amp;rsquo;s translated&amp;rdquo;. Then I found out it &lt;em&gt;was&lt;/em&gt; translated. The translation feels accurate, but a little… off. Not enough to hurt the reading, but it doesn&amp;rsquo;t flow as well as the translations of Banana Yoshimoto&amp;rsquo;s books.&lt;/p&gt;
&lt;p&gt;That being said, I don&amp;rsquo;t understand why this book exists. Girl&amp;rsquo;s about to commit suicide, is stopped by a Magical Girl, and told she&amp;rsquo;s a magical girl too. Gets her Magical Girl powers, discovers they&amp;rsquo;re interesting but come with a huge cost. Almost immediately a villain is introduced, they try and kill all the magical girls, her powers save the day, and because of the presence of many other magical girls the cost is spread. She retires. The end.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s like one of those stories a small child tells you that kind-of rambles and you&amp;rsquo;re not sure what the point is, but fortunately it ends quickly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[enbian][nonbinary] &lt;a href=&#34;https://amzn.to/3KWgvgD&#34;&gt;Emerald Moon: Nonbinary Werewolf Romance&lt;/a&gt; by Mel E Lemon&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Jo is struggling — struggling to control their wolf, deal with their family, manage their bipolar disorder, and make macarons perfect enough to sell at their pack’s bakery. So when it’s time to go to their sister’s wedding, who better to bring to help them get through it than their new friend Cass that they may have almost kissed? But fake dating isn’t as simple as it is in the stories Jo reads. Will family tensions and confusing feelings about Cass be a recipe for disaster? Or will Jo figure out a recipe for a new romance?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I was looking forward to this, and reread &lt;a href=&#34;https://amzn.to/4ql4bXM&#34;&gt;Violet Moon&lt;/a&gt; in advance to refresh my memory of Jo and some of the other characters. Jo deals with a lot of self-confidence issues, but I feel that it&amp;rsquo;s handled realistically and well.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic?] &lt;a href=&#34;https://amzn.to/4hm6vtu&#34;&gt;Off The Beaten Path&lt;/a&gt; by Sienna Eggler&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Fresh out of college, Meike boarded a train for their new destination: volunteering on a small farm. Aside from dorming, it was the first time they’ve been miles away from home, and were looking forward to expanding their horizons and padding out their resume. Unfortunately for Meike, their train took a drastic detour, leaving them and a fellow passenger stranded in the world of Glasend.&lt;/p&gt;
&lt;p&gt;With nowhere to go but forward, Meike is determined to utilize their knowledge of botany, and eke out a living as an herbalist. Along the way, they encounter a colorful cast of characters, study magic, and tame wild beasts and monsters.&lt;/p&gt;
&lt;p&gt;Off The Beaten Path is a queer portal fantasy, and part of an ongoing web serial.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It&amp;rsquo;s well written. The world they end up in is interested, but I lost interest in the story itself after a little while. I&amp;rsquo;m not sure what form the &amp;ldquo;queer&amp;rdquo; part of this takes. There was no romance even hinted at in the parts I got through.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m sure this book will work for some people, but not for me.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🌟 [nonbinary][aromantic] &lt;a href=&#34;https://amzn.to/4nSTWbb&#34;&gt;Early Adopter&lt;/a&gt; by Sienna Eggler&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Aided by their cybernetic eyes, private investigator Ryn Casler makes a living busting cheating spouses. While they’ll occasionally dabble in fraud and other typical cases, they don’t deal with the missing.&lt;/p&gt;
&lt;p&gt;Until the persistent Shae Winters, a police detective, approaches them about the disappearance of a young Black woman.&lt;/p&gt;
&lt;p&gt;Friction flies between detective and PI, as Shae insists on tagging along during the investigation. But as their search deepens and spills into the world of furry body mods, it becomes clear there’s more to this case than meets the eye.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Set in a near future where body-mods are common and black market surgeons can make you into the anthropomorphic animal of your dreams, Ryn is a non-binary, aromantic PI.&lt;/p&gt;
&lt;p&gt;Sienna is a master at writing compelling characters who are - I suspect - difficult for most people to relate to. As a person who loves being in love I found it difficult to relate to the fact that Ryn is aromantic. My brain kept expecting it to be revealed that they just have a tough emotional exterior, and that they&amp;rsquo;d eventually open up to Shae romantically, but no Ryn&amp;rsquo;s just aromantic.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t think that it&amp;rsquo;s ever mentioned that Ryn is aromantic, much like we don&amp;rsquo;t mention that we&amp;rsquo;re breathing mostly nitrogen. It&amp;rsquo;s just a thing that&amp;rsquo;s part of Ryn&amp;rsquo;s existing. I loved Ryn&amp;rsquo;s casual acceptance of sex work and sex workers. I loved the way they respects the wishes of the person they&amp;rsquo;re hired to find, and won&amp;rsquo;t reveal how to find her unless she says it&amp;rsquo;s ok.&lt;/p&gt;
&lt;p&gt;I love the setting. I love the obvious trans allegory that furry people exist, and are fetishized, but also shunned and not accepted by much of society because of their choice to live as the person they see themselves as. I love that they have to go through black market surgery to have the body they feel is right for them.&lt;/p&gt;
&lt;p&gt;I love all the characters, even the gross ones.&lt;/p&gt;
&lt;p&gt;I can&amp;rsquo;t wait to read the sequel.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🌟 [lesbian] &lt;a href=&#34;https://amzn.to/48SLFQf&#34;&gt;Enemies by Nature&lt;/a&gt;, &lt;a href=&#34;https://amzn.to/48SLLr5&#34;&gt;Shifting Nature&lt;/a&gt;, and &lt;a href=&#34;https://amzn.to/47elyAM&#34;&gt;Nature of Trust&lt;/a&gt; by Jae&lt;/p&gt;
&lt;p&gt;Faith is the daughter of the vocal leader of a major anti-shifter hate group. The shifter council proposes a fake relationship between her and a fox shifter named Tala because they have good reason to believe it will help them in the end. Faith&amp;rsquo;s dad encourages her to go along with it in order to spy on the shifters and reveal their evil plan.&lt;/p&gt;
&lt;p&gt;This is a story of overcoming internalized bigotry and learning to see an individual, and a people for who they really are. Faith learns to trust, and love Tala as well as their family, even though some members of that extended family hate Faith - and humans - just as badly as Faith&amp;rsquo;s father hates shifters.&lt;/p&gt;
&lt;p&gt;There are a &lt;em&gt;lot&lt;/em&gt; of ways Jae could have fucked this up, but I was really pleased with how well they introduced, and navigated the complications of the world and the character&amp;rsquo;s relationships.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🌟 [sapphic][transgender] &lt;a href=&#34;https://amzn.to/4nV482X&#34;&gt;Pack of Her Own&lt;/a&gt; by Elena Abbott&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Natalie Donovan jumps at a friend’s offer to stay in the family cabin for a month—she desperately needs the chance to get away from, and get over, her messy breakup. She doesn’t count on the owner of the local diner making her heart pound and her body desperate to be touched.&lt;/p&gt;
&lt;p&gt;Wren Carne is a lone wolf. As an Alpha shifter, she has no pack and maintains her territory without causing drama, just the way she likes it. When she checks on the girl staying in a local cabin, she’s not expecting her wolf to identify the human as her One True Mate.&lt;/p&gt;
&lt;p&gt;As fallout from their pasts encroaches upon the sleepy town of Terabend, Wren must decide if she wants a pack of her own, while Natalie worries that her secret—she’s transgender—might be too much for Wren.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;While I&amp;rsquo;m not a huge fan of the &amp;ldquo;fated mate&amp;rdquo; trope, I really liked this story. It&amp;rsquo;s atypically well written and edited. The fact that Natalie is trans is &lt;em&gt;only&lt;/em&gt; notable in that she&amp;rsquo;s scared that Wren won&amp;rsquo;t accept her when she finds out.&lt;/p&gt;
&lt;p&gt;I only have two complaints. The first is that there&amp;rsquo;s a major complication introduced that hurts both of them and could have been avoided entirely by simply &lt;em&gt;fucking talking to the person&lt;/em&gt;. I have difficulty putting up with that bullshit.&lt;/p&gt;
&lt;div class=&#34;spoiler &#34; &gt;
&lt;p&gt;
  &lt;a class=&#34;btn btn-primary&#34; data-bs-toggle=&#34;collapse&#34; href=&#34;#spoiler-second-complaint-is-minor-spoiler&#34; role=&#34;button&#34; aria-expanded=&#34;false&#34; aria-controls=&#34;spoiler-second-complaint-is-minor-spoiler&#34;&gt;
    Second complaint is minor spoiler
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class=&#34;collapse &#34; id=&#34;spoiler-second-complaint-is-minor-spoiler&#34;&gt;
  &lt;spoiler class=&#34;card&#34;&gt;
    &lt;div class=&#34;card-body&#34;&gt;
    When Natalie&amp;rsquo;s transness is inevitably revealed to Wren, Wren comments that she knew all along because she could smell the difference. I have two problems with this. First, your smell is based on hormones - trust me on this - and she wouldn&amp;rsquo;t be able to smell the difference if the person had been on hormones for years. Second, introducing this concept unnecessarily invalidates the idea that trans women are women by sticking a fucking asterisk on it. The author is trans, and I don&amp;rsquo;t think either of these slights was intentional, or that she even thought much about the implications, so I&amp;rsquo;m willing to give her a pass on it, but both things still bothered me.
    &lt;/div&gt;
  &lt;/spoiler&gt;
&lt;/div&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🌟 [sapphic][nonbinary] &lt;a href=&#34;https://amzn.to/4qli7ky&#34;&gt;Mate of her Own&lt;/a&gt; by Elana Abbot&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Heather McKenna has no idea how to be a werewolf. Her wolf might be free from its cursed cage but has shut the door between the two of them, leaving Heather still reeling from the emptiness. When Heather discovers her mother is in the hospital, she is certain that closure from the person who cursed her in the first place will settle her wolf’s grudge and is quick to pack a bag.&lt;/p&gt;
&lt;p&gt;V Raines sees the problems with werewolf society all around them. Despite being a nonbinary outcast in their own pack, they still have the responsibilities of being the Alpha’s only child. When their father attempts to pair them off with a dominant male pack member, V is all but ready to abandon their pack.&lt;/p&gt;
&lt;p&gt;When V is called to the hospital to take care of a possible rogue shifter, they aren’t ready for the consequences of finding their true mate in Heather. V’s all in as Heather worries she’s not wolf enough to stand between V’s intense pack and her true mate. Fate just made their lives a lot more difficult.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A good sequel to Pack of her Own, and just as well written. Heather has no self-confidence (for good reason) and is constantly self-sabotaging. Normally this is hard to read, but Elena confronted it up front by having Wren - from the prior book - explicitly state that Heather tended to do that, and that it was a problem. That, plus the way the author handled everything else made me keep reading despite Heather&amp;rsquo;s constantly pushing away anything good in her life because she can&amp;rsquo;t believe it&amp;rsquo;s real or that she deserves it.&lt;/p&gt;
&lt;p&gt;V&amp;rsquo;s a great character, and the fact that their non-binary is a well handled plot point.&lt;/p&gt;
&lt;p&gt;The &amp;ldquo;fated mate&amp;rdquo; aspect of it is what sets things in motion between V and Heather but I&amp;rsquo;m still not a fan of the trope. It makes things feel less earned - at least early on - and like the people involved don&amp;rsquo;t &lt;em&gt;really&lt;/em&gt; have say in the matter.&lt;/p&gt;
&lt;p&gt;Content warning: threats of rape, and refusal to accept that V&amp;rsquo;s non-binary.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sapphic] &lt;a href=&#34;https://amzn.to/4ncdtlQ&#34;&gt;Her [adjective] Dragon Mate&lt;/a&gt; - Crescent Lake Shifters series by Arizona Tape
A 10 book series of &amp;ldquo;fated mate&amp;rdquo; novellas. The core premise is that most dragons will never feel fulfilled in their relationship unless it&amp;rsquo;s with their fated mate. Dragonkin - humans who are the progeny of dragons ? I think ? - can be happy with or without their fated mate. If a dragon and their mate jump into a specific lake at a specific time of the month, the dragon&amp;rsquo;s unique mark will appear on the mate&amp;rsquo;s skin by the next morning.&lt;/p&gt;
&lt;p&gt;Overall they&amp;rsquo;re a quick enjoyable read, although they &lt;em&gt;really&lt;/em&gt; need a copy editor. Each one starting with two people who - for a different reason each time - aren&amp;rsquo;t together start to fall for each other, and eventually discover they&amp;rsquo;re fated mates. After that you get two quick chapters of &amp;ldquo;happily ever after&amp;rdquo; and it ends.&lt;/p&gt;
&lt;p&gt;I wasn&amp;rsquo;t a fan of how everything seemed to just cut off and end the moment the characters discover they are fated mates.&lt;/p&gt;
&lt;p&gt;Title adjectives are: rival, festive, fake, summer, sporty…&lt;/p&gt;
&lt;p&gt;She has another series about bear shifters who have the same fated mate + magic lake ritual theme.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://amzn.to/3KTaYaQ&#34;&gt;Hallow&amp;rsquo;s Cove series&lt;/a&gt;
A six book series, each by a different author. They all take place in the same quiet little town mostly populated by &amp;ldquo;monsters&amp;rdquo;. All of the stories involve a human woman finding their fated mate with a monster - or two in the case of Wolves &amp;amp; Whipped Cream. All well written and edited,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[heterosexual] &lt;a href=&#34;https://amzn.to/4qnBIk3&#34;&gt;Vacationing with the Vampire in Hallow&amp;rsquo;s Cove&lt;/a&gt; by Lyonne Riley
City programmer / gamer girl escapes work for a month and starts to fall for her closed off vampire who happens to own the AirBnB she&amp;rsquo;s staying in, and the bookstore downstairs.&lt;/li&gt;
&lt;li&gt;[heterosexual][furry] &lt;a href=&#34;https://amzn.to/47ASL9N&#34;&gt;Going Au Naturale at Hallow&amp;rsquo;s Cove&lt;/a&gt; by L.E. Elridge
City girl falls for farmer boy who happens to be a fawn.&lt;/li&gt;
&lt;li&gt;[heterosexual] &lt;a href=&#34;https://amzn.to/46ZXjra&#34;&gt;Love is Trash&lt;/a&gt; in Hallow&amp;rsquo;s Cove
Two extremely neurodivergent people find each other and realize that the other person is just as &amp;ldquo;weird&amp;rdquo; as they are and willing to accept them with all their strangeness. One of them happens to be a racoon shifter.&lt;/li&gt;
&lt;li&gt;[heterosexual] &lt;a href=&#34;https://amzn.to/4n6DKSN&#34;&gt;Gaming with the Gargoyle&lt;/a&gt; in Hallow&amp;rsquo;s Cove
He doesn&amp;rsquo;t tell her he loves her until it&amp;rsquo;s too late, then he gets a chance, but things are complicated.&lt;/li&gt;
&lt;li&gt;[polyamorous][bisexual][furry] &lt;a href=&#34;https://amzn.to/47dcHPs&#34;&gt;Wolves and Whipped Cream&lt;/a&gt; at Hallow&amp;rsquo;s Cove
A good story but too much hierarchical Omegaverse stuff for me when it comes to the sex scenes.&lt;/li&gt;
&lt;li&gt;[heterosexual][furry] &lt;a href=&#34;https://amzn.to/3L01XN0&#34;&gt;Screwed by the Minotaur&lt;/a&gt; in Hallow&amp;rsquo;s Cove
Average sized human woman meets giant minotaur. They proceed to have lots of sex and fall in love, but mostly they have sex.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>The Reason I Didnt Sleep Last Night</title>
      <link>https://weblog.masukomi.org/2025/05/08/the-reason-i-didnt-sleep-last-night/</link>
      <pubDate>Thu, 08 May 2025 00:00:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2025/05/08/the-reason-i-didnt-sleep-last-night/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-current-context&#34;&gt;The Current Context&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-shadow-over-everything&#34;&gt;The shadow over everything&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;I didn&amp;rsquo;t sleep last night. Not really. Not for any meaningful definition of &amp;ldquo;sleep&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d like to talk about why. I want to give Cisgender people a glimpse into what it&amp;rsquo;s like to be trans right now, and I&amp;rsquo;d like my transgender siblings to know they&amp;rsquo;re not alone.&lt;/p&gt;
&lt;p&gt;Before I do though, I need to make sure we all understand the current context.&lt;/p&gt;
&lt;h2 id=&#34;the-current-context&#34;&gt;The Current Context&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;The word “genocide” was first coined by Polish lawyer Raphäel Lemkin in 1944 in his book Axis Rule in Occupied Europe… Lemkin developed the term partly in response to the Nazi policies of systematic murder of Jewish people during the Holocaust, but also in response to previous instances in history of targeted actions aimed at the destruction of particular groups of people. Later on, Raphäel Lemkin led the campaign to have genocide recognised and codified as an international crime. - &lt;a href=&#34;https://www.un.org/en/genocide-prevention/definition&#34;&gt;The United Nations&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The United Nations - of which the USA is a member - has recognized genocide as a crime since 1946. When you say &amp;ldquo;genocide&amp;rdquo; to most people, I think they get images of war, or concentration camps: what the Nazis, and the Khmer Rouge did, and what Israel is doing. But genocide isn&amp;rsquo;t just about bullets and gas chambers. It&amp;rsquo;s about eliminating a people.&lt;/p&gt;
&lt;p&gt;The Convention on the Prevention and Punishment of the Crime of Genocide defines it as follows:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Article II&lt;/p&gt;
&lt;p&gt;&lt;em&gt;In the present Convention, genocide means any of the following acts committed with intent to destroy, in whole or in part, a national, ethnical, racial or religious group&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;, as such:&lt;/em&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Killing members of the group;&lt;/li&gt;
&lt;li&gt;Causing serious bodily or mental harm to members of the group;&lt;/li&gt;
&lt;li&gt;Deliberately inflicting on the group conditions of life calculated to bring about its physical destruction in whole or in part;&lt;/li&gt;
&lt;li&gt;Imposing measures intended to prevent births within the group;&lt;/li&gt;
&lt;li&gt;Forcibly transferring children of the group to another group.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;The United States is actively perpetrating genocide against transgender people. The government is removing our rights, our freedoms, our health care, and our safety. People are being rallied with hate-speech and lies that target us. Violence against us is on the rise. Trans kids were already at high risk of suicide, but now… I don&amp;rsquo;t want to know what the numbers are.&lt;/p&gt;
&lt;p&gt;Last year &lt;a href=&#34;https://truthout.org/articles/a-city-in-texas-just-put-10000-bounties-on-trans-people-using-the-bathroom/&#34;&gt;a city in Texas began offering a $10,000 bounty on trans people who dare to use a bathroom&lt;/a&gt; that conforms to their gender identity. In some states people can&amp;rsquo;t get driver&amp;rsquo;s licenses that reflect their gender even if they&amp;rsquo;ve gone through Gender Reassignment Surgery. In the US, your driver&amp;rsquo;s license is the primary form of ID that you have to show for even simple things like buying alcohol, or entering a nightclub.&lt;/p&gt;
&lt;p&gt;Every time a trans person is forced to reveal their birth gender, or name, they expose themselves to violence, rape, and murder.&lt;/p&gt;
&lt;h2 id=&#34;the-shadow-over-everything&#34;&gt;The shadow over everything&lt;/h2&gt;
&lt;p&gt;In eleven days I&amp;rsquo;ll be getting Gender Conforming Surgery (GCS)&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;. It&amp;rsquo;s something I&amp;rsquo;ve been dreaming of for over thirty years. My thoughts &lt;em&gt;should&lt;/em&gt; be filled with concerns about the surgery, the severe recovery, or how much I&amp;rsquo;m looking forward to the results. But the reality is, I&amp;rsquo;m not thinking about that. Every now and then I think about how I&amp;rsquo;ll finally feel &amp;ldquo;complete&amp;rdquo;, and about the huge weight that will be lifted. But those are just small thoughts that peek through the shadow of genocide, and my country&amp;rsquo;s descent into fascism.&lt;/p&gt;
&lt;p&gt;This has manifested two ways for me. The first is fear, and anxiety that something will happen between now and my surgical date to prevent it from happening. It feels like I&amp;rsquo;ve been holding my breath underwater for too long. The surface is in sight, but my lungs are burning and I&amp;rsquo;m afraid I won&amp;rsquo;t make it.&lt;/p&gt;
&lt;p&gt;The other is fear about &lt;em&gt;everything else&lt;/em&gt; and the fact that I can&amp;rsquo;t deal with that right now. Right now all my energy is going towards holding myself together and trying to make it to the surface. But… I can see the world crumbling around me as I rise, and I know that I will be physically &lt;em&gt;fucked&lt;/em&gt; when I emerge.&lt;/p&gt;
&lt;p&gt;If all goes well, I&amp;rsquo;ll be cleared to resume a normal - low-impact - life in &lt;em&gt;three months&lt;/em&gt;. For two weeks I&amp;rsquo;ll be exhausted, wracked with pain, unable to care for myself, and unable to move much. It is, in many ways, a real, physical rebirth, with all the attendant vulnerability. I should be concerned about this, and I am on some level, but more than that is the fear I&amp;rsquo;ll need to run, but not be able to. The fear that even after I&amp;rsquo;m recovered I&amp;rsquo;ll be forced to leave the wife, and home I love.&lt;/p&gt;
&lt;p&gt;My father was a British Jew. He hid in basements while Nazi&amp;rsquo;s rained bombs down on London. I don&amp;rsquo;t know how many family I lost in Nazi camps. I don&amp;rsquo;t want to know, but I will &lt;a href=&#34;https://www.myjewishlearning.com/article/putting-stones-on-jewish-graves/&#34;&gt;place a stone&lt;/a&gt;, and shed my tears in their memory. I will remember that my queer ancestors were placed in cattle-cars just like my Jewish ones. I will remember that when the US rallied its people against the forces of fascism in World War II, &lt;a href=&#34;https://en.wikipedia.org/wiki/Internment_of_Japanese_Americans&#34;&gt;we erected concentration camps of our own&lt;/a&gt;, and filled them with innocent citizens whose only crime was having Japanese ancestors. More recently we&amp;rsquo;ve thrown people who cross our borders into cages, &lt;a href=&#34;https://www.nbcnews.com/news/latino/deported-parents-may-lose-kids-adoption-investigation-finds-n918261&#34;&gt;stolen their babies, and sold them to white people&lt;/a&gt;&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;We created our concentration camps was when we were &lt;em&gt;fighting&lt;/em&gt; fascism. Now, the US is racing headlong towards a fascist state, and trying replace our fragile democracy with &lt;a href=&#34;https://en.wikipedia.org/wiki/Demagogue&#34;&gt;demagogue&lt;/a&gt; dictator. The Jews aren&amp;rsquo;t the primary scapegoat this time. It&amp;rsquo;s my siblings and me.&lt;/p&gt;
&lt;p&gt;So that, my friends, is why I didn&amp;rsquo;t sleep last night.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;It&amp;rsquo;s true that transgender people are not &amp;ldquo;…a national, ethnical, racial or religious group…&amp;rdquo; It&amp;rsquo;s also true that anyone who believes that a group being left out of a list makes it morally acceptable to commit genocide against them is a fucking ass-hole with no empathy, who deserves to burn in the worst available hell.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;GCS is also called Gender Reassignment Surgery (GRS), and is sometimes still referred to as Sex Reassignment Surgery (SRS) although that term is outdated.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;Some might argue that the babies were &amp;ldquo;put up for adoption&amp;rdquo;. And this is true, but that process involves giving people babies after the prospective parents hand over money. That&amp;rsquo;s a sale, and that ignores the fact that the babies were kidnapped from their parents in the first place.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Protests And Facial Recognition</title>
      <link>https://weblog.masukomi.org/2025/04/08/protests-and-facial-recognition/</link>
      <pubDate>Tue, 08 Apr 2025 00:00:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2025/04/08/protests-and-facial-recognition/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-reality-of-facial-recognition&#34;&gt;The Reality of Facial Recognition&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#fighting-facial-recognition&#34;&gt;Fighting Facial Recognition&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;Protesting isn&amp;rsquo;t the same as it was in the 90&amp;rsquo;s, or before. Going out with 90,000 to complain about government actions was relatively safe, and very few people &lt;em&gt;actually&lt;/em&gt; got arrested. You&amp;rsquo;d go. You&amp;rsquo;d show them how many people cared. You&amp;rsquo;d go home. End of story. &lt;em&gt;Maybe&lt;/em&gt; the riot cops would come and things would end with people running away.&lt;/p&gt;
&lt;p&gt;Now, showing up literally means adding your name to a public list of people who are opposed to what the government is doing. That&amp;rsquo;s not so bad if you&amp;rsquo;re an ally sticking up for other people. It&amp;rsquo;s not great if you&amp;rsquo;re one of the people being targeted by the government. Showing your face at a protest means telling them that you&amp;rsquo;re not &lt;em&gt;just&lt;/em&gt; someone they don&amp;rsquo;t like, but someone who deserves extra attention because you&amp;rsquo;ll make trouble for them.&lt;/p&gt;
&lt;h2 id=&#34;the-reality-of-facial-recognition&#34;&gt;The Reality of Facial Recognition&lt;/h2&gt;
&lt;p&gt;Let me tell you a story about the intersection of facial recognition and public protest. A few years after the &lt;a href=&#34;https://en.wikipedia.org/wiki/Boston_Marathon_bombing&#34;&gt;Boston Marathon Bombing&lt;/a&gt; I helped a local emergency management group (volunteer police) keep folks safe. I manned a radio tower and acted as the communication hub for our people. We were positioned by the start line next to the thousands of runners waiting for the start. One of the officers - let&amp;rsquo;s call him Ted - was a photographer, and took pictures of interesting things, including some of the various federal agents that were there.&lt;/p&gt;
&lt;p&gt;You see, the FBI, the Secret Service, and others use the Boston Marathon as real world practice. Even if nothing goes wrong, it&amp;rsquo;s a chance to go into the field, deploy their gadgets, and practice doing their job. Local police and &lt;a href=&#34;https://www.fema.gov/emergency-managers/individuals-communities/preparedness-activities-webinars/community-emergency-response-team&#34;&gt;CERT&lt;/a&gt; people come from all across Massachusetts and are dispatched to points along the route. Mostly they just keep cars from trying to drive through the marathon, and make themselves available to radio in anything notable that comes up, like a medical emergency.&lt;/p&gt;
&lt;p&gt;There &lt;em&gt;is&lt;/em&gt; a list of volunteer officers &amp;amp; CERT folks participating, and we did all have special lanyards we had to wear, but there&amp;rsquo;s no way to look at one of us and know who the person was, and none of us needed to register our phone numbers with them or anything. That day, Ted wasn&amp;rsquo;t in uniform. Our stuff was set up, and he was just wandering around, taking pictures in public areas wearing street-clothes while we waited for the start.&lt;/p&gt;
&lt;p&gt;His cell phone rings. He answers it. The person on the other end says &amp;ldquo;Stop that.&amp;rdquo; It was the Secret Service. They weren&amp;rsquo;t thrilled with him taking pictures of them - and the other feds - in a situation where there was a real possibility of terrorist acts. The &lt;em&gt;only&lt;/em&gt; identifying thing Ted was wearing was a Lanyard with a color that identified him as police. They&amp;rsquo;d done what they were there to do. They&amp;rsquo;d spotted someone acting a little suspiciously. They&amp;rsquo;d used their gadgets, and in essentially no time flat they not only knew who he was, but had his phone number.&lt;/p&gt;
&lt;p&gt;That was about ten years ago. Facial recognition has only gotten better. Computers have only gotten faster, and social media companies like Facebook have made good money selling people&amp;rsquo;s name&amp;rsquo;s and faces to government agencies, and anyone else who wants them.&lt;/p&gt;
&lt;p&gt;Facial recognition of protesters is NOT a sci-fi movie threat. It is a reality that has been with us for over a decade. The only difference is that ten years ago the government wasn&amp;rsquo;t literally trying to re-imagine itself as Nazi Party v2.0&lt;/p&gt;
&lt;h2 id=&#34;fighting-facial-recognition&#34;&gt;Fighting Facial Recognition&lt;/h2&gt;
&lt;p&gt;Facial recognition is good, but at the moment it&amp;rsquo;s also terrible at handling weird makeup. The most recent paper I&amp;rsquo;ve found on this is from Dec. 2024 titled Novel AI Camera Camouflage: Face Cloaking Without Full Disguise. You can &lt;a href=&#34;https://arxiv.org/abs/2412.13507&#34;&gt;download the paper&lt;/a&gt; on arxiv.org. The older methods of &amp;ldquo;CV Dazzle&amp;rdquo; ( Computer Vision Dazzle ) makeup patters don&amp;rsquo;t work anymore. The software has moved beyond that.&lt;/p&gt;
&lt;p&gt;The short version is that masks and goggles keep you safe, but you can&amp;rsquo;t take them off. Some creative face paint can completely disable the software&amp;rsquo;s ability to recognize you as even &lt;em&gt;having&lt;/em&gt; a face. I recommend you check out &lt;a href=&#34;https://www.digitaltrends.com/news/cv-dazzle-makeup-facial-recognition-protests/&#34;&gt;&amp;quot;&amp;lsquo;Dazzle&amp;rsquo; makeup won&amp;rsquo;t trick facial recognition. Here&amp;rsquo;s what experts say will&amp;quot;&lt;/a&gt; on Digital Trends for its overview of the situation and suggestions on strategies.&lt;/p&gt;
&lt;p&gt;The other thing to keep in mind is that every time you post photos of protesters online without hiding their faces, you&amp;rsquo;re helping the government build a list of people they don&amp;rsquo;t like.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>What You&#39;re Doing Now</title>
      <link>https://weblog.masukomi.org/2025/04/08/what-youre-doing-now/</link>
      <pubDate>Tue, 08 Apr 2025 00:00:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2025/04/08/what-youre-doing-now/</guid>
      <description>&lt;p&gt;Yesterday I saw &lt;a href=&#34;https://www.tiktok.com/@alexlee488/video/7488162923672816942?is_from_webapp=1&amp;amp;sender_device=pc&amp;amp;web_id=7490943210450765343&#34;&gt;a TikTok by a trans woman speaking up for herself&lt;/a&gt;, for all of us. In the face of fascist bigotry, she was proud, and strong, and defiant in all the best ways. She demonstrated that she&amp;rsquo;s exactly the kind of person everyone should strive to be.&lt;/p&gt;
&lt;p&gt;Yesterday I saw someone on Mastodon positing that &amp;ldquo;If you&amp;rsquo;re wondering what you would have done during the holocaust, it&amp;rsquo;s whatever you&amp;rsquo;re doing right now.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;They&amp;rsquo;re right, but also… things aren&amp;rsquo;t the same. I&amp;rsquo;ve already written about &lt;a href=&#34;https://weblog.masukomi.org/2025/04/08/protests-and-facial-recognition/&#34;&gt;the danger of showing your face at a protest&lt;/a&gt;. Right now, queer people need allies to stand up for us more than ever. It&amp;rsquo;s not &lt;em&gt;just&lt;/em&gt; about having equal rights. It&amp;rsquo;s about not being thrown in concentration camps like we did to Japanese citizens when a US that was actively and publicly &lt;em&gt;fighting&lt;/em&gt; fascism. Now the US is running head-first towards Nazi Party v2.0.&lt;/p&gt;
&lt;p&gt;So, what am I doing right now?&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not doing what that amazing trans woman is doing. I&amp;rsquo;m staying home. I&amp;rsquo;m desperately trying to get bottom surgery before it stops being an option. I&amp;rsquo;m worrying about a repeat of &lt;a href=&#34;https://en.wikipedia.org/wiki/Kristallnacht&#34;&gt;Kristallnacht&lt;/a&gt; and past &lt;a href=&#34;https://en.wikipedia.org/wiki/Pogrom&#34;&gt;pogroms&lt;/a&gt;. I&amp;rsquo;m trying to get a foreign passport in case I have to flee this country. I&amp;rsquo;m checking lists of anti-trans laws before crossing state borders to see how dangerous Driving While Trans is. I&amp;rsquo;m not stepping beyond our borders, because coming back means federal agents looking at my passport, and possibly throwing me in the wrong prison for having a gender marker that matches the real me.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m hiding because I&amp;rsquo;m terrified of publicly standing up for myself. I&amp;rsquo;m afraid of even posting this, but I can&amp;rsquo;t say nothing. I need my trans cousins to know they need to take precautions if they&amp;rsquo;re going to protest. They need to be prepared to run. Those of us in places like Texas &lt;em&gt;need&lt;/em&gt; to run. We have a tiny window where some states are still allowed to stand up and say &amp;ldquo;You&amp;rsquo;re welcome here&amp;rdquo;. Where we can be &amp;ldquo;safe&amp;rdquo; for a little while. Where we can find people who&amp;rsquo;ll help. Where we can not just be &lt;em&gt;willing&lt;/em&gt; to run, but be &lt;em&gt;prepared&lt;/em&gt; to run. Where we can pick a direction to head. Where we can pack a Go Bag.&lt;/p&gt;
&lt;p&gt;I want to be left alone in my cozy house where my anxiety isn&amp;rsquo;t trying to give me panic attacks&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;, where the daily rituals allow me to live comfortably with my autism. I want to be able to pee in rest stops and stores without fearing some self-entitled TERF is going to call the cops on me. I want to be able to walk in public without worrying about Nazi wannabes beating me to death. I want to know that if I get in a car accident the paramedics won&amp;rsquo;t watch me bleed to death on the side of the road instead of helping. I want to be able to get the hormones that keep me feeling &amp;ldquo;right&amp;rdquo; with myself.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t want to be sent to mens prison where I&amp;rsquo;ll be raped while guards look the other way. I don&amp;rsquo;t want to be put in a concentration camp. I don&amp;rsquo;t want to have to run from my home, or hide from bombs like my Jewish ancestors did.&lt;/p&gt;
&lt;p&gt;Right now, I&amp;rsquo;m speaking publicly on social media, which may be a terrible idea, but I know how much representation matters. I know what it means to know there are people like me out there. I know what it meant for an 18 year old me to see someone like me on TV and be able to give a name to the things I was feeling.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not much, but it&amp;rsquo;s what I &lt;em&gt;can&lt;/em&gt; do.&lt;/p&gt;
&lt;p&gt;What are you doing? Is it enough? If not, can you do more, or get someone to help where you can&amp;rsquo;t?&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re trans, are you somewhere safe, with people who have your back? If not, &lt;em&gt;run&lt;/em&gt;. Run &lt;em&gt;now&lt;/em&gt;. They &lt;em&gt;are&lt;/em&gt; coming.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;It&amp;rsquo;s hard to read the news, but &lt;em&gt;not&lt;/em&gt; reading it means not seeing what&amp;rsquo;s coming. It&amp;rsquo;s hard to think of how much I have to do, and how quickly things are going to shit. It&amp;rsquo;s hard to write this post. It&amp;rsquo;s hard to go to NYC to see my surgeon. All of it makes me anxious. The worst of it makes me freeze.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Remarkable Tablet Wedge</title>
      <link>https://weblog.masukomi.org/2025/03/05/remarkable-tablet-wedge/</link>
      <pubDate>Wed, 05 Mar 2025 00:00:00 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/2025/03/05/remarkable-tablet-wedge/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#problem-statement&#34;&gt;Problem Statement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#first-attempt&#34;&gt;First Attempt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#second-attempt&#34;&gt;Second Attempt&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#solving-for-rotation&#34;&gt;Solving For Rotation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-drawer&#34;&gt;The Drawer&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#requirements&#34;&gt;Requirements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#staying-shut&#34;&gt;Staying Shut&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#magnets-magnets-everywhere&#34;&gt;Magnets Magnets Everywhere&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#opening&#34;&gt;Opening&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#feel&#34;&gt;Feel&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-printing&#34;&gt;The Printing&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#no-supports&#34;&gt;No Supports&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#expansion-and-glue-issues&#34;&gt;Expansion &amp;amp; Glue Issues&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#encasing-magnets-in-plastic&#34;&gt;Encasing Magnets In Plastic&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#satisfaction&#34;&gt;Satisfaction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#want-one&#34;&gt;Want One?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#postscript&#34;&gt;Postscript&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;After writing a few hundred pages on my &lt;a href=&#34;https://remarkable.com/store/remarkable-paper/pro&#34;&gt;reMarkable Paper Pro&lt;/a&gt; I decided to stop using my stuffed monkey, trivets, and other found objects to prop up my tablet when writing. What came out was a simple object, but also one of the most satisfying things I&amp;rsquo;ve ever made, for physical, and emotional reasons. This post goes over what I did, how I did it, and why it means so much to me. If you just care about the last bit skip to &amp;ldquo;Satisfaction&amp;rdquo; at the end. If you are interested in 3D printing, read it all.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/03/05/remarkable_tablet_wedge_v1_1_four_up.jpg&#34;
    alt=&#34;four photos showing a tablet on the wedge, the flush face of the drawer in the side of the wedge, a finger curving into the handle and pulling out the drawer, the drawer completely removed.&#34;&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;problem-statement&#34;&gt;Problem Statement&lt;/h2&gt;
&lt;p&gt;Writing is just easier when the surface you&amp;rsquo;re writing on is angled towards you. Having something angled at the correct angle for &lt;em&gt;your&lt;/em&gt; body is even better.&lt;/p&gt;
&lt;p&gt;I want something that…&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;feels, and looks solid.&lt;/li&gt;
&lt;li&gt;isn&amp;rsquo;t as large as the tablet itself&lt;/li&gt;
&lt;li&gt;can be easily carried around the house&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/03/05/remarkable_on_monkey.jpg&#34;
    alt=&#34;A reMarkable Paper Pro leaning on a stuffed monkey on a granite countertop.&#34;&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;first-attempt&#34;&gt;First Attempt&lt;/h2&gt;
&lt;p&gt;I took some measurements, did some math, and even worked through what a collapsible stand might look like.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/03/05/remarkable_tablet_wedge_initial_sketches.jpg&#34;
    alt=&#34;a photo of a notebook with dot-grid paper and a drawing of a triangle, and what looks like an unfolded box.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;The first version is a simple object. It only took me a few minutes to model it, but there are a couple things I&amp;rsquo;m proud of. First, I was smart enough to subtract the height of the felt pad on the bottom from the height of the wedge so as not to mess up the angle. The second thing is that my experience with 3D printing kicked in before I sent it to the printer and chose an print orientation that would avoid having any notable steps between layer lines.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/03/05/remarkable_tablet_wedge_v1.jpg&#34;
    alt=&#34;Two photographs of the first iteration of my Remarkable Tablet Wedge It&amp;#39;s basically just an extruded triangle where the tip facing the user has been cut off. The left photo shows it sitting on a wooden table. The right shows it with a reMarkable tablet leaning against it. There is a cat in the background of both photos.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;It worked well enough, but there were two problems:&lt;/p&gt;
&lt;p&gt;First: It turns out I regularly rotate my tablet as I&amp;rsquo;m writing for wrist and hand comfort. I had no idea. There&amp;rsquo;s nothing forcing the wedge to shift with the tablet. The cover is fricative, and adding a felt pad to the top would introduce enough friction to solve this problem, but it irks me on an emotional, almost physical level. It would be ugly, and I don&amp;rsquo;t like the idea of grabbing some wedge that&amp;rsquo;s felt on both sides.&lt;/p&gt;
&lt;p&gt;Second: I find myself seriously annoyed by the wasted space of its interior. I wanted a drawer. I don&amp;rsquo;t have anything to &lt;em&gt;put&lt;/em&gt; in that drawer, but I want it.&lt;/p&gt;
&lt;p&gt;The color change was a happy coincidence. I ran out of the &lt;a href=&#34;https://us.store.bambulab.com/products/pla-metal?id=41150855610504&#34;&gt;sparkly grey &amp;ldquo;metal&amp;rdquo; filament&lt;/a&gt; and swapped to a &lt;a href=&#34;https://us.store.bambulab.com/products/pla-matte&#34;&gt;matte Marine Blue filament&lt;/a&gt;. And the contrast of shiny sparkly and matte in those two colors is amazing in real life. Alas, recreating it in v1.1 would require a lot of wasted filament because of how it has to be printed.&lt;/p&gt;
&lt;h2 id=&#34;second-attempt&#34;&gt;Second Attempt&lt;/h2&gt;
&lt;h3 id=&#34;solving-for-rotation&#34;&gt;Solving For Rotation&lt;/h3&gt;
&lt;p&gt;My unwillingness to rely on friction to solve the rotation problem meant I needed &amp;ldquo;ears&amp;rdquo; or &amp;ldquo;lips&amp;rdquo; maybe? I&amp;rsquo;m not sure what to call them. Little edges that stick up. I was considering only putting one on the left, but wise Wifey talked me out of it. The problem with having ears on both sides, is that they need to be close enough to the sides of the tablet so that they start rotating the wedge quickly, but also far enough away on the right that you can easily attach the pen to the side for storage and charging.&lt;/p&gt;
&lt;p&gt;The ears did introduce a printing complication.&lt;/p&gt;
&lt;h3 id=&#34;the-drawer&#34;&gt;The Drawer&lt;/h3&gt;
&lt;h4 id=&#34;requirements&#34;&gt;Requirements&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;must not slide out freely when carrying it around&lt;/li&gt;
&lt;li&gt;must provide no opening for contents to fall out when carrying around&lt;/li&gt;
&lt;li&gt;must be big enough to support pens, styluses, and other items.&lt;/li&gt;
&lt;li&gt;must be aesthetically pleasing&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;staying-shut&#34;&gt;Staying Shut&lt;/h4&gt;
&lt;p&gt;Initially I wanted some kind of push-to-open mechanism. I used a bunch of notebook pages working out ways of doing this with an array of magnets arranged in opposing and attracting patterns to create a spring mechanism, then a rack and pinion design. Then I practically face-palmed when I realized I&amp;rsquo;d just solved this exact problem with simple plastic spring tabs with corresponding holes in &lt;a href=&#34;https://cults3d.com/en/3d-model/home/small-removable-under-desk-drawer-dice-tray&#34;&gt;my small under-desk drawer design&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I started to iterate on that, but then realized I could do something more elegant with magnets.&lt;/p&gt;
&lt;p&gt;Hidden inside the print are two 10mm x 2.75mm disc magnets. They&amp;rsquo;re hidden not just by virtue of being deep inside the wedge, but also because they have two layers of plastic encasing them. I did this because rare earth magnets are surprisingly fragile, and I was concerned about whacking the magnets in the drawer against these repeatedly. I wanted to cushion the blow, both because it&amp;rsquo;s impossible to get in there and replace them, and because I didn&amp;rsquo;t want the &amp;ldquo;clack&amp;rdquo; sound of two magnets hitting.&lt;/p&gt;
&lt;p&gt;This introduces printing complications.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/03/05/hidden_disc_magnets.png&#34;
    alt=&#34;an annotated screenshot from the CAD software showing the location of the magnets deep inside.&#34;&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/03/05/drawer_magnets.jpg&#34;
    alt=&#34;A close up of the internal end of the drawer showing two shiny disc magnets.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;The drawer has another pair of magnets in the corresponding location. I considered encasing these as well, but doing so would have introduced a significant printing hurdle, and I don&amp;rsquo;t have a problem the aesthetics, especially since you rarely ever see them.&lt;/p&gt;
&lt;h4 id=&#34;magnets-magnets-everywhere&#34;&gt;Magnets Magnets Everywhere&lt;/h4&gt;
&lt;p&gt;I have a variety of small magnets in my toolbox for projects like these. I experimented with thin rectangular ones that were 1mm thick, and a variety of small disc magnets until I found some that were wide enough to address any potential alignment issues between the magnets on the drawer and the ones in the wedge, and had the right amount of pull. 1mm thick just didn&amp;rsquo;t provide enough force, and they&amp;rsquo;re trivially easy to snap. 10mm x 4mm proved too much force. I experimented with some 6mm x 3mm but the 10mm x 2.75mm I settled on had a nice balance of surface area and pulling force.&lt;/p&gt;
&lt;h4 id=&#34;opening&#34;&gt;Opening&lt;/h4&gt;
&lt;p&gt;Having a pull tab that poked out past the side wasn&amp;rsquo;t an option, nor was having something small and fiddly that you could only get your fingertip into. I wanted something easy to use that felt nice to touch when using. After some sketching, and modeling I ended up with this.&lt;/p&gt;
&lt;p&gt;In hindsight, I can see that it&amp;rsquo;s a swanky version of the pull handle you see on most file cabinets that I&amp;rsquo;ve rotated 90°. After measuring my finger, I worked to create a curve that would guide my finger gently into the right position to remove the drawer. I &lt;em&gt;intended&lt;/em&gt; to cover the top of this, but my gut told me that it would look cool to leave it exposed. I was &lt;em&gt;not&lt;/em&gt; disappointed.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/03/05/drawer_handle_diptic.jpg&#34;
    alt=&#34;two images. the top one shows a closeup of the drawer slid into the wedge. Cat fur is visible in the background. The second shows the wedge on a wooden table, with a finger curling into the handle and pulling out the drawer.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Leaving the top exposed also solved a printing problem.&lt;/p&gt;
&lt;h4 id=&#34;feel&#34;&gt;Feel&lt;/h4&gt;
&lt;p&gt;While I wanted a flush face when closed, I also wanted rounded corners everywhere else. I hate handling unnecessarily sharp edges. So, all the inner and outer edges that wouldn&amp;rsquo;t effect the flush-fit of the face have been rounded.&lt;/p&gt;
&lt;p&gt;This introduced the need for a little bit of math, because rounded edges of the drawer that fit into the rounded edges of the hole have to have a slightly smaller radius, and that needs to account for the way the plastic spreads as it cools. In the end the hole has a 3mm radius fillet (curve) on the bottom edges, and the corresponding edge on the drawer has a 2.2mm radius fillet.&lt;/p&gt;
&lt;h3 id=&#34;the-printing&#34;&gt;The Printing&lt;/h3&gt;
&lt;p&gt;I had three problems to deal with.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;both pieces had to be printable without supports. First: because I wanted nice smooth surfaces and supports always leave imperfections. Second: because the places where you wouldn&amp;rsquo;t see the result of using supports were places that would be incredibly difficult to cleanly remove them.&lt;/li&gt;
&lt;li&gt;Filament expands as it settles and cools, and glue isn&amp;rsquo;t infinitely thin.&lt;/li&gt;
&lt;li&gt;Some magnets needed to be completely encased in plastic.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;no-supports&#34;&gt;No Supports&lt;/h4&gt;
&lt;p&gt;In order to encase the magnets in plastic, the wedge had to be printed on its end which meant that the upper &amp;ldquo;ear&amp;rdquo; would be hanging out into open space. Supports are almost always needed in that scenario, because you can&amp;rsquo;t just print into empty space and expect the hot filament to not fall down. But, if you can offset each layer &lt;em&gt;juuuust&lt;/em&gt; enough you can create an achievable arch or angle. Back in the cad software I increased the radius of the inner fillet (curve) where the ears meet the top of the wedge.&lt;/p&gt;
&lt;p&gt;The drawer didn&amp;rsquo;t need any supports because the magnet holes on the end were large enough that the top arch of the circle could support itself as it was printed, and I&amp;rsquo;d chosen to leave the finger pull open at the top.&lt;/p&gt;
&lt;p&gt;Because of the way a standard filament printer works, it just wasn&amp;rsquo;t possible to encase the drawer&amp;rsquo;s magnets in plastic &lt;em&gt;and&lt;/em&gt; have no supports. I decided to leave them exposed.&lt;/p&gt;
&lt;h4 id=&#34;expansion-and-glue-issues&#34;&gt;Expansion &amp;amp; Glue Issues&lt;/h4&gt;
&lt;p&gt;You can&amp;rsquo;t print a 10mm void and expect a 10mm magnet to fit. The filament will squeeze inward as it cools and create a hole that&amp;rsquo;s slightly too small. With my printer I can pretty reliably assume just under 0.2mm of spread. When I add that much to the radius of the magnet hole, I get an almost perfect fit.&lt;/p&gt;
&lt;p&gt;In the case of the drawer I designed it to be 0.8mm smaller than the hole it was fitting into, on all dimensions. This ended up being perfect.&lt;/p&gt;
&lt;p&gt;In order to account for the gel-like Cyanoacrylate glue (Super Glue) that would hold the magnets in place I added 0.25mm to the depth of the magnet holes, and that worked out perfectly.&lt;/p&gt;
&lt;h4 id=&#34;encasing-magnets-in-plastic&#34;&gt;Encasing Magnets In Plastic&lt;/h4&gt;
&lt;p&gt;There are three complications with embedding magnets in a print&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You have to stop the printer mid-print, insert magnets without disturbing anything or getting glue anywhere it shouldn&amp;rsquo;t be, then resume the print.&lt;/li&gt;
&lt;li&gt;I use a hardened steel nozzle, which the strong rare-earth magnets really want to stick to as it passes above or nearby.&lt;/li&gt;
&lt;li&gt;The inserted magnets need to not interfere with the print head when it goes to lay down the next layer.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The first problem is pretty easy, but required a little prep. I added a pause in the slicer just after the layer that finished the walls of the magnet holes, set a timer for 33 minutes into the print so that I&amp;rsquo;d have a couple minutes to get ready, grabbed gloves, glue, paper towel, and a magnet insertion tool.&lt;/p&gt;
&lt;p&gt;The tool is just a plastic wand with a magnet glued to the end of it, &lt;em&gt;but&lt;/em&gt; it&amp;rsquo;s critically important because it guarantees that I have the magnets pointing in the correct direction, and it keeps my fingers away from the glue.&lt;/p&gt;
&lt;p&gt;When the pause was about to happen I had gloves on, two magnets ready to be picked up with the tool, the flow pre-tested and ready to squeeze - sometimes the bottle gets clogged. When the printer paused, I picked up my tool, picked up a magnet, added a small amount of glue to the magnet, carefully inserted it, wiped away any excess glue, and repeated. Then I waited a full minute for the glue to set because CA glue cures by being exposed to air, and there is basically no air on it when it&amp;rsquo;s squeezed into the hole.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/03/05/layer_68_pause.png&#34;
    alt=&#34;a screnshot from the slicer showing a 3D rendered cutaway of the print at the layer where the printing was told to pause.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;The problem with magnets not being able to interfere with the print head is the main reason I couldn&amp;rsquo;t encase the ones on the side of the drawer. Not without leaving a void around the top half of the disc which I wasn&amp;rsquo;t happy with.&lt;/p&gt;
&lt;h2 id=&#34;satisfaction&#34;&gt;Satisfaction&lt;/h2&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/03/05/remarkable_tablet_wedge_v1_1_beauty_shot.jpg&#34;
    alt=&#34;a dramatically lit shot of my remarkable tablet nestled on the wedge on a wooden table.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;The end result is, in my opinion, beautiful.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s not what&amp;rsquo;s really satisfying for me though. The first glimpse of that feeling came when I slid in the drawer for a test fit before inserting its magnets. The fit is so perfect that the air pressure cushions it as it approaches the end of the insertion, and gives a hint of resistance as you pull. Not only that, but it stays in really well without the help of magnets.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s a satisfying feeling, the gentle friction as it slides, and the effects of the air pressure. It was also a reminder of how far I&amp;rsquo;ve come. With a combination of experience, and trusting my gut for aesthetics and some measurements, I was able to design something that does fits beautifully; both itself, and the tablet it was designed for. It printed beautifully. Encasing the magnets went perfectly. I love the way it feels as my finger slides into place, guided by the curve. I love the way it looks when I see my finger curled into that handle. I love the flush fit of the drawer, and the soft curves of the edges I hold on to.&lt;/p&gt;
&lt;p&gt;Creating this simple object required a lot of experience to not only know what complications would be encountered, but to know how to address those issues. Even the simple curves of the edges are the result of years of experimentation to know what feels good, what looks good, and what constituted big enough, but not too big.&lt;/p&gt;
&lt;p&gt;In the end, I&amp;rsquo;ve created something I&amp;rsquo;m really proud of, that has helped me see just how much I&amp;rsquo;ve learned on my journey to be a better Maker.&lt;/p&gt;
&lt;h2 id=&#34;want-one&#34;&gt;Want One?&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m considering selling physical versions of this, and the models with assembly instructions, and a bill of goods for the felt bottom and magnets, for people who have 3D printers. If you&amp;rsquo;re interested drop me a line on the Fediverse (Mastodon) at &lt;a href=&#34;https://connectified.com/@masukomi/&#34;&gt;@masukomi@connectified.com&lt;/a&gt; or via email at &lt;a href=&#34;mailto:masukomi@masukomi.org&#34;&gt;masukomi@masukomi.org&lt;/a&gt;. I&amp;rsquo;m not very good with email though. Physical ones would probably be $40 or more. The raw materials to print and ship cost ~$11 USD and that doesn&amp;rsquo;t include time spent cutting the felt foot to shape, attaching it, or having to be sitting beside my printer at the precise time it will pause so that I can insert the magnets. 😉&lt;/p&gt;
&lt;h2 id=&#34;postscript&#34;&gt;Postscript&lt;/h2&gt;
&lt;p&gt;You may have noticed that the new wedge is entirely Marine Blue except for the side with the drawer. I ran out of Marine Blue filament 96% into the print. I swapped it for something else while half asleep at ~4 AM when the dog asked to go pee. The color was lighter than I realized in the dim light, but it was already starting to work its way through the system when I realized this, and I was too tired to deal.&lt;/p&gt;
&lt;p&gt;It works great in photos for showing a clear distinction between drawer and side though. So, another lesson learned for future product shoots.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>So Long Kindle, Hello Kobo</title>
      <link>https://weblog.masukomi.org/2025/01/11/so-long-kindle-hello-kobo/</link>
      <pubDate>Sat, 11 Jan 2025 00:00:00 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/2025/01/11/so-long-kindle-hello-kobo/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#backstory&#34;&gt;Backstory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#problems&#34;&gt;Problems&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-problems-with-the-kindle-paperwhite&#34;&gt;The Problems with the Kindle Paperwhite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-kobo-libra-colour&#34;&gt;The Kobo Libra Colour&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#turning-pages-and-finding-menus&#34;&gt;Turning Pages &amp;amp; Finding Menus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#holding-it&#34;&gt;Holding it&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#reading-on-it&#34;&gt;Reading on it&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#screen&#34;&gt;Screen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#backlight&#34;&gt;Backlight&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#fonts&#34;&gt;Fonts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#dark-mode&#34;&gt;Dark Mode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#book-selection&#34;&gt;Book Selection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#audiobook-selection&#34;&gt;Audiobook Selection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#libraries&#34;&gt;Libraries&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#limitations&#34;&gt;Limitations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#happy-surprises&#34;&gt;Happy Surprises&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#lack-of-greed&#34;&gt;Lack of greed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#wake-speed&#34;&gt;Wake Speed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#home-screen&#34;&gt;Home Screen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#guided-discovery&#34;&gt;Guided Discovery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#sleep-screen&#34;&gt;Sleep Screen&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#unhappy-surprises&#34;&gt;Unhappy Surprises&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#books-in-a-series&#34;&gt;Books in a series&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#more-by-this-author&#34;&gt;More by this author&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#overdrive-integration&#34;&gt;OverDrive integration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#ios-integration&#34;&gt;iOS integration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#writing-with-the-stylus&#34;&gt;Writing with the Stylus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#backups&#34;&gt;Backups&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#summary-and-anecdote&#34;&gt;Summary &amp;amp; Anecdote&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://weblog.masukomi.org/2024/07/18/amazon-bricked-my-kindle/&#34;&gt;Amazon bricked my Kindle&lt;/a&gt;. I begrudgingly got a new one. I hated it. I replaced it with a Kobo Libra Colour which I &lt;em&gt;freaking love&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This post is an explanation of what happened, and why I&amp;rsquo;m so much happier with the Kobo.&lt;/p&gt;
&lt;h2 id=&#34;backstory&#34;&gt;Backstory&lt;/h2&gt;
&lt;p&gt;Last year &lt;a href=&#34;https://weblog.masukomi.org/2024/07/18/amazon-bricked-my-kindle/&#34;&gt;Amazon bricked my Kindle&lt;/a&gt;. I was pissed. I &lt;em&gt;hated&lt;/em&gt; the idea of buying another one, and giving them &lt;em&gt;any&lt;/em&gt; more money. &lt;em&gt;However&lt;/em&gt;, there were some things which made me do it anyway.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;They&amp;rsquo;ve got more books than anyone.&lt;/li&gt;
&lt;li&gt;&amp;ldquo;WhisperSync&amp;rdquo;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Since then, I&amp;rsquo;ve also learned that a lot of self-published authors &lt;em&gt;only&lt;/em&gt; publish via Amazon, so if you want their stuff, that&amp;rsquo;s the only way to get it.&lt;/p&gt;
&lt;p&gt;WhisperSync is a mechanism by which you can listen to a book in Audible, &lt;em&gt;and&lt;/em&gt; simultaneously read it on your Kindle while the Kindle highlights the words as they&amp;rsquo;re read, and turns the pages automatically. Sometimes I really want to enjoy the voice actor&amp;rsquo;s contributions to the text, but &lt;em&gt;ADHD&lt;/em&gt; makes it almost impossible to sit still and do this because it&amp;rsquo;s not enough stimulation.&lt;/p&gt;
&lt;h2 id=&#34;problems&#34;&gt;Problems&lt;/h2&gt;
&lt;p&gt;After getting the Paperwhite, two problems emerged rapidly.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I &lt;em&gt;fucking&lt;/em&gt; hate the kindle paperwhite.&lt;/li&gt;
&lt;li&gt;Not a single book I&amp;rsquo;ve listened to &lt;em&gt;since&lt;/em&gt; getting it has been &amp;ldquo;WhisperSync enabled&amp;rdquo;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;the-problems-with-the-kindle-paperwhite&#34;&gt;The Problems with the Kindle Paperwhite&lt;/h2&gt;
&lt;p&gt;The biggest problem is how you&amp;rsquo;re forced to interact with it (its UX).&lt;/p&gt;
&lt;p&gt;Obviously, there are no page turn buttons. This is terrible, but it&amp;rsquo;s made worse by software choices.&lt;/p&gt;
&lt;p&gt;Tapping &lt;em&gt;most&lt;/em&gt; of the screen advances the book forward by one screen. As far as I can tell they&amp;rsquo;ve dedicated the right 75% of the screen to &amp;ldquo;move forward&amp;rdquo; functionality. You&amp;rsquo;d expect the &amp;ldquo;move back&amp;rdquo; and &amp;ldquo;move forward&amp;rdquo; tap zones to be roughly the same size. They&amp;rsquo;re not. The end result is that 90% of the time I try and go back a page I end up going forward a page.&lt;/p&gt;
&lt;p&gt;Tapping a wee area across the top of the screen gets you some settings, but not all of them. There is &lt;em&gt;no&lt;/em&gt; visual indication that tapping up there will do anything other than turn a page, and there are lots of people who can&amp;rsquo;t figure out how to get back to their library of books because the link to do that is hidden in that little area you&amp;rsquo;re unlikely to ever try tapping.&lt;/p&gt;
&lt;p&gt;Swipe gestures. You can swipe up from the bottom, or down from the top. Swiping down from the top brings a &lt;em&gt;different&lt;/em&gt; slide-out menu than tapping at the top which &lt;em&gt;doesn&amp;rsquo;t&lt;/em&gt; include a way to get back to your list of book. Why? Who knows. There is &lt;em&gt;no&lt;/em&gt; indication that swipe gestures are a thing.&lt;/p&gt;
&lt;p&gt;The home screen has 3 rows of books, 1 of those is a row of books they want you to buy.&lt;/p&gt;
&lt;h2 id=&#34;the-kobo-libra-colour&#34;&gt;The Kobo Libra Colour&lt;/h2&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/01/11/kobo_libra_colour.png&#34;
    alt=&#34;an image of the Kobo Libra Color laying on an infinite white plane. It&amp;#39;s displaying the library screen with color book covers.&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;The Kobo Libra Colour&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;If you want physical page turn buttons in an e-reader, you have precisely one option in early 2025. It&amp;rsquo;s the &lt;a href=&#34;https://us.kobobooks.com/products/kobo-libra-colour&#34;&gt;Kobo Libra Colour&lt;/a&gt; (henceforth KLC).&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s what got me looking at Kobo in the first place. I don&amp;rsquo;t know why e-book manufacturers hate buttons. I assume it&amp;rsquo;s just prioritizing cost over user experience.&lt;/p&gt;
&lt;h2 id=&#34;turning-pages-and-finding-menus&#34;&gt;Turning Pages &amp;amp; Finding Menus&lt;/h2&gt;
&lt;p&gt;The KLC has physical page turn buttons, &lt;em&gt;but&lt;/em&gt; it also has a touch screen which you can tap to move forward or back in your books if you want. The right third of the screen navigates forward. The left third of the screen navigates back. Tapping the center brings up menus. Tapping the top edge brings up the same menus. Tapping the bottom edge brings up the same menus.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s all incredibly intuitive. It &amp;ldquo;just makes sense&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Even better, you can adjust it if that layout doesn&amp;rsquo;t &amp;ldquo;just make sense&amp;rdquo; to your brain.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/01/11/kobo_tap_settings.jpg&#34;
    alt=&#34;a photograph showing the four different ways you can choose to have the tap zones.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;There &lt;em&gt;is&lt;/em&gt; a swipe gesture from the top, but forgetting it exists won&amp;rsquo;t hurt you because it&amp;rsquo;s just a way to quickly navigate to recently opened books. Swiping up from the bottom brings up the same menus as everything else that brings up menus.&lt;/p&gt;
&lt;p&gt;The page turn buttons are really nice. I would put them in a different location if I was designing the device, but where they are is good enough, and doesn&amp;rsquo;t annoy me.&lt;/p&gt;
&lt;h2 id=&#34;holding-it&#34;&gt;Holding it&lt;/h2&gt;
&lt;p&gt;The section of the device that holds the physical page turn buttons is wider than it needs to be for the buttons. This makes it easy to hold the device from the side instead of the bottom. It&amp;rsquo;s &lt;em&gt;very&lt;/em&gt; comfortable. The slight curve up at the edge means you don&amp;rsquo;t have to hold as hard to keep it from slipping. The Kindle and the Kobo are both incredibly light, so this isn&amp;rsquo;t a big deal either, way. Never-the-less it &lt;em&gt;is&lt;/em&gt; more comfortable to hold.&lt;/p&gt;
&lt;p&gt;The screen rotation, and button placement means that left-handed folks can use it just as easily as right handed.&lt;/p&gt;
&lt;h2 id=&#34;reading-on-it&#34;&gt;Reading on it&lt;/h2&gt;
&lt;h3 id=&#34;screen&#34;&gt;Screen&lt;/h3&gt;
&lt;p&gt;It&amp;rsquo;s great. Colors are washed out, but that&amp;rsquo;s because no-one has figured out how to make an e-ink screen where the colors &lt;em&gt;aren&amp;rsquo;t&lt;/em&gt; washed out. It&amp;rsquo;s just a current limitation of the technology.&lt;/p&gt;
&lt;h3 id=&#34;backlight&#34;&gt;Backlight&lt;/h3&gt;
&lt;p&gt;Unlike most (all?) kindles, you can turn it off. It has fine grained settings for brightness, and can go very dim or very bright. You can adjust it from very cool blue, to a nice warm yellow. Those adjustments feel less fine grained but the end result is fine.&lt;/p&gt;
&lt;h3 id=&#34;fonts&#34;&gt;Fonts&lt;/h3&gt;
&lt;p&gt;The Kobo makes it easy to override the fonts that any book comes with. Notably, the options include fonts specifically designed to address accessibility needs: &lt;a href=&#34;https://www.brailleinstitute.org/freefont/&#34;&gt;Atkinson Hyperlegible from the Braile Institute&lt;/a&gt; for low vision users, and &lt;a href=&#34;https://opendyslexic.org&#34;&gt;Open Dyslexic&lt;/a&gt; for dyslexic readers.&lt;/p&gt;
&lt;p&gt;Changing the font size is easy, &lt;em&gt;but&lt;/em&gt; the controls are &lt;em&gt;too&lt;/em&gt; fine-grained for my taste. I prefer how Kindle handles this. I don&amp;rsquo;t need a slider with 100 steps from smallest to largest.&lt;/p&gt;
&lt;h3 id=&#34;dark-mode&#34;&gt;Dark Mode&lt;/h3&gt;
&lt;p&gt;It has one. It&amp;rsquo;s buried in settings, so it&amp;rsquo;s not trivial to toggle, but it works well.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/01/11/kobo_dark_mode.jpg&#34;
    alt=&#34;a photograph showing a page of text in dark mode with white letters &amp;amp; black background.&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;dark mode&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;book-selection&#34;&gt;Book Selection&lt;/h2&gt;
&lt;p&gt;If its from a major publisher it&amp;rsquo;s definitely available on Kobo. Small and mid-sized ones seem to all be there too. The problem is with self-published authors who only distribute books via Amazon. If you read a lot of romance novels this may be a big deal.&lt;/p&gt;
&lt;p&gt;We must also consider what&amp;rsquo;s available via &amp;ldquo;Kindle Unlimited&amp;rdquo; vs &amp;ldquo;Kobo Plus&amp;rdquo;. Kobo claims to have over 1.5 million eBooks and over 150,000 audio books available via their &amp;ldquo;Plus&amp;rdquo; programs. What I found surprising was that many (most?) of the books that I have wanted to read that were part of Kindle Unlimited, do &lt;em&gt;not&lt;/em&gt; seem to be part of Kobo Plus, even if they are available.&lt;/p&gt;
&lt;p&gt;I can&amp;rsquo;t tell if it&amp;rsquo;s just the books I&amp;rsquo;ve been looking at or if books are just generally less likely to be available via Kobo Plus.&lt;/p&gt;
&lt;p&gt;Pricing is comparable. If you sign up for their $10 per year VIP program you&amp;rsquo;ll end up saving money purchasing books on Kobo instead of Amazon.&lt;/p&gt;
&lt;h2 id=&#34;audiobook-selection&#34;&gt;Audiobook Selection&lt;/h2&gt;
&lt;p&gt;Kobo seems to have most of the books that are on Audible, however the percentage available for &amp;ldquo;free&amp;rdquo; via Kobo Plus seems small. There are very few free books on Kindle Unlimited too.&lt;/p&gt;
&lt;p&gt;As far as I can tell there is no way to view the audiobooks available via Kobo Plus. Maybe you can if you have Kobo Plus. Amazon &lt;em&gt;does&lt;/em&gt; have page listing all the audiobooks on kindle unlimited, but it also says there are &amp;ldquo;over 6,000&amp;rdquo; even though there are more than 4,000,000 ebooks and magazines available.&lt;/p&gt;
&lt;p&gt;Kobo doesn&amp;rsquo;t have an equivalent to WhisperSync, but in my experience essentially none of the Kindle books I want to read have that enabled.&lt;/p&gt;
&lt;h2 id=&#34;libraries&#34;&gt;Libraries&lt;/h2&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/01/11/kobo_libra_overdrive_integration.jpg&#34;
    alt=&#34;A photo of the elipsis menu on a book details page showing an option to borrow with OverDrive&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Borrow With OverDrive option&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Users based in the US with library cards likely borrow their ebooks via OverDrive (Libby). The KLC not only has OverDrive integration built in, but the details page for every book makes it trivially easy to borrow the book if it&amp;rsquo;s available, or put it on hold if someone else has it checked out.&lt;/p&gt;
&lt;p&gt;The Home screen gives you quick access to the books you have checked out and the ones you have on hold.&lt;/p&gt;
&lt;h3 id=&#34;limitations&#34;&gt;Limitations&lt;/h3&gt;
&lt;p&gt;You can only see books that Kobo offers for sale. If your library has an e-book, that Kobo doesn&amp;rsquo;t carry, it won&amp;rsquo;t show up in Kobo&amp;rsquo;s search results, so you won&amp;rsquo;t have the option to put it on hold, or borrow it directly via the Kobo.&lt;/p&gt;
&lt;p&gt;However, books that you put on hold via Libby, or the OverDrive web site are displayed in the list of books you have on hold, and books you check out via the OverDrive site (and Libby?) just show up in &amp;ldquo;My Books&amp;rdquo; along with purchased books.&lt;/p&gt;
&lt;p&gt;There doesn&amp;rsquo;t appear to be a good way to see which of &amp;ldquo;My Books&amp;rdquo; are once you&amp;rsquo;ve borrowed from your library and will have to return soon, and which are ones you&amp;rsquo;ve purchased and can read whenever.&lt;/p&gt;
&lt;h2 id=&#34;happy-surprises&#34;&gt;Happy Surprises&lt;/h2&gt;
&lt;h3 id=&#34;lack-of-greed&#34;&gt;Lack of greed&lt;/h3&gt;
&lt;p&gt;The Kindle is trying to sell you something at every opportunity. You &lt;em&gt;can&lt;/em&gt; load books onto it from your library, or books that were purchased directly from an author&amp;rsquo;s web site, but it&amp;rsquo;s a pain in the ass.&lt;/p&gt;
&lt;p&gt;Every book detail page has a prominent button to, let you ask your library to put a hold on the book. It also has Dropbox and Google Drive integrations built in. They &lt;em&gt;want&lt;/em&gt; you to use the device and they are perfectly happy to let you load books onto it that you got from other sources.&lt;/p&gt;
&lt;h3 id=&#34;wake-speed&#34;&gt;Wake Speed&lt;/h3&gt;
&lt;p&gt;When you have a &amp;ldquo;sleep cover&amp;rdquo; (a cover with magnets in specific locations). It wakes &lt;em&gt;instantly&lt;/em&gt;. As soon as the cover is out of the way, it&amp;rsquo;s ready to read.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t know what the Kindle is doing but it takes seconds to wake, and it&amp;rsquo;s really annoying once you know you could have &amp;ldquo;instant&amp;rdquo;.&lt;/p&gt;
&lt;h3 id=&#34;home-screen&#34;&gt;Home Screen&lt;/h3&gt;
&lt;p&gt;Other than being annoyed with the fact that ⅓ of the Kindle&amp;rsquo;s home screen was dedicated to selling me more books, I never really thought much about it. It was &amp;ldquo;ok&amp;rdquo;. It worked.&lt;/p&gt;
&lt;p&gt;The Kobo home screen is &lt;em&gt;great&lt;/em&gt;&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2025/01/11/kobo_libra_home_screen.jpg&#34;
    alt=&#34;A photo of my current home screen. The Kobo is sitting on a bamboo desk. pens can be seen on the sides of the photo&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;The Kobo Libra Home Screen&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The top row is books you&amp;rsquo;ve read most recently. Below that you have two blocks &amp;ldquo;My Books&amp;rdquo; and books by a specific author. I&amp;rsquo;m not sure how it decides what author&amp;rsquo;s books to highlight. It&amp;rsquo;s &lt;em&gt;not&lt;/em&gt; the author of the most recently read book.&lt;/p&gt;
&lt;p&gt;Below that are two blocks for interacting with library books, one to borrow books, and one to see the books you have library holds on.&lt;/p&gt;
&lt;p&gt;Along the bottom edge are useful buttons for &amp;ldquo;Home&amp;rdquo;, &amp;ldquo;My Books&amp;rdquo;, &amp;ldquo;My Notebooks&amp;rdquo;, &amp;ldquo;Discover&amp;rdquo;, and &amp;ldquo;More&amp;rdquo;.&lt;/p&gt;
&lt;h3 id=&#34;guided-discovery&#34;&gt;Guided Discovery&lt;/h3&gt;
&lt;p&gt;Kobo will ask you a handful of general questions when you first start. It seems to also pay attention to what books you read, and use that to help suggest new books.&lt;/p&gt;
&lt;p&gt;Overall, it&amp;rsquo;s pretty good. I&amp;rsquo;ve found a bunch of new books that I&amp;rsquo;ve enjoyed that way. It&amp;rsquo;s not perfect though. It&amp;rsquo;s figured out I&amp;rsquo;m queer, but not that I&amp;rsquo;m a lesbian. So, it keeps suggesting books about gay men, that I&amp;rsquo;m never going to buy.&lt;/p&gt;
&lt;h3 id=&#34;sleep-screen&#34;&gt;Sleep Screen&lt;/h3&gt;
&lt;p&gt;Kobo offers the optional ability to optionally display the cover of the book you most recently opened. If you turn on this feature it will display the cover when you turn the device off, and when when it goes to sleep when you leave it alone for five minutes.&lt;/p&gt;
&lt;p&gt;This may, or may not, be a good thing depending on what you&amp;rsquo;re reading. There are lots of books that people read that they wouldn&amp;rsquo;t be comfortable with their friends, family, or coworkers knowing they&amp;rsquo;re reading.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re only going to be reading in &amp;ldquo;safe&amp;rdquo; environments, then this feature is pretty great. Unfortunately, if you&amp;rsquo;re not comfortable turning this on, the default sleep screen is aggravatingly ugly.&lt;/p&gt;
&lt;p&gt;Side note: As far as I know, no e-ink device manufacturer allows non-geeks to put custom sleep screens on their device. As with many of these devices, a computer geek &lt;em&gt;can&lt;/em&gt; set one &lt;em&gt;but&lt;/em&gt; they&amp;rsquo;ll have to go through the process every time the device receives a software update. I haven&amp;rsquo;t dug into the details of this on the Kobo, so I maybe it doesn&amp;rsquo;t reset every time.&lt;/p&gt;
&lt;h2 id=&#34;unhappy-surprises&#34;&gt;Unhappy Surprises&lt;/h2&gt;
&lt;p&gt;The following are true as of January 2025, but the situation may have changed by the time you&amp;rsquo;re reading this.&lt;/p&gt;
&lt;h3 id=&#34;books-in-a-series&#34;&gt;Books in a series&lt;/h3&gt;
&lt;p&gt;Note: this problem is limited to the e-ink device not the web site.&lt;/p&gt;
&lt;p&gt;Kobo sometimes indicates that a book is part of a series, but there&amp;rsquo;s nothing you can click to see all the books in the series. When you complete one book in a series it has no idea what the next book in the series is.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s as if there&amp;rsquo;s a metadata field on the book that&amp;rsquo;s called &amp;ldquo;series name&amp;rdquo; and holds text, but has no actual functionality connected to it.&lt;/p&gt;
&lt;p&gt;There are some screens where you can click on a series but it doesn&amp;rsquo;t actually &lt;em&gt;show&lt;/em&gt; you the books in the series. It performs a search for the name of the series, which brings up a bunch of other unrelated books with similar titles.&lt;/p&gt;
&lt;h3 id=&#34;more-by-this-author&#34;&gt;More by this author&lt;/h3&gt;
&lt;p&gt;Note: this problem is limited to the e-ink device not the web site.&lt;/p&gt;
&lt;p&gt;Same problem as books in a series. You can&amp;rsquo;t see a list of books by an author, and when there &lt;em&gt;is&lt;/em&gt; a link to click with the author&amp;rsquo;s name, it just performs a search for that name. Unsurprisingly, this brings up a bunch of books by authors with similar names, and books with that name in their title somewhere.&lt;/p&gt;
&lt;h3 id=&#34;overdrive-integration&#34;&gt;OverDrive integration&lt;/h3&gt;
&lt;p&gt;Note: this problem is limited to the e-ink device. As far as I can tell there&amp;rsquo;s no OverDrive integration on the web site or iOS app.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.overdrive.com&#34;&gt;OverDrive&lt;/a&gt; is a company which allows libraries to pay obscene prices to loan books to their patrons. Unfortunately libraries don&amp;rsquo;t have an alternative, and if you want to borrow from most libraries in the USA, you don&amp;rsquo;t either.&lt;/p&gt;
&lt;p&gt;In addition to being part of a morally bankrupt system, OverDrive&amp;rsquo;s software is crap. It&amp;rsquo;s not uncommon to try and put a book on hold and have it just spin at you infinitely. Other than forgetting to add a reasonable timeout, I have no reason to believe that &lt;em&gt;any&lt;/em&gt; of the library integration problems can be blamed on Kobo&amp;rsquo;s developers. When it works, it works well. When it doesn&amp;rsquo;t it just spins at you.&lt;/p&gt;
&lt;h3 id=&#34;ios-integration&#34;&gt;iOS integration&lt;/h3&gt;
&lt;p&gt;Amazon is rich and was able to negotiate some sort of better deal with Apple. Kobo doesn&amp;rsquo;t have that privilege and doesn&amp;rsquo;t seem to be able to afford Apple&amp;rsquo;s cut. As a result, you can&amp;rsquo;t buy ebooks in the Kobo app.&lt;/p&gt;
&lt;p&gt;If you choose to add payment info to your account you can buy them directly on the device, and that process is painless.&lt;/p&gt;
&lt;p&gt;Find them on the app. Add them to your wishlist. Load the wishlist on the Kobo device, or on the web site, and buy them there.&lt;/p&gt;
&lt;h2 id=&#34;writing-with-the-stylus&#34;&gt;Writing with the Stylus&lt;/h2&gt;
&lt;p&gt;I can&amp;rsquo;t comment on this. I have a &lt;a href=&#34;https://remarkable.com/store/remarkable-paper/pro&#34;&gt;Remarkable Paper Pro&lt;/a&gt; which I absolutely adore and use for this purpose.&lt;/p&gt;
&lt;h2 id=&#34;backups&#34;&gt;Backups&lt;/h2&gt;
&lt;p&gt;There&amp;rsquo;s a great plugin for &lt;a href=&#34;https://calibre-ebook.com&#34;&gt;Calibre&lt;/a&gt; that makes it trivial to back-up books from your Kobo. Press a button, choose books from a list, and they&amp;rsquo;re downloaded. As with other devices, it&amp;rsquo;ll tell you if the book on your Kobo device is also available in your library of backups. For the most part, it &amp;ldquo;just works&amp;rdquo;, and you can also make backups of books you&amp;rsquo;ve borrowed via your library this way.&lt;/p&gt;
&lt;p&gt;That being said, it has had trouble importing a couple books from the Kobo. This is probably related to a different DRM scheme on those books.&lt;/p&gt;
&lt;p&gt;With Kindle you have to download books one-by-one in a special format from a hard-to-find screen, and then manually add them to Calibre.&lt;/p&gt;
&lt;p&gt;No-one has managed to crack the encryption on Kindle Unlimited books so you can&amp;rsquo;t back those up. I don&amp;rsquo;t know if the same applies to books acquired via Kobo Plus or not.&lt;/p&gt;
&lt;h2 id=&#34;summary-and-anecdote&#34;&gt;Summary &amp;amp; Anecdote&lt;/h2&gt;
&lt;p&gt;The other day I got a book that was &lt;em&gt;only&lt;/em&gt; available via Kindle, and was free via Kindle Unlimited, which I still have a subscription too. Yes, I&amp;rsquo;ll probably be canceling that soon. I loaded the book up on my Kindle and started reading on the couch. I complained so many times about different things that were &lt;em&gt;worse&lt;/em&gt; on the Kindle that eventually my wife looked at me and said &amp;ldquo;Are you actually reading the book, or are you just complaining about the Kindle?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Get the Kobo. It&amp;rsquo;s awesome.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>We&#39;re Not Missing Out</title>
      <link>https://weblog.masukomi.org/2025/01/02/were-not-missing-out/</link>
      <pubDate>Thu, 02 Jan 2025 00:00:00 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/2025/01/02/were-not-missing-out/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#the-problem&#34;&gt;The Problem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#loneliness&#34;&gt;Loneliness&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#public-entertainment&#34;&gt;Public Entertainment&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#movies-and-tv&#34;&gt;Movies &amp;amp; TV&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#performances&#34;&gt;Performances&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#restaurants-and-bars-and-parties&#34;&gt;Restaurants, &amp;amp; Bars, &amp;amp; Parties&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#physical-interactions&#34;&gt;Physical Interactions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#shopping&#34;&gt;Shopping&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#gas-stations-and-travel&#34;&gt;Gas Stations &amp;amp; Travel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#fear&#34;&gt;Fear&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#summary&#34;&gt;Summary&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#why-we-re-still-cautious&#34;&gt;Why we&amp;rsquo;re still cautious&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;the-problem&#34;&gt;The Problem&lt;/h2&gt;
&lt;p&gt;My wife and I are still acting as if Covid is a real threat to our health an safety, because it is. Our friends &amp;amp; family think we&amp;rsquo;re &amp;ldquo;missing out&amp;rdquo;. They believe we are living significantly diminished lives. They think we&amp;rsquo;re living in fear. They&amp;rsquo;re worried for us, and frustrated with our limitations. They can&amp;rsquo;t imagine a world where we&amp;rsquo;re acting this way and not hurting and / or fearful.&lt;/p&gt;
&lt;p&gt;We understand why they think we&amp;rsquo;re living in fear - even if they&amp;rsquo;re wrong - but we have no idea what they think we&amp;rsquo;re &amp;ldquo;missing out&amp;rdquo; on.&lt;/p&gt;
&lt;p&gt;This post is an attempt to explain why they&amp;rsquo;re wrong. I also hope it might be useful for others dealing with similar problems. This is not an attempt to convince anyone to change how they&amp;rsquo;re living their lives.&lt;/p&gt;
&lt;p&gt;First though, I need to explain what we&amp;rsquo;re doing that has them so worried.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We&amp;rsquo;re still unwilling to go into buildings unless absolutely necessary.&lt;/li&gt;
&lt;li&gt;When friends want to visit we stay outside on the deck, we only let them in to use the bathroom, and we thoroughly ventilate the place afterwards.&lt;/li&gt;
&lt;li&gt;We always wear KN95 masks around other people unless there&amp;rsquo;s a medical reason to take it off.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Because of our self-imposed restrictions we:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;don&amp;rsquo;t go to the movies&lt;/li&gt;
&lt;li&gt;don&amp;rsquo;t eat in restaurants&lt;/li&gt;
&lt;li&gt;don&amp;rsquo;t go to social gatherings&lt;/li&gt;
&lt;li&gt;don&amp;rsquo;t physically hang out with friends except very rarely in small groups outside.&lt;/li&gt;
&lt;li&gt;don&amp;rsquo;t go into stores&lt;/li&gt;
&lt;li&gt;don&amp;rsquo;t go into supermarkets&lt;/li&gt;
&lt;li&gt;don&amp;rsquo;t go into gas stations, even to use the bathroom.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, for the people who care about us, and people who care about others like us, let me try and explain why none of that matters to us.&lt;/p&gt;
&lt;p&gt;Overall our thoughts on these can be summarized as &amp;ldquo;complete indifference&amp;rdquo; or &amp;ldquo;mild inconvenience.&amp;rdquo;&lt;/p&gt;
&lt;h2 id=&#34;loneliness&#34;&gt;Loneliness&lt;/h2&gt;
&lt;p&gt;People think we must be lonely, but the important thing to understand is that just because &lt;em&gt;you&lt;/em&gt; might be lonely in a situation doesn&amp;rsquo;t mean that &lt;em&gt;everyone&lt;/em&gt; would feel lonely in it.&lt;/p&gt;
&lt;p&gt;We moved away from Boston in 2017, before Covid. We moved to get away from the stress of the city, and it worked. It worked tremendously well. However, when we moved we put a mountain range and hours of driving between us and &lt;em&gt;all&lt;/em&gt; of our friends. We didn&amp;rsquo;t move to get away from them, but it was a consequence of our choice.&lt;/p&gt;
&lt;p&gt;We have no friends in this town. Most people think that&amp;rsquo;s a sad thing, but it&amp;rsquo;s not for us. The first couple years here we kept telling ourselves &amp;ldquo;We should make some friends here.&amp;rdquo; But, we said it more because of the social expectation to do so, and because other people think it&amp;rsquo;s sad to not have friends nearby.&lt;/p&gt;
&lt;p&gt;There are plenty of social opportunities for adults to hang out together around here. Some of them are even things we enjoy doing. But, we kept not doing them. We&amp;rsquo;re not afraid of new things. We&amp;rsquo;re not afraid of meeting new people. For those who don&amp;rsquo;t know, we rode motorcycles from Boston to the bottom of South America. We were constantly in new situations that were sometimes uncomfortable, or scary. The conversations we had with strangers along the way were some of the best parts of the trip. So, that wasn&amp;rsquo;t the problem.&lt;/p&gt;
&lt;p&gt;The truth is, we just didn&amp;rsquo;t feel like it. Mostly because we still &lt;em&gt;have&lt;/em&gt; our friends. We have video chats with different friend groups twice a week, and wifey and I both have one on one chats with other friends weekly or monthly. If anything, we hang out with friends &lt;em&gt;too much&lt;/em&gt;. Sometimes we just want to melt into the couch at the end of the day, but we &lt;em&gt;like&lt;/em&gt; our friends and know that a lack of regular contact hurts most friendships. So, we stay in contact.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re not lonely &lt;em&gt;at all&lt;/em&gt;. We have people to talk to. We have friends who&amp;rsquo;ll listen. We have each other. We&amp;rsquo;re &lt;em&gt;never&lt;/em&gt; sick of each other&amp;rsquo;s presence.&lt;/p&gt;
&lt;h2 id=&#34;public-entertainment&#34;&gt;Public Entertainment&lt;/h2&gt;
&lt;p&gt;I mention the following things specifically because everyone seems to think this is something we&amp;rsquo;re definitely &amp;ldquo;missing out&amp;rdquo; on.&lt;/p&gt;
&lt;h3 id=&#34;movies-and-tv&#34;&gt;Movies &amp;amp; TV&lt;/h3&gt;
&lt;p&gt;We haven&amp;rsquo;t been to a movie theater since 2017. The neighborhood theater is incredibly convenient to get to. There&amp;rsquo;s even a drive-in not far away. Before Covid we went to a craft fair and won free tickets to the local theater. We still have those free tickets somewhere.&lt;/p&gt;
&lt;p&gt;When we were in Boston, we basically only went to the movies when a friend asked us to join them. Now, with no friends asking us to go, we just don&amp;rsquo;t care. We have zero desire to do so. There&amp;rsquo;s a lingering feeling that &amp;ldquo;we should go to the movies&amp;rdquo; but every time we actually investigate that feeling we decide &amp;ldquo;meh, why?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not because it&amp;rsquo;s so much more comfortable and convenient to watch at home. We simply don&amp;rsquo;t stream movies. We have some favorites on blu-ray that are just collecting dust. Sometimes wifey streams a tv-show that interest her. Sometimes I stream some anime. Mostly though, we watch &lt;a href=&#34;https://www.dropout.tv/dimension-20&#34;&gt;Dimension 20&lt;/a&gt; (TTRPG Actual Plays) while we eat dinner, and then get comfortable and play video games on our PlayStation, work on personal projects, or read. With rare exceptions, we don&amp;rsquo;t chat with friends about the series that &amp;ldquo;everyone is watching&amp;rdquo; or about movies we love, or any of that. Even then, it&amp;rsquo;s only wifey who has watched it.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s roughly what our routine has been since we moved here. We like it. It&amp;rsquo;s comfortable, and quiet, and cozy.&lt;/p&gt;
&lt;h3 id=&#34;performances&#34;&gt;Performances&lt;/h3&gt;
&lt;p&gt;We&amp;rsquo;ve been together for like thirteen years. We&amp;rsquo;ve been friends for longer. In that time we went to probably two concerts by ourselves. Every other public performance we went to was the result of friends asking to go. Not us actively seeking something out. We had fun at those, but we would have never gone if the friends didn&amp;rsquo;t ask.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t think either of us will regret it if we never see another live performance.&lt;/p&gt;
&lt;h3 id=&#34;restaurants-and-bars-and-parties&#34;&gt;Restaurants, &amp;amp; Bars, &amp;amp; Parties&lt;/h3&gt;
&lt;p&gt;It&amp;rsquo;s true we miss restaurants. It&amp;rsquo;s also true that our town has terrible food options, and we&amp;rsquo;ve been lamenting at fact since &lt;em&gt;before&lt;/em&gt; Covid. It&amp;rsquo;s not that we never eat other people&amp;rsquo;s food. We get pizza delivered. We go through drive-thrus. It&amp;rsquo;s just that the options suck. If we had better options now we&amp;rsquo;d use DoorDash or some similar service more, but not a ton.&lt;/p&gt;
&lt;p&gt;Wifey never asked to go to a bar in all the time we&amp;rsquo;ve been together, and I don&amp;rsquo;t think she ever gone to one with friends either. Not in that time at least. I&amp;rsquo;m autistic, so I hate bars. They&amp;rsquo;re too loud, too crowded, and require way too much masking to be enjoyable. I also had an alcoholic dad, so I hate being around drunk people. I&amp;rsquo;m not even comfortable being around drunk friends in safe places.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t like big get-togethers either. They&amp;rsquo;re just exhausting. They require constant masking, and &amp;ldquo;being present&amp;rdquo; for people you only see at gatherings like this, and never chat with otherwise. Wifey has never mentioned missing them, but I know they took a lot out of her too.&lt;/p&gt;
&lt;h2 id=&#34;physical-interactions&#34;&gt;Physical Interactions&lt;/h2&gt;
&lt;p&gt;(Friends: this is blunt, and honest, and socially unacceptable, but it&amp;rsquo;s also who we are. If this hurts your feelings, I&amp;rsquo;m sorry, but also, I kinda wish you&amp;rsquo;d asked.)&lt;/p&gt;
&lt;p&gt;As a general statement, Wifey and I don&amp;rsquo;t want to ouch anyone. I&amp;rsquo;m autistic - we generally don&amp;rsquo;t like touching people - and Wifey has her own reasons. When friends &lt;em&gt;do&lt;/em&gt; come over we hug them because it&amp;rsquo;s a social expectation that we will, or because or friends initiate one. I don&amp;rsquo;t &lt;em&gt;mind&lt;/em&gt; hugs from old friends. Sometimes they&amp;rsquo;re nice. I also don&amp;rsquo;t &lt;em&gt;miss&lt;/em&gt; hugs from friends.&lt;/p&gt;
&lt;p&gt;Think of it like not getting to eat sourdough bread again. Most people don&amp;rsquo;t actively crave it very often, or very strongly, and thus loosing access to it isn&amp;rsquo;t something they lament. The full truth of our thoughts on touch is more nuanced than that, but I think the metaphor holds pretty well for most of the people we know.&lt;/p&gt;
&lt;p&gt;There are two people I actively want touches from, and both of them have been explicitly told that. Fortunately for me, I married one of them.&lt;/p&gt;
&lt;h2 id=&#34;shopping&#34;&gt;Shopping&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s fucking exhausting. Supermarkets are literally designed to wear you down until you have a hard time resisting buying things you don&amp;rsquo;t need. It&amp;rsquo;s nice to never have to shop in one in person again.&lt;/p&gt;
&lt;p&gt;We miss going to cheesemongers &amp;amp; fishmongers, but we didn&amp;rsquo;t do that very often anyway. It &lt;em&gt;would&lt;/em&gt; be nicer to be able to try clothes on before buying them, but we rarely ever buy new clothes anyway.&lt;/p&gt;
&lt;p&gt;We never went shopping as a form of entertainment before Covid.&lt;/p&gt;
&lt;h2 id=&#34;gas-stations-and-travel&#34;&gt;Gas Stations &amp;amp; Travel&lt;/h2&gt;
&lt;p&gt;Covid has curtailed our travel dramatically. We used to take motorcycles, or cars, or other things around the country and beyond roughly every year.&lt;/p&gt;
&lt;p&gt;Now, we don&amp;rsquo;t for a variety of logistical reasons. But we&amp;rsquo;re not really &amp;ldquo;missing out&amp;rdquo;. I used to ski and snowboard when I was a kid. I&amp;rsquo;m not &amp;ldquo;missing out&amp;rdquo; or lessened because I don&amp;rsquo;t do those anymore. When we visit our friends we bring a porta-potty. When using the car we bring a pop-up privacy tent thing. When using the ambulance, there&amp;rsquo;s a place for it in the back. We&amp;rsquo;ve seen each other use the bathroom before. It&amp;rsquo;s not a big deal.&lt;/p&gt;
&lt;p&gt;The toilets is a minor inconvenience. Travel would be nice, but staying home is nice too.&lt;/p&gt;
&lt;h2 id=&#34;fear&#34;&gt;Fear&lt;/h2&gt;
&lt;p&gt;We live in fear of Covid about as much as we live in fear of touching a hot stove. For the most part we just take basic precautions to not let it hurt us and don&amp;rsquo;t think about it otherwise.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;
&lt;p&gt;Other than good food in restaurants that don&amp;rsquo;t exist around us, we don&amp;rsquo;t feel like we&amp;rsquo;re lacking much.&lt;/p&gt;
&lt;p&gt;We &lt;em&gt;like&lt;/em&gt; our life. We like &lt;em&gt;where&lt;/em&gt; we live. We like &lt;em&gt;the home&lt;/em&gt; we live in.&lt;/p&gt;
&lt;p&gt;Is our life perfect? No. Is anyone&amp;rsquo;s?&lt;/p&gt;
&lt;p&gt;When we left the city we lost access to many of the things people take for granted as things that &amp;ldquo;everyone&amp;rdquo; does. We learned that we don&amp;rsquo;t care about &lt;em&gt;most&lt;/em&gt; of them. We learned that we were happy just existing with the person we love in a home that we love and talking to friends online. Being able to have almost anything we want delivered within a week or so makes it easier, but even without that I think we&amp;rsquo;d be pretty happy.&lt;/p&gt;
&lt;p&gt;The problem - as we see it - isn&amp;rsquo;t that we&amp;rsquo;re &amp;ldquo;missing out&amp;rdquo;. The problem is that most people seem to think they need &lt;em&gt;so much&lt;/em&gt; in order to be happy. Sometimes that&amp;rsquo;s things. Sometimes that&amp;rsquo;s activities. Sometimes that&amp;rsquo;s people. Whatever it is, it&amp;rsquo;s almost always an attempt to fill a void. Social interaction &lt;em&gt;is&lt;/em&gt; important to us, but we don&amp;rsquo;t need it to be physical, and we&amp;rsquo;re comfortable enough with ourselves and our lives that we wouldn&amp;rsquo;t be unhappy if we didn&amp;rsquo;t talk to anyone outside our home for a month. Honestly, it&amp;rsquo;d be kinda relaxing.&lt;/p&gt;
&lt;p&gt;Life is a lot simpler when you learn to be happy with yourself. When you can be honest with yourself, and your partner(s) about what feels good, and what feels bad, you can create a space that you enjoy being in without constantly needing &amp;ldquo;something else&amp;rdquo;. Sometimes that takes a lot of therapy, and uncomfortable conversations. It&amp;rsquo;s worth it though.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re not afraid to go get or do the things we want. We simply don&amp;rsquo;t want to go get or do much.&lt;/p&gt;
&lt;h2 id=&#34;why-we-re-still-cautious&#34;&gt;Why we&amp;rsquo;re still cautious&lt;/h2&gt;
&lt;p&gt;For those curious:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Covid is still killing people daily, and it&amp;rsquo;s not just the old and weak - not that that would make it any more acceptable.&lt;/li&gt;
&lt;li&gt;When you get covid you dramatically increase your likelyhood of heart disease and Alzheimer&amp;rsquo;s. This isn&amp;rsquo;t a &amp;ldquo;long covid&amp;rdquo; thing. This is true for everyone who gets covid.&lt;/li&gt;
&lt;li&gt;Whenever you get covid there&amp;rsquo;s a 1 in 10 chance of getting long covid.
We&amp;rsquo;re a single income household and we&amp;rsquo;re both knowledge workers. If the person with the money and insurance gets that then we&amp;rsquo;re fucked. Not just financially and physically. We would also loose the ability to work on the projects we love.&lt;/li&gt;
&lt;li&gt;Comorbidities. If wifey gets covid she&amp;rsquo;s significantly more likely than the average person to be fucked over by it.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>The Joy Of No Batteries</title>
      <link>https://weblog.masukomi.org/2024/10/16/the-joy-of-no-batteries/</link>
      <pubDate>Wed, 16 Oct 2024 00:00:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2024/10/16/the-joy-of-no-batteries/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#unfamiliar-with-scheme&#34;&gt;Unfamiliar with Scheme?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#old-cycles-and-new-learnings&#34;&gt;Old Cycles &amp;amp; New Learnings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#batteries-not-included&#34;&gt;Batteries Not Included&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#forced-thought&#34;&gt;Forced Thought&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#parting-thoughts&#34;&gt;Parting thoughts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#post-script-about-the-parentheses&#34;&gt;Post Script About The Parentheses&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;A musing about my enjoyment of Scheme and having to work a little harder.&lt;/p&gt;
&lt;h3 id=&#34;unfamiliar-with-scheme&#34;&gt;Unfamiliar with Scheme?&lt;/h3&gt;
&lt;p&gt;Side note for those who aren&amp;rsquo;t familiar with Scheme:&lt;/p&gt;
&lt;p&gt;Scheme is an umbrella term for many languages. Most of them try and follow one of the official standards like R5RS, but some go off on their own and explore completely different paths like &lt;a href=&#34;https://racket-lang.org/&#34;&gt;Racket&lt;/a&gt;. Schemes are considered dialects of Lisp, but Lisp too is a term for a collection of languages. I&amp;rsquo;ll use the terms somewhat interchangeably below.&lt;/p&gt;
&lt;p&gt;Please also see the bit at the end before complaining about the parentheses to me.&lt;/p&gt;
&lt;h2 id=&#34;old-cycles-and-new-learnings&#34;&gt;Old Cycles &amp;amp; New Learnings&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve been coding professionally for just shy of 30 years now. All of the professional work has been web development.&lt;/p&gt;
&lt;p&gt;At its core web development is taking form submissions, sticking them in a database, taking the stuff in the database and showing it on a web page to read, or a web page with a form to edit. That&amp;rsquo;s it. I don&amp;rsquo;t care if you&amp;rsquo;re using Rails, or Django, or Phoenix, or some homebrew creation. The back end is essentially the same. It&amp;rsquo;s not until you start approaching Google scale that what you do, or how the infrastructure supports that begins to change.&lt;/p&gt;
&lt;p&gt;Most of us don&amp;rsquo;t deal with requests at that scale. Most of us are coding minor variations on the same thing again and again. I suspect that it&amp;rsquo;s the same for back-end developers in any vertical, be it mobile games, or radar systems. Even if you switch languages it&amp;rsquo;s the same stuff with slightly different syntax most of the time.&lt;/p&gt;
&lt;p&gt;I suspect that&amp;rsquo;s why so many of us work on hobby projects, or open source libraries even though they&amp;rsquo;ll eat up our free time, and are unlikely to ever make us money. Those of us who love programming, love the problem solving, and figuring out how to express an idea with in a different set of constraints.&lt;/p&gt;
&lt;h2 id=&#34;batteries-not-included&#34;&gt;Batteries Not Included&lt;/h2&gt;
&lt;p&gt;A programming language that has &amp;ldquo;Batteries Included&amp;rdquo; is one that has a large / versitile &amp;ldquo;Standard Library&amp;rdquo;. Languages like Ruby could be said to come with not only &amp;ldquo;batteries&amp;rdquo;, but a spare generator, &amp;amp; solar panels. It&amp;rsquo;s got a web server, JSON parser, HTTP support, and lots more.&lt;/p&gt;
&lt;p&gt;Scheme&amp;rsquo;s aren&amp;rsquo;t like that. Some Scheme&amp;rsquo;s - like Racket and Chicken Scheme - have a thriving ecosystem of third party libraries, but with the exception of the SRFIs&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; those libraries are frequently written in ways that make it as difficult, or awkward to use them as to write your own implementation.&lt;/p&gt;
&lt;p&gt;In the end, you end up needing to write a lot of your own &amp;ldquo;batteries&amp;rdquo;, and that means thinking about &amp;ldquo;simple&amp;rdquo; things that you&amp;rsquo;ve been using for years, but probably never thought about before.&lt;/p&gt;
&lt;h2 id=&#34;forced-thought&#34;&gt;Forced Thought&lt;/h2&gt;
&lt;p&gt;This is where Scheme comes in for me. Scheme is considered a multi-paridimatic language. It&amp;rsquo;s not explicitly functional, and there are various Object Orientation libraries that have been written for them. It&amp;rsquo;ll let you write code in a very OOP-like fashion, but everything seems to work a bit more smoothly if you embrace a more Lispy approach.&lt;/p&gt;
&lt;p&gt;For most of us that means a &lt;em&gt;different&lt;/em&gt; approach. For example, by default Scheme doesn&amp;rsquo;t have an method to &lt;code&gt;break&lt;/code&gt; a loop or &lt;code&gt;return&lt;/code&gt; early from a function, at least not like most languages&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;. This isn&amp;rsquo;t a bug, or an oversight. You just don&amp;rsquo;t &lt;em&gt;need&lt;/em&gt; them when you start thinking in a Lispy Way.&lt;/p&gt;
&lt;p&gt;Lisp, and by extension Scheme, has a historical mystique to it. It&amp;rsquo;s a fundamental part of the history of machine learning and programming language creation.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/10/16/xkcd_lisp_cycles.png&#34;
    alt=&#34;XKCD comic. panel one &amp;amp; two has 2 people talking one says Lisp is over a hald a century old and it still has this perfect timeless air about it. I wonder if the cycles will continue forever. A few coders from each new generation rediscovering the Lisp Arts. In the third panel someone in a jedi robe is holding a pile of paretheses. They say These are your father&amp;#39;s paretheses. Elegant weapons for a more… civilized age.&#34;&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/10/16/xkcd_lisp_god_perl.jpg&#34;
    alt=&#34;Three panel XKCD coming. In the first two there&amp;#39;s a person floating in empty blue space saying last night i drifted off while reading a lisp book. suddenly, i was bathed in a suffusion of blue. at once, just like they said, i felt a great enlightenment. i saw the naked structure of lisp code unfold before me. my god it&amp;#39;s full of car&amp;#39;s the patterns and metapatterns danced. syntax faded, and i swam in the purity of quantified conception. of ideas manifest. truly, this was the language from which the goos wrought the universe. Then, in the third panel the Christian God appears and says: no, it&amp;#39;s not. i mean, ostensibly, yes. honestly, we hacked most of it together with perl.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;I learned it because - at the time - I hadn&amp;rsquo;t done any functional programming and I wanted try something that would give me new challenges &amp;amp; force me to learn new ways to solve problems. Common Lisp&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;, &amp;amp; Scheme gave me that. Those learnings helped give me new solutions to problems in my day job too.&lt;/p&gt;
&lt;p&gt;But I&amp;rsquo;ve been finding real joy - and frustration - in having to implement little things that we take for granted in other languages. For example, yesterday I needed to extract the first, or last N elements of an array. In Ruby I could do something simple like this.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;long_array&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;6&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;8&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;9&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;array_start&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;long_array&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;# =&amp;gt; [1, 2, 3]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;array_end&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;long_array&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;..]&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;# =&amp;gt; [8, 9, 10]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Scheme has a lot of list manipulation functions, but it&amp;rsquo;s also missing a lot of things we take for granted, so when I didn&amp;rsquo;t find a function to do this (see below), I figured I had to write my own. This is frustrating when you&amp;rsquo;re trying to get something done quickly, but it can also be joyful in that it makes you stop and think about simple things. &amp;ldquo;🤔 how &lt;em&gt;do&lt;/em&gt; I efficiently select a subset of a list?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;My solution uses &lt;a href=&#34;https://en.wikipedia.org/wiki/Tail_call&#34;&gt;tail recursion&lt;/a&gt;, and Scheme&amp;rsquo;s ability to define a function within a function which lets me expose a wrapper function (&lt;code&gt;first-n&lt;/code&gt;) to the world that doesn&amp;rsquo;t force the users to deal with passing in an accumulator, and doesn&amp;rsquo;t add a second top-level method to this module that future me will have to think about separately. It also doesn&amp;rsquo;t use any loop / iteration functionality. It&amp;rsquo;s radically different than how I&amp;rsquo;d solve the same problem in Ruby, but I think it&amp;rsquo;s also a pretty Lispy solution, that runs quickly.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;; returns the first n elements of the list&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;define &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;first-n&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;number&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;a-list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;define &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;inner-first-n&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;number&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;inner-list&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;accumulator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;or &lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;eq? &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;length &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;accumulator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;number&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;               &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;null? &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;inner-list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;nv&#34;&gt;accumulator&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;inner-first-n&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;number&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                         &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;cdr &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;inner-list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                         &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;append &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;accumulator&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;list &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;car &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;inner-list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))))))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;&amp;gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;length &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;a-list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;number&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;inner-first-n&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;number&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;a-list&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nv&#34;&gt;a-list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Scheme&amp;rsquo;s got a lot of oddly named functions, so occasionally you&amp;rsquo;ll not find a built-in one just because you don&amp;rsquo;t know what keyword to search for. In this case, I didn&amp;rsquo;t know the built-in methods for this behavior were called &lt;code&gt;take&lt;/code&gt; and &lt;code&gt;take-right&lt;/code&gt;, and I&amp;rsquo;d never heard anyone refer to that behavior as &amp;ldquo;taking&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Even when I found those, I had to modify things, because those methods don&amp;rsquo;t behave well when you pass in a list that&amp;rsquo;s shorter than the number you&amp;rsquo;re trying to take, and Scheme doesn&amp;rsquo;t have built-in try/catch exception handling like most languages&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;. There are libraries to do it of course, but the point is that even when there is a &amp;ldquo;battery&amp;rdquo; - built in or 3rd party - you frequently need to futz with it.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;; returns the first n elements of the list&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;; or the entire list if its length is &amp;lt; number&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;define &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;first-n&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;number&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;a-list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;&amp;lt;= &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;length &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;a-list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;number&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nv&#34;&gt;a-list&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;take&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;a-list&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;number&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Thinking about this as I write it, this &lt;em&gt;sounds&lt;/em&gt; terrible. Admittedly, sometimes it is damn annoying having to write so many wee low-level functions.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve got a module that just a bunch of list manipulation functions to let me easily implement common tasks that aren&amp;rsquo;t built in, like sorting a list of strings. Every one of those represents a little bit of learning, a problem that I&amp;rsquo;d never have to solve in my day job.&lt;/p&gt;
&lt;p&gt;Each one of those is also written in a way that matches my brain. That too is one of the arguments for, and against, Lisps. Codebases, it is argued, tend to end up looking like &lt;a href=&#34;https://en.wikipedia.org/wiki/Domain-specific_language&#34;&gt;DSLs&lt;/a&gt; where everything is a function tailored to the specific purpose of the app. You can end up with a codebase that makes weirdly specific things incredibly easy, but also requires a longer spin-up time for new team members because so much of it is written using custom functions instead of generic &amp;ldquo;batteries&amp;rdquo; from the language.&lt;/p&gt;
&lt;h2 id=&#34;parting-thoughts&#34;&gt;Parting thoughts&lt;/h2&gt;
&lt;p&gt;When starting a new project, ask yourself if you want to get something written quickly, or if you want to learn new things. If you want to learn new things, maybe checkout a language like Scheme.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re interested in learning a Scheme I&amp;rsquo;d highly recommend you check out &lt;a href=&#34;https://racket-lang.org/&#34;&gt;Racket&lt;/a&gt;. It&amp;rsquo;s got a ton of 3rd party libraries so you don&amp;rsquo;t have to write everything from scratch, and the documentation of them tends to be very high quality. &lt;a href=&#34;https://call-cc.org/&#34;&gt;Chicken Scheme&lt;/a&gt;&amp;rsquo;s pretty good too, with a good ecosystem of 3rd party libraries&lt;sup id=&#34;fnref:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt; but I find the documentation of most libraries to be simultaneously comprehensive, maddening, and nearly useless. For example, every function listed with a sentence or two describing what it does, but each description is based on a pile of domain knowledge that people new to the library, or new to the language don&amp;rsquo;t have.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;post-script-about-the-parentheses&#34;&gt;Post Script About The Parentheses&lt;/h2&gt;
&lt;p&gt;Whinging about Lisp&amp;rsquo;s parenthesis is a lot like being fatphobic. It&amp;rsquo;s claiming something is &amp;ldquo;bad&amp;rdquo; or &amp;ldquo;lesser&amp;rdquo; because you don&amp;rsquo;t like how it looks without any real understanding of why that particular person / thing is the way it is.&lt;/p&gt;
&lt;p&gt;The only people who whinge about Lisp&amp;rsquo;s parentheses are people who don&amp;rsquo;t code Lisp. Not only that, but Scheme is so damn flexible that there are multiple implementations that don&amp;rsquo;t use parentheses. &lt;a href=&#34;https://www.draketo.de/software/wisp.html&#34;&gt;Wisp&lt;/a&gt; (Whitespace to Lisp: &lt;a href=&#34;https://srfi.schemers.org/srfi-119/srfi-119.html&#34;&gt;SRFI-119&lt;/a&gt;), for example, uses indentation levels like Python. The &lt;a href=&#34;https://readable.sourceforge.io/&#34;&gt;Readable Lisp S-expressions Project&lt;/a&gt; uses parentheses, indentation, and curlies and resembles C.&lt;/p&gt;
&lt;p&gt;So it&amp;rsquo;s not just &amp;ldquo;yucking someone&amp;rsquo;s yum&amp;rdquo; because you don&amp;rsquo;t like how it looks, it&amp;rsquo;s also really ignorant because you don&amp;rsquo;t even need to use them.&lt;/p&gt;
&lt;p&gt;To me, Lisp&amp;rsquo;s parentheses are little hugs that keep my codey thoughts safe and secure. They help Lisp to be a &lt;a href=&#34;https://en.wikipedia.org/wiki/Homoiconicity&#34;&gt;homoiconic&lt;/a&gt; language, and every decent editor makes them easy to work with, and helpful. &lt;em&gt;So stop trying to get rid of my hugs!&lt;/em&gt;&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;SRFI: Scheme Request For Implementation. These represent a couple hundred implementations of different useful things (like hash tables). They tend to be written in a generic way that can either be used directly in any Scheme that adheres to the de facto standard called the Revised Report on the Algorithmic Language Scheme (RnRS). E.g. R5RS. Or can be easily ported.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;Most schemes &lt;em&gt;do&lt;/em&gt; have a &lt;code&gt;call-with-current-continuation&lt;/code&gt; function (abbreviated as &lt;code&gt;call/cc&lt;/code&gt;) that allows you to exit a function early. However, there&amp;rsquo;s a huge difference between just returning the result of your calculations directly  (ex.: &lt;code&gt;return &amp;quot;foo&amp;quot;&lt;/code&gt;) and calling a function that takes a function that then gets executed in order to get your result out, but also behaves differently based on how and when it&amp;rsquo;s called.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;I started with Common Lisp, but parts of it frustrated me, and at the time the community seemed essentially dead,  and the library options (number of 3rd party batteries) was almost non-existent. It&amp;rsquo;s gotten much better since the introduction of the &lt;a href=&#34;https://www.quicklisp.org/&#34;&gt;Quicklisp library manager&lt;/a&gt;.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:4&#34;&gt;
&lt;p&gt;Yes, of course there are libraries that implement modern try / catch style exception handling. They&amp;rsquo;re just not &amp;ldquo;batteries&amp;rdquo; that are included by default.&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:5&#34;&gt;
&lt;p&gt;Unfortunately Chicken Scheme uses a centralized &lt;a href=&#34;https://en.wikipedia.org/wiki/Apache_Subversion&#34;&gt;Subversion&lt;/a&gt; repository for sharing &amp;ldquo;eggs&amp;rdquo; (libraries). The process around this is so fucking obnoxious, and requires so much obscure hoop jumping that I&amp;rsquo;m not bothering to update the one library that I did submit.&amp;#160;&lt;a href=&#34;#fnref:5&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Feature Chats</title>
      <link>https://weblog.masukomi.org/2024/08/09/feature-chats/</link>
      <pubDate>Fri, 09 Aug 2024 00:00:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2024/08/09/feature-chats/</guid>
      <description>&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;A casual look a the power of discussing your side-project with like-minded friends.&lt;/p&gt;
&lt;h2 id=&#34;once-upon-a-time&#34;&gt;Once Upon A Time&lt;/h2&gt;
&lt;p&gt;…there were two developers, who needed help staying on top of their team&amp;rsquo;s Pull Requests. One developer said &amp;ldquo;I shall write an app to help myself! I shall query the GitHub API and expose the things that matter in a way that works for my brain!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;They started pondering aloud how they would approach the problem, and soon the other developer said things like &amp;ldquo;ooh&amp;rdquo; and &amp;ldquo;cool&amp;rdquo; and &amp;ldquo;you could…&amp;rdquo;&lt;/p&gt;
&lt;p&gt;But, the developers soon realized that while they both wanted to stay on top of their team&amp;rsquo;s work, they had very different priorities and needs. The second developer, having seen the value of the core idea, set off to make a very different app. Their parting was amicable. Two friends with different needs.&lt;/p&gt;
&lt;p&gt;As the days unfolded, the developers would get together and chat as they munched upon their breakfast or lunch. They would discuss the problems they were working through, and features they were considering. Ideas, suggestions, and even warnings from hard-won experience were shared. Each developer cheering their friends successes, and helping them when things were difficult.&lt;/p&gt;
&lt;h2 id=&#34;recently&#34;&gt;Recently&lt;/h2&gt;
&lt;p&gt;Those discussions branched into two different apps. &lt;a href=&#34;https://dacharycarey.com/&#34;&gt;Dachary&lt;/a&gt; made &lt;a href=&#34;https://prfocus.app/&#34;&gt;PR Focus&lt;/a&gt;, and I made DevGood, which I&amp;rsquo;ve yet to release. Simultaneously, I&amp;rsquo;ve been working on &lt;a href=&#34;https://backupbrain.app/&#34;&gt;Backup Brain&lt;/a&gt; which is a completely unrelated Bookmark Manager. Dachary&amp;rsquo;s got a handful of unreleased iOS apps she&amp;rsquo;s been working on in the background too.&lt;/p&gt;
&lt;p&gt;Yesterday Dachary was discussing how she&amp;rsquo;d implemented the upcoming ability to &amp;ldquo;Tag&amp;rdquo; Pull Requests in PR Focus. I&amp;rsquo;d already implemented tags&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; in Backup Brain and pointed out, that while she doesn&amp;rsquo;t need to address it in the initial version she &lt;em&gt;will&lt;/em&gt; need to support the ability to rename tags, and have it change on &lt;em&gt;all&lt;/em&gt; the PRs with that tag. She pointed out that that &amp;ldquo;just worked&amp;rdquo; because of how she&amp;rsquo;d designed her data model.&lt;/p&gt;
&lt;p&gt;I realized that in my quest to &lt;em&gt;not&lt;/em&gt; fall into the trap of using MongoDB as if it were a relational database, I&amp;rsquo;d gone too far and &lt;em&gt;not&lt;/em&gt; used relations when I should have. I&amp;rsquo;d &amp;ldquo;painted myself into a corner&amp;rdquo; as it were.&lt;/p&gt;
&lt;p&gt;This morning, as we munched on breakfast and she chatted about how close she was to finishing tag support, I realized that my situation was even worse. I want Backup Brain to autocomplete tag names as you type them in, but I can only do that efficiently with a centralized list of tags.&lt;/p&gt;
&lt;h2 id=&#34;insight&#34;&gt;Insight&lt;/h2&gt;
&lt;p&gt;My tags problem is pretty trivial in the grand scheme of coding problems, but Dachary noticed the very non-trivial thing that surrounded it: our discussions.&lt;/p&gt;
&lt;p&gt;Our apps have become &lt;em&gt;so&lt;/em&gt; much better as a direct result of the discussions we&amp;rsquo;ve had. Sometimes it&amp;rsquo;s as simple as solving a problem by &lt;a href=&#34;https://en.wikipedia.org/wiki/Rubber_duck_debugging&#34;&gt;Rubber Ducking&lt;/a&gt; it with the other person. Sometimes we avoid issues entirely by describing what we were thinking of doing, and having the other person point out problems we hadn&amp;rsquo;t foreseen, or alternative approaches which would be way better. Sometimes the other person has hard experiences &amp;amp; perspectives that we don&amp;rsquo;t, because they&amp;rsquo;ve lived different lives &amp;amp; learned different things&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;She noticed that it didn&amp;rsquo;t matter if the apps we were discussing were even remotely related. The same challenges come up again and again in wildly divergent codebases. She codes in Swift &amp;amp; Swift UI. I code in, well a lot of things, but usually Ruby and Rails. She&amp;rsquo;s working on user requested features for her PR Tracking app. I&amp;rsquo;m working on random stuff for a Bookmarking app, and yet we &lt;em&gt;keep&lt;/em&gt; coming across places where the current work, or work that came up in discussions is relevant to what we&amp;rsquo;re working on &lt;em&gt;today&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&#34;takeaway&#34;&gt;Takeaway&lt;/h2&gt;
&lt;p&gt;Being best friends with a developer you trust and live with is uncommon. We have a definite advantage over most in this regard, but that kind of arrangement isn&amp;rsquo;t required. What you need is a similarly minded geeky friend with projects of their own, someone who&amp;rsquo;d enjoy chatting about their geeky projects with you just as much as you&amp;rsquo;d enjoy chatting about yours with them.&lt;/p&gt;
&lt;p&gt;Find someone you can hop on a call with over lunch &amp;amp; work through an idea. Set up weekly chats, or meet-ups. Talk about your code. Shoot the shit. Enjoy your friend, and help their project be great. Let them do the same for you. Allow yourself, and your friend to dig into whatever part of the discussion seems interesting. Drill down on &amp;ldquo;silly&amp;rdquo; programming details and questions. Allow yourself to &lt;em&gt;be ignorant&lt;/em&gt; in front of them, and allow &lt;em&gt;your friend&lt;/em&gt; to help explain things to you. Trust them to not think less of you for not knowing literally everything. Do the same for them.&lt;/p&gt;
&lt;p&gt;It doesn&amp;rsquo;t matter if you code in the same language, framework or whatever. The only thing that matters is that you&amp;rsquo;ve both got projects you&amp;rsquo;re frequently working on.&lt;/p&gt;
&lt;p&gt;So, go forth, find a friend, and chat! Make better apps. Become a better developer.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;I&amp;rsquo;ve spent a lot of time thinking about, and hunting down existing academic research on &amp;ldquo;tagging&amp;rdquo; in knowledge managers. There&amp;rsquo;s some &lt;em&gt;very&lt;/em&gt; cool research that&amp;rsquo;s been done on &lt;em&gt;how&lt;/em&gt; people categorize and retrieve information, and how we can support that with tags &amp;amp; related techniques.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;It&amp;rsquo;s almost as if diverse perspectives within your team help make a better product that helps more people. Imagine a world where automatic soap dispensers worked for &lt;em&gt;all&lt;/em&gt; the black people, and AI didn&amp;rsquo;t spout disproven racist medical advice to doctors! &lt;em&gt;Gasp!&lt;/em&gt; &lt;a href=&#34;https://www.linkedin.com/posts/new-york-university_more-than-a-glitch-activity-7046111943182442496-ZcLV?utm_source=share&amp;amp;utm_medium=member_desktop&#34;&gt;this post &amp;amp; short video&lt;/a&gt; about &lt;a href=&#34;https://www.linkedin.com/in/meredithbroussard/&#34;&gt;Meredith Brousarrd&lt;/a&gt;&amp;rsquo;s book &lt;a href=&#34;https://amzn.to/3M1ZJtX&#34;&gt;More Than a Glitch&lt;/a&gt;: confronting race, gender, and ability bias in Tech.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Announcing Backup Brain</title>
      <link>https://weblog.masukomi.org/2024/07/23/announcing-backup-brain/</link>
      <pubDate>Tue, 23 Jul 2024 00:00:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2024/07/23/announcing-backup-brain/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#what-is-backup-brain&#34;&gt;What Is Backup Brain?&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#bookmark-managers&#34;&gt;Bookmark Managers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#why-make-it&#34;&gt;Why Make It&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#pinboard-limitations&#34;&gt;Pinboard Limitations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#a-desire-for-more&#34;&gt;A Desire For More&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#should-you-try-it&#34;&gt;Should You Try It?&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#current-features&#34;&gt;Current Features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#installation-concerns&#34;&gt;Installation Concerns&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#geeks&#34;&gt;Geeks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-future&#34;&gt;The Future&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#summary&#34;&gt;Summary&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve just released a free self-hosted bookmarks manager called &lt;a href=&#34;https://backupbrain.app&#34;&gt;Backup Brain&lt;/a&gt;. I&amp;rsquo;m &lt;em&gt;really&lt;/em&gt; proud of it, and I&amp;rsquo;d like to introduce it, and share some thoughts about it, and its future.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/07/23/backup_brain_screenshot.png&#34;
    alt=&#34;a screenshot of my backup brain&#34;&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;what-is-backup-brain&#34;&gt;What Is Backup Brain?&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Right now&lt;/em&gt;, &lt;a href=&#34;https://backupbrain.app&#34;&gt;Backup Brain&lt;/a&gt; is just a &lt;a href=&#34;https://en.wikipedia.org/wiki/Self-hosting_(web_services)&#34;&gt;self-hosted&lt;/a&gt; Bookmarks manager, like &lt;a href=&#34;https://pinboard.in&#34;&gt;Pinboard.in&lt;/a&gt;. I think it&amp;rsquo;s a little nicer looking&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;, but I&amp;rsquo;m biased.&lt;/p&gt;
&lt;p&gt;It has great search, and creates a &amp;ldquo;Reader View&amp;rdquo; style archive of every page you visit. That way you&amp;rsquo;ll always have the important information, even if the bookmarked page disappears; even if you can&amp;rsquo;t afford to pay for a service. You can download those archives as Markdown files too.&lt;/p&gt;
&lt;p&gt;Being able to share a page of useful bookmarks is pretty important to me, but sometimes I bookmark things that are a little bit personal. I added support for private bookmarks, that you can only see when logged in, and &lt;a href=&#34;https://backupbrain.app/setting_up_remote_access/&#34;&gt;instructions for setting up remote access&lt;/a&gt; if you want to host it locally.&lt;/p&gt;
&lt;p&gt;To make adding bookmarks easier there are extensions for Chrome &amp;amp; Firefox, as well as a bookmarklet. &lt;a href=&#34;https://backupbrain.app/helpers/&#34;&gt;The Helpers page&lt;/a&gt; has screenshots and more information.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&#34;https://backupbrain.app/&#34;&gt;BackupBrain.app&lt;/a&gt; web site has a lot of documentation, including instructions on how to share an app on your local network with the wider world.&lt;/p&gt;
&lt;h3 id=&#34;bookmark-managers&#34;&gt;Bookmark Managers&lt;/h3&gt;
&lt;p&gt;If you&amp;rsquo;re not familiar with bookmarks managers, the basic idea is that the bookmarking tools in browsers are pretty crappy, and extremely limited. A bookmark manager is an app built specifically for helping you manage hundreds or thousands of bookmarks. More importantly, they have good tools for helping you &lt;em&gt;find&lt;/em&gt; what you&amp;rsquo;re looking for in those large piles.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re not frustrated by the bookmark management tools in your browser then you don&amp;rsquo;t need one.&lt;/p&gt;
&lt;h2 id=&#34;why-make-it&#34;&gt;Why Make It&lt;/h2&gt;
&lt;p&gt;First, you need to understand that - for me - bookmarks are a disability accommodation tool. I have an extremely bad memory. I need a tool that&amp;rsquo;ll help me find those really useful web pages I encountered, that I can&amp;rsquo;t remember enough to search for. I also need something to help me find useful pages that I completely forgot about the existence of.&lt;/p&gt;
&lt;p&gt;When a friend is struggling to find information on some topic we both have an interest in, it makes me happy to be able to link them to a page of tagged bookmarks about it.&lt;/p&gt;
&lt;p&gt;Right now I&amp;rsquo;ve got about 12,670 bookmarks on a wide swath of topics.&lt;/p&gt;
&lt;h3 id=&#34;pinboard-limitations&#34;&gt;Pinboard Limitations&lt;/h3&gt;
&lt;p&gt;I&amp;rsquo;ve happily paid for Pinboard.in for years now, because it&amp;rsquo;s good service, and the guy behind seems to have &lt;em&gt;no&lt;/em&gt; design to muck with it to make it more flashy, get more sales, or whatever. But there are two problems with Pinboard. The first is that he could keel over dead or just get sick of dealing with it at any time, and I don&amp;rsquo;t want to loose my bookmarks. Every time there&amp;rsquo;s a blip in Pinboard&amp;rsquo;s service I worry.&lt;/p&gt;
&lt;p&gt;The second problem is that he doesn&amp;rsquo;t want to auto-renew subscriptions, but instead reminds users that their subscription is about to expire, and asks them to take an action. This is very considerate, and probably how most subscriptions &lt;em&gt;should&lt;/em&gt; work, but it&amp;rsquo;s a problem when it intersects with my ADHD and my hatred of email. Twice now I have forgotten to renew within a month of my service running out. Given the fact that I use bookmarks constantly, you&amp;rsquo;d think this wouldn&amp;rsquo;t be able to happen. Unfortunately, there&amp;rsquo;s no visual distinction between a paid account and a free one. The only significant difference is that the paid account creates archives.&lt;/p&gt;
&lt;p&gt;After a month of non-payment all your archives are deleted. This is totally reasonable, but it also means that twice now I&amp;rsquo;ve lost archives of pages that no longer exist. I don&amp;rsquo;t want there to be a third time.&lt;/p&gt;
&lt;h3 id=&#34;a-desire-for-more&#34;&gt;A Desire For More&lt;/h3&gt;
&lt;p&gt;Even if there was some magical guarantee that Pinboard would remain, and I&amp;rsquo;d never loose my archives, there&amp;rsquo;s functionality I want that it doesn&amp;rsquo;t have, and will never get.&lt;/p&gt;
&lt;p&gt;For example, on Mastodon you can &amp;ldquo;bookmark&amp;rdquo; a post. I want those bookmarks to show up in my bookmark manager. I could bookmark the page, but it&amp;rsquo;s more clicking to get to the post&amp;rsquo;s page to bookmark it, but that doesn&amp;rsquo;t really work when I&amp;rsquo;m using a mobile client, and I don&amp;rsquo;t think that treating it like any other web page is the best way to handle that.&lt;/p&gt;
&lt;p&gt;What if my bookmark manager could silently ingest my Mastodon &amp;ldquo;bookmarks&amp;rdquo; in the background, archive them, and expose them to the search engine that makes it easy to find my web bookmarks.&lt;/p&gt;
&lt;h2 id=&#34;should-you-try-it&#34;&gt;Should You Try It?&lt;/h2&gt;
&lt;p&gt;It depends. Obviously, I&amp;rsquo;d only suggest it if you actually feel the need for a bookmark manager. If bookmarking things in the browser works fine for you then keep doing that.&lt;/p&gt;
&lt;p&gt;If you &lt;em&gt;do&lt;/em&gt; need a bookmarks manager, and like the idea of &lt;a href=&#34;https://backupbrain.app/self_hosted/&#34;&gt;a self-hosted one&lt;/a&gt; then… maybe.&lt;/p&gt;
&lt;h3 id=&#34;current-features&#34;&gt;Current Features&lt;/h3&gt;
&lt;p&gt;At the time of writing (July 25, 2024) Backup Brain is at v1.2.0, and it&amp;rsquo;s been my &amp;ldquo;&lt;a href=&#34;https://en.wiktionary.org/wiki/daily_driver&#34;&gt;daily driver&lt;/a&gt;&amp;rdquo; for a while now.&lt;/p&gt;
&lt;p&gt;I think it&amp;rsquo;s great, but I don&amp;rsquo;t want to mislead anyone about its current capabilities or limitations. For everyday bookmarking, and bookmark sharing it&amp;rsquo;s got everything you need.&lt;/p&gt;
&lt;p&gt;At the same time there are some little features that haven&amp;rsquo;t made it in yet. For example, the tags management is pretty minimal. There&amp;rsquo;s no way to mass-rename a tag, or view a list of bookmarks that share two or more tags, and tag names don&amp;rsquo;t autocomplete when creating an new bookmark.&lt;/p&gt;
&lt;p&gt;To get a good idea of the kinds of things that are still missing, as well as features coming up in the near-term, check out the &lt;a href=&#34;https://github.com/masukomi/backup_brain/issues&#34;&gt;GitHub issues for the project&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;d like to use Backup Brain, but there&amp;rsquo;s some missing feature that you can&amp;rsquo;t live without, please &lt;a href=&#34;https://github.com/masukomi/backup_brain/issues/new/choose&#34;&gt;file a new ticket&lt;/a&gt;, or drop me a line &lt;a href=&#34;https://corporaterunaways.social/@backup_brain&#34;&gt;on Mastodon&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;installation-concerns&#34;&gt;Installation Concerns&lt;/h3&gt;
&lt;p&gt;I haven&amp;rsquo;t managed to containerize it yet, or put together any other &amp;ldquo;one-click install&amp;rdquo; solution. So, it requires you to follow &lt;a href=&#34;https://backupbrain.app/getting_started/&#34;&gt;a bunch of well-documented, installation instructions&lt;/a&gt; that assume a bit of general geekery and basic command line familiarity.&lt;/p&gt;
&lt;p&gt;I would be &lt;em&gt;ridiculously&lt;/em&gt; thankful for any help with this. Docker and I are &lt;em&gt;not&lt;/em&gt; friends. I&amp;rsquo;d also love to get a Raspberry Pi image that people could load up with minimal geekery.&lt;/p&gt;
&lt;h3 id=&#34;geeks&#34;&gt;Geeks&lt;/h3&gt;
&lt;p&gt;If you&amp;rsquo;re looking for a bookmark manager you can tweak to match your brain, this one is written in Ruby on Rails, and it&amp;rsquo;s &lt;em&gt;mostly&lt;/em&gt; open source.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Mostly&amp;rdquo; being the restriction that you can only use it for non-commercial purposes. I&amp;rsquo;m not really thrilled with the trend of companies or individuals taking other people&amp;rsquo;s free labor, selling it, and never contributing even a fraction of the value back. Open source developers deserve better.&lt;/p&gt;
&lt;p&gt;It is not currently my intent to offer Backup Brain as a paid service, but I am leaving that as an option for the future.&lt;/p&gt;
&lt;h2 id=&#34;the-future&#34;&gt;The Future&lt;/h2&gt;
&lt;p&gt;As noted in the section on why I made this, I intend to support background ingestion of bookmarks from a mastodon account (&lt;a href=&#34;https://github.com/masukomi/backup_brain/issues/56&#34;&gt;ticket here&lt;/a&gt;). I want to be able to edit archives. Ultimately, I want to build this into a place where you can store and find &lt;em&gt;any&lt;/em&gt; useful thing you encounter in your regular computing. Important emails? Maybe. Special photos? Why not?&lt;/p&gt;
&lt;p&gt;I intend to keep working on this for a very long time, even if I&amp;rsquo;m the only user. At the same time, I want to share this with others. I hope that other people will derive as much value from this as I have.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://backupbrain.app/&#34;&gt;Backup Brain&lt;/a&gt; is a bookmark manager with dreams of becoming much more. It&amp;rsquo;s taken a lot of work, and I&amp;rsquo;m really proud of it, but it&amp;rsquo;s going to be a little bit before it&amp;rsquo;s easy for non-geeks to install it.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d love to hear from you &lt;a href=&#34;https://corporaterunaways.social/@backup_brain&#34;&gt;on Mastodon&lt;/a&gt; if you install it or have any questions.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;I haven&amp;rsquo;t been a designer for ages. I&amp;rsquo;m sure some of you could make it look better than it does. The mobile view &lt;em&gt;definitely&lt;/em&gt; needs help. My focus has been on what you&amp;rsquo;ll see in a desktop app. If you&amp;rsquo;ve got design chops, and even a passing familiarity with Bootstrap, there&amp;rsquo;s &lt;a href=&#34;https://github.com/masukomi/backup_brain/issues/63&#34;&gt;an open ticket&lt;/a&gt;. I&amp;rsquo;d love some help.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Using Org Mode With Hugo</title>
      <link>https://weblog.masukomi.org/2024/07/19/using-org-mode-with-hugo/</link>
      <pubDate>Fri, 19 Jul 2024 00:00:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2024/07/19/using-org-mode-with-hugo/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#hugo-s-built-in-org-mode-support&#34;&gt;Hugo&amp;rsquo;s built-in org-mode support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#ox-hugo&#34;&gt;Ox-Hugo&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#basic-usage&#34;&gt;Basic Usage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#configuration&#34;&gt;Configuration&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#dot-dir-locals&#34;&gt;.dir-locals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#keyword&#34;&gt;keyword&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#helpful-bits-and-info&#34;&gt;Helpful Bits &amp;amp; Info&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#where-the-post-goes&#34;&gt;Where the post goes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#frontmatter-helpers&#34;&gt;Frontmatter Helpers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#auto-generated-metadata&#34;&gt;Auto-generated metadata&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#image-and-alt-text&#34;&gt;Image &amp;amp; Alt Text&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#relative-link-helpers&#34;&gt;Relative Link Helpers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#things-to-watch-out-for&#34;&gt;Things to watch out for&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#frontmatter&#34;&gt;Frontmatter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#shortcodes&#34;&gt;Shortcodes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#org-entities&#34;&gt;org-entities&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;This post is for people who already understand why org-mode is the &amp;ldquo;greatest thing since sliced bread&amp;rdquo; &amp;amp; want to build a static web site with &lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;hugo-s-built-in-org-mode-support&#34;&gt;Hugo&amp;rsquo;s built-in org-mode support&lt;/h2&gt;
&lt;p&gt;Hugo supports &lt;a href=&#34;https://orgmode.org/&#34;&gt;org-mode&lt;/a&gt; files by default thanks to the &lt;a href=&#34;https://github.com/niklasfasching/go-org&#34;&gt;go-org&lt;/a&gt; library. It will allow you to create blog posts with &lt;code&gt;.org&lt;/code&gt; files &lt;em&gt;and&lt;/em&gt; &lt;code&gt;.md&lt;/code&gt; files. &lt;em&gt;However&lt;/em&gt; I recommend that you &lt;em&gt;don&amp;rsquo;t&lt;/em&gt; use this option.&lt;/p&gt;
&lt;p&gt;go-org has the same problem that every non-Emacs implementation of org has. It doesn&amp;rsquo;t implement support for everything org-mode can do, and org-mode can do &lt;em&gt;a lot&lt;/em&gt;. It&amp;rsquo;s mostly good, but mostly only gets you &lt;em&gt;most&lt;/em&gt; of your needs, not &lt;em&gt;all&lt;/em&gt; of them. It&amp;rsquo;s one of those situations where it &lt;em&gt;seems&lt;/em&gt; good, until you start stumbling across little things that don&amp;rsquo;t work right or aren&amp;rsquo;t supported. The more you post, the more likely it is to frustrate you in the long run.&lt;/p&gt;
&lt;h2 id=&#34;ox-hugo&#34;&gt;Ox-Hugo&lt;/h2&gt;
&lt;p&gt;I recommend you us &lt;a href=&#34;https://ox-hugo.scripter.co/&#34;&gt;ox-hugo&lt;/a&gt;. It&amp;rsquo;s an excellent org-mode exporter that takes your org-mode file, converts it to Hugo friendly Markdown with TOML frontmatter. It can be configured to use YAML frontmatter but you&amp;rsquo;ll probably never look at the generated file so I don&amp;rsquo;t know why you would.&lt;/p&gt;
&lt;h3 id=&#34;basic-usage&#34;&gt;Basic Usage&lt;/h3&gt;
&lt;p&gt;The idea is pretty simple. You have some org-mode files of blog posts you&amp;rsquo;re working on. When you&amp;rsquo;re ready, you tell ox-hugo to export them, and it generates Hugo-friendly Markdown files.&lt;/p&gt;
&lt;p&gt;You can &lt;em&gt;also&lt;/em&gt; have it create a blog post from a &amp;ldquo;subtree&amp;rdquo; of an org-mode file. That is to say &amp;ldquo;This heading and everything under it should be a blog post&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll want to keep your org-mode files in a directory &lt;em&gt;other&lt;/em&gt; than Hugo&amp;rsquo;s &lt;code&gt;content&lt;/code&gt; directory, because we don&amp;rsquo;t want it to even &lt;em&gt;think&lt;/em&gt; about your org-mode files. We only want it to consider the Markdown files we generate.&lt;/p&gt;
&lt;p&gt;At the root of my hugo site I have a &lt;code&gt;proto_posts&lt;/code&gt; directory where I create all my new blog posts. It doesn&amp;rsquo;t matter what you call it, and it doesn&amp;rsquo;t matter if you use a directory structure inside of it. It doesn&amp;rsquo;t even matter if you have it &lt;em&gt;in&lt;/em&gt; your hugo site. You could even keep all your writing in &lt;a href=&#34;https://protesilaos.com/emacs/denote&#34;&gt;Denote&lt;/a&gt; or &lt;a href=&#34;https://www.orgroam.com/&#34;&gt;Org-roam&lt;/a&gt; collections.&lt;/p&gt;
&lt;h3 id=&#34;configuration&#34;&gt;Configuration&lt;/h3&gt;
&lt;p&gt;Because the org-mode files could be literally anywhere on your computer, you need to tell &lt;code&gt;ox-hugo&lt;/code&gt; what directory to export to.&lt;/p&gt;
&lt;h4 id=&#34;dot-dir-locals&#34;&gt;.dir-locals&lt;/h4&gt;
&lt;p&gt;If you&amp;rsquo;re writing them to a directory within your hugo folder like I am, then you can add a &lt;code&gt;.dir-locals.el&lt;/code&gt; file at the root of your hugo folder with the following content.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;nil&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;.&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;org-hugo-base-dir&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;.&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;~/path/to/weblog.masukomi.org/&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is an especially nice way of handling it if you&amp;rsquo;re managing multiple sites. Each one can have its own &lt;code&gt;.dir-locals.el&lt;/code&gt; file to make sure your &lt;code&gt;proto_posts&lt;/code&gt; always end up in the correct &lt;code&gt;content&lt;/code&gt; directory.&lt;/p&gt;
&lt;h4 id=&#34;keyword&#34;&gt;keyword&lt;/h4&gt;
&lt;p&gt;There are cases where using a &lt;code&gt;.dir-locals&lt;/code&gt; file isn&amp;rsquo;t an option. For example, you might use &lt;a href=&#34;https://protesilaos.com/emacs/denote&#34;&gt;Denote&lt;/a&gt; or &lt;a href=&#34;https://www.orgroam.com/&#34;&gt;Org-roam&lt;/a&gt; for all your writing and want to export to multiple blogs from that. In that case you&amp;rsquo;ll need to use a keyword in your org-mode metadata (frontmatter)&lt;/p&gt;
&lt;p&gt;&lt;code&gt;#+hugo_base_dir: ~/path/to/my/site&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&#34;helpful-bits-and-info&#34;&gt;Helpful Bits &amp;amp; Info&lt;/h3&gt;
&lt;h4 id=&#34;where-the-post-goes&#34;&gt;Where the post goes&lt;/h4&gt;
&lt;p&gt;Most hugo sites are broken up into &amp;ldquo;sections&amp;rdquo;. Typically it&amp;rsquo;s one collection of &amp;ldquo;pages&amp;rdquo; that live at the top level. Things like your &amp;ldquo;about&amp;rdquo; page. The files for these typically live under &lt;code&gt;content/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Usually there&amp;rsquo;s a collection of &amp;ldquo;posts&amp;rdquo; too. The posts are what we&amp;rsquo;re typically interacting with when we visit a blog and these live under &lt;code&gt;content/post/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;In order to control &lt;em&gt;where&lt;/em&gt; your exported file goes we use the &lt;code&gt;hugo_section keyword&lt;/code&gt;. &lt;em&gt;Most&lt;/em&gt; of the time you&amp;rsquo;ll be creating a post, so &lt;em&gt;most&lt;/em&gt; of the time it looks like this.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;#+hugo_section: post&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;But if you needed a file at the top level you&amp;rsquo;d use this&lt;/p&gt;
&lt;p&gt;&lt;code&gt;#+hugo_section: /&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;It can be any folder name or even subtrees like &lt;code&gt;post/journal/2024&lt;/code&gt; depending on the theme you&amp;rsquo;re using for your Hugo site.&lt;/p&gt;
&lt;h4 id=&#34;frontmatter-helpers&#34;&gt;Frontmatter Helpers&lt;/h4&gt;
&lt;p&gt;ox-hugo tries really hard to not interfere with common org-mode metadata keywords. The official ox-hugo keywords are &lt;a href=&#34;https://ox-hugo.scripter.co/doc/org-meta-data-to-hugo-front-matter/#for-file-based-exports&#34;&gt;listed here&lt;/a&gt;. In practice, I suspect that most people will have some form of auto-generated metadata like I show below, so it&amp;rsquo;s pretty rare that you&amp;rsquo;ll have to think about frontmatter.&lt;/p&gt;
&lt;p&gt;Fortunately for us ox-hugo&amp;rsquo;s creator gave emacs everything it&amp;rsquo;d need to populate the autocomplete with all the options. Just type &lt;code&gt;#+hugo_&lt;/code&gt; and look through the list.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/07/19/hugo_frontmatter_helpers.png&#34;
    alt=&#34;a screenshot of the autocomplete menu shown after typing pound plus hugo underscore&#34;&gt;
&lt;/figure&gt;

&lt;h4 id=&#34;auto-generated-metadata&#34;&gt;Auto-generated metadata&lt;/h4&gt;
&lt;p&gt;Auto-generated metadata (frontmatter) is a massive time-saver. So the first thing I do when I open a new file for a blog post is to type &lt;code&gt;hfm&lt;/code&gt; to invoke my &amp;ldquo;Hugo FrontMatter&amp;rdquo; snippet (using &lt;a href=&#34;https://github.com/joaotavora/yasnippet&#34;&gt;YASnippet&lt;/a&gt; of course).&lt;/p&gt;
&lt;p&gt;This sets up all the frontmatter I need, &amp;amp; generates the date strings.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-nil&#34; data-lang=&#34;nil&#34;&gt;# -*- mode: snippet -*-
# name: hugo-frontmatter
# key: hfm
# --
#+author: masukomi
#+hugo_publishdate: `(format-time-string &amp;#34;%Y-%m-%dT%T%z&amp;#34;)`
#+date: `(format-time-string &amp;#34;%Y-%m-%dT%T%z&amp;#34;)`
#+hugo_auto_set_lastmod: t
#+filetags: $1
#+toc: headlines 3
#+hugo_draft: false
#+hugo_section: ${2:posts}
#+hugo_custom_front_matter: :summary &amp;#34;I NEED A SUMMARY&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Things to note about that snippet&lt;/p&gt;
&lt;p&gt;There is no &lt;code&gt;#+title: …&lt;/code&gt; line. This is because my process is such that whenever I open a new &lt;code&gt;.org&lt;/code&gt; file for blogging it auto-populates with a name generated from the file name. If your process doesn&amp;rsquo;t do that, then add a &lt;code&gt;#+title: $1&lt;/code&gt; line above the &lt;code&gt;#+author&lt;/code&gt; line, and be sure to increment the numbers after &lt;code&gt;filetags&lt;/code&gt; and &lt;code&gt;hugo_section&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;For those who don&amp;rsquo;t know the dollar-sign numbers in YASnippet are essentially fields you fill in and tab to the next one. Your cursor will jump through them in numerical order starting with 1.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve set &lt;code&gt;hugo_draft&lt;/code&gt; to &lt;code&gt;false&lt;/code&gt; because of how I work.&lt;/p&gt;
&lt;p&gt;The other thing to note is the &lt;code&gt;#+toc: headlines 3&lt;/code&gt; This is for ox-hugo&amp;rsquo;s &lt;a href=&#34;https://ox-hugo.scripter.co/doc/org-toc/&#34;&gt;table of contents generation&lt;/a&gt; which is arguably superior to the TOC generation that Hugo has built in. If you don&amp;rsquo;t want a table of contents on your post, just delete that line.&lt;/p&gt;
&lt;p&gt;To be explicit, this is separate functionality from that provided by &lt;a href=&#34;https://github.com/snosov1/toc-org/tree/master&#34;&gt;toc-org&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;image-and-alt-text&#34;&gt;Image &amp;amp; Alt Text&lt;/h4&gt;
&lt;p&gt;All you need to do to insert an image is to create a &lt;code&gt;file:&lt;/code&gt; link to something with a common image file extension like &lt;code&gt;.jpg&lt;/code&gt; or &lt;code&gt;.png&lt;/code&gt;. It&amp;rsquo;ll just do the right thing.&lt;/p&gt;
&lt;p&gt;The problem with this is that it provides no alt-text for blind readers and you might want a descriptive title for the image.&lt;/p&gt;
&lt;p&gt;To address these we use the &lt;code&gt;ATTR_HTML&lt;/code&gt; keyword with &lt;code&gt;:alt&lt;/code&gt; or &lt;code&gt;:title&lt;/code&gt; respectively. These aren&amp;rsquo;t ox-hugo specific. They&amp;rsquo;re what you&amp;rsquo;d use if you had an org document that was going to ultimately be converted to HTML.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-nil&#34; data-lang=&#34;nil&#34;&gt;#+ATTR_HTML: :alt a cute black and white puppy being cradled in my lap
#+ATTR_HTML: :title our new puppy
[[file:/images/path/to/puppy.jpg]]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;That would get converted to:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-nil&#34; data-lang=&#34;nil&#34;&gt;{{&amp;lt; figure src=&amp;#34;/images/path/to/puppy.jpg&amp;#34; alt=&amp;#34;a cute black and white puppy being cradled in my lap&amp;#34; title=&amp;#34;our new puppy&amp;#34; &amp;gt;}}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ox-hugo is using Hugo&amp;rsquo;s &lt;a href=&#34;https://gohugo.io/content-management/shortcodes/#figure&#34;&gt;figure shortcode&lt;/a&gt;, because Markdown doesn&amp;rsquo;t actually support alt tags, or titles&lt;/p&gt;
&lt;p&gt;Note that, just like in normal Hugo Markdown, the path you use needs to be the path that will work on the final generated site. For example: the images on this site are under &lt;code&gt;/images&lt;/code&gt; but in my hugo folder they&amp;rsquo;re under &lt;code&gt;static/images/&lt;/code&gt; Whenever I insert an image I have to use a &lt;code&gt;/images/…&lt;/code&gt; path to make it work in the final rendered site.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m sure someone could combine some elisp and the &lt;code&gt;hugo_base_dir&lt;/code&gt; info to enable the images to be displayed inline but I don&amp;rsquo;t really care.&lt;/p&gt;
&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;My Hugo Image Snippet&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t like having to worry about unique image names. I always keep the images for a post in a dated folder that matches the post&amp;rsquo;s date. For example: this posts images are in a folder named &lt;code&gt;/images/2024/07/19/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;When I want to insert an image into the page I type &lt;code&gt;himage&lt;/code&gt; to invoke the following snippet that generates the alt and title keywords + pre-populates the image url with a date based folder path.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-nil&#34; data-lang=&#34;nil&#34;&gt;# -*- mode: snippet -*-
# name: hugo-image
# key: himage
# --

#+ATTR_HTML: :alt $2
#+ATTR_HTML: :title
[[file:`(format-time-string &amp;#34;/images/%Y/%m/%d/&amp;#34;)`$1]]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Note that the cursor starts inside the link path because I&amp;rsquo;ve usually got the image filename on my clipboard. I can then just paste, &amp;amp; tab over to start writing the alt text.&lt;/p&gt;
&lt;p&gt;Most of the time I delete the title line.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;relative-link-helpers&#34;&gt;Relative Link Helpers&lt;/h4&gt;
&lt;p&gt;Cross-referencing other pages on your site is pretty common. The problem that Hugo is solving with &lt;a href=&#34;https://gohugo.io/content-management/cross-references/&#34;&gt;ref &amp;amp; relref shortcodes&lt;/a&gt; is that, without reading the frontmatter of the file you&amp;rsquo;re linking to, &amp;amp; pondering how Hugo will interpret it, you don&amp;rsquo;t know the final url of the page you&amp;rsquo;re linking to. For example: pages on this site are all prefaced with year, month, and date that the post was initially published, but that&amp;rsquo;s all calculated from the frontmatter during Hugo&amp;rsquo;s build process. All I know when writing is that it&amp;rsquo;s generated from a file called &amp;ldquo;my_relative_file.md&amp;rdquo; in the same &lt;code&gt;content/post/&lt;/code&gt; directory that the file I&amp;rsquo;m linking from will be in.&lt;/p&gt;
&lt;p&gt;Shortcode handling is a little problematic in ox-hugo. See &lt;a href=&#34;#shortcodes&#34;&gt;Shortcodes&lt;/a&gt; below. To create a &lt;code&gt;relref&lt;/code&gt; link you&amp;rsquo;d have to write something like this.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-nil&#34; data-lang=&#34;nil&#34;&gt;@@hugo:[foo]({{&amp;lt; relref &amp;#34;my_relative_file.md&amp;#34; &amp;gt;}})@@
OR
[foo](@@hugo:{{&amp;lt; relref &amp;#34;my_relative_file.md&amp;#34; &amp;gt;}}@@)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I don&amp;rsquo;t like having to type that obnoxious line and there&amp;rsquo;s a reasonable chance I&amp;rsquo;ll make a typo or misremember something when writing the filename.&lt;/p&gt;
&lt;p&gt;So, I&amp;rsquo;ve added a couple functions to &lt;a href=&#34;https://github.com/masukomi/masuconfigs/blob/master/.doom.d/config.org&#34;&gt;my emacs config&lt;/a&gt; to make inserting a &lt;code&gt;rel&lt;/code&gt; or &lt;code&gt;relref&lt;/code&gt; link work just like inserting any other link.&lt;/p&gt;
&lt;p&gt;Now I can&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;use &lt;code&gt;C-c l&lt;/code&gt; to insert a link&lt;/li&gt;
&lt;li&gt;choose or type &lt;code&gt;ref:&lt;/code&gt; or &lt;code&gt;relref:&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;hit return, and navigate to the path of the other file under hugo&amp;rsquo;s &lt;code&gt;content&lt;/code&gt; directory.&lt;/li&gt;
&lt;li&gt;select the file I want&lt;/li&gt;
&lt;li&gt;enter a description.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When I export it will convert it to a markdown style link with the &lt;code&gt;ref&lt;/code&gt; / &lt;code&gt;relref&lt;/code&gt; shortcode for the url.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;;; New link type for Org-Hugo internal links&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;with-eval-after-load&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;&amp;#39;ox-hugo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;org-link-set-parameters&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;s&#34;&gt;&amp;#34;relref&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;nb&#34;&gt;:complete&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;lambda&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;               &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;concat&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;s&#34;&gt;&amp;#34;relref:&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;file-name-nondirectory&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;read-file-name&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;File: &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;               &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;nb&#34;&gt;:export&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;lambda&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;path&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;description&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;backend&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;             &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;format&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;[%s]({{&amp;lt; relref %s &amp;gt;}})&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;description&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;path&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;org-link-set-parameters&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;s&#34;&gt;&amp;#34;ref&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;nb&#34;&gt;:complete&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;lambda&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;               &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;concat&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;s&#34;&gt;&amp;#34;ref:&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;file-name-nondirectory&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;read-file-name&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;File: &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;               &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;nb&#34;&gt;:export&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;lambda&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;path&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;description&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;backend&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;             &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;format&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;[%s]({{&amp;lt; ref %s &amp;gt;}})&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;description&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;path&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note that there is no &lt;code&gt;:follow&lt;/code&gt; function set. Clicking on these links in org-mode won&amp;rsquo;t go anywhere. This is intentional because the link is going to the markdown file used when the site is generated, but I don&amp;rsquo;t know where the org-mode file used to generate that markdown file is, and &lt;em&gt;that&lt;/em&gt; is the file you&amp;rsquo;d want to open.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve considered changing &lt;code&gt;rel:&lt;/code&gt; &amp;amp; &lt;code&gt;relref:&lt;/code&gt; to &lt;code&gt;hugorel:&lt;/code&gt; &amp;amp; &lt;code&gt;hugorelref:&lt;/code&gt; but it&amp;rsquo;s not currently interfering with anything. If you do change it to something else be sure that the initial string and the text after &lt;code&gt;concat&lt;/code&gt; match each other.&lt;/p&gt;
&lt;h3 id=&#34;things-to-watch-out-for&#34;&gt;Things to watch out for&lt;/h3&gt;
&lt;h4 id=&#34;frontmatter&#34;&gt;Frontmatter&lt;/h4&gt;
&lt;p&gt;I expected that it&amp;rsquo;d just convert all the org-mode metadata / frontmatter, but it defaults to only converting a common subset of it, that it knows Hugo will want. &lt;a href=&#34;https://ox-hugo.scripter.co/doc/org-meta-data-to-hugo-front-matter/#for-file-based-exports&#34;&gt;Here&amp;rsquo;s a table documenting those&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I assume that the thinking is that org-mode files can have a lot of frontmatter that has nothing to do with your eventual blog-post.&lt;/p&gt;
&lt;p&gt;There are two ways to solve this. For most people who need a non-standard keyword you&amp;rsquo;ll just want to add this to your org mode frontmatter. You&amp;rsquo;d just change &lt;code&gt;:key&lt;/code&gt; and &lt;code&gt;&amp;quot;value&amp;quot;&lt;/code&gt; to whatever hugo frontmatter key &amp;amp; value you want.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;#+hugo_custom_front_matter: :key &amp;quot;value&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re converting subtrees of a larger document into individual posts then you can use Properties. This is documented in the &lt;a href=&#34;https://ox-hugo.scripter.co/doc/org-meta-data-to-hugo-front-matter/&#34;&gt;Org meta-data to Hugo front-matter&lt;/a&gt; post.&lt;/p&gt;
&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;summary keyword&lt;/p&gt;
&lt;p&gt;ox-hugo doesn&amp;rsquo;t pass on the &lt;code&gt;summary&lt;/code&gt; keyword which many Hugo themes use to display a short summary under your posts. Without this, most Hugo themes will just use the first bit of text in the post. If you use Tables of Contents, like I do in most of my posts, then that&amp;rsquo;s going to produce terrible summaries.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;tags&lt;/p&gt;
&lt;p&gt;offically you should use &lt;code&gt;#+hugo_tags: tag_a tag_b&lt;/code&gt; but I&amp;rsquo;ve been using &lt;code&gt;#+filetags&lt;/code&gt; and that converts just fine.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;shortcodes&#34;&gt;Shortcodes&lt;/h4&gt;
&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Using Them&lt;/p&gt;
&lt;p&gt;ox-hugo is good, but Hugo&amp;rsquo;s shortcodes are a problem because &lt;code&gt;{{&amp;lt; … &amp;gt;}} and {{% … %}}&lt;/code&gt; are not legal Org syntax.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;ox-hugo has &lt;a href=&#34;https://ox-hugo.scripter.co/doc/shortcodes&#34;&gt;multiple ways of addressing this&lt;/a&gt;. Most blog posts don&amp;rsquo;t really use shortcodes much. The most you&amp;rsquo;ll probably want on a semi-regular basis is something quick and inline rather than a multi-line block you can use these handy escapes.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-nil&#34; data-lang=&#34;nil&#34;&gt;@@hugo:..@@ &amp;lt;-- for Hugo templating stuff
@@md:..@@   &amp;lt;-- for raw Markdown stuff
@@html:..@@ &amp;lt;-- for raw HTML stuff
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;For example, if I wanted to create a &lt;a href=&#34;https://gohugo.io/content-management/cross-references/&#34;&gt;relref&lt;/a&gt; link i could say&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-nil&#34; data-lang=&#34;nil&#34;&gt;@@hugo:[foo]({{&amp;lt; relref &amp;#34;my_relative_file.md&amp;#34; &amp;gt;}})@@
OR
[foo](@@hugo:{{&amp;lt; relref &amp;#34;my_relative_file.md&amp;#34; &amp;gt;}}@@)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Basically it&amp;rsquo;s saying &amp;ldquo;Just let hugo deal with whatever&amp;rsquo;s in here.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Because creating links to other posts on your site is a pretty common thing I&amp;rsquo;ve created a couple helper functions to make this less prone to typos &amp;amp; more natural feeling to org-mode users. See &lt;a href=&#34;#relative-link-helpers&#34;&gt;Relative Link Helpers&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Blogging About Shortcodes&lt;/p&gt;
&lt;p&gt;Documenting the markup of a language without invoking the markup of the language is a pain in most (all?) markup languages. In this case we&amp;rsquo;re actually dealing with two layers of this. We don&amp;rsquo;t want to have the shortcodes invoked in the exported file, and we don&amp;rsquo;t want any org-mode syntax (like asterisks for bolding) to be invoked in the org-mode file.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://liatas.com/posts/escaping-hugo-shortcodes/&#34;&gt;Chris Liatas&lt;/a&gt; discovered the simple solution of sticking a comment inside the shortcode.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/07/19/documenting_shortcodes.png&#34;
        alt=&#34;a screenshot showing how to insert a comment inside a shortcode in order to trick hugo into showing the shortcode and then how to trick org-mode into not using the asterisks in that comment as bolding indicators&#34;&gt;
    &lt;/figure&gt;

&lt;p&gt;So everywhere in this document where you see something like &lt;code&gt;{{&amp;lt; … &amp;gt;}}&lt;/code&gt; or &lt;code&gt;{{% … %}}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;What I&amp;rsquo;ve actually typed in the original is two curlies, the &lt;code&gt;&amp;lt;&lt;/code&gt; or &lt;code&gt;%&lt;/code&gt;, then &lt;code&gt;/* … */&lt;/code&gt;, and then the closing characters for the shortcode.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;org-entities&#34;&gt;org-entities&lt;/h4&gt;
&lt;p&gt;Org-mode has built in support for laTex style &lt;a href=&#34;https://orgmode.org/manual/Special-Symbols.html&#34;&gt;special characters&lt;/a&gt;. John Cook has a nice blog post that helps explain why these are potentially useful. As a simple example &lt;code&gt;\ast&lt;/code&gt; represents an asterisk.&lt;/p&gt;
&lt;p&gt;In writing this post I discovered that ox-hugo &lt;em&gt;does not&lt;/em&gt; convert them. So you end up with a literal &lt;code&gt;\ast&lt;/code&gt; in your markdown. I&amp;rsquo;ve &lt;a href=&#34;https://github.com/kaushalmodi/ox-hugo/issues/742&#34;&gt;filed a bug&lt;/a&gt; documenting the problem. If you&amp;rsquo;re reading at some point after July 2024, and want to use org-entities you should check the status of that ticket.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;I don&amp;rsquo;t really understand why this is illegal syntax since org-mode doesn&amp;rsquo;t seem to complain when I enter them but it doesn&amp;rsquo;t really matter. What matters is that they give ox-hugo headaches.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Amazon Bricked My Kindle</title>
      <link>https://weblog.masukomi.org/2024/07/18/amazon-bricked-my-kindle/</link>
      <pubDate>Thu, 18 Jul 2024 00:00:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2024/07/18/amazon-bricked-my-kindle/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#current-status&#34;&gt;Current Status&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#my-kindle&#34;&gt;My Kindle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#me&#34;&gt;Me&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#lessons-learned&#34;&gt;Lessons Learned&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#a-quick-aside&#34;&gt;A quick aside&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#open-hardware&#34;&gt;Open Hardware&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#the-open-book&#34;&gt;The Open Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#epub-inkplate&#34;&gt;EPub-InkPlate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#it-s-all-irrelevant&#34;&gt;It&amp;rsquo;s all Irrelevant&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#drm&#34;&gt;DRM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#long-term-support&#34;&gt;Long Term Support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#alternatives&#34;&gt;Alternatives&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#kobo&#34;&gt;Kobo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#boox&#34;&gt;Boox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#nook&#34;&gt;Nook&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#conclusion&#34;&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#2-month-update&#34;&gt;2 Month Update&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;Yesterday I discovered that Amazon had decreed that my Kindle e-ink device was too old. This post is my 🧠-dump of a intensive afternoon &amp;amp; evening of researching what to replace it with.&lt;/p&gt;
&lt;h2 id=&#34;current-status&#34;&gt;Current Status&lt;/h2&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/07/18/kindle_no_longer_available.jpg&#34;
    alt=&#34;a photograph of my kindle showing a message that claims the Kidle Store is no longer available on this device, and letting me know i can still shop for books. It has a misleading claim about being able to still deliver them to my device.&#34;&gt;
&lt;/figure&gt;

&lt;h3 id=&#34;my-kindle&#34;&gt;My Kindle&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;It can no longer sync purchases.&lt;/li&gt;
&lt;li&gt;It can no longer access the Kindle Book store.&lt;/li&gt;
&lt;li&gt;Contrary to the claims in the photograph above, new books &lt;em&gt;can not&lt;/em&gt; be delivered directly to this kindle.&lt;/li&gt;
&lt;li&gt;It no longer shows up as a USB device when plugged in to a computer.
&lt;ul&gt;
&lt;li&gt;Thus you cannot &amp;ldquo;Download &amp;amp; Transfer via USB&amp;rdquo;. When you choose that option it says &amp;ldquo;You do not have any compatible devices registered for this content. Buy a Kindle or get the free Kindle reading app.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Thus Calibre can&amp;rsquo;t interact with it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It can read the books that are already loaded on it, and it still receives new advertisements to display at me, because &lt;em&gt;of course&lt;/em&gt; it fucking does.&lt;/p&gt;
&lt;p&gt;As far as I can tell there is &lt;em&gt;no&lt;/em&gt; reason it needed to be bricked other than greed.&lt;/p&gt;
&lt;h3 id=&#34;me&#34;&gt;Me&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Pissed at Amazon.
Increasingly so as I learned more.&lt;/li&gt;
&lt;li&gt;Still want an e-ink tool to read books on. I have a &lt;a href=&#34;https://remarkable.com&#34;&gt;Remarkable 2&lt;/a&gt; tablet, but while it can display eBook format books it can&amp;rsquo;t run the Kindle app and thus can&amp;rsquo;t get around the DRM on Kindle eBooks&lt;/li&gt;
&lt;li&gt;Not afraid of a soldering iron if I&amp;rsquo;ve got decent instructions&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Really&lt;/em&gt; dislike e-readers without physical buttons to change pages.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;lessons-learned&#34;&gt;Lessons Learned&lt;/h2&gt;
&lt;h3 id=&#34;a-quick-aside&#34;&gt;A quick aside&lt;/h3&gt;
&lt;p&gt;Amazon has a tech called &amp;ldquo;Immersive Reading&amp;rdquo;. When you have purchased the Kindle and Audible copies of the same book, and that book is &amp;ldquo;Whispersync Enabled&amp;rdquo; You can listen to the Voice actor(s) narrating the story while the kindle software simultaneously highlights the words on the page.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s great for language learning, but &lt;em&gt;also&lt;/em&gt; great for my ADHD because it gives me just enough additional stimulation that I don&amp;rsquo;t go trying to scroll social media.&lt;/p&gt;
&lt;p&gt;There is only one company that makes e-ink hardware that supports Immersive Reading, and it&amp;rsquo;s not Amazon. It&amp;rsquo;s Boox.&lt;/p&gt;
&lt;h3 id=&#34;open-hardware&#34;&gt;Open Hardware&lt;/h3&gt;
&lt;h4 id=&#34;the-open-book&#34;&gt;The Open Book&lt;/h4&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/joeycastillo/The-Open-Book&#34;&gt;The Open Book&lt;/a&gt; project got a bunch of press a while back because it&amp;rsquo;s a decently documented DIY kit for building an e-ink e-reader. &lt;em&gt;However&lt;/em&gt; it&amp;rsquo;s not a viable contender because&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The canonical format for books is plain text with the book title on the first line, OR plain text plus some front matter and some ASCII control codes for chapter breaks and formatting.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In other words, it can&amp;rsquo;t read &lt;em&gt;ANY&lt;/em&gt; of &lt;a href=&#34;https://en.wikipedia.org/wiki/Comparison_of_e-book_formats&#34;&gt;the eBook formats&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;epub-inkplate&#34;&gt;EPub-InkPlate&lt;/h4&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/turgu1/EPub-InkPlate&#34;&gt;EPub-InkPlate&lt;/a&gt; is a project that &lt;em&gt;does&lt;/em&gt; support ePub on InkPlate hardware. &lt;em&gt;However&lt;/em&gt; the documentation is crap, and assumes a ridiculous amount of domain knowledge. I have no idea how to install it or how much custom twiddling is required to make it work.&lt;/p&gt;
&lt;h4 id=&#34;it-s-all-irrelevant&#34;&gt;It&amp;rsquo;s all Irrelevant&lt;/h4&gt;
&lt;p&gt;Even if there &lt;em&gt;was&lt;/em&gt; an open hardware device that was physically identical to a modern Kindle it couldn&amp;rsquo;t read their &lt;a href=&#34;https://en.wikipedia.org/wiki/Digital_rights_management&#34;&gt;DRM&lt;/a&gt; encrypted files.&lt;/p&gt;
&lt;h3 id=&#34;drm&#34;&gt;DRM&lt;/h3&gt;
&lt;p&gt;For those who don&amp;rsquo;t know, Kindle ebooks are all encrypted with &lt;a href=&#34;https://en.wikipedia.org/wiki/Digital_rights_management&#34;&gt;DRM&lt;/a&gt;. What most people don&amp;rsquo;t realize is that Amazon can, &lt;em&gt;and does&lt;/em&gt;, sometimes remove books you&amp;rsquo;ve purchased from the marketplace and devices that have downloaded them. Additionally some kindle devices will delete all the files if the device can&amp;rsquo;t connect to the server within a pre-defined time window. For example, if you turn off wifi to conserve an old battery.&lt;/p&gt;
&lt;p&gt;When you buy a kindle ebook you&amp;rsquo;re not technically &amp;ldquo;buying&amp;rdquo; the book. You&amp;rsquo;re purchasing a license to read the book which can be revoked at any time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Unfortunately it appears that Calibre can&amp;rsquo;t strip the new DRM from their KFX (Kindle 10) format, as of July 2024.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/strong&gt; The only tool I know of that can remove KFX DRM is &lt;a href=&#34;https://www.leawo.org/drm-ebook-converter/&#34;&gt;Leawo Prof. DRM eBook Converter&lt;/a&gt;. However, the &lt;code&gt;.epub&lt;/code&gt; file it generates lacks &lt;em&gt;all&lt;/em&gt; the formatting. It&amp;rsquo;s just a big long piece of plain text that you&amp;rsquo;ll never want to actually read. &lt;a href=&#34;https://epubor.com/&#34;&gt;Epubor Ultimate&lt;/a&gt; can also strip the DRM, but its file also seems to also lack formatting.&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Historically I would open up Calibre every now and then, import my recently purchased Kindle books, strip the &lt;a href=&#34;https://en.wikipedia.org/wiki/Digital_rights_management&#34;&gt;DRM&lt;/a&gt; and have a backup so that Amazon couldn&amp;rsquo;t remove it. I could then load books non-kindle e-books that I&amp;rsquo;d purchased elsewhere onto my kindle over USB.&lt;/p&gt;
&lt;p&gt;The combination of DRM that Calibre can&amp;rsquo;t strip, &amp;amp; the fact that My kindle no longer acts as a USB device you can connect to means that I am prevented from loading legally obtained books onto my kindle. This includes ones purchased from amazon with DRM left intact.&lt;/p&gt;
&lt;p&gt;In the wise words of Cory Doctorow, &amp;ldquo;&lt;a href=&#34;https://locusmag.com/2019/09/cory-doctorow-drm-broke-its-promise/&#34;&gt;DRM Broke its promise&lt;/a&gt;&amp;rdquo;&lt;/p&gt;
&lt;h3 id=&#34;long-term-support&#34;&gt;Long Term Support&lt;/h3&gt;
&lt;p&gt;Amazon removes support for devices after 10 years. Kobo removes support after about 8. This seems a ridiculously long time in the world of consumer electronics, but you have to understand that there&amp;rsquo;s no reason an old e-reader can&amp;rsquo;t keep working just as well as it did on it&amp;rsquo;s first day, so long as it&amp;rsquo;s got a functional battery.&lt;/p&gt;
&lt;p&gt;For context, the last update to the ePub format was updated was 13 years ago in 2011 &amp;amp; e-ink devices can, and do receive software updates to support new formats. The most recent kindle format is KFX which was released 9 years ago in 2015. My kindle has happily opened many Amazon purchased books since then.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s no good reason ereader devices shouldn&amp;rsquo;t be supported long after they&amp;rsquo;re sold.&lt;/p&gt;
&lt;h3 id=&#34;alternatives&#34;&gt;Alternatives&lt;/h3&gt;
&lt;h4 id=&#34;kobo&#34;&gt;Kobo&lt;/h4&gt;
&lt;p&gt;The Kobo Libra Colour is a beautiful device that has real buttons to turn pages. None of the currently available Kindle e-readers have buttons.&lt;/p&gt;
&lt;p&gt;The Libra Colour is well reviewed, but it has the same problem all the other Kobo&amp;rsquo;s have. The Kobo store has a notably worse selection than Amazons. Their audio book selection is - comparably - even worse. Since it&amp;rsquo;s an Amazon competitor, there is no Kindle app that you can run on it.&lt;/p&gt;
&lt;p&gt;They don&amp;rsquo;t have an equivalent to &amp;ldquo;Immersive Reading&amp;rdquo; in their e-ink devices or phone apps, and it wouldn&amp;rsquo;t matter if they did because their audiobook selection is much worse than Audible&amp;rsquo;s.&lt;/p&gt;
&lt;p&gt;Them having a worse store is because Amazon has a functional monopoly on the publishing industry.&lt;/p&gt;
&lt;p&gt;They also remove support for old devices after roughly 8 years vs. Amazon&amp;rsquo;s 10. It&amp;rsquo;s unclear if they brick devices after they&amp;rsquo;re too old like amazon does.&lt;/p&gt;
&lt;p&gt;So, it doesn&amp;rsquo;t matter how good the Kobo software is. Unless you have &amp;ldquo;money to burn&amp;rdquo; and can afford a an Amazon device, &lt;em&gt;and&lt;/em&gt; a Kobo device, it&amp;rsquo;s a worse choice as a consumer.&lt;/p&gt;
&lt;h4 id=&#34;boox&#34;&gt;Boox&lt;/h4&gt;
&lt;p&gt;As far as I can tell, Boox is the only manufacturer who&amp;rsquo;s e-ink devices support &amp;ldquo;Immersive Reading&amp;rdquo;. I don&amp;rsquo;t know why. They&amp;rsquo;re not doing anything special to enable this. It&amp;rsquo;s just an Android e-Ink device running the standard Android Kindle software.&lt;/p&gt;
&lt;p&gt;In the case of the Poke5 device they&amp;rsquo;re using the exact same screen as some Kindle devices so it&amp;rsquo;s not an issue of refresh rate.&lt;/p&gt;
&lt;p&gt;Of Boox&amp;rsquo;s devices the Poke5 is the only one that&amp;rsquo;s directly comparable to a Kindle e-reader. The rest are significantly more expensive because they&amp;rsquo;re intended to do significantly more than just read eBooks.&lt;/p&gt;
&lt;p&gt;Because it&amp;rsquo;s running Android it can run the Kindle software, the Kobo software, and apps to download eBooks from your library.&lt;/p&gt;
&lt;p&gt;However, there are some issues, and one of them is a deal-breaker.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Despite using the same screen the hardware is objectively worse than the Kindle Paperwhite when it comes to the task of being an eReader. Lots of minor ways that add up. The most notable for me was that the layers of material they place on top of the display result in a visibly worse contrast ratio.&lt;/li&gt;
&lt;li&gt;Boox devices run a custom flavor of Android, and they only guarantee support for a device for 3 years. Eventually, they&amp;rsquo;ll stop updating it, and it won&amp;rsquo;t be able to get updates from modern apps in the Google Play store. It&amp;rsquo;s just a question of &amp;ldquo;when&amp;rdquo; and there&amp;rsquo;s no way to predict the answer.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;There&amp;rsquo;s also the fact that my library has a &lt;em&gt;horrible&lt;/em&gt; selection of e-books&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt; and an almost non-existent selection of audio books. I&amp;rsquo;ve literally never found the book i was looking for when searching their options. As such, it&amp;rsquo;s not worth considering.&lt;/p&gt;
&lt;h4 id=&#34;nook&#34;&gt;Nook&lt;/h4&gt;
&lt;p&gt;Tied to a struggling book store (Barnes &amp;amp; Noble), notably more expensive than comparable Kobos, the Boox Poke5 (despite doing &lt;em&gt;much&lt;/em&gt; less), and the Kindle Paperwhite. Even a Refurbished Nook GlowLight Plus costs more than a Paperwhite. Like the Kobo, B&amp;amp;N&amp;rsquo;s store isn&amp;rsquo;t as good as Amazon&amp;rsquo;s because monopolies suck &amp;amp; DRM is a pain in everyone&amp;rsquo;s ass, except the monopoly&amp;rsquo;s. Like the Kobo, it also can&amp;rsquo;t run a Kindle app.&lt;/p&gt;
&lt;p&gt;The Nook GlowLight 4 Plus does have buttons, which is a significant differentiator, and it does have a headphone jack.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s &lt;a href=&#34;https://youtu.be/EJCzuSI8vHU&#34;&gt;a YouTube review from someone who is a fan of Barnes &amp;amp; Noble&lt;/a&gt; (~14 min), and overall seems to like the hardware, but titled his review &amp;ldquo;Nook GlowLight 4 Plus Review: Premium &amp;amp; Infuriating&amp;rdquo; because of software issues.&lt;/p&gt;
&lt;p&gt;For example the top half of the home screen shows you books from your library, and the bottom half shows you &amp;ldquo;recommendations&amp;rdquo;. I &lt;em&gt;loathe&lt;/em&gt; the similar behavior in Apple&amp;rsquo;s &amp;ldquo;Book&amp;rdquo; app on the iPad.&lt;/p&gt;
&lt;p&gt;Unfortunately I see no good reason for anyone to buy a Nook right now, other than sheer hatred of Amazon, or physical limitations that require you to have physical buttons.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;I don&amp;rsquo;t want to buy an ereader that&amp;rsquo;s going to be abandoned in 3 years.&lt;/li&gt;
&lt;li&gt;There&amp;rsquo;s no realistic Open Hardware option &amp;amp; it couldn&amp;rsquo;t read any book I purchased even if there was one, because no-one&amp;rsquo;s cracked KFX&amp;rsquo;s encryption.&lt;/li&gt;
&lt;li&gt;I can&amp;rsquo;t afford 2 devices, and I don&amp;rsquo;t want to limit my options for what I can read before I&amp;rsquo;ve even bought the device.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It&amp;rsquo;s all a compromise…a &lt;em&gt;bad&lt;/em&gt; compromise.&lt;/p&gt;
&lt;p&gt;The Boox is arguably a better choice with regards to what it can do, but I don&amp;rsquo;t want to have to deal with this crap again in 3+ years because they&amp;rsquo;ve dropped support. The Poke5 provides a worse reading experience than the Paperwhite because of the slightly worse hardware &amp;amp; backlighting, and it still doesn&amp;rsquo;t have any fucking buttons, and it&amp;rsquo;s not waterproof. I don&amp;rsquo;t &lt;em&gt;plan&lt;/em&gt; on using it near water but I have ADHD which means I have &lt;a href=&#34;https://www.brainandlife.org/articles/adhd-causes-motor-skill-problems&#34;&gt;motor control issues&lt;/a&gt; and spill drinks more often than most people.&lt;/p&gt;
&lt;p&gt;The Kobo Libra Colour is the physical device I&amp;rsquo;d &lt;em&gt;love&lt;/em&gt; to use, but the store&amp;rsquo;s worse, especially when it comes to audiobooks &amp;amp; there&amp;rsquo;s no equivalent of &amp;ldquo;Immersive Reading&amp;rdquo; with their e-Ink devices or phone apps.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m &lt;em&gt;going&lt;/em&gt; to keep buying media from Amazon because I don&amp;rsquo;t have an alternative with the books I want (especially the audiobooks) &amp;amp; I &lt;em&gt;really&lt;/em&gt; want to be able to keep using &amp;ldquo;Immersive Reading&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;So, I bought a Kindle Paperwhite, with a slight discount because it just happened to be &amp;ldquo;Prime Day&amp;rdquo;. I couldn&amp;rsquo;t buy one &amp;ldquo;Without Lockscreen Ads&amp;rdquo; because those were &amp;ldquo;sold out&amp;rdquo;. I&amp;rsquo;m honestly wondering if they ever have any in stock.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll have to pay $20 more to get rid of the stupid ads. There was literally no Kindle reader I could buy that had physical buttons.&lt;/p&gt;
&lt;p&gt;While I don&amp;rsquo;t want to, I can go without &amp;ldquo;Immersive Reading&amp;rdquo; on an e-ink screen, because when I use it I&amp;rsquo;m not focusing as hard on the words &amp;amp; &amp;ldquo;reading&amp;rdquo; so much as following the moving highlight to satisfy my stupid ADHD. I&amp;rsquo;ll compromise and use my phone when I want that.&lt;/p&gt;
&lt;p&gt;Sadly, the new Paperwhite is wider than my bricked kindle, so I can&amp;rsquo;t use my beloved &lt;a href=&#34;https://dodocase.com/&#34;&gt;DodoCase&lt;/a&gt; cover and they don&amp;rsquo;t make Kindle covers anymore.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/07/18/kindle_dodocase_triptic.jpg&#34;
    alt=&#34;A triptic. top photo shows my kindle with its case open showing the DodoCase bookplate on the inside of the open cover. The bottom left shows it closed. it looks like a thin hardcover book with an elastic band to hold the cover closed. There&amp;#39;s a Revzilla sticker on it. The bottom right photo shows the cover folded back under the kindle.&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;My Beloved DodoCase cover.&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;2-month-update&#34;&gt;2 Month Update&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve read at least 26 books since writing this post. I regret buying the Kindle Paperwhite instead of the Kobo Libra Color.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The touch screen is obnoxious. I can&amp;rsquo;t count the number of times I&amp;rsquo;ve tried to swipe back and it&amp;rsquo;s gone forward.&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Whispersync&amp;rdquo; has not been available on any of those 26 books despite most of them being from very popular series. I&amp;rsquo;m pretty annoyed about this as it was one of the main reasons I bought the kindle.&lt;/li&gt;
&lt;li&gt;The official case has an uncomfortably sharp edge if you hold them with a finger under the bottom edge to support it.&lt;/li&gt;
&lt;li&gt;The power button is exactly where my finger goes when trying to support it, so even if i find a replacement case it&amp;rsquo;ll have an uncomfortable hole or bump in a bad location.&lt;/li&gt;
&lt;li&gt;The syncing between audio book and ebook is completely useless if you&amp;rsquo;ve dared to listen to / read the book before. It syncs the devices to seemingly random places that are always wrong. The only solution I&amp;rsquo;ve found is to mark the audio book as read, and reset it to the very beginning of the book. If you do this &lt;em&gt;before&lt;/em&gt; you start rereading you&amp;rsquo;ll be ok. Probably.&lt;/li&gt;
&lt;li&gt;There are two different menus hidden at the top.&lt;/li&gt;
&lt;li&gt;Some preferences are hidden in weird places&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;em&gt;only&lt;/em&gt; thing i like about it versus the one they bricked is that it has a nicely backlit screen.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;according to &lt;a href=&#34;https://www.mobileread.com/forums/showthread.php?t=283371&#34;&gt;the official thread on this topic&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Some books that Amazon always delivers with the strongest encryption may not work when downloaded using these programs, however no other method is likely to work for those books anyway.&lt;/p&gt;
&lt;p&gt;The newer Kindle for PC app available in the app store for Windows 11 and the latest Kindle for Mac app (7.0 and later) cannot be used to download usable books.&lt;/p&gt;
&lt;/blockquote&gt;
&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;I can&amp;rsquo;t actually tell for sure if Epubor is loosing all the formatting or not because it will only allow me to see the first half of one random page of the book without paying. It claims you can see 20% of the book without paying but that&amp;rsquo;s a lie. I&amp;rsquo;ve tried two books and it seems like it&amp;rsquo;s loosing the formatting.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;Libraries are absolutely screwed when it comes to ebooks &amp;amp; digital audiobooks. They pay significantly more for them than they do for a paper copy &amp;amp; they can only lend them out a specific number of times, or for a specific time period before they have to pay again.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>TTRPG Archetype Worksheets</title>
      <link>https://weblog.masukomi.org/2024/05/31/ttrpg-archetype-worksheets/</link>
      <pubDate>Fri, 31 May 2024 00:00:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2024/05/31/ttrpg-archetype-worksheets/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#high-level-thoughts&#34;&gt;High Level Thoughts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#my-sheets&#34;&gt;My Sheets&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#custom-remarkable-2-notebooks&#34;&gt;Custom Remarkable 2 Notebooks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#my-current-sheet&#34;&gt;My Current Sheet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#tools&#34;&gt;Tools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#a-call-to-action&#34;&gt;A call to action&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;My game&amp;rsquo;s pretty close to public playtestability. That means I need to put together some character Archetypes.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; In order to do this I&amp;rsquo;ve put together an &lt;span class=&#34;underline&#34;&gt;internal&lt;/span&gt; worksheet for the &lt;span class=&#34;underline&#34;&gt;creation&lt;/span&gt; of classes to make sure I remember to include all the critical bits for each one.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve never heard anyone talk about using this approach but I find it invaluable. I&amp;rsquo;m going to share a couple thoughts about what I&amp;rsquo;ve learned &amp;amp; go over my current one as an example.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/05/31/remarkable_archetype_worksheet.jpg&#34;
    alt=&#34;A hand holds a remarkable 2 tablet with an old version of my Archetype worksheet filled out. In the bottom right corner you can see my black and white dog curled beside my desk.&#34;&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;high-level-thoughts&#34;&gt;High Level Thoughts&lt;/h2&gt;
&lt;p&gt;From my experience, an &lt;em&gt;internal&lt;/em&gt; Archetype/Class worksheets should:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;guide your 🧠 in breaking down a vague Archetype idea into the game relevant sub-sections&lt;/li&gt;
&lt;li&gt;track what common skills / tags / whatever you&amp;rsquo;ve used in this Archetype in a way that makes it easy to flip through the full collection &amp;amp; go &amp;ldquo;oh, damn, i&amp;rsquo;ve got way too much emphasis on fighting&amp;rdquo; (or whatever)&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; AND &amp;ldquo;wow, I never use skill X. Maybe I can drop it.&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When using these it&amp;rsquo;s important that every time you revise your rules around character creation you check your Archetype worksheet &amp;amp; make any applicable changes.&lt;/p&gt;
&lt;p&gt;Whenever you update the worksheet, take an Archetype you&amp;rsquo;re especially familiar with and re-write it on/in the new worksheet. I frequently find that something that&amp;rsquo;s important to me about that Archetype simply doesn&amp;rsquo;t have a place anymore, or its delivery has to be changed in a meaningful way that I may or may not like.&lt;/p&gt;
&lt;p&gt;This is a form of QA testing &amp;amp; playtesting for your character creation rules. If i can&amp;rsquo;t describe an Archetype that fits well with the rules then  either how we describe Archetypes has to change, or our character creation rules have to change.&lt;/p&gt;
&lt;p&gt;Obviously, add a clear version number to your worksheets / character sheets / whatever. Otherwise you can make a small change &amp;amp; then find yourself using an old one and wondering why things feel off. It wouldn&amp;rsquo;t be the first time I&amp;rsquo;ve left a TODO item to make a change I&amp;rsquo;d already made because I was looking at an old sheet.&lt;/p&gt;
&lt;h2 id=&#34;my-sheets&#34;&gt;My Sheets&lt;/h2&gt;
&lt;h3 id=&#34;custom-remarkable-2-notebooks&#34;&gt;Custom Remarkable 2 Notebooks&lt;/h3&gt;
&lt;p&gt;(see the image at the top)&lt;/p&gt;
&lt;p&gt;I took a worksheet, and squeezed it down to the roughly A5 size of the Remarkable 2&amp;rsquo;s screen. You can see the result in the first photo. The lack of writing space was a problem, but more importantly it&amp;rsquo;s a &lt;em&gt;ton&lt;/em&gt; of annoying work to put together a PDF with hyperlinked navigation back and forth between pages &amp;amp; the table of contents.  I have absolutely no desire to go through it again every time I change the worksheet.  So, even if it had a full A4 or Letter sized screen, I still wouldn&amp;rsquo;t bother. Paper&amp;rsquo;s just easier.&lt;/p&gt;
&lt;p&gt;What I would advise is printing out 1 sheet after you make a revision. Just one. Then fill it out. You&amp;rsquo;ll probably go &amp;ldquo;Oh, crap, that… I need a thing here&amp;rdquo;. Edit it. Print 1. Fill it out again. &lt;em&gt;Only&lt;/em&gt; print more &lt;em&gt;after&lt;/em&gt; you&amp;rsquo;ve successfully used one and not wanted to change it should you allow yourself to print more.&lt;/p&gt;
&lt;h3 id=&#34;my-current-sheet&#34;&gt;My Current Sheet&lt;/h3&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/05/31/starborn_archetype_worksheet_v3.png&#34;
    alt=&#34;a screenshot of the current version of my character Archetype worksheet. I&amp;#39;ll describe it below.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;I&amp;rsquo;ve put the version number right there at the top. I used to hide them down at the bottom in small print on my character sheets, but then I&amp;rsquo;d forget to update the number when I updated the character sheet. Now my version numbers live clearly at the top of every page for all the internal versions.&lt;/p&gt;
&lt;p&gt;On the right I&amp;rsquo;ve got all my game&amp;rsquo;s current skills listed with a little dot beside each one. As I&amp;rsquo;m filling out the sheet I incorporate skills into the questions (Mazes Style). Every time I do, I fill in the dot next to the one I just used.&lt;/p&gt;
&lt;p&gt;Each Archetype has a core Aspect (think FATE) &amp;amp; a handful of other Character Aspects people choose via leading questions.&lt;/p&gt;
&lt;p&gt;Like Skills, character aspects have a place on the right. This is the most condensed form of &amp;ldquo;what this Archetype is about?&amp;rdquo; This is good because it helps keep me honest. &amp;ldquo;Does this Archetype actually mechanically provide what it describes?&amp;rdquo; It&amp;rsquo;s also an easy way to flip through your created Archetypes and see if there&amp;rsquo;s a flavor of character you want but haven&amp;rsquo;t offered.&lt;/p&gt;
&lt;p&gt;FATE style aspects can be &amp;ldquo;all over the place&amp;rdquo; so there&amp;rsquo;s no point in trying to have a picklist.&lt;/p&gt;
&lt;p&gt;You may have noticed the dots next to the Character aspects. These are &amp;ldquo;note to self&amp;rdquo; almost for future character sheets. In the same way that many FitD playbooks have you check off character features I like the idea of checking off what Aspects &amp;amp; Skills you&amp;rsquo;re choosing as you work through an Archetype&amp;rsquo;s character creation questions.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not good though. I don&amp;rsquo;t have playbooks. All of this just needs to be transferred to the character sheet which is completely different (more traditional). In theory I can use this when making a new character. In practice I won&amp;rsquo;t. I&amp;rsquo;ll just write things directly into the character sheet &amp;amp; that&amp;rsquo;s what I expect players to do.&lt;/p&gt;
&lt;p&gt;So, mostly it&amp;rsquo;s me not wanting to let go of an idea, BUT this is an INTERNAL sheet. It&amp;rsquo;s just for me. It&amp;rsquo;s OK to leave a little chaff on your internal stuff if you recognize why you&amp;rsquo;re doing it.&lt;/p&gt;
&lt;p&gt;And that brings me to the headings of each section of the main page. These are the briefest of hints to myself. They would be utterly useless to anyone I handed it to, but that&amp;rsquo;s OK. I have written guidelines for what should go into an Archetype. This is &lt;em&gt;my&lt;/em&gt; worksheet &lt;em&gt;for me&lt;/em&gt;. Using personal shorthand is &lt;em&gt;fine&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools&lt;/h2&gt;
&lt;p&gt;These worksheets &amp;amp; my character sheets were created in &lt;a href=&#34;https://www.omnigroup.com/omnigraffle/&#34;&gt;Omnigraffle&lt;/a&gt; which is a &lt;em&gt;glorious&lt;/em&gt; app you should absolutely use. It&amp;rsquo;s designed for flow charts &amp;amp; similar infographics, but it&amp;rsquo;s great at &lt;em&gt;any&lt;/em&gt; form of organized information display. macOS and iPadOS only.&lt;/p&gt;
&lt;p&gt;When I make form fillable things for players, or hyperlinked PDF &amp;ldquo;notebooks&amp;rdquo; for the Remarkable I use &lt;a href=&#34;https://pdf.wondershare.com&#34;&gt;Wondershare PDF Element&lt;/a&gt; which is a good app that keeps getting regular and meaningful updates. Windows, macOS, iOS, Android. I&amp;rsquo;m not in love with it like Omnigraffle, but it&amp;rsquo;s good, and I&amp;rsquo;d suggest giving it a try if you need something like this. There are lots of tutorial videos for how to do specific things too.&lt;/p&gt;
&lt;h2 id=&#34;a-call-to-action&#34;&gt;A call to action&lt;/h2&gt;
&lt;p&gt;If you use a technique like this, please share it. I think we don&amp;rsquo;t talk enough about &lt;em&gt;how&lt;/em&gt; we go about game creation and the tools that work for us.&lt;/p&gt;
&lt;p&gt;If this has given you thoughts or ideas, please let me know. &lt;a href=&#34;https://dice.camp/@masukomi&#34;&gt;My TTRPG Mastodon account&lt;/a&gt; is probably best, but email works too ( &lt;a href=&#34;mailto:masukomi@masukomi.org&#34;&gt;masukomi@masukomi.org&lt;/a&gt; ).&lt;/p&gt;
&lt;p&gt;Also, please let me know if you found &lt;em&gt;any&lt;/em&gt; value in this post (Fediverse / email / courier pigeon). Even just a &amp;ldquo;thanks for that&amp;rdquo;. It kinda feels like I&amp;rsquo;m yelling into the void on this blog. 😉&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;: functionally my Archetypes are &amp;ldquo;classes&amp;rdquo;, but in implementation they&amp;rsquo;re somewhere between Mazes, &amp;amp; Mutant Year Zero.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;: I firmly believe that if your common skills / tags / whatever are all roughly equally useful they should be &lt;em&gt;used&lt;/em&gt; roughly equally. If they&amp;rsquo;re not you&amp;rsquo;ve either made unbalanced defaults &lt;em&gt;or&lt;/em&gt; you&amp;rsquo;ve overestimated the value of the ones that didn&amp;rsquo;t get much attention. This may be a red flag that your current rules aren&amp;rsquo;t emphasizing something you felt was important, or that the game has changed in ways that should make you step back and reconsider what you&amp;rsquo;re making.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Lessons Learned While Making My Game</title>
      <link>https://weblog.masukomi.org/2024/05/25/lessons-learned-while-making-my-game/</link>
      <pubDate>Sat, 25 May 2024 00:00:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2024/05/25/lessons-learned-while-making-my-game/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#background&#34;&gt;Background&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-big-three--plus-1--questions&#34;&gt;The Big Three (+1) Questions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#what-s-your-game-about&#34;&gt;What&amp;rsquo;s Your Game About?&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#core-mechanics-supporting-the-story&#34;&gt;Core Mechanics Supporting the Story:&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#that-but-with-a-twist&#34;&gt;That, but with a twist&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#no-less-dot&#34;&gt;No, less.&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#personal-example&#34;&gt;Personal Example&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#it-s-not-about-that-dot&#34;&gt;It&amp;rsquo;s not about that.&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#a-personal-aside&#34;&gt;A Personal Aside&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#it-s-not-for-them&#34;&gt;It&amp;rsquo;s not for them&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#embrace-constraints&#34;&gt;Embrace Constraints&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#nothing-s-set-in-stone-dot&#34;&gt;Nothing&amp;rsquo;s set in stone.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#it-s-all-about-the-character-sheet-dot&#34;&gt;It&amp;rsquo;s all about the character sheet.&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#needful-things&#34;&gt;Needful Things&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#practical-example&#34;&gt;Practical Example&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#make-the-character-sheet-first&#34;&gt;Make the character sheet first&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#modify-it-through-play&#34;&gt;Modify it through play&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#things-to-keep-in-mind&#34;&gt;Things to keep in mind&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#visual-style-matters&#34;&gt;Visual Style Matters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#do-i-want-to-play-that&#34;&gt;Do I want to play THAT?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#make-space-or-throw-it-out-dot&#34;&gt;Make space or throw it out.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#throw-it-out-if-it-s-not-critical&#34;&gt;Throw it out if it&amp;rsquo;s not critical&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#keep-your-old-sheets&#34;&gt;Keep your old sheets&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#accept-defeat&#34;&gt;Accept Defeat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#narrative-dice-are-kinda-broken&#34;&gt;Narrative Dice Are Kinda Broken&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#two-other-options&#34;&gt;Two other Options&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#solo-playtesting&#34;&gt;Solo Playtesting&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#record-everything&#34;&gt;Record Everything&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#example&#34;&gt;Example&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#if-you-haven-t-tried-solo-role-playing&#34;&gt;If you haven&amp;rsquo;t tried solo role playing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#generating-a-starter-adventure&#34;&gt;Generating a Starter Adventure&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#simple-example&#34;&gt;Simple Example:&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#solo-playtesting-adventures&#34;&gt;Solo Playtesting Adventures&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#what-else&#34;&gt;What else?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#call-to-action&#34;&gt;Call to action&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve been working on a Tabletop Role Playing Game (TTRPG) for years now. It&amp;rsquo;s been a very educational experience, and I wanted to share some of the non-obvious lessons about game design that I&amp;rsquo;ve learned along the way.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a lot of stuff here, and many examples. Please skip anything you already know, or isn&amp;rsquo;t interesting to you. This as a skatter-shot of random learnings, not a homework assignment. 😉&lt;/p&gt;
&lt;p&gt;🙇‍♀️ Disclaimer: this could really use a good editing pass, but after writing so much I needed a break. I&amp;rsquo;d rather you have it unedited then have it sit on my computer for months.&lt;/p&gt;
&lt;h2 id=&#34;background&#34;&gt;Background&lt;/h2&gt;
&lt;p&gt;Before we dig into this, there are some things you need to know about me in order to understand the context I&amp;rsquo;m coming from.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I&amp;rsquo;m a &amp;ldquo;frustration driven developer&amp;rdquo;. Using a thing with obvious flaws drives me buggy and makes me want to fix it.&lt;/li&gt;
&lt;li&gt;I &lt;em&gt;love&lt;/em&gt; game mechanics.&lt;/li&gt;
&lt;li&gt;I love reading other people&amp;rsquo;s RPGs and learning how they approached different gaming problems.&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;m absolutely &lt;em&gt;not&lt;/em&gt; interested in making &amp;ldquo;a better D&amp;amp;D&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;m only mediocre at creating settings.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;rsquo;ve been working on this game for years, not because I&amp;rsquo;m polishing my &amp;ldquo;perfect&amp;rdquo; game. It&amp;rsquo;s taken so long, because I&amp;rsquo;ve learned so much along the way, and had to restart from scratch so many times. It doesn&amp;rsquo;t help that there are so many wonderful games out there that made me feel like &amp;ldquo;yes! like that!&amp;rdquo; and want to throw out whatever core mechanic I had.&lt;/p&gt;
&lt;h2 id=&#34;the-big-three--plus-1--questions&#34;&gt;The Big Three (+1) Questions&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Jared_Sorensen&#34;&gt;Jared Sorenson&lt;/a&gt; is credited with &amp;ldquo;The Big Three Questions&amp;rdquo;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What Is your Game About?&lt;/li&gt;
&lt;li&gt;How Does it Go about That?&lt;/li&gt;
&lt;li&gt;What Behaviors does it reward and/or encourage?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The +1 question is &amp;ldquo;How do you make that fun?&amp;rdquo; I don&amp;rsquo;t know who added it.&lt;/p&gt;
&lt;p&gt;Search for his name and &amp;ldquo;The Big Three Questions&amp;rdquo; and you&amp;rsquo;ll find plenty of details about using them. I think that having answers to all of those is critical to designing a good game. The +1 question is &lt;em&gt;very&lt;/em&gt; subjective. At the same time I believe that it&amp;rsquo;s really important to have a strong opinion on it while designing.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s important to have answers to The Big Three Questions as you set out. That answer may be just a strong feeling, a specific direction to explore, but it needs to be &lt;em&gt;something&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&#34;what-s-your-game-about&#34;&gt;What&amp;rsquo;s Your Game About?&lt;/h2&gt;
&lt;p&gt;There are many different people advising that it&amp;rsquo;s important to know what your game is trying to be, or what kind of stories it&amp;rsquo;s trying to tell. They&amp;rsquo;re right, but I have a more practical take on &lt;em&gt;why&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;What your game cares about, and the kind of experience it&amp;rsquo;s trying to provide, can &lt;em&gt;not&lt;/em&gt; be delivered with a core mechanic that doesn&amp;rsquo;t support that.&lt;/p&gt;
&lt;p&gt;If you don&amp;rsquo;t &lt;em&gt;know&lt;/em&gt; what kind of stories you&amp;rsquo;re trying to tell with your game then you should really pause and ask yourself why you&amp;rsquo;re making one.&lt;/p&gt;
&lt;p&gt;If you just don&amp;rsquo;t like the way your current game handles something, then just homebrew a solution for that. You don&amp;rsquo;t &lt;em&gt;need&lt;/em&gt; to make a whole game.&lt;/p&gt;
&lt;p&gt;In my mind there are two reasons to make a new game:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I want to tell a particular story that no-one else is telling.&lt;/li&gt;
&lt;li&gt;I want a game with a particular perspective and/or vibe that I can&amp;rsquo;t get elsewhere, and can&amp;rsquo;t achieve by simply creating a new setting.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A lot of folks keep wanting to make new &amp;ldquo;generic systems&amp;rdquo; which can tell &amp;ldquo;any&amp;rdquo; kind of story. Please, don&amp;rsquo;t. We have enough&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;, and more importantly &lt;em&gt;every&lt;/em&gt; well designed game that&amp;rsquo;s trying to tell a particular kind of story with a particular vibe, is going to do a radically better job than a generic game system used to do the same thing.&lt;/p&gt;
&lt;h3 id=&#34;core-mechanics-supporting-the-story&#34;&gt;Core Mechanics Supporting the Story:&lt;/h3&gt;
&lt;p&gt;Powered By the Apocalypse (PbtA) games care about emphasizing significant moments, and complicating characters lives in interesting ways. It&amp;rsquo;s one of the best examples of mechanics clearly supporting the story.&lt;/p&gt;
&lt;p&gt;PbtA games &lt;em&gt;specifically&lt;/em&gt; don&amp;rsquo;t care about any decisions your characters make that don&amp;rsquo;t directly contribute to the type of story they&amp;rsquo;re going to tell. You only roll if there&amp;rsquo;s an applicable Move&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;. If there&amp;rsquo;s no move, you don&amp;rsquo;t need to roll. If there&amp;rsquo;s no move, the game doesn&amp;rsquo;t consider what you&amp;rsquo;re doing to be important to its goals.&lt;/p&gt;
&lt;p&gt;There are generally only 3 outcomes too: success, success with complication, or failure, and you&amp;rsquo;re way more likely to get a complicated success than a simple success. This is the game saying that it doesn&amp;rsquo;t care a lot about simple success or failure, but that it likes stories with complicated, and messy progress.&lt;/p&gt;
&lt;p&gt;If you don&amp;rsquo;t know that &amp;ldquo;complicated, and messy progress&amp;rdquo; is what you want, you can&amp;rsquo;t make a core mechanic that supports that, and your game will only feel &amp;ldquo;right&amp;rdquo; if you lucked out in your initial choice.&lt;/p&gt;
&lt;p&gt;PbtA games &lt;em&gt;only&lt;/em&gt; have story supporting mechanics. They don&amp;rsquo;t have mini-games. They don&amp;rsquo;t generally have much in the way of sub-systems. They not only have story supporting mechanics, they &lt;em&gt;don&amp;rsquo;t&lt;/em&gt; tend to have any mechanics that &lt;em&gt;don&amp;rsquo;t&lt;/em&gt; directly support the story. This is what we should all be striving for. Obviously some games need more complexity, and there&amp;rsquo;s nothing inherently wrong with having sub-systems, but we need to focus on throwing out everything that we can that isn&amp;rsquo;t absolutely necessary to tell the stories we want to tell.&lt;/p&gt;
&lt;h4 id=&#34;that-but-with-a-twist&#34;&gt;That, but with a twist&lt;/h4&gt;
&lt;p&gt;Sometimes you love a game, but it&amp;rsquo;s fails to do something that&amp;rsquo;s important to you.&lt;/p&gt;
&lt;p&gt;The core mechanic of &lt;a href=&#34;https://www.ironswornrpg.com&#34;&gt;Ironsworn&lt;/a&gt;, and by extension Starforged, tells us that Shawn Tomkin wasn&amp;rsquo;t satisfied with the simple successes and failures of PbtA. It tells us that he likes it when a story has the occasional dramatic successes and failures, but that he still likes &amp;ldquo;moves&amp;rdquo;. So, he came up with a core mechanic that combined all of that.&lt;/p&gt;
&lt;p&gt;If that was &lt;em&gt;all&lt;/em&gt; Sean cared about it could have just been a homebrew rolling variant with guidelines for handling critical success and failure with the existing moves. Fortunately for us, he had other things to say too.&lt;/p&gt;
&lt;h2 id=&#34;no-less-dot&#34;&gt;No, less.&lt;/h2&gt;
&lt;p&gt;A common problem of new game designers is the desire to put ALL of their ideas into one place. Even if your ideas are all great, it&amp;rsquo;s rarely a good idea to try and combine them all in one place.&lt;/p&gt;
&lt;p&gt;I heard someone on a podcast say something like &amp;ldquo;your first game is five games&amp;rdquo;. I think that&amp;rsquo;s true, and a lot of the time I think that&amp;rsquo;s because we have five games worth of ideas that we&amp;rsquo;re trying to shove into one game.&lt;/p&gt;
&lt;h3 id=&#34;personal-example&#34;&gt;Personal Example&lt;/h3&gt;
&lt;p&gt;I &lt;em&gt;hate&lt;/em&gt; the idea that magic users can bend reality with no cost or consequences to doing so. I think that altering reality should &lt;em&gt;hurt&lt;/em&gt;. It should drain you. I think that sometimes, casting a spell should go horribly wrong in unpredictable ways&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not hard to address all of those. You take stress / harm when you cast. You roll on a random table when you have a critical failure, and something bad happens to you or your friends&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;As much as I &lt;em&gt;loved&lt;/em&gt; that, I ultimately had to throw most of it out, because I&amp;rsquo;m not trying to tell a gritty story about powerful magics, and violent high-magic encounters. The only part that&amp;rsquo;s survived is the idea that casting spells is mentally draining.&lt;/p&gt;
&lt;h2 id=&#34;it-s-not-about-that-dot&#34;&gt;It&amp;rsquo;s not about that.&lt;/h2&gt;
&lt;p&gt;Maybe this is a &lt;em&gt;me&lt;/em&gt; problem, but each iteration of my game has changed, refined, and/or refocused what the game was about.&lt;/p&gt;
&lt;p&gt;When I started working on my game I was enamored with ICRPG. It was just going to be a hack for the magic system. But, the more I wrote, the more I realized that while ICRPG is a wonderful game, with lots to love, it&amp;rsquo;s not the kind of story that I want to spend countless hours imagining myself in.&lt;/p&gt;
&lt;p&gt;I said above that it&amp;rsquo;s important to have answers to The Big Three Questions as you set out, but you need to allow them to change. There will likely come a point where you&amp;rsquo;ve implemented a good solution to one of them, try it out and realize that you don&amp;rsquo;t actually like how it effects things.&lt;/p&gt;
&lt;h3 id=&#34;a-personal-aside&#34;&gt;A Personal Aside&lt;/h3&gt;
&lt;p&gt;Years ago I read some Banana Yoshimoto books, that absolutely changed me. Her works are fascinating to me because they&amp;rsquo;re rarely &lt;em&gt;about&lt;/em&gt; anything, and yet you keep turning the page to see what happens next. The ones I read were slice-of-life stories about completely normal people having normal lives, with the tiniest hint of magic at work in the world.&lt;/p&gt;
&lt;p&gt;Her books are like the Matrix: &amp;ldquo;Unfortunately, no one can be told what the Matrix is. You have to see it for yourself.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re interested in creating a game like this, or a &amp;ldquo;cozy witchcore&amp;rdquo;, you should know that Monte Cook Games is currently (May 2024) working on a book specifically about helping you create those kind of stories. It&amp;rsquo;s called &amp;ldquo;&lt;a href=&#34;https://www.montecookgames.com/its-only-magic/&#34;&gt;It&amp;rsquo;s Only Magic&lt;/a&gt;&amp;rdquo;, and I&amp;rsquo;m confident it&amp;rsquo;ll be useful even if you don&amp;rsquo;t care about the Cypher System.&lt;/p&gt;
&lt;h2 id=&#34;it-s-not-for-them&#34;&gt;It&amp;rsquo;s not for them&lt;/h2&gt;
&lt;p&gt;When most people write a game they try and keep other people in mind. Don&amp;rsquo;t. Obviously the final product needs to be something that other people can &lt;em&gt;understand&lt;/em&gt; but it doesn&amp;rsquo;t need to be something they &lt;em&gt;like&lt;/em&gt;. The more you try and cater to what other people enjoy, the less interesting and compelling your game will be.&lt;/p&gt;
&lt;p&gt;The best thing that happened during the creation of my game was sitting myself down and saying &amp;ldquo;Fuck that. What do &lt;em&gt;I&lt;/em&gt; want?&amp;rdquo; I intentionally made an incredibly selfish wishlist of things that would be in an ideal game for me. For example, I wanted cards related to character abilities and items, because I have an ADHD brain, and fiddling with a handful of cards with pretty pictures helps me to focus.&lt;/p&gt;
&lt;p&gt;It didn&amp;rsquo;t matter that cards were way more work &amp;amp; expense, or that they&amp;rsquo;d radically increase the cost &amp;amp; logistics of a game. What mattered was that it was something that I personally cared a lot about, regardless of other people&amp;rsquo;s feelings on the matter. What mattered is that this list of selfish selfish desires transformed the creative act of game design. I stopped compromising with non-existent people who i didn&amp;rsquo;t care about. I started making something that would bring &lt;em&gt;me&lt;/em&gt; joy. I hope it brings other&amp;rsquo;s joy too, but the odds of it being particularly memorable are pretty low if it&amp;rsquo;s filled with compromises.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m pretty sure cards won&amp;rsquo;t be in the final game, but that&amp;rsquo;s ok. &lt;em&gt;Most&lt;/em&gt; of my wishlist items won&amp;rsquo;t be. Like I said before, you can&amp;rsquo;t have everything you want in one game. I did try though, and the act of trying to have important things that fit on a card that was mostly picture introduced a critical constraint.&lt;/p&gt;
&lt;h2 id=&#34;embrace-constraints&#34;&gt;Embrace Constraints&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s not just that no-one wants to play a game with 50,000 metaphorical levers to pull. It&amp;rsquo;s not that simpler is somehow better. Constraints focus efforts &amp;amp; keep us on track.&lt;/p&gt;
&lt;p&gt;They don&amp;rsquo;t even have to be topical constraints. For example: &amp;ldquo;The core rules will fit into 30 pages.&amp;rdquo; or &amp;ldquo;There will be no more than 4 pages of spells.&amp;rdquo; These are &lt;em&gt;great&lt;/em&gt; constraints. There&amp;rsquo;s nothing meaningful about those numbers, but they force certain design decisions. For example, limiting spells to four pages means that either you make a game with a bunch of spells with little-to-nothing in the way of description, or you make one with a very limited but very cool selection of spells.&lt;/p&gt;
&lt;p&gt;Topical constraints can be good too though. In ICRPG, for example, you can carry ten items. That&amp;rsquo;s it. That little constraint means you no longer have a monk walking around carrying a hundred items like the Junk Lady from Labryinth and claiming they can dodge incoming arrows.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/05/25/labyrinth_junk_lady.jpg&#34;
    alt=&#34;An image of The Junk Lady from the Labryinth movie with David Bowie.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Let&amp;rsquo;s be real, no-one tracks the weight and volume of every item their character picks up.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://mausritter.com&#34;&gt;Mausritter&lt;/a&gt; took this an additional step, and elegantly accounted for the size or weight of objects by giving you physical cut-outs that you have to fit onto a grid on your character sheet. If you don&amp;rsquo;t have space, you can&amp;rsquo;t carry it.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/05/25/mausritter_character_sheet.jpg&#34;
    alt=&#34;An image of a filled in Mausritter character sheet from the Mausritter web site&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Mauseritter&amp;rsquo;s inventory constraints tell us that having more things isn&amp;rsquo;t important, or helpful, to solving the problems you&amp;rsquo;ll encounter. They way they&amp;rsquo;re physically implemented, tells us that this is a came that cares about cute little ideas, not nitty-gritty-details.&lt;/p&gt;
&lt;p&gt;A game with specific constraints is expressing its opinion about what&amp;rsquo;s important.&lt;/p&gt;
&lt;h3 id=&#34;nothing-s-set-in-stone-dot&#34;&gt;Nothing&amp;rsquo;s set in stone.&lt;/h3&gt;
&lt;p&gt;Constraints are great, and wonderful, but sticking to them too rigidly can really hurt too. Maybe you start out trying to write a game that&amp;rsquo;ll fit in under 30 pages, but along the way you realize you no matter how much you edit away, you can&amp;rsquo;t convey some of the most critical pieces without more space. That&amp;rsquo;s fine. Maybe you modify the constraint to be &amp;ldquo;everything but X in 30 pages&amp;rdquo;. Maybe you say &amp;ldquo;30 pages, before layout and images.&amp;rdquo; Alternately, maybe you realize that you were wrong, and that you&amp;rsquo;d be doing the game a disservice by restricting the page count so severely.&lt;/p&gt;
&lt;p&gt;Trying to work within constraints forces interesting and meaningful game design decisions. It&amp;rsquo;s valuable even if you learn that that constraint &lt;em&gt;hurts&lt;/em&gt; your end goal. Now you know that it&amp;rsquo;s something important to avoid.&lt;/p&gt;
&lt;h2 id=&#34;it-s-all-about-the-character-sheet-dot&#34;&gt;It&amp;rsquo;s all about the character sheet.&lt;/h2&gt;
&lt;p&gt;The Character Sheet is the &lt;em&gt;ultimate&lt;/em&gt; constraint of your game, because as countless designers have learned, &amp;ldquo;If it&amp;rsquo;s not on your character sheet, it doesn&amp;rsquo;t exist.&amp;rdquo; There&amp;rsquo;s too much going on and players &lt;em&gt;will&lt;/em&gt; forget and/or ignore anything that&amp;rsquo;s not staring them in the face.&lt;/p&gt;
&lt;h3 id=&#34;needful-things&#34;&gt;Needful Things&lt;/h3&gt;
&lt;p&gt;Your character sheet should provide everything a player needs to take action on their turn. More specifically, your character sheet should answer the question of &amp;ldquo;what are my options?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;There are two levels to this. The first is &amp;ldquo;What are the things I know about my character that are actionable?&amp;rdquo; The second is &amp;ldquo;What mechanisms does the game provide for me to leverage those?&amp;rdquo;&lt;/p&gt;
&lt;h4 id=&#34;practical-example&#34;&gt;Practical Example&lt;/h4&gt;
&lt;p&gt;I contend that this sheet from FATE Accelerated succeeds on the first, but fails on the second. Further, I think there&amp;rsquo;s space to fix that.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/05/25/fate_accellerated_character_sheet.png&#34;
    alt=&#34;Fate Accellerated Character sheet&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;It tells us all the important things about our character, and thus answers the first question. It also has some minimal bookkeeping items (refresh, character name, etc) that don&amp;rsquo;t help us in the moment, but that&amp;rsquo;s pretty reasonable.&lt;/p&gt;
&lt;p&gt;Looking at this though, a new player doesn&amp;rsquo;t know that at a high level there are only four &amp;ldquo;Actions&amp;rdquo; they can perform:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;create an advantage&lt;/li&gt;
&lt;li&gt;overcome&lt;/li&gt;
&lt;li&gt;attack&lt;/li&gt;
&lt;li&gt;defend&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It&amp;rsquo;s damn hard to &amp;ldquo;sneak&amp;rdquo; up and &amp;ldquo;Attack&amp;rdquo; someone in the middle of an empty field who&amp;rsquo;s staring directly at you, but it might be pretty easy to act &amp;ldquo;Sneaky&amp;rdquo; with them watching you in order to &amp;ldquo;create an advantage&amp;rdquo; for someone else.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s &lt;em&gt;really&lt;/em&gt; important that new players know this when its their turn, but for the GM to be able to set a difficulty for the roll, but also to help flesh out the shared narrative space of everyone at the table.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s enough space at the bottom of that sheet for 1 line that says &amp;ldquo;Turn Actions&amp;rdquo; and then lists those four choices with a their helpful icons. Or maybe you little flow-chart arrows to guide players through the things they need to consider on their turn. Like first you choose an action, and then follow an arrow that leads you to choose an approach.&lt;/p&gt;
&lt;h3 id=&#34;make-the-character-sheet-first&#34;&gt;Make the character sheet first&lt;/h3&gt;
&lt;p&gt;The more I iterated on my game, the more I transitioned to a Character Sheet Driven Development (CSDD 😉) process.&lt;/p&gt;
&lt;p&gt;With each restart I&amp;rsquo;d get an idea for what I wanted, then try to shove it all onto the character sheet. This inevitably fails, so then I have to ask myself &amp;ldquo;which of these things really matters?&amp;rdquo; Do I &lt;em&gt;need&lt;/em&gt; attributes &lt;em&gt;and&lt;/em&gt; skills? Do I &lt;em&gt;need&lt;/em&gt; to list &lt;em&gt;all&lt;/em&gt; the skills? Do I even need skills? Can I maybe get rid of one of those attributes?&lt;/p&gt;
&lt;p&gt;I firmly believe that games are always better when their creators have removed every piece of mechanical crap that isn&amp;rsquo;t necessary to telling the kind of story they want. If you take a Character Sheet Driven Development Process, and you agree that no-one wants to have to reference the book, then you are &lt;em&gt;severely&lt;/em&gt; constrained in the number of systems your game can have.&lt;/p&gt;
&lt;h3 id=&#34;modify-it-through-play&#34;&gt;Modify it through play&lt;/h3&gt;
&lt;p&gt;Make your sheet, define some rules, start playing (see below). Pay attention to what&amp;rsquo;s missing or confusing on the sheet. Mark up your character sheets to indicate changes as you play. Write in the additional info you wish was there. Next time you sit down to work on it, you&amp;rsquo;ll have a pre-made list of items with (🤞) all the context you need.&lt;/p&gt;
&lt;p&gt;This is inevitably going to have follow-on effects. For example, I use different shapes around things to indicate if it&amp;rsquo;s a die you roll, or a counter, etc. At one point I&amp;rsquo;d managed to fit a small visual &amp;ldquo;key&amp;rdquo; on the page, but then some change meant I no longer had space for it, but I&amp;rsquo;m ok with putting reference things on the &lt;em&gt;back&lt;/em&gt; of the sheet, so I moved it there.&lt;/p&gt;
&lt;p&gt;Later on I came to the conclusion that rolling to see if your shield absorbed any additional damage felt like unnecessary faffing about, especially since my game isn&amp;rsquo;t even about going and getting into fights. I was able to remove some bits and bring it back.&lt;/p&gt;
&lt;p&gt;If you keep needing to look up things that aren&amp;rsquo;t on the sheet, then your game is telling you you&amp;rsquo;re either missing critical information, &lt;em&gt;or&lt;/em&gt; maybe you don&amp;rsquo;t need that additional stuff.&lt;/p&gt;
&lt;h3 id=&#34;things-to-keep-in-mind&#34;&gt;Things to keep in mind&lt;/h3&gt;
&lt;p&gt;In my mind there are a few critical things to keep in mind when putting together your character sheet. I should note that I used to be a Graphic Designer, so there&amp;rsquo;s a fair amount of hard learned lessons behind these thoughts.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The more space you devote to something, the more important it becomes in the player&amp;rsquo;s minds.&lt;/li&gt;
&lt;li&gt;Visual Style matters&lt;/li&gt;
&lt;li&gt;If it doesn&amp;rsquo;t fit, make space, or throw it out.&lt;/li&gt;
&lt;li&gt;Your character sheet effects if people want to play your game.&lt;/li&gt;
&lt;li&gt;Keep your old sheets.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;visual-style-matters&#34;&gt;Visual Style Matters&lt;/h4&gt;
&lt;p&gt;On the Left we have one of Dyson Logos&amp;rsquo; takes on a D&amp;amp;D character sheet. On the Right we have the character sheet from &lt;a href=&#34;https://www.fifegames.com&#34;&gt;Heroes &amp;amp; Hardships&lt;/a&gt;&lt;sup id=&#34;fnref:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt;. I&amp;rsquo;m not trying to pick on H&amp;amp;H, but if you covered up any game name, put these two in front of me, and asked me which game I wanted to play it&amp;rsquo;d be the one on the left 100% of the time.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/05/25/character_sheet_comparison.png&#34;
    alt=&#34;A side-by-side comparison of one of Dyson Logos&amp;#39;s hand-drawn 5E character sheets and the official Heroes &amp;amp; Hardships character sheet. The former is infused with tons of character and visual hints about the type of game this is. The latter looks like a spreadsheet.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;It&amp;rsquo;s fine if you have no visual design skills, and or work with something ugly and spreadsheet-like during game creation. Before it reaches the table though, it &lt;em&gt;must&lt;/em&gt; convey tone &amp;amp; help me to know what this game is about. This includes the playtest table. It doesn&amp;rsquo;t have to be beautiful, but it needs to be better than a spreadsheet.&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t make interacting with playtest materials feel like work.&lt;/p&gt;
&lt;h4 id=&#34;do-i-want-to-play-that&#34;&gt;Do I want to play THAT?&lt;/h4&gt;
&lt;p&gt;It doesn&amp;rsquo;t matter how cool your game is, if player don&amp;rsquo;t want to interact with its core elements. I &lt;em&gt;need&lt;/em&gt; to interact with the character sheet, but if that looks like a miserable,  boring, or annoying experience I&amp;rsquo;m not going to want to play your game.&lt;/p&gt;
&lt;p&gt;If you get me to a playtest, but your core materials suck to look at and work with, and the game isn&amp;rsquo;t great, then I&amp;rsquo;m not to playtest it &lt;em&gt;again&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;If you give me decent materials to interact with and an ok game, I&amp;rsquo;ll probably come back to help in the next round.&lt;/p&gt;
&lt;p&gt;I actually &lt;em&gt;like&lt;/em&gt; the core design in the Heroes &amp;amp; Hardships books, but its character sheets makes me want to set them on fire and run away screaming &amp;ldquo;YOU CAN&amp;rsquo;T MAKE ME!!!!&amp;rdquo;&lt;/p&gt;
&lt;h4 id=&#34;make-space-or-throw-it-out-dot&#34;&gt;Make space or throw it out.&lt;/h4&gt;
&lt;p&gt;That&amp;rsquo;s pretty much it. If the player can&amp;rsquo;t determine what their options are and how they can execute on them then you need to make some space for things that can give them those answers.&lt;/p&gt;
&lt;p&gt;Unless there&amp;rsquo;s a way to cheat.&lt;/p&gt;
&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Cheating&lt;/p&gt;
&lt;p&gt;Sometimes cheating is OK. A good example of this is games with long lists of skills, that also limit how many skills you can take. &lt;a href=&#34;https://www.edge-studio.net/categories-games/genesys/&#34;&gt;Genesys&lt;/a&gt;&amp;rsquo; default character sheets are a good example of where cheating wasn&amp;rsquo;t employed, but should have been.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/05/25/genesys_character_sheet.jpg&#34;
        alt=&#34;Genesys Character sheet. 80% of the page is two columns of skills, the vast majority of which the character has no points in.&#34;&gt;
    &lt;/figure&gt;

&lt;p&gt;I find this character sheet maddening, because the character it defines only has 5 skills, but the character sheet has space for 44 skills. Why? Yes, you can gain skills as you go, but you&amp;rsquo;re never going to get anything close to &lt;em&gt;all&lt;/em&gt; of them.&lt;/p&gt;
&lt;p&gt;This is a great place to cheat. Figure out what the max number of skills a character can reasonably get is and put in that many blank fields. It doesn&amp;rsquo;t matter if you game has hundreds of skills to choose from. They never need the full list to play the current session. They only need the ones that are important to them.&lt;/p&gt;
&lt;p&gt;Also, Note that there is a column for &amp;ldquo;setting&amp;rdquo;. That&amp;rsquo;s indicating that these are the skills that are available in the current Setting this Generic System is being used for. &lt;em&gt;Never&lt;/em&gt; waste space on your character sheet listing things your players can &lt;em&gt;never&lt;/em&gt; use.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Needful Compromises&lt;/p&gt;
&lt;p&gt;Many games allow your character to have a bunch of spells, or special abilities that simply can&amp;rsquo;t be fit on one side of an A4 / Letter sized page. D&amp;amp;D would be a much worse game if we just threw out spells.&lt;/p&gt;
&lt;p&gt;For many games it&amp;rsquo;s a practical reality that &lt;em&gt;some&lt;/em&gt; things will have to go on another sheet. However, the character sheet is dramatically less useful if we remove all relevant info for something critical from the main page.&lt;/p&gt;
&lt;p&gt;For example: The official D&amp;amp;D character sheet has a wee slot for common &amp;ldquo;Attacks &amp;amp; Spellcasting&amp;rdquo; things, but it lacks the most critical information a spellcaster needs: an indication if it&amp;rsquo;s even &lt;em&gt;possible&lt;/em&gt; for your character to cast &lt;em&gt;anything&lt;/em&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/05/25/attacks_and_spellcasting.png&#34;
        alt=&#34;D&amp;amp;D Character Sheet Attacks &amp;amp; Spellcasting&#34;&gt;
    &lt;/figure&gt;

&lt;p&gt;There&amp;rsquo;s nowhere to indicate how many spell slots you have left. You can&amp;rsquo;t indicate that one of the &amp;ldquo;Attacks &amp;amp; Spellcasting&amp;rdquo; things requires - or doesn&amp;rsquo;t require - a spell slot. Do you need to be able to move your hands to cast this? D&amp;amp;D&amp;rsquo;s creators have deemed that all of these questions are &lt;em&gt;important&lt;/em&gt; to playing a spellcaster, but I can&amp;rsquo;t answer &lt;em&gt;any&lt;/em&gt; of them without flipping through other pages.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s reasonable to move your list of spells off to another page, but it&amp;rsquo;s &lt;em&gt;not&lt;/em&gt; reasonable to force people who play spell-casters to check a second page to know if they can even cast a spell at the moment&lt;sup id=&#34;fnref:6&#34;&gt;&lt;a href=&#34;#fn:6&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;6&lt;/a&gt;&lt;/sup&gt;.  Doubly so when &lt;em&gt;most&lt;/em&gt; classes seem to eventually get some sort of resource limited magic or magic-like abilities.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;throw-it-out-if-it-s-not-critical&#34;&gt;Throw it out if it&amp;rsquo;s not critical&lt;/h4&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/05/25/d_and_d_equipment_and_money.png&#34;
    alt=&#34;A screenshot of the D&amp;amp;D Equipment section. There are 5 slots with a faint indication of what type of coin they&amp;#39;re for and space for you to write how many of that coin you have.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;See those little widgets on the left, for all the different forms of coins in D&amp;amp;D? I don&amp;rsquo;t know anyone who keeps track of how much change they have &lt;em&gt;in real life&lt;/em&gt;. No-one I know wants to make change in some fictional currency they probably don&amp;rsquo;t remember the subdivisions of.&lt;/p&gt;
&lt;p&gt;In early D&amp;amp;D editions, coins mattered because they directly translated into experience points. They don&amp;rsquo;t anymore, and money &lt;em&gt;rapidly&lt;/em&gt; becomes irrelevant in most D&amp;amp;D games. Sure your character might not be able to &amp;ldquo;afford&amp;rdquo; the +5 suit of armor, but if that&amp;rsquo;s the only thing keeping players from getting it, they&amp;rsquo;ll just murder the shopkeep and take it.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s NO reason this valuable space needs to spent on coins when it could have been used to indicate how many spell slots characters had left, or other &lt;em&gt;useful&lt;/em&gt; things.&lt;/p&gt;
&lt;p&gt;Even if we didn&amp;rsquo;t have some other critical thing to track, the character sheet would &lt;em&gt;still&lt;/em&gt; be improved by simply getting rid of these and allowing a bit more space to list your equipment.&lt;/p&gt;
&lt;h4 id=&#34;keep-your-old-sheets&#34;&gt;Keep your old sheets&lt;/h4&gt;
&lt;p&gt;It saves a lot of time. I&amp;rsquo;m regularly making a tweak to a character sheet and realizing that there was some old version of it that had exactly what I need now. Or, maybe an old version of a sheet you made for some other game.&lt;/p&gt;
&lt;p&gt;The more iterations your game goes through, the more interesting these are to browse through. You can see how your values and approach changed over time. Sometimes you even go &amp;ldquo;oh hey, I liked that thing.&amp;rdquo; and realize that your game has changed enough that you might be able to bring it back.&lt;/p&gt;
&lt;p&gt;Also, keep a sheet with all the visual widgets you create along the way for your sheets. Just a kitchen sink of progress indicators, nifty icons, or whatever.&lt;/p&gt;
&lt;h2 id=&#34;accept-defeat&#34;&gt;Accept Defeat&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve tooted about &lt;a href=&#34;https://spiraldice.com&#34;&gt;Spiral Dice&lt;/a&gt; before. I love these things. I desperately want to use them, and I keep &lt;em&gt;trying&lt;/em&gt; to use them in &lt;em&gt;this&lt;/em&gt; game. It&amp;rsquo;s taken me a long time to accept that they&amp;rsquo;re &lt;em&gt;not&lt;/em&gt; the right tool for this particular game. It doesn&amp;rsquo;t matter how much I want to use them. I can&amp;rsquo;t. At least not here.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a phrase amongst writers: &amp;ldquo;Kill your darlings.&amp;rdquo; It doesn&amp;rsquo;t matter how much you love an idea. It doesn&amp;rsquo;t matter how much you &lt;em&gt;want&lt;/em&gt; an idea. What matters is if the idea contributes meaningfully to what you&amp;rsquo;re trying to do.&lt;/p&gt;
&lt;h2 id=&#34;narrative-dice-are-kinda-broken&#34;&gt;Narrative Dice Are Kinda Broken&lt;/h2&gt;
&lt;p&gt;There are a few takes on &amp;ldquo;Narrative Dice&amp;rdquo;. The most common, or well known use, is to allow rolls to have all of the following outcomes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;critical success&lt;/li&gt;
&lt;li&gt;success with ancillary complications&lt;/li&gt;
&lt;li&gt;simple success&lt;/li&gt;
&lt;li&gt;tie with ancillary positive effect&lt;/li&gt;
&lt;li&gt;simple tie&lt;/li&gt;
&lt;li&gt;tie with ancillary complications&lt;/li&gt;
&lt;li&gt;failure with ancillary benefits&lt;/li&gt;
&lt;li&gt;simple failure&lt;/li&gt;
&lt;li&gt;critical failure&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Narrative Dice that Fantasy Flight Games created for Warhammer Fantasy Roleplay (3rd Ed), and later reused for their Star Wars, and Genesys games are possibly the best known ones that do this, and I &lt;em&gt;love&lt;/em&gt; the core idea. I love how a single dice roll can generate all those possible outcomes. These dice make die rolls into tools for driving wonderfully messy storytelling. At least, in theory.&lt;/p&gt;
&lt;p&gt;Once you start to use them, you quickly learn that it&amp;rsquo;s &lt;em&gt;really hard&lt;/em&gt; to come up some ancillary positive or negative side effect for every &lt;em&gt;single&lt;/em&gt; test. Like, really &lt;em&gt;really&lt;/em&gt; hard. In practice folks just end up using it for the simplest mechanical thing: extra damage on their hit, a bonus to someone&amp;rsquo;s next roll, etc.&lt;/p&gt;
&lt;p&gt;The difficulty of coming up with the &amp;ldquo;yes, ands&amp;rdquo; and &amp;ldquo;no, buts&amp;rdquo; on every roll completely undermines the promise of dice that help tell the story.&lt;/p&gt;
&lt;p&gt;And that&amp;rsquo;s before we address the fact that the dice are covered with symbols with zero inherent meaning, that players have to memorize and in order to understand which ones are good and which ones are bad, and which cancel out, and which count as two goods vs one good, or whatever.&lt;/p&gt;
&lt;h3 id=&#34;two-other-options&#34;&gt;Two other Options&lt;/h3&gt;
&lt;p&gt;There are two alternate ways of using Narrative Dice that I&amp;rsquo;ve seen that are both &lt;em&gt;easy&lt;/em&gt; and helpful.&lt;/p&gt;
&lt;p&gt;You can do something simple like assigning a color to each factor that contributes to a roll. For example black dice for your core skills, red dice for benefits from weapons, and blue dice for benefits from magic. Then when you roll, you see that you didn&amp;rsquo;t have enough successes from your core skills, but that the magical dice added just enough to succeed in your attempt. Now you can narrate how you &amp;ldquo;…lost your footing, and would have missed if not for your companion&amp;rsquo;s spell guiding your blade.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The other alternative is what &lt;a href=&#34;https://www.parablegames.co.uk&#34;&gt;Parable Games&lt;/a&gt; has done with Shiver. To over-simplify a tiny bit, there&amp;rsquo;s an 6 sided die with a bunch of symbols on it. Each symbol&amp;rsquo;s associated with a skill. For example, a fist for &amp;ldquo;Grit&amp;rdquo; (lifting, punching, brute force), a heart with a rose in it for &amp;ldquo;Heart&amp;rdquo; (persuasion, deception, charm, etc.). You decide what skill you&amp;rsquo;re using, roll the relevant number of dice, and see if any came up with the Skill&amp;rsquo;s symbol. What you see on the dice reinforces the thing you were trying to do. This is dramatically helped by the fact that it&amp;rsquo;s easy for western players to associate the symbols with the meaning. Fist for punching and strength. A lightbulb brain combo for smarts. A four leaf clover for Luck. They leverage the established meanings of most of the symbols to help support player understanding.&lt;/p&gt;
&lt;p&gt;You could just use a 6 sided die and say &amp;ldquo;When you roll Heart you succeed if a 4 comes up. When you roll Grit you succeed if a 2 comes up.&amp;rdquo; But that&amp;rsquo;s a &lt;em&gt;lot&lt;/em&gt; harder to remember. It&amp;rsquo;s an accessibility aid, and a narrative aid. If you tried a wits roll, but failed with a bunch of fists you can look at the dice and say &amp;ldquo;I didn&amp;rsquo;t succeed because I tried talking instead of punching&amp;rdquo;.&lt;/p&gt;
&lt;h2 id=&#34;solo-playtesting&#34;&gt;Solo Playtesting&lt;/h2&gt;
&lt;p&gt;I have literally never heard &lt;em&gt;any&lt;/em&gt; other game designer talk about doing this, and it is - &lt;em&gt;without question&lt;/em&gt; - the most powerful and effective tool in my arsenal.&lt;/p&gt;
&lt;p&gt;The idea here is pretty simple. Before you bring your game to &lt;em&gt;anyone&lt;/em&gt; else, you will have played dozens or hundreds of sessions with yourself, and &lt;a href=&#34;https://www.wordmillgames.com&#34;&gt;Mythic Game Master Emulator&lt;/a&gt; (GME). Print out character sheets, make two or three characters &lt;em&gt;using your character creation instructions&lt;/em&gt;, sit down at a table and start playing. There is &lt;em&gt;no&lt;/em&gt; planning necessary. Literally. Mythic can be your Game Moderator &amp;amp; generate the &lt;em&gt;entire&lt;/em&gt; adventure as you go.&lt;/p&gt;
&lt;p&gt;Of equal importance is the fact that you can stop at any time. If you stumble over a critical rules problem, or important decision that needs to be made about &lt;em&gt;how&lt;/em&gt; the game works you don&amp;rsquo;t have an entire table of people who either have to go away or have to sit around while you spend however long it&amp;rsquo;s going to take to fix it.&lt;/p&gt;
&lt;p&gt;This means you can iterate &lt;em&gt;so&lt;/em&gt; much faster. You can try out half-baked ideas. You can try out that starter adventure, or better yet, &lt;em&gt;generate&lt;/em&gt; that starter adventure (see below).&lt;/p&gt;
&lt;p&gt;I can&amp;rsquo;t count the number of times I have put together a core mechanic that worked, that did &lt;em&gt;exactly&lt;/em&gt; what I was hoping it would, but either wasn&amp;rsquo;t fun, or revealed that the bookkeeping required was worse than the gameplay it supported.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s key to be very self aware while playing like this. You need to try and notice when you&amp;rsquo;re annoyed, when you&amp;rsquo;re bored, and when you&amp;rsquo;re having fun. The latter is a little harder to notice in the moment, because you get completely immersed in the events that are happening. That&amp;rsquo;s why you…&lt;/p&gt;
&lt;h3 id=&#34;record-everything&#34;&gt;Record Everything&lt;/h3&gt;
&lt;p&gt;The medium isn&amp;rsquo;t important: video, audio, written on paper, written on the computer, whatever. What&amp;rsquo;s important is that it&amp;rsquo;s a medium that is easy and/or enjoyable for you. These recordings are for you alone. You&amp;rsquo;ll probably never show them to anyone.&lt;/p&gt;
&lt;p&gt;As you play you &lt;em&gt;will&lt;/em&gt; encounter things that make you realize &amp;ldquo;oh, I&amp;rsquo;m going to need a rule for that&amp;rdquo;. You&amp;rsquo;ll have thoughts like &amp;ldquo;Doesn&amp;rsquo;t Starforged have a tool for this?&amp;rdquo;. Obviously these things need to be captured somehow, but there are smaller things that are equally important. Things like the die rolls.&lt;/p&gt;
&lt;p&gt;When I was in the earlier stages of this process I wouldn&amp;rsquo;t write down all the die rolls. Later on, I&amp;rsquo;d want to make a tweak to the mechanic and wonder how it would have effected past scenes. Without the old die rolls recorded I couldn&amp;rsquo;t say. I&amp;rsquo;d have to spend time doing another playtest session. I love playtesting my game, but at the moment I just want a quick answer to my question so I can move on.&lt;/p&gt;
&lt;p&gt;As you design a game, your focus moves from one area to another. In my experience I&amp;rsquo;ll wander away from one thing focus on something else, but then have questions like &amp;ldquo;Does that first thing still hold up with what I&amp;rsquo;ve changed since then?&amp;rdquo; &amp;ldquo;Am I still happy with that?&amp;rdquo; You can pull out those old records and revisit old decisions from a new perspective. Maybe you swapped a mechanic for a new one, and find yourself questioning the decision. Having recorded playtests means you can easily compare things. Well, &amp;ldquo;easily&amp;rdquo; once you find the right place to look.&lt;/p&gt;
&lt;p&gt;Obviously, once you get your game in front of other people you&amp;rsquo;ll want to record that too. If you&amp;rsquo;re using video (best) or audio recordings remember to ask for consent &amp;amp; make sure they know that it&amp;rsquo;s just for you to review gameplay things and that you won&amp;rsquo;t be putting it online.&lt;/p&gt;
&lt;h4 id=&#34;example&#34;&gt;Example&lt;/h4&gt;
&lt;p&gt;I prefer good old-fashioned paper. I do a &amp;ldquo;journaling&amp;rdquo; style of solo RP where I&amp;rsquo;m literally hand-writing a story as I go. It&amp;rsquo;s slow AF, but something about it really works for me. Also, I find it &lt;em&gt;way&lt;/em&gt; easier to find a specific piece of information in an annotated text than in a long video.&lt;/p&gt;
&lt;p&gt;Every single time a die is rolled, I note which character rolled it, why, &amp;amp; what the result was. That sounds a lot more formal than it is. Here&amp;rsquo;s an example from the combat encounter I mention below.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/05/25/example_notebook_combat.jpg&#34;
    alt=&#34;A photograph of the quickly scribbled notes from one of my solo playtesting sessions. There are 3 columns. On the left we have mostly blank lines with an occasional indication of the character involved. Onthe right we have an ongoing tally of doom&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Don&amp;rsquo;t worry about trying to read my scribbles. I&amp;rsquo;ll walk you through it. This record was incredibly useful &lt;em&gt;during&lt;/em&gt; the playtest &amp;amp; after.&lt;/p&gt;
&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Doom Doomity Doom&lt;/p&gt;
&lt;p&gt;In the right column you can see that I&amp;rsquo;m keeping notes on my Doom Pool&lt;sup id=&#34;fnref:7&#34;&gt;&lt;a href=&#34;#fn:7&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;7&lt;/a&gt;&lt;/sup&gt;: &amp;ldquo;doom +1 = 2&amp;rdquo; &amp;amp; &amp;ldquo;doom +1 = 3-&amp;gt;0&amp;rdquo;. This was partially because I&amp;rsquo;ve learned that it&amp;rsquo;s important to record everything mechanical that happens in this process, but more importantly to me at the moment the fact that my I had a mechanic such that whenever a 1 came up on the a player&amp;rsquo;s roll Doom was generated, and the GM would roll a die. If the die was less than the current Doom level, some complication would be inserted. This mechanic was &amp;ldquo;firing off&amp;rdquo; &lt;em&gt;way&lt;/em&gt; more often than I had anticipated &amp;amp; it was becoming a problem.&lt;/p&gt;
&lt;p&gt;As I continued to play the side-bar showed me the practical reality of my mechanic and how the numbers changed over time. I was able to clearly see that it&amp;rsquo;d always be &amp;ldquo;too much&amp;rdquo; and that it wasn&amp;rsquo;t just some bad rolls. I abandoned the &amp;ldquo;doom&amp;rdquo; mechanic, continued the playtest and came back to it later.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;How many rolls&lt;/p&gt;
&lt;p&gt;Later on while trying to figure out how to fix my broken mechanic I needed to know how many rolls I could expect in a typical session.&lt;/p&gt;
&lt;p&gt;This isn&amp;rsquo;t a number you can look up online, because not only is it different from game to game, it changes with the GM&amp;rsquo;s storytelling style or what kind of antics the players like to get into. However, I&amp;rsquo;d been tracking all the rolls. In the way I record stuff, everything between the blue highlighter lines is either a roll, or &amp;ldquo;above the table&amp;rdquo; stuff; the discussions at the table that are &lt;em&gt;about&lt;/em&gt; the narrative but aren&amp;rsquo;t, &lt;em&gt;in&lt;/em&gt; the narrative.&lt;/p&gt;
&lt;p&gt;I was able to go back through my playtest, scan through all the short blue bars, and count up how many rolls the players would have made over the number of events that I figured would fill up a standard gaming session. In the screenshot above there&amp;rsquo;s a roll directly after most of the lines with a note in the left column. T1-T4 is indicating which of the unnamed &amp;ldquo;bad guys&amp;rdquo; I&amp;rsquo;m rolling in response to. I don&amp;rsquo;t remember why I used &amp;ldquo;T&amp;rdquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;meta-notes&lt;/p&gt;
&lt;p&gt;One of those notes is &amp;ldquo;[Doom = another voice heard in the distance shouting that it&amp;rsquo;s coming (2 rounds)]&amp;rdquo;. At the table the GM would just say &amp;ldquo;You hear a shout of support coming from the woods. Another one is coming soon.&amp;rdquo; I was recording &lt;em&gt;how&lt;/em&gt; I adjudicated things when the doom pool was triggered. Sometimes that&amp;rsquo;s good example material for future GMs. Sometimes that&amp;rsquo;s a record of &lt;em&gt;how&lt;/em&gt; you were struggling, and what was problems you were having.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Calculating rolls per session&lt;/p&gt;
&lt;p&gt;Knowing the game system is enough to give us a reasonable starting point to work from. If your game&amp;rsquo;s dice usage is going to be similar to some other game, you can use it as a stand-in until you&amp;rsquo;ve got enough playtesting of yours.&lt;/p&gt;
&lt;p&gt;For example, we know that most D&amp;amp;D combats don&amp;rsquo;t last more than 10 rounds. We know that players roll on every round, and that it averages out to about a 50% hit rate. So, 50% of the time they&amp;rsquo;ll &lt;em&gt;also&lt;/em&gt; be rolling damage. Most characters get attacked most rounds &amp;amp;  (guessing here) 25% of those times they&amp;rsquo;ll have to roll some sort of constitution or dexterity check.&lt;/p&gt;
&lt;p&gt;Assume a 4 player table, and an 8 round fight, and you&amp;rsquo;ve got some numbers you can work with. On the player&amp;rsquo;s side we have 32 rolls to hit, 16 rolls for damage, and 8 &amp;ldquo;check&amp;rdquo; rolls. D&amp;amp;D tends to have a fight in every gaming session so we can reasonably assume there&amp;rsquo;s at least 56 player-facing rolls in every session. Round it up to 60 for some out-of combat stuff and we&amp;rsquo;ve got two useful numbers. Tada 🎉.&lt;/p&gt;
&lt;p&gt;Now we can answer the question &amp;ldquo;how many rolls in an average session?&amp;rdquo;. For the many games like D&amp;amp;D it&amp;rsquo;s somewhere around 60 rolls per session, &amp;amp; 15 rolls per player  per session.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;if-you-haven-t-tried-solo-role-playing&#34;&gt;If you haven&amp;rsquo;t tried solo role playing&lt;/h3&gt;
&lt;p&gt;If you haven&amp;rsquo;t done solo role playing with a &amp;ldquo;normal&amp;rdquo; RPG this may sound weird / impossible. It&amp;rsquo;s not. It&amp;rsquo;s incredibly easy. If you want to see an example of how this works go watch Trevor Duval&amp;rsquo;s &lt;a href=&#34;https://www.youtube.com/playlist?list=PLDvunq75UfH_GAUWYcYSGL_vftZG0nzR-&#34;&gt;Me, Myself and Die! Season One&lt;/a&gt;&lt;sup id=&#34;fnref:8&#34;&gt;&lt;a href=&#34;#fn:8&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;8&lt;/a&gt;&lt;/sup&gt;. The first scene is a &amp;ldquo;chef&amp;rsquo;s kiss&amp;rdquo; example of how Mythic GME can tell a story you had &lt;em&gt;no&lt;/em&gt; idea was coming.&lt;/p&gt;
&lt;p&gt;Side note: Version 2 of Mythic GME is the combination of years of playtesting and learning by tons of players. It&amp;rsquo;s more refined set of tools, with tons of examples. However, my 🧠 has a &lt;em&gt;lot&lt;/em&gt; of trouble extracting the core things you need to do from the descriptive / explanatory text in v2. If you have that problem, Version 1 is the same core ideas in a package that is very &amp;ldquo;to-the-point&amp;rdquo; and easy to use.&lt;/p&gt;
&lt;h3 id=&#34;generating-a-starter-adventure&#34;&gt;Generating a Starter Adventure&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Grab the GME, a few characters, and start playing.&lt;/li&gt;
&lt;li&gt;Record what happens as you go.&lt;/li&gt;
&lt;li&gt;Bring it to a satisfying conclusion.&lt;/li&gt;
&lt;li&gt;Take all the &amp;ldquo;here&amp;rsquo;s what happened&amp;rdquo; and convert it to &amp;ldquo;here&amp;rsquo;s what could happen&amp;rdquo; &amp;amp; delete or change any bits that weren&amp;rsquo;t entertaining enough.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;simple-example&#34;&gt;Simple Example:&lt;/h4&gt;
&lt;p&gt;In a recent playtest 3 characters were quickly making their way through the rainforest to get to an unknown artifact before an opposing faction did. They crossed a perilous ravine, exhausted &amp;amp; happy to be alive. They didn&amp;rsquo;t realize they&amp;rsquo;d been watch by a new group of people who moved into the area. While they laid there catching their breath, they were ambushed. Completely overpowered they fought back until they could run for their lives.&lt;/p&gt;
&lt;p&gt;Now I have detailed information on 2 separate &amp;ldquo;encounters&amp;rdquo; with &lt;em&gt;very&lt;/em&gt; different things for characters to do. I&amp;rsquo;ve got a perilous ravine to cross &amp;amp; I know what that looks like &amp;amp; what environmental troubles &amp;amp; help they&amp;rsquo;ll have. I&amp;rsquo;ve got a combat scene that introduces characters to the idea that the &lt;em&gt;only&lt;/em&gt; way to survive is to be creative. You won&amp;rsquo;t be able to murder your way out of every situation.&lt;/p&gt;
&lt;h3 id=&#34;solo-playtesting-adventures&#34;&gt;Solo Playtesting Adventures&lt;/h3&gt;
&lt;p&gt;While originally designed for emulating Game Masters, Mythic GME can be used as a &lt;em&gt;player&lt;/em&gt; emulator. This, obviously can help your playtesting by coming at things from a different perspective, but it also means you can simulate what might happen when players start interacting with a pre-written adventure of yours. Alas, there&amp;rsquo;s no good way to simulate another GM reading and interpreting the things in your written adventure. You just have to give it to someone, and keep track of the questions and problems they have along the way.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.drivethrurpg.com/en/product/479600/mythic-magazine-volume-41&#34;&gt;Mythic Magazine volume 41&lt;/a&gt; discusses how to use Mythic GME as a &lt;em&gt;Player&lt;/em&gt; emulator.&lt;/p&gt;
&lt;h2 id=&#34;what-else&#34;&gt;What else?&lt;/h2&gt;
&lt;p&gt;There are probably some more important lessons that I haven&amp;rsquo;t thought of at the moment. Over time I&amp;rsquo;ll likely update this document with things I forgot, and new things I&amp;rsquo;ve learned.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve also specifically avoided talking about tools. The tools that work for me probably won&amp;rsquo;t work for most of you. That being said, I derive a lot of value from seeing the tools other folks use to accomplish tasks. There will probably be a future post going over the tools I&amp;rsquo;ve put together, and what I&amp;rsquo;ve found to be useful, or not.&lt;/p&gt;
&lt;p&gt;In both cases, if you&amp;rsquo;d like to hear about updates you should &lt;a href=&#34;https://dice.camp/@masukomi&#34;&gt;follow my account on Dice.camp&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;call-to-action&#34;&gt;Call to action&lt;/h2&gt;
&lt;p&gt;This post took a lot of time. If you found any part of it worthwhile, please let me know. &lt;a href=&#34;https://dice.camp/@masukomi&#34;&gt;My TTRPG Mastodon account&lt;/a&gt; is the best way, but email works too ( &lt;a href=&#34;mailto:masukomi@masukomi.org&#34;&gt;masukomi@masukomi.org&lt;/a&gt; ). My blog posts kinda feel like I&amp;rsquo;m spending a lot of effort to yell into the void. If you&amp;rsquo;d like to see more. let me know. Ditto for anyone else creating content online.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;: Whatever cool generic system thing you&amp;rsquo;re thinking of doing, please go read GURPS first. I assure you they probably did it, and they probably did it better, and more comprehensively than you were even considering. GURPS has a ton of bad PR about being a &amp;ldquo;crunchy&amp;rdquo; game, which turns many people off. It&amp;rsquo;s not. It can be amazingly low crunch, and there are so many great books for it on &lt;em&gt;so&lt;/em&gt; many topics. It&amp;rsquo;s ugly. It&amp;rsquo;s old. It&amp;rsquo;s got far too many character options to choose from, but when you get to the heart of it, it&amp;rsquo;s a really good generic system.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;: If you&amp;rsquo;re playing a PbtA game and always using the &amp;ldquo;default&amp;rdquo; Move, then it&amp;rsquo;s either a poorly designed game, or you&amp;rsquo;re trying to tell a story it wasn&amp;rsquo;t designed for.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;: The spells in Dungeon Crawl Classics are a thing of beauty. Ridiculous unpredictable things that, even when you roll &amp;ldquo;successfully&amp;rdquo;, may or may not get you what you were trying for. Consulting a massive table every time you cast a spell isn&amp;rsquo;t great, but for the right table it can be ridiculous fun.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:4&#34;&gt;
&lt;p&gt;: If you want a simple game where you go around having fun fighting monsters &amp;amp; bad guys, where magic can go wrong and screw everything dramatically, check out &lt;a href=&#34;https://modiphius.net/en-us/products/index-card-rpg-master-edition&#34;&gt;Index Card RPG (ICRPG)&lt;/a&gt;. It has three default settings that are all great.&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:5&#34;&gt;
&lt;p&gt;Despite what I said about Generic Systems, Heroes &amp;amp; Hardships is a really good Generic system that does a lot of things right, and I&amp;rsquo;ve got a &lt;em&gt;huge&lt;/em&gt; amount of respect for its creator. Alas, I hate that its character sheet looks like a freaking spreadsheet.&amp;#160;&lt;a href=&#34;#fnref:5&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:6&#34;&gt;
&lt;p&gt;: because someone&amp;rsquo;s going to try and say it: No, you can&amp;rsquo;t &lt;em&gt;always cast a cantrip&lt;/em&gt;.&amp;#160;&lt;a href=&#34;#fnref:6&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:7&#34;&gt;
&lt;p&gt;: At its core a &amp;ldquo;doom pool&amp;rdquo; is a mechanic that lets the GM build up points that they can later spend to complicate players lives.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re curious what the notation meant: &amp;ldquo;doom +1 = 2&amp;rdquo; meant the roll generated 1 doom &amp;amp; &amp;ldquo;doom +1 = 3-&amp;gt;0&amp;rdquo; meant the roll generated one doom, the total was raised to 3, but then the pool got used and reset to zero. This is just what I was doing on the fly and not a recommendation for anything.&amp;#160;&lt;a href=&#34;#fnref:7&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:8&#34;&gt;
&lt;p&gt;: Me, Myself and Die! Season One is quite possibly &lt;em&gt;the&lt;/em&gt; most entertaining actual play series I have &lt;em&gt;ever&lt;/em&gt; watched.&amp;#160;&lt;a href=&#34;#fnref:8&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Making Great Productivity Tools</title>
      <link>https://weblog.masukomi.org/2024/05/17/making-great-productivity-tools/</link>
      <pubDate>Fri, 17 May 2024 00:00:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2024/05/17/making-great-productivity-tools/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-thoughts&#34;&gt;The Thoughts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://hachyderm.io/@chris_e_simpson&#34;&gt;Chris Simpson&lt;/a&gt; mentioned that he was working on &amp;ldquo;development tools for gifted brains&amp;rdquo; in response to my mentioning having created &lt;a href=&#34;https://corporaterunaways.social/@noted&#34;&gt;Noted&lt;/a&gt;. What follows are my thoughts on what it takes to make a great productivity tool that wont be abandoned, &amp;amp; works for everyone, not just the creator.&lt;/p&gt;
&lt;h2 id=&#34;the-thoughts&#34;&gt;The Thoughts&lt;/h2&gt;
&lt;p&gt;Software is amazing. I love it, &amp;amp; I especially love when developers take the time to really focus on making better tools, or improving the ones they have.&lt;/p&gt;
&lt;p&gt;There are also some GREAT things starting to happen in software with regards to helping #ADHD brains.&lt;/p&gt;
&lt;p&gt;BUT they almost never stick.&lt;/p&gt;
&lt;p&gt;I theorize that there&amp;rsquo;s always an impedance mismatch resulting from the fact that every 🧠 is different, &amp;amp; has different values &amp;amp; needs.&lt;/p&gt;
&lt;p&gt;BEST case scenario for &lt;span class=&#34;underline&#34;&gt;most&lt;/span&gt; attempts at ADHD is that they work GREAT for the creator, and a handful of others who happen to stumble on it. BUT there&amp;rsquo;s a looooong history of ADHD folks going &amp;ldquo;ooh shiny! that&amp;rsquo;ll solve my problems!&amp;rdquo; and then 2 weeks later they&amp;rsquo;ve wandered off. Given that happens with a LOT of software, BUT we&amp;rsquo;re kinda &amp;ldquo;extra&amp;rdquo; in this regard.&lt;/p&gt;
&lt;p&gt;This is why - when it comes to &amp;ldquo;productivity&amp;rdquo; &amp;amp; organization of tasks - I turn to paper. Specifically paper with NO organizational structure I have to adhere to.  I&amp;rsquo;m going to explain that, but then I&amp;rsquo;m going to talk about where those same attributes can be found in software.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the thinking:
The organizational tools that work for other people&amp;rsquo;s 🧠s are RARELY ever going to be a perfect match for mine. On top of this, no-one really knows what works for their 🧠 until they really start experimenting.&lt;/p&gt;
&lt;p&gt;So, I think we need to start with a foundation that allows us to try a strategy, abandon some parts, tweak others, and add new ones.&lt;/p&gt;
&lt;p&gt;In the early days, this iteration needs to be able to happen FAST. Like, day-to-day changes.  IF we actually pay attention to what is and isn&amp;rsquo;t working for our 🧠s (HUGE &amp;ldquo;if&amp;rdquo; I realize) we &lt;span class=&#34;underline&#34;&gt;should&lt;/span&gt; be able to find something that &amp;ldquo;seems to work well&amp;rdquo; relatively quickly.&lt;/p&gt;
&lt;p&gt;BUT that&amp;rsquo;s never the end. The longer you spend with a tool the more familiar you become with its strengths and limitations. You&amp;rsquo;ll find things you want to change after a while. Eventually YOU will change as a person. What&amp;rsquo;s important to you, where you&amp;rsquo;re focusing your energy, etc.  So, again your tools will need to grow and change.&lt;/p&gt;
&lt;p&gt;For example, Bullet Journaling (BJ) &lt;a href=&#34;https://bulletjournal.com/blogs/faq&#34;&gt;https://bulletjournal.com/blogs/faq&lt;/a&gt; really is a SPECTACULAR system / tool AND It was created by a person trying to overcome the very serious problems that their ADHD presented them.  If you&amp;rsquo;re having trouble keeping on top of your tasks &amp;amp; schedule &amp;amp; remembering what you did it&amp;rsquo;s a GREAT place to start.&lt;/p&gt;
&lt;p&gt;HOWEVER, very few people stick with the &amp;ldquo;official&amp;rdquo; Bullet Journal process, &amp;amp; many that like its approach have jettisoned certain aspects, &amp;amp; changed others.&lt;/p&gt;
&lt;p&gt;BUT because BJ wants you to use &amp;ldquo;blank&amp;rdquo; paper (lined / dot grid / literally blank) it FULLY supports changing with the user. It&amp;rsquo;s an amazingly flexible framework built on the even more flexible foundation of paper. The only restriction paper really imposes is the size of the sheet.&lt;/p&gt;
&lt;p&gt;In my game design notebooks, I&amp;rsquo;ve ended up using its &amp;ldquo;collections&amp;rdquo; idea, abandoned literally everything else, and inserted my own way of making page headings, subheadings, &amp;amp; noting specific sections of a page as atypically important.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://corporaterunaways.social/@noted&#34;&gt;Noted&lt;/a&gt; is a collection of physical tools to hold note cards, but what makes it &lt;span class=&#34;underline&#34;&gt;really&lt;/span&gt; useful to me is that I have a specific framework for managing and organizing tasks. Sadly, I haven&amp;rsquo;t documented this publicly yet. Much like Bullet Journaling I &lt;span class=&#34;underline&#34;&gt;think&lt;/span&gt; this will be really useful for a lot of people (even if tehy don&amp;rsquo;t buy my card holders) BUT I don&amp;rsquo;t expect &lt;span class=&#34;underline&#34;&gt;many&lt;/span&gt; people to use it unchanged, &amp;amp; I built it on the amazingly flexible foundation of paper.&lt;/p&gt;
&lt;p&gt;This post started with software though.  And, all is not lost in that realm. I believe that any productivity tools that impose a strict process that can&amp;rsquo;t evolve with the user are ultimately doomed.  In my experience people making tools for ADHD people to stay on top of their 💩 are atypically blind to this problem.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Hubris&amp;rdquo; is one of the &amp;ldquo;Three virtues of a great programmer&amp;rdquo;. It leads us to create amazing new things instead of sticking with &amp;ldquo;good enough&amp;rdquo;, BUT it also leads us to believe that the fact that our tool works SO amazingly for OUR 🧠 that it&amp;rsquo;ll also work amazingly for other people&amp;rsquo;s 🧠s, but it rarely does.&lt;/p&gt;
&lt;p&gt;All hope is not lost though. There are two amazing tools for developers which clearly show us, that it IS possible to make software that a user can mold to their needs, even if they&amp;rsquo;re not a developer.&lt;/p&gt;
&lt;p&gt;Vim, &amp;amp; Emacs. BOTH of these tools are IMNSHO absolute dog-shit in their bare-bones configuration. HOWEVER no-one uses them in their default configuration, because what makes them amazing is that they are incredibly flexible foundations that do a core task (text editing) BUT allow users to change almost everything around that.&lt;/p&gt;
&lt;p&gt;Imagine a &amp;ldquo;todo list engine&amp;rdquo; that had almost no functionality. Out of the box it might be an ugly list manager with barely any UI or guidance that does NOT work the way you want  a todo list to work.&lt;/p&gt;
&lt;p&gt;Imagine also, that it was ridiculously customizable and that, almost every way you could imagine to interact with, leverage, and style a todo list was sitting right there in a package manager waiting for you to install it. If you came up with something new, you could add it, or ask someone else to.&lt;/p&gt;
&lt;p&gt;The creators would distribute it with some collection of things they thought was a good starting point. Some people might even make &amp;ldquo;distributions&amp;rdquo; with heavily customized collections of mods. Much like Bullet Journaling these would be a great place to start. Like BJ they&amp;rsquo;d also allow you to mix and match other ideas, to throw out ones you don&amp;rsquo;t like, etc.&lt;/p&gt;
&lt;p&gt;This, technically already exists. It&amp;rsquo;s called org-mode. It&amp;rsquo;s amazing, and it does way more than todo lists. BUT it is text-centric AND Emacs has a reputation for being &amp;ldquo;hard&amp;rdquo; and &amp;ldquo;kids these days&amp;rdquo;, and the point wasn&amp;rsquo;t to convince you to switch. ;)&lt;/p&gt;
&lt;p&gt;The point is that we have 2 historical references showing us that it&amp;rsquo;s &lt;em&gt;entirely&lt;/em&gt; possible to build software tools that approach a common problem but &lt;em&gt;also&lt;/em&gt; support &lt;span class=&#34;underline&#34;&gt;wildly&lt;/span&gt; divergent brains.&lt;/p&gt;
&lt;p&gt;Once someone &amp;ldquo;gets&amp;rdquo; that Emacs &amp;amp; Vim can be easily customized to support how their 🧠 approaches problems they end up molding them into the &amp;ldquo;perfect&amp;rdquo; tool for their brain. Over time they grow with you. You add new packages. You get rid of others. The community makes versions of old ones that may work better for you brain, or come up with wildly new tools no-one anticipated.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;  People use these  apps for 30+ years because they grow with them.&lt;/p&gt;
&lt;p&gt;Emacs built a flexible framework for text manipulation. It did a REALLY good job of that, but more importantly, it not only allowed for, but &lt;span class=&#34;underline&#34;&gt;encouraged&lt;/span&gt; people to mold it to their needs.&lt;/p&gt;
&lt;p&gt;If we want to build truly great productivity tools that support neurodivergent brains (ADHD, ASD, DID, etc) I think we need to learn from the lessons of Emacs and Vim.&lt;/p&gt;
&lt;p&gt;We need to build frameworks that support one core idea &lt;em&gt;exceptionally&lt;/em&gt; well and make it trivial for everyday people to mix, &amp;amp; match, &amp;amp; modify tools to support &lt;em&gt;their&lt;/em&gt; brains, and &lt;em&gt;not&lt;/em&gt; just the brains of the people who coded it.&lt;/p&gt;
&lt;p&gt;This is easier said than done, and it means writing a bunch of &amp;ldquo;modules&amp;rdquo; to help show what&amp;rsquo;s possible, and make it actually useful for others. The modular approach means that we can also release a core collection of things that works great for us, and demonstrates the power of our tool, while &lt;em&gt;also&lt;/em&gt; saving us from having to write all the possible variant needs for all the possible brains. We &amp;ldquo;just&amp;rdquo; need to convince a handful people like us that we&amp;rsquo;ve created something useful, and support them in making it &lt;em&gt;more&lt;/em&gt; useful in the ways that &lt;em&gt;they&lt;/em&gt; need.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;A great example of things that couldn&amp;rsquo;t have been planned for, is &lt;a href=&#34;https://youtu.be/KUMkj9HWiEY&#34;&gt;Howard Abram&amp;rsquo;s tool for playing Ironsworn&lt;/a&gt; I love this example because it&amp;rsquo;s something the core framework was NEVER designed for, but is amazingly useful to the point that I want it for ALL my games. He&amp;rsquo;s spent so much time using a tool so devoted to supporting user extensibility that &lt;em&gt;his&lt;/em&gt; tool is &lt;em&gt;also&lt;/em&gt; a framework - within the framework that is Emacs - for supporting other RPGs.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Lessons from an unexpected playtest moment</title>
      <link>https://weblog.masukomi.org/2024/04/21/lessons-from-an-unexpected-playtest-moment/</link>
      <pubDate>Sun, 21 Apr 2024 00:00:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2024/04/21/lessons-from-an-unexpected-playtest-moment/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#quick-mechanical-rules-note&#34;&gt;Quick Mechanical / Rules Note&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#learning-from-what-went-down-dot&#34;&gt;Learning from what went down.&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#setting-the-scene&#34;&gt;Setting The Scene&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#side-note-on-how-we-got-here&#34;&gt;Side note on how we got here&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#playing-it-out&#34;&gt;Playing it out&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#lesson-s-learned&#34;&gt;Lesson&amp;rsquo;s Learned&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#doom-pool&#34;&gt;Doom Pool&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#helping-players&#34;&gt;Helping Players&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;Playtesting &lt;em&gt;my&lt;/em&gt; Tabletop Role Playing Game (TTRPG) I encountered a situation that worried, and surprised me. This post discusses an unexpected combat where I&amp;rsquo;m worrying if my characters will survive because they&amp;rsquo;re too &amp;ldquo;real&amp;rdquo;, and then finding myself 🤯 &amp;ldquo;blown away&amp;rdquo; by what happens.&lt;/p&gt;
&lt;p&gt;If you don&amp;rsquo;t care about how TTRPGs work, don&amp;rsquo;t bother reading this. I&amp;rsquo;ll be narrating a surprisingly short combat, and then talking about what worked well.&lt;/p&gt;
&lt;h2 id=&#34;quick-mechanical-rules-note&#34;&gt;Quick Mechanical / Rules Note&lt;/h2&gt;
&lt;p&gt;In this game I&amp;rsquo;ve got approaches, which are a lot like Starforged / Ironforged &amp;amp; Fate Accellerated, but they&amp;rsquo;re combined with skills. So, if someone is - for example - trying to punch you, you &lt;em&gt;could&lt;/em&gt; be like &amp;ldquo;let &amp;rsquo;em try&amp;rdquo; and try to impersonate an immovable wall with sheer muscle. If you do it really well, they might become intimidated or something else narratively appropriate. Alternately you could &amp;ldquo;float like a butterfly&amp;rdquo; and try and dodge the blows.&lt;/p&gt;
&lt;p&gt;Also, all the rolls are player facing, so when an adversary attacks, the player rolls to defend.&lt;/p&gt;
&lt;h2 id=&#34;learning-from-what-went-down-dot&#34;&gt;Learning from what went down.&lt;/h2&gt;
&lt;h3 id=&#34;setting-the-scene&#34;&gt;Setting The Scene&lt;/h3&gt;
&lt;p&gt;Our companions have &lt;em&gt;just&lt;/em&gt; overcome a harrowing  - and potentially deadly - attempt to cross a ravine. When they reach the far side they fall to the ground exhausted; breathing heavy, looking at the sky, and thankful to be alive.&lt;/p&gt;
&lt;p&gt;Before they can fully catch their breath, one of them hears a sound. They look over and see 6 people with spears coming at them with &lt;em&gt;very&lt;/em&gt; stabby intent (🔪🔪🔪).&lt;/p&gt;
&lt;h4 id=&#34;side-note-on-how-we-got-here&#34;&gt;Side note on how we got here&lt;/h4&gt;
&lt;p&gt;Flopping to the ground after the harrowing encounter was the end of a scene. I was &lt;em&gt;planning&lt;/em&gt; on having the characters just catch their breath and eat lunch. However the &lt;a href=&#34;https://www.wordmillgames.com/mythic.html&#34;&gt;Mythic Game Master Emulator (GME)&lt;/a&gt; had other ideas. The oracle tells me it&amp;rsquo;s a &amp;ldquo;Confident Threat&amp;rdquo;. I&amp;rsquo;m thinking maybe it&amp;rsquo;s a large predator thinking it&amp;rsquo;s got an easy meal, but then the &lt;a href=&#34;https://www.wordmillgames.com/creature-crafter.html&#34;&gt;Creature Crafter&lt;/a&gt; is like &amp;ldquo;no way. it&amp;rsquo;s 6+ armored people&amp;rdquo;. I ask my oracle what their deal is and it says &amp;ldquo;Threatening Warning&amp;rdquo;. So, I&amp;rsquo;m thinking &amp;ldquo;ok, these folks must have recently moved into this area &amp;amp; are guarding it. Maybe we can talk our way out of this.&amp;rdquo; But then my Doom mechanic kicks in, and it&amp;rsquo;s like &amp;ldquo;well, actually… &lt;em&gt;they are pissed&lt;/em&gt; and going to stab first and discuss later&amp;rdquo;&lt;/p&gt;
&lt;p&gt;My Doom mechanic is basically a Doom Pool (a pool of points the GM can optionally spend to complicate players&amp;rsquo; lives) with some rules to mechanically kick it off sometimes. As I play through this combat I learn its actually a little &lt;em&gt;too&lt;/em&gt; aggressive &amp;amp; I end up ignoring it half way through. That&amp;rsquo;s a separate discussion though so I&amp;rsquo;m not going to really mention it much past this. Just know that &lt;em&gt;most&lt;/em&gt; of the rolls are generating doom &amp;amp; the mechanism keeps making me use it.&lt;/p&gt;
&lt;h3 id=&#34;playing-it-out&#34;&gt;Playing it out&lt;/h3&gt;
&lt;p&gt;At this point I&amp;rsquo;m fully believing that they can &lt;em&gt;not&lt;/em&gt; survive fighting these folks, and running is their &lt;em&gt;only&lt;/em&gt; real option.&lt;/p&gt;
&lt;p&gt;You see, in this setting there&amp;rsquo;s a hint of magic, but mostly people are just… people - although not always human. Some are weak, some are strong, but mostly they&amp;rsquo;re like us: primarily differentiated by their personalities and the things they know how to do. PCs are no more powerful, and no less stabbable than anyone else. Also, it&amp;rsquo;s pretty easy to die. This is because in real life it&amp;rsquo;s pretty easy to die. Also, I&amp;rsquo;ve not been not rolling a ton of &amp;ldquo;successes&amp;rdquo; up to this point.&lt;/p&gt;
&lt;p&gt;Our party consists of 1 large martial artist (Les), who&amp;rsquo;s paired with a weak, semi-ambulatory magic user (Meg) who usually gets around on a &amp;ldquo;Hover Disk&amp;rdquo;. Think wheelchair, but it looks like a wok. For story reasons that&amp;rsquo;s strapped to her chest, and even if it &lt;em&gt;was&lt;/em&gt; under her, it doesn&amp;rsquo;t move quickly. They&amp;rsquo;re traveling with a Seer / Herbalist (Sennen) who has fuck-all for fighting skills but is physically fit. Note that magic is NOT about creating explosions and zapping rays in this world. It&amp;rsquo;s pretty subtle, but also very flexible.&lt;/p&gt;
&lt;p&gt;However, they wouldn&amp;rsquo;t have made it across the ravine without Meg&amp;rsquo;s spells, and if she casts one more she&amp;rsquo;ll take a &amp;ldquo;Condition&amp;rdquo;, which would probably be a very Bad Thing™. There&amp;rsquo;s a good chance she&amp;rsquo;d pass out. She&amp;rsquo;s got the aspects &amp;ldquo;Weak&amp;rdquo; and &amp;ldquo;Semi-Ambulatory&amp;rdquo; which can be invoked by the GM (me), but mostly just mean &amp;ldquo;she&amp;rsquo;s not running anywhere, or lifting anything&amp;rdquo;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;I &lt;a href=&#34;https://weblog.masukomi.org/2023/10/30/red-black-initiative/&#34;&gt;work out the red black initiative&lt;/a&gt;, &amp;amp; discover that 3 of the 6 bad guys go first. It is my expert opinion that the characters are fucked, and it&amp;rsquo;ll be a fucking miracle if they get out of here alive.&lt;/p&gt;
&lt;p&gt;Three of them head for Les because he&amp;rsquo;s narratively an obvious danger (not relevant why).&lt;/p&gt;
&lt;p&gt;BG1 (Bad Guy 1 - At this point I don&amp;rsquo;t care what their names are) manages to cut Les, BG2 tries, but Les rolls spectacularly, gets a critical success, uses it for a free attack, succeeds &amp;amp; because less has the &amp;ldquo;Powerful&amp;rdquo; aspect he spends a Story Point (similar to &amp;ldquo;&lt;a href=&#34;https://fate-srd.com/fate-core/fate-points&#34;&gt;FATE Points&lt;/a&gt;&amp;rdquo;) to invoke that and break the guy&amp;rsquo;s arm. BG3 doesn&amp;rsquo;t manage to hit Les, and now it&amp;rsquo;s Les&amp;rsquo;s turn. He gets another critical success, spends another Story Point &amp;amp; breaks &lt;em&gt;this&lt;/em&gt; guy&amp;rsquo;s arm. Unarmed combat is Les&amp;rsquo;s &amp;ldquo;thing&amp;rdquo;, &amp;amp; he&amp;rsquo;s Meg&amp;rsquo;s bodyguard so all of this makes a ton of narrative sense.&lt;/p&gt;
&lt;p&gt;BG4 is going after Sennen. Sennen - again - has fuck-all for fighting skills. She will &lt;em&gt;not&lt;/em&gt; be able to just dodge the impending spear. As a player I&amp;rsquo;m thinking &amp;ldquo;Oh shit. Oh shit. Oh shit.&amp;rdquo; because I&amp;rsquo;ve got nothing. I realize there&amp;rsquo;s no way i can approach this like most TTRPG fights. The mechanics are clearly communicating, &amp;ldquo;You better get &lt;em&gt;damn&lt;/em&gt; creative or you&amp;rsquo;re gonna die.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;So i start thinking about the character, and what she &lt;em&gt;can&lt;/em&gt; do. Sennen&amp;rsquo;s job as Seer means that she spends a &lt;em&gt;lot&lt;/em&gt; of time observing people, and understanding them and how they work emotionally. She needs, to so that she can convince them her predictions &lt;em&gt;need&lt;/em&gt; to be taken seriously. Her strongest approach is &amp;ldquo;Heart&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;So, I lean into that. Sennen &lt;em&gt;knows&lt;/em&gt; that she can&amp;rsquo;t beat these guys in a fight. Her strong intuition is telling her that they are &lt;em&gt;not&lt;/em&gt; going to listen to any reasonable discussion. She knows what makes people afraid, because fear is a &lt;em&gt;great&lt;/em&gt; reason to listen to a prediction. So, she becomes a completely insane &lt;a href=&#34;https://youtu.be/nWfeFrLl6LM&#34;&gt;Honey Badger&lt;/a&gt; of a human and instead of trying to dodge the attack runs at the guy screaming the most unhinged things she can think of to &amp;ldquo;throw him off&amp;rdquo; mentally. And it works! She rolls a critical success. Sennen catches him off guard, gets in close, uses the extra success to disarm him, and spends a Story Point to his spear into the woods. This is just so awesome and 🤯 that I have to reward it so (borrowing from FATE) I give him &amp;amp; his partner the &amp;ldquo;Aspect&amp;rdquo; of &amp;ldquo;disturbed / unsettled&amp;rdquo; with 2 free invokes. The next baddy was just coming in to stab a flopped intruder but now some fucked up shit is happening &lt;em&gt;and&lt;/em&gt; the Honey Badger woman just got in his partners face and disarmed him.&lt;/p&gt;
&lt;p&gt;Mechanically this gives me an extra die from invoking the &amp;ldquo;disturbed / unsettled&amp;rdquo; aspect, and 1 because he doesn&amp;rsquo;t want to hit his friend. So, Sennen just keeps going with what&amp;rsquo;s working, pushes off of the first guy, doesn&amp;rsquo;t dodge and fucking lunges at the second continuing to spout disturbing things and acting like she&amp;rsquo;ll fucking eat his eyeballs directly out of his skull. She wouldn&amp;rsquo;t, but he doesn&amp;rsquo;t know that. And again, a critical success, so again she uses it to disarm her opponent, and again spends a Story Point to huck it into the woods.&lt;/p&gt;
&lt;p&gt;So, to recap: we&amp;rsquo;ve got 2 attackers screaming in pain from their broken arms. We&amp;rsquo;ve got 2 attackers with no weapons at hand, &amp;amp; only 1 of the characters has had had a chance to take their turn.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s Sennen&amp;rsquo;s turn now. She yells &amp;ldquo;RUN!!!&amp;rdquo; They were all close to begin with. She sees Meg getting to her feet, and shoves her forward so that now she&amp;rsquo;s &amp;ldquo;supermanning&amp;rdquo; her Hover Disk, which means its got someone on it, and it&amp;rsquo;s oriented correctly relative to the ground so it starts &lt;em&gt;acting&lt;/em&gt; like a Hover Disk, and Sennen is pushing Meg and trying to &lt;a href=&#34;https://www.dictionary.com/e/acronyms/gtfo/&#34;&gt;GTFO&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The last attacker was going for Meg, but now tries to spear Sennen as she&amp;rsquo;s starting to go with Meg. Sennen&amp;rsquo;s still acting completely unhinged but she&amp;rsquo;s not directly interacting with this adversary so it&amp;rsquo;s not going to have the same effect. She&amp;rsquo;s just got to &lt;em&gt;run&lt;/em&gt; with pure muscle and hope that she&amp;rsquo;s faster. That&amp;rsquo;s not her forté though.&lt;/p&gt;
&lt;p&gt;To &lt;span class=&#34;underline&#34;&gt;Help&lt;/span&gt; Meg spends 1 Story Point to say that as she was starting to get up she grabbed a handful of dirt and rocks. She then &lt;span class=&#34;underline&#34;&gt;Helps&lt;/span&gt; Sennen by throwing it at the attacker&amp;rsquo;s face.&lt;/p&gt;
&lt;p&gt;Sennen rolls and we discover that she doesn&amp;rsquo;t &amp;ldquo;run&amp;rdquo;. She RUNS. She rolls 3 successes and is &lt;em&gt;fucking gone&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Finally, it&amp;rsquo;s Meg&amp;rsquo;s turn, but she&amp;rsquo;s strapped to a Hover Disk, being rapidly pushed through the woods like a kid pretending to fly. She can&amp;rsquo;t access her slingshot. She can&amp;rsquo;t cast anything that&amp;rsquo;ll be particularly useful to Les, and if she tries she&amp;rsquo;ll take a &amp;ldquo;Condition&amp;rdquo; (a Bad Thing™). So, she just lets herself be pushed and watches for obstacles. Les is on his own.&lt;/p&gt;
&lt;p&gt;The 1st attacker, the one who actually hit, is pissed. Two of his friends just got their arms broken, but &lt;em&gt;he&lt;/em&gt; actually cut Les and is gonna do it again. Until Les, rolls another critical success, takes the free attack, succeeds at that, spends another Story Point and this time, because he knows it&amp;rsquo;ll slow them down more, breaks the guy&amp;rsquo;s knee.&lt;/p&gt;
&lt;p&gt;On his turn he takes off, avoiding the adversaries.&lt;/p&gt;
&lt;p&gt;The scene ends with our protagonists &amp;ldquo;booking it&amp;rdquo; through the woods, while the camera zooms back to a group that&amp;rsquo;s got 3 screaming guys - one of whom is rolling on the ground holding their leg, two of whom are completely freaked out by the Honey Badger woman who disarmed both of them, and the last one is wondering WTF just happened.&lt;/p&gt;
&lt;p&gt;There is also, a new adversarial faction that&amp;rsquo;s &lt;em&gt;very&lt;/em&gt; pissed off, and &lt;em&gt;will&lt;/em&gt; soon start hunting our protagonists.&lt;/p&gt;
&lt;h3 id=&#34;lesson-s-learned&#34;&gt;Lesson&amp;rsquo;s Learned&lt;/h3&gt;
&lt;p&gt;At its heart my core dice mechanic is the Year Zero Engine from &lt;a href=&#34;https://freeleaguepublishing.com&#34;&gt;Fria Ligan&lt;/a&gt;. I&amp;rsquo;ve taken a LOT of liberties with it, but players are building a pool of dice, and hoping some of them roll sixes. So, each die has a roughly 16% chance of success. It&amp;rsquo;s not a lot.&lt;/p&gt;
&lt;h4 id=&#34;doom-pool&#34;&gt;Doom Pool&lt;/h4&gt;
&lt;p&gt;On top of that I&amp;rsquo;d added in a Doom Pool mechanic where every time you rolled a 1 it generated &amp;ldquo;Doom&amp;rdquo;. As soon as the roll was resolved, you&amp;rsquo;d see if the Doom pool got activated. It was getting activated &lt;em&gt;way&lt;/em&gt; too often. Additionally I found it &lt;em&gt;easy&lt;/em&gt; generate more doom (rolling a 1) but &lt;em&gt;difficult&lt;/em&gt; to succeed (roll a 6). That is of course, a purely emotional take as the odds are always identical, but it was still sticking its nose in &amp;ldquo;too often&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Whenever Doom was generated I&amp;rsquo;d roll a d6. If i rolled under, something &amp;ldquo;negative&amp;rdquo; happened. I rolled under a lot. Especially because many rolls generated more than one point of Doom.&lt;/p&gt;
&lt;p&gt;In a way this feels like how &lt;a href=&#34;https://en.wikipedia.org/wiki/Powered_by_the_Apocalypse&#34;&gt;PbtA games&lt;/a&gt; frequently feel like it&amp;rsquo;s nigh-impossible to have a roll without complications. Unlike many PbtA games I don&amp;rsquo;t have suggested complications for every roll, because I don&amp;rsquo;t have &amp;ldquo;moves&amp;rdquo;. I plan on creating some tables for mental and physical complications, but I just haven&amp;rsquo;t gotten around to it. Even then, I feel like &amp;ldquo;Doom&amp;rdquo; / GM Intrusions / FATE Compels shouldn&amp;rsquo;t be happening so often it feels like every other roll.&lt;/p&gt;
&lt;p&gt;Also, the mechanics kicking it off so often means that there&amp;rsquo;s frequently none, or hardly any in the pool for the GM to use for story reasons.&lt;/p&gt;
&lt;p&gt;I need to reconsider how Doom is generated, how much can be built up, and how it&amp;rsquo;s invoked mechanically by the game.&lt;/p&gt;
&lt;h4 id=&#34;helping-players&#34;&gt;Helping Players&lt;/h4&gt;
&lt;p&gt;The big lesson here is &lt;em&gt;not&lt;/em&gt; that my Doom mechanic is trying to kill me. It&amp;rsquo;s that with sufficient support, perfectly &amp;ldquo;average&amp;rdquo; characters can absolutely beat the odds.&lt;/p&gt;
&lt;p&gt;Before I get into this, I need to acknowledge that the characters did roll atypically well, but I firmly believe that they could have pulled through with more average rolls. They&amp;rsquo;d just have been more battered. I think we can look to the &lt;em&gt;many&lt;/em&gt; successful campaigns of Mutant Year Zero (and friends) for confirmation that it&amp;rsquo;s a dangerous / &amp;ldquo;deadly&amp;rdquo; system, but one in which &lt;em&gt;most&lt;/em&gt; characters stay alive for an entire campaign.&lt;/p&gt;
&lt;p&gt;The difference here is that in games like Mutant Year Zero &lt;em&gt;all&lt;/em&gt; the characters and going out ready for a fight, and having reasonable expectations they&amp;rsquo;ll have one, &amp;amp; be able to survive it.&lt;/p&gt;
&lt;p&gt;My setting isn&amp;rsquo;t like that. It&amp;rsquo;s more about telling stories of mostly &amp;ldquo;normal&amp;rdquo; people who find themselves in extraordinary situations. Yes, there&amp;rsquo;s magic sprinkled in but it&amp;rsquo;s just a subtle enhancement. It&amp;rsquo;s influencing elements or creatures, encountering ghosts, getting an occasional glimpse of the future. No zappy zappy with magic or sci-fi weapons.&lt;/p&gt;
&lt;p&gt;In this case my characters were trying to race 3 days through the woods to get a thing before a religious group did. If they encountered the religious group, they had &lt;em&gt;no&lt;/em&gt; intention of fighting them… but 💩 happens.&lt;/p&gt;
&lt;p&gt;So, ultimately what we need to do is have a way for characters to find themselves in situations they&amp;rsquo;re &lt;em&gt;completely&lt;/em&gt; unsuited to, without saying &amp;ldquo;Tough shit. You&amp;rsquo;re fucked.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I think I may have succeed in providing the structure to support that. I&amp;rsquo;m not sure if &lt;em&gt;players&lt;/em&gt; will be able to take advantage of it. As we saw with Sennen, it may require some &lt;em&gt;very&lt;/em&gt; &amp;ldquo;&lt;a href=&#34;https://en.wikipedia.org/wiki/Lateral_thinking&#34;&gt;lateral thinking&lt;/a&gt;&amp;rdquo;&lt;/p&gt;
&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Meta Currency / Story Points / FATE Points&lt;/p&gt;
&lt;p&gt;This was the primary reason the characters survived. BUT the key to it working was to &lt;em&gt;not&lt;/em&gt; use it for something simplistic like a bonus to rolls, or a reroll. First off, Year Zero already gives me a nice reroll ability that comes with a cost. Secondly, I think a lot of people have come to the conclusion is that one of the big problems with FATE is that no-matter how cool your &amp;ldquo;stunt&amp;rdquo; is, they&amp;rsquo;re ultimately all just &amp;ldquo;add +2 to your roll&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Yes, I&amp;rsquo;m oversimplifying, but not by much. The point is, spending meta-currency to get a simple same-feeling mechanical bonus just isn&amp;rsquo;t fun.&lt;/p&gt;
&lt;p&gt;Using one to invoke a Flashback like Blades in the Dark is pretty awesome. Using one to inject an object / fact into the world is pretty awesome.&lt;/p&gt;
&lt;p&gt;I think Les using a Story Point to change a successful attack into a broken arm by invoking the fact that he&amp;rsquo;s &amp;ldquo;Powerful&amp;rdquo; is awesome. The rules don&amp;rsquo;t define the mechanical result of invoking your Aspects. They just tell you how, and trust the players and GM to do something that makes narrative sense, and is something that &amp;ldquo;could actually happen&amp;rdquo; in the scene.&lt;/p&gt;
&lt;p&gt;Normally &amp;ldquo;disarming&amp;rdquo; an opponent means they drop their weapon, but that they can also pick it up again. Her opportunity to disarm was an option in the rules for &amp;ldquo;critical success&amp;rdquo;, but spending a Story Point to remove it from play wasn&amp;rsquo;t fancy, but it was an awesome underdog move. It also made narrative sense. She couldn&amp;rsquo;t have done it if they were in a room, but they were by the edge of the woods so yeah. It made narrative sense for that to be gone until they spent time to wander off and look for it.&lt;/p&gt;
&lt;p&gt;Giving your players a tool that gives them &lt;em&gt;huge&lt;/em&gt; flexibility as long as it makes narrative sense enables them to do creative things that have significant mechanical benefits.&lt;/p&gt;
&lt;p&gt;My characters start out with 5 &amp;ldquo;Story Points&amp;rdquo;. That &lt;em&gt;may&lt;/em&gt; be too much, but it&amp;rsquo;s not a lot. It&amp;rsquo;s also tempered by the fact that you can only invoke it when it&amp;rsquo;s&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Critical Successes&lt;/p&gt;
&lt;p&gt;I love games with complicated degrees of success. Great success. Success with complications, failure with benefits, etc.&lt;/p&gt;
&lt;p&gt;Critical Success are a ton of fun. Having only 1 potential consequence like &amp;ldquo;double your damage&amp;rdquo; isn&amp;rsquo;t. I think I&amp;rsquo;ve got 4 specified options related to combat situations, and the &lt;em&gt;strong&lt;/em&gt; suggestion that any reasonable form of &amp;ldquo;more&amp;rdquo; or &amp;ldquo;and also&amp;rdquo; is highly encouraged.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Mechanically Encouraging Cooperation&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m leveraging Year Zero&amp;rsquo;s &amp;ldquo;push&amp;rdquo; mechanic. You&amp;rsquo;re rolling a pool of D6s &amp;amp; this lets you reroll everything that isn&amp;rsquo;t a 1 or a 6, but it comes with a cost. This is usually physical or mental stress, of which the characters have very small pools.&lt;/p&gt;
&lt;p&gt;Rerolls do increase your odds, but not as much as rolling &amp;ldquo;with advantage&amp;rdquo; and allowing 5s &amp;amp; 6s to be considered a success. The difference isn&amp;rsquo;t as big as you&amp;rsquo;d expect, but it &lt;em&gt;feels&lt;/em&gt; like it is. Of equal importance is that it encourages characters to &lt;em&gt;help&lt;/em&gt; each other. That comes with a cost too though. If the roll goes badly, everyone who helped &lt;em&gt;will&lt;/em&gt; share the negative consequences - assuming it makes narrative sense.&lt;/p&gt;
&lt;p&gt;Combined with the ability to spend Story Points Meg was able to Help Sennen get a fantastic outcome at something she was bad at, &lt;em&gt;and&lt;/em&gt; it enabled Meg to participate in a meaningful way when she would have otherwise just done nothing.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Aspects&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a lot of debate about &amp;ldquo;Aspects&amp;rdquo; as FATE uses them. I debate them with myself constantly. If you haven&amp;rsquo;t played with them I recommend checking out &lt;a href=&#34;https://youtu.be/NOFXtAHg7vU&#34;&gt;the episode of Wil Wheaton&amp;rsquo;s TableTop where they play FATE with one of its creators&lt;/a&gt;. It&amp;rsquo;s also just a great intro to FATE.&lt;/p&gt;
&lt;p&gt;I have &lt;em&gt;so&lt;/em&gt; many feelings about the idea of creating an Aspect in a scene and letting players then use it mechanically, but it &lt;em&gt;can&lt;/em&gt; work.&lt;/p&gt;
&lt;p&gt;I think it worked well with Sennen&amp;rsquo;s making her attackers worried / disturbed / uneasy. It made narrative sense. The dice were certainly trying to tell that story, and it also makes sense that after a couple &amp;ldquo;invokes&amp;rdquo; it&amp;rsquo;d be harder to leverage that. The adversaries would start dealing with it more competently. It should be noted that when I rolled I wasn&amp;rsquo;t &lt;em&gt;trying&lt;/em&gt; to create an aspect. I was &lt;em&gt;trying&lt;/em&gt; to not get skewered. After succeeding my GM brain kicked in and said &amp;ldquo;hey, that was an awesome moment. Let&amp;rsquo;s reward that. Let&amp;rsquo;s build on it.&amp;rdquo; So, I created an aspect that was ultimately just a side effect of creative play.&lt;/p&gt;
&lt;p&gt;In addition to making a player feel great, making Aspects in that manner is also going to help reinforce the idea that &amp;ldquo;oh yeah, I can create an aspect to help myself&amp;rdquo;. If things had played out differently that may have been the best option for Meg&amp;rsquo;s turn. The game encouraging players to &amp;ldquo;help&amp;rdquo; each other so they can roll with &amp;ldquo;advantage&amp;rdquo; whenever possible is also going to feed into this. Players will be more likely to do something to help their friends in more ways.&lt;/p&gt;
&lt;p&gt;At the same time, Aspects are a bit &amp;ldquo;weird&amp;rdquo;. I can see why some players might have problems with them.&lt;/p&gt;
&lt;p&gt;What I learned from this is that they&amp;rsquo;re another important tool for helping characters to help themselves when they weren&amp;rsquo;t created in a way that is any good for the situation. It gives them a mechanical benefit for creative play, and creative play was the &lt;em&gt;only&lt;/em&gt; way out of that situation.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Forced Creativity&lt;/p&gt;
&lt;p&gt;With &amp;ldquo;Story Points&amp;rdquo; and flexible &amp;ldquo;Critical Successes&amp;rdquo; alone I&amp;rsquo;ve got a pretty decent support system for &amp;ldquo;you can do more&amp;rdquo;. Allowing players to intentionally, or inadvertently create &amp;ldquo;aspects&amp;rdquo; that help them gives them more options.&lt;/p&gt;
&lt;p&gt;The complication is that I can have the rules put you in a tough place. I can&amp;rsquo;t make you think out of the box though.&lt;/p&gt;
&lt;p&gt;For example, I think that if you asked someone who&amp;rsquo;d only played D&amp;amp;D to play Sennen, when she was about to get poked the first time they&amp;rsquo;d probably just &amp;ldquo;try to dodge&amp;rdquo;, and fail miserably.&lt;/p&gt;
&lt;p&gt;I think the idea of &amp;ldquo;approaches&amp;rdquo; does help with this though. If you&amp;rsquo;re looking at your character sheet and going &amp;ldquo;damn, couldn&amp;rsquo;t punch my way out of a wet paper bag, but I &lt;em&gt;am&lt;/em&gt; really good at [insert approach here] it encourages them to try a different approach.&lt;/p&gt;
&lt;p&gt;Now, you&amp;rsquo;re &lt;em&gt;definitely&lt;/em&gt; going to get players trying to bend the intent. I think Sennen&amp;rsquo;s &amp;ldquo;Honey Badger&amp;rdquo; approach using &amp;ldquo;Heart&amp;rdquo; was right on the edge of that. Some GMs might have ruled against it. Personally I allowed it because it was plausible, and because if I said no I&amp;rsquo;d basically be saying &amp;ldquo;Tough shit.&amp;rdquo; The rest of the encounter would have probably sucked for them because there wasn&amp;rsquo;t much &lt;em&gt;else&lt;/em&gt; they could do. Also, just &amp;ldquo;holy shit yes!&amp;rdquo; I want to see what happens when the player / character tries something &amp;ldquo;crazy&amp;rdquo;. &amp;ldquo;Be a fan of your players&amp;rdquo; is some great advice, even when you&amp;rsquo;re playing solo.&lt;/p&gt;
&lt;p&gt;My task is to figure out how to direct players towards non-standard options. I also need to find ways to encourage GMs to be fans of their players &amp;amp; their characters, but NOT to just &amp;ldquo;let them do whatever&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;I think it&amp;rsquo;s critical that whatever they attempt is narratively plausible. If you&amp;rsquo;re watching a movie about a weakling nerd who needs to see what&amp;rsquo;s happening on the other side of a concrete wall, you&amp;rsquo;re going to be &amp;ldquo;W.T.F?!&amp;rdquo; if they suddenly punch through said wall to see.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Trust things that work.&lt;/p&gt;
&lt;p&gt;While I&amp;rsquo;ve severely modified it, the Year Zero Engine is a proven system. The math works. Tons of people have had great experiences playing it in a variety of settings. I was &lt;em&gt;seriously&lt;/em&gt; wondering if I&amp;rsquo;d screwed up because I was rolling so bad, for so long. So, I graphed the probabilities, and saw that &amp;ldquo;Yeah, it&amp;rsquo;ll work. I just need to give players the tools to help themselves succeed.&amp;rdquo;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Manual Support Fins for 3D Printing</title>
      <link>https://weblog.masukomi.org/2024/03/11/manual-support-fins-for-3d-printing/</link>
      <pubDate>Mon, 11 Mar 2024 00:00:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2024/03/11/manual-support-fins-for-3d-printing/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-setup-and-goal&#34;&gt;The Setup &amp;amp; Goal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#first-attempt&#34;&gt;First Attempt&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#lessons-learned&#34;&gt;Lessons Learned&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#second-attempt&#34;&gt;Second Attempt&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#lessons-learned&#34;&gt;Lessons Learned&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#third-attempt&#34;&gt;Third Attempt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#cleanup&#34;&gt;Cleanup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#conclusions&#34;&gt;Conclusions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;Whilst very useful, automatically generated supports can waste a lot of material and result in lots unnecessary cleanup. Sometimes, you want to go with manual supports.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/03/11/video_still.png&#34;
    alt=&#34;a still from the video where I learned this technique. it gives an example of what I attempted.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;This post follows my failures and lessons learned in using manual supports. It should save you a lot of pain if you venture down this route.&lt;/p&gt;
&lt;p&gt;Originally posted as &lt;a href=&#34;https://connectified.com/@masukomi/112060578105212098&#34;&gt;a Mastodon thread that spanned multiple days.&lt;/a&gt; This presents of series of unfolding mysteries and discoveries as I try to understand some of the quirks of 3d printing.&lt;/p&gt;
&lt;h2 id=&#34;the-setup-and-goal&#34;&gt;The Setup &amp;amp; Goal&lt;/h2&gt;
&lt;p&gt;As part of a accessibility project I&amp;rsquo;m working on for a friend, I need to print out a thin plate that&amp;rsquo;s wider than my print bed, but happens to fit into the cubic printable area without needing to split it. Not wanting to deal with cleanup, or huge print times from a billion automatically generated supports. I decided to explore a technique for manual supports that was suggested in &lt;a href=&#34;https://youtu.be/8NKVNwVaZU0&#34;&gt;this video from Slant3D&lt;/a&gt;. They use FDM printing at massive scales, and know a thing or two about good printing techniques.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what I&amp;rsquo;m trying to print. I need two versions, one that&amp;rsquo;s 2mm thick, and one that&amp;rsquo;s 1mm thick. It&amp;rsquo;s 290mm wide, but my print bed is only 256 by 256. This is just one component of a larger device.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/03/11/what_im_printing@2x.png&#34;
    alt=&#34;a rendering of what i&amp;#39;m printing. it&amp;#39;s a flat plate with a semi-triangular cutout.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;The goal is to generate a fin that&amp;rsquo;s offset from the print by 1mm with a series of small &lt;a href=&#34;https://en.wikipedia.org/wiki/Sprue_%28manufacturing%29&#34;&gt;sprues&lt;/a&gt; that provide support for the angled piece, but can be easily broken off.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/03/11/sprue_sketch.png&#34;
    alt=&#34;a CAD sketch showing the shape of the sprue i&amp;#39;ve designed&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Here you can see the sprue design that I&amp;rsquo;m using. This didn&amp;rsquo;t change throughout the following tests as it worked pretty well out of the gate.&lt;/p&gt;
&lt;h2 id=&#34;first-attempt&#34;&gt;First Attempt&lt;/h2&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/03/11/first_failure.jpg&#34;
    alt=&#34;a split image showing the results of the initial attempt from the front and the back. there&amp;#39;s a lot of dangling filament on the back, and the front has what look like horizontal cuts along layer lines. they come in from the sides and the whole thing looks like a piece of fabric that&amp;#39;s sagged down an incline and bunched up.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;I checked in on the print and something had gone very wrong. It initially seemed like a &lt;em&gt;very&lt;/em&gt; predictable, failure. I was wrong.&lt;/p&gt;
&lt;p&gt;I figured that the two pieces to either side of the hole have no vertical support. Their layers there were simply being stacked at a 35° offset. I figured that it was simply a matter of not being able to do that for very long without &lt;em&gt;any&lt;/em&gt; support.&lt;/p&gt;
&lt;p&gt;However, things become weird when you step back and realize that the failures started BEFORE the cutout, or when you step close, and see what the side profile looks like.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/03/11/failure_side_profile.jpg&#34;
    alt=&#34;a close-up side-on view of the edge of the print. It&amp;#39;s pretty bad.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;It&amp;rsquo;s as if certain layers were simply skipped, but that couldn&amp;rsquo;t be happening. Was the piece vibrating back and forth as the height increased? I can&amp;rsquo;t wait to see the time-lapse, but I doubt it will have any answers for me.&lt;/p&gt;
&lt;p&gt;Stepping back though, you can see that errors started emerging a couple centimeters BEFORE the cutout. Why?&lt;/p&gt;
&lt;p&gt;Looking at the back-side / underside I don&amp;rsquo;t see anything terribly surprising given what was observed on the front. That is, UNTIL I snap off the support.&lt;/p&gt;
&lt;p&gt;Here I see something truly surprising…&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/03/11/annotated_first_edge_failure.jpg&#34;
    alt=&#34;an annotated image of the underside of the print showing where the seam stopped, and the failure started to appear.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;I open the slicer, and reslice the model using the same settings as before. Our culprit is revealed.&lt;/p&gt;
&lt;p&gt;This is a false-color view. the white dots and lines are the &amp;ldquo;seam&amp;rdquo; points where the print head jumps up to the next layer. For most of the lower section of the print it is placing the seam behind the support. Then, it jumps to the side. This matches the source of our first edge failures.&lt;/p&gt;
&lt;p&gt;It jumps back to the central support for about 1cm. During that time, we have a pause in the failures. When the seam points jumps back to the edge, the failures start again. Then, we reach the cut-out and the seam moves to the inner edge of that, stepping gradually up.&lt;/p&gt;
&lt;p&gt;Wherever the seam is NOT along that central line, we have failures.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/03/11/seams_screenshot.png&#34;
    alt=&#34;a false color image showing how the print will be handled by the printer.&#34;&gt;
&lt;/figure&gt;

&lt;h3 id=&#34;lessons-learned&#34;&gt;Lessons Learned&lt;/h3&gt;
&lt;p&gt;Normally you want your seam to be along the edge of a print. Something about this structure makes that a problem though.&lt;/p&gt;
&lt;p&gt;I suspect that if this was a box, with sides, the sides would act similarly to a suspension bridge and provide the rigidity needed for this to not be a problem. Alas, it&amp;rsquo;s not a box. It&amp;rsquo;s just a 2mm plane with a cut-out.&lt;/p&gt;
&lt;p&gt;After a little research I decide to add 2 more support fins, so that those side pieces aren&amp;rsquo;t &amp;ldquo;floating&amp;rdquo; so much. I also decide to manually paint where the seam will be so that i can guarantee it never swaps over to an edge. It&amp;rsquo;ll be behind the central fin whenever possible, and then behind one of the side fins as we cross the cut-out region.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/03/11/seam_painting_screenshot.png&#34;
    alt=&#34;screenshot of the screen painting tool in Bambu Slicer and Orca Slicer.&#34;&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;second-attempt&#34;&gt;Second Attempt&lt;/h2&gt;
&lt;p&gt;Seam painting turns out to be an absolute nightmare. I need to carefully paint the guide on the back of the print, but that&amp;rsquo;s always partially obscured by the support fin. It&amp;rsquo;s difficult to do with a trackball (my default mouse input).&lt;/p&gt;
&lt;p&gt;I get really excited for a bit when I remember that I have an iPad and can use that to draw with the stylus. That turns out to be only marginally better, because Apple refuses to put any buttons on their damn stylus, and I have to keep reaching over to the mouse to middle click and drag the next section of the model into view. I have to be extremely zoomed in to be able to paint &amp;ldquo;behind&amp;rdquo; the fin. I spend maybe 30 minutes painting this stupid seam.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/03/11/painted_seam_screenshot.png&#34;
    alt=&#34;a screenshot showing the slicer where i&amp;#39;m zoomed way into the model and have painted some guides for the slicer indicating where to add or avoid adding seams.&#34;&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/03/11/printed_with_holes_and_dangling_edges.jpg&#34;
    alt=&#34;a 3 pane image. top left shows the full print. there&amp;#39;s some minor stringing in the cutout, and tiny loops visible in its upper edge. the top right shows a close-up of the supports with holes cut out of them to save filament. they are nasty looking. little blips as if wet filament was used, and artifacts from too much motion. the bottom image shows a close-up of the upper edge of the cutout. The loops of dangling unsupported filament are obvious.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Before I started painting I added the 2 support fins on the side, and cut a bunch of holes through them to save on filament. This was a bad idea for two reasons. First, it introduced another variable which makes diagnosing the result more difficult if there are problems. Second, it introduced a ton of motion as the printer had to make z-hops while retracting the filament and fast starts and stops as it transitioned across the circular gap to get to the next place it needed to lay down filament.&lt;/p&gt;
&lt;p&gt;This extra motion is extra concerning in a thin piece like this which could easily end up vibrating and being in the wrong place when the print head comes back around to lay the next layer.&lt;/p&gt;
&lt;p&gt;The extra fins plus seam painting seem to have solved the problem, but after getting rid of the horrible failure artifacts from the last print, I realize that they obscured the problem along the top edge of the cut-out. As the line of the cutout angles up I&amp;rsquo;m gradually printing too much filament into empty space. The dangling loops make this pretty obvious.&lt;/p&gt;
&lt;h3 id=&#34;lessons-learned&#34;&gt;Lessons Learned&lt;/h3&gt;
&lt;p&gt;Be cautious about saving filament if it&amp;rsquo;s going to introduce a lot of motion. Sometimes it&amp;rsquo;s more important to keep things moving smoothly.&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t assume that because you&amp;rsquo;ve diagnosed one problem, that it&amp;rsquo;s the &lt;em&gt;only&lt;/em&gt; problem.&lt;/p&gt;
&lt;h2 id=&#34;third-attempt&#34;&gt;Third Attempt&lt;/h2&gt;
&lt;p&gt;At this point I&amp;rsquo;m thoroughly fed up, and late on shipping this to my friend. He won&amp;rsquo;t care, but I do. I decide to forgo the nightmare of manual seam painting, introduce automatically generated &amp;ldquo;slim tree supports&amp;rdquo; to address the cantilevered cutout edge, and just see what happens.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/03/11/manual_plus_tree_support.png&#34;
    alt=&#34;a false-color screenshot showing the autogenerated tree supports that have fit themselves between the fins.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;I was about to click print, but then I saw the time, and filament usage: 8 hours 2 minutes, plus a full quarter spool of filament.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/2024/03/11/time_estimate_screenshot.png&#34;
    alt=&#34;a screenshot from Bambu Studio showing the estimated time, cost, and filament usage.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Just getting rid of the holes in the manual supports dropped it down to 7 hours, 50 minutes. Painting away autogenerated supports along the lower edge gave me 6 hours 16 minutes. Abandoning the use of different filament for the autogenerated support interface layer brought it down to 3 hours, 33 minutes. Abandoning the brim gave me 3 hours, 26 minutes.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m down to 176 grams.&lt;/p&gt;
&lt;p&gt;At this point I&amp;rsquo;m feeling demoralized, and just want to get this printed and sent to my friend. I&amp;rsquo;ve lost the spoons for being interested in lessons learned.&lt;/p&gt;
&lt;p&gt;4 hours later I have a good print. So, I load up the 1mm version and slice that, forgetting to paint along the bottom edge to prevent autogenerated supports there.&lt;/p&gt;
&lt;p&gt;This one&amp;hellip; is close. A minor print artifact along the top edge where there wasn&amp;rsquo;t a support and the seam jumped to the egde again. I call it good enough.&lt;/p&gt;
&lt;h2 id=&#34;cleanup&#34;&gt;Cleanup&lt;/h2&gt;
&lt;p&gt;At 0.2mm the tip of the sprue just barely makes contact with the print. In a handful of cases it proved to be too small and didn&amp;rsquo;t actually end up connecting. Maybe 0.3 or 0.4mm would be better.&lt;/p&gt;
&lt;p&gt;This small size means that you can wiggle the fin back and forth a few times and easily break it off with your hand. However, there is a problem. The tiny bits of plastic that remain are sharp. You&amp;rsquo;d easily scrape a table if you dragged them across it with any force. They&amp;rsquo;re also very unpleasant to touch.&lt;/p&gt;
&lt;p&gt;Because this is so late… Because these are just test prints to confirm an idea before making the final thing… Because only the side without the sprues will be seen after &amp;ldquo;installation&amp;rdquo; I decide to just attack it with a sanding block.&lt;/p&gt;
&lt;p&gt;The end result is predictably nasty looking. You should never sand a 3d print that you&amp;rsquo;re not going to paint.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/03/11/diptic_of_sprues_before_and_after_sanding.jpg&#34;
    alt=&#34;a 2 panel image showing a close-up of the sharp sprue remnants and what it looks like after sanding. there are very obvious scratches everywhere&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;If I have to do this again I&amp;rsquo;ll probably use my &lt;a href=&#34;https://amzn.to/3v4iYya&#34;&gt;Dremel Press&lt;/a&gt; (just a drill press made for a Dremel) with some sort of precise sanding tip to sand each sprue with minimal effect on the rest of the plate. A sanding block is a crude tool, but I just didn&amp;rsquo;t have the spoons to care.&lt;/p&gt;
&lt;p&gt;As someone who takes pride in their work I &lt;em&gt;hate&lt;/em&gt; this. I hate that I&amp;rsquo;m going to send something to a friend looking like this. He &lt;em&gt;will&lt;/em&gt; see it because I&amp;rsquo;m just sticking these in an envelope. It&amp;rsquo;s already almost week after I said I&amp;rsquo;d send it out, though.&lt;/p&gt;
&lt;h2 id=&#34;conclusions&#34;&gt;Conclusions&lt;/h2&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/03/11/waste_material_and_finished_pieces.jpg&#34;
    alt=&#34;six triangular fins, four fractal tree supports, and two final plates. the fins easily contain as much material as the plates they supported.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;This is an interesting technique. Slant3D applies it liberally because they&amp;rsquo;re running a massive print farm. Minimal bed contact means that they can use automated systems to push a finished print off of the plate and free the printer up to start the next one. That&amp;rsquo;s not a problem most of us have.&lt;/p&gt;
&lt;p&gt;On the other hand, removing supports is sometimes a massive pain. Sometimes it leaves the surface covered with unpleasant looking connection points where supports have been removed. Sometimes, like this time, you want to fit something diagonally up into the Z axis, because you print bed is just a little too small.&lt;/p&gt;
&lt;p&gt;My takeaways from this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It&amp;rsquo;s most effective when you have a piece with edges that can help provide a suspension-type-support to the plane you&amp;rsquo;re supporting above the build plate.&lt;/li&gt;
&lt;li&gt;Cutting holes into the support fins introduces additional time and motion that isn&amp;rsquo;t worth the filament savings and can potentially introduce problems to some prints.&lt;/li&gt;
&lt;li&gt;Combining it with auto-generated supports works well.&lt;/li&gt;
&lt;li&gt;Drawing seams is obnoxious and should be avoided whenever possible until someone adds a line tool to the drawing mechanism.&lt;/li&gt;
&lt;li&gt;You&amp;rsquo;ll need a plan for dealing with the tiny remnants of your sprues.&lt;/li&gt;
&lt;li&gt;With a well calibrated printer, you can get make sprues that are only 0.2mm at the point of connection but that will still result in some sprues failing to connect the gap between support and supported. I&amp;rsquo;m thinking I&amp;rsquo;ll use slightly larger connections next time. It should be noted that I printed this with a 0.6mm nozzle. I suspect a smaller nozzle would have fewer failed connection points without changing the sprues.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Fnatr 02 Box Fan Replacement</title>
      <link>https://weblog.masukomi.org/2024/03/10/fnatr-02-box-fan-replacement/</link>
      <pubDate>Sun, 10 Mar 2024 00:00:00 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/2024/03/10/fnatr-02-box-fan-replacement/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#how-to-replace-a-broken-fan-on-the-fnatr-02-box&#34;&gt;How to replace a broken fan on the Fnatr #02 Box&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#before-you-start-gather-the-following&#34;&gt;Before you start, gather the following&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-process&#34;&gt;The process&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;how-to-replace-a-broken-fan-on-the-fnatr-02-box&#34;&gt;How to replace a broken fan on the Fnatr #02 Box&lt;/h2&gt;
&lt;h3 id=&#34;overview&#34;&gt;Overview&lt;/h3&gt;
&lt;p&gt;It&amp;rsquo;s essentially impossible for human hands to insert the plug from a new fan into the circuit board. There is a very tempting screw that looks like it&amp;rsquo;s holding the circuit board on. You&amp;rsquo;d think you could just undo that and have easy access. Removing that screw does nothing. Don&amp;rsquo;t bother. Instead, you&amp;rsquo;re going to need to carve out a space large enough for human fingers to fit in there and align the tiny plug into the tiny socket.&lt;/p&gt;
&lt;p&gt;While you&amp;rsquo;re off buying a new fan, you might want to consider grabbing some magnets and printing &lt;a href=&#34;https://www.printables.com/model/748421-fnatr-box-02-replacement-filter-holder-v2&#34;&gt;my replacement HEPA filter holder.&lt;/a&gt; I have no idea what filters the Fnatr expects, but my replacement allows you to use cheap, easy-to-find, 3rd party ones.&lt;/p&gt;
&lt;h3 id=&#34;before-you-start-gather-the-following&#34;&gt;Before you start, gather the following&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;A replacement fan.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll need a 80mm x 80mm 5v DC fan with a 2 pin connection. If you want to reuse the screws that came with it you&amp;rsquo;ll need that fan to be ≤ 10.5mm thick.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://amzn.to/3PepFo8&#34;&gt;This fan on Amazon US&lt;/a&gt; is an appropriate replacement. It comes with 2 fans and some metal grills that you can&amp;rsquo;t use.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A 2.5mm Allen Wrench&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tape&lt;/p&gt;
&lt;p&gt;Painters tape, Scotch tape, Masking tape, whatever.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A Dremel&lt;/p&gt;
&lt;p&gt;Alternately a router with a small bit, but that would require disassembling the enclosure and you probably don&amp;rsquo;t want that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A wood carving bit.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/03/10/dremel_bits@2x.png&#34;
        alt=&#34;a photograph of dremel bits with an arrow pointing to one with a cylindrical cutting end.&#34;&gt;
    &lt;/figure&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Something to provide upward facing lighting&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;re going to be carving into the ceiling.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/03/10/lighting.jpg&#34;
        alt=&#34;a photo of the inside of my enclosure containing two Milwaukee lights, a dremel, and a Leatherman.&#34;&gt;
    &lt;/figure&gt;

&lt;p&gt;If you&amp;rsquo;re wondering that shiny stuff is the aluminum layer on the inside of the &lt;a href=&#34;https://amzn.to/43bwL2s&#34;&gt;Butyl Rubber soundproofing&lt;/a&gt;. It&amp;rsquo;s designed for cars, and works great there. It works well here too. From the outside my enclosure is entirely black because the other side - the rubber side - is very black.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Eye protection&lt;/p&gt;
&lt;p&gt;Carving upside down means little flakes might fall into your eyes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Respirator&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t know what the roof and floor of the enclosure are made of, but it releases some pretty obvious &lt;a href=&#34;https://en.wikipedia.org/wiki/Volatile_organic_compound&#34;&gt;VOCs&lt;/a&gt; when you start carving into it. It&amp;rsquo;s not terrible, but it&amp;rsquo;s not great either.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;the-process&#34;&gt;The process&lt;/h3&gt;
&lt;p&gt;This assumes you&amp;rsquo;re going to do the work in-place. This &lt;em&gt;will&lt;/em&gt; be easier if you remove the enclosure lid, flip it over, and put it on a work surface. However, that means reassembling the thing, which is a pain-in-the-butt unless you feel like also routing a chamfer into the outer edge of the groove before you re-assemble it. That would be a nice improvement, but as this carving will take you less than 5 minutes, and you&amp;rsquo;ll probably never disassemble it again. It&amp;rsquo;s probably not worth it.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Remove whatever&amp;rsquo;s in the enclosure (presumably a printer) to give yourself space to work.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set up lighting.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Unplug the enclosure
The USB-C plug.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Unplug, the existing fan and light.
You&amp;rsquo;ll probably need to use needle-nose pliers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Unscrew the fan.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Move the light wires out of the way.
I recommend taping them out of the way. Removing the light bar would be better, but I think it&amp;rsquo;s glued in.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Place tape over the plugs and sockets so shavings don&amp;rsquo;t get in them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Start carving with the Dremel&lt;/p&gt;
&lt;p&gt;Note, you CAN NOT use the depth shroud thing. As you can see in the next image, it won&amp;rsquo;t allow you to get close enough to the edge. You&amp;rsquo;re going to have to freehand this.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/03/10/dremel_with_depth_control_shroud.jpg&#34;
        alt=&#34;a close-up of my dremel with the depth control shroud. It demonstrates how this pushes the bit too far away from the wall.&#34;&gt;
    &lt;/figure&gt;

&lt;p&gt;This is what mine looks like now that I&amp;rsquo;m done. The only applicable bit i had was a cone with a rounded end. That&amp;rsquo;s why the top of my carving looks all wibbly. Also, you can see just how fine the particles are and why it&amp;rsquo;s important to tape off your connectors. I used canned air to clean everything out.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/03/10/after_dremeling.jpg&#34;
        alt=&#34;a photo of the enlarged hole i created with my dremel.&#34;&gt;
    &lt;/figure&gt;

&lt;p&gt;Note that you &lt;em&gt;can&lt;/em&gt; make the hole bigger. I think the size in that photo is about the &lt;em&gt;least&lt;/em&gt; you can do and actually be able to plug things in. It doesn&amp;rsquo;t matter if the edges of the hole make a seal against the side of the fan. The cutout for the fan is really only used to orient it under the screw holes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vacuum everything.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pull the old fan off of the metal plate.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not attached. It&amp;rsquo;s just sitting on little posts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Replace it with the new fan.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Plug the fan and light back in.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Plug the USB-C back into the outside.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Test that the fan is blowing in the correct direction.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Screw it into the enclosure.&lt;/p&gt;
&lt;p&gt;Be sure that the cord is exiting the fan towards the doors of your enclosure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Optionally install replacement filter holder&lt;/p&gt;
&lt;p&gt;If you printed my replacement filter holder, and have the appropriate filters, now&amp;rsquo;s the time to install it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Stick your printer back in the enclosure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run a test print to make sure nothing got jostled while moving the printer.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Congratulate yourself on a job well done. :D&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>What is 3D Printing Good For?</title>
      <link>https://weblog.masukomi.org/2024/02/19/what-is-3d-printing-good-for/</link>
      <pubDate>Mon, 19 Feb 2024 00:00:00 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/2024/02/19/what-is-3d-printing-good-for/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#terminology&#34;&gt;Terminology&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#plastic-types&#34;&gt;Plastic types&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#misconceptions&#34;&gt;Misconceptions&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#strength&#34;&gt;Strength&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#lasting-power&#34;&gt;Lasting Power&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#degradability&#34;&gt;Degradability&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#filament-reusability&#34;&gt;Filament Reusability&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#food-safety&#34;&gt;Food Safety&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#printing-minis&#34;&gt;Printing Minis&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#what-s-it-good-for&#34;&gt;What&amp;rsquo;s it good for?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#how-i-use-mine&#34;&gt;How I use Mine&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#things-i-have-printed&#34;&gt;Things I have printed&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#warning&#34;&gt;Warning&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;There are a lot of folks out there who are interested in 3D printing, but then they look at one of the many sites of free models like &lt;a href=&#34;https://www.printables.com/&#34;&gt;Printables&lt;/a&gt; and see a lot of silly &lt;a href=&#34;https://www.merriam-webster.com/dictionary/tchotchke&#34;&gt;tchotchkes&lt;/a&gt; that seem like a waste of plastic and space, or cheap things they can already buy cheaply like pen holders. Recently someone asked the following question on Reddit.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What type of people need a printer?&lt;/p&gt;
&lt;p&gt;I’ve been sitting on the idea for 4 years to buy a 3D printer but every time I decide against it. In my mind, If I need a small part for something, I’d rather just buy a quality version of it instead of a brittle plastic one. I considered it for small tools for locksmithing but … why would I? I can just buy the real thing and have it last years. I think it’s useful for intense D&amp;amp;D players or cosplayers but that’s not me. And every time i research useful things to make with a printer it’s always stuff like “pen holder, mini plant holder, phone case, remote mount”. Which I have to admit are pretty lame for a $200-$500 machine and materials. Everything I read can be found at a dollar general. But they have to be popular for a reason right?&lt;/p&gt;
&lt;p&gt;So who consistently uses a 3D printer? What do you personally use it for that isn’t just a holder for a small thing? Can you justify printing something over just buying it?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It&amp;rsquo;s a totally reasonable question, and one that I&amp;rsquo;ve answered variations of a bunch of times. This post assumes you don&amp;rsquo;t know a lot about 3D printing and are wondering if there&amp;rsquo;s any &amp;ldquo;real&amp;rdquo; value to getting one.&lt;/p&gt;
&lt;p&gt;First though, let&amp;rsquo;s address some conceptual housekeeping so that we have a common understanding going forward.&lt;/p&gt;
&lt;h2 id=&#34;terminology&#34;&gt;Terminology&lt;/h2&gt;
&lt;p&gt;When people say &amp;ldquo;3D Printing&amp;rdquo; what they usually mean is &amp;ldquo;FDM&amp;rdquo; (Fused Deposit Modeling) printing. This is where you&amp;rsquo;ve got a spool of filament that is gradually extruded through a hot nozzle and builds up a print layer by layer. There are countless practical uses for this, but it&amp;rsquo;s not good at printing fine details (sub millimeter).&lt;/p&gt;
&lt;p&gt;However, at the consumer level there&amp;rsquo;s also &amp;ldquo;Resin&amp;rdquo; printing, which uses light (laser or LCD) to strategically harden layers of goo. This is a messier process that involves dealing with some nasty chemicals but produces pieces with incredibly fine detail. This is &lt;em&gt;great&lt;/em&gt; for things like D&amp;amp;D Minis.&lt;/p&gt;
&lt;h3 id=&#34;plastic-types&#34;&gt;Plastic types&lt;/h3&gt;
&lt;p&gt;short version: PLA, ABS, and TPU are 3 of the many filament types available, and I&amp;rsquo;ll be referring to them later. If you don&amp;rsquo;t care about details skip this bit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PLA&lt;/strong&gt; is the most common filament. It&amp;rsquo;s made from Polyactic Acid which is technically &amp;ldquo;plant based&amp;rdquo; but even when there aren&amp;rsquo;t additives it&amp;rsquo;s not something that&amp;rsquo;ll break down quickly in the environment or even in a composter.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ABS&lt;/strong&gt; is what&amp;rsquo;s most commonly used in injection molding, but some home 3D printers can print with it too. As a rule of thumb, if you buy anything plastic it&amp;rsquo;s probably made with PLA. It&amp;rsquo;s got a lot of good properties. However, it releases some truly nasty Volatile Organic Compounds when you heat it for printing that you &lt;em&gt;really&lt;/em&gt; shouldn&amp;rsquo;t breathe. The biggest reason to use it is that it&amp;rsquo;s got enough heat resistance to be stuck on the dash of a hot card in summer and not melt. There are better alternatives, and many aren&amp;rsquo;t as nasty.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TPU&lt;/strong&gt; is a &amp;ldquo;rubbery&amp;rdquo; filament that can be used for gaskets or things where flexibility is important. It comes in multiple levels of… floppyness. Technically this is called the &amp;ldquo;Shore Hardness&amp;rdquo;. I don&amp;rsquo;t know why. What&amp;rsquo;s important, is that this is a very useful option for consumers The softer it is, the harder it is to print.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Resins&lt;/strong&gt;
Unfortunately this is not an area I can really speak to with authority. I know there are many available, and that it&amp;rsquo;s easy to mix pigment and sparkles into the clear resin to make something a particular color, but most folks seem to use it to print grey things that they paint afterwards.&lt;/p&gt;
&lt;h2 id=&#34;misconceptions&#34;&gt;Misconceptions&lt;/h2&gt;
&lt;h3 id=&#34;strength&#34;&gt;Strength&lt;/h3&gt;
&lt;p&gt;For most things you&amp;rsquo;re likely to want to print FDM prints are &lt;em&gt;more&lt;/em&gt; than strong enough. Especially when it comes resisting compressive forces. They&amp;rsquo;re less good at resisting being pulled apart. However, we&amp;rsquo;re talking over 900 Newtons of force to rip a standard PLA (the most common filament type) print in half.&lt;/p&gt;
&lt;h3 id=&#34;lasting-power&#34;&gt;Lasting Power&lt;/h3&gt;
&lt;p&gt;3D prints last a LONG time. Despite being &amp;ldquo;plant based&amp;rdquo; the things you print with PLA are going to outlast you. It may fade in sunlight, but that&amp;rsquo;s true of most plastics. PLA is NOT good in water, but other filaments are.&lt;/p&gt;
&lt;h3 id=&#34;degradability&#34;&gt;Degradability&lt;/h3&gt;
&lt;p&gt;Multiple filament makers promote the fact that PLA is &amp;ldquo;Plant Based&amp;rdquo;. It would be equally accurate to say that petroleum based plastics are &lt;em&gt;also&lt;/em&gt; &amp;ldquo;Plant Based&amp;rdquo;. Some filaments say they can be composted. Alas, this is only technically true. It would have to be an industrial composting facility which has significantly higher temperatures than your back yard, and even there it&amp;rsquo;s so problematic that they generally won&amp;rsquo;t accept them.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://colorfabb.com/filaments/materials/pha-filaments&#34;&gt;PHA&lt;/a&gt; filament from ColorFabb is the only one I&amp;rsquo;m aware of that is &lt;em&gt;truly&lt;/em&gt; compostable, even in a home composter. However, at the time of writing (Feb, 2024) it&amp;rsquo;s pretty new, not cheap, and very few people have actually worked with it.&lt;/p&gt;
&lt;h3 id=&#34;filament-reusability&#34;&gt;Filament Reusability&lt;/h3&gt;
&lt;p&gt;It&amp;rsquo;s technically possible to re-melt filament from old prints, but in practice it&amp;rsquo;s surprisingly expensive and non-trivial. I have &lt;a href=&#34;https://weblog.masukomi.org/2024/01/24/recycling-3d-prints/&#34;&gt;a blog post explaining how to recycle 3D prints&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;food-safety&#34;&gt;Food Safety&lt;/h3&gt;
&lt;p&gt;Even if you print with a food safe filament, FDM printed items are &lt;em&gt;not&lt;/em&gt; food safe. The problem is that bacteria can hide between the layer lines and resist cleaning. Using a food safe filament for things like organizing your cutlery drawer is fine though, because the print is never going to come into contact with food.&lt;/p&gt;
&lt;h3 id=&#34;printing-minis&#34;&gt;Printing Minis&lt;/h3&gt;
&lt;p&gt;People who play tabletop games like D&amp;amp;D or Warhammer generally like to have miniatures representing their characters or troops. Your common FDM printer is &lt;em&gt;not&lt;/em&gt; going to be good at this. They just can&amp;rsquo;t reproduce the level of fine detail you need. You need a Resin printer for this. The good news is there are some really affordable, good quality ones that can easily print most minis.&lt;/p&gt;
&lt;h2 id=&#34;what-s-it-good-for&#34;&gt;What&amp;rsquo;s it good for?&lt;/h2&gt;
&lt;p&gt;If your primary desire is to print gaming minis, a cheap resin printer from a reputable maker will pay for itself in a week. There are tons of excellent mini designers out there with very affordable models. You&amp;rsquo;ll never need to model your own. Just be careful about getting one with a big enough print plate for the things you want to print.&lt;/p&gt;
&lt;p&gt;For everything else though…&lt;/p&gt;
&lt;p&gt;It depends on your willingness to learn how to model things yourself. Simple shapes are easy with tools like &lt;a href=&#34;https://www.tinkercad.com/&#34;&gt;Tinkercad&lt;/a&gt;, but the more you get into this the faster you&amp;rsquo;ll get frustrated with how hard it is to do anything but the simplest of shapes. Learning real CAD (Computer Aided Design) software is a fair amount of work, but it&amp;rsquo;s absolutely worth the time investment. There aren&amp;rsquo;t many good options between &amp;ldquo;beginner&amp;rdquo; and &amp;ldquo;professional&amp;rdquo;. The most popular professional tool for amateurs is Fusion 360. It has a free plan, and there are &lt;em&gt;tons&lt;/em&gt; of video tutorials that&amp;rsquo;ll help you learn it fast.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re &lt;em&gt;not&lt;/em&gt; interested in spending time learning a professional level tool, then frankly I don&amp;rsquo;t think you should bother getting a printer. Tinkercad is fun and easy but incredibly limited and hard to do anything complicated with. Sites like &lt;a href=&#34;https://www.printables.com/&#34;&gt;Printables&lt;/a&gt; do have a &lt;em&gt;ton&lt;/em&gt; of things you can download and print, but most of it is not anything you really need often enough to justify buying a printer. The big exception might be the ever-expanding &lt;a href=&#34;https://youtu.be/ra_9zU-mnl8&#34;&gt;Gridfinity&lt;/a&gt; organizational system.&lt;/p&gt;
&lt;p&gt;Where 3D printing really shines though is &lt;em&gt;not&lt;/em&gt; the stuff you can download and print. It&amp;rsquo;s the things you can&amp;rsquo;t buy, and sometimes the things that are unreasonably expensive to buy, or ship.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fixing Things&lt;/strong&gt;
Manufacturers no longer value &amp;ldquo;high quality, well made&amp;rdquo; things that last a lifetime. Things are constructed as cheeply as possible, have no replacement parts available, and are rapidly abandoned by their makers. Things will wear and break in ways that shouldn&amp;rsquo;t require throwing them out and researching potential replacements.&lt;/p&gt;
&lt;p&gt;If you know how to measure and model things you can make just about any plastic replacement part you need: replacements for worn gears, broken switches, lids, etc..  The only real restriction here is heat. If you need something that can survive the heat of a car on a hot summer day with full sun, then you&amp;rsquo;ll need some special filaments which require higher end printers and ventilation systems that aren&amp;rsquo;t easy or cheap to set up.&lt;/p&gt;
&lt;p&gt;3D prints can also be used to make molds for poured metal parts like brass gears, or metal sculptures.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Prototyping&lt;/strong&gt;
Thinking about making a physical object for sale? Need a way to cheeply iterate on something in the real world? Maybe confirm that it fits and does what you expect before spending a lot on making a metal version? 3D printing&amp;rsquo;s great for this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solving Unique Problems&lt;/strong&gt;
This is where 3D printing truly shines. Once you learn how to quickly model your own things the possibilities for solving real world problems are endless. It&amp;rsquo;s hard to convey a sense of just how many things you can do, so instead I&amp;rsquo;ll give you examples of what I&amp;rsquo;ve used mine for in the following section.&lt;/p&gt;
&lt;h2 id=&#34;how-i-use-mine&#34;&gt;How I use Mine&lt;/h2&gt;
&lt;p&gt;Non-exhaustive - and unordered - lists of things I&amp;rsquo;ve printed and hope to soon print.&lt;/p&gt;
&lt;h3 id=&#34;things-i-have-printed&#34;&gt;Things I have printed&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;a custom system for managing notecards to help keep track of all my ideas&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/02/19/noted_card_holders.jpg&#34;
        alt=&#34;3 red plastic card holders with many offset slots each filled with one or more cards. In the front of each is a pen holder with a pen in it. below them you can see my keyboard halves and the clips holding them to the desk.&#34;&gt;
    &lt;/figure&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;bolt covers to keep the bolts on the bottom of my desk from ripping my jeans, and pressing into my legs uncomfortably.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/02/19/under_desk_bolt_bumps.jpg&#34;
        alt=&#34;the underside of a bamboo desk. In the center is a piece of square  metal tubing with a small piece of metal welded to it. It&amp;#39;s been painted black. There are two 3D printed lozenges protruding from it. Each one is covering a bolt.&#34;&gt;
    &lt;/figure&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.printables.com/search/models?q=milwaukee%20packout&amp;amp;ctx=models&#34;&gt;custom dividers and inserts&lt;/a&gt; for Milwaukee packout cases&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;things to organize my tool drawers: bit organizers, socket organizers, lots of &lt;a href=&#34;https://youtu.be/ra_9zU-mnl8&#34;&gt;Gridfinity&lt;/a&gt; things&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://connectified.com/@masukomi/111958871735243970&#34;&gt;a custom keyboard and trackpad holder to address a friend&amp;rsquo;s accessibility issues&lt;/a&gt; (palm rejection doesn&amp;rsquo;t work for him so laptops always think he&amp;rsquo;s mousing when he isn&amp;rsquo;t). Technically this is still in-progress.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/19/keyboard_and_trackpad_accessibility_thing.png&#34;
        alt=&#34;a 3D rendering of a custom holder for an apple keyboard and trackpad that covers most of the trackpad and has wrist wrests&#34;&gt;
    &lt;/figure&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://connectified.com/@masukomi/111930973364553571&#34;&gt;custom mounts for my split keyboard to attach to my desk&lt;/a&gt; so that the right half stops &amp;ldquo;going walkabout&amp;rdquo; while I&amp;rsquo;m trying to use it.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve actually made two different versions of these to attach to two different desks and at different distances. One for myself, and one for a friend.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/02/19/keyboard_clips_diptic.jpg&#34;
        alt=&#34;an image divided horizontally showing two copper colored objects attached to a desk. there are two holes in the top. In the top image there is nothing in the holes. in the bottom image you can see each half of a split keyboard has been set into those holes.&#34;&gt;
    &lt;/figure&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;one for my friends desk with an longer curved &amp;amp; angled front because his keep sliding down the front edge.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/02/19/friends_keyboard_clip_rendering.png&#34;
        alt=&#34;a 3D rendering of a chunkier version of the keyboard holder in the prior image.&#34;&gt;
    &lt;/figure&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;custom dice trays, with leather bottoms that attach to the sides of my wooden lap desk, and then connect together with a rubber (TPU) gasket that holds them closed like a clamshell.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/02/19/custom_dice_tray_right.jpg&#34;
        alt=&#34;a close-up of small purple dice tray with a lip that is slid over a wooden lap desk. The bottom of the dice tray is lined with leather and has 5 colorful dice in it from the Genesys System Role Playing Game&#34;&gt;
    &lt;/figure&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.printables.com/model/672207-simple-valet-tray&#34;&gt;a valet tray&lt;/a&gt; that I use in our freezer because the weird silicone ice cube tray i use to make Tea Cubes has a habit of overflowing and leaving a creeping frozen brown in the freezer&amp;hellip; or it used to.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/02/19/ice_spill_tray.jpg&#34;
        alt=&#34;an orange tray with a lime green silicone ice tray that is subdivided into hexagons. within the hexagons is liquid black tea.&#34;&gt;
    &lt;/figure&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Currently working on an adapter for my Dremel Drill press to allow it to mount the soldering iron I use for heat-inserts&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;custom organizers for board games with lots of pieces and / or cards&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;a custom organizer for games with lots of little tiny markers or dice that suck to put into or remove from those terrible little zip-lock bags they come in.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;a custom pen/pencil holder that attaches to the side of the little side-table shelf thing that sits next to my side of the couch.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/02/19/custom_pen_holder.jpg&#34;
        alt=&#34;an off-white penn holder with slots for pens that are half-filed. It&amp;#39;s slid onto a small wooden shelf.&#34;&gt;
    &lt;/figure&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;a custom single index card clipboard that fits in a pocket and allows me to write a note on one anywhere.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/02/19/single_note_card_clipboard.jpg&#34;
        alt=&#34;a dot-grid index card sits with its left edge slightly under a blue piece of plastic. What you can&amp;#39;t see is that the back of the card is supported by the rest of the clipboard so that you can write on it anywhere. They are on a bamboo desk background.&#34;&gt;
    &lt;/figure&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;custom switch cover to install a switch in a big gaping hole in our ambulance.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/02/19/custom_switch_cover.jpg&#34;
        alt=&#34;a horizontally split image. In the top you can see a hole in a blue vinyl surface with some wires behind it. There is a metal cover with a knob above it. To the left you can see the right side of a black plastic plate with large black toggle switches on it.&#34;&gt;
    &lt;/figure&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;more custom switch covers&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;a light box for photography&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/02/19/light_box.jpg&#34;
        alt=&#34;the intersection of 3 walls of squares in a grid, each poking out at a different height.&#34;&gt;
    &lt;/figure&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A jig for evenly spacing and aligning the LED strips for that light box.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/02/19/led_strip_jig.jpg&#34;
        alt=&#34;a hand holding down an LED strip between two crenelated pieces of plastic that are lying within a square of plastic that itself has crenelated edges.&#34;&gt;
    &lt;/figure&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A &lt;a href=&#34;https://www.youtube.com/watch?v=A9Z6XS3IQbg&amp;amp;t=182s&#34;&gt;Micro Jib&lt;/a&gt; (video link) for photo and video purposes.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/02/19/micro_jib.jpg&#34;
        alt=&#34;a photograph of a black and orange 3d printed photography jib.&#34;&gt;
    &lt;/figure&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A jig for precision cutting of steel rods for the Micro Jib&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/02/19/rod_cutting_jig.png&#34;
        alt=&#34;two gloved hands press against a grey brick with a rounded top and a thin purple sheet coming out of it. there&amp;#39;s a steel rod coming out the side that is being pressed against a spinning Dremel blade from which sparks are shooting.&#34;&gt;
    &lt;/figure&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A custom hole cover to protect wires from sharp metal edges&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/02/19/wire_protection_cover.jpg&#34;
        alt=&#34;3 photos showing a textured cylinder with a flange &amp;amp; a slit along one side. in the top image it&amp;#39;s in a pice of wood with wires coming out. in the bottom images it&amp;#39;s separate halves can be seen on the printer and then assembled in my hand.&#34;&gt;
    &lt;/figure&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A Paper Towel holder mount&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/02/19/paper_towell_holder_mount.jpg&#34;
        alt=&#34;5 photos. the top two show a plastic base with threaded inserts &amp;amp; then a paper towell holder screwed into it. the bottom left shows a plastic cover screwed over the paper towell mount&amp;#39;s base to make it less unsightly. the next shows the paper towell holder mounted to a window frame, and then the same image but with paper towell on the holder.&#34;&gt;
    &lt;/figure&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A special flexible plastic to adjust the seal on a CPAP&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/02/19/cpap_mod.jpg&#34;
        alt=&#34;2 photos. on the left is a side view of a CPAP mask with a purple piece of plastic attached to a the bridge, and pressing in against the soft gasket that forms a seal around the users face. the second photo is a head-on shot of the same thing.&#34;&gt;
    &lt;/figure&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;coasters&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/02/19/coasters.jpg&#34;
        alt=&#34;three photos showing square coasters with holes in them in a pattern similar to the MacPro. Top left is a top view. Top right is a side view of three of them in a holder. Beneath each you can see a brown line. In the bottom picture you can see the underside which is a thick piece of brown felt to keep them from scratching the table.&#34;&gt;
    &lt;/figure&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;new discs for my disc binder&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;bookmarks that attach to disk binder disks&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;custom tool holders&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/02/19/tool_holders.jpg&#34;
        alt=&#34;a pair of calipers and a deburring tool sitting in custom holders on a honeycomb shaped black wall.&#34;&gt;
    &lt;/figure&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.printables.com/model/748421-fnatr-box-02-replacement-filter-holder&#34;&gt;adapter to allow me to use cheaper, easier to find HEPA filters&lt;/a&gt; with my printer enclosure&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/02/19/hepa_filter_comparison_vs_original.jpg&#34;
        alt=&#34;a black plastic square with a hepa filter in it, and an orange plastic square with 2 hepa filters in it.&#34;&gt;
    &lt;/figure&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;tons of mods for my 3d printing stuff. Everyone does this though.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tool holder wall (I went with the Honeycomb wall, might go with Multiboard if i revisit this.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;jigs for holding dice I laser etch.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/02/19/dice_jig.jpg&#34;
        alt=&#34;an orange l-shaped piece of plastic with many blank white dice in it.&#34;&gt;
    &lt;/figure&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;jigs for holding other things.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;magnet insertion tools&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;a fake rock with cutouts for holding a small bottle of medicine and a syringe.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/02/19/medicine_and_syringe_holder.jpg&#34;
        alt=&#34;an orange l-shaped piece of plastic with many blank white dice in it.&#34;&gt;
    &lt;/figure&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A custom tool to facilitate cutting lids off of 5 gallon water bottles.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/02/19/water_bottle_opener.jpg&#34;
        alt=&#34;an orange oval with a raised crescent on the left. there are three screws in it that are holding down a piece of plastic that is in turn holding down a rasor blade. to the right is the snap-in blade cover with an easy-pull-tab.&#34;&gt;
    &lt;/figure&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;D&amp;amp;D Minis. These were on my last FDM printer and they were not very good.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Headphone hangers&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fixed a lamp. It fell over and the ring that held on the diffuser no longer fit. So I printed a replacement out of flexible filament.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/02/19/lamp_diffuser.jpg&#34;
        alt=&#34;an image divided horizontally into 3 sections. it shows a lamp  with a purple ring between its top and bottom halves. the top image is looking at it from above with the light off. The middle image is looking at it from belowe with the light on. the purple ring is glowing. the bottom image is looking at it from above with the light on. you can see the LEDs behind the diffuser and the glowing purple edge of the replacement ring.&#34;&gt;
    &lt;/figure&gt;

&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;warning&#34;&gt;Warning&lt;/h2&gt;
&lt;p&gt;If this post has convinced you to get a 3D printer, I must give you a warning before you do. Cheap FDM printers are, in my opinion, a pain-in-the-ass. I almost never used my first printer because it was a constant series of frustrations and poor quality prints. There are thousands and thousands of posts on reddit of people asking why their print has one of a hundred different possible problems. Getting a $200 (USD) printer dialed in to make great prints is possible, but it&amp;rsquo;s a lot of frustrating work that feels like your trying to read tea leaves.&lt;/p&gt;
&lt;p&gt;My current recommendation (February 2024) is to get any of the printers made by &lt;a href=&#34;https://bambulab.com/en-us&#34;&gt;Bambu Lab&lt;/a&gt;. The more you spend the more you&amp;rsquo;ll be able to do with it. The reason I recommend Bambu is because their printers are the closest anyone has ever come to making a printer that&amp;rsquo;s as easy to use as a Laser Printer. It&amp;rsquo;s not &lt;em&gt;quite&lt;/em&gt; as easy yet, but it&amp;rsquo;s damn close. Getting a printer with an enclosure like their X1 Carbon (X1C) will make your life easier, because the ambient temperature has a significant impact on the quality of your prints. Unfortunately, the X1C + the multi-filament management system (don&amp;rsquo;t buy it without that) is like $1500, and then you&amp;rsquo;ll need to buy filament.&lt;/p&gt;
&lt;p&gt;I use my X1C probably 3 times a week on average. I never print tchotchkes.&lt;/p&gt;
&lt;p&gt;Feel free to &lt;a href=&#34;https://connectified.com/@masukomi&#34;&gt;ask me questions on Mastodon&lt;/a&gt;. I&amp;rsquo;m happy to help people out.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Wyrmwood Modular Table - Thoughts</title>
      <link>https://weblog.masukomi.org/2024/02/02/wyrmwood-modular-table-thoughts/</link>
      <pubDate>Fri, 02 Feb 2024 00:00:00 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/2024/02/02/wyrmwood-modular-table-thoughts/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#table-and-accessories&#34;&gt;Table and Accessories&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#the-table-itself&#34;&gt;The table itself&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#minor-defects&#34;&gt;Minor defects:&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-accessories&#34;&gt;The accessories&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#the-hobby-shelf&#34;&gt;The Hobby Shelf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-player-desk&#34;&gt;The Player Desk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#cup-holders&#34;&gt;Cup Holders&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#card-organizer&#34;&gt;Card organizer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-topper-block-and-tray&#34;&gt;The Topper Block &amp;amp; Tray&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#assembly-gotchas&#34;&gt;Assembly Gotchas&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#instructions&#34;&gt;Instructions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#tools&#34;&gt;Tools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#plywood&#34;&gt;Plywood&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#finish-the-screw-holes&#34;&gt;Finish the screw holes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#be-cautious-with-dowel-holes&#34;&gt;Be cautious with dowel holes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#attaching-the-legs&#34;&gt;Attaching the Legs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#should-you-get-one&#34;&gt;Should you get one&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#where-then&#34;&gt;Where then?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;This post is broken down into two sections: thoughts on the table &amp;amp; accessories, assembly gotchas. This post will not go into many of the significant issues with the company&amp;rsquo;s leadership, and management.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/02/01/table_with_drinks.jpg&#34;
    alt=&#34;table with most of its toppers removed. A game of Spire&amp;#39;s End Hildegard has been laid out. Near the camera you can see a nalgene water bottle and an espresso. Many of the accessories are visible&#34;&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;table-and-accessories&#34;&gt;Table and Accessories&lt;/h2&gt;
&lt;h3 id=&#34;the-table-itself&#34;&gt;The table itself&lt;/h3&gt;
&lt;p&gt;Overall the table lives up to the marketing. The thing you need to keep in mind about it, is that while these are high-end tables they&amp;rsquo;re also not artisan tables. These are mass produced with good quality materials. There are plenty of blog and video reviews of Wyrmwood&amp;rsquo;s first generation modular table, and I believe their commentary apply well to the 2nd generation. This isn&amp;rsquo;t a notably different table.&lt;/p&gt;
&lt;p&gt;I am dubious about their implications that children can paint on it and use markers on it and everything will clean off without a care, but I&amp;rsquo;m not about to put that to the test.&lt;/p&gt;
&lt;p&gt;The magnetic rail system is very nice. It works really well. Things feel very solidly held, and the system is &lt;em&gt;so&lt;/em&gt; simple that anyone with a some magnets and some wood, or a 3D printer can make their own accessories.&lt;/p&gt;
&lt;p&gt;We were concerned that reaching past the edge into the table would feel awkward. In practice it&amp;rsquo;s been absolutely fine.&lt;/p&gt;
&lt;p&gt;There are, however, three frustrating aspects of the table for me.&lt;/p&gt;
&lt;p&gt;First, there are two holes at the end of each piece of the apron that are a key part of the assembly, BUT they&amp;rsquo;re drilled too far from the edge for the hardware provided. I&amp;rsquo;ll cover this in more detail in &amp;ldquo;Assembly Gotchas&amp;rdquo; but the short version is that the legs are well made, but each bolt is only using about 1/3rd of its threads. It works, but if I had access to a lathe I&amp;rsquo;d mill some new hardware for them.&lt;/p&gt;
&lt;p&gt;Second, at the center of each apron piece you can see an area that either didn&amp;rsquo;t get varnished, or didn&amp;rsquo;t get the last coat of varnish. It seems as if maybe some sort of holding piece was here when they were varnished.&lt;/p&gt;
&lt;p&gt;In their defense, this makes sense from an industrial mass-production perspective. It&amp;rsquo;d require twice the drying time if you varnished all but the side being held, let it dry, turned it over, and varnished the side that didn&amp;rsquo;t get it the first time. Also, it&amp;rsquo;s in a location that you&amp;rsquo;ll never see once the table is assembled. However, this is marketed as a premium table and that feels lazy.&lt;/p&gt;
&lt;p&gt;Third, the plywood inner-table. Underneath the felt surface are multiple pieces of plywood. Intellectually it&amp;rsquo;s unreasonable to expect them to use anything else, and they did show that it was plywood in their behind the scenes video of making things. Emotionally it feels really cheap.&lt;/p&gt;
&lt;p&gt;Dowels connect each piece, but the dowel holes are way too big, and the plywood is so thin that there&amp;rsquo;s very little wood between edge of the hole and the surface. You&amp;rsquo;re essentially guaranteed to break it if you follow their instructions for sliding the pieces together on anything except maybe the small table. Wood screws are used to attach the plywood to the table meaning each time you assemble it (when moving) you&amp;rsquo;re damaging the holes a little more. It&amp;rsquo;s not an unreasonable choice because you&amp;rsquo;re not going to disassemble it and reassemble it many times, but it&amp;rsquo;s also the cheap and lazy choice.&lt;/p&gt;
&lt;p&gt;The &amp;ldquo;Toppers&amp;rdquo; (the removable table top) are sold separately. This feels ridiculous. I would be surprised if even 0.5% of their table customers buy a table without them.&lt;/p&gt;
&lt;h4 id=&#34;minor-defects&#34;&gt;Minor defects:&lt;/h4&gt;
&lt;p&gt;One of toppers has a manufacturing defect on the bottom. Ours is &amp;ldquo;rustic&amp;rdquo; which means many small pieces of wood of varying colors are used to make up the whole. One of the pieces of wood had defects that went too deep for their sanding. The piece should have been thrown out and QA should have caught it. There&amp;rsquo;s also a gap in the end of one of our pieces. It doesn&amp;rsquo;t extend the full length and is probably just a sanding issue, but it is visible. In their defense I&amp;rsquo;m being very nitpicky. Minor defects like these should be expected in a mass-produced item. At the same time, this is &lt;em&gt;not&lt;/em&gt; a cheap purchase.&lt;/p&gt;
&lt;h3 id=&#34;the-accessories&#34;&gt;The accessories&lt;/h3&gt;
&lt;p&gt;With the exception of &lt;a href=&#34;https://wyrmwoodgaming.com/products/player-desk/&#34;&gt;The Player Desk&lt;/a&gt;, and the &lt;a href=&#34;https://wyrmwoodgaming.com/products/hobby-shelf/&#34;&gt;Hobby Shelf&lt;/a&gt; every accessory seems to have a curve on the attachment-side that matches the curve you can see. This &lt;em&gt;looks&lt;/em&gt; nice, but only when it&amp;rsquo;s &lt;em&gt;not&lt;/em&gt; in use. When in use it means that any pressure you put on these is &lt;em&gt;not&lt;/em&gt; going to be evenly distributed along the far edge but focused on the two rear corners. Does this matter practically? I&amp;rsquo;m not going to press hard enough to find out when and how ours break, but it&amp;rsquo;s an artificial weakness that wasn&amp;rsquo;t necessary and doesn&amp;rsquo;t help anything.&lt;/p&gt;
&lt;h4 id=&#34;the-hobby-shelf&#34;&gt;The Hobby Shelf&lt;/h4&gt;
&lt;p&gt;I don&amp;rsquo;t like that the &lt;a href=&#34;https://wyrmwoodgaming.com/products/hobby-shelf-end-caps/&#34;&gt;End Caps&lt;/a&gt; of &lt;a href=&#34;https://wyrmwoodgaming.com/products/hobby-shelf/&#34;&gt;The Hobby Shelf&lt;/a&gt; sold separately, or that they are detachable. I understand that the idea is that you can connect multiple of them and make a wide flat place for things. I don&amp;rsquo;t think many folks will actually do this. And if you get enough for that you&amp;rsquo;ll probably need somewhere to store them.&lt;/p&gt;
&lt;p&gt;Without the End Caps, The Hobby Shelf looks unfinished relative to the rest of the table.&lt;/p&gt;
&lt;h4 id=&#34;the-player-desk&#34;&gt;The Player Desk&lt;/h4&gt;
&lt;p&gt;It feels surprisingly sturdy. It works well, and it meets the expectations set by the marketing. However, it&amp;rsquo;s not very comfortable to actually use for any notable typing or writing because it ends up sitting a little too high. There&amp;rsquo;s not really anything they can do about this. It&amp;rsquo;s just the nature of having a vertically thick table whose underside is high enough to go over your legs when you sit.&lt;/p&gt;
&lt;p&gt;The end result is that this is great for reference. Put a laptop on it. Put a book on it. Don&amp;rsquo;t try and write your homework on it. At least not at the table.&lt;/p&gt;
&lt;h4 id=&#34;cup-holders&#34;&gt;Cup Holders&lt;/h4&gt;
&lt;p&gt;We got the &lt;a href=&#34;https://wyrmwoodgaming.com/products/large-cup-holder/&#34;&gt;Large Cup Holder&lt;/a&gt; and &lt;a href=&#34;https://wyrmwoodgaming.com/products/small-cup-holder/&#34;&gt;Small Cup Holder&lt;/a&gt;. The small cup holder holds beer bottles, and basically nothing else. They say &amp;ldquo;stemware&amp;rdquo; but I&amp;rsquo;m dubious. Even if your stemware happens to fit, I&amp;rsquo;d be afraid of breaking off the stem if I lifted it too fast. The Large Cup Holder works as advertised. Don&amp;rsquo;t get the small one unless you consume a lot beer in bottles, or things that come in bottles of that size &amp;amp; shape.&lt;/p&gt;
&lt;h4 id=&#34;card-organizer&#34;&gt;Card organizer&lt;/h4&gt;
&lt;p&gt;I think the &lt;a href=&#34;https://wyrmwoodgaming.com/products/card-organizer/&#34;&gt;Card Organizer&lt;/a&gt; is designed for standard playing cards where you can overlay them and only need to see the corner of each. It&amp;rsquo;s not wide enough to hold even 3 poker cards with the full face visible. The rows are so close together that it&amp;rsquo;s impossible to see anything but the top edge of anything that isn&amp;rsquo;t in the front row. With traditional cards this means you&amp;rsquo;ll be able to tell it&amp;rsquo;s a black 3 but not if is it a club or a spade. I feel like the people who designed and approved this couldn&amp;rsquo;t possibly have been into traditional card games, because it&amp;rsquo;s useless for any game with large hands where you need to actually know suit and number.&lt;/p&gt;
&lt;p&gt;The games I play with cards require me to be able to see the whole card, which means it&amp;rsquo;s useless for me too.&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t buy this. I&amp;rsquo;ve added the task of designing a replacement that actually works to my personal ToDo list.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/02/01/card_organizer.jpg&#34;
    alt=&#34;a photo of the card organizer with four cards from the atma game. Two are in the front row and one in the row behind it, and one in the row behind that. You can&amp;#39;t see much of the rear cards&#34;&gt;
&lt;/figure&gt;

&lt;h4 id=&#34;the-topper-block-and-tray&#34;&gt;The Topper Block &amp;amp; Tray&lt;/h4&gt;
&lt;p&gt;First some terminology. A &amp;ldquo;topper&amp;rdquo; is one of the slats of wood that fit together and go over the gaming table to convert it into a normal table. It&amp;rsquo;s kind of like a table &amp;ldquo;leaf&amp;rdquo; except that it&amp;rsquo;s just a pretty board that sits on top. The Topper Block, is just a block with slots to hold those where they won&amp;rsquo;t get scratched while you&amp;rsquo;ve got the gaming table open.&lt;/p&gt;
&lt;p&gt;This works as advertised but I&amp;rsquo;m really annoyed by this whole thing. First, it&amp;rsquo;s bullshit that &lt;a href=&#34;https://wyrmwoodgaming.com/products/topper-block-tray/&#34;&gt;The Topper Block Tray&lt;/a&gt; doesn&amp;rsquo;t come with the &lt;a href=&#34;https://wyrmwoodgaming.com/products/topper-block/&#34;&gt;Topper Block&lt;/a&gt;. Most of the time you&amp;rsquo;re going to have the &amp;ldquo;toppers&amp;rdquo; on the table and the block will be empty. Otherwise the table surface is just a piece of felt waiting to soak up spills and collect dust and particles.&lt;/p&gt;
&lt;p&gt;Our Tray also doesn&amp;rsquo;t match our block. This is because they don&amp;rsquo;t offer &amp;ldquo;Rustic&amp;rdquo; versions of the trays. It&amp;rsquo;d been so long between ordering and delivery that I thought they&amp;rsquo;d sent us the wrong one. The mismatch looks bad, and like they cheaped out.&lt;/p&gt;
&lt;p&gt;They also &lt;em&gt;really&lt;/em&gt; cheaped out on the construction. The outer box is fine, but they just reused the same packing foam that they shipped things in to hold your toppers in place. I expected that the little &amp;ldquo;fingers&amp;rdquo; that hold things up were going to be felt covered plywood or some other form of rigid structure with a covering to not hurt your toppers.  Instead it&amp;rsquo;s just a stiff plasticy packing foam. The foam is being compressed when you have pieces in it. In order to make this work they needed to make it a very snug fit. So, when you insert or remove a topper you have to use force to push or pull. This isn&amp;rsquo;t terrible, until you get to the last piece at an end. Then you have to put a foot on the block and hold it down otherwise it won&amp;rsquo;t let go of your topper.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2024/02/01/topper_block_with_end_piece.jpg&#34;
    alt=&#34;a photograph of the topper block with a single end piece in the rear slot&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;It gets worse. The topper pieces that go at the ends of your table are slightly different. They have little rubber feet on them to keep them in place. They fit just inside the corners of the inner table area. I&amp;rsquo;m 100% fine with that. The problem is that they didn&amp;rsquo;t cut a slot into the foam that would accommodate inserting it with the foot side pointing outward. Because of the way the toppers fit together on the table you&amp;rsquo;ll be grabbing an end first, and you&amp;rsquo;ll want to put it in one of the end slots of the Topper Block.&lt;/p&gt;
&lt;p&gt;The problem is that when you lift a Topper from the side of the table, the bottom is facing away from you. The simplest motion is to pick it up, and hold it vertically in front of you as you walk to your Topper Block. BUT you need to flip the first end piece around before inserting it because otherwise it won&amp;rsquo;t fit. All the other pieces will be &lt;em&gt;not&lt;/em&gt; flipped because that&amp;rsquo;s easier.&lt;/p&gt;
&lt;p&gt;Is this a minor nitpick? Yes. It&amp;rsquo;s also a minor annoyance every single time I open the table and there&amp;rsquo;s absolutely no good reason for it.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s also not a square. It &lt;em&gt;looks&lt;/em&gt; like a square, so I keep grabbing the Topper Tray and just trying to put it on, but half of the time that doesn&amp;rsquo;t work, because it&amp;rsquo;s a rectangle and needs to be rotated 90°. Again, a minor annoyance, but an annoyance. There&amp;rsquo;s nothing indicating &amp;ldquo;this side forward&amp;rdquo; although 2 of the edges of the topper have a little cut out of them it&amp;rsquo;s not obvious if that should be on the side or the front.&lt;/p&gt;
&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Topper Tray&lt;/p&gt;
&lt;p&gt;They market it as being useful as a dice tray. This is true. It works well as a dice tray. However, you&amp;rsquo;re not going to use it as one because it&amp;rsquo;s too damn big. It takes up too much space to be used by a single player or pair of players. It&amp;rsquo;d be too far away from some players if you put it in the center of a long table. It&amp;rsquo;d take up too much space if you put it in the center of a small table.&lt;/p&gt;
&lt;p&gt;I appreciate that they at least made it capable of doing something other than just covering the Topper Box, but in reality you&amp;rsquo;re not going to use it.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Tray Drama&lt;/p&gt;
&lt;p&gt;The Corner Dice Tray, and Topper Block Tray were sold to Kickstarter backers - and presumably some pre-orders after the Kickstarter - as having leather lining (for rolling your dice on). Both shipped with felt. The Topper Block was also show with with a chamfered edge.&lt;/p&gt;
&lt;p&gt;It was eventually revealed that the company created a handful of Topper Block prototypes before the Kickstarter. That&amp;rsquo;s what they used for the promotional photos and videos. It seems they never considered what it would take to build those designs at scale. Then, after changing it, they didn&amp;rsquo;t bother to tell anyone. Customers started getting things that were different than what they ordered and many were very upset. Doug - the co-founder who seems to run things - responded that, &amp;ldquo;Those people need to relax.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Overall, Wyrmwoods handling of it was 💩.&lt;/p&gt;
&lt;p&gt;In the end they offered a $25 gift certificate to affected parties. They did this is one of the Kickstarter updates saying, &amp;ldquo;to those that have their trays shipped to them before updated photography is available&amp;rdquo;. This was on November 20th. The Kickstarter campaign ended on January 15th. I&amp;rsquo;m not sure when they ended up updating the photography on the site, but if it ended up being before someone got theirs then tough shit. Doesn&amp;rsquo;t matter that we sold you one thing and you got another.&lt;/p&gt;
&lt;p&gt;There was no separate email to customers about this. It also completely ignores the fact that a &lt;em&gt;lot&lt;/em&gt; of people aren&amp;rsquo;t going to read every kickstarter update, or every detail of the long ones. In the case of this campaign, the updates are essentially all the same and can be summarized as &amp;ldquo;we&amp;rsquo;re behind in shipping&amp;rdquo; and &amp;ldquo;logistics are hard&amp;rdquo;. I suspect lots of folks didn&amp;rsquo;t notice until it was too late.&lt;/p&gt;
&lt;p&gt;Did they technically say &amp;ldquo;sorry&amp;rdquo;? Yes. Did the whole thing feel like them not actually giving a shit and expending the least possible effort whilst saying the politically appropriate things? Also yes.&lt;/p&gt;
&lt;p&gt;I feel like their CEO (Jason) actually does care about customers. I also feel that it doesn&amp;rsquo;t matter because Doug seems to set the tone and handling for everything.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;assembly-gotchas&#34;&gt;Assembly Gotchas&lt;/h2&gt;
&lt;h3 id=&#34;instructions&#34;&gt;Instructions&lt;/h3&gt;
&lt;p&gt;The paper instructions are fine. The PDF instructions are terrible. The PDF is laid out for the same long folded paper that they used for the included printed one. This doesn&amp;rsquo;t correspond to &lt;em&gt;anyone&amp;rsquo;s&lt;/em&gt; home printer, or anyone&amp;rsquo;s screen. It&amp;rsquo;s just bad.&lt;/p&gt;
&lt;h3 id=&#34;tools&#34;&gt;Tools&lt;/h3&gt;
&lt;p&gt;In addition to the tools provided and recommended you will need a flashlight to see down into the dark holes, and you &lt;em&gt;should&lt;/em&gt; have a &amp;ldquo;&lt;a href=&#34;https://en.wikipedia.org/wiki/Speed_square&#34;&gt;speed square&lt;/a&gt;&amp;rdquo; to make sure you actually have apron sides and legs all square to each other. A drill bit that is the same size as the holes in the plywood. Some coarse grit sandpaper.&lt;/p&gt;
&lt;p&gt;When using the speed square you should be careful to not lay it on grub screws that are poking out, and only hold it against wood. The grub screws keep being where I wanted to place it.&lt;/p&gt;
&lt;h3 id=&#34;plywood&#34;&gt;Plywood&lt;/h3&gt;
&lt;h4 id=&#34;finish-the-screw-holes&#34;&gt;Finish the screw holes&lt;/h4&gt;
&lt;p&gt;There are holes through the plywood that the wood screws will go through when attaching to the apron. Many of ours were not drilled the full way through, or had chips that weren&amp;rsquo;t removed at the end that prevented us from seeing if the holes were aligned with the pre-drilled holes in the apron.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d recommend taking a quick pass over each hole with the coarse grit sandpaper. Hopefully that&amp;rsquo;ll remove most of the problems. Then go back and drill out any hole that needs it and sand any chips that are left.&lt;/p&gt;
&lt;p&gt;Use your flashlight to align the holes before drilling. Do &lt;em&gt;not&lt;/em&gt; assume that because you lined up one piece of plywood that the piece next to it will be aligned.&lt;/p&gt;
&lt;p&gt;Align every piece with its holes individually. Then screw in the four corners of each piece. Then go back and screw in the rest.&lt;/p&gt;
&lt;h4 id=&#34;be-cautious-with-dowel-holes&#34;&gt;Be cautious with dowel holes&lt;/h4&gt;
&lt;p&gt;The instruction video shows lifting one piece of plywood with dowels in the end to slide the next piece onto them. &lt;em&gt;Do Not do this! The distance between the dowel hole and the plywood surface is too short and the dowel is /very&lt;/em&gt; likely to rip through it. I don&amp;rsquo;t have a better solution beyond just being very slow, and very careful and using the help of others.&lt;/p&gt;
&lt;h3 id=&#34;attaching-the-legs&#34;&gt;Attaching the Legs&lt;/h3&gt;
&lt;p&gt;The leg attachment is a real problem. It&amp;rsquo;s also how the entire table is held together.&lt;/p&gt;
&lt;p&gt;At a high level, you screw a series of &amp;ldquo;posts&amp;rdquo; into the leg, and slide them into a hole in the apron. The apron has 2 holes you drop cams and grub screws into. These clamp the posts into place. The &lt;em&gt;idea&lt;/em&gt; is fine. I have no reason to believe it isn&amp;rsquo;t a good solution. The problem is that they fucked up the measurements of the posts and put the holes too far away from the leg.&lt;/p&gt;
&lt;p&gt;There are two different and incompatible instructions about how to deal with the posts.&lt;/p&gt;
&lt;p&gt;The first instruction is to screw them in until they stop, and then back them out just far enough that the divot in them points towards the far end of the leg. This is exactly how it &lt;em&gt;should&lt;/em&gt; be, &lt;em&gt;but&lt;/em&gt; if you follow that instruction the post will barely even reach the hole for the grub screw, and thus you won&amp;rsquo;t be able to hold it in place.&lt;/p&gt;
&lt;p&gt;The second instruction is to use a plexiglass template they provide and unscrew the post until it is at the edge of the template. &lt;em&gt;Do not do this either!&lt;/em&gt; The template was clearly constructed with the wrong measurements. If you do this there will be zero to one-half of a thread holding the post in. It will not only fall out, it won&amp;rsquo;t be able to hold the leg on.&lt;/p&gt;
&lt;p&gt;Instead you need to compromise and find a point where the edge of the post is &lt;em&gt;just&lt;/em&gt; barely past the center of the hole for the grub screw, so that the grub screw has something to catch on to and so that the post actually has enough threads in the leg to hold it on.&lt;/p&gt;
&lt;p&gt;This is bad. If you know where to buy longer posts do it &lt;em&gt;before&lt;/em&gt; assembly. If that&amp;rsquo;s not an option and you are one of the rare people with a lathe, make new posts that are longer.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve found the connectors they&amp;rsquo;re using on &lt;a href=&#34;https://hm-beschlaege.de/products/furniture-connectors/pv-connector/pv-corner-connector/&#34;&gt;a German site&lt;/a&gt;. [Click the German flag at the top to see the English version]. These &lt;em&gt;may&lt;/em&gt; be available elsewhere. Try and find posts that are about 1cm longer than the ones Wyrmwood shipped. For some context in finding these, this is not something an individual woodworker would likely use. This kind of connector is used by companies producing things as quickly as possible in significant numbers.&lt;/p&gt;
&lt;h2 id=&#34;should-you-get-one&#34;&gt;Should you get one&lt;/h2&gt;
&lt;p&gt;You should get &lt;em&gt;a&lt;/em&gt; gaming table if you can afford one, or make one if you&amp;rsquo;ve got access to the tools. Having it has been wonderful and we&amp;rsquo;re actually playing the many board games in our shelves.&lt;/p&gt;
&lt;p&gt;Should you get one of Wyrmwood&amp;rsquo;s gaming tables? Honestly. No. You shouldn&amp;rsquo;t. Their magnetic railing attachment thing and accessories are unique, work well, and &lt;em&gt;very&lt;/em&gt; tempting. The barely attached legs are &lt;em&gt;extremely&lt;/em&gt; concerning.&lt;/p&gt;
&lt;p&gt;For a variety of reasons, in addition to the company dismissing numerous allegations of sexual harassment and keeping the person in question on staff, everything they communicate and do feels incredibly dismissive, half-assed, and incompetent.&lt;/p&gt;
&lt;p&gt;Despite having Kickstarted essentially the same table before and having massive logistical issues then because of unexpected demand and being a small company, they completely fucked up the logistics the second time around too in incredibly predictable ways. Yes, they have a very difficult logistical problem, but &lt;em&gt;none&lt;/em&gt; of it should have been a surprise and &lt;em&gt;all&lt;/em&gt; of it should have been planned for.&lt;/p&gt;
&lt;p&gt;We were supposed to be in the December wave of shipments. We got ours in January. This was well within our expectations, however there are still people from the first wave of shipments in June who haven&amp;rsquo;t received their stuff. I&amp;rsquo;m writing this on Feb 1st, and it looks like maybe 75% of the December wave people still haven&amp;rsquo;t received their shipment.&lt;/p&gt;
&lt;p&gt;On January 31st I received an email from them saying &amp;ldquo;Your Wave 6 order was scheduled to ship by the end of December. Unfortunately, fulfillment is running late, and we apologize for any disappointment.&amp;rdquo; They then offer a $25 gift certificate as a form of compensation.&lt;/p&gt;
&lt;p&gt;The thing is a) they don&amp;rsquo;t seem to know we already have ours. b) this came at the end of the month &lt;em&gt;after&lt;/em&gt; the month it was supposed to have shipped. It &lt;em&gt;should&lt;/em&gt; have been sent around the 1st of January not the 31st.&lt;/p&gt;
&lt;h3 id=&#34;where-then&#34;&gt;Where then?&lt;/h3&gt;
&lt;p&gt;I don&amp;rsquo;t know. &lt;a href=&#34;https://carolinagametables.com/&#34;&gt;Carolina Game Tables&lt;/a&gt; seems like the most visible alternative, but while their thick edges may be comfortable for resting forearms on it&amp;rsquo;s going to require you to reach a lot farther to interact with anything in the table. The thinner edge of the Wyrmwood table is not uncomfortable and allows you to have your cards and dice much closer to you.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>ATMA TTRPG Review</title>
      <link>https://weblog.masukomi.org/2024/01/28/atma-ttrpg-review/</link>
      <pubDate>Sun, 28 Jan 2024 00:00:00 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/2024/01/28/atma-ttrpg-review/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#some-perspective&#34;&gt;Some Perspective&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#first-something-good&#34;&gt;First, Something Good&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#is-this-a-fighting-game-or-not&#34;&gt;Is this a fighting game or not?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#everything-s-contradictory&#34;&gt;Everything&amp;rsquo;s contradictory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#missing-tools&#34;&gt;Missing tools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#nonsensical-cards&#34;&gt;Nonsensical cards&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#invalidating-player-abilities&#34;&gt;Invalidating Player Abilities&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-token-economy-is-broken&#34;&gt;The token economy is broken&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#missing-what-makes-pbta-great-dot&#34;&gt;Missing what makes PbtA great.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#conclusion&#34;&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;ATMA is a rules-light no prep Tabletop Role Playing Game (TTRPG) that requires significant improvisational work by all players in order to figure out how anything fits together. The mechanics kind-of work but leave you making up a lot of rules on the fly because they don&amp;rsquo;t cover a lot of common things.&lt;/p&gt;
&lt;p&gt;Like most TTRPGs it&amp;rsquo;s based around the idea that you&amp;rsquo;ll go places, bad things will happen, and there&amp;rsquo;s a good chance you&amp;rsquo;ll have to fight bad guys to resolve the problem. If you want a good quick overview of the setting and how this game works, I recommend you check out &lt;a href=&#34;https://youtu.be/Yj0ifaxazyg&#34;&gt;this short 5 minute video&lt;/a&gt;, because this post is more about the details than the high-level stuff.&lt;/p&gt;
&lt;p&gt;Disclaimer: after writing this whole thing I just feel drained and don&amp;rsquo;t have the energy to spend another hour editing it. My apologies for any repetition, rambling, or run-on sentences.&lt;/p&gt;
&lt;h2 id=&#34;some-perspective&#34;&gt;Some Perspective&lt;/h2&gt;
&lt;p&gt;Before I get into this, I feel I need to share the perspective I&amp;rsquo;m coming from. I refer to myself as a &amp;ldquo;frustration driven developer&amp;rdquo;. This true for both software, and game development. What&amp;rsquo;s notable is that the things that really frustrate me are the things that &lt;em&gt;could&lt;/em&gt; have been really good, but were left in a state that just&amp;hellip; isn&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;It should also be noted that I&amp;rsquo;m a total nerd when it comes to game mechanics. I love learning new ones, and really understanding the tools available for RPG design.&lt;/p&gt;
&lt;p&gt;ATMA has &lt;em&gt;great&lt;/em&gt; bones, but it is missing a lot of important tools, and has many internal contradictions. This frustrates me greatly, but again only because it &lt;em&gt;could&lt;/em&gt; be great.&lt;/p&gt;
&lt;h2 id=&#34;first-something-good&#34;&gt;First, Something Good&lt;/h2&gt;
&lt;p&gt;The game absolutely lives up to its claims of being a &amp;ldquo;no-prep&amp;rdquo; RPG. The setting is fun. It&amp;rsquo;s nice to just have the game tell you &amp;ldquo;stuff is happening here&amp;rdquo; and having the next scene be thought up by the game is &lt;em&gt;also&lt;/em&gt; nice. The characters have nifty backstories. It&amp;rsquo;s cool to have art to give you an idea of your character and the characters they encounter.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s nice that each box is usable by itself, and that none of the boxes contain the same cards. It should be pointed out that the &amp;ldquo;Interlude&amp;rdquo; box is in no way an &amp;ldquo;interlude&amp;rdquo; between Act 1 and Act 2, or anything else. It&amp;rsquo;s just a tiny version of the Act 1 game with less cards that can be combined with Act 1&amp;rsquo;s cards and / or Act 2&amp;rsquo;s.&lt;/p&gt;
&lt;h2 id=&#34;is-this-a-fighting-game-or-not&#34;&gt;Is this a fighting game or not?&lt;/h2&gt;
&lt;p&gt;I made the assertion to Dachary (my wife) that this game was a &amp;ldquo;combat focused game&amp;rdquo; that expected you to go from scene to scene and usually fighting to resolve problems. While playing we managed to resolve one scene without any combat. We also learned that there were characters who were completely useless in combat situations.&lt;/p&gt;
&lt;p&gt;Afterwards, she countered that it couldn&amp;rsquo;t have been intended as a &amp;ldquo;combat focused game&amp;rdquo;, because there are multiple characters who have no combat abilities. Unfortunately the same argument applies in the other direction because there are characters who are &lt;em&gt;exclusively&lt;/em&gt; combat focused.&lt;/p&gt;
&lt;p&gt;Our first scene was a cooking contest, and the possible goals were to win the contest, or stop an extortion attempt. The combat focused characters are going to suck at the former and the latter has a decent probability of erupting into violence.&lt;/p&gt;
&lt;p&gt;This implies you could pick non-combat characters and choose non-combat goals. However, the &amp;ldquo;Story&amp;rdquo; card defines your overall goal and doesn&amp;rsquo;t let you pick. Ours was &amp;ldquo;Sabotage the weaponized army of [robots]&amp;rdquo;. That &lt;em&gt;could&lt;/em&gt; theoretically be accomplished without combat, but that seems very unlikely unless you&amp;rsquo;re telling the story of a spy spending months or years to get into position.&lt;/p&gt;
&lt;h2 id=&#34;everything-s-contradictory&#34;&gt;Everything&amp;rsquo;s contradictory&lt;/h2&gt;
&lt;p&gt;Some of the characters are 100% combat focused. They have zero non-combat moves beyond the ones everyone has (Realize, Coerce, Survive). Some characters are useless in combat situations. They have zero combat moves beyond the ones everyone has (Rumble, Barrage).&lt;/p&gt;
&lt;p&gt;The GM never rolls. NPCs never roll to attack. Instead the GM spends a token to justify the action, and players roll to &amp;ldquo;Survive&amp;rdquo;. &lt;a href=&#34;https://cypher-system.com/&#34;&gt;Cypher System&lt;/a&gt; clearly demonstrates that games with &amp;ldquo;player-facing&amp;rdquo; rolls like this can work well. However, there&amp;rsquo;s no mechanic, or even guidance, in ATMA that supports NPCs in conflict.&lt;/p&gt;
&lt;p&gt;Many of the cards clearly show that NPCs can be allies. However, in situations where a Player would roll to see if they succeed the NPCs have to spend a token. BUT tokens are the only currency the GM has to complicate the lives of the characters (make the story more interesting) and spending tokens for an ally to &lt;em&gt;help&lt;/em&gt; the players directly undermines this ability.&lt;/p&gt;
&lt;p&gt;The game clearly wants you to be able to get into a fight, and conveys that some characters are big and powerful and some are small and weak, via both art, character abilities, and different characters having different amounts of health. Mechanically however everyone does exactly the same amount of Harm when attacking. A titan with fist that look to be the size of Volkswagen Beetles can successfully punch a skinny human teen with no defenses and do 1 harm. The skinny human teen with no weapons or combat abilities can punch a massive robot and do 1 harm. The combat mechanics around damage completely undermine the narrative fiction.&lt;/p&gt;
&lt;p&gt;You can take harm, but there&amp;rsquo;s no mechanism to heal. The quote below is the literal entirety of the healing rules.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If [the characters] need medicine, food, or supplies to
heal, offer hints about where these might be found in the scene.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;missing-tools&#34;&gt;Missing tools&lt;/h2&gt;
&lt;p&gt;Sticking with the problem of healing for a moment. We have no idea what the effects of &amp;ldquo;medicine&amp;rdquo;, &amp;ldquo;food&amp;rdquo;, or &amp;ldquo;supplies&amp;rdquo; to heal are. It&amp;rsquo;s a sci-fi game so we could assume some &amp;ldquo;med pack&amp;rdquo; thing that inexplicably heals things, but how many hearts does that heal? Why would &amp;ldquo;food&amp;rdquo; heal a character who was stabbed? How do &amp;ldquo;supplies&amp;rdquo; help? Can any of this be used during a fight?&lt;/p&gt;
&lt;p&gt;As mentioned before, there are no-tools for handling NPC conflict of any sort, and no tools for NPC allies to do anything. It&amp;rsquo;s clear that NPCs can be allies, but if an NPC has special abilities it requires the GM to spend a token to activate, which again undermines their ability to make things more &amp;ldquo;interesting&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Drawing NPC cards randomly requires either a GM with master level improv skills OR a mini brainstorming session where the table tries to come up with some plausible explanation for why this character just appeared and what they want.&lt;/p&gt;
&lt;p&gt;Most GM-less games address this with something like an &amp;ldquo;oracle&amp;rdquo;. This is usually two tables that you roll on. One is a &amp;ldquo;descriptor&amp;rdquo; and one a &amp;ldquo;subject&amp;rdquo;. You ask a question and roll on the table. For example &amp;ldquo;why did this food delivery person suddenly enter the scene?&amp;rdquo; I just rolled on one of my oracles, and it said &amp;ldquo;threatening location&amp;rdquo;. So, maybe they&amp;rsquo;re a robber who is just disguised as a food delivery person to gain entry. It still requires a little improv, but it&amp;rsquo;s not like the game&amp;rsquo;s saying &amp;ldquo;Fuck if I know. You figure it out.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;ATMA requires you to &lt;em&gt;constantly&lt;/em&gt; do real work to figure out &lt;em&gt;everything&lt;/em&gt;. In &amp;ldquo;Theatre of the mind&amp;rdquo; games like this you &lt;em&gt;need&lt;/em&gt; to establish a shared narrative space that makes sense to everyone. The physical locations of each individual in the scene may not be important, but everyone needs to share the same understanding of what&amp;rsquo;s going on, and what the character motivations seem to be. It also has to be something they can all &amp;ldquo;buy in to&amp;rdquo;. If you&amp;rsquo;re thinking &amp;ldquo;This makes no sense. They&amp;rsquo;d never do that.&amp;rdquo; then you&amp;rsquo;re going to have a really hard time engaging with the game.&lt;/p&gt;
&lt;p&gt;Combat is also missing a ton of important information. For example: I had a special ability where I could punch my huge fists into the ground and cause an earthquake. This was visually depicted as a huge rent in the ground shooting away from me in a straight line. So&amp;hellip; could I effect multiple NPCs with this? Did they have to be in a line. The canon weilding bear&amp;rsquo;s ability specifically states multiple characters are effected. Mine mentioned nothing like this. We had to make a ruling on the spot. We decided &amp;ldquo;multiple, but in a line&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Dachary&amp;rsquo;s character&amp;rsquo;s hair seemed like maybe it was prehensile, but it wasn&amp;rsquo;t stated. We ruled that it was. It was drawn as standard western female hair length but the cards said it could be used as a rope. This implies it could get longer. How much longer? These questions actually came up in play and had to be decided or kicked down the road to be discussed again later. We ruled that it was long enough to use as a rope across a passageway, and punted on the question of how much longer it could get.&lt;/p&gt;
&lt;p&gt;By itself these aren&amp;rsquo;t big problems. They&amp;rsquo;re easy to rule on the fly. The problem is that you&amp;rsquo;re constantly having to do this. Imagine playing D&amp;amp;D but literally every spell and special ability is missing critical information like that. Not only are you constantly designing the game as you go, but you&amp;rsquo;re defining house rules about every ability than you now need to keep track of for the remainder of the game.&lt;/p&gt;
&lt;p&gt;What happens if someone at your table wants to use that character again in a game months later? You probably didn&amp;rsquo;t write all those home-brewed rulings down. You&amp;rsquo;re going to have to do the work all over again, and sometimes you&amp;rsquo;ll rule differently and then someone&amp;rsquo;s going to get confused about what&amp;rsquo;s possible because things worked differently last time than this time.&lt;/p&gt;
&lt;h2 id=&#34;nonsensical-cards&#34;&gt;Nonsensical cards&lt;/h2&gt;
&lt;p&gt;The &amp;ldquo;Props&amp;rdquo; and NPC cards are especially problematic.&lt;/p&gt;
&lt;p&gt;NPCs were were kinda neat, but most of them made absolutely no sense once a scene was in motion. Imagine you&amp;rsquo;re playing out the fight in the beginning of Star Wars. The Empire&amp;rsquo;s forces have boarded the ship, laser bolts firing everywhere, they&amp;rsquo;re about to capture the princess, and suddenly Donald Duck walks into the room wearing only a bath towel. Or, maybe, a volcano erupts,  and threatens a nearby town, that you&amp;rsquo;re obviously not in because you&amp;rsquo;re on a star ship. I&amp;rsquo;m not exaggerating. It&amp;rsquo;s that level of random w.t.f.&lt;/p&gt;
&lt;p&gt;We ended up reading ahead and picking NPCs manually because &lt;em&gt;most&lt;/em&gt; of them made no sense in the scene. When we eliminated them and needed to introduce a new NPC we just said &amp;ldquo;uh&amp;hellip; I guess another one of those appears?&amp;rdquo; because none of the remaining cards made any sense given what had transpired.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Props&amp;rdquo; were mostly useless. One was a mug of spicy chai. They either needed to be worked in as a scene was revealed. Like &amp;ldquo;oh, there&amp;rsquo;s um&amp;hellip; a spicy chai vendor in this outdoor plaza&amp;rdquo;. Or else it was like &amp;ldquo;You just got out of a fight, and the room is filling with lava, but as you look around you notice a mug of spicy chai.&amp;rdquo; Both require effort to come up with a justification for, and both leave the players going &amp;ldquo;What?!&amp;rdquo; or &amp;ldquo;uh&amp;hellip; ok? I don&amp;rsquo;t know what to do with that information.&amp;rdquo;&lt;/p&gt;
&lt;h2 id=&#34;invalidating-player-abilities&#34;&gt;Invalidating Player Abilities&lt;/h2&gt;
&lt;p&gt;&amp;ldquo;GM Intrusions&amp;rdquo; is a term I&amp;rsquo;m borrowing from Cypher System, because ATMA has no term for this mechanic but uses it. In Cypher System (also FATE, and others) the GM offers the player some resource they can use in exchange for introducing a complication. In ATMA the GM can spend a token to say &amp;ldquo;yes i know you rolled successfully, but I&amp;rsquo;m invoking something that partially or fully invalidates that success&amp;rdquo; Tokens are a GM only resource so the player can&amp;rsquo;t do anything with it, and they have no means of refusing the intrusion.&lt;/p&gt;
&lt;p&gt;I was the managing most of the cards in our game so I just ignored this because taking away player agency is bullshit.&lt;/p&gt;
&lt;p&gt;In addition to this, the lack of GM rolls meant that the GM only has to spend a token to get around any kind of obstacle. For example, I had gravity spikes that people &amp;ldquo;fell towards&amp;rdquo;. I lined them up to create a barrier to hold back the bad guys. The GM never rolls, and spends a token to have the NPCs do anything and literally can&amp;rsquo;t fail if there&amp;rsquo;s no player roll to counter it. So, as a player you throw down your gravity spikes to slow the enemy and the GM says &amp;ldquo;ok, I spend a token on my turn and jump over or push through them&amp;rdquo;. What&amp;rsquo;s the effing point of giving me powers if the GM can just spend a token to ignore its effect?&lt;/p&gt;
&lt;h2 id=&#34;the-token-economy-is-broken&#34;&gt;The token economy is broken&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s like, really broken. The instructions tell the GM to try and not keep more than three tokens. So, you&amp;rsquo;d be constantly spending them to introduce bad guys in a fight, or environmental complications. Tokens are generated for the GM on every roll that isn&amp;rsquo;t a critical success. So, they&amp;rsquo;ve got a LOT of tokens coming in that need to be spent.&lt;/p&gt;
&lt;p&gt;In a fight this works if the number of bad guys is roughly equivalent to the number of Player Characters. If we have 4 characters on each side of a fight then the GM will spend ~4 tokens each round, and roughly 4 tokens will be generated each round.&lt;/p&gt;
&lt;p&gt;We were playing it as a two player game, which is officially supported. Every scene is started with 3, 4, or 5 tokens + whatever you had from the last scene. Every round of combat we generate ~2 tokens. Let&amp;rsquo;s assume the GM starts the scene with 8 tokens. They either they need to bring out a lot of adversaries to spend them or introduce a lot of &amp;ldquo;props&amp;rdquo; or &amp;ldquo;twists&amp;rdquo;. You don&amp;rsquo;t want to introduce more than one twist per scene, and the props are mostly nonsensical and/or contextually useless.&lt;/p&gt;
&lt;p&gt;My character had 3 Hearts, Dachary&amp;rsquo;s had 2. Adversary hits do 1 Heart of damage. Actually we don&amp;rsquo;t know this. It&amp;rsquo;s never stated. We&amp;rsquo;re just assuming, because if they did more than that her character would be taken out with a single hit and mine with two.&lt;/p&gt;
&lt;p&gt;This means that if there were a lot of bad guys one of two things would happen. Either, we&amp;rsquo;d get eliminated very quickly, or the GM would spend all their tokens attacking us, we&amp;rsquo;d get lucky and dodge, and then half of the NPCs wouldn&amp;rsquo;t be able to do anything every round afterwards because we&amp;rsquo;re only generating 2 tokens but there are 4+ opponents. The GM isn&amp;rsquo;t receiving enough tokens to spend to have them do anything. Eventually, by having each opponent act, the GM spends down to an equilibrium that matches the number of characters or is slightly below it. They&amp;rsquo;re screwed.&lt;/p&gt;
&lt;p&gt;If the GM is managing an ally NPC then they&amp;rsquo;re screwed even more quickly, because the ally will &lt;em&gt;also&lt;/em&gt; cost a token to act. NPCs don&amp;rsquo;t roll, so having an NPC ally means having a guaranteed successful attack (no roll so it can&amp;rsquo;t fail), that &lt;em&gt;also&lt;/em&gt; takes away an action from the GM.&lt;/p&gt;
&lt;h2 id=&#34;missing-what-makes-pbta-great-dot&#34;&gt;Missing what makes PbtA great.&lt;/h2&gt;
&lt;p&gt;One of my favorite things about &amp;ldquo;Powered By The Apocalypse&amp;rdquo; (PbtA) is the playbooks. Every character has a description, and some special moves that not only made them special, but also really gave you a feel for the character. ATMA does give you a feel for the character via the backstory on the back of each special ability card, but the abilities themselves don&amp;rsquo;t feel like they really tell me about the character. The cannon weilding bear can bite things, and shoot its cannon. This doesn&amp;rsquo;t help me feel the character at all. The teleporting teen can&amp;hellip; teleport.&lt;/p&gt;
&lt;p&gt;The Titan I played &lt;em&gt;did&lt;/em&gt; kind-of achieve this, but it was also contradictory. My backstory said I had been mind controlled and forced to hurt people and I felt bad about that. Meanwhile one of my special abilities was to embrace my violent past, and slam my fists into the ground. Afterwards (or separately? I don&amp;rsquo;t know.) I could &amp;ldquo;deny mercy&amp;rdquo; and &amp;ldquo;sow terror&amp;rdquo; or &amp;ldquo;incite hatred&amp;rdquo;. Am I a violent raging ass-hole, or am I a repentant person who only fights when forced to?&lt;/p&gt;
&lt;p&gt;It would have made much more sense if the special move left me shaken about reverting to my past ways, or something like that.&lt;/p&gt;
&lt;p&gt;Despite being mind-controlled for years, one of my abilities was to posses others. No-one who&amp;rsquo;s been mind-raped for years and forced to do things against their will is going to be comfortable mind-raping other beings unless they&amp;rsquo;re just a horribly broken being that needs to be eliminated for everyone&amp;rsquo;s safety. Even if we completely ignore the safety issues around this topic, it just doesn&amp;rsquo;t make any internal sense. In their defense they did get sensitivity readers for the &amp;ldquo;Act II&amp;rdquo; set, so hopefully there&amp;rsquo;s no more of this in those cards.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;This game &lt;em&gt;really&lt;/em&gt; frustrates me, which is another way of saying that this game has great potential.&lt;/p&gt;
&lt;p&gt;I am fortunate to have a wife who&amp;rsquo;s amazing at coming up with stories on the fly. This helped a lot, but - without exaggeration - we spent at least half of our time trying to figure out why &lt;em&gt;everything&lt;/em&gt; was happening, and trying to figure out what the hell ever card we pulled had to do with anything.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;d paused before the final scene because dogs needed walking. The next day, we wanted to see how the story ended, but by the time the final climax was reached and we were starting to vanquish the bad guys I did not have the energy to give a shit. I had spent so much time, and energy trying to come up with explanations for &lt;em&gt;everything&lt;/em&gt; and constantly having to come up with new house-rules for everything our characters tried to do, that I just didn&amp;rsquo;t care. It was like &amp;ldquo;&amp;hellip;and the last two guys run away and [quick illegal roll for an NPC] the Magistrate barely wins the election and eventually all is well with AIs and non-AIs. The end. I don&amp;rsquo;t care. I just want to put away the cards.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;This game &lt;em&gt;could&lt;/em&gt; be really good. Every mechanical problem it has is something that was solved years ago by other talented designers.&lt;/p&gt;
&lt;p&gt;It doesn&amp;rsquo;t seem to know if it wants to be a fighting game or not, and the characters all feel completely unbalanced. Either they&amp;rsquo;re all about fighting or they&amp;rsquo;re useless in a fight. The ones that&amp;rsquo;re useless in a fight mostly have no skills that&amp;rsquo;d be useful in a game about social conflict.&lt;/p&gt;
&lt;p&gt;The character&amp;rsquo;s special abilities all need to be rewritten so that you don&amp;rsquo;t have to create a house-rule for all of them. Is the hair prehensile? Roughly how long can it become? Can the teleporter teleport places they haven&amp;rsquo;t been?&lt;/p&gt;
&lt;p&gt;The combat needs to match the narrative. It completely breaks me out of the fiction to have a huge titan smashing a tiny teen human do exactly the same damage as a tiny teen human with no fighting abilities punching a massive metal robot.&lt;/p&gt;
&lt;p&gt;The description needs to match the images and be internally consistent, and consistent with the other elements of the world. The &amp;ldquo;Warmech Veteran&amp;rdquo; is drawn with a human and a robot. The description is about a robot who &amp;ldquo;suppressed their higher level functions like logic and speech&amp;rdquo; but it can &amp;ldquo;befriend another fighter&amp;rdquo; &amp;hellip; isn&amp;rsquo;t friendship kind-of a higher level function? What&amp;rsquo;s the deal with the human? Are they a pair? The robot is drawn with some sort of missile launchers on its back, but are they unlimited missiles? does the missile hurt only one character if it explodes beside them? What does it mean that it can it &amp;ldquo;ride upon missiles&amp;rdquo;? Why does a big robot that&amp;rsquo;s obviously designed for war, only have 2 hearts when a squishy human &lt;em&gt;also&lt;/em&gt; only has two hearts?&lt;/p&gt;
&lt;p&gt;Speaking of hearts, why do some characters have multiple separate lines of hearts and some only have one line that may be long or short. Does that separate line mean something? Does something happen when all the hearts in one line are removed?&lt;/p&gt;
&lt;p&gt;I hate that it has forced me to either ask these questions and come up with house-rules for each, or say &amp;ldquo;fuck it none of these rules make sense, no-one understands what my character or the enemies are actually capable of, and I have to just accept it&amp;rdquo;?&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t think this game is good for new players if any of them are inclined to actually consider the implications of anything written on the cards. If you have players who embrace &amp;ldquo;don&amp;rsquo;t think about it.&amp;rdquo; and are &lt;em&gt;really&lt;/em&gt; good at collaborative improve you&amp;rsquo;ll be fine. Otherwise, I can&amp;rsquo;t recommend this. It just requires way too much work, because it defines way too little, and doesn&amp;rsquo;t provide the support you need to make generating the story easy.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>On Generic TTRPG Systems</title>
      <link>https://weblog.masukomi.org/2024/01/26/on-generic-ttrpg-systems/</link>
      <pubDate>Fri, 26 Jan 2024 00:00:00 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/2024/01/26/on-generic-ttrpg-systems/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#context&#34;&gt;Context&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#it-s-all-about-the-fighting&#34;&gt;It&amp;rsquo;s all about the fighting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#i-want-more&#34;&gt;I want more&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-problem-is-hard&#34;&gt;The problem is hard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#if-they-re-not-really-generic-dot-dot-dot&#34;&gt;If they&amp;rsquo;re not really generic&amp;hellip;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;I love the &lt;em&gt;idea&lt;/em&gt; of generic role-playing games, but as time goes by I find myself caring less and less. Yet, there&amp;rsquo;s still something great about them. This post explores those thoughts.&lt;/p&gt;
&lt;h2 id=&#34;context&#34;&gt;Context&lt;/h2&gt;
&lt;p&gt;The basic premise of a Generic Tabletop Role-playing game is that you can learn this one system, and then play any kind of game with it. No need to learn new rules. Just throw together some new characters for whatever setting you and your friends have decided to have fun in.&lt;/p&gt;
&lt;p&gt;I currently own the following generic systems:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://cypher-system.com/&#34;&gt;Cypher System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/D6_System&#34;&gt;D6 System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://evilhat.com/fate-everything/&#34;&gt;FATE&lt;/a&gt; (Core, Condensed, and Accellerated)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.fudgerpg.com/&#34;&gt;Fudge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.sjgames.com/gurps/books/Basic/&#34;&gt;GURPS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.fantasyflightgames.com/en/products/genesys/&#34;&gt;Genesys&lt;/a&gt;
Seemingly abandoned for years, maybe about to come back to life?&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.fifegames.com/&#34;&gt;Heroes &amp;amp; Hardships&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/HeroQuest_%28role-playing_game%29&#34;&gt;HeroQuest&lt;/a&gt; (now called QuestWorlds)
The Robin D. Laws game. &lt;a href=&#34;https://questworlds.chaosium.com/&#34;&gt;SRD here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.runehammer.online/&#34;&gt;ICRPG&lt;/a&gt;
It&amp;rsquo;s debatable if this is really a &amp;ldquo;generic&amp;rdquo; system.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://peginc.com/savage-settings/savage-worlds/&#34;&gt;Savage Worlds&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.gallantknightgames.com/tinyd6/&#34;&gt;TinyD6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://greenroninstore.com/collections/true20&#34;&gt;True20&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://rowanrookanddecard.com/product/unbound/&#34;&gt;Unbound&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;and some others&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When I step back and think about each of these it becomes clear that, with the possible exception of GURPS and HeroQuest none of them are &lt;em&gt;actually&lt;/em&gt; trying to let you play any kind of game. Each of them has an inherent idea of what a &amp;ldquo;fun&amp;rdquo; game is and then gives you tools to play that kind of game in any setting.&lt;/p&gt;
&lt;p&gt;For example, FATE has the baked-in assumption that your characters are &lt;em&gt;very&lt;/em&gt; competent people who are each &lt;em&gt;especially competent&lt;/em&gt; in at least one area. It&amp;rsquo;s really difficult to use FATE to play characters who are really flawed and not good at some things.&lt;/p&gt;
&lt;h2 id=&#34;it-s-all-about-the-fighting&#34;&gt;It&amp;rsquo;s all about the fighting&lt;/h2&gt;
&lt;p&gt;What I&amp;rsquo;m coming to believe is that most of these aren&amp;rsquo;t really Generic Game Systems. They&amp;rsquo;re just codified rules for a specific flavor of combat.&lt;/p&gt;
&lt;p&gt;Someone I respect recently posted about a Kickstarter for a generic system they were helping to make a new version of. When I went to check it out I found myself just not caring. They obviously enjoyed playing it, and it might be a really good system, but a quick glance at the old version made it clear that this was just another codifed flavor of combat. Sure, it sounded like a slightly different one but…&lt;/p&gt;
&lt;p&gt;In these systems you can make any kind of character you want, in any genre you want, in any setting you want&amp;hellip; so long as it&amp;rsquo;s a story that centers around physical combat, and &amp;ldquo;heroes&amp;rdquo; who solve problems with violence.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Now, don&amp;rsquo;t get me wrong. There&amp;rsquo;s something very cathartic about &lt;a href=&#34;https://www.9thlevel.com/rebel-scum&#34;&gt;punching space-nazis in the face&lt;/a&gt; instead of waiting for your current flavor of failed government to do something about it. I&amp;rsquo;m 100% down for a good session of that, but there are other stories to tell. I want to play &lt;a href=&#34;https://www.brindlewoodbay.com/brindlewood-bay.html&#34;&gt;a grannie solving mysteries in a sleepy town&lt;/a&gt;. I want to experience what it&amp;rsquo;s like to be &lt;a href=&#34;https://magpiegames.com/pages/bluebeards-bride&#34;&gt;Bluebeard&amp;rsquo;s Bride&lt;/a&gt;, or a &lt;a href=&#34;https://thousandyearoldvampire.com/&#34;&gt;Thousand Year Old Vampire&lt;/a&gt; trying to hold onto their sense of self.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s where generic systems loose me.&lt;/p&gt;
&lt;h2 id=&#34;i-want-more&#34;&gt;I want more&lt;/h2&gt;
&lt;p&gt;I love some of these systems. I have great respect for many of the people behind them, but the world doesn&amp;rsquo;t really need another generic combat system. We&amp;rsquo;ve got plenty.&lt;/p&gt;
&lt;p&gt;I want games that&amp;rsquo;ll engender fun experiences that aren&amp;rsquo;t focused on going places and killing people. Sometimes I want that, but not &lt;em&gt;all the time&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&#34;the-problem-is-hard&#34;&gt;The problem is hard&lt;/h2&gt;
&lt;p&gt;I don&amp;rsquo;t know that it&amp;rsquo;s possible to make a &lt;em&gt;truly&lt;/em&gt; generic system. Robin came pretty close when he created HeroQuest, but that&amp;rsquo;s partially because there&amp;rsquo;s hardly anything &lt;em&gt;to&lt;/em&gt; the system. GURPS is flexible enough that it might do a pretty good job of letting you pretend to be grannies solving crime. Again though, this is largely due to the fact that there&amp;rsquo;s very little &lt;em&gt;to&lt;/em&gt; GURPS. Sure, there are tons of books and tons of very specific options &lt;em&gt;in&lt;/em&gt; those books, but at its heart it&amp;rsquo;s a very bare-bones mechanic.&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Even so, both of those are going to impart a certain flavor to whatever game you play with them.&lt;/p&gt;
&lt;p&gt;It seems like the key to making a &lt;em&gt;really&lt;/em&gt; generic system is to make a system that barely exists. The problem with that, is that when everything is just &amp;ldquo;roll the standard test vs difficulty &amp;amp; apply modifier&amp;rdquo; or whatever the game stops being &lt;em&gt;about&lt;/em&gt; anything.&lt;/p&gt;
&lt;p&gt;I think &lt;a href=&#34;https://www.gallantknightgames.com/tinyd6/&#34;&gt;Tiny D6&lt;/a&gt; is a good example of this. There&amp;rsquo;s &lt;em&gt;so&lt;/em&gt; little to the system that you can do anything with it, but there&amp;rsquo;s also nothing &lt;em&gt;interesting&lt;/em&gt; about rolling the dice. Maybe you succeed. Maybe you fail. The odds are roughly the same all the time and the game mechanics never leave you particularly surprised or excited.&lt;/p&gt;
&lt;p&gt;It seems to be intended for young kids, and I&amp;rsquo;m betting it&amp;rsquo;s great for them. I&amp;rsquo;m not a young kid though, and neither are you.&lt;/p&gt;
&lt;p&gt;I want a game where there&amp;rsquo;s a good chance I could fail at some things, and a good chance i could be amazing at others. I want rolls to be interesting. I want to actually &lt;em&gt;worry&lt;/em&gt; that my character might fail to do something important. Most of the games in my list do that. However, the better they are at that, the more influence they have on the story being told. They flavor it.&lt;/p&gt;
&lt;p&gt;As soon as your game imparts flavor, it&amp;rsquo;s no longer generic, and some types of stories cease to be supported very well. I think recreating &lt;a href=&#34;https://possumcreekgames.com/pages/yazebas-bed-breakfast&#34;&gt;Yazeba&amp;rsquo;s Bed &amp;amp; Breakfast&lt;/a&gt; in Savage Worlds would be an utter disaster.&lt;/p&gt;
&lt;h2 id=&#34;if-they-re-not-really-generic-dot-dot-dot&#34;&gt;If they&amp;rsquo;re not really generic&amp;hellip;&lt;/h2&gt;
&lt;p&gt;If your table is not single-mindedly focused on only role-playing combat focused stories, then there isn&amp;rsquo;t a particularly good reason to invest much time in a generic system. It doesn&amp;rsquo;t matter how much you love the system if it&amp;rsquo;s not good at supporting the next kind of story you table wants to experience.&lt;/p&gt;
&lt;p&gt;Even if you &lt;em&gt;are&lt;/em&gt; only looking for combat-centric escapism, I think it&amp;rsquo;s worth asking yourself if you really &lt;em&gt;only&lt;/em&gt; want one kind. There are so many amazing flavors of action movie. Do you really want to &lt;em&gt;only&lt;/em&gt; play John Wick type stories with different set-dressing?&lt;/p&gt;
&lt;p&gt;As soon as you realize that you want more than one flavor there ceases to be much point in investing much energy into a generic system.&lt;/p&gt;
&lt;p&gt;Now, don&amp;rsquo;t get me wrong. I love Savage Worlds. I&amp;rsquo;ll happily play in any game a friend wants to run in it. But I also love the feel of stories that emerge from playing &lt;a href=&#34;https://www.ironswornrpg.com/product-ironsworn-starforged&#34;&gt;Starforged&lt;/a&gt;, or &lt;a href=&#34;https://www.brindlewoodbay.com/brindlewood-bay.html&#34;&gt;Brindlewood Bay&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If there&amp;rsquo;s a generic system that produces the type of game you prefer, and that&amp;rsquo;s &lt;em&gt;mostly&lt;/em&gt; what you play, then go for it. What I&amp;rsquo;m suggesting is more that we should really reconsider the whole idea of a &amp;ldquo;Generic&amp;rdquo; TTRPG, because they&amp;rsquo;re generally pretty bad at supporting &amp;ldquo;any&amp;rdquo; type of story. Mostly, they&amp;rsquo;re just good at supporting a specific flavor of combat.&lt;/p&gt;
&lt;p&gt;Maybe we should be reframing them as &amp;ldquo;generic combat systems&amp;rdquo;, and working from there.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;To be explicit, some of the games I listed - especially FATE &amp;amp; Fudge - do a really good job of supporting combat-free games. But, that doesn&amp;rsquo;t make them truly generic.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;HeroQuest and GURPS are both marketed as combat focused things, but that&amp;rsquo;s also the kind of escapism that TTRPGs were used for when they were created. That hasn&amp;rsquo;t changed much. There are very few high-profile games that aren&amp;rsquo;t about killing &amp;ldquo;bad guys&amp;rdquo;. I think they both deserve more attention than they get, especially HeroQuest (QuestWorlds). Although, I should note that there was some weird business decisions that shoe-horned some RuneQuest terminology into HeroQuest&amp;rsquo;s rules. It feels very out of place, and just confuses things.&lt;/p&gt;
&lt;p&gt;GURPS has a reputation of being crunchy-AF, but the reality is that it&amp;rsquo;s only as &amp;ldquo;crunchy&amp;rdquo; as your table wants it to be. The minimal version of it is one of the simplest RPG systems out there.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Recycling 3D Prints</title>
      <link>https://weblog.masukomi.org/2024/01/24/recycling-3d-prints/</link>
      <pubDate>Wed, 24 Jan 2024 00:00:00 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/2024/01/24/recycling-3d-prints/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#shredding&#34;&gt;Shredding&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#gotchas&#34;&gt;Gotchas&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#extruding&#34;&gt;Extruding&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#gotchas&#34;&gt;Gotchas&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#color&#34;&gt;Color&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#materials&#34;&gt;Materials&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#thickness&#34;&gt;Thickness&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#winding&#34;&gt;Winding&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#pelletizing&#34;&gt;Pelletizing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#summary&#34;&gt;Summary&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;Despite being &amp;ldquo;plant based&amp;rdquo; there are almost no 3D printer filaments that are actually compostable &lt;em&gt;or&lt;/em&gt; biodegradable in any meaningful way. PLA needs oxygen, a temperature of 140+°F (60°C), and a variety of organic compounds to break down. You&amp;rsquo;re not going to find these outside of an industrial composting facility and most of them won&amp;rsquo;t take PLA anyway because it&amp;rsquo;s frequently mixed with other things that make it non-compostable.&lt;/p&gt;
&lt;p&gt;Fortunately PLA is completely re-usable. You &amp;ldquo;just&amp;rdquo; need to melt it down and re-extrude it.&lt;/p&gt;
&lt;p&gt;UNfortunately, that&amp;rsquo;s a lot easier said than done.&lt;/p&gt;
&lt;p&gt;This post describes what it would take for a home user convert your old prints into new filament to make new things with. It was written based on the tools available in January 2024.&lt;/p&gt;
&lt;h2 id=&#34;shredding&#34;&gt;Shredding&lt;/h2&gt;
&lt;p&gt;The first step in re-using the plastic from old PLA is shredding it. To do this you need a bunch of specifically shaped disks made out of hardened metal that will chew your old prints into little pieces. You&amp;rsquo;ll also need one or two motors with a &lt;em&gt;lot&lt;/em&gt; of torque to force the &amp;ldquo;teeth&amp;rdquo; of those disks through a block of plastic. The bigger the opening the more cutting disks you need, and the more powerful the motors need to be.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&#34;https://actionbox.ca/products/shredii-5s&#34;&gt;SHREDII 5s&lt;/a&gt; is the most capable thing i&amp;rsquo;ve seen in a price range achievable by most people. It&amp;rsquo;s $1,400 BUT you also need 2 identical motors with enough torque and that&amp;rsquo;s roughly another $1,800. It can only handle something about the size of a soda can. It&amp;rsquo;s made by the folks on the &lt;a href=&#34;https://www.youtube.com/@ActionBOX&#34;&gt;ActionBox YouTube Channel&lt;/a&gt; who have videos of its use, and the prior generations that led to it.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t know of &lt;em&gt;any&lt;/em&gt; off-the-shelf shredder that I&amp;rsquo;d bother buying. They&amp;rsquo;re either industrial things that are ridiculously expensive, or hobbyist things that can only shred things that are stupidly small. You&amp;rsquo;ll never be able to shred anything but the tiniest of prints, test strips, and brims.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s not a lot the community can do to improve the cost of the shredder. High torque motors are expensive and no-one really wants to build one from scratch. There&amp;rsquo;s nothing terribly complicated about the shredding part. It&amp;rsquo;s just some hardened metal disks with vaguely saw-like teeth on two rods that rotate in opposite directions. You can definitely get the cost down significantly if you have the right tools and are willing to put in the effort.&lt;/p&gt;
&lt;p&gt;For comparison, here&amp;rsquo;s &lt;a href=&#34;https://youtu.be/W7G38KiGPAQ&#34;&gt;a 4 minute overview of the $9,000 Filabot Reclaimer&lt;/a&gt; which can&amp;rsquo;t handle pieces larger than 3&amp;quot; (~7cm) and has feeding issues with many things that are smaller than that, requires 2 stages of shredding, and warms up enough to cause low temperature materials PLA to clump together, exceed it maximum size, and clog within a few seconds.&lt;/p&gt;
&lt;h3 id=&#34;gotchas&#34;&gt;Gotchas&lt;/h3&gt;
&lt;p&gt;Cleaning out all remnants of things you&amp;rsquo;ve shredded before isn&amp;rsquo;t easy. If you don&amp;rsquo;t do it, you&amp;rsquo;ll get small pieces of past filament colors mixed in with the shreds of the current color.&lt;/p&gt;
&lt;h2 id=&#34;extruding&#34;&gt;Extruding&lt;/h2&gt;
&lt;p&gt;A pre-made desktop extruder is going to cost $3,500 (USD) or more, but there are kits available for homebrew ones that will cost you about $600 to put together and provide very usable results.&lt;/p&gt;
&lt;p&gt;At the time of writing the &lt;a href=&#34;https://www.artme-3d.de/produkte/desktop-filament-extruder-mk2/&#34;&gt;Arteme 3D Mk2&lt;/a&gt; is the best one I&amp;rsquo;ve seen. [Note: when visiting that site you can change the language at that link by clicking a wee flag at the top.]. Unfortunately there&amp;rsquo;s no &amp;ldquo;good&amp;rdquo; way to measure the thickness of the new filament you&amp;rsquo;re extruding. It&amp;rsquo;s possible, but not easy.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://youtu.be/BT04glGDjB4&#34;&gt;This YouTube Video&lt;/a&gt; by CNC Kitchen does a good job of showing off the Artme 3D &lt;em&gt;and&lt;/em&gt; compares it to a ~$3k machine. The $3K machine definitely seems less hackey and produces more consistent seeming results.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s decent enough for a small-scale home setup, but there&amp;rsquo;s &lt;em&gt;a lot&lt;/em&gt; the community can do to improve it. Incorporating something like this cheap (~$5) open source &lt;a href=&#34;https://youtu.be/RYgdLPe_T0c&#34;&gt;inline filament sensor&lt;/a&gt; would be a huge improvement, but would require some programming and electrical engineering to give you a display of the current diameter, or better yet, incorporate it into a speed controller for the extrusion process. Professional extruders run the filament through a water bath to cool it off quickly, and something like that could be incorporated too although it&amp;rsquo;s probably overkill for this low-speed extruder.&lt;/p&gt;
&lt;p&gt;The mixing bin is, in my opinion, completely inadequate for anyone who actually wants mix things to control the color of the resulting filament. In that case you&amp;rsquo;ll definitely want a separate mixing setup that does a way better job than a human with a big spoon.&lt;/p&gt;
&lt;p&gt;Some of you may be thinking &amp;ldquo;but there are really cheap (~$200) extruders on Ali Express&amp;rdquo;. Please watch &lt;a href=&#34;https://youtu.be/uziOmehaQpE&#34;&gt;this video from Slant3D&lt;/a&gt; going over how amazingly useless the cheap Chinese extruders are. The one they got currently sells for $1344 and was barely functional.&lt;/p&gt;
&lt;h3 id=&#34;gotchas&#34;&gt;Gotchas&lt;/h3&gt;
&lt;h4 id=&#34;color&#34;&gt;Color&lt;/h4&gt;
&lt;p&gt;Mixing filament colors is just like mixing paints. Mix enough colors together and eventually you end up with something brown or black. So, you&amp;rsquo;ll need to keep your filaments separated by color unless you don&amp;rsquo;t care what color the new roll is.&lt;/p&gt;
&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Intentional Mixing&lt;/p&gt;
&lt;p&gt;Unless you&amp;rsquo;re really careful about keeping your shredded filament colors separately you&amp;rsquo;re going to be mixing colors. If you&amp;rsquo;re mixing colors you&amp;rsquo;re probably going to end up with banding from uneven mixes. It turns out this is a hard problem. The folks over at Protopasta do this for a living, and they still have problems with it. As a result, they mix new colors and put them through one extruder, then shred the results, and re-extrude them in another extruder. &lt;a href=&#34;https://youtu.be/Ocl6H2Y3Y-k?si=qOLVwHuf38jeHQLt&amp;amp;t=108&#34;&gt;Here&amp;rsquo;s a link to where they talk about this in a factory walk-through.&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Creating Custom Colors&lt;/p&gt;
&lt;p&gt;Probably the coolest thing about having your own extruder is that you will no longer be limited to the colors you can buy from other manufacturers. You can buy the raw resin pellets in bulk. Then buy whatever pigments you want and mix them together. You can add in sparkles and anything else. The only &amp;ldquo;gotcha&amp;rdquo; here is that if you haven&amp;rsquo;t done so before, you&amp;rsquo;re going to have to spend some time learning basic color theory as it applies to mixing pigments. At a high level, everything they teach about mixing paints is applicable here, with the caveat that mixing pigments with plastic is probably going to be about as different from paint as mixing watercolors is from mixing oil paints.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;materials&#34;&gt;Materials&lt;/h4&gt;
&lt;p&gt;Many manufacturers mix things in with their PLA. Because of this we don&amp;rsquo;t really know what happens when you re-melt and re-extrude them until you try. Additionally different filaments melt at different temperatures and extrude differently. Personally I&amp;rsquo;d stick to only re-extruding simple PLA and PLA with sparkles until you&amp;rsquo;ve done some research about the compounds involved.&lt;/p&gt;
&lt;p&gt;Note that PLA+ is not the same as PLA and the &amp;ldquo;plus&amp;rdquo; could represent the addition of just about anything. There&amp;rsquo;s no industry standard around the term. So, you can&amp;rsquo;t mix the two and you can&amp;rsquo;t - or at least shouldn&amp;rsquo;t - mix PLA+ from different manufacturers.&lt;/p&gt;
&lt;h4 id=&#34;thickness&#34;&gt;Thickness&lt;/h4&gt;
&lt;p&gt;If your newly extruded filament is too thick it&amp;rsquo;ll clog your nozzle. If it&amp;rsquo;s too thin… well I don&amp;rsquo;t really know what that does, but i suspect it&amp;rsquo;d heat too quickly and give you the same result as printing with a nozzle temperature that&amp;rsquo;s too high. If the thickness is inconsistent you&amp;rsquo;re just screwed.&lt;/p&gt;
&lt;p&gt;I do not like how the Arteme 3D MK2 handles the problem of measuring your filament thickness. I hope the community comes up with a good improvement in the near future. Right now it seems to produce filament that&amp;rsquo;s &amp;ldquo;mostly close enough&amp;rdquo; in the thickness department. I wouldn&amp;rsquo;t use it for anything where precision extrusion mattered in the final product.&lt;/p&gt;
&lt;h4 id=&#34;winding&#34;&gt;Winding&lt;/h4&gt;
&lt;p&gt;Winding your new spool well is really important. I&amp;rsquo;ve gotten multiple cheap rolls from cheap Chinese manufactures that are wound poorly, get bound up and snap because they won&amp;rsquo;t unroll anymore until you get your hands involved. The homebrew winding solutions &lt;em&gt;seem&lt;/em&gt; to work reasonably well, but i figure there&amp;rsquo;s got to be more to it or else even the cheap companies that do this for a living wouldn&amp;rsquo;t be screwing it up.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not thrilled with the winding solution of the Arteme 3D MK2, but you could either respool it with some of the more elaborate 3D printable solutions, or you could integrate something into a hacked version of the Arteme.&lt;/p&gt;
&lt;h2 id=&#34;pelletizing&#34;&gt;Pelletizing&lt;/h2&gt;
&lt;p&gt;Not &lt;em&gt;technically&lt;/em&gt; required, but if you want the best possible results my understanding is that you&amp;rsquo;ll want to shred, extrude, pelletize, and then re-extrude. Pelletizing is basically just making them into uniform little pellets that&amp;rsquo;ll help your re-extrusion process.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;
&lt;p&gt;All in all you&amp;rsquo;re looking at about $3600 and some kit building to get started. If you already have a CNC that can work with steel you could save about $1400 on the shredder part, and maybe even make a bigger one, but you&amp;rsquo;re still going to need 1-2 high-torque motors. With a setup similar to the SHREDII you&amp;rsquo;re going to have to spend time cutting your old prints on a band saw or something to make them fit into your shredder.&lt;/p&gt;
&lt;p&gt;Once you&amp;rsquo;ve got all the pieces you&amp;rsquo;ll have to be diligent about keeping your old print material separated by color and material type. That means a lot of bins, and that means a much longer time before you&amp;rsquo;ll have enough waste of a specific color and material to make a new spool. You&amp;rsquo;ll be much better off if you don&amp;rsquo;t care about color and just want to reuse material for test prints. In that scenario you only have to keep things separated by material.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll need to clean your shredder after each use, which is probably best achieved by running some clear PLA resin through it. A little bit of that left in the system shouldn&amp;rsquo;t significantly effect the color of the next filament you shred.&lt;/p&gt;
&lt;p&gt;If you don&amp;rsquo;t want random color banding in your prints you&amp;rsquo;re going to need to come up with a good mixing solution, and probably extrude your newly mixed color, shred it, and then re-extrude it.&lt;/p&gt;
&lt;p&gt;All of this is very fiddly. It takes a lot of time, and it requires energy to shred, mix, and re-melt all your stuff. It requires energy and raw material to make the shredder and motors and extruder and electronics and everything else.&lt;/p&gt;
&lt;p&gt;Right now home re-use of filament is doable, but it&amp;rsquo;s a lot of work. If you&amp;rsquo;re not generating &lt;em&gt;a lot&lt;/em&gt; of PLA waste, I doubt that the small amount of material you keep from a landfill will compensate for the environmental impact of making all the things required to do it. At the same time, we need hobbyists to be willing to put in the time and energy to try this so that we have people iterating on the tools available to the wider community.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t think you should bother with this if you just want to be a little more green. I don&amp;rsquo;t think that&amp;rsquo;s realistically achievable with the current tools. Please &lt;em&gt;do&lt;/em&gt; try this if you&amp;rsquo;re a tinkerer who is interested in spending the time to iterate on what we have, and find a way to make it better for others, so that - eventually - something exists that actually &lt;em&gt;does&lt;/em&gt; make a difference for everyone.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Debugging Our Ambulance</title>
      <link>https://weblog.masukomi.org/2023/12/08/debugging-our-ambulance/</link>
      <pubDate>Fri, 08 Dec 2023 00:00:00 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/2023/12/08/debugging-our-ambulance/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#debugging-our-ambulance&#34;&gt;Debugging Our Ambulance&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#tl-dr-two-developers-use-standard-debugging-techniques-to-fix-electrical-problems-in-their-ambulance-dot&#34;&gt;tl; dr: two developers use standard debugging techniques to fix electrical problems in their ambulance.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#setting-the-stage&#34;&gt;Setting The Stage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-problem&#34;&gt;The Problem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#a-debugging-we-will-go&#34;&gt;A debugging we will go&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#gather-the-initial-known-truths&#34;&gt;Gather the initial known truths&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#propose-theories&#34;&gt;Propose Theories&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#choose-a-theory-and-test-it&#34;&gt;Choose A Theory And Test It&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#summary&#34;&gt;Summary&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#afterward&#34;&gt;Afterward&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;debugging-our-ambulance&#34;&gt;Debugging Our Ambulance&lt;/h2&gt;
&lt;h3 id=&#34;tl-dr-two-developers-use-standard-debugging-techniques-to-fix-electrical-problems-in-their-ambulance-dot&#34;&gt;tl; dr: two developers use standard debugging techniques to fix electrical problems in their ambulance.&lt;/h3&gt;
&lt;h3 id=&#34;setting-the-stage&#34;&gt;Setting The Stage&lt;/h3&gt;
&lt;p&gt;We had to drop our car off at the dealership last night. In order to avoid walking home in the dark, on roads without sidewalks, in 27°F (-2.7°C) - or just the last two shortly after dawn, we needed to drive the 🚑 Ambulance. Unlike most years, I actually remembered that it had a block heater&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; and had turned it on at the beginning of winter.&lt;/p&gt;
&lt;p&gt;Because it was so cold, I went out in the morning and double checked that that the block-heater was turned on. It was. What I didn&amp;rsquo;t check was the voltmeter&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;h3 id=&#34;the-problem&#34;&gt;The Problem&lt;/h3&gt;
&lt;p&gt;That evening - in the cold, and dark of winter - I hopped into the 🚑, turned the key, and… nothing. Literally nothing happened. I looked over to the voltmeter and understood why. Zero volts coming from the batteries. Nothing to power the ignition.&lt;/p&gt;
&lt;h3 id=&#34;a-debugging-we-will-go&#34;&gt;A debugging we will go&lt;/h3&gt;
&lt;h4 id=&#34;gather-the-initial-known-truths&#34;&gt;Gather the initial known truths&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;The ambulance has 2 separate electrical systems. There&amp;rsquo;s the 12v DC system (normal car stuff) and the 120v AC system (normal &amp;ldquo;house&amp;rdquo; electrical stuff).&lt;/li&gt;
&lt;li&gt;An Inverter takes DC power from the batteries and converts it into AC power. This is not very efficient and you loose a fair amount of power along the way even with an expensive inverter like the ones they use in ambulances.&lt;/li&gt;
&lt;li&gt;A Converter takes AC power and converts it to DC power.&lt;/li&gt;
&lt;li&gt;There&amp;rsquo;s no reason you can&amp;rsquo;t have an Inverter and Converter in the same physical device.&lt;/li&gt;
&lt;li&gt;The voltmeter reads 0 volts.&lt;/li&gt;
&lt;li&gt;The system is acting as if there is no power.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We don&amp;rsquo;t know where the AC in from the side of the ambulance goes. I suspect it&amp;rsquo;s in our wiring diagrams&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt; but we haven&amp;rsquo;t hunted that bit down yet.&lt;/p&gt;
&lt;h4 id=&#34;propose-theories&#34;&gt;Propose Theories&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;the batteries are &amp;ldquo;dead&amp;rdquo;.
They aren&amp;rsquo;t set up as some assume. See footnote.&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;the batteries are disconnected.&lt;/li&gt;
&lt;li&gt;the ambulance isn&amp;rsquo;t getting power from the house.
&lt;ul&gt;
&lt;li&gt;The house plug is bad.&lt;/li&gt;
&lt;li&gt;The cord is bad.&lt;/li&gt;
&lt;li&gt;The ambulance plug is bad.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;choose-a-theory-and-test-it&#34;&gt;Choose A Theory And Test It&lt;/h4&gt;
&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Eliminate things you can test rapidly.&lt;/p&gt;
&lt;p&gt;I started with the second theory - despite it being unlikely - for three reasons: First it could be eliminated in under a minute. Second, because I&amp;rsquo;d recently replaced the batteries and they live in a slide-out drawer - 🚑s are weird - and its possible one of the leads came loose. Third, because I was already outside and didn&amp;rsquo;t need to go inside to grab anything to test this. A battery lead being detached is very unlikely to be our problem, because even if it did, each lead is clamped into two batteries. So if it comes off of one post it&amp;rsquo;s going to still be clamped onto a second one. Two batteries gives us redundancy, reliability, and more available power in an emergency when the engine has stopped running, and thus the alternators aren&amp;rsquo;t generating any DC power.&lt;/p&gt;
&lt;p&gt;The leads were very well attached to the batteries. I couldn&amp;rsquo;t guarantee that the far end of the leads were well connected because I don&amp;rsquo;t know where they terminate, but it&amp;rsquo;s very unlikely that anything has gone wrong there. They&amp;rsquo;re very thick wires and would need &lt;em&gt;significant&lt;/em&gt; clamps to hold them in place.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Work on probable things.&lt;/p&gt;
&lt;p&gt;The batteries being dead is the most likely. It&amp;rsquo;s &lt;em&gt;so&lt;/em&gt; likely that we just worked with that as a default assumption, and moved on to the third theory.&lt;/p&gt;
&lt;p&gt;The house plug had a self-test light, and GFCI test &amp;amp; reset switches that all seemed to be working. We also had a plug-in AC outlet tester which was easy to grab confirmed.  So, it was reasonable to temporarily eliminate it as the problem.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s difficult to test if the plug on the ambulance is working because we don&amp;rsquo;t actually know what it connect to inside the ambulance. It&amp;rsquo;s probably in our wiring diagrams, but even if we did know, it&amp;rsquo;s unlikely that we could reach it without disassembling parts of the ambulance.&lt;/p&gt;
&lt;p&gt;Next was the cord. Testing that required a multimeter. We couldn&amp;rsquo;t find our &amp;ldquo;good one&amp;rdquo;, but we had an ancient Radio Shack one that still had power. A quick trip to YouTube to make sure we were using it correctly for AC wall power, and we confirmed that the cord was transmitting power. We tested this inside in the basement which was both well-lit, and significantly warmer.&lt;/p&gt;
&lt;p&gt;Because we couldn&amp;rsquo;t easily test that the 🚑 was receiving power via its plug, we had to just assume - for now - that that was still good.&lt;/p&gt;
&lt;p&gt;Since we had the multimeter in hand, it made sense to eliminate some things that had just become quickly testable: the batteries themselves. They were - unsurprisingly - dead.&lt;/p&gt;
&lt;p&gt;We tested the AC plug on the Inverter (for sending power out). It worked. Since the batteries were completely dead, and the outlet had full power, we could reasonably assume that the power was coming from the cord to the house, which meant that power was successfully entering the ambulance and being used by things in it.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Generate new theories&lt;/p&gt;
 &lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;State of Existing / Old Theories&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;✅ the batteries are &amp;ldquo;dead&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;⛔ the batteries are disconnected.&lt;/li&gt;
&lt;li&gt;⛔ the ambulance isn&amp;rsquo;t getting power from the house.
&lt;ul&gt;
&lt;li&gt;⛔ The house plug is bad.&lt;/li&gt;
&lt;li&gt;⛔ The cord is bad.&lt;/li&gt;
&lt;li&gt;⛔ The ambulance plug is bad.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
 &lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Evaluating What We Learned&lt;/p&gt;
&lt;p&gt;We have to assume that the power system from the socket on the wall of the 🚑 to whatever it goes to is fine. It&amp;rsquo;s been sitting still for months, and is unlikely to have had a problem. We&amp;rsquo;re also assuming that the other end of the battery leads are still connected. Both of these are too hard to test, and too unlikely to bother trying.&lt;/p&gt;
&lt;p&gt;The batteries being dead isn&amp;rsquo;t surprising. It explains why we couldn&amp;rsquo;t start. It also raises two questions&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Why are the batteries dead?&lt;/li&gt;
&lt;li&gt;What can we do to give them power?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Normally, plugging it into the wall is all we need to do to give the batteries a trickle-charge that&amp;rsquo;s significant enough to overcome the normal phantom draw.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
 &lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Another Quick Test&lt;/p&gt;
&lt;p&gt;We have a lithium jump start battery pack for the car. It was our belief that it didn&amp;rsquo;t provide enough power to turn over the engine, but it was something we could test quickly. It&amp;rsquo;d be great to be wrong about it.&lt;/p&gt;
&lt;p&gt;When I connected it to the batteries, the ambulance lit up like a Christmas Tree. Thus confirming that the batteries were well connected to the system. Turning the key &amp;ldquo;worked&amp;rdquo;, but as suspected there wasn&amp;rsquo;t nearly enough power to &amp;ldquo;turn over&amp;rdquo; the engine. I left it connected so that it could help the batteries out when we figured out how to get power into them. It drained &lt;em&gt;very&lt;/em&gt; quickly. These emergency lithium jump-start batteries work by providing a lot of power throughput, but they don&amp;rsquo;t actually have a lot of power stored. It&amp;rsquo;s just a short powerful burst until the engine starts and can take over.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
 &lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;New theories needed&lt;/p&gt;
&lt;p&gt;New theory: Power is making it into the ambulance, but not making it into the batteries.&lt;/p&gt;
&lt;p&gt;Batteries don&amp;rsquo;t have separate &amp;ldquo;input&amp;rdquo; and &amp;ldquo;output&amp;rdquo; things. DC power is like water. It just flows through the system, self-levels, and leaks out any &amp;ldquo;holes&amp;rdquo; (things using power) you may have. Since the batteries were well connected (still assuming far end is good) it meant that the problem was likely to be something in the electrical cabinet.&lt;/p&gt;
&lt;p&gt;I believe the batteries also go directly to the starter mechanism, &lt;em&gt;but&lt;/em&gt; we&amp;rsquo;re assuming that that&amp;rsquo;s good, and investigating questions around getting power into them, not getting power to the starter. We need power to exist before we can bother giving it away.&lt;/p&gt;
&lt;p&gt;The problem with this theory is that it is too generic. It helps narrow down the problem, but it doesn&amp;rsquo;t give us anything specific to test, and the system has thousands of wires, a wall of relays, and many other things.&lt;/p&gt;
&lt;p&gt;We went back into the warm, and well lit house to think.&lt;/p&gt;
&lt;p&gt;Dachary proposed that we might have blown a fuse. The problem with this is that there are surprisingly few fuses in this system. Because we believed (reasonably) that all the stuff to go from &amp;ldquo;shore power&amp;rdquo; to the batteries was in the electrical cabinet, the problem with that theory was that neither of us could recall any fuses in there. One wall of the cabinet has a panel that opens behind the driver&amp;rsquo;s seat, and we think there are &lt;em&gt;some&lt;/em&gt; fuses there. Unfortunately the seats don&amp;rsquo;t fold forward and it&amp;rsquo;s a pain to get to even when you can see well. Also, we didn&amp;rsquo;t believe those fuses controlled anything relevant.&lt;/p&gt;
&lt;p&gt;New Theory: blown fuse.&lt;/p&gt;
&lt;p&gt;Currently not worth testing, because we didn&amp;rsquo;t have any likely or easily accessible location to look.&lt;/p&gt;
&lt;p&gt;So, we got out the wiring diagrams&lt;sup id=&#34;fnref1:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;At this point we&amp;rsquo;re thinking that the Inverter and Converter are in the same box. However, I&amp;rsquo;ve been bothered by the fact that it only says &amp;ldquo;Inverter&amp;rdquo; on it. If there is a separate converter I don&amp;rsquo;t know where it is.&lt;/p&gt;
&lt;p&gt;Dachary digs into the wiring diagram while I test something I can&amp;rsquo;t remember - I&amp;rsquo;ve probably just messed up the order of something here. She finds the Inverter, but it doesn&amp;rsquo;t mention a converter. The rest of the diagram wasn&amp;rsquo;t very helpful, but there was a reference to another diagram number though. So, I start hunting for that one. There I find two things: First, a separate mention of the converter, implying that it&amp;rsquo;s a physically separate device. Second, an indication that it&amp;rsquo;s wired in via a standard AC plug. That would have to be one of the plugs in the electrical cabinet.&lt;/p&gt;
&lt;p&gt;I head back out, and start re-examining the cabinet. As I&amp;rsquo;m looking around at the outlets and plugs and wondering where the converter could be I notice a large metal box that I&amp;rsquo;ve mostly been ignoring. It says &amp;ldquo;converter&amp;rdquo; on it. 🤦‍♀️&lt;/p&gt;
&lt;p&gt;I start examining the converter and notice that it has 3 wires going into it. AC is 3 wires (positive, negative, and ground) and DC is 2. Because a Converter is AC to DC this must be where the power comes in. The connector they used has places you can stick multimeter leads and test if it&amp;rsquo;s getting power.&lt;/p&gt;
&lt;p&gt;New theory: Converter isn&amp;rsquo;t getting power.&lt;/p&gt;
&lt;p&gt;I also notice a single automotive blade-style fuse hidden behind where those wires come in. It&amp;rsquo;s impossible to tell if it&amp;rsquo;s blown, and really difficult to access.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
 &lt;!--list-separator--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Closing In&lt;/p&gt;
&lt;p&gt;I grab pliers to try and extract the fuse, and a multimeter to test if it&amp;rsquo;s getting power.&lt;/p&gt;
&lt;p&gt;I dive back into the cold and dark. It&amp;rsquo;s getting power!
I attack the fuse. It&amp;rsquo;s blown.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s a 30 amp fuse too. That&amp;rsquo;s a lot. If it hadn&amp;rsquo;t blown then &amp;ldquo;Bad Things™&amp;rdquo; would have likely resulted. E.g. 🚑 + 🔥… and then maybe 🏠 + 🔥.&lt;/p&gt;
&lt;p&gt;I stand up and reach into the cabinet with spare fuses&lt;sup id=&#34;fnref:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt;, grab a new 30v fuse, slide it in and the whole ambulance lights up again! I check the voltmeter and it&amp;rsquo;s back at the standard charging &amp;amp; running level of 13v, which means the batteries are being fed power now!&lt;/p&gt;
&lt;p&gt;After a couple hours of changing, it started right up.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;
&lt;p&gt;Practicing a considered, and well structured approach to debugging is far more efficient than flailing wildly at random ideas that flit through your brain. It&amp;rsquo;s also very useful outside of software.&lt;/p&gt;
&lt;p&gt;At each step of the way I literally stopped and restated what we knew the known truths to be, and ask what new information we could derive from the theories we&amp;rsquo;d eliminated or confirmed.&lt;/p&gt;
&lt;p&gt;While we didn&amp;rsquo;t do a formal &amp;ldquo;post-mortem&amp;rdquo; to the &amp;ldquo;production incident&amp;rdquo;, we did create &amp;ldquo;action items&amp;rdquo; from it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Buy a new multimeter. It doesn&amp;rsquo;t matter that we have a good one if we can&amp;rsquo;t find it.&lt;/li&gt;
&lt;li&gt;Increase the priority of the existing task to measure, model, and 3D print a custom shroud to improve the water resistance of the 🚑&amp;rsquo;s outside plug. Rainwater in there seems the most likely cause of a problem.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Good debugging and Incident Management procedures help in your everyday life too.&lt;/p&gt;
&lt;p&gt;For a good guide to debugging start with &lt;a href=&#34;https://wizardzines.com/zines/debugging-guide/&#34;&gt;&amp;ldquo;The Pocket Guide To Debuging&amp;rdquo;&lt;/a&gt;, by &lt;a href=&#34;https://jvns.ca&#34;&gt;Julia Evans&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For a good guide to creating your own incident management processes, start with &lt;a href=&#34;https://gracefuldisasters.com/&#34;&gt;Graceful Disasters&lt;/a&gt;, by &lt;a href=&#34;https://masukomi.org&#34;&gt;me&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;afterward&#34;&gt;Afterward&lt;/h2&gt;
&lt;p&gt;(based on internet commentary)&lt;/p&gt;
&lt;p&gt;The electrical systems in modern ambulances are nothing like those in cars, diesel trucks, or RVs. Unless you&amp;rsquo;ve helped manufacture these things, or have spelunked in the wiring of one first hand, your assumptions about how things work are probably wrong. Additionally, each one is a literal one-off-custom build.&lt;/p&gt;
&lt;p&gt;I assure you that it&amp;rsquo;s very easy for a brand new starter battery to go dead in 6 weeks of cold weather if an ambulance isn&amp;rsquo;t plugged in. This makes sense if you understand the regulations these must meet to give you the best chance of survival in some extreme environmental conditions. It makes sense if you understand how they&amp;rsquo;re used by the EMTs and Paramedics.&lt;/p&gt;
&lt;p&gt;Trust me when I tell you, that once we get beyond &amp;ldquo;Electricity 101&amp;rdquo; and Ohm&amp;rsquo;s Law, you should throw your assumptions about how this is wired or constructed out the window. We aren&amp;rsquo;t guessing about how it&amp;rsquo;s wired. We have ridiculously detailed wiring diagrams for this &lt;em&gt;specific&lt;/em&gt; vehicle. Every wire&amp;rsquo;s insulation says what that specific wire is for. We know &lt;em&gt;how&lt;/em&gt; things are connected. We just don&amp;rsquo;t know &lt;em&gt;where&lt;/em&gt; everything is connected. To put it another way. We know that two wires meet at a junction, we just don&amp;rsquo;t know which part of the wall each junction is hidden behind.&lt;/p&gt;
&lt;hr&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;A block heater is basically an electric blanket for your engine. This is especially notable for large diesel engines for three reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;diesel stops being liquid and turns to a gel when it gets cold enough. They actually change the formula in the pumps just before winter temperatures kick in. A diesel engine uses &amp;ldquo;glow plugs&amp;rdquo; to heat the fuel. I don&amp;rsquo;t know what they look like, but they&amp;rsquo;re essentially just little electric heaters in the fuel system. They take a lot of power, and a many minutes to make the diesel ignitable on cold days.&lt;/li&gt;
&lt;li&gt;our engine is so large that even if you do manage to get it started in the cold it takes a long time to heat up all the metal.&lt;/li&gt;
&lt;li&gt;diesel engines don&amp;rsquo;t have spark plugs. They combust the fuel by compressing it, which is harder to do when it&amp;rsquo;s a gel.&lt;/li&gt;
&lt;/ol&gt;
&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;Ambulances have dashboards with a &lt;em&gt;lot&lt;/em&gt; of switches (see below). There&amp;rsquo;s also a voltmeter (the radial-dial). Unsurprisingly an 🚑 has a lot of electrical stuff going on. Unlike most vehicles there&amp;rsquo;s a non-trivial phantom draw. It &lt;em&gt;will&lt;/em&gt; drain its two AGM batteries if it just sits around for a while. This is acceptable, because it was designed to be used literally every day. It&amp;rsquo;s also got a 120v AC input on the side (with a weird plug). We don&amp;rsquo;t drive ours much, but we do keep it plugged in.&lt;/p&gt;
&lt;p&gt;The voltmeter is important because if yours is low, the EMTs and Paramedics in the back are going to have trouble using things like IV bag warmers and having lights to see what they&amp;rsquo;re doing. You want to know early if there&amp;rsquo;s a problem.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2023/12/08/ambulance_dashboard.jpg&#34;
        alt=&#34;a picture of our ambulance dashboard. There are 14 toggle switches, a radial-dial voltmeter, indicator lights, a ham radio, and a ham radio handset&#34;&gt;&lt;figcaption&gt;
          &lt;h4&gt;our ambulance dashboard&lt;/h4&gt;
        &lt;/figcaption&gt;
    &lt;/figure&gt;
&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;Unlike most vehicles every 🚑 has complicated custom wiring. Every ambulance is custom built. What features you get depends mostly on how much your town is willing to spend&lt;sup id=&#34;fnref:6&#34;&gt;&lt;a href=&#34;#fn:6&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;6&lt;/a&gt;&lt;/sup&gt;. Manufacturers need to keep track of what they put into each one so that they know how to fix it if it comes back for repairs. When we got ours, we called up the manufacturer, gave them our Vehicle Identification Number, and asked them to send us a PDF of the wiring diagram for our vehicle.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref1:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:4&#34;&gt;
&lt;p&gt;The ambulance has 2 AGM batteries wired in parallel. There is not a separate &amp;ldquo;house&amp;rdquo; battery and &amp;ldquo;starter&amp;rdquo; battery. Within the US there are strict regulations about being able to maintain temperature in the patient area of an ambulance. Basically you need to be able to keep it cool in the middle of Death Valley in the summer, and you need to be able to keep it warm in the northernmost part of Alaska in the winter. You&amp;rsquo;d need a massive battery to be able to power the heating and cooling systems to achieve this for hours on end. Ambulance manufacturer&amp;rsquo;s don&amp;rsquo;t bother. Instead they just guarantee that that will work &lt;em&gt;while the engine is running&lt;/em&gt;. In my case they accomplished it by using two beefy alternators.&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:5&#34;&gt;
&lt;p&gt;Of course we have spare fuses on hand. A) it&amp;rsquo;s an ambulance with a billion cabinets. B) It would really &lt;em&gt;really&lt;/em&gt; suck to be stuck on the side of the road just because you didn&amp;rsquo;t have a fuse. Especially in a long distance (thousands of miles) trip like the ones we take. B) of course the fuses are right next to the electrical cabinet. Why would you keep them anywhere else?&amp;#160;&lt;a href=&#34;#fnref:5&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:6&#34;&gt;
&lt;p&gt;A new Type III ambulance - the big boxy ones with a van shaped front - starts around $150,000. Most towns sell them after they hit 100,000 miles. That&amp;rsquo;s how we got ours significantly cheaper.&amp;#160;&lt;a href=&#34;#fnref:6&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Red-Black Initiative</title>
      <link>https://weblog.masukomi.org/2023/10/30/red-black-initiative/</link>
      <pubDate>Mon, 30 Oct 2023 00:00:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2023/10/30/red-black-initiative/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#red-black-initiative--rbi&#34;&gt;Red-Black Initiative (RBI)&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#quick-rules-summary&#34;&gt;Quick Rules summary&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#what-you-ll-need-dot&#34;&gt;What You&amp;rsquo;ll need.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-setup&#34;&gt;The Setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#who-goes-next&#34;&gt;Who goes next?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#introducing-new-characters-to-the-fight&#34;&gt;Introducing New Characters to the Fight&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#characters-with-multiple-attacks-or-lair-actions&#34;&gt;Characters With Multiple Attacks or &amp;ldquo;Lair Actions&amp;rdquo;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#keeping-track-of-where-you-are-in-the-initiative&#34;&gt;Keeping track of where you are in the initiative&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#once-per-fight-or-once-per-round&#34;&gt;Once per fight, or once per round?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#using-beads-dice-or-colored-game-tokens-from-a-tabletop-game-dot&#34;&gt;Using beads, dice, or colored game tokens from a tabletop game.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#meta-commentary&#34;&gt;Meta-commentary&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#advantages&#34;&gt;Advantages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#disadvantages&#34;&gt;Disadvantages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#example-usage&#34;&gt;Example usage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#worksheet&#34;&gt;Worksheet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#inspiration&#34;&gt;Inspiration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#why-red-black-initiative&#34;&gt;Why &amp;ldquo;Red-Black&amp;rdquo; Initiative&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#license&#34;&gt;License&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;This document discusses a new&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; form of managing initiative order for Tabletop Role Playing Games without math. It is, like so many game things, a combination of a number of existing ideas.&lt;/p&gt;
&lt;h2 id=&#34;red-black-initiative--rbi&#34;&gt;Red-Black Initiative (RBI)&lt;/h2&gt;
&lt;p&gt;Red-Black initiative does away with the annoying numerical accounting that most games start every conflict with. It allows players to work together to pull off exciting team-up moves. The adversaries&amp;rsquo; actions are less predictable to players. It&amp;rsquo;s pretty fast.&lt;/p&gt;
&lt;h3 id=&#34;quick-rules-summary&#34;&gt;Quick Rules summary&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Token colors represent sides of the conflict. E.g. “We’re black. They’re red.”&lt;/li&gt;
&lt;li&gt;One token for each character on the PC’s side of the engagement, and one token for each adversary, or adversary group.&lt;/li&gt;
&lt;li&gt;Shake the tokens up. Dump them out. Work from left to right grabbing tokens and moving them into a row.  Alternately, put them in a bag, and lay them out in the order you draw them.&lt;/li&gt;
&lt;li&gt;Players decide which character goes when it’s their color. GM decides who goes when it’s their color.  When two or more tokens of the same color appear side by side you can declare if they’re acting simultaneously or one after the other.  &lt;/li&gt;
&lt;li&gt;Characters entering the conflict after it starts are inserted wherever you are in the initiative when they arrive.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;what-you-ll-need-dot&#34;&gt;What You&amp;rsquo;ll need.&lt;/h3&gt;
&lt;p&gt;In order determine initiative you&amp;rsquo;ll need tokens with a color for each side of the conflict. I recommend using glass beads, dice, or tokens from a board game. Because most conflicts involve only two sides playing cards work well too. The only problem is that it&amp;rsquo;s harder to shuffle a short stack of playing cards.&lt;/p&gt;
&lt;h3 id=&#34;the-setup&#34;&gt;The Setup&lt;/h3&gt;
&lt;p&gt;For the sake of discussion let&amp;rsquo;s say that the Player Characters (PCs) are &amp;ldquo;black&amp;rdquo; and their Adversaries are &amp;ldquo;red&amp;rdquo;, and that we&amp;rsquo;re using glass beads. You&amp;rsquo;ll need one black bead for each character on the PC&amp;rsquo;s side of the engagement. For the adversaries you&amp;rsquo;ll need one red bead for each adversary, or group of adversaries. The latter is for games that have mechanics for attacking a group of adversaries as if there were a single target.&lt;/p&gt;
&lt;p&gt;Put them all together. Shake them up or shuffle them. Spread them out in a line.&lt;/p&gt;
&lt;h3 id=&#34;who-goes-next&#34;&gt;Who goes next?&lt;/h3&gt;
&lt;p&gt;Work through the cards from first to last. If it&amp;rsquo;s a black card, players decide which character goes. If it&amp;rsquo;s a red card, the GM decides. When two cards of the same color are next to each other you can decide if they&amp;rsquo;re going sequentially or simultaneously. Do whatever sounds coolest.&lt;/p&gt;
&lt;h3 id=&#34;introducing-new-characters-to-the-fight&#34;&gt;Introducing New Characters to the Fight&lt;/h3&gt;
&lt;p&gt;Often a GM will have reinforcements coming to a fight who arrive later. If there&amp;rsquo;s one, just insert a card of the appropriate color at whatever point in the fight they join. You can just stick them at the end, but sometimes it&amp;rsquo;s just cooler storytelling for them to appear in the middle of a round. If there are multiple characters you can insert all their cards in one block, or you can have the fight one by one. Do whatever makes the most sense, or is going to tell the coolest story.&lt;/p&gt;
&lt;h3 id=&#34;characters-with-multiple-attacks-or-lair-actions&#34;&gt;Characters With Multiple Attacks or &amp;ldquo;Lair Actions&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;Standard characters: Most games just have a character use all their attacks in the same turn. In this case nothing changes.&lt;/p&gt;
&lt;p&gt;Characters that can attack during other characters turns: I&amp;rsquo;d recommend just letting the player manage keeping track of this like they would in any other initiative.&lt;/p&gt;
&lt;p&gt;Lair Actions: Personally I like the idea of using a token for each one. As some actions stop being available, remove a token from the appropriate color. Alternately, just have the DM manage it the same way they already do in D&amp;amp;D, or anything else with similar mechanics.&lt;/p&gt;
&lt;h3 id=&#34;keeping-track-of-where-you-are-in-the-initiative&#34;&gt;Keeping track of where you are in the initiative&lt;/h3&gt;
&lt;p&gt;I like starting with a straight row of cards or tokens, then shifting them up a couple centimeters to indicate that that slot has been used.&lt;/p&gt;
&lt;h3 id=&#34;once-per-fight-or-once-per-round&#34;&gt;Once per fight, or once per round?&lt;/h3&gt;
&lt;p&gt;With physical tokens like glass beads this is very fast. Scoop them up. Shake them up. Dump them on the table. Straighten them out into a line. Since there&amp;rsquo;s no math or accounting you can easily introduce some unpredictability into the game without a bunch of slow and annoying accounting.&lt;/p&gt;
&lt;p&gt;Ultimately this is up to the table. Do what sounds most fun. If you like the unpredictability of not knowing what&amp;rsquo;s who&amp;rsquo;ll go when in the next round, then reset initiative every round. If your table prefers having less things to think about, then just set it up at the beginning.&lt;/p&gt;
&lt;h3 id=&#34;using-beads-dice-or-colored-game-tokens-from-a-tabletop-game-dot&#34;&gt;Using beads, dice, or colored game tokens from a tabletop game.&lt;/h3&gt;
&lt;p&gt;I find this method to be the fastest and easiest because they&amp;rsquo;re easier to pick up than cards, and I can shake, and dump a handful of beads or tokens faster than I can shuffle a very short deck of cards. I just dump them on the table, and make a line out of them moving from left to right. You could also throw them into a bag and pull them one by one, but that&amp;rsquo;d be slower.&lt;/p&gt;
&lt;h2 id=&#34;meta-commentary&#34;&gt;Meta-commentary&lt;/h2&gt;
&lt;h3 id=&#34;advantages&#34;&gt;Advantages&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fast.&lt;/li&gt;
&lt;li&gt;No math.&lt;/li&gt;
&lt;li&gt;Allows players who want to think more tactically to set up cool team-up moves, or sequences of actions that build on each other.&lt;/li&gt;
&lt;li&gt;Visually shows how many of your allies or adversaries will be going, and when.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;disadvantages&#34;&gt;Disadvantages&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;If your players are very passive you may have problems getting them to say &amp;ldquo;ok, I&amp;rsquo;ll go&amp;rdquo;. On the other hand, this may be a useful tool for encouraging them to speak up, and take action.&lt;/li&gt;
&lt;li&gt;Doesn&amp;rsquo;t work with games that have initiative manipulation mechanics. For example, you couldn&amp;rsquo;t use this with Savage Worlds unless you prevented players from taking any of the abilities that allowed them to modify when they, or others go in the round.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;example-usage&#34;&gt;Example usage&lt;/h3&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2023/10/31/worksheet_example_annotated_50percent.jpg&#34;
    alt=&#34;an annotated triptic showing two colors of glass beads spread across the worksheet, the beads ordered into a line, and then the first two beads having been slid up into a different row than the original line of beads.&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Example using red and blue glass beads.&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h3 id=&#34;worksheet&#34;&gt;Worksheet&lt;/h3&gt;
&lt;p&gt;For those who like something to help organize the chaos of a pile of colored tokens, I made a simple worksheet that looks like this.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2023/10/31/red-black-initiative-screenshot.png&#34;
    alt=&#34;a screenshot of my red-black iniative worksheet.&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Red-Black Initiative worksheet screenshot&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Download the &lt;a href=&#34;https://weblog.masukomi.org/misc/2023/10/31/red_black_iniative_worksheet.pdf&#34;&gt;PDF&lt;/a&gt; or &lt;a href=&#34;https://weblog.masukomi.org/static/misc/2023/10/31/red_black_iniative_worksheet.graffle&#34;&gt;OmniGraffle&lt;/a&gt; file.&lt;/p&gt;
&lt;h3 id=&#34;inspiration&#34;&gt;Inspiration&lt;/h3&gt;
&lt;p&gt;The biggest inspiration to Red-Black Initiative is Fantasy Flight Games&amp;rsquo; Genesys System, and Star Wars games use a similar concept. In Genesys each player rolls, and &amp;ldquo;Initiative Slots&amp;rdquo; are assigned based on how well you rolled, but the slots for the PCs are usable by &lt;em&gt;any&lt;/em&gt; of the PCs, not the one who rolled the number that generated the slot.&lt;/p&gt;
&lt;h3 id=&#34;why-red-black-initiative&#34;&gt;Why &amp;ldquo;Red-Black&amp;rdquo; Initiative&lt;/h3&gt;
&lt;p&gt;&amp;hellip;especially if the color doesn&amp;rsquo;t matter? Because it sounds good, because playing cards are red and black, and because I&amp;rsquo;m a programmer and &amp;ldquo;&lt;a href=&#34;https://en.wikipedia.org/wiki/Red%E2%80%93black_tree&#34;&gt;Red-Black Trees&lt;/a&gt;&amp;rdquo; are a thing for us.&lt;/p&gt;
&lt;h3 id=&#34;license&#34;&gt;License&lt;/h3&gt;
&lt;p&gt;The text above is distributed under the &lt;a href=&#34;https://creativecommons.org/public-domain/cc0/&#34;&gt;Creative Commons Zero license&lt;/a&gt;. This basically means you can do whatever you want with it and you don&amp;rsquo;t have to give me credit. I only bother because there&amp;rsquo;s a chance you may end up working with a company whose lawyers are concerned about you being allowed to use text / ideas someone else came up with.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;There has been a ton of creative thinking in around TTRPG mechanics for the past 40+ years. It is not only possible, but probable, that someone else came up with this idea long ago, and I&amp;rsquo;m just unaware of it. If you know of an older source I can point to, please let me know, and I&amp;rsquo;ll update this accordingly, and add in any relevant info from their version.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Sexism in Tabletop Role Playing Games</title>
      <link>https://weblog.masukomi.org/2023/07/06/sexism-in-tabletop-role-playing-games/</link>
      <pubDate>Thu, 06 Jul 2023 00:00:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2023/07/06/sexism-in-tabletop-role-playing-games/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#definitions&#34;&gt;Definitions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#context&#34;&gt;Context&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-game-and-its-problems-dot&#34;&gt;The game, and its problems.&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#the-male-gaze&#34;&gt;The Male Gaze&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#comparative-representation&#34;&gt;Comparative Representation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#context-matters&#34;&gt;Context Matters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#contributors&#34;&gt;Contributors&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#wrap-up&#34;&gt;Wrap-up&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#it-doesn-t-have-to-be-like-this-dot&#34;&gt;It doesn&amp;rsquo;t have to be like this.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#summary&#34;&gt;Summary&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;This post uses a recent Tabletop Role Playing Game (TTRPG) as a concrete example of the problems that still remain within our community. When it comes to including women, it seems that there are many things that &amp;ldquo;shouldn&amp;rsquo;t need to be said&amp;rdquo; but apparently still do. This post will say most of them.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re a guy who enjoys TTRPGs, I ask that you read this with an open mind. If you find yourself feeling defensive, or upset, that&amp;rsquo;s a sign of internalized sexism or misogyny. It means you&amp;rsquo;ve got work to do, but that&amp;rsquo;s ok. We&amp;rsquo;ve all got internalized, and unexamined biases. The first step in ridding ourselves of them, is realizing they exist.&lt;/p&gt;
&lt;p&gt;Diverse perspectives make for better experiences, and TTRPGs are an amazing tool for exploring aspects of our personality, and taking a moment to imagine what it&amp;rsquo;s like to live as someone else with different perspectives. Women are ~50% of the human population. We &lt;em&gt;need&lt;/em&gt; to be including them in our play, especially when that play is imagining worlds that are also populated with women.&lt;/p&gt;
&lt;h2 id=&#34;definitions&#34;&gt;Definitions&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;misogyny: prejudice against women&lt;/li&gt;
&lt;li&gt;sexism: discriminatory or abusive behavior towards members of the opposite sex&lt;/li&gt;
&lt;li&gt;male gaze: the male gaze is the act of depicting women and the world in the visual arts and in literature from a masculine, heterosexual perspective that presents and represents women as sexual objects for the pleasure of the heterosexual male viewer.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;context&#34;&gt;Context&lt;/h2&gt;
&lt;p&gt;A while ago a backed a Kickstarter for a new TTRPG. The cover had a bit of &amp;ldquo;male gaze&amp;rdquo;, but while I don&amp;rsquo;t like it, i need to accept that this is still a male dominated community, and &amp;ldquo;sex sells&amp;rdquo;. It&amp;rsquo;s not uncommon to have a book that&amp;rsquo;s all &amp;ldquo;look boobs!&amp;rdquo; on the cover but actually pretty neutral inside. I crossed my fingers, and backed it.&lt;/p&gt;
&lt;p&gt;What I received in the end made me &lt;em&gt;very&lt;/em&gt; uncomfortable. The core ruleset it was trying to convey had promise, but i set it aside because of that discomfort. The other day I picked it back up because it aligned with some of the game development research I was doing. I told myself I could &amp;ldquo;push through&amp;rdquo; the &amp;ldquo;male gaze&amp;rdquo; that permeated the pages, extract the core info, and never look at it again. In the end I gave up. I was too upset. I was too grossed out.&lt;/p&gt;
&lt;p&gt;Even if this game was amazing, I would never feel comfortable asking the women I play with to look at it.&lt;/p&gt;
&lt;p&gt;If this came out in the 80&amp;rsquo;s, that would be the end of it. There was a &lt;em&gt;lot&lt;/em&gt; of that back then. But this came out last year. We&amp;rsquo;re supposed to know better. Even those of us who grew up with Red Box D&amp;amp;D should have learned by now that you don&amp;rsquo;t treat women like sex objects.&lt;/p&gt;
&lt;p&gt;Unfortunately, it seems we don&amp;rsquo;t know better, and I&amp;rsquo;ve encountered other recent cases of men in our community getting defensive when you dare to point it out.&lt;/p&gt;
&lt;p&gt;It should also be noted that I grew up in art classes. I have seen, and appreciated countless depictions of nude women. I have absolutely &lt;em&gt;no&lt;/em&gt; problem with sexy images of human bodies be they male, female, or anywhere in between.&lt;/p&gt;
&lt;p&gt;It should also be noted that I am very specifically &lt;em&gt;not&lt;/em&gt; addressing issues of racism, sexuality, or gender identity in this.&lt;/p&gt;
&lt;h2 id=&#34;the-game-and-its-problems-dot&#34;&gt;The game, and its problems.&lt;/h2&gt;
&lt;p&gt;If I could write this without calling out the game I would. I don&amp;rsquo;t want to slag it or it&amp;rsquo;s creator. I want to believe that its creator is a good guy, who just never stopped to think about these problems.&lt;/p&gt;
&lt;p&gt;I need to use concrete examples though. Without concrete examples people will just nod their heads and say &amp;ldquo;of course&amp;rdquo;. &amp;ldquo;Of course women should be depicted equally&amp;rdquo;. My hope is that by using these concrete examples and explaining why they&amp;rsquo;re bad, some men will learn how their choices can be harmful, and contributing to the lack of women at our tables.&lt;/p&gt;
&lt;h3 id=&#34;the-male-gaze&#34;&gt;The Male Gaze&lt;/h3&gt;
&lt;p&gt;This is, by far, the biggest problem. The thing is, &amp;ldquo;sexy women&amp;rdquo; aren&amp;rsquo;t inherently bad. If you want a game filled with depictions of sexy people, go for it. As a species humans are  sexually motivated. We think about it. We yearn for it. Most people &lt;em&gt;enjoy&lt;/em&gt; seeing sexy depictions of the kind of folks they find sexy, at least when they&amp;rsquo;re in a safe space and it&amp;rsquo;s their choice to see them. The problem is if it&amp;rsquo;s &lt;em&gt;only&lt;/em&gt; sexy women. The context you put them in can make it even worse.&lt;/p&gt;
&lt;p&gt;So, let&amp;rsquo;s start with the biggest example. This is a rules-light game with three &amp;ldquo;archetypes&amp;rdquo;: Combat, Academic, and Social. Here&amp;rsquo;s how they&amp;rsquo;re depicted.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2023/07/06/fast_archetypes.jpg&#34;
    alt=&#34;The pages for the combat, academic, and social archetypes. The character displayed on combat is a genderless alien with a big gun. The character displayed for academic is a woman standing with her hips emphasised and her torso leaning forwards to expose her breasts. She&amp;#39;s wearing thigh high boots, panties, and some implausible bone bra that has fingers holding from the sides, and carries a spear. The character for social is wearing fishnet stockings and beaded bikini style lingere&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;There&amp;rsquo;s &lt;em&gt;so&lt;/em&gt; much to unpack here. The &amp;ldquo;combat&amp;rdquo; character is an alien so they may not be &amp;ldquo;male&amp;rdquo; but most people would assume &amp;ldquo;male&amp;rdquo;. By depicting the female &amp;ldquo;academic&amp;rdquo; in a thoroughly sexualized manner we devalue a woman&amp;rsquo;s ability to be respected for her mind. It says &amp;ldquo;sure, she may have an education, but who cares! Check out her tits!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Social, is actually worse once you start to read the text.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A charismatic type would be someone who is outgoing, entertaining, and utilizes their personality to affect the world around them. Entertainers, bards, dancers, and whores would be examples of an entertainer class.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;First off, it talks about using their personality to effect the world around them but places it next to an image of a woman who&amp;rsquo;s obviously doing some sort of sexy dance or pose to effect the people around her. So, the obvious implication is that a woman&amp;rsquo;s personality is her tied to sexiness.&lt;/p&gt;
&lt;p&gt;Then we come to &amp;ldquo;whores&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Women are &lt;em&gt;never&lt;/em&gt; &amp;ldquo;whores&amp;rdquo;. It is an unquestionably derogatory word, and has been since long before this century started. Women may be sex workers, but they are &lt;em&gt;never&lt;/em&gt; whores. In the USA, guys who have lots of sex are revered by other men. Women who have lots of sex are looked down upon and called &amp;ldquo;whores&amp;rdquo; or &amp;ldquo;sluts&amp;rdquo; by everyone.&lt;/p&gt;
&lt;p&gt;I should not have to say this, but engaging in sex never makes you a &amp;ldquo;whore&amp;rdquo; or a &amp;ldquo;slut&amp;rdquo;. We are sexual creatures. It is normal for humans of all genders to want to engage in it.&lt;/p&gt;
&lt;p&gt;This negative association of women and sex is also displayed in the &amp;ldquo;Erotic Arts&amp;rdquo; Skill.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Erotic Arts
The character is adept at utilizing the services of sex, relaxation, and therapy.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The fact that &amp;ldquo;sex&amp;rdquo;, &amp;ldquo;relaxation&amp;rdquo;, and &amp;ldquo;therapy&amp;rdquo; are all considered &amp;ldquo;erotic arts&amp;rdquo; is both disturbing and telling. While &amp;ldquo;&lt;a href=&#34;https://en.wikipedia.org/wiki/Sex_therapy&#34;&gt;sex therapy&lt;/a&gt;&amp;rdquo; is a thing, and sex can be both relaxing and therapeutic, relaxation and therapy are generally &lt;em&gt;very&lt;/em&gt; asexual practices. They&amp;rsquo;re also incredibly valuable practices to mental health. You should be able to relax without it being sexual or erotic. This is even more true for therapy.&lt;/p&gt;
&lt;p&gt;This tells us that sex is a tool. The fact that the only sexualized characters in the book are female tells us that sex is a tool that women use. While there are no depictions of relationships in this book, it&amp;rsquo;s pretty clear that the implication is that women use this tool on or against men.&lt;/p&gt;
&lt;h3 id=&#34;comparative-representation&#34;&gt;Comparative Representation&lt;/h3&gt;
&lt;p&gt;This book follows the not-uncommon trend of visually depicting a handful of archetypical characters in multiple scenes.&lt;/p&gt;
&lt;p&gt;The men are always fully clothed, or covered in armor. The only exception is the Orc adversary who is depicted as a more primitive barbarian in an armored loincloth. I am very specifically &lt;em&gt;not&lt;/em&gt; going to dig into the racist surrounding that particular trope.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a typical guy&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2023/07/06/card_player.png&#34;
    alt=&#34;a close up of a man at a card table holding 2 cards in his hand. he&amp;#39;s wearing a coat, and a t-shirt. There is absolutely nothing sexual about this depiction of him. The camera looks from between the shoulders of two aliens that are also, not even remotely sexualized.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Here&amp;rsquo;s the woman who gets most of the images&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2023/07/06/jumping_female_fighter.png&#34;
    alt=&#34;a woman has lept into the air holding a halberd. she wears strategically placed strips of cloth that have no chance of retaining her large breasts when she lands. her legs are bare and spread towards the camera.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;The other main female character is wearing a victorian era dress with a tight corset pushing up and exposing her cleavage. Essentially every depiction of a woman in this involves prominent cleavage. Even the woman beaten up and laying in a hospital bed in multiple casts and bandages is displaying cleavage.&lt;/p&gt;
&lt;p&gt;Again, it&amp;rsquo;s ok to depict sexy women, but not if it&amp;rsquo;s &lt;em&gt;only&lt;/em&gt; the women who are sexy. Men need to be depicted equally. If sexy people are important to your game then you need sexy &lt;em&gt;people&lt;/em&gt; not sexy &lt;em&gt;women&lt;/em&gt;. If they&amp;rsquo;re not important, then don&amp;rsquo;t emphasize sexiness. Also, having 20 sexy women and one sexy guy is not equal representation. It still says &amp;ldquo;women are sex objects&amp;rdquo; not &amp;ldquo;people can be sexy&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;In the rest of this book I believe there are only 4 other images in the book that don&amp;rsquo;t show off a woman&amp;rsquo;s chest or ass. One is a very reasonable depiction of a female doctor. One is an old-fashioned maid. One is a genre mash-up with minimal cleavage.&lt;/p&gt;
&lt;p&gt;The last one is a problem.&lt;/p&gt;
&lt;h3 id=&#34;context-matters&#34;&gt;Context Matters&lt;/h3&gt;
&lt;p&gt;Yes, this book depicts strong women. However, all the images of a woman doing something dramatic and strong are also images of women flaunting their tits and/or ass&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;In addition to the many depictions of imaginary characters, there are some depictions of the people playing the game. One is young black man. He&amp;rsquo;s fairly average looking and - from my perspective - there&amp;rsquo;s nothing particularly notable about his depictions.&lt;/p&gt;
&lt;p&gt;The other is a fat girl.&lt;/p&gt;
&lt;p&gt;I have chosen that word, with all of its negative connotations very specifically. In this book imaginary women are sexy, powerful, and always displaying improbable amounts of cleavage. Women in the real world are fat.&lt;/p&gt;
&lt;p&gt;To be clear, I actively &lt;em&gt;want&lt;/em&gt; more positive depictions of big girls in media. I &lt;em&gt;want&lt;/em&gt; to see games that say &amp;ldquo;Yes, we want all types of people with all types of bodies to play!&amp;rdquo; Representation is important for &lt;em&gt;everyone&lt;/em&gt;, but context matters. And the context here says &amp;ldquo;real girls are fat and unsexy&amp;rdquo;. Note that the chest which was nigh-impossible to avoid in all the other depictions of women, is hidden, despite the fact that big girls, by definition, have more boob to flaunt.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2023/07/06/fat_girl.png&#34;
    alt=&#34;a fat east-asian woman of indeterminate age smiles behind imaginary characters while she rolls a die. It&amp;#39;s hard to make out what she&amp;#39;s wearing but it appears to be a white tank-top.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;All women are weak.&lt;/p&gt;
&lt;p&gt;In this book male and female adversaries are depicted as getting beaten up, shot, mauled, etc. There is one depiction of a male hero being hurt, but it&amp;rsquo;s a combo image explaining a rule where you can undo something bad happening to your character. In other words, the guy doesn&amp;rsquo;t &lt;em&gt;actually&lt;/em&gt; get hurt.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2023/07/06/undoing_damage.png&#34;
    alt=&#34;a split image. In the left half a man takes a sword to the gut. In the right half he&amp;#39;s shown deftly dodging the same blow.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;I believe that literally every other image of a hero who has taken damage is a woman.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2023/07/06/woman_lies_hurt_man_defends.png&#34;
    alt=&#34;our sexy heroine with strategically placed cloth lies unconscious and bleeding on stones. We can can easily see the bottom half of her breasts. A man in armor stands in the distance between her and a dragon.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;One can debate if the man in that image was defending her, or simply fighting the dragon, but this image makes it pretty clear.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2023/07/06/protecting_the_woman.png&#34;
    alt=&#34;a woman in a victorian dress crouches with a magical flame in her hand. Her back is to a large orc who is swinging a sword at her, but a man in armor has jumped in to take the blow instead.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;In this image the man is literally &amp;ldquo;Taking damage for an ally&amp;rdquo;. That&amp;rsquo;s the title of this section of the book. He has jumped in to protect her from the primitive looking orc. Once again, I&amp;rsquo;m ignoring the inherent racism with the orc here. What&amp;rsquo;s important for this article is that it&amp;rsquo;s very clearly showing that women are the ones who need protecting. Women repeatedly show their weakness by getting beaten bloody, while men remain strong and protective.&lt;/p&gt;
&lt;p&gt;There are zero images of women protecting men.&lt;/p&gt;
&lt;p&gt;There are zero images of fantasy women who aren&amp;rsquo;t explicitly &amp;ldquo;sexy&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;There are zero strong female characters depicted who don&amp;rsquo;t eventually get beaten to a pulp.&lt;/p&gt;
&lt;h3 id=&#34;contributors&#34;&gt;Contributors&lt;/h3&gt;
&lt;p&gt;According to the credits, there were no women involved in the creation, or play-testing of this game. It is painfully clear that there was no sensitivity reading done.&lt;/p&gt;
&lt;p&gt;Women &lt;em&gt;need&lt;/em&gt; to be included in &lt;em&gt;every&lt;/em&gt; aspect of our games.&lt;/p&gt;
&lt;h2 id=&#34;wrap-up&#34;&gt;Wrap-up&lt;/h2&gt;
&lt;h3 id=&#34;it-doesn-t-have-to-be-like-this-dot&#34;&gt;It doesn&amp;rsquo;t have to be like this.&lt;/h3&gt;
&lt;p&gt;Here&amp;rsquo;s a random selection of female&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; characters from &lt;a href=&#34;https://paizo.com&#34;&gt;Paizo&amp;rsquo;s&lt;/a&gt; Pathfinder game. All of these are powerful looking characters. &lt;em&gt;None&lt;/em&gt; of these are powerful because of their sex. They&amp;rsquo;re just bad-ass looking characters who happen to be female.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2023/07/06/pathfinder_women.jpg&#34;
    alt=&#34;4 illustrations of women from paizo. the first is a cleric wering many robes, carring a scimatar, and a holy symbol. The only skin you can see is her face and hands. You can see the shape of breasts, but they are in no way emphasized. The second is a ranger wearing studded leather armor and holding a bow. The visible skin is on face, and hands, as well as a tiny bit of chest skin but no cleavage is visible, and the breats aren&amp;#39;t emphasized. The third is a person who is either female or non-binary, and completely covered in armor. They are staring daggers at the viewer. The fourth  is a tiefling. Their clothes are open at the chest but while they do show chest skin they stop before displaying cleavage. The skin of their arms and face is visible and they are holding a martial arts pose with both arms and one leg raised.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Again, there&amp;rsquo;s nothing wrong with depicting women who are sexy, or are trying to act sexy. But women can&amp;rsquo;t be defined and thus valued for their sexiness alone.&lt;/p&gt;
&lt;h3 id=&#34;summary&#34;&gt;Summary&lt;/h3&gt;
&lt;p&gt;I didn&amp;rsquo;t cover all the problems in this book, both because I&amp;rsquo;m too upset, and because it&amp;rsquo;d be &amp;ldquo;beating a dead horse&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;There is no excuse for this in the 21st century.&lt;/p&gt;
&lt;p&gt;I recognize that lots of guys have internalized sexism and misogyny. We take on the values of the people we spend time with. If you don&amp;rsquo;t spend time with women, or people who care about them, you won&amp;rsquo;t be aware of your biases. To a degree that&amp;rsquo;s ok. That&amp;rsquo;s human nature. What&amp;rsquo;s important is that once you&amp;rsquo;ve had those biases pointed out, you acknowledge them, and work on eradicating them.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll never please everyone, but when creating a game for others - or even just a space for others to come and &lt;em&gt;play&lt;/em&gt; games - making people feel welcome and comfortable, regardless of their gender is the bare minimum.&lt;/p&gt;
&lt;p&gt;I should not have to say this, but women are people. Women are important. Women and men are equal&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;. Women&amp;rsquo;s opinions are valid. Women&amp;rsquo;s needs are valid.&lt;/p&gt;
&lt;p&gt;To ignore the needs and comfort of women is to say that they aren&amp;rsquo;t valid, or valued by you.&lt;/p&gt;
&lt;p&gt;We &lt;em&gt;must&lt;/em&gt; take women into account when creating games and playing games. We must ask their opinions. We must listen to them. We must make gaming a safe space for them. We need to acknowledge that our personal perspective on what&amp;rsquo;s &amp;ldquo;acceptable&amp;rdquo; or &amp;ldquo;good&amp;rdquo; is not shared by everyone. Things that we think are &amp;ldquo;fine&amp;rdquo; may make the people around us very uncomfortable.&lt;/p&gt;
&lt;p&gt;Everything about this article is depressing and saddening.&lt;/p&gt;
&lt;p&gt;Everyone has mothers, sisters, aunts, grandmothers, and/or daughters, and all of those women should feel be comfortable at our gaming tables. Do we really think it&amp;rsquo;s appropriate to teach our daughters that being an entertainer means being a &amp;ldquo;whore&amp;rdquo;?! That sex is a tool they should use against men?! That they can&amp;rsquo;t be strong without a man to protect them?!&lt;/p&gt;
&lt;p&gt;Fuck all of that.&lt;/p&gt;
&lt;p&gt;All of that sexist and  mysogynistic bullshit has ruined what might actually be a decent game. I wouldn&amp;rsquo;t know. I would &lt;em&gt;never&lt;/em&gt; ask a person I respected to go.&lt;/p&gt;
&lt;p&gt;I feel gross for having given money to the creation of this, so I&amp;rsquo;ve made a donation to &lt;a href=&#34;https://www.futureswithoutviolence.org/&#34;&gt;Futures Without Violence&lt;/a&gt;. The portrayals of women in this book, and books like it always result in harm. I hope that maybe my contribution can help offset a little bit of the damage done by supporting this game&amp;rsquo;s creation.&lt;/p&gt;
&lt;p&gt;If you want to discuss TTRPGs and how we can make them better for women and everyone else, you can find me on mastodon at &lt;a href=&#34;https://dice.camp/@masukomi&#34;&gt;@masukomi@dice.camp&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Yes, there are some depictions of women being powerful where their cleavage is obscured. In most of these the woman is hurt, and there are none where we haven&amp;rsquo;t already seen that cleavage and don&amp;rsquo;t have it in our minds.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;The third character may be non-binary. I don&amp;rsquo;t know their backstory.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;Some ass-hole is going to read this and say, &amp;ldquo;not physically&amp;rdquo;. Riria Ropata lifted 599Kg (1320 Lbs) in Women&amp;rsquo;s Powerlifting in the Oceania Championships in Australia. Literally every time a women has beaten the men at combined olympic sports they have divided the competition into male and female categories. Women kick ass physically too. So please, take your ignorant bullshit somewhere else.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>The Remarkable 2 Tablet</title>
      <link>https://weblog.masukomi.org/2023/07/04/the-remarkable-2-tablet/</link>
      <pubDate>Tue, 04 Jul 2023 00:00:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2023/07/04/the-remarkable-2-tablet/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#the-remarkable-2-e-ink-notebook&#34;&gt;The Remarkable 2 e-ink notebook&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#summary&#34;&gt;Summary&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#context&#34;&gt;Context&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-search&#34;&gt;The Search&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-review&#34;&gt;The Review&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#why-it-s-better-than-paper&#34;&gt;Why It&amp;rsquo;s Better Than Paper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#pens-brushes-etc-dot&#34;&gt;Pens, brushes, etc.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#getting-things-on-and-off-it&#34;&gt;Getting Things On and Off it&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#styluses&#34;&gt;Styluses&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#reading-pdfs&#34;&gt;Reading PDFs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#gotchas_and_warnings&#34;&gt;Gotchas &amp;amp; Warnings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#final-thoughts&#34;&gt;Final Thoughts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#bonus-discovery&#34;&gt;Bonus Discovery&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;the-remarkable-2-e-ink-notebook&#34;&gt;The Remarkable 2 e-ink notebook&lt;/h2&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2023/07/04/remarkable_close_up.png&#34;
    alt=&#34;remarkable 2 promotional image&#34;&gt;
&lt;/figure&gt;

&lt;h3 id=&#34;summary&#34;&gt;Summary&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;If&lt;/em&gt; you are the type of person who already takes a lot of handwritten notes in notebooks you&amp;rsquo;ll probably love it. Everyone else should probably skip it.&lt;/p&gt;
&lt;p&gt;I &lt;em&gt;am&lt;/em&gt; the type of person who already took lots of handwritten notes in notebooks, and I am beyond thrilled with this.&lt;/p&gt;
&lt;h3 id=&#34;context&#34;&gt;Context&lt;/h3&gt;
&lt;p&gt;I am picky about pens. I am picky about paper. My notebook of choice is the &lt;a href=&#34;https://www.jetpens.com/Rhodia-Webnotebook-A5-5.5-x-8.25-Dot-Grid-Black/pd/7855&#34;&gt;Rhodia Webnotebook&lt;/a&gt; with a nice smooth thick lined pen. Sometimes that&amp;rsquo;s a Lammy Safari fountain pen. Sometimes that&amp;rsquo;s just a really nice rollerball with heavy flow. What&amp;rsquo;s important is that I&amp;rsquo;m not happy with any random pen on any random paper.&lt;/p&gt;
&lt;p&gt;I take &lt;em&gt;lots&lt;/em&gt; of notes. I have notebooks filled with research and ideas. If i write something with my hand I learn it better. I also derive a lot of benefit from drawing tables and arrows and having annotations on the side and all those things that only exist with handwritten notes.&lt;/p&gt;
&lt;p&gt;I &lt;em&gt;hate&lt;/em&gt; taking notes on the iPad. I&amp;rsquo;ve never encountered a &amp;ldquo;pen&amp;rdquo; that looked right, or behaved right. Everything looked like crap, and the experience of a stylus on glass is just terrible compared to paper.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m also very light sensitive. I don&amp;rsquo;t like looking at transmissive screens (monitors), but i love reflective screens (e-ink like the kindle).&lt;/p&gt;
&lt;h3 id=&#34;the-search&#34;&gt;The Search&lt;/h3&gt;
&lt;p&gt;For years I&amp;rsquo;ve been wishing for an A4 (~8½ x 11 inch) e-ink tablet (preferably color) that i could read my many PDFs for role playing games on. Those don&amp;rsquo;t really exist (yet) and the few that do are over $1k USD and black and white.&lt;/p&gt;
&lt;p&gt;For reasons that aren&amp;rsquo;t important, I gave up and after watching many glowing YouTube reviews of the Remarkable 2, i gave in and bought a used one on eBay.&lt;/p&gt;
&lt;h3 id=&#34;the-review&#34;&gt;The Review&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&#34;https://remarkable.com/&#34;&gt;reMarkable 2&lt;/a&gt; is a truly impressive tool for note-taking. That is the only thing it does, and it does it very well.&lt;/p&gt;
&lt;p&gt;Writing on this is completely unlike writing on an iPad, or other glass tablets. It&amp;rsquo;s not as good as your favorite paper, and pen, but it is as good as decent paper and a decent pen.&lt;/p&gt;
&lt;h4 id=&#34;why-it-s-better-than-paper&#34;&gt;Why It&amp;rsquo;s Better Than Paper&lt;/h4&gt;
&lt;p&gt;This is going to sound trivial, and on a standard computer it kind-of is, but for handwriting it&amp;rsquo;s amazing.&lt;/p&gt;
&lt;p&gt;You can just tap undo. You can select a piece of writing / drawing and move it. Rather than scrubbing out something with a digital &amp;ldquo;eraser&amp;rdquo; you can just lasso it and delete. You can copy. You can resize a copy.&lt;/p&gt;
&lt;p&gt;When handwriting quickly it&amp;rsquo;s not uncommon to make a word that&amp;rsquo;s nearly illegible. You &lt;em&gt;could&lt;/em&gt; erase it, like with pencil, and the results &lt;em&gt;are&lt;/em&gt; better than erasing pencil or even good erasable pens like the FrixIon line. However, that&amp;rsquo;s still a lot of back and forth scrubbing. Sometimes it&amp;rsquo;s just easier to tap the erase selection icon, draw a loop around it, and start over.&lt;/p&gt;
&lt;p&gt;You don&amp;rsquo;t need to worry about wasting paper anymore. Did a thought end half-way through a page? It&amp;rsquo;s not a big deal to just start the next one on the next page. You&amp;rsquo;re not wasting anything. There are infinite pages. Similarly, I&amp;rsquo;ve started something half-way down a page, and wanted to have the rest of the thought together on the same page. I&amp;rsquo;ll just select the text, cut it from the page, move to the next page, and paste it there, where I&amp;rsquo;ll have space to finish it off.&lt;/p&gt;
&lt;p&gt;Most of this sounds, unnecessary. We&amp;rsquo;ve all be &amp;ldquo;getting along just fine without it&amp;rdquo; for hundreds of years. Trust me. It&amp;rsquo;s better. It&amp;rsquo;s &lt;em&gt;way&lt;/em&gt; better.&lt;/p&gt;
&lt;h4 id=&#34;pens-brushes-etc-dot&#34;&gt;Pens, brushes, etc.&lt;/h4&gt;
&lt;p&gt;There are a wide variety of choices for drawing tools, and they all &amp;ldquo;feel&amp;rdquo; different. They&amp;rsquo;re also all sensitive to the angle you hold your stylus. As with a pencil or conical-tipped marker, the angle you hold your writing tool at determines the thickness of the line. The amount of pressure you make changes it to. This is true of the iPad too, but on the iPad the result is completely unlike any real pencils or pens unless maybe you&amp;rsquo;re in one of the premium drawing apps. But, I&amp;rsquo;m looking for note-taking capabilities, not creating fancy art pieces. On the reMarkable 2 the results are almost exactly what you expect from physical media.&lt;/p&gt;
&lt;p&gt;The &amp;ldquo;Ballpoint Pen&amp;rdquo;, &amp;ldquo;Fineliner&amp;rdquo;, &amp;ldquo;Marker&amp;rdquo;, etc. all have 3 thickness levels, and a few &amp;ldquo;colors&amp;rdquo; (shades of grey on the reMarkable but color on export). The result is that you&amp;rsquo;re going to find a line that works for you. The Highlighter works a lot like a real one and the exported PDFs are highlighted in color.&lt;/p&gt;
&lt;p&gt;You can draw on this. There are many videos on YouTube that should give you a clue about what it&amp;rsquo;s like. Speaking as someone who grew up in art clases, I wouldn&amp;rsquo;t recommend it. Stick with physical media. This works, but it isn&amp;rsquo;t good.&lt;/p&gt;
&lt;p&gt;That being said, you can export the images as SVGs and clean them up in an app like Adobe Illustrator or Affinity Designer. Note that they look bitmappy and terrible when you first open them up. That&amp;rsquo;s because there&amp;rsquo;s a low-rez rasterized preview image on top of the vector shapes. Just delete the rastered layer and suddenly everything looks better.&lt;/p&gt;
&lt;h4 id=&#34;getting-things-on-and-off-it&#34;&gt;Getting Things On and Off it&lt;/h4&gt;
&lt;p&gt;Getting files on and off of the device works &lt;em&gt;way&lt;/em&gt; better than I expected it to. Turn it on, connect it to your wifi, open the app on your desktop and they just find each other and sync. Add a file in one and it magically shows up on the other.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a &lt;a href=&#34;https://remarkable.com/store/connect&#34;&gt;Remarkable Connect&lt;/a&gt; service you can subscribe to for $3 a month. If you write as much as I do then this is worth it because it means you&amp;rsquo;ll be constantly backing up your writing to the cloud rather than hoping you remember to sync it manually. It just works silently in the background.&lt;/p&gt;
&lt;h4 id=&#34;styluses&#34;&gt;Styluses&lt;/h4&gt;
&lt;p&gt;reMarkble uses the same Wacom stylus technology that all of its competitors use. This means that you don&amp;rsquo;t need to buy their sytlus. It&amp;rsquo;s a perfectly good one, but it&amp;rsquo;s not your only choice. However some styluses may require following some geeky command line instructions to enable their features. See &lt;a href=&#34;#gotchas_and_warnings&#34;&gt;Gotchas &amp;amp; Warnings&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The one that comes with it is pretty good. Feels a lot like holding a pencil. Spend the money on the one with the &amp;ldquo;eraser&amp;rdquo; but be careful with it. That &amp;ldquo;eraser&amp;rdquo; is held on by a very thin piece of plastic at the center and can be easily broken if you drop it and it hits something badly.&lt;/p&gt;
&lt;p&gt;The nibs you get matter. Most of these styluses seem to use interchangeable nibs. The shape and material of them matter. When I got my &lt;a href=&#34;https://us-shop.lamy.com/en_us/digital-writing-lamy-al-star-black-emr.html&#34;&gt;Lamy AL-Star EMR&lt;/a&gt; stylus the nibs that came with it made it feel much closer to writing on glass. I immediately swapped those out. A week later I noticed that the nibs I was using had already developed a chiseled shape to the tip, much like a pencil. There are metal nibs you can get, but I suspect they feel even less like writing on paper. &lt;a href=&#34;https://amzn.to/3XEmsRB&#34;&gt;These cheap 3rd party ones on Amazon&lt;/a&gt; work fine for me and only cost $16.&lt;/p&gt;
&lt;p&gt;My used one came with a broken eraser, so I got the Lamy Al-Star EMR after watching a bunch of stylus reviews. I like the Lamy, because unlike a real pencil, you don&amp;rsquo;t need to flip it around to use the eraser. You can just press the button. Unfortunately, you need to &lt;a href=&#34;https://github.com/isaacwisdom/RemarkableLamyEraser&#34;&gt;install custom software on the tablet&lt;/a&gt; to configure it. I&amp;rsquo;m a programmer, so this isn&amp;rsquo;t a big deal. It&amp;rsquo;s well documented, so a non-geek &lt;em&gt;should&lt;/em&gt; be able to follow the instructions and get it working, but it&amp;rsquo;s definitely &amp;ldquo;sketchy&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;The Lamy is harder to get in the US, so your next best option appears to be the &lt;a href=&#34;https://amzn.to/3NxVir4&#34;&gt;Staedtler Noris Digital&lt;/a&gt;. I can&amp;rsquo;t comment on it, but it&amp;rsquo;s well regarded.&lt;/p&gt;
&lt;p&gt;You can get away with a stylus without an eraser, but I don&amp;rsquo;t recommend it. You&amp;rsquo;ll be happier being able to erase in the traditional means &lt;em&gt;and&lt;/em&gt; with the selection lasso, rather than being forced to always use the selection lasso. Be warned that there are a lot of styluses that mention they&amp;rsquo;re compatible with the reMarkable but &lt;em&gt;do not have an eraser&lt;/em&gt; and don&amp;rsquo;t call that out. Read carefully before buying.&lt;/p&gt;
&lt;h4 id=&#34;reading-pdfs&#34;&gt;Reading PDFs&lt;/h4&gt;
&lt;p&gt;It does a perfectly good job of loading and displaying PDFs, BUT if your PDFs are 8½x11 or A4 they&amp;rsquo;re going to be shrunk down, and hard to read unless you have 20/20 vision. If your goal is to have something you can read large PDFs on, don&amp;rsquo;t get this. Buy a larger tablet from an importer.&lt;/p&gt;
&lt;h4 id=&#34;gotchas_and_warnings&#34;&gt;Gotchas &amp;amp; Warnings&lt;/h4&gt;
&lt;p&gt;You &lt;em&gt;absolutely&lt;/em&gt; need custom PDFs for notetaking. There&amp;rsquo;s a ton to choose from on Etsy for around $6 USD. &lt;a href=&#34;https://hyperpaper.me&#34;&gt;Hyperpaper&lt;/a&gt; lets you generate a customized one that&amp;rsquo;s pretty good, but it&amp;rsquo;s like $20 and it includes sections I don&amp;rsquo;t want.&lt;/p&gt;
&lt;p&gt;The problem is that unlike a traditional notebook you can&amp;rsquo;t flip back to an index at the front. Technically you can, but it&amp;rsquo;s not nearly as fast or easy, and once you get to the index to see &amp;ldquo;oh this topic is on page 167&amp;rdquo; getting to page 167 is just a pain. You need a hyperlinked PDF where you can write subjects on lines that you can then click to go to the page where you write the details.&lt;/p&gt;
&lt;p&gt;If you want Dayplanner or Date based journaling type stuff there are a ton to choose from. If you just want to take notes that aren&amp;rsquo;t inherently tied to a calender your choices are more restricted. I have a Hyperpaper one where I just ignore all the date pages, and &lt;a href=&#34;https://www.etsy.com/listing/1503692035/remarkable-2-notebook-remarkable-2&#34;&gt;this one from Etsy&lt;/a&gt; which is pretty decent. I recommend buying a few and finding one that works for you. Or, if you&amp;rsquo;re geeky, generating your own custom hyperlinked PDF.&lt;/p&gt;
&lt;p&gt;Assorted quick things you should know before buying:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can&amp;rsquo;t search handwriting. You can&amp;rsquo;t do it in a paper notebook either. Having hyperlinked PDFs solves the findability problem though.&lt;/li&gt;
&lt;li&gt;The battery is not replaceable, and like all modern batteries, it&amp;rsquo;ll gradually loose the ability to hold a charge. For this reason you&amp;rsquo;ll want to buy a new one. Buying new also gets you a free year of the Connect service.&lt;/li&gt;
&lt;li&gt;Compared to the glass of modern tablets, the screen is a soft and easy to scratch. You&amp;rsquo;ll definitely want a case.&lt;/li&gt;
&lt;li&gt;You can make custom &amp;ldquo;Paper&amp;rdquo; templates, but loading them requires geekery and you need to re-add them every time the OS updates.&lt;/li&gt;
&lt;li&gt;You can make custom sleep screens, but loading them requires geekery and you need to re-add theme every time the OS updates.&lt;/li&gt;
&lt;li&gt;Styluses with buttons like the Lamy AL-Star EMR require geekery to make the buttons do anything and you&amp;rsquo;ll need to re-do it every time the OS updates.&lt;/li&gt;
&lt;li&gt;Stylus nibs should be considered a consumable item. Cheap 3rd party ones are fine, but writing with a dull nib sucks in exactly the same way as writing with a dull pencil. Keep some replacements on hand. Just like pencils, they come in different hardnesses. Unlike pencils there&amp;rsquo;s no obvious standard to rate the hardness, so you just have to buy some different brands and find what works for you.&lt;/li&gt;
&lt;li&gt;There are lots of cheap cases / covers for it, but I&amp;rsquo;ve yet to see one as nice as the overpriced one that Remarkable sells. I&amp;rsquo;d buy that one myself if I didn&amp;rsquo;t already have the materials required to make a custom leather one.&lt;/li&gt;
&lt;li&gt;The Gestures you use to flip pages don&amp;rsquo;t always work, at least, they don&amp;rsquo;t on mine. Sometimes I can flip pages without problems. Sometimes it takes me 3 tries. It&amp;rsquo;s pretty annoying. The device is good enough in all other respects that this isn&amp;rsquo;t even remotely going to make me stop using it.&lt;/li&gt;
&lt;li&gt;The bottom bezel is larger than it appears. This isn&amp;rsquo;t a problem, but it&amp;rsquo;s like the original iPhones where it just felt like a big swath of wasted space at the bottom.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;final-thoughts&#34;&gt;Final Thoughts&lt;/h4&gt;
&lt;p&gt;This device is absolutely transformative. Literally.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve written probably a hundred pages in it in less than a month. My only regret is that i didn&amp;rsquo;t buy a new one. If anything happens to mine I&amp;rsquo;ll buy a replacement without hesitation. I&amp;rsquo;m somewhat annoyed with the scratches that came on my used one&amp;rsquo;s screen so i may buy another one anyway. It&amp;rsquo;s just that good.&lt;/p&gt;
&lt;h4 id=&#34;bonus-discovery&#34;&gt;Bonus Discovery&lt;/h4&gt;
&lt;p&gt;If you play tabletop role-playing games (think D&amp;amp;D) this thing is amazing for character sheets. It&amp;rsquo;s ok that they get shrunk down. What&amp;rsquo;s important is that you can erase and change the numbers infinitely without mucking up the paper. Make temporary notes. Scratch them out. Whatever. It&amp;rsquo;s awesome. Great for character building too when you need to keep track of all the points you&amp;rsquo;re in the middle of assigning to various things.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>On Federating With Meta</title>
      <link>https://weblog.masukomi.org/2023/07/03/on-federating-with-meta/</link>
      <pubDate>Mon, 03 Jul 2023 00:00:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2023/07/03/on-federating-with-meta/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#tl-dr&#34;&gt;tl;dr:&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#an-explanation&#34;&gt;An explanation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#it-s-already-started&#34;&gt;It&amp;rsquo;s already started&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#going-forward&#34;&gt;Going Forward&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#what-if-they-do-get-a-toehold&#34;&gt;What if they do get a toehold?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#but-what-about-insert-company-here&#34;&gt;But what about [insert company here]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;tl-dr&#34;&gt;tl;dr:&lt;/h2&gt;
&lt;p&gt;Meta and Google are existential threats to the continued existence of Mastodon (and friends).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;An existential threat is a threat to a people’s existence or survival. - &lt;a href=&#34;https://www.britannica.com/dictionary/eb/qa/the-meaning-of-existential&#34;&gt;The Brittanica Dictionary (editorial)&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The &lt;em&gt;best&lt;/em&gt; way to guarantee the death of the things we love about Mastodon (and friends) is to allow Meta or Google to gain a &lt;a href=&#34;toehold&#34;&gt;toehold&lt;/a&gt; in the Fediverse.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re an instance admin who feels similarly, please add your name to the &lt;a href=&#34;https://fedipact.online/&#34;&gt;Anti-Meta Fedipact&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;an-explanation&#34;&gt;An explanation&lt;/h2&gt;
&lt;p&gt;I see no future in which Meta or Google embracing the Fediverse will not result in eventual &amp;ldquo;extension&amp;rdquo; and &amp;ldquo;extinguishing&amp;rdquo;. There is more than enough history to go on.&lt;/p&gt;
&lt;p&gt;If you have not read it already I&amp;rsquo;d strongly recommend you read &amp;ldquo;&lt;a href=&#34;https://ploum.net/2023-06-23-how-to-kill-decentralised-networks.html&#34;&gt;How to Kill a Decentralized Network (such as the Fediverse)&lt;/a&gt;&amp;rdquo;. Its a story by a Google employee who worked with them when they adopted XMPP (Jabber). If you don&amp;rsquo;t know already, it was a relatively popular federated messaging service that had a reasonably decent install base but hadn&amp;rsquo;t taken over the world yet. It supported group and direct messages. Mastodon, meanwhile, is a federated messaging service with group and direct messages and a reasonably decent install base that hasn&amp;rsquo;t taken over the world yet. The definition of &amp;ldquo;group&amp;rdquo; may be a little different but you get the point. Google embraced it, slightly extended it, and then killed it.&lt;/p&gt;
&lt;p&gt;Email is a federated messaging service. Unlike Jabber or Mastodon it pretty much &lt;em&gt;had&lt;/em&gt; taken over the world before Google made GMail. It&amp;rsquo;s too entrenched to kill off entirely, &lt;em&gt;but&lt;/em&gt; they&amp;rsquo;ve done a very good job of coming close. Google &amp;ldquo;embraced&amp;rdquo; email, then they &amp;ldquo;extended&amp;rdquo; it by creating their own modern API that developers could use instead of IMAP or POP to communicate with their servers. IMAP and POP are both terrible to work with by modern standards. People who care enough about email to write an app for it quickly realize that using the GMail API will not only be &lt;em&gt;way&lt;/em&gt; easier but also give them better results, &lt;em&gt;and&lt;/em&gt; access to millions of potential users.&lt;/p&gt;
&lt;p&gt;The end result is that all the cool new ideas that people come up with get implemented in a way that &lt;em&gt;only&lt;/em&gt; works for GMail. Because all the cool new things you want to use only work with GMail everyone - even businesses - start signing up for GMail accounts. If it wasn&amp;rsquo;t for Microsoft - and thus Outlook - being so entrenched I&amp;rsquo;m convinced email as we know it would be dead.&lt;/p&gt;
&lt;h2 id=&#34;it-s-already-started&#34;&gt;It&amp;rsquo;s already started&lt;/h2&gt;
&lt;p&gt;The leaks from the secret (contents under NDA) meeting between admins of large / significant Fediverse servers and Meta suggest that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Some large server admins will be offered financial compensation for federating with Meta&lt;/li&gt;
&lt;li&gt;Meta would get to set the moderation policy if admins agreed to compensation&lt;/li&gt;
&lt;li&gt;Fediverse admins would have the option of including Meta advertisements in their federated feed and receive a cut of the profits from those.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There is &lt;em&gt;no possible&lt;/em&gt; way this ends up being good for the Fediverse.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Meta&amp;rsquo;s moderation policies are crap.&lt;/li&gt;
&lt;li&gt;Meta&amp;rsquo;s ability to moderate is crap.&lt;/li&gt;
&lt;li&gt;Meta refuses to provide care for the mental health of the moderators they pay to go through an endless stream of horrific images (torture, pedophilia, rape, etc.) and incredibly cruel words. &lt;a href=&#34;https://www.theverge.com/2019/2/25/18229714/cognizant-facebook-content-moderator-interviews-trauma-working-conditions-arizona&#34;&gt;This article&lt;/a&gt; describes just what a terrible job it is.&lt;/li&gt;
&lt;li&gt;We explicitly do not want ads in our feeds.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The &lt;em&gt;only&lt;/em&gt; good thing is financial support for server admins who need it because Mastodon is &lt;a href=&#34;inefficient&#34;&gt;horribly inefficient&lt;/a&gt; and people are not good about actually supporting their server admins financially. Its understandable since we&amp;rsquo;ve had services like this for free for so long - because &lt;em&gt;we&lt;/em&gt; were the thing being sold.&lt;/p&gt;
&lt;h2 id=&#34;going-forward&#34;&gt;Going Forward&lt;/h2&gt;
&lt;p&gt;The only &lt;em&gt;real&lt;/em&gt; solution to this is a truly distributed system. Not federated, but &lt;em&gt;distributed&lt;/em&gt;. Unfortunately there are no good (IMNSHO) distributed solutions available right now.&lt;/p&gt;
&lt;p&gt;Right now, the Fediverse is our &lt;em&gt;best&lt;/em&gt; option. We have a &lt;em&gt;very&lt;/em&gt; slim chance to ward off the colonizers.&lt;/p&gt;
&lt;p&gt;If we want to have &lt;em&gt;any&lt;/em&gt; hope of protecting our communities from fascism, racism, and simple advertising we have to do three things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Refuse to Federate with Meta.&lt;/li&gt;
&lt;li&gt;Refuse to Federate with Google.&lt;/li&gt;
&lt;li&gt;Financially support our server admins if we can afford to.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;what-if-they-do-get-a-toehold&#34;&gt;What if they do get a toehold?&lt;/h2&gt;
&lt;p&gt;If Meta or Google get a reasonable toehold in the Fediverse we&amp;rsquo;re doomed. It&amp;rsquo;s just a question of how quickly.&lt;/p&gt;
&lt;p&gt;First people will connect with friends and family who&amp;rsquo;ve been stuck in Facebook. Social bonds will be (re)formed. As time goes on those bonds will strengthen, and it will be harder for admins to get away with defederating from those servers without massive uproar from their users. Especially on large servers where the users specifically don&amp;rsquo;t care about finding a good community of like minded people online.&lt;/p&gt;
&lt;h2 id=&#34;but-what-about-insert-company-here&#34;&gt;But what about [insert company here]&lt;/h2&gt;
&lt;p&gt;Tumblr has promised to add ActivityPub support. They&amp;rsquo;re not small, and I don&amp;rsquo;t care at all. There is no evidence to suggest that Tumblr&amp;rsquo;s adoption of ActivityPub will result in an &amp;ldquo;embrace, extend, extinguish&amp;rdquo; strategy or a flood of terrible content. Tumblr seems to be a good actor overall.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://micro.blog/&#34;&gt;Micro.blog&lt;/a&gt; added Fediverse support a while ago. Even if we ignore the fact that they&amp;rsquo;re not big enough to follow that strategy, they&amp;rsquo;re being really good community members. They&amp;rsquo;re not forcing their ideals on anyone, they don&amp;rsquo;t push ads, etc.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://vivaldi.com/blog/news/vivaldi-social-a-new-mastodon-instance/&#34;&gt;Vivaldi&lt;/a&gt; (web browser) set up a mastodon server for their users, and integrated it into the browser, making it easy to get online and start participating. But that&amp;rsquo;s it. It&amp;rsquo;s just another server. They&amp;rsquo;re not going to try and warp the Fediverse it into something they can control.&lt;/p&gt;
&lt;p&gt;From my perspective, there&amp;rsquo;s nothing inherently wrong with companies providing Fediverse accounts for their users. Yes, they&amp;rsquo;re prone to having large numbers of users which means no community and no real ability to moderate, but that&amp;rsquo;s true of &lt;em&gt;every&lt;/em&gt; large mastodon instance regardless of who owns it.&lt;/p&gt;
&lt;p&gt;The problem is companies who are strongly motivated to try and control it and have enough users to make that a real possibility.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Github Rubocop Workflow</title>
      <link>https://weblog.masukomi.org/2023/06/19/github-rubocop-workflow/</link>
      <pubDate>Mon, 19 Jun 2023 00:00:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2023/06/19/github-rubocop-workflow/</guid>
      <description>&lt;p&gt;It took me a while to figure out the correct collection of magical incantations
required to make RuboCop run in a GitHub workflow, but ONLY on the files that
were changed within the PR. This is a useful configuration if you have a
codebase that has not yet been modified to satisfy all your &amp;ldquo;Cops&amp;rdquo;.  I&amp;rsquo;ve also
included a version of the same file that you can use when you&amp;rsquo;re ready to have
RuboCop run on all non-excluded files.&lt;/p&gt;
&lt;p&gt;The result is that rubocop will only block your PR &lt;em&gt;if&lt;/em&gt; some of the files touched
in the PR don&amp;rsquo;t conform to your new standards. Once your codebase is&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;on: [pull_request]&lt;/code&gt; means that it will run when you make the pull request
&lt;em&gt;and&lt;/em&gt; any time you push to it (with or without force).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# A GitHub workflow to run rubocop, but ONLY on changed files&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# honors any exclusions specified in your .rubocop.yml&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# store this file in .github/workflows/rubocop.yml&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# note: the Checkout Branches step is required&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# because by default what&amp;#39;s checked out is the branch&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# that represents the future merging of the PRs branch&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# with the target branch.&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;RuboCop&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;pull_request]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;jobs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;rubocop&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;runs-on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;ubuntu-22.04&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;steps&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;uses&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;actions/checkout@v2&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;uses&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;ruby/setup-ruby@v1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;with&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ruby-version&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.ruby-version&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;bundler-cache&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Install gems&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;sd&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          bundle config path vendor/bundle
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          bundle config set without &amp;#39;test tools functional&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          bundle install --jobs 4 --retry 3&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Checkout Branches&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;sd&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          git fetch origin ${{ github.head_ref }}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          git fetch origin ${{ github.base_ref }}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Run RuboCop&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;bundle exec rubocop --parallel --force-exclusion $( git diff --name-only --ignore-submodules=all --diff-filter=ACMR origin/${{ github.base_ref }}..origin/${{ github.head_ref }} )&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Once your codebase has finally been cleaned up to a point that RuboCop is happy with it you can change it to the following. This is strongly recommend because it will catch when code made it through to the target branch without getting checked (merged directly, or a PR that was merged despite failing checks). The time difference is &lt;em&gt;not&lt;/em&gt; noteworthy. Spinning up the container and checking out the gems takes &lt;em&gt;much&lt;/em&gt; longer than the actual RuboCop run.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;# store this file in .github/workflows/rubocop.yml&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# this will run rubocop on ALL the files in your repo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# that have not been excluded in your main .rubocop.yml&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# rubocop configuration file.&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;RuboCop&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;pull_request]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;jobs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;rubocop&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;runs-on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;ubuntu-22.04&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;steps&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;uses&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;actions/checkout@v2&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;uses&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;ruby/setup-ruby@v1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;with&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ruby-version&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.ruby-version&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;bundler-cache&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Install gems&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;sd&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          bundle config path vendor/bundle
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          bundle config set without &amp;#39;test tools functional&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          bundle install --jobs 4 --retry 3&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Run RuboCop&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;bundle exec rubocop --parallel --force-exclusion&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Converting Apple&#39;s Add To Wallet Images</title>
      <link>https://weblog.masukomi.org/2023/06/09/converting-apples-add-to-wallet-images/</link>
      <pubDate>Fri, 09 Jun 2023 00:00:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2023/06/09/converting-apples-add-to-wallet-images/</guid>
      <description>&lt;p&gt;Apple distributes &lt;a href=&#34;https://developer.apple.com/wallet/add-to-apple-wallet-guidelines/&#34;&gt;their &amp;ldquo;Add to Wallet&amp;rdquo; images&lt;/a&gt; as SVGs which is great, but if you want to add it to an email or anything else that has issues with SVG files you&amp;rsquo;re going to need a PNG (to maintain transparency around the rounded corners). Unfortunately there are a LOT of these images needed to support the various languages.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2023/06/09/apple_wallet_images_pr.png&#34;
    alt=&#34;a screenshot of a github pr with multiple apple wallet images&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;apple wallet images pr&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Converting these to PNGs is not as easy as you&amp;rsquo;d hope.&lt;/p&gt;
&lt;p&gt;Problems I encountered:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;imagemagick&lt;/code&gt; produces unusably bad images (mostly just black) even though it&amp;rsquo;s theoretically calling &lt;code&gt;rsvg-convert&lt;/code&gt; under the covers and calling that directly works fine.&lt;/li&gt;
&lt;li&gt;inconsistent width and height&lt;/li&gt;
&lt;li&gt;extra transparent pixels on right and bottom edges&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Here&amp;rsquo;s my solution with comments inline about what I learned along the way. It involves 2 scripts. The first one is in fish shell, just because that&amp;rsquo;s where i started but you should be able to convert to Bash or whatever you like to use pretty easily.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fish&#34; data-lang=&#34;fish&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ch&#34;&gt;#!/usr/bin/env fish
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ch&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;file&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;find&lt;/span&gt; . &lt;span class=&#34;na&#34;&gt;-name&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;*.svg&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;directory&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;dirname&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;base_filename&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;basename&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$file&lt;/span&gt; .svg&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;new_filename&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$directory&lt;/span&gt;/&lt;span class=&#34;nv&#34;&gt;$base_filename&lt;/span&gt;.png
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c&#34;&gt;# -z 10 add zoom. not because we need it bigger, but because
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;c&#34;&gt;# it looks WAY better when you add _any_ amount of zoom.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;c&#34;&gt;# -w 884 because if i don&amp;#39;t constrain width or height then
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;c&#34;&gt;# the results are too varied to apply a consistent cropping
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;c&#34;&gt;# percentage
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;nf&#34;&gt;rsvg-convert&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;-z&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;10&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;--keep-aspect-ratio&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;-w&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;884&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;-o&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$new_filename&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c&#34;&gt;# convert $new_filename -gravity NorthEast -crop WIDTHxHEIGHT $new_filename
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;c&#34;&gt;# image_size.rb is outputting the cropped &amp;#34;WIDTHxHEIGHT&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;c&#34;&gt;#
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;nf&#34;&gt;convert&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$new_filename&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;-gravity&lt;/span&gt; NorthEast &lt;span class=&#34;na&#34;&gt;-crop&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;image_size&lt;/span&gt;.rb &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;identify&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;-ping&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;-format&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;%w %h&amp;#39;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$new_filename&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$new_filename&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c&#34;&gt;# -crop results in foo-0.png foo-1.png foo-2.png (sometimes)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;c&#34;&gt;#   and foo-3.png (sometimes)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;c&#34;&gt;# what you want is in 0.png and the others are bits cropped off ?
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;nf&#34;&gt;mv&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$directory&lt;/span&gt;/&lt;span class=&#34;nv&#34;&gt;$base_filename&lt;/span&gt;-&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;.png &lt;span class=&#34;nv&#34;&gt;$new_filename&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;n&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;seq&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c&#34;&gt;# delete the unnecessary files. &amp;amp;&amp;gt; is redirecting STDERR to STDOUT
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;c&#34;&gt;# then shoving all to /dev/null because it doesn&amp;#39;t ALWAYS generate
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;c&#34;&gt;# the -2  and -3 files ?!?!
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;nf&#34;&gt;rm&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$directory&lt;/span&gt;/&lt;span class=&#34;nv&#34;&gt;$base_filename&lt;/span&gt;-&lt;span class=&#34;nv&#34;&gt;$n&lt;/span&gt;.png &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;gt;&lt;/span&gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nf&#34;&gt;git&lt;/span&gt; add &lt;span class=&#34;nv&#34;&gt;$new_filename&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With a constrained initial width plus a little scratchpad math i was able to figure out that cropping 0.7% from the width &amp;amp; 2.8% from the height (rounded up on both) seemed to get me &amp;ldquo;good enough&amp;rdquo; results.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not perfect. Some still have 1 or 2 pixels of transparency at the bottom, and some are cropped a little too much along the bottom (thin grey border missing). But, I don&amp;rsquo;t want to manually edit 45 files for languages we don&amp;rsquo;t support anyway. I figure we can go back in and manually edit the handful that are imperfect.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ch&#34;&gt;#!/usr/bin/env ruby&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# cropper for ... wallet things&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;initial_width&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;initial_height&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;ARGV&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;].&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;split&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;/\s+/&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;to_i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;width_hundredth&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;initial_width&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;to_f&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;100&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;height_hundredth&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;initial_height&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;to_f&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;100&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;width_crop_percent&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;height_crop_percent&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;8&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;#2.58&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;new_width&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;initial_width&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;width_crop_percent&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;width_hundredth&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ceil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;new_height&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;initial_height&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;height_crop_percent&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;height_hundredth&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ceil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;puts&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;#{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;new_width&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;#{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;new_height&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Rounding Things In Tinkercad</title>
      <link>https://weblog.masukomi.org/2023/04/16/rounding-things-in-tinkercad/</link>
      <pubDate>Sun, 16 Apr 2023 00:00:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2023/04/16/rounding-things-in-tinkercad/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#step-by-step&#34;&gt;Step-By-Step&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-corners&#34;&gt;The Corners&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-ears&#34;&gt;The &amp;ldquo;ears&amp;rdquo;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#everything-else&#34;&gt;Everything Else&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#a-template-for-the-leather&#34;&gt;A Template For The Leather&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#conclusion&#34;&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;A Guide To Rounding Corners and Edges in Tinkercad.&lt;/p&gt;
&lt;p&gt;Alternately, how I spent way too much time modeling a dice tray.&lt;/p&gt;
&lt;p&gt;Rounding corners in Tinkercad is &lt;em&gt;way&lt;/em&gt; more trouble than it ought to be. It&amp;rsquo;s not actually hard, it&amp;rsquo;s just really time consuming and requires a lot of steps. Once you wrap your head around the general approach you&amp;rsquo;ll be able to round anything.&lt;/p&gt;
&lt;p&gt;This post will take you through the steps required to round the and edges on this simple dice tray.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2023/04/16/final_tray_close_up.jpg&#34;
    alt=&#34;a close-up photo of a 3d printed dice tray holding on to a piece of wood with a notebook on it. in the tray are 7 Genesys dice. The result of the rolled dice is 2 successes and 3 advantages. There is a pieces of brown leather in the bottom of the tray.&#34;&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2023/04/16/rendered_dice_tray.png&#34;
    alt=&#34;a 3d rendered version of the same dice tray. the actual rounded corners are a bit easier to see.&#34;&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;step-by-step&#34;&gt;Step-By-Step&lt;/h2&gt;
&lt;p&gt;High level rounding:&lt;/p&gt;
&lt;p&gt;In most case you can simply stick a rounded thing on top of a rectangular thing and that&amp;rsquo;s it. For example, most of the walls in this are simply rectangles with half-cylinders laid lengthwise on top of them. That&amp;rsquo;s the bit you probably don&amp;rsquo;t need help with.&lt;/p&gt;
&lt;p&gt;When you can&amp;rsquo;t simply build the shape you want, but instead need to round off an existing corner the approach is actually fairly similar. You build up the shape of the cut, cut it out of something, and then turn that something into a &amp;ldquo;hole&amp;rdquo;. For example: this image shows the sequence of things I&amp;rsquo;d do to round off one edge of a cube. I take a cylinder, which has the rounded shape I want, then cut it out of a another cube or rectilinear shape that is at least as large as the thing I want to round off. Then I convert that shape into a whole, and use it to cut off the edge of the cube.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2023/04/16/numbered_sequence_rounding_cube.png&#34;
    alt=&#34;a 5 step sequence showing a cube with a translucent cylinder intersecting it. a cube with a whole cut out of it where the cylinder intersected it. That shape again, but translucent. That shape intersecting a cube. A cube missing the area that was intersected by the prior translucent shape.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Pro-tip. Make the thing that will be your cutting tool an even multiple of the size you&amp;rsquo;re cutting out of it. For example. The cylinder is 10mm into the cube I&amp;rsquo;m going to cut. The cube is 20mm wide. This means that when I use the resulting hole to cut into other shapes I can simply overlap them by 10mm.&lt;/p&gt;
&lt;h2 id=&#34;the-corners&#34;&gt;The Corners&lt;/h2&gt;
&lt;p&gt;The corners are the most complicated part of this build. In order to have them curve over the edge on the top, but be flat on the bottom I needed to create a cylinder with rounded edges that were different on each end.&lt;/p&gt;
&lt;p&gt;To build the bottom of the corner we take a torus (donut) and stick it on top of a cylinder. It&amp;rsquo;s much easier to build this upside down and then rotate it.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2023/04/16/torus_on_cylinder.png&#34;
    alt=&#34;a torus on top of a cylinder. There is an annotation indicating that the slider marked tube is actually the radius of the curved cylinder that makes up a torus.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Note that the &amp;ldquo;Tube&amp;rdquo; slider controls the radius of the curved cylinder that makes up a torus shape. Your life will be &lt;em&gt;significantly&lt;/em&gt; easier if you can make this a whole number. I wanted a 3mm wide wall, so I used a 1.5mm &amp;ldquo;Tube&amp;rdquo; which just made all the future placements of objects &lt;em&gt;much&lt;/em&gt; more difficult. If I was doing it again, I&amp;rsquo;d just make the wall 4mm thick. Change the &amp;ldquo;tube&amp;rdquo; setting to be the size you want, then deal with the outer dimensions. Changing the tube radius alters the outer dimensions, so there&amp;rsquo;s no point in setting those first.&lt;/p&gt;
&lt;p&gt;For the bottom we need to add a cylinder that fills the area from the top of each rounded side of the torus. This means we need a cylinder that is the diameter of the outer cylinder, minus the radius of your &amp;ldquo;tube&amp;rdquo; times 4. Set a ruler at the corner of the initial cylinder to help you place this inner cylinder correctly. The inner cylinder will be the height of the initial cylinder plus 1x the radius of your &amp;ldquo;tube&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;So, if we have a torus that with a 2mm tube (radius), and it sits on a cylinder that is 20mm in diameter, and 20mm high, then your inner cylinder will be 16mm in diameter and 22mm tall. To position the inner cylinder move it 2mm towards the center along the X and Y axis.&lt;/p&gt;
&lt;p&gt;This picture shows the bottom of our corner with the pieces put together, and with the center cylinder offset. Now Shorten the outer and inner cylinders by at least the radius of your tube, and then shift them back up into position. Copy this shape, and set it aside, so that we can use it as the start of our top corner. Then group these pieces, and rotate it 180° to form a nice flat bottom with rounded edges, and drop it down so that it touches the ground.&lt;/p&gt;
&lt;p&gt;Take the copy you set aside, and change the diameter of the inner cylinder by subtracting 4x the radius of the tube. Now it&amp;rsquo;s 12mm in diameter, and should look like it&amp;rsquo;s poking through the center of your torus. Convert that center cylinder to a hole. Now, shorten your cylinder by the radius of the torus. Then shift it up so that it&amp;rsquo;s touching your top torus, and hovering above the ground. and then combine all the pieces of the top here &lt;em&gt;except&lt;/em&gt; for the hole. Make sure the bottom and top have different colors so that you can better see what&amp;rsquo;s happening in the next step.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bonus points&lt;/strong&gt;:
If you want the inner curve at the bottom to be rounded too, add a half-sphere on top of your hole cylinder, combine them, and rotate it. Make sure that the bottom (the tip of the half-sphere) is the thickness of your floor away from the ground.&lt;/p&gt;
&lt;p&gt;Combine the top and bottom pieces, then group everything. The process should look like this.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2023/04/16/cylinder_construction.png&#34;
    alt=&#34;the top and bottom pieces decribed above. The bottom flipped, and combined with the top. Then all the pieces, including the hole, combined to make a cylindrical vase with rounded edges.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;The next step is to cut away the excess and make it into a corner piece. For this I just take 3 cube holes. Each cube should be 2x the diameter of your cylinder. Arrange them so that they all intersect at the center of your cylinder, and are raised up the radius of your &amp;ldquo;tube&amp;rdquo;. Then combine all the shapes. Here&amp;rsquo;s the before and after.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2023/04/16/cutting_cylinder_into_corner.png&#34;
    alt=&#34;our cylindrical vase, with 3 overlapping transluscent cubes that hover just above the ground. Next to them is a piece with a flat disk, with rounded edges, and a curved quarter circle rising up out of it. The top edge is rounded.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Now we&amp;rsquo;ve got our corner piece.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;re past the hardest part.&lt;/p&gt;
&lt;h2 id=&#34;the-ears&#34;&gt;The &amp;ldquo;ears&amp;rdquo;&lt;/h2&gt;
&lt;p&gt;There are a couple ways to address this. You can take a rectangle, and attach 3 half cylinders of the appropriate size to the edges. I wasn&amp;rsquo;t so smart. I built the thing with rectangles and then cut away pieces.&lt;/p&gt;
&lt;p&gt;Sooner or later though, you won&amp;rsquo;t be able to do this, and you&amp;rsquo;ll need to round off something as shows in the earlier sequence.&lt;/p&gt;
&lt;p&gt;The thing worth copying here is the rounded corners. To make these you simple create a disk. This is just like creating the bottom of the corner, except that the height of the inner cylinder is 2x the &amp;ldquo;tube&amp;rdquo; radius of the torus it&amp;rsquo;s going inside. Combine those and you&amp;rsquo;ve got a disc with rounded corners. The torus you start with should have a diameter equal to the thickness of the thing you&amp;rsquo;re rounding.&lt;/p&gt;
&lt;p&gt;Chop off a square corner from the item where the disk, then slide the disk into place, and combine the things.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2023/04/16/ear_exploded_view.png&#34;
    alt=&#34;An exploded view of the ear showing all the component pieces&#34;&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;everything-else&#34;&gt;Everything Else&lt;/h2&gt;
&lt;p&gt;Everything else is just a repetition of the techniques outlined above. In order to merge the floor with the corner pieces with the cylindrical bottoms, you just use two overlapping rectangles. It&amp;rsquo;s important that your floor extends to the middle of the wall. This is so that it will not extend past the apex of the curve.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2023/04/16/floor_meets_corners.png&#34;
    alt=&#34;a view into the tray showing where the corners meet the overlapping floor rectangles.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;You may notice that mine are not placed identically relative to each corner. The way my walls are constructed it doesn&amp;rsquo;t matter, and the resulting gaps are hidden.&lt;/p&gt;
&lt;h2 id=&#34;a-template-for-the-leather&#34;&gt;A Template For The Leather&lt;/h2&gt;
&lt;p&gt;I wanted a nice fit for the leather insert. In order to make this I took the final model for the tray, and separated all the pieces. I combined everything &lt;em&gt;except&lt;/em&gt; the floors, and then made that into a &amp;ldquo;hole&amp;rdquo;. I combined the floor pieces and then cut the hole out of them. This left weird corners. So, I grabbed the cylinder I had used to cut a vertical hole in the corner, converted it to a solid, and moved it, and a copy, into position on each corner that needed to be rounded.&lt;/p&gt;
&lt;p&gt;Then I combined them. There was no need to make them taller. It was just easier to move around in Tinkercad if they weren&amp;rsquo;t the same height.&lt;/p&gt;
&lt;p&gt;Now, this template is the &lt;em&gt;exact&lt;/em&gt; dimensions of the floor. If you account for expansion of the filament during printing you&amp;rsquo;ve got a template that won&amp;rsquo;t fit into the tray because it&amp;rsquo;s micrometers too big.&lt;/p&gt;
&lt;p&gt;This is ok for leather. I placed it on top of the leather I was going to cut, and then angled my blade at roughly a 45° angle towards the center of the piece. This gave me very thin leather at the top, and a bottom of the full thickness. The result is that when I set it into the tray the edges are a hair wider than the hole they&amp;rsquo;re going into, but they&amp;rsquo;re also very thin there. This exerts just enough pressure to hold the leather in place without any adhesive required.&lt;/p&gt;
&lt;p&gt;The leather I&amp;rsquo;ve chosen is very soft. This is beneficial in such a small tray because it absorbs most of the impact of the dice. They stop rolling almost instantly, which is good, because they have very little space to roll in this tiny tray.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;That&amp;rsquo;s it. I hope this helps save you from the hours it took me to figure all this out. If you find this helpful, or confusing, please drop a line to me on mastodon at &lt;a href=&#34;https://connectified.com/@masukomi&#34;&gt;@masukomi@connectified.com&lt;/a&gt; or drop me an email at &lt;a href=&#34;mailto:masukomi@masukomi.org&#34;&gt;masukomi@masukomi.org&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Kinesis Advantage 360 Pro Review</title>
      <link>https://weblog.masukomi.org/2023/03/17/kinesis-advantage-360-pro-review/</link>
      <pubDate>Fri, 17 Mar 2023 00:00:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2023/03/17/kinesis-advantage-360-pro-review/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#high-level-summary&#34;&gt;High Level Summary&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-hope&#34;&gt;The Hope&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-good&#34;&gt;The Good&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-meh&#34;&gt;The Meh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-not-good&#34;&gt;The Not Good&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-bad&#34;&gt;The Bad&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#bluetooth&#34;&gt;Bluetooth&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#power-switches&#34;&gt;Power Switches&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#charge-indicator&#34;&gt;Charge Indicator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#when-things-go-wrong&#34;&gt;When Things Go Wrong&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-bridge&#34;&gt;The Bridge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#modifying-the-keyboard-layout&#34;&gt;Modifying The Keyboard Layout&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-conclusion&#34;&gt;The Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#update&#34;&gt;Update&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2023/03/17/custom_bridge.jpg&#34;
    alt=&#34;an image of my keyboard halves connected by a copper colored bridge of 3d printed plastic&#34;&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;high-level-summary&#34;&gt;High Level Summary&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&#34;https://kinesis-ergo.com/shop/adv360pro/&#34;&gt;Kinesis Advantage 360 Pro&lt;/a&gt; feels great. The ergonomics are better than the Advantage 2. The Bluetooth is buggy. The on/off switches are terrible. The mechanism for resetting it is worse than terrible. I&amp;rsquo;m still irked that the wrist wrests weren&amp;rsquo;t included at that price, and I suspect the &lt;a href=&#34;https://www.moergo.com/collections/glove80-keyboards&#34;&gt;Mo Ergo Glove80&lt;/a&gt; is going to be an equal, or even better choice.&lt;/p&gt;
&lt;h2 id=&#34;the-hope&#34;&gt;The Hope&lt;/h2&gt;
&lt;p&gt;I have been a fan of the Kinesis Advantage keyboards for a while. There were 3 things that I wished that they&amp;rsquo;d change.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The escape key and F-keys were not made to the same standards as the other keys.&lt;/p&gt;
&lt;p&gt;This is probably fine for the F-keys which are essentially never used, but not for the escape key which is used relentlessly by Vim and Emacs users, and by anyone who knows that you can get out of most any dialog by hitting it instead of reaching for your mouse. I&amp;rsquo;ve had to buy 2 replacement Advantage 2s because of this failing key.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No Bluetooth.&lt;/p&gt;
&lt;p&gt;This sucks if you&amp;rsquo;re a remote worker, and have a work computer and a home computer. Constantly plugging and unplugging. Yes, I hear you saying there are USB-A Switches, and this is true, but I have gone through multiple of those that just die. They&amp;rsquo;re almost all cheap Chinese crap, made barely well enough to survive the return window and nothing more, and be so cheap to begin with that it&amp;rsquo;s not worth the effort of returning anyway.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&amp;rsquo;s not a split keyboard.&lt;/p&gt;
&lt;p&gt;You spend all the $$$ on a Kinesis Advantage keyboard because you&amp;rsquo;re someone who cares about ergonomics. At the same time, the keywells being so close together forces you to angle your arms inward to get to them, and then compensate for that by bending your wrists outwards to be inline with the keys.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;the-good&#34;&gt;The Good&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;It&amp;rsquo;s got multi-device bluetooth.&lt;/li&gt;
&lt;li&gt;They got rid of the terrible F-keys, but left space for an escape key.&lt;/li&gt;
&lt;li&gt;There&amp;rsquo;s a GUI keyboard layout editor (kind-of).&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s a split keyboard so you can spread the keywells as far apart as you need.&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s even more comfortable to type on than the Advantage 2&lt;/li&gt;
&lt;li&gt;The wrist wrests are magnetically attached and washable.&lt;/li&gt;
&lt;li&gt;The Advantage 2 was so light as to feel cheap. The 360 has enough heft to it that you feel that you&amp;rsquo;re getting your money&amp;rsquo;s worth. This is of course ridiculous psychological BS that has no bearing on the real usability or quality of the keyboard, but what can I say? My monkey-brain thinks &amp;ldquo;heavy keyboard == better quality&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;It includes a keycap puller and a handful of spare keycaps.&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s easy to angle the halves outward, and the metal mechanism feels sturdy.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;the-meh&#34;&gt;The Meh&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The wrist wrests are magnetically attached, which means that they frequently get shoved off, or shift around slightly as you move.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can&amp;rsquo;t buy it in Dvorak.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The documentation is &amp;ldquo;meh&amp;rdquo;. It isn&amp;rsquo;t specific enough in places where I want it to be, and the table of contents in the PDF isn&amp;rsquo;t clickable to get to the relevant section of the document.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The two outermost columns of keys are oddly unaligned.&lt;/p&gt;
&lt;p&gt;The columns thing is weird, and hard to capture in photos. It&amp;rsquo;s only a &amp;ldquo;meh&amp;rdquo; because my fingers can&amp;rsquo;t tell, but it looks like there&amp;rsquo;s something wrong with the keyboard, like maybe I didn&amp;rsquo;t push down those keycaps far enough. Those two columns are shifted down and also physically higher. I&amp;rsquo;m confident this is mostly to address ergonomic concerns around finger length, but the fact that it&amp;rsquo;s lifted up too, and exposing the keyswitches to your eye-line makes it &amp;ldquo;look&amp;rdquo; like a fuck-up.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2023/03/17/weird_column_annotated.jpg&#34;
    alt=&#34;an annotated image showing the slightly offset row&#34;&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;the-not-good&#34;&gt;The Not Good&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The rubber feet aren&amp;rsquo;t fricative enough. Without a plastic bridge to connect the two halves my left one just kept migrating away from me as the day progressed.&lt;/li&gt;
&lt;li&gt;The keycaps don&amp;rsquo;t have little nubbins to tell your index fingers when your hands are in the correct location.&lt;/li&gt;
&lt;li&gt;The wrist wrests not only aren&amp;rsquo;t included, but are $30 + shipping. I wouldn&amp;rsquo;t mind $30 for a replacement pair, but when the keyboard itself is $460 this feels cheap.&lt;/li&gt;
&lt;li&gt;The Dvorak keycaps are $80 + shipping.&lt;/li&gt;
&lt;li&gt;There are spare keys that come with it, but there are no spare unlabeled keys, and there are no spare short rectangle keys.&lt;/li&gt;
&lt;li&gt;The plugs for reflashing the firmware (updating the keyboard layout) are USB-C, but the cables that ship with it are USB-C on one end and USB-A on the other.&lt;/li&gt;
&lt;li&gt;You can&amp;rsquo;t daisy chain the halves for charging. You have to use 2 separate cables to charge them at the same time.&lt;/li&gt;
&lt;li&gt;You can&amp;rsquo;t update both halves of the keyboard at once. For all intents and purposes these are two separate keyboards.&lt;/li&gt;
&lt;li&gt;The lights under the keys are all white.&lt;/li&gt;
&lt;li&gt;They don&amp;rsquo;t offer a choice of keyswitches except via a 3rd party.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;rsquo;m a touch typist, who uses Dvorak. Essentially every keyboard I&amp;rsquo;ve typed on for decades has had the &amp;ldquo;wrong&amp;rdquo; letters on the keys. I figured I &lt;em&gt;could&lt;/em&gt; spend $80 for a set of Dvorak keycaps, &lt;em&gt;or&lt;/em&gt; I could just rearrange most of the keys on my keyboard and be left with a few keys that were &amp;ldquo;wrong&amp;rdquo; (because of no blank spares). I went with that. I&amp;rsquo;m still finding myself confused by keys that have the &amp;ldquo;right&amp;rdquo; letter on them, and don&amp;rsquo;t believe what I&amp;rsquo;m seeing. $80 just seemed wasteful.&lt;/p&gt;
&lt;p&gt;The cords that come with it are useless to me except for charging because I have some USB-A charging bricks laying around. I can&amp;rsquo;t update the firmware / keyboard layout with them, because my computer only has USB-C. I think it&amp;rsquo;s reasonable to say that anyone who&amp;rsquo;s willing to plunk down nearly $500 to &lt;a href=&#34;https://www.moergo.com/&#34;&gt;https://www.moergo.com/&lt;/a&gt; be an early adopter of a fancy new keyboard probably has a modern computer. That means one with USB-C holes not USB-A holes.&lt;/p&gt;
&lt;p&gt;Regarding the white lights under the keys: before getting the &lt;a href=&#34;https://shop.keyboard.io/products/model-01-keyboard?variant=30996744405065&#34;&gt;Keyboardio Model 01&lt;/a&gt; I thought that RGB lights under keys were just some flashy gimmick that didn&amp;rsquo;t really matter. I was wrong. They are amazing. I loved looking down at that keyboard and seeing a gently shifting rainbow. It brought a tiny bit of happiness to me throughout the day. I asked Kinesis about this at some point, and if memory serves, their response was something to the effect of &amp;ldquo;it was too complicated&amp;rdquo; which I interpreted to mean &amp;ldquo;it added complications we didn&amp;rsquo;t feel were worth dealing with&amp;rdquo;. Meanwhile, the folks at Keyboardio managed to get that working even though it was a 2 person shop. I know two people who backed the Kickstarter for the &lt;a href=&#34;https://www.moergo.com/&#34;&gt;Glove80&lt;/a&gt;, which managed it, plus the bluetooth.&lt;/p&gt;
&lt;p&gt;Choice of keyswitches isn&amp;rsquo;t a big deal for average consumer keyboards. These are not average consumer keyboards. They cost so much more, and they are bought by people who are picky about the way their keys feel.&lt;/p&gt;
&lt;h2 id=&#34;the-bad&#34;&gt;The Bad&lt;/h2&gt;
&lt;h3 id=&#34;bluetooth&#34;&gt;Bluetooth&lt;/h3&gt;
&lt;p&gt;The bluetooth is&amp;hellip; annoying. Every time close my laptop lid, and then re-open it I have to turn off bluetooth and turn it back on to get the Advantage 360 to reconnect. I filed a support ticket and they said it&amp;rsquo;s a known issue, and that they can&amp;rsquo;t do anything about it, because it&amp;rsquo;s something on Apple&amp;rsquo;s end. Now, maybe that&amp;rsquo;s true. Maybe it&amp;rsquo;s some weird side-effect of the 2 devices pretending to be one. All I know as a consumer is that every other bluetooth device I own reconnects just fine without me doing that.&lt;/p&gt;
&lt;h3 id=&#34;power-switches&#34;&gt;Power Switches&lt;/h3&gt;
&lt;p&gt;The power switches are terrible. Not only are they hard to slide, they don&amp;rsquo;t slide well and have a position where they&amp;rsquo;ve been moved but aren&amp;rsquo;t actually moved far enough, and you can&amp;rsquo;t really tell if it counted or not.&lt;/p&gt;
&lt;h3 id=&#34;charge-indicator&#34;&gt;Charge Indicator&lt;/h3&gt;
&lt;p&gt;There doesn&amp;rsquo;t appear to be a way to know how much charge each half has. On the Mac there&amp;rsquo;s a percentage of charge shown in the bluetooth menu, but it&amp;rsquo;s a lie. I don&amp;rsquo;t know what it means. Maybe it&amp;rsquo;s an average of the charge of both? Maybe it&amp;rsquo;s just the left one? I dunno. All I do know is that I have to just randomly plug in each half to keep it charged because I have no idea what the actual charge is.&lt;/p&gt;
&lt;h3 id=&#34;when-things-go-wrong&#34;&gt;When Things Go Wrong&lt;/h3&gt;
&lt;p&gt;The right and left halves can &amp;ldquo;loose &amp;lsquo;sync&amp;rsquo; with each other&amp;rdquo;. It can go for weeks without this happening and then have happened overnight every night. It can happen while you&amp;rsquo;re typing.&lt;/p&gt;
&lt;p&gt;The initial fix is to toggle the power switches &amp;ldquo;in rapid succession&amp;rdquo; which is easier said than done because it&amp;rsquo;s hard to tell if I&amp;rsquo;ve successfully switched my left switch half the time, and you can&amp;rsquo;t tell if it didn&amp;rsquo;t work because you failed to switch the switches or because it&amp;rsquo;s just not working. Once you&amp;rsquo;re confident you have successfully turned the halves on in rapid succession and it&amp;rsquo;s still flashing 3 red lights at you:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;plug the current half into your keyboard&lt;/li&gt;
&lt;li&gt;find a paperclip&lt;/li&gt;
&lt;li&gt;find a hole that is literally impossible to see without removing keycaps&lt;/li&gt;
&lt;li&gt;double click a button in the hole&lt;/li&gt;
&lt;li&gt;drag a new firmware file onto the keyboard half to reset it.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I dunno about you, but in my experience not many people seem to actually have paperclips in their house these days. Worse, there are very few alternate objects that are both that thin, and that rigid. When my keyboard decided to randomly die and need to be reset I honestly thought I was going to be unable to use it for a week until amazon shipped me a box of paperclips. 🤦‍♀️ Fortunately I found one wedged between the bottom and side of a drawer of pens. Also, why double-click? It&amp;rsquo;s effectively impossible to accidentally stick something in this hole and click it once.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2023/03/17/reset_hole_annotated.jpg&#34;
    alt=&#34;an annotated image of keys removed with an arrow pointing to the reset hole&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;O.M.G. I hate that hole. It is literally the worst implementation of &amp;ldquo;stick a paperclip in to reset things&amp;rdquo; that I have ever seen. It shouldn&amp;rsquo;t require a paperclip in the first place. That would be mean even if paperclips &lt;em&gt;were&lt;/em&gt; a thing people still had laying around.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve had to do this 5 times in the past 2 days. I now have a folder on my desktop with the firmware files for each half so that I can easily drag them on to the drive the next time I need to do this.&lt;/p&gt;
&lt;h3 id=&#34;the-bridge&#34;&gt;The Bridge&lt;/h3&gt;
&lt;p&gt;Inside the box is a long thing box with keycaps, a keycap puller, the aforementioned useless cables, and a &amp;ldquo;bridge&amp;rdquo;. The bridge is a cheap, but well designed piece of plastic that snaps onto the support bars of each half and enable you to keep them rigidly attached to each other. It works well. It doesn&amp;rsquo;t need to be fancier than it is.&lt;/p&gt;
&lt;p&gt;However, it&amp;rsquo;s only ~6&amp;quot; (15cm) long. This means that if you attach it you&amp;rsquo;re forcing your arms to angle inwards again because your keyboard isn&amp;rsquo;t wide enough. The entire point of buying this keyboard is to have a more ergonomic typing experience and prevent wrist strain. It&amp;rsquo;s baffling that they&amp;rsquo;d put such a short bridge in it, or that they&amp;rsquo;d &lt;em&gt;only&lt;/em&gt; put a short one in. There&amp;rsquo;s plenty of space in the box for a longer one, and I&amp;rsquo;d be very surprised if this part cost them more than 25 cents to make. I designed &lt;a href=&#34;https://www.thingiverse.com/thing:5890843&#34;&gt;a wider version&lt;/a&gt; for those of you with large-bed 3D printers, or who feel like paying too much to have a 3rd party print it for you. It&amp;rsquo;s the copper colored strip of plastic between the halves in the image at the top of this post.&lt;/p&gt;
&lt;h3 id=&#34;modifying-the-keyboard-layout&#34;&gt;Modifying The Keyboard Layout&lt;/h3&gt;
&lt;p&gt;Tweaking the keyboard layout on this thing is geeky as 💩. I&amp;rsquo;m a geek so I can handle it, but holy crap.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You have to clone a Github repo&lt;/li&gt;
&lt;li&gt;Enable Github actions&lt;/li&gt;
&lt;li&gt;Give a 3rd party app permission to write to your your repo.&lt;/li&gt;
&lt;li&gt;Use a janky UI with poor accessibility&lt;/li&gt;
&lt;li&gt;Wait an unknown amount of time for the files to build.&lt;/li&gt;
&lt;li&gt;Know that you should look under actions, for a build artifact. Download a &amp;ldquo;firmware.zip&amp;rdquo; file.&lt;/li&gt;
&lt;li&gt;Unzip it&lt;/li&gt;
&lt;li&gt;Find a paperclip to shove in the invisible hole to mount the left keyboard. Oh, but only if it&amp;rsquo;s flashing, otherwise you can do a key combo. The docs specify paperclip in invisible hole first.&lt;/li&gt;
&lt;li&gt;Drag the left file onto it. If you do the right file onto the left you&amp;rsquo;ll break things.
Be surprised that it auto-unmounts itself and causes you to get yelled at by macOS for improperly unmounting a drive.&lt;/li&gt;
&lt;li&gt;Repeat 8 &amp;amp; 9 for the right half.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For comparison, when the Keyboardio Model 01 had &lt;em&gt;just&lt;/em&gt; been released, I had to edit a geeky file, that was &lt;em&gt;very&lt;/em&gt; well commented, and relatively easy for a non-geek to work with. Then run an app to load the file onto the keyboard. That was it. No Github. No secondary build process. No &amp;ldquo;this half, then that half&amp;rdquo;. It just worked and worked easily. Having a GUI is nice, but they had the keys laid out in the file to match the keyboard. Later on they built the open source &lt;a href=&#34;https://github.com/keyboardio/Chrysalis&#34;&gt;Chrysalis&lt;/a&gt; layout editor which is really nice. This was years ago. Ergodox also has a &lt;a href=&#34;https://ergodox-ez.com/pages/oryx&#34;&gt;graphical configurator&lt;/a&gt; that generates the files you need without you to set up a GitHub repo and GitHub actions.&lt;/p&gt;
&lt;p&gt;I was hoping that Kinesis would use Crysalis, or something of equal quality considering they&amp;rsquo;re not just a team of 2 people, but no. It&amp;rsquo;s nice that their editor is open source but it&amp;rsquo;s honestly not very good.&lt;/p&gt;
&lt;h2 id=&#34;the-conclusion&#34;&gt;The Conclusion&lt;/h2&gt;
&lt;p&gt;Overall it&amp;rsquo;s a good keyboard with minor annoyances. Would I buy it again? Given the market &lt;em&gt;today&lt;/em&gt; yes. Once the Glove80 starts shipping&amp;hellip;. probably not.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m reasonably confident from the photos that the ergonomics will be comparable. It has RGB LEDs under each key. It&amp;rsquo;s got low profile keys which most folks seem to like better. I&amp;rsquo;ve played with a keyswitch tester for the keys they&amp;rsquo;re using, and they feel nice. They offer multiple keyswitch options.&lt;/p&gt;
&lt;p&gt;I think the Kinesis &lt;em&gt;may&lt;/em&gt; have better build quality, and it looks like the Glove 80 can&amp;rsquo;t angle outwards like the Advantage 360 does.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s honestly not a huge difference, but I really want bluetooth I don&amp;rsquo;t have to reset every day. I lust after those RGB lights. I really dislike the power switches on the Kinesis, and I outright hate the stupid paperclip reset thing.&lt;/p&gt;
&lt;h2 id=&#34;update&#34;&gt;Update&lt;/h2&gt;
&lt;p&gt;3 months later.&lt;/p&gt;
&lt;p&gt;I start every day with upset grumbling, as I&amp;rsquo;m forced to remember that my keyboard doesn&amp;rsquo;t work when I first sit down in the morning. I then turn off Bluetooth on my laptop, and turn it back on. Kinesis claimed this was an Apple problem they couldn&amp;rsquo;t do anything about. This is provably false, because shortly after writing this my wife received her Glove 80. It does not have this problem.&lt;/p&gt;
&lt;p&gt;If she dares to close her laptop lid and reopen it later, her keyboard continues to work. Additionally, the Glove80 can also tell her how much battery each half has, and which device number it&amp;rsquo;s connected to at the moment. The reset hole isn&amp;rsquo;t hidden under keys. The power switches aren&amp;rsquo;t so tiny and fine as to be more easily manipulated with tools. Updating the keyboard layout doesn&amp;rsquo;t require you to be so geeky as to configure a GitHub repo and understand GitHub workflows.&lt;/p&gt;
&lt;p&gt;To top it off, the extra row of keys means that unlike the Kinesis, the capslock key isn&amp;rsquo;t in a hard to reach location, and the escape key can live where it&amp;rsquo;s lived for 40+ years instead of having to steal the location of another key. Currently mine lives where capslock key is supposed to be, which means every time I use my laptop&amp;rsquo;s keyboard I&amp;rsquo;m constantly switching into upper case letters and invoking the wrong commands in vim / emacs.&lt;/p&gt;
&lt;p&gt;I think the Kinesis is better made. I think the Kinesis is prettier. When it comes to actual functionality and everyday use the Glove80 kicks its ass. I was concerned about the low-profile keys on it, but they&amp;rsquo;re really nice. I can not, in good conscience recommend that anyone buy the Kinesis Advantage 360 Pro when you could instead buy the Glove80.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Why Tabletop Role Playing Games Need Skills</title>
      <link>https://weblog.masukomi.org/2023/03/14/why-tabletop-role-playing-games-need-skills/</link>
      <pubDate>Tue, 14 Mar 2023 00:00:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2023/03/14/why-tabletop-role-playing-games-need-skills/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#preface&#34;&gt;Preface&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#skills-in-ttrpgs&#34;&gt;Skills in TTRPGs&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#what-s-a-skill&#34;&gt;What&amp;rsquo;s a Skill&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#playing-without-skills&#34;&gt;Playing Without Skills&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#why-that-s-not-enough&#34;&gt;Why That&amp;rsquo;s Not Enough&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#how-skills-change-things&#34;&gt;How Skills Change Things&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#what-about-knowledge-checks&#34;&gt;What about Knowledge Checks?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#what-about-perception-and-investigation&#34;&gt;What about Perception &amp;amp; Investigation?&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#perception&#34;&gt;Perception&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#investigation&#34;&gt;Investigation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#clarification&#34;&gt;Clarification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#conclusion&#34;&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#update&#34;&gt;Update&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;preface&#34;&gt;Preface&lt;/h2&gt;
&lt;p&gt;A recent episode of the &lt;a href=&#34;https://campaignwiki.org/wiki/MontagInZ%c3%bcrich/Internet_Office_Hours&#34;&gt;Internet Office Hours: Role-Playing Games&lt;/a&gt; podcast was discussing the question of Skill Checks in Tabletop Role Playing Games (TTRPGs) and if they were actually needed. In designing my game I&amp;rsquo;ve spent a lot of time thinking about this, and I thought I&amp;rsquo;d share my perspective.&lt;/p&gt;
&lt;h2 id=&#34;skills-in-ttrpgs&#34;&gt;Skills in TTRPGs&lt;/h2&gt;
&lt;h3 id=&#34;what-s-a-skill&#34;&gt;What&amp;rsquo;s a Skill&lt;/h3&gt;
&lt;p&gt;Most TTRPGs tend to come in two flavors. Essentially all of them have a collection of core attributes like strength, intelligence, and dexterity. Some &lt;em&gt;also&lt;/em&gt; have &amp;ldquo;Skills&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Some skills are pretty generic, like &amp;ldquo;investigation&amp;rdquo;, while some are very specific, like &amp;ldquo;lock-picking&amp;rdquo;, but &lt;em&gt;all&lt;/em&gt; of them are a representation of things that can be improved with training and practice.&lt;/p&gt;
&lt;h3 id=&#34;playing-without-skills&#34;&gt;Playing Without Skills&lt;/h3&gt;
&lt;p&gt;Most games don&amp;rsquo;t have a &amp;ldquo;lock-picking&amp;rdquo; skill, but anyone can attempt to pick a lock. This is generally handled by having the character roll with their most relevant core attribute (Dexterity, Finesse, etc).&lt;/p&gt;
&lt;p&gt;This is reasonable, and I&amp;rsquo;d say actually needed, because you&amp;rsquo;re never going to have a comprehensive skill list, and there are many things that would be reasonable for a character to do that the player wouldn&amp;rsquo;t think to list during character creation.&lt;/p&gt;
&lt;h3 id=&#34;why-that-s-not-enough&#34;&gt;Why That&amp;rsquo;s Not Enough&lt;/h3&gt;
&lt;p&gt;Let&amp;rsquo;s stick with the lock-picking example. In D&amp;amp;D everyone can attempt to pick a lock. It doesn&amp;rsquo;t matter if the character has ever seen a lock before, or has any clue what a &amp;ldquo;tumbler&amp;rdquo; is or how they function in locks. Everyone can pick a lock. Because almost every character has an above-average dexterity, this means that everyone has a decent chance of picking the lock.&lt;/p&gt;
&lt;p&gt;This is especially true because the difficulty of a test, in essentially every system, is based on how hard it would be for an average person with a tiny bit of understanding to accomplish a thing. So, it&amp;rsquo;s a lock with a difficulty of 15 regardless of if you spent your entire life in a tree or spend half of it practicing for the world lock-picking championship.&lt;/p&gt;
&lt;p&gt;Realistically, no-one should have any reasonable hope of picking a lock unless they&amp;rsquo;ve practiced picking locks and understand how they work.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s where skills come in.&lt;/p&gt;
&lt;h3 id=&#34;how-skills-change-things&#34;&gt;How Skills Change Things&lt;/h3&gt;
&lt;p&gt;Some people &lt;em&gt;have&lt;/em&gt; been trained in lock picking. Some people &lt;em&gt;can&lt;/em&gt; pick locks. Some people are better at it than others, and unless they&amp;rsquo;ve got a degenerative motor disease it really doesn&amp;rsquo;t matter how much &amp;ldquo;dexterity&amp;rdquo; they have.&lt;/p&gt;
&lt;p&gt;Without skills there&amp;rsquo;s no way to represent this. Without skills, there&amp;rsquo;s no point in having a backstory that says you&amp;rsquo;ve trained in archery for your entire life. It&amp;rsquo;s irrelevant. In many games, someone who&amp;rsquo;s never picked up a bow, but is an incredible gymnast will absolutely kick the ass of someone with average dexterity who has practice archery their entire lives. Why? Because you&amp;rsquo;re rolling against dexterity not an archery skill.&lt;/p&gt;
&lt;p&gt;Skills make backstory meaningful.&lt;/p&gt;
&lt;p&gt;Classes like &amp;ldquo;thief&amp;rdquo; are just shorthand for a collection of skills. A &amp;ldquo;thief&amp;rdquo; is expected to be able to pick a lock, or a pocket because it&amp;rsquo;s part of the skill training to become a thief. At least, it is in Swords &amp;amp; Sorcery games.&lt;/p&gt;
&lt;p&gt;Classes are a way to get around the need for explicit skills, &lt;em&gt;but&lt;/em&gt; it&amp;rsquo;s only meaningful if other classes can&amp;rsquo;t do those things. For example, the &amp;ldquo;fighter&amp;rdquo; shouldn&amp;rsquo;t be able to pick a lock, because they&amp;rsquo;re trained in martial arts, not the ways of thieves. Sure, they can stick a lock-pick in a lock and wiggle it around, but unless it&amp;rsquo;s a ridiculously trivial lock, they should be guaranteed to fail.&lt;/p&gt;
&lt;h3 id=&#34;what-about-knowledge-checks&#34;&gt;What about Knowledge Checks?&lt;/h3&gt;
&lt;p&gt;I&amp;rsquo;ve gone back and forth about the value of knowledge checks. There&amp;rsquo;s a good argument to be made that the player and / or the Game Master should have an idea of the kinds of things that are reasonable for the character to know.&lt;/p&gt;
&lt;p&gt;I went so far as explicitly removing them from my game, and instructing people to simply ask themselves if it&amp;rsquo;s reasonable for their character to know the thing you&amp;rsquo;re wondering about, and go with whatever the answer is.&lt;/p&gt;
&lt;p&gt;I still think that that is how &lt;em&gt;most&lt;/em&gt; knowledge checks should be handled. However, I realized that there are a lot of edge cases that aren&amp;rsquo;t reasonable, or fun to address that way. For example, pretend you&amp;rsquo;re a researcher who&amp;rsquo;s spent years reading old scrolls of arcane knowledge. Have you read &lt;em&gt;every&lt;/em&gt; scroll? Probably not. Have you read the one specific scroll about an especially obscure bit of lore? Again, probably not but&amp;hellip;. maybe?&lt;/p&gt;
&lt;p&gt;What&amp;rsquo;s more fun? The realistic probability that no living person has read that particular scroll &lt;em&gt;or&lt;/em&gt; saying &amp;ldquo;Probably not, but there&amp;rsquo;s a slim chance, so let&amp;rsquo;s roll to find out.&amp;rdquo; If the dice say you aren&amp;rsquo;t familiar with it, then you&amp;rsquo;re no worse off. If the dice say you &lt;em&gt;are&lt;/em&gt; familiar with it, then the player gets to describe the circumstances under which they came across this piece of obscure knowledge, and the GM gets to give the players a piece of unexpected, and useful knowledge. A chance for a player to shine, and an unexpected reward for trying.&lt;/p&gt;
&lt;p&gt;In this case you might be playing off of an &amp;ldquo;arcane lore&amp;rdquo; skill, or the character having a &amp;ldquo;arcane history degree&amp;rdquo;. The fighter doesn&amp;rsquo;t even roll, because it&amp;rsquo;s not reasonable to expect that their character would have ever been reading through obscure arcane scrolls.&lt;/p&gt;
&lt;h3 id=&#34;what-about-perception-and-investigation&#34;&gt;What about Perception &amp;amp; Investigation?&lt;/h3&gt;
&lt;h4 id=&#34;perception&#34;&gt;Perception&lt;/h4&gt;
&lt;p&gt;Perception is interesting. The ability to notice things &lt;em&gt;is&lt;/em&gt; a skill that you &lt;em&gt;can&lt;/em&gt; practice and improve, but few people have any reason to. Your default is generally &amp;ldquo;good enough.&amp;rdquo; If you were a scout, a guard, a thief, or someone who&amp;rsquo;s profession demanded good awareness you&amp;rsquo;d likely be well trained at this and better than most. However, I&amp;rsquo;ve yet to see a game that treats it this way.&lt;/p&gt;
&lt;p&gt;Perception checks are generally used to answer two questions &amp;ldquo;What do I see?&amp;rdquo; and &amp;ldquo;Did you notice that?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I loathe the first with a passion. Just tell the player what they see. If they ask &amp;ldquo;do I see X?&amp;rdquo; just tell them. There&amp;rsquo;s either a chair in the room or there isn&amp;rsquo;t. It&amp;rsquo;s not like the chair sitting in the middle of the floor will only be noticeable if they roll high enough. Everyone who isn&amp;rsquo;t literally blind is going to see the chair.&lt;/p&gt;
&lt;p&gt;The second has a lot of value, because you can&amp;rsquo;t just ask the player &amp;ldquo;Do you notice the assassin sneaking up on your character?&amp;rdquo; And it&amp;rsquo;s no fun to just declare that the guards you&amp;rsquo;re attempting to sneak past automatically notice you. It&amp;rsquo;s fine if they&amp;rsquo;ve got a &amp;ldquo;notice&amp;rdquo; or &amp;ldquo;perception&amp;rdquo; skill that&amp;rsquo;s radically higher than your &amp;ldquo;sneak&amp;rdquo; skill, but as a general statement there should be a roll to see if you can pull of the attempt.&lt;/p&gt;
&lt;h4 id=&#34;investigation&#34;&gt;Investigation&lt;/h4&gt;
&lt;p&gt;I&amp;rsquo;m pretty bad at finding things. If there&amp;rsquo;s something that needs to be found, and I&amp;rsquo;ve failed to find it, I call in my wife. I&amp;rsquo;ve got a pretty bad &amp;ldquo;investigation&amp;rdquo; skill. My wife has a higher rank in &amp;ldquo;investigation&amp;rdquo; than I do. At the same time if I were to rank us on a scale of say, 1-20 I&amp;rsquo;d put us at roughly the same number. So, eschewing an investigation skill means &amp;ldquo;just use your intelligence&amp;rdquo; and now my wife and I are equally good at finding things.&lt;/p&gt;
&lt;p&gt;Dogs, on the other hand, aren&amp;rsquo;t generally considered to be particularly smart animals (relative to humans) but they&amp;rsquo;ve got really good noses, and are great at finding things once you manage to convey to them what you&amp;rsquo;re looking for. Being good at investigation, is therefor independent of intelligence. You just need sensory input that&amp;rsquo;s good enough and a decent strategy for finding the input you&amp;rsquo;re looking for.&lt;/p&gt;
&lt;p&gt;I could practice, and approach the process of finding things in a more methodical way, and then I&amp;rsquo;d get better, but my intelligence level wouldn&amp;rsquo;t change. Dogs find things better when paired with a human with a better strategy for investigating. Investigation really is a skill. Deriving it from intelligence doesn&amp;rsquo;t make a lot of sense.&lt;/p&gt;
&lt;p&gt;We &lt;em&gt;need&lt;/em&gt; an investigation skill, and dice based checks because of people like me. The thing might be &amp;ldquo;just inside the closed door&amp;rdquo; but who&amp;rsquo;s to say I&amp;rsquo;m going to think of opening the closet? The roll represents the result of a search. The investigation skill represents how likely I am to do a good job at searching.&lt;/p&gt;
&lt;p&gt;We need a mechanism to determine if the thing we&amp;rsquo;re searching for is there.&lt;/p&gt;
&lt;p&gt;The Gumshoe system provides a partial counterargument for this. In Gumshoe if you&amp;rsquo;re skilled in a thing, and you ask about it at the appropriate time, you find it. If you&amp;rsquo;re not skilled, you probably don&amp;rsquo;t. For example, assume your character is a detective who regularly investigates murders. You arrive at the crime scene and ask &amp;ldquo;do i see blood spatter?&amp;rdquo; The answer is &amp;ldquo;Yes, and here&amp;rsquo;s everything it tells you&amp;rdquo;. If you&amp;rsquo;re a professional dog walker the answer is &amp;ldquo;maybe&amp;rdquo;. You then roll. Even if you &lt;em&gt;do&lt;/em&gt; notice it, it&amp;rsquo;s not going to mean as much to you as it will to the detective.&lt;/p&gt;
&lt;h3 id=&#34;clarification&#34;&gt;Clarification&lt;/h3&gt;
&lt;p&gt;When I speak about &amp;ldquo;fighters&amp;rdquo; and &amp;ldquo;thieves&amp;rdquo; I&amp;rsquo;m speaking about the archetypes. There&amp;rsquo;s no reason you couldn&amp;rsquo;t have a fighter who spent their childhood in a house of thieves learning to pick locks. Any character should be able to have any skill so long as there&amp;rsquo;s a reasonable explanation and it&amp;rsquo;s something they&amp;rsquo;re physically capable of doing.&lt;/p&gt;
&lt;p&gt;Also, this is about &amp;ldquo;most&amp;rdquo; TTRPGs, not all. In &lt;a href=&#34;https://gshowitt.itch.io/honey-heist&#34;&gt;Honey Heist&lt;/a&gt; you have 2 attributes: Bear and Criminal. You don&amp;rsquo;t need any more for that game. &lt;a href=&#34;http://www.onesevendesign.com/laserfeelings/&#34;&gt;Lasers &amp;amp; Feelings&lt;/a&gt; has just Lasers, and Feelings. People have had tons of fun playing both of these.&lt;/p&gt;
&lt;p&gt;That being said, most popular TTRPGs are building on the ideas that started with D&amp;amp;D. &lt;a href=&#34;https://cypher-system.com/&#34;&gt;Cypher System&lt;/a&gt; is radically different from D&amp;amp;D, but like most, it still has core attributes, and skills. It&amp;rsquo;s a fundamentally good way of describing the capabilities of a complex and nuanced character, who is more than just their core physical and mental attributes. Some games want that level of detail. Some don&amp;rsquo;t.&lt;/p&gt;
&lt;h3 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;We need skills to make characters backstories meaningful. We need them to differentiate characters in a meaningful way. We need them to address the fact that regardless of how smart, dextrous, or strong you are there are things that each of us know how to do that our companions do not.&lt;/p&gt;
&lt;p&gt;We need skill &lt;em&gt;checks&lt;/em&gt; to address the fact that sometimes you make mistakes, and sometimes your training isn&amp;rsquo;t good enough, and sometimes you&amp;rsquo;re just unlucky.&lt;/p&gt;
&lt;p&gt;A character that has a skill gives them, and their player, an opportunity to shine. That same character &lt;em&gt;not&lt;/em&gt; having other skills gives the &lt;em&gt;other&lt;/em&gt; characters an opportunity to shine. We want characters that aren&amp;rsquo;t good at things, so that they have obstacles. Having skills says &amp;ldquo;I&amp;rsquo;m good at this&amp;rdquo; but it also says &amp;ldquo;The skills my companions have, that I don&amp;rsquo;t, are things I&amp;rsquo;m &lt;em&gt;not&lt;/em&gt; good at.&amp;rdquo; This enriches our characters, and our stories, and also provides the GM with a list of things that they can leverage to let a character shine, or maybe help take the spotlight off of a character who&amp;rsquo;s been succeeding a little too much.&lt;/p&gt;
&lt;h3 id=&#34;update&#34;&gt;Update&lt;/h3&gt;
&lt;p&gt;Added the Clarification section based on comments on Mastodon.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Duct Tape &amp; Baling Wire Methodology</title>
      <link>https://weblog.masukomi.org/2023/02/10/duct-tape-baling-wire-methodology/</link>
      <pubDate>Fri, 10 Feb 2023 00:00:00 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/2023/02/10/duct-tape-baling-wire-methodology/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#duct-tape-and-baling-wire&#34;&gt;Duct Tape &amp;amp; Baling Wire&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#premise-and-perspective&#34;&gt;Premise, and Perspective&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#premise&#34;&gt;Premise&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#flexible-makeshift-materials&#34;&gt;Flexible Makeshift Materials&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-wrong-tool-for-the-job&#34;&gt;The &amp;ldquo;Wrong&amp;rdquo; Tool For The Job&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#quick-and-dirty-crap&#34;&gt;Quick &amp;amp; Dirty != Crap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-importance-of-context&#34;&gt;The Importance of Context&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-methodology&#34;&gt;The Methodology&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;duct-tape-and-baling-wire&#34;&gt;Duct Tape &amp;amp; Baling Wire&lt;/h2&gt;
&lt;p&gt;A coding methodology for personal projects and proof of concepts.&lt;/p&gt;
&lt;h3 id=&#34;premise-and-perspective&#34;&gt;Premise, and Perspective&lt;/h3&gt;
&lt;h4 id=&#34;premise&#34;&gt;Premise&lt;/h4&gt;
&lt;p&gt;There is a time and place for following &amp;ldquo;best practices&amp;rdquo; as a developer. It is not &amp;ldquo;always&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Best practices should be followed when&amp;hellip;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;your code can cause harm, damage, loss, etc.&lt;/li&gt;
&lt;li&gt;you are sharing software that people will rely on.&lt;/li&gt;
&lt;li&gt;people are paying you for a product that is expected to be &amp;ldquo;good quality&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In all other contexts following &amp;ldquo;best practices&amp;rdquo; are optional, and sometimes detrimental.&lt;/p&gt;
&lt;h4 id=&#34;flexible-makeshift-materials&#34;&gt;Flexible Makeshift Materials&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;Duct tape is commonly used in situations that require a strong, flexible, and very sticky tape. Some have a long-lasting adhesive and resistance to weathering. - &lt;a href=&#34;https://en.wikipedia.org/wiki/Duct_tape&#34;&gt;Wikipedia&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Its uses are infamous, and as a result, almost everyone has a roll of it on hand, even though it&amp;rsquo;s rarely the &amp;ldquo;correct&amp;rdquo; or &amp;ldquo;best&amp;rdquo; tape for any given job. It&amp;rsquo;s not even the right tape for ventilation ducts anymore.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Baling wire, otherwise known as bale wire, farm wire, haywire, or soft wire is a type of wire used in agriculture and industry for many uses such as mending fences or manually binding rectangular bales of hay, straw, or cut grass. It is also used in many non-agricultural applications such as banding together corrugated cardboard, paper, textiles, aluminum and other materials that are processed in the recycling industry.&lt;/p&gt;
&lt;p&gt;Baling wire is sometimes used in an informal, make-do manner as an easy fix. It is frequently referred to as one of the basic repair materials. Typical uses include supporting loose mufflers and patching chain-link fences. Common phrases often include baling wire as an ad hoc, fix-anything material, alongside chewing gum, duct tape, and the cable tie.  - &lt;a href=&#34;https://en.wikipedia.org/wiki/Baling_wire&#34;&gt;Wikipedia&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;While most of us don&amp;rsquo;t have a roll of Baling wire on hand, it&amp;rsquo;s become a similarly generic solution to a wide variety of problems by those who do. Baling wire is a little harder to work with than Duct Tape, but its much stronger, and can be trusted to hold things together for a significantly longer time.&lt;/p&gt;
&lt;h4 id=&#34;the-wrong-tool-for-the-job&#34;&gt;The &amp;ldquo;Wrong&amp;rdquo; Tool For The Job&lt;/h4&gt;
&lt;p&gt;Every time you&amp;rsquo;ve solved a problem with Duct Tape, you&amp;rsquo;ve likely used &amp;ldquo;the wrong tool for the job&amp;rdquo;. At the same time, it&amp;rsquo;s rarely a &amp;ldquo;bad&amp;rdquo; decision. The &amp;ldquo;right&amp;rdquo; tool is frequently unavailable, or inconvenient. The &amp;ldquo;right&amp;rdquo; tool frequently involves taking more time, and applying more care and consideration than the problem justifies.&lt;/p&gt;
&lt;p&gt;Sometimes a &amp;ldquo;quick and dirty&amp;rdquo; hack is absolutely the &amp;ldquo;right&amp;rdquo; choice. If you&amp;rsquo;re having a yard sale, and the wind keeps blowing your sign away, then grabbing some Duct Tape and taping it down is a great choice. It&amp;rsquo;s a far better choice than canceling the yard sale while you go off and build a waterproof, wind-proof, ground-embeddable, backlit sign holder made exclusively out of recycled materials.&lt;/p&gt;
&lt;h4 id=&#34;quick-and-dirty-crap&#34;&gt;Quick &amp;amp; Dirty != Crap&lt;/h4&gt;
&lt;p&gt;Quick and Dirty hacks should be applauded, not derided. They are applied when we need to accomplish a goal, and the most important criteria is speed, not quality. It doesn&amp;rsquo;t need to be pretty. It doesn&amp;rsquo;t need to last forever. It just needs to hold up long enough to serve a short term function.&lt;/p&gt;
&lt;p&gt;Imagine you&amp;rsquo;re a race-car driver, today is the last race of the season, if you win your team could take home millions. Some important mount in your car has broken. You&amp;rsquo;ve got a roll of baling wire. You need 2 things: for your car to be ready when the race starts, and for your car to last one more race. You grab the baling wire, wrap the 💩 out of the thing that needs to be held up, and drive! It doesn&amp;rsquo;t matter if the car falls apart afterwards. What matters is that you&amp;rsquo;re back in the race.&lt;/p&gt;
&lt;p&gt;That is not a crap solution. That is a &lt;em&gt;glorious&lt;/em&gt; solution. That solution solved a problem, and gave a team the opportunity to get paid, and possibly become famous.&lt;/p&gt;
&lt;p&gt;Imagine your company is trying to decide if they should spend the next 3 months building out some new functionality that sounds cool, but no-one&amp;rsquo;s really sure about. Spending a week slapping together a proof-of-concept &amp;ldquo;test spike&amp;rdquo; with whatever tools you have readily available, is a great idea. It doesn&amp;rsquo;t matter that it doesn&amp;rsquo;t scale. It doesn&amp;rsquo;t matter that it only works on Mary&amp;rsquo;s computer. It doesn&amp;rsquo;t matter that regardless of success or failure it&amp;rsquo;s going to be hucked in the trash. What matters is that it proved or disproved the idea in the shortest amount of time possible.&lt;/p&gt;
&lt;h4 id=&#34;the-importance-of-context&#34;&gt;The Importance of Context&lt;/h4&gt;
&lt;p&gt;The problem with a Duct Tape &amp;amp; Baling Wire approach to coding is that developers are crap at following best practices even when they &lt;em&gt;know&lt;/em&gt; they should. Our egos tell us our code is good and we skip writing tests, or only write perfunctory ones. Our brains suffer from &amp;ldquo;&lt;a href=&#34;https://en.wikipedia.org/wiki/Recency_bias&#34;&gt;Recency Bias&lt;/a&gt;&amp;rdquo; and assume that because our bad habits didn&amp;rsquo;t bite us in the ass the last few times, that they&amp;rsquo;re an acceptable approach.&lt;/p&gt;
&lt;p&gt;Duct Tape &amp;amp; Baling Wire are great solutions &lt;em&gt;in specific contexts&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Again, don&amp;rsquo;t use this technique when&amp;hellip;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;your code can cause harm, damage, loss, etc.&lt;/li&gt;
&lt;li&gt;you are sharing software that people will rely on.&lt;/li&gt;
&lt;li&gt;people are paying you for a product that is expected to be &amp;ldquo;good quality&amp;rdquo;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This applies even if you&amp;rsquo;re putting together a &amp;ldquo;Quick and Dirty&amp;rdquo; proof-of-concept. If it has to talk to the production database, then you better damn well ensure you&amp;rsquo;re not altering records, or overwhelming the server with expensive queries.&lt;/p&gt;
&lt;p&gt;That doesn&amp;rsquo;t mean that you have to take an &amp;ldquo;all or nothing&amp;rdquo; approach. You can build a quick and dirty app, while &lt;em&gt;also&lt;/em&gt; following best practices within specific areas of it.&lt;/p&gt;
&lt;h3 id=&#34;the-methodology&#34;&gt;The Methodology&lt;/h3&gt;
&lt;p&gt;Duct Tape &amp;amp; Baling Wire is an approach to software development rooted in the following ideas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sometimes fast is better than &amp;ldquo;good&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Sometimes accepting risk, is better than guaranteeing control.&lt;/li&gt;
&lt;li&gt;Sometimes &amp;ldquo;works for me&amp;rdquo;, or &amp;ldquo;works for now&amp;rdquo; is all that matters.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Duct Tape &amp;amp; Baling Wire is&amp;hellip;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;recognizing that sometimes it&amp;rsquo;s ok to write &amp;ldquo;bad&amp;rdquo; code.&lt;/li&gt;
&lt;li&gt;embracing the clumsy, inelegant, nature of a &lt;a href=&#34;https://en.wiktionary.org/wiki/bodge&#34;&gt;bodge&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;choosing easy, and fast, over elegant, and good.&lt;/li&gt;
&lt;li&gt;finding and using tools that already do what you need.&lt;/li&gt;
&lt;li&gt;not caring that you don&amp;rsquo;t know how something works.&lt;/li&gt;
&lt;li&gt;accepting that if it breaks, you won&amp;rsquo;t be able to fix it.&lt;/li&gt;
&lt;li&gt;connecting things that were never intended to go together.&lt;/li&gt;
&lt;li&gt;not worrying about efficiency until you need to.&lt;/li&gt;
&lt;li&gt;looking outside your bubble for other people&amp;rsquo;s solutions.&lt;/li&gt;
&lt;li&gt;buying a hammer, instead of making one.&lt;/li&gt;
&lt;li&gt;being thankful for the &lt;a href=&#34;https://en.wikipedia.org/wiki/Unix_philosophy&#34;&gt;Unix Philosophy&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;knowing that sometimes using Duct Tape and Baling Wire is a terrible and/or dangerous choice, and taking the time to do the right thing when it is.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Duct Tape &amp;amp; Bailing Wire is &lt;em&gt;not&lt;/em&gt;&amp;hellip;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;code you want to show off.&lt;/li&gt;
&lt;li&gt;appropriate for anything you&amp;rsquo;re selling.&lt;/li&gt;
&lt;li&gt;good for maintainability.&lt;/li&gt;
&lt;li&gt;good for collaboration.&lt;/li&gt;
&lt;li&gt;acceptable when other people can be harmed.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>GraphQL Thoughts</title>
      <link>https://weblog.masukomi.org/2023/02/08/graphql-thoughts/</link>
      <pubDate>Wed, 08 Feb 2023 00:00:00 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/2023/02/08/graphql-thoughts/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#intro-thoughts&#34;&gt;Intro Thoughts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#promises&#34;&gt;Promises&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#only-retrieve-the-data-you-need&#34;&gt;Only Retrieve The Data You need&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#fewer-requests&#34;&gt;Fewer requests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#get-data-in-the-appropriate-shape&#34;&gt;Get Data in the appropriate shape&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#your-query-s-shape-will-match-the-shape-of-the-response&#34;&gt;Your query&amp;rsquo;s shape will match the shape of the response&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#moves-much-of-the-data-filtering-and-parsing-back-to-the-server&#34;&gt;Moves much of the data filtering and parsing back to the server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#an-api-reference-document-for-people-using-it&#34;&gt;An API reference document for people using it&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#combine-data-from-multiple-systems-in-1-response&#34;&gt;Combine data from multiple systems in 1 response&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#subscriptions&#34;&gt;Subscriptions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#implied-promise--look-ma-it-s-almost-json&#34;&gt;(Implied Promise) Look Ma, it&amp;rsquo;s almost JSON&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#counterargument&#34;&gt;Counterargument&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;intro-thoughts&#34;&gt;Intro Thoughts&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve been mostly avoiding GraphQL and watching from the sidelines. I&amp;rsquo;d been forming an opinion but wanted to actually understand it a bit better before really deciding.&lt;/p&gt;
&lt;p&gt;Well I&amp;rsquo;ve just gone through a course on it, and I am &lt;em&gt;very&lt;/em&gt; sad to say that my impression has not changed.&lt;/p&gt;
&lt;p&gt;GraphQL is, in most cases, a way for teams within your company to avoid discussing their needs with each other. Resulting in massive inefficiencies that are plastered by yet another layer requiring additional maintenance and code. For bonus points, it&amp;rsquo;s pretty much guaranteed to break because you&amp;rsquo;re plastering over human communication and coordination problems with technology.&lt;/p&gt;
&lt;p&gt;The exception to all this is when you&amp;rsquo;re building a GraphQL layer to plaster over other companies&amp;rsquo; APIs you have no ability to influence. Honestly though, that&amp;rsquo;s rarely how people are using it.&lt;/p&gt;
&lt;h2 id=&#34;promises&#34;&gt;Promises&lt;/h2&gt;
&lt;h3 id=&#34;only-retrieve-the-data-you-need&#34;&gt;Only Retrieve The Data You need&lt;/h3&gt;
&lt;p&gt;Translation: don&amp;rsquo;t bother to discuss your needs with the team creating the primary API so that they can create an endpoint that only produces the data you need. Instead do lots of unnecessary calculations in the original API, marshall, and then ship unwanted data over the wire, unmartial, process, and filter that data, to get just the bits you care about.&lt;/p&gt;
&lt;h3 id=&#34;fewer-requests&#34;&gt;Fewer requests&lt;/h3&gt;
&lt;p&gt;Example: Instead of hitting one endpoint, getting a list of objects, and then retrieving each of those objects in separate requests, you can use one GraphQL request.&lt;/p&gt;
&lt;p&gt;Translation: don&amp;rsquo;t bother discussing your needs with the team creating the primary API. Instead, insert additional processing and latency into the system, and convert N requests into N+1.&lt;/p&gt;
&lt;h3 id=&#34;get-data-in-the-appropriate-shape&#34;&gt;Get Data in the appropriate shape&lt;/h3&gt;
&lt;p&gt;Example: The API returns data in structure A, but you need structure B.&lt;/p&gt;
&lt;p&gt;Translation: don&amp;rsquo;t bother discussing your needs with the team creating the primary API. Instead, insert additional processing and latency into the system, and convert N requests into N+1.&lt;/p&gt;
&lt;h3 id=&#34;your-query-s-shape-will-match-the-shape-of-the-response&#34;&gt;Your query&amp;rsquo;s shape will match the shape of the response&lt;/h3&gt;
&lt;p&gt;Why is that a good thing? Are you suggesting that It would be better to somehow draw a matrix of values when querying a database instead of using SQL?&lt;/p&gt;
&lt;p&gt;How about using query languages that are specific to the domain instead of having no bearing on the domain but having a passing resemblance to the shape of the data coming back.&lt;/p&gt;
&lt;h3 id=&#34;moves-much-of-the-data-filtering-and-parsing-back-to-the-server&#34;&gt;Moves much of the data filtering and parsing back to the server&lt;/h3&gt;
&lt;p&gt;Translation: don&amp;rsquo;t bother discussing your needs with the team creating the primary API. Instead, insert additional processing and latency into the system, and convert N requests into N+1.&lt;/p&gt;
&lt;h3 id=&#34;an-api-reference-document-for-people-using-it&#34;&gt;An API reference document for people using it&lt;/h3&gt;
&lt;p&gt;Great, but that&amp;rsquo;s not unique to GraphQL, and there&amp;rsquo;s no need to use GraphQL to get that.&lt;/p&gt;
&lt;h3 id=&#34;combine-data-from-multiple-systems-in-1-response&#34;&gt;Combine data from multiple systems in 1 response&lt;/h3&gt;
&lt;p&gt;This isn&amp;rsquo;t bad. However, it does raise a lot of questions around &amp;ldquo;why&amp;rdquo; and if it really is a good thing to pretend that it&amp;rsquo;s one homogeneous thing. I can imagine a number of cases where this is good. I can imagine a number of situations where this is good. They mostly involve lots of microservices which is a thing that lots of companies talk about, few companies do, and most companies that do do regret for a variety of reasons that are mostly not communicating and not thinking about implications of choices in context of the full system.&lt;/p&gt;
&lt;h3 id=&#34;subscriptions&#34;&gt;Subscriptions&lt;/h3&gt;
&lt;p&gt;Cool. My initial question was &amp;ldquo;Why is this better than WebSockets?&amp;rdquo; Turns out, it isn&amp;rsquo;t. Subscriptions are usually implemented with WebSockets. The &amp;ldquo;usually&amp;rdquo; part of that is disturbing as 💩 to me, and raises all sorts of warning flags.&lt;/p&gt;
&lt;h3 id=&#34;implied-promise--look-ma-it-s-almost-json&#34;&gt;(Implied Promise) Look Ma, it&amp;rsquo;s almost JSON&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Either use JSON or don&amp;rsquo;t. Don&amp;rsquo;t use some half-assed quasi-JSON thing that promises familiarity via JSON and then promptly kicks you by leaving out commas and colons half the time. Not all the time&amp;hellip; just some of the time.&lt;/li&gt;
&lt;li&gt;The Java geeks thought XML was pretty hot back in 2010. They tried rewriting everything in it too. Look how well that worked out.&lt;/li&gt;
&lt;li&gt;Use the right tool for the job, not the popular tool. As query languages go JSON, and JSON-like things, are kinda crap.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;counterargument&#34;&gt;Counterargument&lt;/h2&gt;
&lt;p&gt;Yes, but sometimes those other teams can&amp;rsquo;t give us what we want when we want it.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s a human problem that needs human solutions not technology solutions: planning, coordination, prioritization, working together, and being smart enough to not introduce unnecessary tech debt.&lt;/p&gt;
&lt;p&gt;If you company&amp;rsquo;s internal communications are that dysfunctional you should be spending energy on fixing them, not plastering over them with yet another layer of technology that will never solve the fundamental problem. Ditto if the problem is an inability to work together in a coordinated fashion.&lt;/p&gt;
&lt;p&gt;Talk to each other. Work together. Don&amp;rsquo;t try and convince yourself that that&amp;rsquo;s ever something you can work around with technology.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Notable Things about Pathfinder</title>
      <link>https://weblog.masukomi.org/2023/02/05/notable-things-about-pathfinder/</link>
      <pubDate>Sun, 05 Feb 2023 00:00:00 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/2023/02/05/notable-things-about-pathfinder/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#ancestries-not-race&#34;&gt;Ancestries not Race&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#backgrounds-are-more-meaningful&#34;&gt;Backgrounds are more meaningful&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#skills&#34;&gt;Skills&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#feats-aren-t-just-abilities&#34;&gt;Feats aren&amp;rsquo;t just abilities&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#character-creation-is-easy&#34;&gt;Character Creation is easy&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#the-archetypes&#34;&gt;The Archetypes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#so-many-classes&#34;&gt;So Many Classes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#you-don-t-need-to-buy-books-you-don-t-need&#34;&gt;You Don&amp;rsquo;t Need To Buy Books You Don&amp;rsquo;t Need&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#details-details-details&#34;&gt;Details Details Details&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#bookcraft&#34;&gt;Bookcraft&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-world&#34;&gt;The World&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#all-the-colors-of-the-rainbow&#34;&gt;All The Colors of the Rainbow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-adventure-paths&#34;&gt;The Adventure Paths&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#what-about-starfinder&#34;&gt;What about Starfinder?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#what-next&#34;&gt;What Next?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#obligatory-disclaimer&#34;&gt;Obligatory Disclaimer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;p&gt;A friend asked what was notable about &lt;a href=&#34;https://paizo.com/pathfinder&#34;&gt;Pathfinder 2nd Edition&lt;/a&gt; in comparison to D&amp;amp;D 5th Edition.&lt;/p&gt;
&lt;p&gt;I thought I&amp;rsquo;d write up my thoughts because he&amp;rsquo;s not the only one wondering that
these days. Note that the following are in no particular order.&lt;/p&gt;
&lt;h2 id=&#34;ancestries-not-race&#34;&gt;Ancestries not Race&lt;/h2&gt;
&lt;p&gt;Even if we set aside the problematic idea of &amp;ldquo;race&amp;rdquo;, your biology only plays a small part who you grow to be. Pathfinder acknowledges this.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ancestries express the culture your character hails from. Within many ancestries are heritages— subgroups that each have their own characteristics. An ancestry provides ability boosts (and perhaps ability flaws), Hit Points, ancestry feats, and sometimes additional abilities.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ancestry can be thought of as &amp;ldquo;species&amp;rdquo; most of the time, whereas &amp;ldquo;heritage&amp;rdquo; is more about the environment you grew up in. Your biology provides biological advantages and disadvantages. So does the environment you were raised in.  Ancestries &lt;em&gt;also&lt;/em&gt; provide &amp;ldquo;feats&amp;rdquo; you can take as you level. For example, a Dwarf could take &amp;ldquo;Dwarven Lore&amp;rdquo;, or various things related to familiarity with stone as a result of growing up underground.&lt;/p&gt;
&lt;p&gt;The book comes with 6 common fantasy ancestries. However, if you include all the additional content (see below) there are 31 Ancestries to choose from.&lt;/p&gt;
&lt;h2 id=&#34;backgrounds-are-more-meaningful&#34;&gt;Backgrounds are more meaningful&lt;/h2&gt;
&lt;p&gt;In D&amp;amp;D Background is mostly just about providing some story flavor for your
character. It doesn&amp;rsquo;t really have much mechanical effect. In Pathfinder each background gives you 2 ability boosts, as well as skills that you are &amp;ldquo;trained&amp;rdquo; in.&lt;/p&gt;
&lt;h2 id=&#34;skills&#34;&gt;Skills&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;While your character&amp;rsquo;s ability scores represent their raw talent and potential, skills represent their training and experience at performing certain tasks. Each skill is keyed to one of your character&amp;rsquo;s ability scores and used for an array of related actions. Your character&amp;rsquo;s expertise in a skill comes from several sources, including their background and class.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You can get better at your skills over time, and they&amp;rsquo;re actually specific things that not every character has.  Each skill has a level noted as untrained, trained, expert, master, or legendary. They&amp;rsquo;re specific and interesting. For example under Acrobatics we have &amp;ldquo;Tumble Through&amp;rdquo; (allows you to try and move through an enemy space), under Arcana there&amp;rsquo;s &amp;ldquo;Borrow an Arcane Spell&amp;rdquo; which lets you &amp;ldquo;borrow&amp;rdquo; a spell from someone else&amp;rsquo;s spellbook during your day&amp;rsquo;s spell preparation.&lt;/p&gt;
&lt;h2 id=&#34;feats-aren-t-just-abilities&#34;&gt;Feats aren&amp;rsquo;t just abilities&lt;/h2&gt;
&lt;p&gt;Feats do give you new capabilities, but they also serve to add more flavor to your character. &amp;ldquo;Hobnobber&amp;rdquo; lets you gather more information through conversations. &amp;ldquo;Lie to me&amp;rdquo; lets you trip up people trying to deceive you. &amp;ldquo;Impeccable crafting&amp;rdquo; means that your crafting skills are so good that a successful Specialty Crafting roll is automatically a critical success.&lt;/p&gt;
&lt;h2 id=&#34;character-creation-is-easy&#34;&gt;Character Creation is easy&lt;/h2&gt;
&lt;p&gt;While the number of options is potentially overwhelming to a new player, they guide you through the process step by step, and also explain what every aspect of the standard character sheet is for. As you are choosing aspects of your character they tell you exactly where to put it on the character sheet and what numbers go where and where they came from.&lt;/p&gt;
&lt;h3 id=&#34;the-archetypes&#34;&gt;The Archetypes&lt;/h3&gt;
&lt;p&gt;For each of the primary classes Paizo has created an &amp;ldquo;Archetype&amp;rdquo; character. These are the characters you see being heroic in all the Pathfinder art. These characters serve not only to give you concrete examples to point to while learning the game, but they&amp;rsquo;re also all actual characters that beginners are encouraged to play.&lt;/p&gt;
&lt;h2 id=&#34;so-many-classes&#34;&gt;So Many Classes&lt;/h2&gt;
&lt;p&gt;Wizards of The Coast hasn&amp;rsquo;t put out many classes for 5th edition. Pathfinder&amp;rsquo;s core book has the same 12 classes as D&amp;amp;D, but if you include the additional content they&amp;rsquo;ve released there are 21 possible classes. These are all available for free online.&lt;/p&gt;
&lt;p&gt;To me this is notable because there&amp;rsquo;s obvious demand from players to be able to express cool ideas for their characters that don&amp;rsquo;t quite fit into the existing classes. People are constantly homebrewing D&amp;amp;D classes, but as a DM I don&amp;rsquo;t want my players to use them, because I don&amp;rsquo;t know if they&amp;rsquo;re even remotely balanced. They could have glaring flaws that make them annoying to play, or completely overpowered relative to everyone else in the group. I don&amp;rsquo;t want to have to spend hours trying to figure out the potential long-term consequences of the choices of someone&amp;rsquo;s random homebrew.&lt;/p&gt;
&lt;p&gt;Pathfinder&amp;rsquo;s classes are by folks who do this for a living. There&amp;rsquo;s a reasonably good chance that even if they have faults, they&amp;rsquo;re not going to have a significant effect on your fun. More official classes, means more options for players to express their ideas without accidentally causing problems.&lt;/p&gt;
&lt;h2 id=&#34;you-don-t-need-to-buy-books-you-don-t-need&#34;&gt;You Don&amp;rsquo;t Need To Buy Books You Don&amp;rsquo;t Need&lt;/h2&gt;
&lt;p&gt;You should probably buy the core book, but if you wanted to play a character with the Oracle class, you could just look it up online. &lt;a href=&#34;https://2e.aonprd.com&#34;&gt;The Archives of Nethys&lt;/a&gt; has all the official content online. Paizo has released everything under the OGL so it&amp;rsquo;s completely legal. Yes, Paizo would like you to buy their books, but they don&amp;rsquo;t seem interested in trying to convince anyone to buy an entire book just to get the one new species or class that you want even when you don&amp;rsquo;t care about anything else in it.&lt;/p&gt;
&lt;h2 id=&#34;details-details-details&#34;&gt;Details Details Details&lt;/h2&gt;
&lt;p&gt;Many D&amp;amp;D players feel a bit overwhelmed when they see the size of the core book. It&amp;rsquo;s more than twice as big as the D&amp;amp;D Player&amp;rsquo;s Handbook &amp;amp; the D&amp;amp;D Game Master&amp;rsquo;s guide. The main difference is that Paizo is giving you &lt;em&gt;everything&lt;/em&gt; you need to play. They&amp;rsquo;re not trying to trick you into paying more by splitting it into 2+ books. They&amp;rsquo;re not hiding GM info from the players. Everyone is an equal participant and they&amp;rsquo;re not being greedy.&lt;/p&gt;
&lt;p&gt;Much like the overwhelming size of the book, the rules can feel overwhelming to new players too. There&amp;rsquo;s more of them and you can do more on your turn, and everything&amp;rsquo;s more detailed, and, and, and&amp;hellip; D&amp;amp;D&amp;rsquo;s authors tend to be very imprecise and ambiguous in how they describe things. This feels less overwhelming, but it means that you&amp;rsquo;re going to have a lot of debates at the table trying to figure out what the hell the authors meant or if they even considered the implications of this thing being used under these circumstances.&lt;/p&gt;
&lt;p&gt;Pathfinder&amp;rsquo;s authors on the other hand have taken the time to explain everything &lt;em&gt;very&lt;/em&gt; clearly. You&amp;rsquo;re not going to have many table debates where everyone&amp;rsquo;s trying to guess at the intended meaning of a rule, and if you should use that, or what it says even if it doesn&amp;rsquo;t make sense. Instead, you&amp;rsquo;re going to just look at the rule, read it, and do what it says. Pathfinder asks for a tiny bit more work up front, in order to let you understand everything better while playing. At the worst you&amp;rsquo;ll take a moment to look up a rule, and then go on, rather than look it up, and have a debate about it.&lt;/p&gt;
&lt;h2 id=&#34;bookcraft&#34;&gt;Bookcraft&lt;/h2&gt;
&lt;p&gt;The Pathfinder 2e Core book is, in my opinion, the best example of good bookcraft in the Tabletop RPG world. On the edge of the every right page is a section guide with the current section highlighted, so you can easily flip through it. Iconography is used throughout to help convey inportant information quickly. For example, there are icons next to abilities / spells that take more than one action to perform that make it clear if it takes 2 or 3 actions (Pathfinder has 3 actions per turn). The way they use headings and colors also makes it very easy to visually scan a page. It&amp;rsquo;s just an excellent job that every TTRPG publisher would do well to emulate.&lt;/p&gt;
&lt;h2 id=&#34;the-world&#34;&gt;The World&lt;/h2&gt;
&lt;p&gt;The canonical setting is called Golarian. It feels rich, and well thought out, with different peoples and spread across the world. In many ways it&amp;rsquo;s a collection of common fantasy tropes that have been spread out over the lands so that you can choose the type of common fantasy thing you want to deal with and stay in an area that&amp;rsquo;s centered around that idea.&lt;/p&gt;
&lt;p&gt;For me Glorantha (the setting for Runequest) feels so detailed and specific that I enjoy reading about it, but am uncomfortable playing in it because I &lt;em&gt;know&lt;/em&gt; I&amp;rsquo;d be getting something &amp;ldquo;wrong&amp;rdquo;.  Golarian (Pathfinder&amp;rsquo;s) meanwhile feels, to me, that it&amp;rsquo;s been described well enough for me to have a basic familiarity with a given area, but not so much that I feel like I&amp;rsquo;m &amp;ldquo;doing it wrong&amp;rdquo; when I start improvising things about it.&lt;/p&gt;
&lt;p&gt;I wouldn&amp;rsquo;t be surprised if there were just as many, if not more, details available for Paizo&amp;rsquo;s world, but somehow Paizo&amp;rsquo;s stuff comes across more as &amp;ldquo;hey, here&amp;rsquo;s an option if you want it&amp;rdquo; rather than &amp;ldquo;This is the way the world is!&amp;rdquo;. The core book contains roughly 30 pages giving you a basic overview of each of the main areas with half a page of description and an inspirational image.&lt;/p&gt;
&lt;p&gt;The supplemental books are written in such a way that it&amp;rsquo;s easy to take the content and use it in other worlds, which makes them really valuable even if you don&amp;rsquo;t play Pathfinder.&lt;/p&gt;
&lt;h2 id=&#34;all-the-colors-of-the-rainbow&#34;&gt;All The Colors of the Rainbow&lt;/h2&gt;
&lt;p&gt;Paizo has fully embraced modern thinking about race/species, gender and sexuality. Two of the archetypes are canonically in a lesbian relationship. There are gender neutral characters. They specifically encourage the use of pronouns.&lt;/p&gt;
&lt;p&gt;That being said, some of the stuff has been around for a long time. Rise of the Runelords (one of the more famous Adventure Paths) came out for Pathfinder 1st edition in 2007, and sometimes the heterosexual assumptions are revealed. It&amp;rsquo;s been updated for 2nd edition rules, but I don&amp;rsquo;t think Paizo has bothered to have a sensitivity reader take a look at it.&lt;/p&gt;
&lt;h2 id=&#34;the-adventure-paths&#34;&gt;The Adventure Paths&lt;/h2&gt;
&lt;p&gt;Pathfinder offers something I wish &lt;em&gt;every&lt;/em&gt; TTRPG publisher would offer. They call them &amp;ldquo;&lt;a href=&#34;https://paizo.com/store/pathfinder/adventures/adventurePath&#34;&gt;Adventure Paths&lt;/a&gt;&amp;rdquo;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Every month, the Pathfinder Adventure Path brings you a new installment of a multi-part series of interconnected quests that together create a fully developed plot of sweeping scale and epic challenges.&lt;/p&gt;
&lt;p&gt;With two complete campaigns every year, Pathfinder Adventure Path offers a diverse and ever-growing catalogue of themes, challenges, and play experiences. - &lt;a href=&#34;https://paizo.com/store/pathfinder/adventures/adventurePath&#34;&gt;Paizo.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It&amp;rsquo;s somewhere between a magazine subscription and a Patreon. You subscribe and every month they send you the next installment in a 6 month campaign at a 30% discount. They get a constant stream of money to stay in business, the world gets bigger, and you subscribers get more content to run for their players. These are also high quality, high production value adventures by professional game designers that Paizo will then sell separately.&lt;/p&gt;
&lt;h2 id=&#34;what-about-starfinder&#34;&gt;What about Starfinder?&lt;/h2&gt;
&lt;p&gt;Superficially Starfinder looks like &amp;ldquo;Pathfinder, but Sci-Fi&amp;rdquo;. The reality is more nuanced than that. First, it&amp;rsquo;s actual sci-fi, not &amp;ldquo;let&amp;rsquo;s give your sword swinging fantasy characters a spaceship&amp;rdquo; like &lt;a href=&#34;https://dnd.wizards.com/products/spelljammer&#34;&gt;Spelljammer&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;[Paizo creative director James Sutter] cites the Star Wars, Alien, and Guardians of the Galaxy franchises among the films he and his team drew from for Starfinder, which is set thousands of years in the future of Paizo&amp;rsquo;s blockbuster Pathfinder franchise. Firefly and The Expanse also make the list, along with the comic book series East of West and Saga.  - &lt;a href=&#34;https://www.vice.com/en/article/qvvvjx/starfinder-brings-fan-favorite-fantasy-tabletop-rpg-to-space&#34;&gt;Vice.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;!--quoteend--&gt;
&lt;blockquote&gt;
&lt;p&gt;Starfinder shares its setting with Pathfinder, set in its far future after Golarion, the planet that Pathfinder was set on, had mysteriously disappeared in an event called &amp;ldquo;The Gap&amp;rdquo;. The history of the planet during the disappearance is lost to all races, preventing players from returning and interfering with previous events in the Pathfinder timeline, while also acting as the foundation of Starfinder&amp;rsquo;s own timeline. Because Starfinder shares its past with Pathfinder, races and monsters of the Pathfinder setting persist in the Starfinder universe alongside new alien races from other worlds. Magic remains a part of the game&amp;rsquo;s mechanics, often intertwined with high-level technology. In the time since the Gap, allied races formed an alliance called the Pact Worlds for diplomacy, trade, and technological sharing, with Absalom Station as their focal point for these activities. An organization called the Starfinder Society, based on Absalom Station and other planets, was established to seek out pre-Gap technology and any information that may have explained what happened prior to that event. - &lt;a href=&#34;https://en.wikipedia.org/wiki/Starfinder_Roleplaying_Game&#34;&gt;Wikipedia&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The game was released roughly 1 1/2 years before Pathfinder 2e. As a result, Pathfinder benefits from a fair amount of additional gameplay and rules refinement before its release. Like pathfinder&lt;/p&gt;
&lt;h2 id=&#34;what-next&#34;&gt;What Next?&lt;/h2&gt;
&lt;p&gt;Maybe watch &lt;a href=&#34;https://youtu.be/j4syvdM5fy8&#34;&gt;this Video by The Rules Lawyer&lt;/a&gt; discussing his &amp;ldquo;10 Reasons Pathfinder is Easier To Run Than D&amp;amp;D 5e&amp;rdquo;. If you&amp;rsquo;re even remotely interested in D&amp;amp;D style gaming you should totally pick up a copy of Pathfinder 2e.&lt;/p&gt;
&lt;p&gt;Pathfinder 1st Edition was an obvious, unabashed rip-off of D&amp;amp;D 3.5 when Wizards of The Coast got greedy upon the release of 4th edition. Pathfinder 2nd edition feels like Paizo asked itself &amp;ldquo;What would it look like if we updated with everything we&amp;rsquo;ve learned since then.&amp;rdquo; Basically, the same thing the D&amp;amp;D folks did, but they took the same lessons and applied them differently, and created their own thing with Pathfinder 2nd Edition.&lt;/p&gt;
&lt;p&gt;Want to learn about how to play? Check out this episode of the RPGBOT.podcast where they discuss &lt;a href=&#34;https://rpgbot.net/rpgbot-quickstart-s3e6-how-to-play-pathfinder-2e-part-1-concepts-and-themes/&#34;&gt;How to Play Pathfinder Second Edition (Part 1)&lt;/a&gt;. &lt;a href=&#34;https://rpgbot.net/rpgbot-quickstart-s3e8-how-to-play-pathfinder-2e-part-2-character-creation/&#34;&gt;Part 2&lt;/a&gt; gives an example of character creation.&lt;/p&gt;
&lt;h2 id=&#34;obligatory-disclaimer&#34;&gt;Obligatory Disclaimer&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m a mechanics geek. I read tons of TTRPG books, but only play a few. I haven&amp;rsquo;t gotten Pathfinder to the table yet, and I definitely haven&amp;rsquo;t played it from 1st level to 20th. That being said, I have read a &lt;em&gt;lot&lt;/em&gt; of TTRPGs and I have a ton of respect for what I&amp;rsquo;ve read in Pathfinder.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d choose Pathfinder over D&amp;amp;D any day of the week. D&amp;amp;D&amp;rsquo;s ambiguities drive me nuts. As a DM I hate the way 1st level characters are hard to keep alive. I hate that once characters get past 10th level combat just feels like the DM is making up bullshit rule exceptions for the monsters to be able to stay alive for more than two rounds against players. &amp;ldquo;oh it&amp;rsquo;s a &amp;rsquo;legendary action&amp;rsquo;&amp;rdquo;. Arrgh.&lt;/p&gt;
&lt;p&gt;If given my &lt;a href=&#34;https://en.wiktionary.org/wiki/druthers&#34;&gt;druthers&lt;/a&gt; I wouldn&amp;rsquo;t choose either though. There are so many amazing games out there that aren&amp;rsquo;t just another take on the core mechanical ideas D&amp;amp;D came out with decades ago. &lt;a href=&#34;https://www.montecookgames.com/store/product-line/cypher-system/&#34;&gt;Cypher System&lt;/a&gt; is one of the most elegant games every written. &lt;a href=&#34;https://evilhat.com/product/fate-core-system/&#34;&gt;FATE&lt;/a&gt; is so flexible and good. We are truly in a Golden Age of TTRPGs.&lt;/p&gt;
&lt;p&gt;If you want to play Pathfinder I think you&amp;rsquo;ll have a blast. If you&amp;rsquo;re just looking for something &amp;ldquo;not D&amp;amp;D&amp;rdquo; Pathfinder is a great choice, but there are lots of other great choices that might be a better fit for your group. If want some help finding something &lt;a href=&#34;https://dice.camp/@masukomi&#34;&gt;ask me on Mastodon&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Don&#39;t Overthink Your PKM</title>
      <link>https://weblog.masukomi.org/2023/01/14/dont-overthink-your-pkm/</link>
      <pubDate>Sat, 14 Jan 2023 00:00:00 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/2023/01/14/dont-overthink-your-pkm/</guid>
      <description>&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s important for all knowledge workers to have a Personal Knowledge Management System (PKM). That doesn&amp;rsquo;t mean you need a fancy tool, or a complex process. Sometimes, the &amp;ldquo;stupid simple&amp;rdquo; solution is the best one.&lt;/p&gt;
&lt;p&gt;To that end, I wanted to talk through my wife&amp;rsquo;s system. It&amp;rsquo;s an important example because her choice to specifically &lt;em&gt;not&lt;/em&gt; use any of the fancy purpose built tools has resulted in a &lt;em&gt;better&lt;/em&gt; solution for her needs.&lt;/p&gt;
&lt;p&gt;For context: she&amp;rsquo;s a Developer Educator. This is a fancy way of saying she documents APIs and writes code. Her job is to help other people understand how to use various libraries and tools.&lt;/p&gt;
&lt;h2 id=&#34;her-process&#34;&gt;Her Process&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;When she needs to look up a piece of information twice, she records it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When she finds herself repeatedly performing the same task, she automates it.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s no hard number of times here, and the &amp;ldquo;automation&amp;rdquo; can be trivially small.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;her-pkm&#34;&gt;Her PKM&lt;/h2&gt;
&lt;p&gt;There are two primary kinds of information in her PKM:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;documentation on how to do something&lt;/li&gt;
&lt;li&gt;code snippets that she&amp;rsquo;ll want to reuse&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;her-needs&#34;&gt;Her Needs&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Easy access to the information without having to switch contexts / apps. She is working in &lt;a href=&#34;https://code.visualstudio.com/&#34;&gt;VS Code&lt;/a&gt; when she needs to access this information.&lt;/li&gt;
&lt;li&gt;The code snippets need to be in a form and location that makes it easy to bring into her apps.&lt;/li&gt;
&lt;li&gt;She needs to be able to share these snippets &amp;amp; instructions with the people she mentors, and people new to the project.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That&amp;rsquo;s it.&lt;/p&gt;
&lt;p&gt;VS Code&amp;hellip;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;has reasonably good search functionality&lt;/li&gt;
&lt;li&gt;lets you easily browse directories&lt;/li&gt;
&lt;li&gt;has good Markdown syntax highlighting&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, all of the &amp;ldquo;personal knowledge&amp;rdquo; she needs to &amp;ldquo;manage&amp;rdquo; is stored in a collection of &lt;a href=&#34;https://www.markdownguide.org/&#34;&gt;Markdown&lt;/a&gt; files in a hierarchy of folders that makes sense to her 🧠.&lt;/p&gt;
&lt;p&gt;She checks those files into a git repo, which she regularly pushes up to GitHub. Having the files in GitHub means she can easily link her coworkers to a relevant page whenever needed. It also lets her link to a specific line or paragraph within a document, and gives her another backup location.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s a nice, simple, and elegant solution.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;
&lt;p&gt;There is a plethora of apps to choose from that do a good job of managing collections of Markdown documents. There are even some specifically for developers, but&amp;hellip;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The content would no longer be available to her within VS Code.&lt;/li&gt;
&lt;li&gt;She&amp;rsquo;s satisfied with the search and browse functionality it provides.&lt;/li&gt;
&lt;li&gt;She has no complaints about the UI she has to use to find the information she needs.&lt;/li&gt;
&lt;li&gt;They&amp;rsquo;d hamper her ability to share.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Her simple system is perfect for &lt;em&gt;her&lt;/em&gt; 🧠, and &lt;em&gt;her&lt;/em&gt; current needs. It also includes a simple process for deciding what to capture, and what to take further action on.&lt;/p&gt;
&lt;p&gt;People get caught up in searching for &amp;ldquo;the perfect tool&amp;rdquo; or &amp;ldquo;a better tool&amp;rdquo;. Developers sometimes get sucked into the idea of writing a better tool&amp;hellip; Sometimes the simple solution really is the best one.&lt;/p&gt;
&lt;p&gt;Her solution is not the right solution for &lt;em&gt;my&lt;/em&gt; brain or &lt;em&gt;my&lt;/em&gt; needs. But that doesn&amp;rsquo;t matter. What matters is that, we &lt;em&gt;each&lt;/em&gt; figure out what&amp;rsquo;s right for &lt;em&gt;our&lt;/em&gt; brains. Start simple, and don&amp;rsquo;t chase shiny objects.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Other People&#39;s Personal Knowledge Management Isn&#39;t For You</title>
      <link>https://weblog.masukomi.org/2023/01/08/other-peoples-personal-knowledge-management-isnt-for-you/</link>
      <pubDate>Sun, 08 Jan 2023 00:00:00 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/2023/01/08/other-peoples-personal-knowledge-management-isnt-for-you/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#knowledge-management-as-a-survival-trait&#34;&gt;Knowledge Management As A Survival Trait&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#it-s-not-you-it-s-me-dot&#34;&gt;It&amp;rsquo;s not you, it&amp;rsquo;s me.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#surviving-the-torrent-of-information&#34;&gt;Surviving The Torrent Of Information&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#falling-behind&#34;&gt;Falling Behind&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#ignore-the-things-you-don-t-need&#34;&gt;Ignore the things you don&amp;rsquo;t need&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#less-is-more&#34;&gt;Less is more&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#observe-try-steal-refine-repeat&#34;&gt;Observe, Try, Steal, Refine, Repeat&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#what-now&#34;&gt;What Now?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;p&gt;&amp;ldquo;Personal Knowledge Management&amp;rdquo; (PKM) feels like a lot of &amp;ldquo;bullshit&amp;rdquo; to many people. In this, I will speak to the idea that PKM isn&amp;rsquo;t bullshit. It&amp;rsquo;s just that other people&amp;rsquo;s ways of managing knowledge, just aren&amp;rsquo;t designed for &lt;em&gt;your&lt;/em&gt; brain. They may &lt;em&gt;sound&lt;/em&gt; like bullshit, but if it&amp;rsquo;s working for it&amp;rsquo;s creator, it&amp;rsquo;s totally valid.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;a great proportion of the variance in “knowledge management” effectiveness across individuals is genetic. Individuals blessed with high degrees of industriousness and orderliness will build sophisticated media diets, note-taking systems, and automated archiving pipelines much more effectively than those less blessed with these traits.&lt;/p&gt;
&lt;p&gt;Next, these naturally organized people realize they’re sitting on a valuable commodity, which they can sell to less industrious and orderly people. Some random nerd who just loves organizing all his little files decides to christen his idiosyncratic personal routine with a catchy name, package it as the best method for helping anyone get organized, and then thousands of less organized people pay him to learn it. - &lt;a href=&#34;https://www.otherlife.co/pkm/&#34;&gt;Justin Murphy &amp;ldquo;Personal Knowledge Management is Bullshit&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Justin&amp;rsquo;s sentiment is valid. It touches on some real &amp;ldquo;bullshit&amp;rdquo;, but this line of thinking is fundamentally flawed. It fails to grasp the incredible variance in human minds. Many of the people who&amp;rsquo;ve designed successful systems haven&amp;rsquo;t done so because they&amp;rsquo;ve been &amp;ldquo;blessed with high degrees of industriousness and orderliness&amp;rdquo;. Many of them are as a reaction to significant losses in the &amp;ldquo;genetic lottery&amp;rdquo;.&lt;/p&gt;
&lt;h2 id=&#34;knowledge-management-as-a-survival-trait&#34;&gt;Knowledge Management As A Survival Trait&lt;/h2&gt;
&lt;p&gt;Let me give you an example from personal experience that I&amp;rsquo;ve seen repeated again and again in others. People with ADHD have &lt;em&gt;incredibly&lt;/em&gt; bad memories. It&amp;rsquo;s not just that their memories are bad, it&amp;rsquo;s that they&amp;rsquo;re &lt;em&gt;implausibly&lt;/em&gt; bad by normal standards.&lt;/p&gt;
&lt;p&gt;Memories form around interesting things. An event is &amp;ldquo;interesting&amp;rdquo; on a chemical level, if there&amp;rsquo;s some dopamine involved. No dopamine, means no interest. No interest means your squishy greymatter decides it isn&amp;rsquo;t worth remembering. This is an oversimplification, but the point is, we are literally disabled and lacking one of the primary tools required for knowledge work.&lt;/p&gt;
&lt;p&gt;As a result, every knowledge worker you meet with ADHD is essentially guaranteed to have an impressive system. It may not be efficient, or logical, and they&amp;rsquo;re probably not even aware that that&amp;rsquo;s what they&amp;rsquo;ve done, but it&amp;rsquo;s there.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t spend time building knowledge management systems, and tools because I like organizing information. I build them because I&amp;rsquo;m &lt;em&gt;fucked&lt;/em&gt; without them.&lt;/p&gt;
&lt;h2 id=&#34;it-s-not-you-it-s-me-dot&#34;&gt;It&amp;rsquo;s not you, it&amp;rsquo;s me.&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s not that other people&amp;rsquo;s systems are &amp;ldquo;bullshit&amp;rdquo;. It&amp;rsquo;s not that people with impressive PKM systems are inherently more organized than you. It&amp;rsquo;s that your brain, and their brain, are different.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The deep and urgent sense that we’re all drowning in information and distraction has created a massive market for anything that claims to solve this problem.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;He&amp;rsquo;s right, and he&amp;rsquo;s right that most of those tools are unlikely to work well for your brain. That doesn&amp;rsquo;t mean there isn&amp;rsquo;t value in them.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Zettelkasten&#34;&gt;Zettlekasten&lt;/a&gt;, for example, is an interesting innovation in knowledge management. It has some rabid fans. The short version, if you haven&amp;rsquo;t heard of it, is that you build up a collection of small ideas with free-form linking to each other. No folders. No time wasted organizing.&lt;/p&gt;
&lt;p&gt;The method originated with paper note cards. These days there are many easy-to-use tools for folks who like Zettlekasten. Many of the popular note management tools have Zettlekasten related functionality built in.&lt;/p&gt;
&lt;p&gt;The reason I mention it, is that &lt;strong&gt;the Zettlekasten process 100% doesn&amp;rsquo;t work for my brain&lt;/strong&gt;. That doesn&amp;rsquo;t mean it&amp;rsquo;s &amp;ldquo;bullshit&amp;rdquo;, or useless. There is great value in the idea of having a system that makes it trivial to link from one document to another (see also, the internet). I believe that if your notes aren&amp;rsquo;t linking to each other you&amp;rsquo;re missing out on a huge piece of value.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s great value in the idea of focused notes, but the separation of those notes into discreet chunks is a problem for me. There are too many simultaneous thoughts in my brain (ADHD). If I was constantly pausing, even momentarily, to create new notes I&amp;rsquo;d loose the thread of what I was trying to express. This means I lean towards tools that make it easy to group thoughts in malleable hierarchies.&lt;/p&gt;
&lt;p&gt;Those individual chunks &lt;em&gt;are&lt;/em&gt; focused notes. I can use an auto-generated table-of-contents to find them. As content becomes too much for one document I can break things out into multiple documents and cross-link.&lt;/p&gt;
&lt;h2 id=&#34;surviving-the-torrent-of-information&#34;&gt;Surviving The Torrent Of Information&lt;/h2&gt;
&lt;p&gt;Many of us feel overwhelmed by the information torrent we live in. Our brains did not evolve for this. Our jobs, none-the-less require us to deal with it.&lt;/p&gt;
&lt;p&gt;As a programmer I&amp;rsquo;m expected to stay up to date with the latest technology options and trends. I&amp;rsquo;m expected also put in a full day of work on whatever projects they&amp;rsquo;re paying me for.  Meanwhile there are millions of people discussing and releasing software that may or may not be useful to me.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s literally impossible for me, or anyone else, to meet all those expectations. Doubly so if you want to actually maintain your mental health and have a life outside of code. I have two choices. Develop a process to help me attempt to stay up to date with things, or fall behind.&lt;/p&gt;
&lt;h3 id=&#34;falling-behind&#34;&gt;Falling Behind&lt;/h3&gt;
&lt;p&gt;I&amp;rsquo;d argue that &amp;ldquo;falling behind&amp;rdquo; is not only a valid strategy, when applied strategically, but one that can make your life better.&lt;/p&gt;
&lt;h4 id=&#34;ignore-the-things-you-don-t-need&#34;&gt;Ignore the things you don&amp;rsquo;t need&lt;/h4&gt;
&lt;p&gt;I&amp;rsquo;ve been a web developer for a long time now. My primary tool of choice for building interactive web sites is Rails. There are two major aspects to Rails: the back end, and the front end. The back end is all the stuff you can&amp;rsquo;t see. The database interactions. The gathering of data for reports, etc. The front end is similar but it&amp;rsquo;s a collection of tools for generating the actual web pages you see.&lt;/p&gt;
&lt;p&gt;Every few years the core Rails developers come up with some fancy new way of generating web pages that is objectively better than the old way. Yay progress. Each new way is notably different from the last.&lt;/p&gt;
&lt;p&gt;Meanwhile, I&amp;rsquo;ve been working on codebases that are either too outdated to use the new hotness, or don&amp;rsquo;t even use Rails&amp;rsquo; front-end.&lt;/p&gt;
&lt;p&gt;My employers want me to &amp;ldquo;Stay up to date&amp;rdquo; with the latest Rails functionality, but there&amp;rsquo;s a huge chunk of it that would be a complete waste of my time to pursue. I can&amp;rsquo;t use it. Knowing it won&amp;rsquo;t help me in my personal or professional projects. When it&amp;rsquo;s relevant, but not something we can use, it just becomes depressing.&lt;/p&gt;
&lt;p&gt;Learning it in depth would have been functionally useless, and emotionally depressing. So, I chose to ignore it. Then the Rails devs came out with another bit of &amp;ldquo;new hotness&amp;rdquo; and the old stuff I didn&amp;rsquo;t learn became obsolete. Then it happened again.&lt;/p&gt;
&lt;p&gt;Yes, I am at a disadvantage compared to others when I do need to make something with an HTML front end. Accepting that has enabled me to really focus on doing great back-end work. Back-end work is important to me, interesting to me, and valuable to my employers. They&amp;rsquo;re perfectly happy to have other people who are experts in front end stuff do great jobs there while people like me focus on doing back-end work.&lt;/p&gt;
&lt;p&gt;The point is that it doesn&amp;rsquo;t matter what other people tell you you need to stay on top of. It doesn&amp;rsquo;t matter what information they claim you need to have. &lt;em&gt;You&lt;/em&gt; are the person doing your job. &lt;em&gt;You&lt;/em&gt; are the person best suited to determining if that information would &lt;em&gt;actually&lt;/em&gt; be useful to you.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not suggesting you ignore the things other people tell you are important. I&amp;rsquo;m suggesting that you consider their suggestions within your own personal context. Focus on the ones that will help you. Allow yourself to &amp;ldquo;fall behind&amp;rdquo; on the ones that won&amp;rsquo;t.&lt;/p&gt;
&lt;h4 id=&#34;less-is-more&#34;&gt;Less is more&lt;/h4&gt;
&lt;p&gt;Every time you make a decision to &lt;em&gt;actively&lt;/em&gt; ignore something that won&amp;rsquo;t help you, you lessen the torrent of information. It&amp;rsquo;s like standing in a rushing river, and then suddenly being able to divert some of it. You no longer have to fight as hard to stand up. You no longer have to filter so much of it to find the tasty fish.&lt;/p&gt;
&lt;h3 id=&#34;observe-try-steal-refine-repeat&#34;&gt;Observe, Try, Steal, Refine, Repeat&lt;/h3&gt;
&lt;p&gt;Barring a total collapse of society, the torrent of information will not lessen within our lifetimes. No-one has a good handle on the problem. Few people comprehend the variety of human thought patterns. They don&amp;rsquo;t understand that &lt;em&gt;their&lt;/em&gt; techniques aren&amp;rsquo;t applicable to everyone.&lt;/p&gt;
&lt;p&gt;The techniques you and I have developed so far, for dealing with this likely have a lot of room for improvement.&lt;/p&gt;
&lt;p&gt;The best we can do is to keep our ears open for things that work for other people. We can try out the suggestions that resonate with us.  We can steal the pieces of them that actually work for us. We can refine our process with what we&amp;rsquo;ve learned, and repeat.&lt;/p&gt;
&lt;p&gt;Yes, this is someone telling you that there&amp;rsquo;s some information out there that you should be paying attention to. That irony isn&amp;rsquo;t lost.&lt;/p&gt;
&lt;p&gt;There are two advantages this type of information has that many of the others do not. The first is that learning how to better organize your knowledge is &lt;em&gt;explicitly&lt;/em&gt; a tool for helping &lt;em&gt;you&lt;/em&gt;. No-one will argue that you shouldn&amp;rsquo;t get better and oraganizing your knowledge.&lt;/p&gt;
&lt;p&gt;The other is that I&amp;rsquo;m specifically referring to knowledge management &lt;em&gt;techniques&lt;/em&gt; not &lt;em&gt;tools&lt;/em&gt;. New techniques are rare. Truly innovative techniques are even rarer. Meanwhile, there will continue to be a constant stream of new tools. They&amp;rsquo;re not even someone&amp;rsquo;s &amp;ldquo;idiosyncratic personal routine with a catchy name&amp;rdquo;. They&amp;rsquo;re someone&amp;rsquo;s idiosyncratic implementation of a poorly understood idiosyncratic personal routine&amp;hellip; with a catchy name.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not suggesting you should try and stay up to date with &lt;a href=&#34;https://www.notion.so/&#34;&gt;Notion&lt;/a&gt;, or &lt;a href=&#34;https://roamresearch.com/&#34;&gt;Roam&lt;/a&gt;, or whatever comes next. I&amp;rsquo;m suggesting you should try and keep an ear out for how people are &lt;em&gt;using&lt;/em&gt; their fancy tools. This is, admittedly, harder. Fortunately there are people like &lt;a href=&#34;https://www.buildingasecondbrain.com/&#34;&gt;Tiago Forte&lt;/a&gt; who are putting out lots of great content about techniques, not tools.&lt;/p&gt;
&lt;p&gt;This takes many forms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;organizational techniques&lt;/li&gt;
&lt;li&gt;note taking techniques&lt;/li&gt;
&lt;li&gt;learning techniques&lt;/li&gt;
&lt;li&gt;information processing techniques&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It&amp;rsquo;s a deep rabbit hole, but you don&amp;rsquo;t need to go down it if you don&amp;rsquo;t want to. Just pay attention to the people who &lt;em&gt;are&lt;/em&gt; and listen to what they report back.&lt;/p&gt;
&lt;h2 id=&#34;what-now&#34;&gt;What Now?&lt;/h2&gt;
&lt;p&gt;As I said, don&amp;rsquo;t focus on tools, and don&amp;rsquo;t believe that anyone else&amp;rsquo;s specific process is going to work for you. Focus on high level techniques and approaches.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For How to think about capturing and organizing information&lt;/strong&gt; I&amp;rsquo;d suggest &lt;a href=&#34;https://www.buildingasecondbrain.com/&#34;&gt;Tiago Forte&amp;rsquo;s Building A Second Brain&lt;/a&gt;  is a good place to start. The book is very much about approach not tools. The first two chapters are going to convince you of the value of keeping and managing your info. You can skip them entirely if you already believe that.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d also recommend checking out &lt;a href=&#34;https://youtube.com/playlist?list=PLVNXAaej57W7PlusTwr9O6EOlAiJOqIh3&#34;&gt;this YouTube playlist&lt;/a&gt; of his which does a great job of showing a collection of radically different, but equally valid, approaches for capturing and organizing information. Each one is tailored to the brain of its creator.&lt;/p&gt;
&lt;p&gt;Define a process for yourself. If you&amp;rsquo;re not sure where to start, start with Tiago&amp;rsquo;s C.O.D.E. + P.A.R.A. technique. It&amp;rsquo;s described in his book, but there&amp;rsquo;s &lt;a href=&#34;https://www.taskade.com/blog/building-a-second-brain-review/&#34;&gt;a pretty comprehensive summary here&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Mastodon Ownership</title>
      <link>https://weblog.masukomi.org/2022/12/21/mastodon-ownership/</link>
      <pubDate>Wed, 21 Dec 2022 00:00:00 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/2022/12/21/mastodon-ownership/</guid>
      <description>&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;A group calling itself &amp;ldquo;Mask Group&amp;rdquo; has purchased three of the largest mastodon instances.&lt;/p&gt;
&lt;p&gt;Mastodon users, especially people on those servers, should be &lt;em&gt;very&lt;/em&gt; concerned.&lt;/p&gt;
&lt;h2 id=&#34;why&#34;&gt;Why?&lt;/h2&gt;
&lt;p&gt;There are some things you need to consider about mastodon to understand why this is very concerning.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Large Mastodon instances are &lt;em&gt;expensive&lt;/em&gt; to run.&lt;/li&gt;
&lt;li&gt;Mastodon is not a good platform for large advertisers for a number of reasons.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This means that by buying a large mastodon instance you are signing up for a very large ongoing cost in a system whose current state is adverse to profit generation for the owners. If we assume the purchasers are not complete idiots there are 2 solutions to this problem.&lt;/p&gt;
&lt;h3 id=&#34;follow-the-microsoft-playbook-of-embrace-and-extend-dot&#34;&gt;Follow the Microsoft playbook of &amp;ldquo;embrace and extend&amp;rdquo;.&lt;/h3&gt;
&lt;p&gt;People don&amp;rsquo;t like switching servers. If you buy all the big servers you have a functionally captive audience. Disabling the ability to move your account to another server is easy, and gives you an &lt;em&gt;actually&lt;/em&gt; captive audience. They won&amp;rsquo;t want to loose all the connections they finally just built up again after moving to Mastodon.&lt;/p&gt;
&lt;p&gt;If you control the servers that millions of Mastodon users rely on and can&amp;rsquo;t easily escape, you can also show ads to millions of Mastodon users. You can also start doing all the uncomfortable tracking that many of us came here to get away from.&lt;/p&gt;
&lt;h3 id=&#34;massively-disrupt-mastodon-itself&#34;&gt;Massively Disrupt Mastodon itself&lt;/h3&gt;
&lt;p&gt;Elon has made it clear that he really, &lt;em&gt;really&lt;/em&gt; doesn&amp;rsquo;t want anyone migrating to Mastodon. Your account will be suspended if you dare to mention mastodon.com.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;tens of thousands of dollars a month&amp;rdquo; for each of a handful of servers is a rounding error to someone as rich as Elon Musk. He probably earns that much in interest in the duration of a sneeze.&lt;/p&gt;
&lt;p&gt;What if Elon, or anyone else keeps buying up the largest instances, waits until they have a simple majority of the mastodon user base, and then simply shuts them off?&lt;/p&gt;
&lt;p&gt;People can&amp;rsquo;t migrate their accounts, and millions of people loose confidence in Mastodon. Especially if the people behind &amp;ldquo;Mask Group&amp;rdquo; are never exposed. You can&amp;rsquo;t blame Elon, or anyone else. It was just some &amp;ldquo;mysterious group&amp;rdquo;.&lt;/p&gt;
&lt;h3 id=&#34;mask-group&#34;&gt;&amp;ldquo;Mask Group&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;Seriously. These purchases are nonsensical unless combined with plans that only hurt us. Combine that with an entity calling itself &amp;ldquo;Mask Group&amp;rdquo; and you don&amp;rsquo;t have to be a conspiracy theorist to connect the dots. They put it right there for all to see.&lt;/p&gt;
&lt;h2 id=&#34;servers-currently-affected&#34;&gt;Servers Currently Affected&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;mstdn.jp&lt;/li&gt;
&lt;li&gt;pawoo.net&lt;/li&gt;
&lt;li&gt;mastodon.cloud&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;what-s-the-answer&#34;&gt;What&amp;rsquo;s the answer?&lt;/h2&gt;
&lt;p&gt;Small servers with people who you either know, or who are organized around an idea or world-view that works for you.&lt;/p&gt;
&lt;p&gt;Once a server exceeds the number of people a human can reasonably &amp;ldquo;know&amp;rdquo; (&lt;a href=&#34;https://en.wikipedia.org/wiki/Dunbar%27s_number&#34;&gt;Dunbar&amp;rsquo;s Number&lt;/a&gt;) a number of problems emerge.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Some people feel Anonymous. &lt;a href=&#34;https://www.penny-arcade.com/comic/2004/03/19/green-blackboards-and-other-anomalies&#34;&gt;Penny Arcade explained this problem well&lt;/a&gt;:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/12/21/penny_arcade_anonymitiy.jpg&#34;
        alt=&#34;penny arcade coming showing that a normal person combined with anonymity and an audience equales total fuckwad&#34;&gt;&lt;figcaption&gt;
          &lt;h4&gt;penny arcade&lt;/h4&gt;
        &lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;They can&amp;rsquo;t be a community of like-minded people, because they&amp;rsquo;re too big to be a unified group.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;They&amp;rsquo;re also really difficult to moderate because you always have some problematic elements who don&amp;rsquo;t adhered to your server rules because they don&amp;rsquo;t care or don&amp;rsquo;t feel they apply to them. See also issue number 1.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;
&lt;p&gt;If your server is bought by Mask Group you should run away before you can&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;If your server is large and you&amp;rsquo;d like to be with people of a similar mind, move. If you like the chaos of a large one&amp;hellip; stay, but keep an eye on who&amp;rsquo;s running it.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://connectified.com/@stux@mstdn.social&#34;&gt;Stux&lt;/a&gt; has &lt;a href=&#34;https://mstdn.social/@stux/109551661309386113&#34;&gt;promised not to sell mstdn.social&lt;/a&gt; but I find it hard to believe that a concrete offer of a billion dollars wouldn&amp;rsquo;t sway him. That&amp;rsquo;s beyond life-changing money for most humans. That being said, it&amp;rsquo;s unlikely anyone would really offer them $1B for a million users. So, if you want a big server, I&amp;rsquo;d stick with theirs.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://mstdn.social&#34;&gt;mstdn.social&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://masto.ai&#34;&gt;masto.ai&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://mastodon.coffee&#34;&gt;mastodon.coffee&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Rewriting Hey</title>
      <link>https://weblog.masukomi.org/2022/12/18/rewriting-hey/</link>
      <pubDate>Sun, 18 Dec 2022 00:00:00 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/2022/12/18/rewriting-hey/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#in-the-beginning&#34;&gt;In the Beginning&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#final-totals&#34;&gt;Final Totals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#writing-in-chicken-scheme&#34;&gt;Writing in Chicken Scheme&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#delusions-of-sharability&#34;&gt;Delusions of Sharability&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#crystal-lang&#34;&gt;Crystal Lang&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#final-totals&#34;&gt;Final Totals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#writing-in-crystal&#34;&gt;Writing in Crystal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#fast-forward-dot-dot-dot&#34;&gt;Fast-Forward&amp;hellip;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#and-then-raku&#34;&gt;And then Raku&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#final-totals&#34;&gt;Final Totals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#writing-in-raku&#34;&gt;Writing in Raku&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#reflecting-on-the-rewrites&#34;&gt;Reflecting on the rewrites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#if-you-liked-that-dot-dot-dot&#34;&gt;If you liked that&amp;hellip;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#p-dot-s-dot-what-about-the-email-app-with-the-same-name&#34;&gt;P.S. What about the email app with the same name?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;&amp;ldquo;Hey!&amp;rdquo; started as an Interruption Tracker, and now supports Time Tracking too. It has been through 3 iterations: &lt;a href=&#34;https://call-cc.org/&#34;&gt;Chicken Scheme&lt;/a&gt;, &lt;a href=&#34;https://crystal-lang.org/&#34;&gt;Crystal&lt;/a&gt;, and now &lt;a href=&#34;https://raku.org/&#34;&gt;Raku&lt;/a&gt;. This post is a high-level developer&amp;rsquo;s diary of what I wrote, why I rewrote it, and what I learned along the way.&lt;/p&gt;
&lt;h2 id=&#34;in-the-beginning&#34;&gt;In the Beginning&lt;/h2&gt;
&lt;p&gt;Once upon a time I was a tech lead, team lead, and eventually principal engineer. My days were &lt;em&gt;filled&lt;/em&gt; with interruptions. They were making it impossible to get anything done, and more importantly to me, they were a source of a lot of stress.&lt;/p&gt;
&lt;p&gt;I decided that if I was going to get a handle on the interruptions I needed to understand them. I needed to know &lt;em&gt;when&lt;/em&gt; they were happening so that I could plan focus time. I needed to know &lt;em&gt;who&lt;/em&gt; was interrupting me so that maybe I could talk to them about it. I needed to know &lt;em&gt;why&lt;/em&gt; I was being interrupted so that I could find things I could document better to preempt those interruptions.&lt;/p&gt;
&lt;p&gt;It started out as a little Chicken Scheme script that grew organically. It quickly became a hard-to-maintain hairball of code.&lt;/p&gt;
&lt;p&gt;But it worked, and it was good.&lt;/p&gt;
&lt;h3 id=&#34;final-totals&#34;&gt;Final Totals&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;~1300 lines of Scheme&lt;/li&gt;
&lt;li&gt;~2500 lines of JavaScript (mostly library stuff) to support some fancy &amp;ldquo;graph it via the web&amp;rdquo; stuff that never really worked out well.&lt;/li&gt;
&lt;li&gt;~1000 lines of HTML to hold the JavaScript graphing stuff.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/masukomi/hey&#34;&gt;GitHub Repo Here&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;writing-in-chicken-scheme&#34;&gt;Writing in Chicken Scheme&lt;/h3&gt;
&lt;p&gt;I love Scheme. It really works for my brain. Chicken Scheme is one of the better schemes. It&amp;rsquo;s got a large collection of useful libraries. It also transpiles to C (or JavaScript actually). The end result is a fast tiny binary. As a bonus, you can generate C files so that your libraries can be called from almost any other language.&lt;/p&gt;
&lt;p&gt;As an example, my &lt;a href=&#34;https://github.com/masukomi/private_comments&#34;&gt;private_comments&lt;/a&gt; API web server runs in less than 7MB of RAM and I didn&amp;rsquo;t even &lt;em&gt;try&lt;/em&gt; to make it small.&lt;/p&gt;
&lt;p&gt;Unfortunately figuring anything out in Chicken Scheme felt like pulling teeth. There&amp;rsquo;s a ton of documentation, but it&amp;rsquo;s mostly useless. It assumes a ridiculous amount of knowledge and doesn&amp;rsquo;t explain anything. It feels like &amp;ldquo;Here&amp;rsquo;s the method signature. Have fun figuring out what it does.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Getting anything done in Chicken Scheme feels like a major accomplishment. It&amp;rsquo;s also incredibly draining because it&amp;rsquo;s so damn hard to figure out if you&amp;rsquo;re new. It&amp;rsquo;s not the language&amp;rsquo;s fault. The language is trivially easy, like all Schemes. It&amp;rsquo;s the documentation.&lt;/p&gt;
&lt;p&gt;These days I use Chicken Scheme very strategically. For example, &lt;a href=&#34;https://github.com/masukomi/heatmapper&#34;&gt;my CLI heatmap generation tool&lt;/a&gt; is written in Chicken Scheme because I wanted something &lt;em&gt;very&lt;/em&gt; fast. I also liked that folks could use the core library in any other language if they felt like dealing with their language&amp;rsquo;s C interface.&lt;/p&gt;
&lt;h3 id=&#34;delusions-of-sharability&#34;&gt;Delusions of Sharability&lt;/h3&gt;
&lt;p&gt;I should also note that I was working under a mistaken belief. I believed that it would  be possible to generate a binary for an OS that I could just hand to someone without them having to know anything about Chicken Scheme, or Go, or whatever it was written in.&lt;/p&gt;
&lt;p&gt;The truth is, you can&amp;rsquo;t. It&amp;rsquo;s theoretically possible. If you could fully statically link a binary, you&amp;rsquo;d have no worries. Unfortunately it turns out that that, practically speaking, that&amp;rsquo;s impossible on macOS. They really, &lt;em&gt;really&lt;/em&gt; want you to use dylibs. Excluding apps with a &amp;ldquo;hello world&amp;rdquo; level of complexity, I&amp;rsquo;m not sure you can do it.&lt;/p&gt;
&lt;p&gt;I spent a &lt;em&gt;lot&lt;/em&gt; of time and energy trying to make this happen, but ultimately had to abandon the hope.&lt;/p&gt;
&lt;h2 id=&#34;crystal-lang&#34;&gt;Crystal Lang&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m a Ruby dev by trade, and Crystal is, essentially, just a compiled ruby with Static Typing. Or, it was at the time. These days it&amp;rsquo;s added concurrency and parallelism and is growing into its own thing.&lt;/p&gt;
&lt;p&gt;I wanted to rewrite it in a nice, organized, maintainable way. At the time Crystal was still pre-1.0 volatile, and didn&amp;rsquo;t have a ton of users or projects. There were, and I think, still are, multiple ORMs (Object Relational Mappings) competing with no clear winner.&lt;/p&gt;
&lt;p&gt;Unfortunately, they were very immature tools. So, I took one that I thought was good, and added in relations like &amp;ldquo;has many&amp;rdquo; and &amp;ldquo;belongs to&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;I thought. I planned. I organized. I Object Oriented the 💩 out of it. I wrote and used &lt;a href=&#34;https://github.com/masukomi/sparker&#34;&gt;a sparkline library for Crystal&lt;/a&gt;. I wrote &lt;a href=&#34;https://github.com/masukomi/crystal_cli_graph&#34;&gt;a CLI bar chart library for Crystal&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I added a CLI bar-chart graph of interruptions by hour so that I could easily see when I was being interrupted.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ hey report interrupts_by_hour
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Interrupts By Hour:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                          ▁
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                          █
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                 ▁     ▁  █
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                 █     █  █
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                 █     █  █     ▁
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                           ▁     █     █  █  ▁  █
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                           █     █     █  █  █  █
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                           █     █     █  █  █  █
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                           █  ▁  █     █  █  █  █
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                           █  █  █     █  █  █  █
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                           █  █  █     █  █  █  █
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                           █  █  █     █  █  █  █
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                           █  █  █     █  █  █  █
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;▁  ▁  ▁  ▁  ▁  ▁  ▁  ▁  ▁  █  █  █  ▁  █  █  █  █  ▁  ▁  ▁
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;00 01 02 03 04 05 07 07 08 09 10 11 12 13 14 15 16 17 18 23
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Honestly? It was pretty damn good.&lt;/p&gt;
&lt;p&gt;But then, my life changed. I was completely burnt out from the constant interruptions. I was having random Panic Attacks over trivial things. My wife was burnt out too. We quit our jobs, cashed in the 401k and lived off of savings for the better part of a year. It set back our retirement, but gave us enough time to &lt;em&gt;begin&lt;/em&gt; recovering.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t need Hey! anymore, so I wandered off.&lt;/p&gt;
&lt;h3 id=&#34;final-totals&#34;&gt;Final Totals&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;~1600 lines of Crystal in the core tool (including tests)&lt;/li&gt;
&lt;li&gt;~300 for the &lt;a href=&#34;https://github.com/masukomi/crystal_cli_graph&#34;&gt;bar chart lib&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;~50 for the &lt;a href=&#34;https://github.com/masukomi/sparker&#34;&gt;sparkline lib&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;~400 for the &lt;a href=&#34;https://github.com/masukomi/crystal_fmt&#34;&gt;cli table generator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;~150 lines for the &lt;a href=&#34;https://github.com/masukomi/sentence_options&#34;&gt;custom arguments parser&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;~300 lines of additions to the DB library (mostly macros)&lt;/li&gt;
&lt;li&gt;Total ~2800 lines of Crystal&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/masukomi/hey_2&#34;&gt;GitHub Repo Here&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;writing-in-crystal&#34;&gt;Writing in Crystal&lt;/h3&gt;
&lt;p&gt;Crystal&amp;rsquo;s a great language. I have nothing bad to say about it. I happily supported them on &lt;a href=&#34;https://opencollective.com/crystal-lang&#34;&gt;Open Collective&lt;/a&gt; for a long time. If you want to see what I think is a pretty well designed Crystal app, go look at &lt;a href=&#34;https://github.com/masukomi/oho&#34;&gt;oho&lt;/a&gt;. It&amp;rsquo;s the world&amp;rsquo;s greatest tool for converting colored terminal output to beautiful HTML. I&amp;rsquo;m pretty proud of it.&lt;/p&gt;
&lt;p&gt;These days though, Crystal isn&amp;rsquo;t my happy-place. I&amp;rsquo;ve spent too many years in Ruby. I want something different for my personal coding.&lt;/p&gt;
&lt;h2 id=&#34;fast-forward-dot-dot-dot&#34;&gt;Fast-Forward&amp;hellip;&lt;/h2&gt;
&lt;p&gt;Fast-forward from 2016 to December 2022. I&amp;rsquo;m unemployed again, like so many of us (&lt;a href=&#34;https://masukomi.org/resume/kay_rhodes_resume.html&#34;&gt;Hire Me!&lt;/a&gt;), and while I&amp;rsquo;m actually getting &lt;em&gt;a lot&lt;/em&gt; done, I don&amp;rsquo;t &lt;em&gt;feel&lt;/em&gt; like I am. I&amp;rsquo;m being too hard on myself, and not giving myself the credit I deserve for accomplishing the things I have. I decide to start time tracking. I figured if I could look back and see how I actually spent the day I could have a better feeling for what &lt;em&gt;really&lt;/em&gt; happened. &amp;ldquo;I didn&amp;rsquo;t get anything done today on my work, but that&amp;rsquo;s because I spent a ton of time on all these other things that needed doing.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;It turns out, I was right. In addition, the act of tracking my time makes me think about how I&amp;rsquo;m spending it, &lt;em&gt;as&lt;/em&gt; I&amp;rsquo;m spending it.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t want to write a new time tracker. I just wanted to track my time. I knew there were multiple, good, off-the-shelf CLI time trackers.&lt;/p&gt;
&lt;p&gt;I tried using 3 of them, but they all frustrated me for one reason or another. Some tools wanted me to interface with it in a way that felt awkward or annoying. Some had annoying technical things.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/TailorDev/Watson&#34;&gt;Watson&lt;/a&gt; came very close, but every time i needed to backdate a timer i had to type in explicit 4 digit 24 hour time. E.g. 08:30 not 8:30 and 18:47 not 6:47. It&amp;rsquo;s a little thing but I was doing it at least ten times a day and it annoyed me every time. Also, the ability to edit a timer was just broken.&lt;/p&gt;
&lt;p&gt;Then I realized&amp;hellip; I already &lt;em&gt;have&lt;/em&gt; a time tracker that works with my 🧠. It just doesn&amp;rsquo;t support &lt;em&gt;end&lt;/em&gt; times.&lt;/p&gt;
&lt;p&gt;I checkout the Crystal repo. I compile. It goes 💥. It goes 💥 here. It goes 💥 there. It goes 💥 everywhere. The language has changed in notable ways which break my code, and break the code in libraries I was depending on.&lt;/p&gt;
&lt;p&gt;In Crystal&amp;rsquo;s defense, it was 0.33.0 when I ported Hey! to it and they were very clear about the fact that things would be changing before they hit 1.0.&lt;/p&gt;
&lt;p&gt;The compiler was very helpful in telling me what changes to make. Eventually though, I hit a case where it was complaining that I wasn&amp;rsquo;t implementing a method defined in an abstract class, and I &lt;em&gt;definitely&lt;/em&gt; was. At that point I gave up. I just don&amp;rsquo;t have the emotional spoons to go fixing problems I didn&amp;rsquo;t create in a side-project that I didn&amp;rsquo;t even want to write in the first place. I don&amp;rsquo;t particularly want to be writing in Crystal these days anyway.&lt;/p&gt;
&lt;p&gt;Maybe the Chicken Scheme version?&lt;/p&gt;
&lt;p&gt;Chicken Scheme has moved from v4 to v5 in the intervening years, but Chicken&amp;rsquo;s upgrade is relatively painless. I&amp;rsquo;ve already done it for a couple of projects. It&amp;rsquo;s mostly just a matter of changing some import statements.&lt;/p&gt;
&lt;p&gt;20 minutes later and I&amp;rsquo;ve got a working version of Hey! It&amp;rsquo;s a worse codebase, &lt;em&gt;but it complies!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Hack. Hack. Hack.
Bug. Bug. Bug. I&amp;rsquo;m fighting with Chicken Scheme again.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Arrgh! I do not need this. This isn&amp;rsquo;t even a good codebase to begin with.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;So, I step back. I ask myself what the &lt;em&gt;bare minimum&lt;/em&gt; feature set would be that would be good enough to use and not annoy me:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the ability to start and stop a timer&lt;/li&gt;
&lt;li&gt;the ability to tag a timer&lt;/li&gt;
&lt;li&gt;the ability to backdate a timer because I frequently forget to start or stop them.&lt;/li&gt;
&lt;li&gt;no !@#$ 24hr time.&lt;/li&gt;
&lt;li&gt;a log of time spent.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That&amp;rsquo;s not actually that much&amp;hellip;&lt;/p&gt;
&lt;h2 id=&#34;and-then-raku&#34;&gt;And then Raku&lt;/h2&gt;
&lt;p&gt;I create a new directory and start hacking. I&amp;rsquo;m still new to Raku, but overall I&amp;rsquo;m loving it.&lt;/p&gt;
&lt;p&gt;I started by writing about ~250 lines of ugly-ass no-apologies code. I had one goal: get it working in the shortest possible time. 250 lines gets me a DB layer and the ability to start and stop timers (no backdating).&lt;/p&gt;
&lt;p&gt;I try to run it. It goes 💥, but that&amp;rsquo;s to be expected. I have no tests &amp;amp; I&amp;rsquo;ve literally never compiled it. To my great surprise, the bugs are all little things like missing commas or semicolons. There&amp;rsquo;s &lt;em&gt;nothing&lt;/em&gt; notable.&lt;/p&gt;
&lt;p&gt;This is &lt;em&gt;huge&lt;/em&gt;. If a Raku newb like me can write ~250 lines of code and not have any notable bugs, it means they have done a damn good job of putting together a language.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m chuffed. I keep hacking. Along the way, I&amp;rsquo;m noticing that lots of little nice-to-have&amp;rsquo;s are trivial to add while I&amp;rsquo;m there.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t bother with an ORM. I don&amp;rsquo;t bother with &lt;em&gt;any&lt;/em&gt; OOP (Object Oriented Programming). It&amp;rsquo;s just a collection of functions that query a SQLite DB with raw SQL and pass the resulting hashes around.&lt;/p&gt;
&lt;p&gt;The ecosystem of libraries gets me nice things like time durations as strings &amp;ldquo;2 hours and 33 minutes&amp;rdquo; or &amp;ldquo;2h33m&amp;rdquo;, and pretty tables. The pretty tables are &lt;a href=&#34;https://github.com/masukomi/Prettier-Table/&#34;&gt;my fork of another library&lt;/a&gt;, but I&amp;rsquo;m not including that in the totals because I didn&amp;rsquo;t write it for this project.&lt;/p&gt;
&lt;p&gt;I still don&amp;rsquo;t have the command line graphs implemented, and it looks like I&amp;rsquo;ll have to port that from Crystal. There isn&amp;rsquo;t a Sparkline library yet either, so add another ~300 lines of code before I&amp;rsquo;m done.&lt;/p&gt;
&lt;h3 id=&#34;final-totals&#34;&gt;Final Totals&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;~800 lines of Raku&lt;/li&gt;
&lt;li&gt;~100 lines of &lt;a href=&#34;https://github.com/pgrange/bash_unit&#34;&gt;bash_unit&lt;/a&gt; tests&lt;/li&gt;
&lt;li&gt;~300 lines of &lt;em&gt;future&lt;/em&gt; code&lt;/li&gt;
&lt;li&gt;Silly levels of satisfaction&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/masukomi/hey_3&#34;&gt;GitHub Repo Here&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;writing-in-raku&#34;&gt;Writing in Raku&lt;/h3&gt;
&lt;p&gt;Notable things: I wrote precisely zero lines of code to process the command line arguments in a natural language fashion. I wrote zero lines of code to generate or wire up the CLI help doc shown below. Raku gave it to me &amp;ldquo;out of the box&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;It took me about 5 lines to include a starter db with the package, check if you need it, and put it in place. That&amp;rsquo;s a combination of the language having a concept of resources in a bundle, &lt;a href=&#34;https://github.com/jonathanstowe/XDG-BaseDirectory&#34;&gt;a library that understands XDG Base Directory stuff&lt;/a&gt;, and &lt;a href=&#34;https://github.com/masukomi/XDG-GuaranteedResources&#34;&gt;my XDG::GuaranteeResources&lt;/a&gt; library that combines the two.&lt;/p&gt;
&lt;p&gt;Raku&amp;rsquo;s still got a very small community, but they are &amp;ldquo;knocking it out of the park&amp;rdquo; with useful libraries. And the language has been &lt;a href=&#34;https://raku.org/archive/doc/apocalypse.html&#34;&gt;incredibly well thought out&lt;/a&gt;. I have complaints, but they&amp;rsquo;re all nitpicks.&lt;/p&gt;
&lt;p&gt;Maybe it&amp;rsquo;s just that I started my professional programming career with Perl5. Whatever the reason Raku really works for my 🧠.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Usage:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  hey start [&amp;lt;start_args&amp;gt; ...] -- Start a new timer
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  hey stop [&amp;lt;stop_args&amp;gt; ...] -- stop an existing timer
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  hey log &amp;lt;number&amp;gt; &amp;lt;duration&amp;gt; -- see a log of recent timers
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  hey log-interrupts &amp;lt;number&amp;gt; &amp;lt;duration&amp;gt; -- see a log of recent interruptions
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  hey running -- lets you know if there are any timers running &amp;amp; what they are for
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  hey &amp;lt;name&amp;gt; [&amp;lt;start_args&amp;gt; ...] -- Record an interruption
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  hey kill timer &amp;lt;id&amp;gt; -- Remove an unwanted timer.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  hey kill &amp;lt;name&amp;gt; -- Remove an unwanted person / thing from interruptions
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    [&amp;lt;start_args&amp;gt; ...]    optional time adjustment, project(s), &amp;amp; optional tags
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    [&amp;lt;stop_args&amp;gt; ...]     optional id, and optional time adjustments (e.g. 4 minutes ago)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;lt;number&amp;gt;              number of duration units
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;lt;duration&amp;gt;            duration string. E.g. minutes, hours, days, etc.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;lt;name&amp;gt;                name of person / thing that interrupted you
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;lt;id&amp;gt;                  the id of the timer to delete.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;reflecting-on-the-rewrites&#34;&gt;Reflecting on the rewrites&lt;/h2&gt;
&lt;p&gt;Looking back at all this work. I find myself coming to an interesting conclusion. With regards to code written specifically for you:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I believe that choosing subjectively good technology is more important than objectively good technology.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You have limited time to work on projects &lt;em&gt;for you&lt;/em&gt;. Don&amp;rsquo;t spend them in languages you don&amp;rsquo;t love. Write them with tools, and languages you &lt;em&gt;do&lt;/em&gt; love. Write them with tools that are exciting you. Rewrite them when you&amp;rsquo;ve moved on and you want to use them, but the idea of maintaining the old stuff is just draining.&lt;/p&gt;
&lt;p&gt;99% of the tools you write for you will never be looked at by anyone else. Even less of it will be &lt;em&gt;used&lt;/em&gt; by someone else. Don&amp;rsquo;t worry about what&amp;rsquo;s &amp;ldquo;good&amp;rdquo;. Do what makes &lt;em&gt;you&lt;/em&gt; feel good.&lt;/p&gt;
&lt;p&gt;Chicken Scheme made me feel good. Sometimes it still does. Crystal allowed my to do good things quickly, but it was never Joyful to me. I&amp;rsquo;m long past the days of Rubyish syntax being Joyful. I like it. It&amp;rsquo;s good, but I&amp;rsquo;ve written many many thousands of lines of it and the wonder and joy of it has worn off.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;[UPDATE] Since writing this I&amp;rsquo;ve thought a lot about the choices we make when coding specifically for ourselves vs coding for others. The result is the &lt;a href=&#34;https://weblog.masukomi.org/2023/02/10/duct-tape-baling-wire-methodology/&#34;&gt;Duct Tape &amp;amp; Baling Wire Methedology&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Was it worth rewriting all those times?&lt;/p&gt;
&lt;p&gt;100%&lt;/p&gt;
&lt;p&gt;The first rewrite (Crystal) was in a language I was enjoying, but more importantly it was desperately needed. The original codebase was spaghetti. It had grown without planning, as so many tiny-but-useful tools do.&lt;/p&gt;
&lt;p&gt;The second rewrite (Raku) was because I didn&amp;rsquo;t have the emotional spoons to deal. Fixing problems someone else created, in a tool i didn&amp;rsquo;t want to be writing, in a language I didn&amp;rsquo;t want to use&amp;hellip; ugh. I didn&amp;rsquo;t need that.&lt;/p&gt;
&lt;p&gt;However, this rewrite also ended up reinforcing my thoughts about how awesome Raku is, and teaching me some new tricks.&lt;/p&gt;
&lt;h2 id=&#34;if-you-liked-that-dot-dot-dot&#34;&gt;If you liked that&amp;hellip;&lt;/h2&gt;
&lt;p&gt;If you found that interesting, you&amp;rsquo;re probably the kind of geek who writes a bunch of useful command line tools. If so, you should check out &lt;a href=&#34;https://tooloo.dev&#34;&gt;TooLoo&lt;/a&gt;. That&amp;rsquo;s my Open Source tool that helps you document your tools. Find them later. Use them more.&lt;/p&gt;
&lt;h2 id=&#34;p-dot-s-dot-what-about-the-email-app-with-the-same-name&#34;&gt;P.S. What about the email app with the same name?&lt;/h2&gt;
&lt;p&gt;Hey! was created before the email service. I figure this project is never going to become popular enough that I&amp;rsquo;ll have to worry about brand confusion. ;)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How To Receive Twilio Messages In MongoDB Atlas Functions</title>
      <link>https://weblog.masukomi.org/2022/12/12/how-to-receive-twilio-messages-in-mongodb-atlas-functions/</link>
      <pubDate>Mon, 12 Dec 2022 14:12:15 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/2022/12/12/how-to-receive-twilio-messages-in-mongodb-atlas-functions/</guid>
      <description>
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-1&#34;&gt;
Overview
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;There&amp;#39;s plenty of documentation about how to &lt;em&gt;send&lt;/em&gt; an SMS via Twilio, but &lt;em&gt;very&lt;/em&gt; little about how to &lt;em&gt;receive&lt;/em&gt; one. Receiving one in a MongoDB Atlas Function involves an extra complication. By the end of this post you&amp;#39;ll know how to receive a text in Twilio, and have it successfully interact with your MongoDB Atlas Function. I&amp;#39;ll also cover a couple nice-to-have&amp;#39;s in Twilio that you&amp;#39;ll probably want to set up anyway.&lt;/p&gt;
&lt;p&gt;
I&amp;#39;m hoping, that you&amp;#39;ll discover, like I did, that this Serverless Function in the Cloud stuff is actually pretty easy.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-2&#34;&gt;
Data Flow overview
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-2&#34;&gt;
&lt;img src=&#34;https://weblog.masukomi.org/images/2022/12/12/architecture_overview.png&#34; alt=&#34;an overview of the expected vs actual architecture. explained below.&#34; title=&#34;actual vs expected architecture&#34;/&gt;
&lt;p&gt;
The thing you need to know about interacting with Twilio is that it wants instructions from you in XML format. They&amp;#39;ve done a great job of not only making that XML simple, and documenting it, but also making libraries that make it trivial to generate without ever thinking about XML.&lt;/p&gt;
&lt;p&gt;
Twilio also makes it &lt;em&gt;really&lt;/em&gt; easy to interact with external systems. You just plug the URL of a remote webhook into the appropriate, easy to find field, and you&amp;#39;re good.&lt;/p&gt;
&lt;p&gt;
The problem is that MongoDB Atlas Functions &lt;em&gt;only&lt;/em&gt; allow you to return JSON or EJSON. So, even though you can easily generate the XML you need &lt;em&gt;in&lt;/em&gt; your Atlas Function, you can&amp;#39;t return it. And, to complicate matters, what you tell the function to return, isn&amp;#39;t actually what the function returns.&lt;/p&gt;
&lt;p&gt;
So, let&amp;#39;s walk through setting this up. I&amp;#39;m going to skip over the bits that are well documented by Twilio and MongoDB, and focus on the bits that aren&amp;#39;t.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-3&#34;&gt;
Configuring Things in Twilio.
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;
Twilio appears to have two forms of functions in the cloud: &amp;#34;TwiML Bins&amp;#34; and &amp;#34;Functions&amp;#34;. You can find both if you click on &amp;#34;Explore Products&amp;#34; in the sidebar of your &amp;#34;Console&amp;#34;.  Once you click into it, be sure to click the three dots to the right of &amp;#34;TwiML Bins&amp;#34; in the sidebar and choose &amp;#34;Pin to Sidebar&amp;#34;. You&amp;#39;ll be glad you did.&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
Rejecting Voice Calls
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;I presume that most users don&amp;#39;t use the voice functionality, so you the first thing you need to do is to refuse voice calls. Like everything else, you do this by giving Twilio instructions in its XML format (TwiML).&lt;/p&gt;
&lt;p&gt;
Create a new TwiML Bin and call it &amp;#34;Reject Calls&amp;#34;.&lt;/p&gt;
&lt;p&gt;
Here&amp;#39;s what it needs to contain.&lt;/p&gt;
&lt;div class=&#34;src src-xml&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;Response&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;Reject&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/Response&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Next, go to &lt;code class=&#34;verbatim&#34;&gt;Phone Numbers &amp;gt; Manage &amp;gt; Active Numbers&lt;/code&gt; and click on your phone number. There are two sections &amp;#34;Voice and Fax&amp;#34; and &amp;#34;Messaging&amp;#34;. Under &amp;#34;Voice and Fax&amp;#34; You&amp;#39;ll see &amp;#34;A Call Comes in&amp;#34;. Choose &amp;#34;Twiml Bin&amp;#34; from the first pull down, then your new &amp;#34;Reject Calls&amp;#34; from the second.&lt;/p&gt;
&lt;p&gt;
I didn&amp;#39;t bother with anything else here. I didn&amp;#39;t set a &amp;#34;Primary Handler Fails&amp;#34; method either because if they can&amp;#39;t talk to their own system, I don&amp;#39;t expect them to be able to talk to anyone else&amp;#39;s.&lt;/p&gt;
&lt;p&gt;
You&amp;#39;re now done with worrying about calls. Let&amp;#39;s move on to the Atlas Function.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Your Atlas Function
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;First you&amp;#39;ll need to create a cluster, and an App Services App. The MongoDB docs can guide you through that. Once you&amp;#39;ve done that, you go into the App Services App you created, click on the cluster you want to work with, and then click &amp;#34;Functions&amp;#34; in the left sidebar. Then click &amp;#34;Create New Function&amp;#34;. Give it a useful name. Make sure the function is &lt;em&gt;not&lt;/em&gt; private, and that authentication is set to &amp;#34;System&amp;#34;.&lt;/p&gt;
&lt;p&gt;
npm Packages: You won&amp;#39;t need the &amp;#34;twilio&amp;#34; npm package. It just makes life difficult here because of the JSON response. If you&amp;#39;re like us and don&amp;#39;t want the risk of storing someone&amp;#39;s phone number you&amp;#39;ll want to hash it. Click &amp;#34;Add Dependency&amp;#34; and add the &amp;#34;crypto&amp;#34; package dependency.&lt;/p&gt;
&lt;p&gt;
Now, let&amp;#39;s make the function. This functions is where your real work is going to happen. In the example below I&amp;#39;m showing you &lt;em&gt;only&lt;/em&gt; the core bits you&amp;#39;ll probably want to copy. After that I&amp;#39;ll give you an example of some input to test it with in their console.&lt;/p&gt;
&lt;div class=&#34;src src-javascript&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// This function is the endpoint&amp;#39;s request handler.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// NOTE: MAKE THIS async TO SAVE HEADACHES
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;exports&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;async&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;query&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;db&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;context&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;MY_LINKED_DATA_SOURCE&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;db&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;MY_DB_NAME&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// we&amp;#39;re going to hash the user&amp;#39;s phone number because
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;c1&#34;&gt;// we don&amp;#39;t want the risk of storing that personal info
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;createHash&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;crypto&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;async&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;getOwnerObj&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;db&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;hashedPhoneNumber&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;collection&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;db&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;collection&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;NAME_OF_COLLECTION_WITH_PHONE_HASH&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;c1&#34;&gt;// below: phoneHash &amp;amp; ownerId are field names within our data
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;      &lt;span class=&#34;c1&#34;&gt;// your names may be different
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;      &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;query&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;phoneHash&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;hashedPhoneNumber&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;projection&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;ownerId&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;c1&#34;&gt;// Use findOne() to retrieve a single document from the collection
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;      &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;collection&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;findOne&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;query&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;projection&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;cleanPhoneNumber&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;phoneNumber&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;c1&#34;&gt;// our app is US only so the phone numbers will start with
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;      &lt;span class=&#34;c1&#34;&gt;// the US country code: +1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;      &lt;span class=&#34;c1&#34;&gt;// you may not want this, or may need a different regex
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;      &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;phoneNumber&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;replace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;/^\+\d/&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;phoneHash&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;phoneNumber&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;c1&#34;&gt;// it&amp;#39;s a good idea to add in some &amp;#34;salt&amp;#34; here.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;      &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;createHash&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;sha256&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;update&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;cleanPhoneNumber&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;phoneNumber&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;digest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;hex&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// --------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;c1&#34;&gt;// BEGIN procedural code
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;c1&#34;&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;c1&#34;&gt;// Raw request body
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;c1&#34;&gt;// This is a binary object that can be accessed as a string using .text()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;reqBody&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// For a full list of parameters they send
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;c1&#34;&gt;// check out https://www.twilio.com/docs/voice/twiml#request-parameters
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;c1&#34;&gt;// We only care about who the message came from, and what the message was.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;From&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Body&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;JSON&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;parse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;reqBody&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// Set up the default data you&amp;#39;ll return
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;c1&#34;&gt;// I&amp;#39;ve decided to go with HTTP Status Codes, because they&amp;#39;ve already
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;c1&#34;&gt;// got something to address most situations.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;responseData&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;200&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// 200 if everything goes as expected
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;message&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// the message we&amp;#39;ll return to the user
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// hash the phone number, find a matching entry,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;c1&#34;&gt;// return it.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;c1&#34;&gt;// NOTE: we have to await the response, even though we already
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;c1&#34;&gt;// awaited the response inside the functions we&amp;#39;re calling.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ownerObj&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;getOwnerObj&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;db&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;phoneHash&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;From&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ownerObj&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;// OK we have a user. Yay.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;// insert your message processing logic here.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;c1&#34;&gt;// if anything goes wrong, change the status code
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;c1&#34;&gt;// in responseData
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;c1&#34;&gt;// the message will be whatever message you want to return
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;c1&#34;&gt;// to the user. Note that outbound texts are VERY rate limited
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;c1&#34;&gt;// in twilio so, only respond with a message when you need to.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nx&#34;&gt;responseData&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;it worked and i found a user&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nx&#34;&gt;responseData&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;status&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;403&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nx&#34;&gt;responseData&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;message&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;No registered user with that phone number.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;responseData&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-6&#34;&gt;
Notes &amp;amp; Things to change
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-4&#34;&gt;
&lt;div id=&#34;outline-container-headline-7&#34; class=&#34;outline-5&#34;&gt;
&lt;h5 id=&#34;headline-7&#34;&gt;
Note
&lt;/h5&gt;
&lt;div id=&#34;outline-text-headline-7&#34; class=&#34;outline-text-5&#34;&gt;
&lt;p&gt;The default &lt;code class=&#34;verbatim&#34;&gt;exports&lt;/code&gt; function is &lt;em&gt;not&lt;/em&gt; &lt;code class=&#34;verbatim&#34;&gt;async&lt;/code&gt;. Be sure to change that.&lt;/p&gt;
&lt;p&gt;
It &lt;em&gt;looks&lt;/em&gt; like you&amp;#39;re returning something like this:&lt;/p&gt;
&lt;div class=&#34;src src-json&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;200&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;message&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;my response SMS text&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
BUT, what you&amp;#39;re actually returning is more like this.&lt;/p&gt;
&lt;div class=&#34;src src-json&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;200&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;statusText&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;&amp;#39;OK&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;headers&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;...&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;config&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;...&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;request&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;...&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;data&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;200&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;message&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;my response SMS text&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Whatever JSON you chose to return will be stored as the value of the &lt;code class=&#34;verbatim&#34;&gt;data&lt;/code&gt; key in the object that&amp;#39;s returned.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-8&#34; class=&#34;outline-5&#34;&gt;
&lt;h5 id=&#34;headline-8&#34;&gt;
Things to Change in the code above
&lt;/h5&gt;
&lt;div id=&#34;outline-text-headline-8&#34; class=&#34;outline-text-5&#34;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&#34;verbatim&#34;&gt;MY_DB_NAME&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&#34;verbatim&#34;&gt;NAME_OF_COLLECTION_WITH_PHONE_HASH&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&#34;verbatim&#34;&gt;MY_LINKED_DATA_SOURCE&lt;/code&gt; (this defaults to &lt;code class=&#34;verbatim&#34;&gt;&amp;#34;mongodb-atlas&amp;#34;&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Change those to the relevant values. If you&amp;#39;re unsure, there are a ton of videos on getting up and running with Atlas Functions &amp;#34;in 10 minutes&amp;#34;. Just be aware that they used to be called &amp;#34;Realm Functions&amp;#34;. Here&amp;#39;s &lt;a href=&#34;https://youtu.be/Evp3xTzWCu4&#34;&gt;a video from MongoDB&lt;/a&gt; that should get you going.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-9&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-9&#34;&gt;
Deploying Your Atlas Function
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-9&#34; class=&#34;outline-text-4&#34;&gt;
&lt;p&gt;There&amp;#39;s a tab for settings. There are two notable bits for now.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Authentication should be &amp;#34;System&amp;#34; for now.&lt;/li&gt;
&lt;li&gt;Make it NOT be private.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You can change these later based on your needs, but for now, this setup will make testing WAY easier.&lt;/p&gt;
&lt;p&gt;
Deploying is trivially easy. Just save your function. That&amp;#39;s it.&lt;/p&gt;
&lt;p&gt;
Unfortunately, we can&amp;#39;t actually talk to it yet.&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-10&#34; class=&#34;outline-5&#34;&gt;
&lt;h5 id=&#34;headline-10&#34;&gt;
HTTPS Endpoint
&lt;/h5&gt;
&lt;div id=&#34;outline-text-headline-10&#34; class=&#34;outline-text-5&#34;&gt;
&lt;ol&gt;
&lt;li&gt;Click &amp;#34;HTTPS Endpoints&amp;#34; in the left sidebar.&lt;/li&gt;
&lt;li&gt;Click &amp;#34;Add an Endpoint&amp;#34;&lt;/li&gt;
&lt;li&gt;Give it a &amp;#34;route&amp;#34;
In our case I made it &lt;code class=&#34;verbatim&#34;&gt;/tell&lt;/code&gt; because our app is called &amp;#34;Tell Remmy&amp;#34; but it really doesn&amp;#39;t matter. The general public is never going to see this URL.&lt;/li&gt;
&lt;li&gt;Turn on &amp;#34;Respond with Result&amp;#34;
If you don&amp;#39;t do this you won&amp;#39;t get any data back.&lt;/li&gt;
&lt;li&gt;The Return Type should be JSON.&lt;/li&gt;
&lt;li&gt;Select your function by name.&lt;/li&gt;
&lt;li&gt;Don&amp;#39;t muck with authentication.
&lt;em&gt;If&lt;/em&gt; you need to, muck with it once you&amp;#39;ve gotten things working.&lt;/li&gt;
&lt;li&gt;Copy the URL under &amp;#34;Operation Type&amp;#34;.
Save it somewhere for reference later.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-11&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-11&#34;&gt;
Testing Your Atlas Function
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-11&#34; class=&#34;outline-text-4&#34;&gt;
&lt;p&gt;There are two ways to test your function. Once you&amp;#39;ve got the HTTPS Endpoint set up you can easily test with &lt;a href=&#34;https://insomnia.rest/&#34;&gt;Insomnia&lt;/a&gt; or &lt;a href=&#34;https://www.postman.com/&#34;&gt;Postman&lt;/a&gt;. &amp;#34;Deploying&amp;#34; your function is &lt;em&gt;so&lt;/em&gt; fast, that I find it easier to test by &lt;em&gt;actually&lt;/em&gt; hitting the endpoint, and just shoving useful debugging info into the returned JSON.&lt;/p&gt;
&lt;p&gt;
You can also test on their &amp;#34;console&amp;#34;. I&amp;#39;ll cover both.&lt;/p&gt;
&lt;p&gt;
The following assumes you&amp;#39;ve used the code above, and had a record in the DB with a matching phone number hash. You can also just comment out the code that interacts with the db and just return anything that isn&amp;#39;t from that function if you want to just test fast and leave DB stuff for later.&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-12&#34; class=&#34;outline-5&#34;&gt;
&lt;h5 id=&#34;headline-12&#34;&gt;
Testing With Insomnia / Postman
&lt;/h5&gt;
&lt;div id=&#34;outline-text-headline-12&#34; class=&#34;outline-text-5&#34;&gt;
&lt;p&gt;Create a new POST request. Paste in the URL you saved when you made the HTTPS Endpoint.&lt;/p&gt;
&lt;p&gt;
Tell it to use a JSON body / payload. Here&amp;#39;s my test one. It&amp;#39;s got a couple extra keys in it that you&amp;#39;ll be getting from Twilio, but not the &lt;em&gt;full&lt;/em&gt; set.&lt;/p&gt;
&lt;div class=&#34;src src-json&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;From&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;+11234567890&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;To&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;+15558675310&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;Body&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;an example text message from the user&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;numMedia&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Run it. See what comes out.&lt;/p&gt;
&lt;p&gt;
Error messages are half-way decent but don&amp;#39;t contain line numbers.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-13&#34; class=&#34;outline-5&#34;&gt;
&lt;h5 id=&#34;headline-13&#34;&gt;
Testing with the Console
&lt;/h5&gt;
&lt;div id=&#34;outline-text-headline-13&#34; class=&#34;outline-text-5&#34;&gt;
&lt;p&gt;Under your function editor is a JavaScript console.&lt;/p&gt;
&lt;p&gt;
Here&amp;#39;s some test input for it:&lt;/p&gt;
&lt;div class=&#34;src src-javascript&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;textFunc&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;{&amp;#34;From&amp;#34;: &amp;#34;+11234567890&amp;#34;, &amp;#34;Body&amp;#34;: &amp;#34;an example text message from the user&amp;#34;}&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;request&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;s2&#34;&gt;&amp;#34;query&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;s2&#34;&gt;&amp;#34;headers&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;s2&#34;&gt;&amp;#34;body&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;textFunc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;exports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;request&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{})&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Note that &lt;code class=&#34;verbatim&#34;&gt;body.text&lt;/code&gt; is a function. This is to simulate the real post body that you&amp;#39;ll be receiving, and need to call &lt;code class=&#34;verbatim&#34;&gt;.text&lt;/code&gt; on to get the JSON passed in from Twilio.&lt;/p&gt;
&lt;p&gt;
Stick that in the console, and click Run.&lt;/p&gt;
&lt;div class=&#34;src src-text&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; result (JavaScript):
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;EJSON.parse(&amp;#39;{&amp;#34;status&amp;#34;:{&amp;#34;$numberLong&amp;#34;:&amp;#34;200&amp;#34;},&amp;#34;message&amp;#34;:&amp;#34;it worked and i found a user&amp;#34;}&amp;#39;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Note that if you end up with a problem in your code, &lt;code class=&#34;verbatim&#34;&gt;console.log(...)&lt;/code&gt; is not going to be as helpful for debugging as you&amp;#39;d expect. It will &lt;em&gt;only&lt;/em&gt; output anything &lt;em&gt;if&lt;/em&gt; the function doesn&amp;#39;t encounter any errors. Because of this, and because of the fact that the console is so very tiny with my large font size, I generally don&amp;#39;t bother using it.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-14&#34; class=&#34;outline-5&#34;&gt;
&lt;h5 id=&#34;headline-14&#34;&gt;
That&amp;#39;s it.
&lt;/h5&gt;
&lt;div id=&#34;outline-text-headline-14&#34; class=&#34;outline-text-5&#34;&gt;
&lt;p&gt;Your Atlas Function is live, working, and callable from Twilio, or anywhere else.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-15&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-15&#34;&gt;
Teaching Twilio To Talk To Atlas
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-15&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Back in your Twilio console, click on &amp;#34;Explore Products&amp;#34; in the sidebar. Scroll down until you find &amp;#34;Functions and Assets&amp;#34;. Click it, and then pin it to your sidebar for easy future access.&lt;/p&gt;
&lt;p&gt;
You&amp;#39;ll need to create a service. This appears to be some sort of grouping of functions. I don&amp;#39;t know, and I don&amp;#39;t care. I just called it &amp;#34;FooProxy&amp;#34; where &amp;#34;Foo&amp;#34; is the name of the app in MongoDB Atlas that this function is acting as a proxy for.&lt;/p&gt;
&lt;p&gt;
Click into your new service, and click &amp;#34;Add +&amp;#34; &amp;gt; &amp;#34;Add Function&amp;#34;&lt;/p&gt;
&lt;p&gt;
Here&amp;#39;s what your function should look like:&lt;/p&gt;
&lt;div class=&#34;src src-javascript&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;axios&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;axios&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;exports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;handler&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;async&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;context&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;event&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;callback&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// Create a new message response object
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;twiml&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Twilio&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;twiml&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;MessagingResponse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;//twiml.message(&amp;#34;bogus&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;//return callback(null, twiml);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;instance&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;axios&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;create&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;baseURL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;THE DOMAIN NAME OF YOUR ATLAS FUNCTION&amp;#39;S URL&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;X-Custom-Header&amp;#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;Twilio&amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;               &lt;span class=&#34;s1&#34;&gt;&amp;#39;Content-Type&amp;#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;application/json&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;try&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// axios#post(url[, data[, config]])
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;c1&#34;&gt;// const {status, message} = await instance.post(
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;mongoResponse&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;instance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;post&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;s2&#34;&gt;&amp;#34;EVERYTHING AFTER THE DOMAIN NAME OF YOUR ATLAS FUNCTION&amp;#39;S URL&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;From&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;event&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;From&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;Body&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;event&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Body&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;mongoResponse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;status&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;200&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;c1&#34;&gt;// remember, or response is in the .data portion of the
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;      &lt;span class=&#34;c1&#34;&gt;// big wrapper MongoDB Atlas put around it.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;      &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;myStatus&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;mongoResponse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;status&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;message&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;mongoResponse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;c1&#34;&gt;// maybe change something if myStatus != 200
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;      &lt;span class=&#34;nx&#34;&gt;twiml&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;c1&#34;&gt;// note: this is MONGO&amp;#39;s status, not yours
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;      &lt;span class=&#34;nx&#34;&gt;twiml&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;mongoResponse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;statusText&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;callback&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;twiml&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;catch&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// As always with async functions, you need to be sure to handle errors
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// Add a message to the response to let the user know that something went wrong
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;nx&#34;&gt;twiml&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`We received your message, but something went wrong 😭 &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;callback&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-16&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-16&#34;&gt;
Notes &amp;amp; things To Change
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-16&#34; class=&#34;outline-text-4&#34;&gt;
&lt;p&gt;We&amp;#39;ll need to insert the URL from your MongoDB HTTPS Endpoint into your Twilio Function. It probably looks like this:&lt;/p&gt;
&lt;p&gt;
&lt;code class=&#34;verbatim&#34;&gt;https://us-east-1.aws.data.mongodb-api.com/app/cluster-name-abcd/endpoint/my_path&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;
Replace &lt;code class=&#34;verbatim&#34;&gt;&amp;#34;THE DOMAIN NAME OF YOUR ATLAS FUNCTION&amp;#39;S URL&amp;#34;&lt;/code&gt;
with &lt;code class=&#34;verbatim&#34;&gt;&amp;#34;https://us-east-1.aws.data.mongodb-api.com&amp;#34;&lt;/code&gt; , or whatever&amp;#39;s at the start of yours.&lt;/p&gt;
&lt;p&gt;
Replace &lt;code class=&#34;verbatim&#34;&gt;&amp;#34;EVERYTHING AFTER THE DOMAIN NAME OF YOUR ATLAS FUNCTION&amp;#39;S URL&amp;#34;&lt;/code&gt; with everything after that. In this example it&amp;#39;d be &lt;code class=&#34;verbatim&#34;&gt;&amp;#34;/app/cluster-name/abcd/endpoint/my_path&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;
In the &lt;code class=&#34;verbatim&#34;&gt;instance.post&lt;/code&gt; method call, you may want to change the data you&amp;#39;re passing on. For us &lt;code class=&#34;verbatim&#34;&gt;From&lt;/code&gt; and &lt;code class=&#34;verbatim&#34;&gt;Body&lt;/code&gt; was the &lt;em&gt;only&lt;/em&gt; info we needed, so it&amp;#39;s the only info we&amp;#39;re passing on. You can always add additional fields later.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-17&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-17&#34;&gt;
Deploying Your Twilio Function
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-17&#34; class=&#34;outline-text-4&#34;&gt;
&lt;ol&gt;
&lt;li&gt;Save it.&lt;/li&gt;
&lt;li&gt;click &amp;#34;Deploy All&amp;#34;&lt;/li&gt;
&lt;li&gt;Go back to &amp;#34;Phone Numbers&amp;#34; &amp;gt; &amp;#34;Manage&amp;#34; &amp;gt; &amp;#34;Active Numbers&amp;#34;&lt;/li&gt;
&lt;li&gt;Click on your number.&lt;/li&gt;
&lt;li&gt;Scroll down to the &amp;#34;Messaging&amp;#34; section&lt;/li&gt;
&lt;li&gt;Under &amp;#34;A Message Comes In&amp;#34;, choose &amp;#34;Function&amp;#34; and choose your function from the resulting pull-downs&lt;/li&gt;
&lt;li&gt;Click Save.&lt;/li&gt;
&lt;li&gt;Note that they&amp;#39;ve replaced your function with a webhook url. Don&amp;#39;t worry about that. That&amp;#39;s normal.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After the first time you just need to &amp;#34;Save&amp;#34; your function and click &amp;#34;Deploy All&amp;#34; to update it.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-18&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-18&#34;&gt;
Testing Your Twilio Function
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-18&#34; class=&#34;outline-text-4&#34;&gt;
&lt;p&gt;Go back to your function. &amp;#34;Functions And Assets&amp;#34; (in the sidebar) &amp;gt; &amp;#34;Services&amp;#34; &amp;gt; Click on your service.&lt;/p&gt;
&lt;p&gt;
Click &amp;#34;Enable Live Logs&amp;#34; below your function.
Text your phone number.
You should receive the contents of the &amp;#34;message&amp;#34; portion on your phone.&lt;/p&gt;
&lt;p&gt;
If you don&amp;#39;t get a message, and don&amp;#39;t see anything happen in the live logs it could be two things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Live logs simple isn&amp;#39;t working. Sometimes it just doesn&amp;#39;t. Reload the page.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;An error occurred.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;click &amp;#34;Monitor&amp;#34; in the Sidebar.&lt;/li&gt;
&lt;li&gt;click &amp;#34;Logs&amp;#34; &amp;gt; &amp;#34;Errors&amp;#34; &amp;gt; &amp;#34;Error Logs&amp;#34;&lt;/li&gt;
&lt;li&gt;Do not choose &amp;#34;Last Hour&amp;#34;. It&amp;#39;s broken. Probably a time-zone bug for anyone not in UTC.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you see an error in the logs, click into it. The most important part is the &amp;#34;Response Body&amp;#34;. Almost everything else was useless for me.&lt;/p&gt;
&lt;p&gt;
If your receive a &amp;#34;not delivered&amp;#34; message from your phone it&amp;#39;s probably because you&amp;#39;re still on the trial and it will ONLY let you interact with it from &lt;em&gt;your&lt;/em&gt; phone number and no other ones.&lt;/p&gt;
&lt;p&gt;
Note that the macOS Messages app does NOT send from your phone number as far as Twilio is concerned. I haven&amp;#39;t investigated what number it is.&lt;/p&gt;
&lt;p&gt;
Either way, your choice is to just use your phone, tell twilio about another phone number, or just start paying them. I just used my phone until I got everything working and then paid them so that others could use it.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-19&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-19&#34;&gt;
Handling MongoDB Outages In Twilio
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-19&#34; class=&#34;outline-text-4&#34;&gt;
&lt;p&gt;
Sooner or later, MongoDB&amp;#39;s servers will go down. That&amp;#39;s what servers do. Twilio&amp;#39;s will too, but there&amp;#39;s not a lot you can do &lt;em&gt;in Twilio&lt;/em&gt; if Twilio&amp;#39;s servers are down.&lt;/p&gt;
&lt;p&gt;
Let&amp;#39;s set up a TwiML Bin to handle what we hope will never happen, but probably will.&lt;/p&gt;
&lt;p&gt;
Create a new Twiml Bin. This one we&amp;#39;ll call &amp;#34;Service Failure Fallback&amp;#34;. Its contents should look like this.&lt;/p&gt;
&lt;div class=&#34;src src-xml&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;Response&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;Message&amp;gt;&lt;/span&gt;Oh No! Our Servers are not feeling well! Please try again in a few minutes.&lt;span class=&#34;nt&#34;&gt;&amp;lt;/Message&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/Response&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Then go manage your active phone number again, and under the call to your Twilio Function, that calls Mongo, associate your &amp;#34;Service Failure Fallback&amp;#34; TwiML Bin with the &amp;#34;Primary Handler Fails&amp;#34; operation.&lt;/p&gt;
&lt;p&gt;
Now, if MongoDB Atlas goes down your users will receive a text response with a message that you chose.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-20&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-20&#34;&gt;
Summary
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-20&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;
In the end it&amp;#39;s pretty easy. It&amp;#39;s just complicated by the JSON only responses of MongoDB Atlas Functions. If MongoDB eliminates that restriction, and stops wrapping responses with additional stuff, we can eliminate the Twilio Function entirely, and just use your Atlas Function&amp;#39;s url as a webhook in Twilio. We&amp;#39;d also be able to use the &lt;code class=&#34;verbatim&#34;&gt;twilio&lt;/code&gt; npm package in Mongo.&lt;/p&gt;
&lt;p&gt;
If you&amp;#39;ve got questions, feel free to &lt;a href=&#34;https://connectified.com/@masukomi/&#34;&gt;ask me on Mastodon&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>I used AI to generate products &amp; write copy for my store</title>
      <link>https://weblog.masukomi.org/2022/12/06/i-used-ai-to-generate-products-write-copy-for-my-store/</link>
      <pubDate>Tue, 06 Dec 2022 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2022/12/06/i-used-ai-to-generate-products-write-copy-for-my-store/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#quick-summary&#34;&gt;Quick Summary&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#it-started-as-a-joke-dot-dot-dot&#34;&gt;It started as a joke&amp;hellip;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-work-begins-dot-dot-dot&#34;&gt;The work Begins&amp;hellip;&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#generating-images&#34;&gt;Generating images&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#prepping-images&#34;&gt;Prepping images&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#redbubble&#34;&gt;RedBubble&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-site&#34;&gt;The site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#know-thyself&#34;&gt;Know Thyself&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#that-sweet-marketing-copy&#34;&gt;That Sweet Marketing Copy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#final-thoughts&#34;&gt;Final Thoughts&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#will-i-share-my-code&#34;&gt;Will I share my code?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#what-s-my-favorite&#34;&gt;What&amp;rsquo;s my favorite?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#so-many-images&#34;&gt;So Many Images&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;quick-summary&#34;&gt;Quick Summary&lt;/h2&gt;
&lt;p&gt;I used Midjourney to generate art that I threw on t-shirts, coasters, and almost everything else RedBubble offers. Then I used OpenAI to generate copy for it, and combined that with a handful of custom scripts to generate a product site called &lt;a href=&#34;https://bedbathandthebeyond.com&#34;&gt;Bed Bath &amp;amp; The Beyond&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It took about 40 hours of work to put all that together for 13 products, but that will be faster next time. In the end, this is a surprisingly viable option, and the only real restriction on profit is how much effort you&amp;rsquo;re willing to put into marketing what you make.&lt;/p&gt;
&lt;h2 id=&#34;it-started-as-a-joke-dot-dot-dot&#34;&gt;It started as a joke&amp;hellip;&lt;/h2&gt;
&lt;p&gt;A friend &lt;a href=&#34;https://connectified.com/@cobie/109442153511919853&#34;&gt;threw this out on Mastodon&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/12/06/cobies_initial_post_small.jpg&#34;
    alt=&#34;mastodon post suggesting &amp;#39;bed bath and the beyond&amp;#39; as a hook for horror writers&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;screenshot of mastodon posts&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;For a giggle, I asked Midjourney for &amp;ldquo;UNSPEAKABLE HORRORS AT UNSPEAKABLE PRICES. ALSO, BATH MATS.&amp;rdquo; and this came out&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/12/06/monster_bath_mats_small.jpg&#34;
    alt=&#34;four bath mats with toothy monsters on them. most have tentacles. one is a terrified blue face&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;And they looked &amp;ldquo;real&amp;rdquo; enough that I wondered if I could actually make a &amp;ldquo;cool&amp;rdquo; bath-mat.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/12/06/first_real_bath_mat_small.jpg&#34;
    alt=&#34;the first &amp;#39;real&amp;#39; bath mat. an woodcut style image of lovecraft with writhing tentacles behind him&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;lovecraft &amp;amp; tentacles bath mat&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;A little editing, and I&amp;rsquo;d extracted it from the &amp;ldquo;bath mat&amp;rdquo;, and &lt;a href=&#34;https://www.redbubble.com/shop/ap/133892066?ref=studio-promote&#34;&gt;thrown it on Redbubble&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/12/06/etched_lovecraft_floor_pillow_small.jpg&#34;
    alt=&#34;the same image, but now on a floor pillow&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;the same image on a floor pillow&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;That&amp;rsquo;s when things started to spiral out of control.&lt;/p&gt;
&lt;h2 id=&#34;the-work-begins-dot-dot-dot&#34;&gt;The work Begins&amp;hellip;&lt;/h2&gt;
&lt;h3 id=&#34;generating-images&#34;&gt;Generating images&lt;/h3&gt;
&lt;p&gt;I spent that night working through images on Midjourney. It was hours of work, but as I was being pretty lenient with Midjourney I was able to get usable results pretty quickly. &lt;strong&gt;At the bottom of this post is a screenshot of the stream of images I generated.&lt;/strong&gt; I&amp;rsquo;d put it here, but it&amp;rsquo;s really long. ;)&lt;/p&gt;
&lt;h3 id=&#34;prepping-images&#34;&gt;Prepping images&lt;/h3&gt;
&lt;p&gt;Then came the editing. By default an upscaled image from midjourney with a 3:2 aspect ratio is only 1536 x 1024 which is fine on your screen, but not so hot for printing.&lt;/p&gt;
&lt;p&gt;Fortunately, I&amp;rsquo;ve actually got a background in print and fabrics are &lt;em&gt;not&lt;/em&gt; a high-resolution, or high-fidelity medium. So, upscaling artifacts &lt;em&gt;shouldn&amp;rsquo;t&lt;/em&gt; be a big deal on most things. I&amp;rsquo;m a bit unsure about the comforters and shower curtains though. Because of this, the acceptable resolution is much lower. Also, &lt;a href=&#34;https://help.redbubble.com/hc/en-us/articles/202270679-Dimensions-Format&#34;&gt;RedBubble has this handy page&lt;/a&gt; that suggests resolutions for each of their products.&lt;/p&gt;
&lt;p&gt;Combine that with &lt;a href=&#34;https://www.pixelmator.com/blog/2019/12/17/all-about-the-new-ml-super-resolution-feature-in-pixelmator-pro/&#34;&gt;Pixelmator Pro&amp;rsquo;s ML Super Resolution&lt;/a&gt; and the upscaling went pretty well.&lt;/p&gt;
&lt;p&gt;Most of the images required very little editing.&lt;/p&gt;
&lt;h3 id=&#34;redbubble&#34;&gt;RedBubble&lt;/h3&gt;
&lt;p&gt;At this point I&amp;rsquo;ve sunk at least 10 hours into the process. I&amp;rsquo;ve made two or three product pages on RedBubble for them. Creating the RedBubble product pages was &amp;hellip; work. There&amp;rsquo;s just no getting around it. It&amp;rsquo;s a time sink.&lt;/p&gt;
&lt;p&gt;In their defense, it requires a lot of subjective human decision making. They&amp;rsquo;ve also done a ton of work to help folks to promote things. For example, when I click on &amp;ldquo;Download Images&amp;rdquo; on the Desk Mat for &lt;a href=&#34;https://bedbathandthebeyond.com/products/billy_and_gog_s_grand_adventures/&#34;&gt;Billy and Gog&amp;rsquo;s Grand Adventures&lt;/a&gt; I get this excellent collection of promo images to use to promote it.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/12/06/example_product_images_small.png&#34;
    alt=&#34;five professional looking product images of the desk mat with my image on it in many scenes&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;screenshot of desk mats&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Upload, choose, set default colors, save, see what you missed, edit the page to tweak default fabric colors again, repeat.&lt;/p&gt;
&lt;h3 id=&#34;the-site&#34;&gt;The site&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://gohugo.io&#34;&gt;Hugo&lt;/a&gt; is my default static site generator. It&amp;rsquo;s fast, it&amp;rsquo;s easy, and I&amp;rsquo;m familiar with it. So I start making pages, and it&amp;hellip; is&amp;hellip; taking&amp;hellip; forever.&lt;/p&gt;
&lt;p&gt;The process was&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;grab the product url&lt;/li&gt;
&lt;li&gt;make a markdown link&lt;/li&gt;
&lt;li&gt;choose 2 or 3 items to highlight&lt;/li&gt;
&lt;li&gt;download images of the image on those products&lt;/li&gt;
&lt;li&gt;make a markdown link to each of those product pages&lt;/li&gt;
&lt;li&gt;embed the image in the page with a markdown link to the product page around it.&lt;/li&gt;
&lt;li&gt;come up with some witty title and ridiculous copy for the page&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I punted on the last one. The process doesn&amp;rsquo;t &lt;em&gt;sound&lt;/em&gt; like much when you say it, but in practice it was hugely time consuming, mentally draining, boring, and soul sucking.&lt;/p&gt;
&lt;h3 id=&#34;know-thyself&#34;&gt;Know Thyself&lt;/h3&gt;
&lt;p&gt;I knew that if I forced my way through, I could finish the 13 or so products I had. I also knew that I&amp;rsquo;d never add anything else to the site if I did. I&amp;rsquo;d definitely not make another site if some other entertaining idea came along.&lt;/p&gt;
&lt;p&gt;So, I wrote some code. We&amp;rsquo;re talking ugly, get it done, do the first thing that&amp;rsquo;ll work kind a code.&lt;/p&gt;
&lt;p&gt;Along the way I discover that for some reason Firefox doesn&amp;rsquo;t bother to store session cookies in its SQLite cookie database, and it turns out I need session cookies. So, right click, inspect the network call to their GraphQL API (totally undocumented) and &amp;ldquo;Copy as curl&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Then write a bash script to read in the clipboard, extract the cookies and throw them into some ancient Netscape Navigator format that curl apparently knows how to handle. This file doesn&amp;rsquo;t need to be regenerated for &amp;hellip;. days? I dunno.&lt;/p&gt;
&lt;p&gt;Then copy the url for the product promotion page (the one with links to downloadable images) and run that through another script that extracts the product id, gives it to curl, which utilizes the new cookie file, and hits their GraphQL endpoint to extract the JSON (same stuff as on the web page). It&amp;rsquo;s more JSON than I need but refining the query would have been wasted time.&lt;/p&gt;
&lt;p&gt;Run that JSON through a third script (this one in &lt;a href=&#34;https://raku.org/&#34;&gt;Raku&lt;/a&gt;) that presents me with a list like this. Now I just need to scan the RedBubble promo page to find images I want to use, and type in their numbers.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-bs_lang&#34; data-lang=&#34;bs_lang&#34;&gt;...
[33] Shower Curtain
[34] Spiral Notebook
[35] Sticker
[36] Tall Mug
[37] Tapestry
[38] Throw Blanket
[39] Throw Pillow
[40] Transparent Sticker
[41] Travel Coffee Mug
[42] Wood Mounted Print
[43] Zipper Pouch
[44] iPad Skin
[45] iPad Snap Case
[46] iPhone Skin
[47] iPhone Snap Case
[48] iPhone Soft Case
[49] iPhone Tough Case
[50] iPhone Wallet
Choose some items (comma separated):
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The script considers my choices, downloads the default product image, runs it through imagemagic for resizing, takes my original artwork, resizes that, asks me for the name of the product and &amp;hellip;.. voilà I&amp;rsquo;ve got a markdown file with all the soul-sucking grunt work done for me.&lt;/p&gt;
&lt;p&gt;And yes, I have a way to add new products without overwriting the page.&lt;/p&gt;
&lt;h3 id=&#34;that-sweet-marketing-copy&#34;&gt;That Sweet Marketing Copy&lt;/h3&gt;
&lt;p&gt;I never lost sight of the fact that this was, ultimately, a joke. I expect to, over time, make &lt;strong&gt;tens of dollars&lt;/strong&gt; from this. If we consider my hourly rate it&amp;rsquo;s very unlikely this thing will ever pay for the labor that went into it.&lt;/p&gt;
&lt;p&gt;So, because I&amp;rsquo;m not going to get rich on this, and I&amp;rsquo;m &lt;em&gt;probably&lt;/em&gt; going to get a Cease and Desist letter from a Megacorp who likely lacks a sense of humor and thus shan&amp;rsquo;t be named. I&amp;rsquo;m not worried about &amp;ldquo;real&amp;rdquo; copy.&lt;/p&gt;
&lt;p&gt;However. We&amp;rsquo;re a day and a half of work into this thing and frankly my ability to write entertaining micro-fiction about each of these is&amp;hellip; shall we say, &amp;ldquo;diminished&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;But along the way I&amp;rsquo;ve been keeping my friend&amp;rsquo;s discord ( the one responsible for this stupidity ) in the loop. There someone points to &lt;a href=&#34;https://www.alexbirkett.com/ai-text-generator/&#34;&gt;an article about using AI for marketing copy&lt;/a&gt;, and I remember that I&amp;rsquo;d seen a bunch of hype about OpenAI on Mastodon lately. I don&amp;rsquo;t really want great &amp;ldquo;marketing copy&amp;rdquo;. I want creative stories, that happen to also be marketing copy.&lt;/p&gt;
&lt;p&gt;So, I make an account there, and see what comes out. I started by creating some copy for this image, which I imagined having come from some old children&amp;rsquo;s book.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2016/12/06/elouise_makes_a_friend_small.png&#34;
    alt=&#34;an etching of a young girl offering handfuls of plant matter to an eight foot tall tentacle monster with big eyes&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Elouise offers flowers to a tentacle montster&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Folks&amp;hellip; Text AIs &lt;em&gt;are good&lt;/em&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/12/06/example_open_ai_copy_small.png&#34;
    alt=&#34;a screenshot of the results of my first attempt at using OpenAI for generating copy. alas, it&amp;#39;s a lot of text.&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;OpenAI text output screenshot&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;In the end I edited the &lt;a href=&#34;https://bedbathandthebeyond.com/products/elouise_makes_a_friend/&#34;&gt;Elouise Makes A Friend&lt;/a&gt; text down to this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This image from Elouise Makes a Friend is a timeless reminder of friendship and kindness. It shows Elouise bravely offering a flower to the Tentacle Monster, who in turn offers a kind smile. Whether you choose a the sleeveless top, the throw pillow, or a coffee mug, this image will comfort you and remind you of the power of friendship.&lt;/p&gt;
&lt;p&gt;Bring this touching moment from Elouise Makes a Friend into your home. Our products featuring this image are perfect for gifting to that special someone, or for yourself.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Everything required heavy editing, but that didn&amp;rsquo;t matter. It&amp;rsquo;s &lt;em&gt;radically&lt;/em&gt; easier to edit two to three paragraphs of copy than to come up with some ridiculous story that you then have to edit anyway.&lt;/p&gt;
&lt;p&gt;Over time, I got better and guiding the AI, and increasingly impressed with what it would come up with. For example, I let it create almost everything on &lt;a href=&#34;https://bedbathandthebeyond.com/about&#34;&gt;the About page&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;final-thoughts&#34;&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;Knowing then what I know now, would I do it again? 100%
It was fun. I&amp;rsquo;m ridiculously proud of it, and I genuinely want many of the products.&lt;/p&gt;
&lt;p&gt;Would I recommend it to others?&lt;/p&gt;
&lt;p&gt;Yes, but with caveats. You really need tooling to get from &amp;ldquo;I threw something on RedBubble&amp;rdquo; to &amp;ldquo;I have a site for my products&amp;rdquo;. Otherwise your brain will melt. I guess you could outsource that work, but the profit margin is so small here that that&amp;rsquo;d just put you farther in the hole.&lt;/p&gt;
&lt;p&gt;There are some existing tools on GitHub but a quick glance suggested they might be abandoned, and frankly it was faster to write ~100 lines of Raku than figure out and tweak someone else&amp;rsquo;s stuff.&lt;/p&gt;
&lt;p&gt;Also, I really need to find a prettier template. I&amp;rsquo;d hire someone to make one but there&amp;rsquo;s no way this thing is going to cover the cost of my time to make it, and I&amp;rsquo;m not currently employed (&lt;a href=&#34;https://masukomi.org/resume/kay_rhodes_resume.html&#34;&gt;hire me!&lt;/a&gt;) so that&amp;rsquo;s not going to happen.&lt;/p&gt;
&lt;p&gt;Will I add to the site? Almost guaranteed. You can &lt;a href=&#34;https://corporaterunaways.social/@bedbathandthebeyond&#34;&gt;Follow Bed Bath &amp;amp; The Beyond on Mastodon&lt;/a&gt; to see the latest items as I add them.&lt;/p&gt;
&lt;h3 id=&#34;will-i-share-my-code&#34;&gt;Will I share my code?&lt;/h3&gt;
&lt;p&gt;Maybe? It&amp;rsquo;s kinda crap, and could use a &lt;em&gt;lot&lt;/em&gt; of refinement, and frankly not many folks have realized the joys of Raku yet so it&amp;rsquo;s probably not in a language you want to poke anyways.&lt;/p&gt;
&lt;h3 id=&#34;what-s-my-favorite&#34;&gt;What&amp;rsquo;s my favorite?&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://bedbathandthebeyond.com/products/lovecraft_and_octopus/&#34;&gt;Lovecraft &amp;amp; The Octopus&lt;/a&gt;. Something about this just tickles my funny-bone. Also it looks unreasonably good &lt;a href=&#34;https://www.redbubble.com/shop/ap/133923215?ref=studio-promote&#34;&gt;on everything I put it on&lt;/a&gt;. I can not explain it. Like, how can you not want &lt;a href=&#34;https://www.redbubble.com/shop/ap/133923215?ref=studio-promote&#34;&gt;this ridiculous clock&lt;/a&gt;?&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/12/06/lovecraft_and_octopus_clock.jpg&#34;
    alt=&#34;a woodcut of lovecraft looking slightly confused with a bug-eyed tentacle monster behind him. it is on a clock and the arms are coming out of lovecraft&amp;#39;s forehead.&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;a clock with an image of lovecraft and a giant octopus thing behind him&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;so-many-images&#34;&gt;So Many Images&lt;/h2&gt;
&lt;p&gt;Working With AI Image generators is like herding cats. This is, honestly, a surprisingly small number of images to get 13 usable products. See &lt;a href=&#34;https://weblog.masukomi.org/2022/11/30/a-journey-with-midjourney/&#34;&gt;A Journey With Midjourney&lt;/a&gt; if you&amp;rsquo;re curious about the process.&lt;/p&gt;
&lt;p&gt;Some of these are good, but I haven&amp;rsquo;t gotten around to incorporating in the site yet. A handful of these are pixelated, because I&amp;rsquo;ve got another blog post idea involving them&amp;hellip; maybe more t-shirts. ;)&lt;/p&gt;
&lt;p&gt;Holler if there&amp;rsquo;s anything there that isn&amp;rsquo;t on the site, that you&amp;rsquo;d actually buy. I&amp;rsquo;ll add a page for it. I&amp;rsquo;m &lt;a href=&#34;https://connectified.com/@masukomi/&#34;&gt;@masukomi@connectified.com&lt;/a&gt;&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/12/06/midjourney_image_stream_small.jpg&#34;
    alt=&#34;a screenshot showing a stream of many many many images that were generated in midjourney&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;midjourney image stream screenshot&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

</description>
    </item>
    
    <item>
      <title>Twitter Employees Should Take the Severance</title>
      <link>https://weblog.masukomi.org/2022/11/16/twitter-employees-should-take-the-severance/</link>
      <pubDate>Wed, 16 Nov 2022 11:21:55 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/2022/11/16/twitter-employees-should-take-the-severance/</guid>
      <description>&lt;img src=&#34;https://weblog.masukomi.org/images/2022/11/16/musk_watches_twitter_burn.png&#34; alt=&#34;/images/2022/11/16/musk_watches_twitter_burn.png&#34; title=&#34;An illustration of musk, in a lightweight blue jacket, his back to the viewer as he watches a huge fire engulf many birds&#34;/&gt;
&lt;p&gt;
Musk has &lt;a href=&#34;https://www.washingtonpost.com/technology/2022/11/16/musk-twitter-email-ultimatum-termination/&#34;&gt;given the remaining employees an ultimatu&lt;/a&gt;m: come back to the office, sign up for &amp;#39;hardcore&amp;#39; work, or take 3 months severance and get out.&lt;/p&gt;
&lt;p&gt;
Acknowledging that there are some people who can&amp;#39;t really say &amp;#34;no&amp;#34; because of visa issues, or other complicated home situations….&lt;/p&gt;
&lt;p&gt;
Aside from them, who would say &amp;#34;Yes! Sign me up for &amp;#39;hardcore&amp;#39; working hours…&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;for a boss who regularly fires people who politely correct his lies about your work,&lt;/li&gt;
&lt;li&gt;in a place where morale is going to be &amp;#34;in the shitter&amp;#34; for &lt;em&gt;a very long time&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;in a place where incredibly important sections of the staff have been fired&lt;/li&gt;
&lt;li&gt;in a place where you can&amp;#39;t trust the boss&amp;#39;s claims from day to day&lt;/li&gt;
&lt;li&gt;where 40hrs probably won&amp;#39;t be enough. It&amp;#39;s not &amp;#39;hardcore&amp;#39;&lt;/li&gt;
&lt;li&gt;where all protections have been removed for communities who need them&lt;/li&gt;
&lt;li&gt;where the boss fired &lt;em&gt;the Ethical AI team&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;where the boss is anti-trans, and racist&lt;/li&gt;
&lt;li&gt;where there&amp;#39;s no hope of a stock pay-out&lt;/li&gt;
&lt;li&gt;where daring to take time for mental health, or sickness, or caring for a loved one, will most likely be seen as &amp;#34;not being a team player&amp;#34;&lt;/li&gt;
&lt;li&gt;where you have to come into the office even though the boss doesn&amp;#39;t&lt;/li&gt;
&lt;li&gt;where the boss is &lt;em&gt;actively&lt;/em&gt; running the company into the ground faster than anyone believed possible&lt;/li&gt;
&lt;li&gt;where the boss has already explicitly said they might just go bankrupt&lt;/li&gt;
&lt;li&gt;where the boss has scared off all of next year&amp;#39;s pre-booked advertisers (~15% of income)&lt;/li&gt;
&lt;li&gt;where the boss has explicitly said it might go bankrupt.&lt;/li&gt;
&lt;li&gt;where the interest on debt was unaffordable before the acquisition and now is radically worse&lt;/li&gt;
&lt;li&gt;where the company is likely to have &lt;a href=&#34;https://techcrunch.com/2022/11/14/is-elon-musks-twitter-about-to-fall-out-of-the-gdprs-one-stop-shop/&#34;&gt;millions of dollars in fines&lt;/a&gt; for violating EU regulations&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Twitter Employees: You&amp;#39;re smarter than that. &lt;em&gt;TAKE THE MONEY AND RUN&lt;/em&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>A Rebuttal to Scaling Mastodon is Impossible</title>
      <link>https://weblog.masukomi.org/2022/11/14/a-rebuttal-to-scaling-mastodon-is-impossible/</link>
      <pubDate>Mon, 14 Nov 2022 10:28:47 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/2022/11/14/a-rebuttal-to-scaling-mastodon-is-impossible/</guid>
      <description>&lt;p&gt;
&lt;a href=&#34;https://lucumr.pocoo.org/about/&#34;&gt;Armin Ronacher&lt;/a&gt; wrote that &lt;a href=&#34;https://lucumr.pocoo.org/2022/11/14/scaling-mastodon/&#34;&gt;Scaling Mastodon is Impossible&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
I&amp;#39;d like to offer a rebuttal. As someone who&amp;#39;s been doing professional web development since 1995, with &lt;em&gt;most&lt;/em&gt; of that time being spent in Rails jobs, or doing Rails work on the sidelines, I think i have a pretty good perspective on the situation. For those who don&amp;#39;t know, Mastodon is written in Ruby on Rails.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Decentralization promotes an utopian view of the world that I belief fails to address actual real problems in practice.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
Email. E. Fucking. Mail.&lt;/p&gt;
&lt;p&gt;
Email serves a very real problem. It has been decentralized (federated) since the start, and most people would agree that the following are all important features of email, even if they don&amp;#39;t personally take advantage of them&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;being able to have an email address at your domain / your company&amp;#39;s domain.&lt;/li&gt;
&lt;li&gt;being able to have email that isn&amp;#39;t being mined by a company to show you advertisements&lt;/li&gt;
&lt;li&gt;being able to add as many accounts as you want without having to pay more or register more&lt;/li&gt;
&lt;li&gt;being able to create aliases for your email address&lt;/li&gt;
&lt;li&gt;being able to create &amp;#34;catch-all&amp;#34; email addresses. E.g. &amp;lt;anything&amp;gt;@example.com&lt;/li&gt;
&lt;li&gt;not having to pay arbitrary additional fees for storage, or anything else, because some company decided to make more money off of you.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Decentralization makes all of these possible.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Yet on that decentralization wave a lot of projects are riding from crypto-currencies [1], defi or things such as Mastodon. All of these things have one thing in common: distrust. Some movements come from the distrust of governments or taxation, others come from the distrust of central services.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
I think that&amp;#39;s a significant misunderstanding of why Mastodon exists. Mastodon&amp;#39;s early days were supported by the work, and participation of lots of marginalized people (mostly queer folk of various flavors). You wouldn&amp;#39;t be &lt;em&gt;wrong&lt;/em&gt; to say that it was created because of &amp;#34;distrust&amp;#34;, but if so you&amp;#39;d be arguing that it was a distrust of the centralized platforms ability, or their unwillingness to protect marginalized communities, which is completely true.&lt;/p&gt;
&lt;p&gt;
Mastodon servers are a collection of communities, we do what &lt;em&gt;no&lt;/em&gt; centralized system can do. We protect ourselves. There are simple too many bad actors in the world for &lt;em&gt;any&lt;/em&gt; centralized server to moderate them effectively. On top of that you have the differences in &amp;#34;acceptable&amp;#34; between different social groups. No single corporate / non-profit / human entity can possibly hope to fairly enforce &lt;em&gt;all&lt;/em&gt; acceptable social practices across all social groups.&lt;/p&gt;
&lt;p&gt;
Even if they could, it&amp;#39;s a brutal job that decimates the mental health of the folks that have to do it every day. I&amp;#39;ve never heard of a case where Twitter, or Facebook has actually worked to protect them or compensate for the horrible things they&amp;#39;re forced to see.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In my mind the discussion about centralization and decentralization completely misses the point of the intended outcomes. Centralization or decentralization should really be an implementation detail of the solution to an actual problem.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
Agreed. There&amp;#39;s way too much &amp;#34;it&amp;#39;s federated&amp;#34; talk when convincing people to join Mastodon. The &amp;#34;federation&amp;#34; part is not only something your average person doesn&amp;#39;t understand, but also something they don&amp;#39;t care about. Average users don&amp;#39;t care that email is federated. I&amp;#39;ve been using it for decades and I&amp;#39;ve never seen an email host promote the fact that it&amp;#39;s &amp;#34;federated&amp;#34; as a reason to use it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What are we trying to solve?&lt;/p&gt;
&lt;p&gt;
Let&amp;#39;s ignore Twitter for a second and let&amp;#39;s talk about software engineering. Specifically dependency management. I think dependency management is an interesting proxy for the problem here and there are some lessons to be learned from it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
Wait. What?!&lt;/p&gt;
&lt;p&gt;
&lt;a href=&#34;https://dockyard.com/blog/2021/01/08/how-to-choose-the-right-software-dependencies&#34;&gt;I&amp;#39;ve thought long and hard about dependency&lt;/a&gt; but uh… I&amp;#39;m not seeing this connection.&lt;/p&gt;
&lt;p&gt;
The first concrete point they seem to make is this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;…as time went on, a lot of these packages [people depended on] went away because the hosts they were hosted on shut down. So the first cracks that showed up just was an effect of things ageing. People walk away of projects, in some cases die and with that, their server bills go unpaid and domains eventually lapse. Some companies also go out of business. SourceForge did not really ever die, but they had financial challenges and made their hosting page ever more hostile for the installers to give access to the uploaded tarballs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
Sounds like a strong argument against centralization, and a good argument for taking personal control of the things that you rely on, and are important to you. Or, to put it another way, don&amp;#39;t rely on others when it&amp;#39;s something you care about. A centralized system is not something you control, so if this is important to you, you can&amp;#39;t rely on centralized systems.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The second thing that became apparent over time was also that decentralized services came with a lot of security risks. Every one of those hosts allowed the re-publishing of already existing packages. Domains that lapsed could be re-registered by other people and new packages could be placed there.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
Have you heard of a centralized system that &lt;em&gt;hasn&amp;#39;t&lt;/em&gt; had a security issue? Have you heard of a centralized system where someone&amp;#39;s account wasn&amp;#39;t stolen? Either hacked, or given away by the company because they believed someone else deserved it more or had a better claim to it.&lt;/p&gt;
&lt;p&gt;
Most of the major centralized platforms have had issues with certificates expiring, or forgetting to renew some domain. So… I&amp;#39;m not sure how this is relevant to the discussion. &lt;em&gt;Everyone&lt;/em&gt; is provably bad at this. When a centralized system screws it up it affects millions. If I screw it up on my Mastodon server 8 users are affected.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Obviously there are nuances here and it&amp;#39;s clear that central services come with risks, but so do decentralized services and they don&amp;#39;t have clear upsides.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
Clear upsides:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;you control your destiny&lt;/li&gt;
&lt;li&gt;you account doesn&amp;#39;t exist at the whims of an algorithm&lt;/li&gt;
&lt;li&gt;you can protect your friends&lt;/li&gt;
&lt;li&gt;you don&amp;#39;t have to do anything if some company goes out of business&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;if your dependencies suddenly come with requirements / expectations that you don&amp;#39;t agree with you can change them.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the case of Twitter (for example) you don&amp;#39;t have to worry about terms of service that are 10 meters long, read by no-one, bind you to things you don&amp;#39;t agree to, and change regularly.&lt;/li&gt;
&lt;li&gt;In the case of open source libraries changing their license, you can either &lt;em&gt;not upgrade,&lt;/em&gt; or switch to a different package, or fork it and maintain the old license.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;On decentralized systems in particular I encourage you to read &lt;a href=&#34;https://moxie.org/2022/01/07/web3-first-impressions.html&#34;&gt;Moxie&amp;#39;s take on web3&lt;/a&gt; which outlines the challenges of this much better than I ever could. In particular it makes two very important points, namely that people don&amp;#39;t like self hosting (at scale) and that it&amp;#39;s easier to move platforms than (decentralized) protocols.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
Yes, people don&amp;#39;t like self hosting. Yes, it&amp;#39;s easier to move platforms than to invent and implement a new protocol. Neither of these are relevant. They&amp;#39;re straw-man arguments.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The vast, &lt;em&gt;vast&lt;/em&gt; majority of people participating in the Fediverse aren&amp;#39;t self-hosting.&lt;/li&gt;
&lt;li&gt;No-one &lt;em&gt;needs&lt;/em&gt; to invent and implement a protocol. It&amp;#39;s already been done.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;There is also a proxy war going on about freedom of speech and expression and the desire to create safe spaces.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
Sure. That&amp;#39;s happening everywhere. However, the centralized platforms fail at both. They can&amp;#39;t have true free speech because it is &lt;em&gt;fucking dangerous,&lt;/em&gt; and their advertisers don&amp;#39;t want to spend there money in a place that is supporting Nazis. They have utterly failed at creating safe spaces for anyone&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;So really before we talk about centralization and decentralization, I think we actually need to understand what we want to accomplish. And really I think this is where we likely already disagree tremendously. Mastodon encourages not just decentralization, but federation. You can pick your own mastodon server but you can also communicate with people on other instances. I will make the point that this is the root of the issue here.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
I failed to see what exactly he was ultimately saying was the root problem but…&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I have been using this for a few weeks now in different ways and it&amp;#39;s pretty clear that this thing is incredibly brittle. The ActivityPub is a pretty messy protocol, and it also appears to not have been written with scalability in mind much. The thing does not scale to the number of users it currently has and there is probably no trivial way to fix it up.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
The protocol is, provably, scaling just fine. The thing that&amp;#39;s failing to scale is the Mastodon server implementation. It&amp;#39;s written in Rails which has a horizontal scaling strategy (throw more servers at it) and depends on Sidekiq for background processing of messages which is… let&amp;#39;s just say folks have differing opinions of its ability to scale, but regardless of what you think about that, there are other options for managing message queues that have existed for decades, and are provably more efficient and scale amazingly well. Scaling servers horizontally is something that requires significant sysadmin know-how.&lt;/p&gt;
&lt;p&gt;
On top of this is the fact that &lt;em&gt;literally every&lt;/em&gt; social networking server for the Fediverse (Mastodon, Pleroma, etc) are &lt;em&gt;all&lt;/em&gt; designed for &amp;#34;communities&amp;#34;. A server of tens, or hundreds of thousands of users is &lt;em&gt;not&lt;/em&gt; a community. This &lt;em&gt;greatly&lt;/em&gt; exceeds &lt;a href=&#34;https://en.wikipedia.org/wiki/Dunbar%27s_number&#34;&gt;Dunbar&amp;#39;s Number&lt;/a&gt; of roughly 150 individuals. It&amp;#39;s literally too large of a group for humans to maintain stable social relationships with.&lt;/p&gt;
&lt;p&gt;
So, even if we set aside the technical issues, it&amp;#39;s not good at that scale because it&amp;#39;s not &lt;em&gt;supposed&lt;/em&gt; to be good at that scale. When you start getting thousands of people who are following tens or hundreds of thousands of other people you loose the ability to moderate effectively. You can&amp;#39;t protect your community because there are too many messages coming in from too many sources. You end up needing moderation teams, and the bigger you get the more impossible the task becomes. Except it&amp;#39;s worse, because Fediverse instances are managed by volunteers not corporations. No-one&amp;#39;s being paid to validate reports of abuse, mediate disputes, or look at cruel racist bile.&lt;/p&gt;
&lt;p&gt;
Communities don&amp;#39;t scale. It&amp;#39;s a human problem not a technology problem. This doesn&amp;#39;t mean that decentralization isn&amp;#39;t a good solution to the technological problems, and this doesn&amp;#39;t mean that decentralization as a technical solution doesn&amp;#39;t scale. Email disproves this trivially. It works great, even under the ridiculous onslaught of billions of automated spam emails every day, decentralization works.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;… there is the belief that you can somehow create a coherent experience into a “whatever”. Whatever it is actually. My first mastodon instance was de-federated by accident from my current instance.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
That sucks, but it&amp;#39;s not like centralized solutions don&amp;#39;t regularly delete or suspect accounts by accident, so I&amp;#39;m not sure how it&amp;#39;s relevant to the discussion. If anything it&amp;#39;s another argument &lt;em&gt;for&lt;/em&gt; community based administration because these mistakes happen &lt;em&gt;far&lt;/em&gt; less often at the individual instance scale than it does at Google / Twitter / Facebook scale. Plus, there&amp;#39;s no &amp;#34;an algorithm decided I was bad and suspended my account&amp;#34;. It&amp;#39;s literally not a thing. Sure, it &lt;em&gt;could be&lt;/em&gt; but it isn&amp;#39;t now, and you would never have to join a server that implements that crap to participate in the Fediverse.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I moved to that instance though because many other hackers in the Open Source space did, and unlike Fosstodon it seems to allow non English content which I do care about quite a bit. (After all my life and household is multilingual and I don&amp;#39;t live in an English speaking country.) Yet that instance still defederates qoto and I&amp;#39;m guessing because qoto permits unpopular opinions and does not block servers itself.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
So first you found a community that wasn&amp;#39;t a good fit. Then you found one that was. Congratulations. Now you&amp;#39;re asserting that your old one is blocked (not actually defederated) by your current one because of unpopular opinions. This means your community is successfully enforcing its values and protecting its members. Congratulations. The ability to protect your community is a feature, not a bug. I should not be forced to see crap from people I disagree with because some company doesn&amp;#39;t have the cajones to block them because of some BS argument about &amp;#34;free speech&amp;#34;, or because they don&amp;#39;t have the human resources to investigate the BS.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Federation makes all of these questions play out chaotically and there is no consistency. My first experience of being on Mastodon was in fact that I got shitposted at by accounts on poa.st. The n-word was thrown at me within hours of signed up. Why? I&amp;#39;m not sure. So moderation is something of an issue.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
So, your experience was exactly the same as the experience many people have on Twitter. However, instead of recognizing that moderation is &lt;em&gt;always&lt;/em&gt; reactive (you moderate after someone causes problems not before) and that you had a real person you could reach out to you complain about it in a post about how Mastodon doesn&amp;#39;t scale? Many, &lt;em&gt;many&lt;/em&gt; thousands of people have reported racist behavior on Twitter and had &lt;em&gt;zero&lt;/em&gt; response from moderation. Frequently the people being attacked  are the ones who get their accounts suspended because of false reports. This doesn&amp;#39;t happen on Mastodon. The admin is a real person who cares about their community and just blocks the offenders, or if there are too many of them, blocks their entire servers.&lt;/p&gt;
&lt;p&gt;
The abuse you suffered will &lt;em&gt;always&lt;/em&gt; exist because anonymity, and pseudo-anonymity beget abusive behavior. It&amp;#39;s a human problem. In a decentralized system like Mastodon there&amp;#39;s a real person who&amp;#39;s volunteered to help protect the people in their community from stuff like that. In centralized systems, you&amp;#39;re typically screwed.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We clearly won&amp;#39;t come to an agreement across all of mastodon about what acceptable behavior is, and there is no central entity controlling it. It will always be a messy process. I guess this is something that Mastodon will have to learn living with, even though I can&amp;#39;t imagine what that means.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
Sure, but it&amp;#39;s not something &amp;#34;Mastodon&amp;#34; will have to learn to live with. It&amp;#39;s something &lt;em&gt;humans&lt;/em&gt; will have to learn to live with, if they want to participate in online communities. It&amp;#39;s no different in a centralized vs decentralized system either. The only thing that changes is how much power a community has to protect itself.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Unlike Twitter which was a public company with a certain level of responsibility and accountability, Mastodon is messy legally speaking as well. It&amp;#39;s not above the law, even if it maybe wants to be, and instances will have to follow the laws of the countries they are embedded in. We already know how messy this is even for centralized services. But at least those enterprises were large enough to pay lawyers and figures this out in courts.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
So. In a centralized system when their shirk their responsibility they can bury you with a horde of expensive and talented lawyers who will make you go broke or go away. In a distributed system there are individual humans responsible for the servers who can be held accountable and generally don&amp;#39;t have the resources to bury you in legal fees. So, again, a strong argument for decentralized solutions. Also, a strong argument for communities that can actually police themselves as opposed to crossing your fingers and hoping BigCo will do it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For large mastodon instances this might turn into a problem, and for small instances the legal risk of hosting the wrong thing might be completely overwhelming. I used to host a pastebin for a few years. It was Open Source and with that others also hosted it. I had to shut it down after it became (by a small percentage of users) used to host illegal content. In some cases links to very, very illegal content. Even today I still receive emails from users who beg me to take down pastes of that software from other domains, because people use it to host doxxed content. I really hard a hard few weeks when I first discovered what my software ended up being used for.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
This is again, an argument against centralized systems. It&amp;#39;s also an argument against large Fediverse instances too. The problem is (pseudo)anonymity, not decentralization or centralization. Companies like Twitter &amp;amp; Facebook &amp;amp; Google can&amp;#39;t keep up with the volume of illegal content they host. A small community can. Also, don&amp;#39;t allow anonymous people to use your resources if you&amp;#39;re not willing to let them do bad things with it. Mastodon servers don&amp;#39;t have to be wide open to the public. If you do open yours to the public you can put very strict rules on participation and you can easily limit the number of incoming people. You can require approval, or you can simply turn off self-signup when the number of folks goes beyond your ability to manage.&lt;/p&gt;
&lt;p&gt;
If you look at a mastodon server as a community (as designed) then you can easily keep an eye on the new folks, and their behavior, and kill their accounts if they violate your community&amp;#39;s rules.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;… then there is also the issue of what happens if someone popular joins the instance.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
That&amp;#39;s a symptom. Not a problem. Someone famous joining your instance unexpectedly is a &lt;em&gt;symptom&lt;/em&gt; of you not managing your community or regulating sign-ups. If you want to have an open server that&amp;#39;s fine, but you need to recognize that &lt;em&gt;if&lt;/em&gt; you &lt;em&gt;choose that&lt;/em&gt; (it&amp;#39;s an active choice not a passive one) then you are opening yourself up to that option.&lt;/p&gt;
&lt;p&gt;
You can, of course, balance this by saying &amp;#34;hey, my server is open, but if you have millions of followers I will ask you to pay for some of the server costs, or I will boot you&amp;#34; Folks with millions of follows can, generally, afford the cheap monthly fee to get their own damn server anyway.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Imagine you&amp;#39;re a rather small server and suddenly Eli Lilly and Company joins your instance. Today they have around 140K followers on Twitter and they are a publicly traded company. First of all with an account that large, every one of their posts will cause a lot of load on your infrastructure. Secondly though, they are a very interesting target to attack.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
In order to do this i have to&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Imagine I decided to allow corporate accounts on my server.
Why, the fuck, would i do that?!&lt;/li&gt;
&lt;li&gt;Imagine corporate accounts with over a hundred thousand followers would want to join a random server instead of just setting up their own (trivially easy to do, doesn&amp;#39;t require IT skills).&lt;/li&gt;
&lt;li&gt;Imagine I wouldn&amp;#39;t ask them to foot the bill for the additional resources they were using&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So yes, if I imagine a series of highly improbably decisions 2/3&amp;#39;s of which would be me choosing to invite or accept harm, I could find myself in a &amp;#34;bad&amp;#34; situation.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;But you don&amp;#39;t even need to be that popular to be worried about what your instance is like. People put a lot of trust into Twitter accounts over the years. I had plenty of exchanges over private DMs with people which I really would not want to be public. Yet how do I know that my instance operator does not really like to secretly read my communication?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
You know this can, and does, happen on the centralized systems too, right?&lt;/p&gt;
&lt;p&gt;
C.O.M.M.U.N.I.T.Y I don&amp;#39;t know how many times I&amp;#39;m going to have to say this. A mastodon instance is a community. If you don&amp;#39;t trust that community don&amp;#39;t join it. Do i trust the thousands of Twitter employees to not to ever read DMs? No. Fuck no. Do I trust a community of people organized around principles I agree with? Probably.&lt;/p&gt;
&lt;p&gt;
Also, this is a fucking straw man argument. &lt;em&gt;Don&amp;#39;t say things in DMs that are sensitive and secret&lt;/em&gt;. At least Mastodon has the decency to warn you every time that your DMs aren&amp;#39;t encrypted. Seriously though, why, the fuck, would an admin want to spend their time trolling around in the DMs? Maybe if you&amp;#39;re on a server filled with trolls who get their jollies off of being mean to other people. If, on the other hand, you&amp;#39;re a trans woman who&amp;#39;s joined a server that&amp;#39;s all about protecting and supporting trans people… odds are that they&amp;#39;re not going to look at your private stuff.&lt;/p&gt;
&lt;p&gt;
On top of this. Mastodon has no interface to do this. You have to directly muck about with the database. A massive portion of Mastodon instances are hosted on servers run by &lt;a href=&#34;https://masto.host&#34;&gt;masto.host&lt;/a&gt;, and you know that they don&amp;#39;t offer? Direct database access. I couldn&amp;#39;t read my members DMs if I wanted to. I guess I could ask for a copy of my backup and then point a database tool at whatever he sent me but… This is a bullshit argument.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Do I know if my instance operator could even keep the communication private in the light of hackers?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
Again with the straw-man arguments. Twitter can&amp;#39;t. Facebook can&amp;#39;t. Google can&amp;#39;t. The whole point of a hacker is to steal secret information, and there&amp;#39;s no such thing as an unhackable system. So no, a Mastodon admin can&amp;#39;t but neither can anyone else.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I&amp;#39;m sure over the years thousands of credit card numbers, token access credentials or passwords were exchanged in Twitter DMs. Imagine what a juicy target that would be on Mastodon servers.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
This is, yet another, argument for decentralized servers. Hacking Twitter gets you millions of accounts. Hacking my Mastodon server gets you 8. Exchanging illegal information in DMs has nothing to do with if your server&amp;#39;s been hacked or not.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Mastodon is getting some traction today, but Mastodon is around for a long time. And with that, may of the problems it had over the years are still unresolved.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
Like Facebook, and Twitter, and Google, and everyone else.&lt;/p&gt;
&lt;p&gt;
He provides a bunch of examples that I&amp;#39;ve already addressed but…&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Or that the most controversial and replied to issue is about optionally disabling replies to posts like on Twitter.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
Twitter has refused to give abuse moderation tools to people without the verification for years. They also regularly refuse to give people who are targets of abuse verification. I&amp;#39;m intentionally ignoring the $8 verification WTF that is currently going on. So again, straw-man argument.&lt;/p&gt;
&lt;p&gt;
Don&amp;#39;t use Mastodon if you don&amp;#39;t like Mastodon&amp;#39;s features. There are other Fediverse servers out there with different moderation options. If you don&amp;#39;t like what features a Centralized system offers you you&amp;#39;re screwed. If you don&amp;#39;t like what features your Fediverse server offers, &lt;em&gt;you can choose another one and still participate&lt;/em&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Or that there are popular forks of Mastodon with different goals than Mastodon who can&amp;#39;t get their changes merged back.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
Why do you think they &lt;em&gt;should&lt;/em&gt;?! That implies that Mastodon developers should have to accept whatever random features some other group of people thinks are good? Should Twitter and Facebook do whatever random suggestions other people like? There are millions of folks in the US who believe we should remove the separation of Church and State. Should we do that?&lt;/p&gt;
&lt;p&gt;
No-one should be forced to make &lt;em&gt;their&lt;/em&gt; software have whatever features other people want. This is &lt;em&gt;especially&lt;/em&gt; true when the forks / competitors with the features you want &lt;em&gt;exist and can be used&lt;/em&gt;. Jesus fuck-me. For example, &lt;a href=&#34;https://github.com/hometown-fork/hometown#readme&#34;&gt;Hometown&lt;/a&gt; is a great fork that has a wonderful feature of letting people message only other people on their server. Mastodon isn&amp;#39;t interested in that feature. That&amp;#39;s fine. If that feature is important to you &lt;em&gt;join or start a Hometown server&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;This is one of the most important reasons why decentralized is better.&lt;/em&gt; You can still participate even if you don&amp;#39;t agree with the way one piece of software on the network works. You can choose the features you want. If you want to be on a server with better moderation features. &lt;em&gt;You can&lt;/em&gt;. There&amp;#39;s literally nothing stopping you. You want to be on a server with better human moderators? You can.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;To be honest, code is simple in comparison, but actually making Mastodon scale technically too will require changes if it wants to absorb some of the larger users on Twitter.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
Sure. Step one. Use Pleroma. It handles vastly more connections for any given quantity of server resources. It&amp;#39;s built on the Erlang Virtual Machine which was developed to handle digital switching of phone calls. However… the better solution is &lt;em&gt;don&amp;#39;t make huge instances&lt;/em&gt;. You can&amp;#39;t have a huge community. You can&amp;#39;t protect a huge community. You can&amp;#39;t &lt;em&gt;please&lt;/em&gt; a huge community.&lt;/p&gt;
&lt;p&gt;
The problem isn&amp;#39;t a technological one. It&amp;#39;s the human decisions that are the problem. You talk about back-pressure, but if your system is being overloaded because Bob decided to make a bot that follows ten million accounts, or Mary has ten million followers then boot them or ask them to pay. This isn&amp;#39;t hard, and there are already solutions available that&amp;#39;ll let Mary have a relatively cheap instance that can handle her ten million followers.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In my mind a better alternative to these two extremes of Twitter and Mastodon would be to find a middle ground. A service like Twitter is much cheaper and easier to run if it does not have to deal with federation on a technical level. An Open Source implementation of Twitter that is significantly cheaper to run than a Mastodon host that can scale to larger user numbers should be possible.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
An open source version of twitter that scales either has to be federated OR you&amp;#39;re building a twitter competitor, and trying to encourage millions of people to join your new network. The latter is arguably brain damaged. The former already exists. Mastodon is an open source twitter clone. Pleroma is an open source Twitter clone that scales really effing well.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ideally at least some of these communities would try to be run like non profit foundations, then maybe they have a chance of hanging around.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
You mean, the way many mastodon instances are already run?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A “Not Twitter Foundation” that runs an installation of an Open Source implementation of a scalable micro blogging platform is very appealing to me&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
It makes no sense to simultaneously bitch about Mastodon not accepting features some community members want them to have &lt;em&gt;and&lt;/em&gt; say you want some centralized platform that&amp;#39;s guaranteed to not accept features some community members want. You&amp;#39;re also complaining about not having the features you want.&lt;/p&gt;
&lt;p&gt;
These aren&amp;#39;t compatible ideas. Either you want access to the features you want (distributed system which offers choice) OR you want to let someone else decide what&amp;#39;s acceptable and &amp;#34;good&amp;#34; for you.&lt;/p&gt;
&lt;p&gt;
You either want to be part of a community that can protect itself, or you want to cross your fingers and hope that some central organization will accomplish a task that&amp;#39;s literally impossible due to issues of scale.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;And then let the market figure out if that foundation does a good job at running it, and if not someone else will replace it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
Do &lt;em&gt;not&lt;/em&gt; fucking bring capitalism into this discussion. That&amp;#39;s what got us in this mess in the first place.&lt;/p&gt;
&lt;p&gt;
The Fediverse scales just fine. It&amp;#39;s not &lt;em&gt;supposed&lt;/em&gt; to be a collection of massive servers. It&amp;#39;s supposed to be a collection of communities. The tool isn&amp;#39;t broken if its user misuses, or misunderstands it.&lt;/p&gt;
&lt;p&gt;
Here&amp;#39;s a practical example. Check out &lt;a href=&#34;https://bonfirenetworks.org/&#34;&gt;Bonfire&lt;/a&gt;. It&amp;#39;s a Fediverse server option and literally all of their features are about answering the question of &amp;#34;&lt;em&gt;What does this community want&amp;#34;&lt;/em&gt;?/ I can&amp;#39;t comment if the software is any good, but it&amp;#39;s a great example of how Fediverse servers are all about supporting the needs of &amp;#34;a community&amp;#34; not &lt;em&gt;the whole fucking internet&lt;/em&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>A Journey With Midjourney</title>
      <link>https://weblog.masukomi.org/2022/11/03/a-journey-with-midjourney/</link>
      <pubDate>Thu, 03 Nov 2022 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2022/11/03/a-journey-with-midjourney/</guid>
      <description>&lt;h2 id=&#34;exploring-an-idea-with-midjourney&#34;&gt;Exploring an Idea With Midjourney&lt;/h2&gt;
&lt;p&gt;I haven&amp;rsquo;t seen anyone talk about what it&amp;rsquo;s like to try and work with &lt;a href=&#34;https://midjourney.com/&#34;&gt;Midjourney&lt;/a&gt;, or any of the other Image AIs. No-one has shown just how much work it takes to get from an idea, to the beautiful output we keep seeing.&lt;/p&gt;
&lt;p&gt;This post will take you through the journey, from a spark of colorful and strong Native American imagery, depressed cyborgs, to visions of Muslim women, in a dry and trying future.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll explain my thoughts along the way, and how I crossed notable thresholds in the process.&lt;/p&gt;
&lt;h3 id=&#34;legal&#34;&gt;Legal&lt;/h3&gt;
&lt;p&gt;Just in case anyone gets any ideas: The images in the document are all distributed under the &lt;a href=&#34;https://creativecommons.org/licenses/by-nc-sa/3.0/&#34;&gt;Creative Commons Attribution-Non-Commercial-ShareAlike 3.0 license&lt;/a&gt;, with the exception of the first one which is copyright it&amp;rsquo;s author (moon.goat.616) and is used under Fair Use.&lt;/p&gt;
&lt;h3 id=&#34;the-spark&#34;&gt;The Spark&lt;/h3&gt;
&lt;p&gt;Yesterday I saw a truly impressive image of a Native American person in the Community Feed.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/11/30/1_native_american_small.jpg&#34;
    alt=&#34;a strong androgynous native american with dangling earrings and bright, unrelastic colors.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;This was created by user &lt;a href=&#34;https://www.midjourney.com/app/feed/707102116958961725/&#34;&gt;moon.goat.616&lt;/a&gt;. That link will only work if you&amp;rsquo;re a Midjourney subscriber.&lt;/p&gt;
&lt;p&gt;Midjourney doesn&amp;rsquo;t let you directly recreate other people&amp;rsquo;s images, but it will let you see what prompt the entered into the system to generate it. Most of the time, copy-pasting their prompt will generate absolute garbage. This is because the pretty-pretty they generated was typically the result of many iterations and tweaks.&lt;/p&gt;
&lt;p&gt;This doesn&amp;rsquo;t mean the prompt is useless. They&amp;rsquo;re incredibly useful, because you&amp;rsquo;ll discover new keywords that help guide the AI in a direction you want.&lt;/p&gt;
&lt;p&gt;Every now and then, the prompt just works&amp;hellip;&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/11/30/2_four_native_american_women_small.jpg&#34;
    alt=&#34;four images of native american woman with stern looks, painted in dramatic and unrealistic colors.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;That was, &lt;em&gt;really&lt;/em&gt; surprising. I was tempted to start working with that, but as a privileged white person I don&amp;rsquo;t feel particularly comfortable making representations of Native American women. There are so many things I can&amp;rsquo;t speak to with knowledge or authority.&lt;/p&gt;
&lt;p&gt;But the colors were &lt;em&gt;so&lt;/em&gt; amazing. &amp;ldquo;What about a depressed android in those colors?&amp;rdquo; I thought.&lt;/p&gt;
&lt;p&gt;So, extracted all the keywords, removed the stuff that pointed it towards Native American imagery (&amp;ldquo;tribal outcast&amp;rdquo;) and replaced it with &amp;ldquo;depressed android. sitting. slumped. against wall.&amp;rdquo;&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/11/30/3_first_androids_small.jpg&#34;
    alt=&#34;four images of very human looking depressed androids in bright colors&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Depressed looking? ✅&lt;/p&gt;
&lt;p&gt;Android? kindof.&lt;/p&gt;
&lt;p&gt;I was looking for less&amp;hellip; human looking things.&lt;/p&gt;
&lt;p&gt;Maybe if I try &amp;ldquo;rubot&amp;rdquo; instead of &amp;ldquo;android&amp;rdquo;&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/11/30/4_street_urchins_small.jpg&#34;
    alt=&#34;four images of colorful street urchins in bad clothes&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Shit&amp;hellip; that&amp;rsquo;s not how you spell &amp;ldquo;robot&amp;rdquo;.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/11/30/5_actual_robots_small.jpg&#34;
    alt=&#34;four semi-humanoid robots in very abstract settings there are lots of colored rectangles around them and it&amp;#39;s hard to tell what you&amp;#39;re looking at.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Interesting but&amp;hellip; really hard to parse what&amp;rsquo;s going on.&lt;/p&gt;
&lt;p&gt;Back to &amp;ldquo;cyborg&amp;rdquo;, but I added &amp;ldquo;salvage&amp;rdquo; and &amp;ldquo;junk&amp;rdquo;. After a couple iterations I got this&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/11/30/6_four_cyborg_women_small.jpg&#34;
    alt=&#34;four images of depressed cyborg women slumped against walls&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Now we&amp;rsquo;re talking!&lt;/p&gt;
&lt;p&gt;Depressed looking? ✅&lt;/p&gt;
&lt;p&gt;Cyborg? ✅&lt;/p&gt;
&lt;p&gt;A bit&amp;hellip; too human looking. I was really hoping to generate images with boxy looking robots but I&amp;rsquo;m loving the color work, and there&amp;rsquo;s something about these women. I decide to see where I can take this.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/11/30/7_depressed_cyborg_closeup_1_small.jpg&#34;
    alt=&#34;a smooth faced cyborg woman with bright orange hair and some sort of audio aparatus around her ears and the back of her head. the color is dramatic and abstract but slightly muted&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;It took about four simple iterations to get to that. There are a handful of other good images from that work too.&lt;/p&gt;
&lt;p&gt;Grand total, I&amp;rsquo;ve spent about 20 minutes. It&amp;rsquo;s at this point I finally break free from this fascinating thing and go back to my actual task. I had only opened midjourney to find an example of something to show someone on discord.&lt;/p&gt;
&lt;p&gt;&amp;hellip;&lt;/p&gt;
&lt;p&gt;That night, drained from fighting with buggy libraries and systems I decide to relax by playing around with Midjourney again.&lt;/p&gt;
&lt;p&gt;I start again with 2 tasks in mind.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I want those vibrant colors I started with. This stuff is great, but it&amp;rsquo;s muted in comparison.&lt;/li&gt;
&lt;li&gt;I want actual mechanical looking robots, not women with various doo-dads attached to them.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I start with the first task. Adding vibrancy.&lt;/p&gt;
&lt;p&gt;I add &amp;ldquo;Intense color&amp;rdquo; to the prompt (it already had &amp;ldquo;vibrant colors&amp;rdquo;). And feed it one of the good close-ups to start with.&lt;/p&gt;
&lt;p&gt;I go through four more iterations, selecting for color and face, and then I make a mistake.&lt;/p&gt;
&lt;p&gt;I decide to feed it one of the past images as input, but I choose a 4-up image instead of a single image.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/11/30/8_six_depressed_women_cyborgs_small.jpg&#34;
    alt=&#34;six depressed ladies in vibrant color against with bright cyan or orange backgrounds. it&amp;#39;s four images, but the two on the right are split into 2 image each&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Cool! Not what I want, but man, look at those left two! That&amp;rsquo;s awesome.&lt;/p&gt;
&lt;p&gt;I backtrack, and instead feed this into it as a guide.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/11/30/9_depressed_cyborg_purple_and_orange_small.jpg&#34;
    alt=&#34;a depressed looking woman in purple hues, with dramatically bright orange hair and headphones. she wears something with lots of straps has one knee up, and one leg bent under the other one&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;And now I&amp;rsquo;ve got my vibrant colors&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/11/30/10_vibrant_but_low_detail_small.jpg&#34;
    alt=&#34;four depressed women in futuristic garb, all wearing headphones, against dramatic orange and cyan backgrond that are glitchy looking squares&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Alas, if you look closely you&amp;rsquo;ll note that I&amp;rsquo;ve lost all the detail. There are two other problems.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;they don&amp;rsquo;t look like androids &lt;em&gt;at all&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;my brain is raising warning flags about the future of those boobs.&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/11/30/11_first_really_good_one_hint_of_city_small.jpg&#34;
    alt=&#34;a refined version of the woman in the bottom left of the last image. she&amp;#39;s looking more realistic and less abstract brushes of color&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;A few iterations later and the boobs are definitely a problem. I really like this image though.&lt;/p&gt;
&lt;p&gt;I should probably point out that Midjourney&amp;rsquo;s people have worked really hard to keep porn out of the system. You will almost &lt;em&gt;never&lt;/em&gt; see a nipple in Midjourney art. I believe they trained something to find and get rid of nipples in the training material before before training on it.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m pretty sure she&amp;rsquo;d have nipples if not for that.&lt;/p&gt;
&lt;p&gt;A few tweaks later on and I managed to get a version without the boob-windows in the outfit but rest of it just wasn&amp;rsquo;t as good.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll also notice that the backgrounds have started to change. They looked like they were hinting at walls, and corners, so added in &amp;ldquo;distant cityscape&amp;rdquo; and that really helped. Keep an eye on the backgrounds as we progress.&lt;/p&gt;
&lt;p&gt;There were a lot of boobs along the way so I also decide to explore what happens if i lean in to what it&amp;rsquo;s obviously trying to do. My thinking is if i try and guide it, instead of fighting it, we might get some interesting results.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re obviously far from our starting point of &amp;ldquo;robot&amp;rdquo; but I&amp;rsquo;m enjoying what&amp;rsquo;s coming out of it. So, &amp;ldquo;couture outfit&amp;rdquo; gets added to the mix. I&amp;rsquo;m thinking lots of &amp;ldquo;couture&amp;rdquo; fashion has dramatic boob things, but actually manage to cover the boobs.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/11/30/12_couture_outfits_small.jpg&#34;
    alt=&#34;four women in coture outfits with big shoulders, exposed chests, and boustiers over boobs and belly, their legs are bare and they wear boots&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;A handful of iterations on that and I realize that I got what I asked for and I really don&amp;rsquo;t want it.&lt;/p&gt;
&lt;p&gt;So, I backtrack, and keep feeding chosen pieces of output back into the system. I add in &amp;ldquo;4k. hdr.&amp;rdquo; to see if we can bring out a bit more realism.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/11/30/13_vibrant_with_cityscape_small.jpg&#34;
    alt=&#34;a depressed looking woman in blue. a vibrant read headphone purple and read hair, leaning against an abstract blue and purple wall, with hints of skyscrapers and dense city in the distance. the city is shades of blue with a vibrant orang sunset that dramatically contrasts with the blue lit woman&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;This is&amp;hellip; amazing.&lt;/p&gt;
&lt;p&gt;I love, how the city is emerging from the background, and how the blue and orange are contrasting her against the sky.&lt;/p&gt;
&lt;p&gt;Her hood gives me an idea though. Its got enough fabric that it could be a hijab that&amp;rsquo;s been let down. What if I add &amp;ldquo;Muslim&amp;rdquo; to the mix? Might that counter the boob factor too?&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/11/30/14_first_muslim_attempt_small.jpg&#34;
    alt=&#34;four women with sitting on carved or polished stone, lit in blu with bright yellow or orange cities beyond them. 3 of them have headcoverings. all of them have mechanical ear coverings. all of them have exposed boobs. some bare, some with hints of bra&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;No. No it will not.&lt;/p&gt;
&lt;p&gt;This plus future iterations I&amp;rsquo;m not going to show lead me to believe that in the future muslim women will decide to keep the hijab, but rebel against the male oppression by showing their boobs at every available opportunity.&lt;/p&gt;
&lt;p&gt;Really though, it just means that the only thing Midjourney knows about muslim women is that they have covered heads.&lt;/p&gt;
&lt;p&gt;BUT&amp;hellip; the city!&lt;/p&gt;
&lt;p&gt;Also, note that the color palate has changed. I can only assume that this is because a lot of the training material involving Muslims is from parts of the world that have a lot more desert.&lt;/p&gt;
&lt;p&gt;I eventually get one with a great head, but the boobs have become ridiculous. Like&amp;hellip; runway supermodel combined with eccentric designer stuff that&amp;hellip; just&amp;hellip; just no.&lt;/p&gt;
&lt;p&gt;So, I edited an image, cropped it to just the head, and fed that in as source material plus the prompts.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/11/30/15_headshot_only_small.jpg&#34;
    alt=&#34;a headshot of a woman with a hijab and some sort of metal disk over the area obove her ear. the hijab is purple, and there is low detail&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;My friends&amp;hellip; the algorithm wants boobs.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/11/30/16_it_wants_boobs_small.jpg&#34;
    alt=&#34;four images of women in hijabs. all have boobs, that are covered with varous materials, metal or cloth, but very very prominent.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;But&amp;hellip; I&amp;rsquo;m iterating. I&amp;rsquo;m combining. I&amp;rsquo;m tweaking&amp;hellip; I&amp;rsquo;ve replaced &amp;ldquo;depressed&amp;rdquo; with &amp;ldquo;optomistic&amp;rdquo; and it hasn&amp;rsquo;t helped much. It isn&amp;rsquo;t until a while later that I realize that it&amp;rsquo;s spelled &amp;ldquo;optimistic&amp;rdquo; and thus the bad spelling was just being ignored. Also, it&amp;rsquo;s just not a great keyword. I  didn&amp;rsquo;t want to go all the way to &amp;ldquo;smiling&amp;rdquo; or &amp;ldquo;happy&amp;rdquo;. I liked the vibe of these.&lt;/p&gt;
&lt;p&gt;I add &lt;code&gt;--no chest&lt;/code&gt; (&amp;ldquo;boob&amp;rdquo; is a restricted word) and try &amp;ldquo;metal chest plate&amp;rdquo;. The latter does nothing useful. The former helped get rid of some of the more egregious boob images.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/11/30/17_painted_desert_woman_small.jpg&#34;
    alt=&#34;a woman in a blu hijab that becomes orange around her shoulders, she wears a blow long sleeved top, with a lighter colored cloth over the boob area, they&amp;#39;re strongly hinted at but not actually shown. it is no longer obscene boob.&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;we veer a little into the Anime too&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/11/30/18_anime_hijab_girl_small.jpg&#34;
    alt=&#34;anime hijab girl with neon purple eyes. a grey blue hijab, a red left shoulder with swirly black patterning, and some interesting leather full-arm gloves. she has a bronze circular thing over her ear area&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;From here on it&amp;rsquo;s just a matter of taking generated images and feeding them back into the system with the same keywords, to &amp;ldquo;restart&amp;rdquo; the process and focus it on specific aspects. I could have started mucking with the keywords to change things but I liked the direction it was going in.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/11/30/19_plate_mail_hijab_small.jpg&#34;
    alt=&#34;a woman in plate mail armor with a red hijab and vibrant purple cheekbone highlights&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;I try to direct it more towards dark skin by using &amp;ldquo;tanned&amp;rdquo;. I try and avoid &amp;ldquo;dark skin&amp;rdquo; because it&amp;rsquo;ll quickly trend towards African look instead of middle-eastern.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/11/30/20_tanned_skin_and_white_cloth_small.jpg&#34;
    alt=&#34;tanned woman with orange hijab a metal shoulder pauldron and cloth covering her boobs which looks like real fabric instead of individually highlighted boobs&#34;&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/11/30/21_grey_blue_hijab_large_ear_thing_orang_desert_small.jpg&#34;
    alt=&#34;eyes closed, she looks she faces to the right and wears and dark blue-grey hijab with hints of color. Her arms are covered with banded material that&amp;#39;s hard to pin down. you can see the hint of a skirt over her legs that matches her hijab. there is a large, ornate metal ear covering over the hijab&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;There are a few other, nice images from this, but this journey has taken four and a half hours of work, and the generation of at least a hundred images. I need some sleep.&lt;/p&gt;
&lt;h3 id=&#34;things-of-note&#34;&gt;Things of note&lt;/h3&gt;
&lt;h4 id=&#34;photorealism&#34;&gt;Photorealism&lt;/h4&gt;
&lt;p&gt;It should be noted that with the exception of the first two images none of these are even remotely photo-realistic.&lt;/p&gt;
&lt;p&gt;This is pretty normal in my experience. Getting something that looks &amp;ldquo;real&amp;rdquo; seems to be largely a question of how much content already exists in the world that involves that stuff, and looks real when it goes into the training system.&lt;/p&gt;
&lt;p&gt;Note that we went from painterly, but very close to photo, to something almost impressionist in one step, and never really came back.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m confident that it&amp;rsquo;s possible to push this series towards photorealism, but that wasn&amp;rsquo;t my goal. It&amp;rsquo;d also take a lot of work.&lt;/p&gt;
&lt;h4 id=&#34;hands&#34;&gt;Hands&lt;/h4&gt;
&lt;p&gt;The hands are&amp;hellip; problematic. The hands are problematic in &lt;em&gt;all&lt;/em&gt; the image AIs. If you see normal looking hands in an AI generated image it either means the person edited the image, or they were exceptionally lucky.&lt;/p&gt;
&lt;p&gt;There were a lot of images along the way with floppy spaghetti arms, detached hands, and forty-gajillion fingers.&lt;/p&gt;
&lt;h4 id=&#34;creativity&#34;&gt;Creativity&lt;/h4&gt;
&lt;p&gt;I&amp;rsquo;ve heard a lot of comments that implied that creating images with AI was just a matter of creative problem solving around choosing words to use in prompts. Anyone who has used these systems knows that isn&amp;rsquo;t true. The creation of these images wasn&amp;rsquo;t a matter of me constantly tweaking and perfecting a set of words. The words at the start and the words at the end barely changed. I didn&amp;rsquo;t leave out any notable changes in the prompt, and the changes I did make were very minor.&lt;/p&gt;
&lt;p&gt;Working with an AI is a more a matter of trying things until you find a style you like, and then encouraging it to go in a direction. It&amp;rsquo;s like working with a river. You can&amp;rsquo;t &lt;em&gt;really&lt;/em&gt; control it, but you can encourage it to help you achieve a goal.&lt;/p&gt;
&lt;p&gt;Sculpting marble is literally &amp;ldquo;just&amp;rdquo; a matter of choosing what pieces to cut off of the block. It&amp;rsquo;s &amp;ldquo;just&amp;rdquo; a piece of &amp;ldquo;creative problem solving&amp;rdquo;. You don&amp;rsquo;t &lt;em&gt;need&lt;/em&gt; to be creative. You don&amp;rsquo;t &lt;em&gt;need&lt;/em&gt; to be an artist. You just need to choose what pieces to remove.&lt;/p&gt;
&lt;p&gt;If you believe that, then well&amp;hellip; I hope you at least enjoyed the pictures.&lt;/p&gt;
&lt;p&gt;Welcome to a new, and amazing, tool for artists.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Private Comments &amp; Your Security</title>
      <link>https://weblog.masukomi.org/posts/private-comments-and-your-security/</link>
      <pubDate>Sun, 23 Oct 2022 00:01:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/posts/private-comments-and-your-security/</guid>
      <description>&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;
&lt;p&gt;While leaving &amp;ldquo;private comments&amp;rdquo; on a repo can be incredibly useful, it can get
you into trouble if the wrong person sees them and disagrees with what they see.
This post goes into the problems, consequences, and things that tools that
provide this functionality need to do to protect their users from accidental
harm.&lt;/p&gt;
&lt;h2 id=&#34;some-context&#34;&gt;Some Context&lt;/h2&gt;
&lt;p&gt;A while ago I wrote a tool called &amp;ldquo;&lt;a href=&#34;https://github.com/masukomi/private_comments#readme&#34;&gt;Private Comments&lt;/a&gt;&amp;rdquo;, which allows you to leave
&amp;ldquo;private comments&amp;rdquo; on a codebase that aren&amp;rsquo;t actually &lt;em&gt;in&lt;/em&gt; the codebase. Imagine
leaving little &amp;ldquo;breadcrumbs&amp;rdquo; for the future you that are actually attached to
the relevant lines of code, and go away when that code changes, but reappear if
you need to look at the relevant past version of it. It can be used for you, or
shared with your team.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s Private Comments. It&amp;rsquo;s a teeny little server that runs on your computer,
takes up almost no memory (~7Mb) and essentially no CPU (~0.0% at idle), and a
plugin in your favorite editor&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; talks to it and records or shows comments
when appropriate.&lt;/p&gt;
&lt;p&gt;&lt;a id=&#34;figure--Private Comments Animated Demo Gif&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/10/22/private_comments_demo.gif&#34;&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;sensitive-content&#34;&gt;Sensitive Content&lt;/h2&gt;
&lt;p&gt;There are two types of sensitive data in Private Comments.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The content you write.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;This could be sensitive in the sense that it contains comments that, if
exposed publicly, would violate your NDA. For example, leaving a comment
which summarized how a sensitive process works.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This could &lt;em&gt;also&lt;/em&gt; be sensitive in the sense that when you give someone a
blank notebook labeled &amp;ldquo;Private&amp;rdquo; and tell them they can write anything in
it without others seeing, it&amp;rsquo;s just a matter of time before they write
something that others would take offense to.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Metadata about the repo and its files the name of the repo, and the path to
the file you&amp;rsquo;re commenting on could be incredibly valuable to hackers. As
such, Private Comments goes out of its way to never store this information.
So, we can mostly ignore this problem.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;consequences&#34;&gt;Consequences&lt;/h2&gt;
&lt;p&gt;Focusing in on the content you write:&lt;/p&gt;
&lt;p&gt;1.a. is pretty easy to address. Just don&amp;rsquo;t store your comments anywhere that
violates your company&amp;rsquo;s security policies. It doesn&amp;rsquo;t matter who sees it,
because all the people who &lt;em&gt;can&lt;/em&gt; see it have signed the same NDA as you.&lt;/p&gt;
&lt;p&gt;1.b. is the problem, and it&amp;rsquo;s a problem in multiple ways. Let me lay out the
ways I see comments being stored that could get a person in trouble if their
coworkers saw it.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You leave notes about things others find obvious, self evident, or ridiculous
to even consider leaving a comment about.&lt;/li&gt;
&lt;li&gt;You leave &amp;ldquo;too many&amp;rdquo; comments.&lt;/li&gt;
&lt;li&gt;You leave comments they disagree with.&lt;/li&gt;
&lt;li&gt;You leave frustrated, disparaging, or unkind comments.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Depending on who finds these comments, their feelings about you, and their
current state of mind, the results could range from simply lowering their
opinion of your capabilities, to you getting fired. If you&amp;rsquo;re working on a
client&amp;rsquo;s codebase it could be you and your team loosing the contract.&lt;/p&gt;
&lt;p&gt;Keep in mind that developers generally have a low opinion of comments in code,
and the comments stored in Private Comments are the things that you&amp;rsquo;ve decided
&lt;em&gt;shouldn&amp;rsquo;t&lt;/em&gt; even be a public comment.&lt;/p&gt;
&lt;p&gt;On top of this, most devs don&amp;rsquo;t value the concept of Private Comments, and most
folks in American society (and many others) are terrible about understanding and
empathizing with neurodiversity, or people who see the world differently from
them.&lt;/p&gt;
&lt;p&gt;For example: I have ADHD. As a result, my memory is terrible. Like, ended up
with a nail through my nose because of how bad it is. However, when someone
finds out I&amp;rsquo;ve forgotten something important, I&amp;rsquo;m blamed. I &amp;ldquo;didn&amp;rsquo;t care
enough&amp;rdquo;, or &amp;ldquo;must not have been paying attention&amp;rdquo;. There&amp;rsquo;s no consideration for
the fact that my brain is physiologically different.&lt;/p&gt;
&lt;p&gt;As a result of this poor memory, I leave myself a &lt;em&gt;lot&lt;/em&gt; of notes. I then forget
that I&amp;rsquo;ve left myself those notes. Thus  Private Comments so that the notes I
leave myself about code are &lt;em&gt;in&lt;/em&gt; the code where I need to see them. Even though
my comments tend to be purely factual, there&amp;rsquo;s essentially no positive outcome
to anyone else finding my comments.&lt;/p&gt;
&lt;h2 id=&#34;protections&#34;&gt;Protections&lt;/h2&gt;
&lt;p&gt;Because of these issues I see it as critically important that Private Comments
are never stored &lt;em&gt;in&lt;/em&gt; the repo that you&amp;rsquo;re commenting on. I don&amp;rsquo;t care if you
use Private Comments or one of its competitors&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;. I &lt;em&gt;do&lt;/em&gt; care about you
getting screwed over by a tool that accidentally reveals your private thoughts
to others. I don&amp;rsquo;t care how innocent those thoughts are. They can still be
perceived badly by others, and used to hurt you.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s important that Private Comments, or any tool like it that you consider
using or creating must:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Never store comments in the same repository or folder structure.
&lt;ul&gt;
&lt;li&gt;Your &amp;ldquo;private&amp;rdquo; branches can get accidentally pushed.&lt;/li&gt;
&lt;li&gt;Your &amp;ldquo;private&amp;rdquo; files can get accidentally added to commits.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Support encrypted comments&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That&amp;rsquo;s it really.&lt;/p&gt;
&lt;p&gt;PC takes the additional step of never revealing metadata about the files you&amp;rsquo;re
commenting on, but it could be argued that that&amp;rsquo;s overkill.&lt;/p&gt;
&lt;p&gt;The system must allow you full control of your comments, and make it impossible
for those comments to accidentally become shared with the code, even if they&amp;rsquo;re
not &lt;em&gt;in&lt;/em&gt; the code.&lt;/p&gt;
&lt;p&gt;Note: To date none of the Private Comments editor plugins support encryption. It
wouldn&amp;rsquo;t be hard to add symmetric encryption in the plugins if that was
important to you. The server doesn&amp;rsquo;t care what text you&amp;rsquo;re storing as a comment
and has no idea if it&amp;rsquo;s encrypted or not.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Supported Editors: At the time of writing there are currently Private
Comments plugins for
&lt;a href=&#34;https://github.com/masukomi/private-comments-mode&#34;&gt;Emacs&lt;/a&gt;, and
&lt;a href=&#34;https://github.com/masukomi/vim_private_comments&#34;&gt;Vim&lt;/a&gt;. The Emacs plugin is
good. The Vim plugin works, but is more of a proof of concept, because VimScript
is evil. Writing plugins for it is &lt;em&gt;very&lt;/em&gt; straightforward because most of the
functionality lives in the server. You just need to send HTTP request to store
and retrieve them, and display the results. Check out
&lt;a href=&#34;https://github.com/masukomi/private_comments#creating-an-editor-plugin&#34;&gt;The
README&lt;/a&gt; and &lt;a href=&#34;https://masukomi.github.io/private_comments&#34;&gt;The API Docs&lt;/a&gt;. I&amp;rsquo;m
very happy to help anyone attempting this. &lt;a href=&#34;https://masukomi.org&#34;&gt;Contact info
here&lt;/a&gt;, but I&amp;rsquo;m terrible about email.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;Alas, while I&amp;rsquo;ve found 4 competitors (so far) they only exist as Emacs
plugins.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Recording &amp; Sharing Terminal Sessions</title>
      <link>https://weblog.masukomi.org/posts/recording_and_sharing_terminal_sessions/</link>
      <pubDate>Tue, 11 Oct 2022 16:57:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/posts/recording_and_sharing_terminal_sessions/</guid>
      <description>&lt;p&gt;This post describes how to make high quality recordings of terminal sessions that can be replayed in the terminal, or shared on the web. I&amp;rsquo;m defining high quality as recordings with zero typos, and relatively controlled timing between commands.&lt;/p&gt;
&lt;p&gt;to see an example of the type of output I&amp;rsquo;m talking about.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt;
Videos and gifs take up a lot of disk space, don&amp;rsquo;t age well as display technology improves, and are problematic for folks low vision requirements.&lt;/p&gt;
&lt;p&gt;With the techniques below you can not only share examples of usage on your web pages, but within your tools themselves.&lt;/p&gt;
&lt;h2 id=&#34;goal--s&#34;&gt;Goal(s)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;record terminal session for demonstrating functionality&lt;/li&gt;
&lt;li&gt;replay said recordings locally on a terminal&lt;/li&gt;
&lt;li&gt;share said recordings online&lt;/li&gt;
&lt;li&gt;have that recording look good&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bonus points:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;editability&lt;/li&gt;
&lt;li&gt;same file for terminal and web sharing&lt;/li&gt;
&lt;li&gt;not having to do get everything perfect &lt;em&gt;again&lt;/em&gt; when you need to record and updated version.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools&lt;/h2&gt;
&lt;h3 id=&#34;its-a-live--itsalive&#34;&gt;Its a live (itsalive)&lt;/h3&gt;
&lt;p&gt;same core idea as &amp;ldquo;doitlive&amp;rdquo; BUT with some additional functionality like being able to spit out a whole line, and drive interactive things like vim.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://gitlab.com/stavros/itsalive&#34;&gt;source code (GitLab)&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&#34;what-it-does&#34;&gt;What It Does&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;create a file of commands to be executed&lt;/li&gt;
&lt;li&gt;have doitlive execute each of those commands as you type keys&lt;/li&gt;
&lt;li&gt;always perfectly, and quickly typed&lt;/li&gt;
&lt;li&gt;easy to control timing&lt;/li&gt;
&lt;li&gt;allows you to pause and take control
&lt;ul&gt;
&lt;li&gt;thus &lt;em&gt;actually&lt;/em&gt; doing it live in the middle of your script&lt;/li&gt;
&lt;li&gt;can pause with the &lt;code&gt;##@pause&lt;/code&gt; comment which is useful immediately after a script that needs you to interact with it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;skip forward / back&lt;/li&gt;
&lt;li&gt;allows you to spew out the rest of a line with &lt;code&gt;CTRL+e&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;supports comments!
&lt;ul&gt;
&lt;li&gt;both comments for the viewer (start with #) &amp;amp; comments for the presenter (start with &lt;code&gt;##&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;allows you to have scripted newlines with no input&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Presenter View!!!&lt;/em&gt;
you can see how you&amp;rsquo;re progressing through your script, what came before, and what&amp;rsquo;s coming up next. All in a separate terminal.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;problems&#34;&gt;problems&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;it&amp;rsquo;s &lt;em&gt;actually&lt;/em&gt; executing the commands.&lt;/li&gt;
&lt;li&gt;if you&amp;rsquo;re in the wrong dir, don&amp;rsquo;t have the commands the script needs installed, etc. it&amp;rsquo;ll blow up&lt;/li&gt;
&lt;li&gt;doesn&amp;rsquo;t support comments, so you can&amp;rsquo;t inline commentary for recordings&lt;/li&gt;
&lt;li&gt;not shareable because others would need the same things installed, sometimes in the same places, and what you&amp;rsquo;re doing may be specific to data on your system.&lt;/li&gt;
&lt;li&gt;it doesn&amp;rsquo;t directly handle, or record, interactive stuff
So, for example, you can have it execute a script, but if you have to navigate around the resulting output with arrow keys, it won&amp;rsquo;t record that. However, during playback it won&amp;rsquo;t interfere with you doing that. Until the interactive script exits you are &lt;em&gt;actually&lt;/em&gt; doing it live, not just pretending.&lt;/li&gt;
&lt;li&gt;during playback you&amp;rsquo;re literally just mashing keys. one keystroke per character output to the screen. So, if you&amp;rsquo;re recording the playback of your recording (see below) you&amp;rsquo;ll actually be recording gibberish. However, unless people are viewing the source code to your recording they won&amp;rsquo;t be able to tell.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;notes&#34;&gt;Notes&lt;/h4&gt;
&lt;p&gt;It will start playback in the default shell. If you want to specify a particular shell to playback with set the shell environment variable to the executable for that shell. E.g. &lt;code&gt;SHELL=/opt/homebrew/opt/bash/bin/bash itsalive recording.sh&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;I keep my bash shell nice and minimal for recordings, but my day-to-day stuff is in fish.&lt;/p&gt;
&lt;h3 id=&#34;doitlive&#34;&gt;doitlive&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://doitlive.readthedocs.io/en/stable/&#34;&gt;docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/sloria/doitlive&#34;&gt;source code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;what-it-does&#34;&gt;What it does&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;create a file of commands to be executed&lt;/li&gt;
&lt;li&gt;have doitlive execute each of those commands as you type keys&lt;/li&gt;
&lt;li&gt;always perfectly, and quickly typed&lt;/li&gt;
&lt;li&gt;easy to control timing&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;problems&#34;&gt;Problems&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Same as &lt;code&gt;itsalive&lt;/code&gt;&amp;rsquo;s problems.&lt;/li&gt;
&lt;li&gt;because you&amp;rsquo;re just mashing keys things that you may have pasted in real life are typed in character by character. this makes you look like an &lt;em&gt;amazing&lt;/em&gt; typist, but it does take longer, because unlike &lt;code&gt;itsalive&lt;/code&gt; there&amp;rsquo;s no key combo to finish off the line in one stroke.&lt;/li&gt;
&lt;li&gt;because of its lack of ability to pause &amp;amp; resume playback interactive things can be a little problematic.&lt;/li&gt;
&lt;li&gt;because of its lack of presenter mode it is harder to time things well during recording.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;notes&#34;&gt;Notes&lt;/h4&gt;
&lt;p&gt;It will start playback in the default shell. If you want to specify a particular shell to playback with set the shell environment variable to the executable for that shell. E.g. &lt;code&gt;SHELL=/opt/homebrew/opt/bash/bin/bash doitlive recording.sh&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;I keep my bash shell nice and minimal for recordings, but my day-to-day stuff is in fish.&lt;/p&gt;
&lt;h3 id=&#34;script--unix-command&#34;&gt;script (unix command)&lt;/h3&gt;
&lt;p&gt;old unix command
BSD version (macOS) and Linux version are different.
Linux needs &lt;code&gt;scriptreplay&lt;/code&gt;. macOS version you can just point the same tool at a file and say &lt;code&gt;-p&lt;/code&gt; to &amp;ldquo;play&amp;rdquo; it back.&lt;/p&gt;
&lt;h4 id=&#34;what-it-does&#34;&gt;What it does&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;records what you type and what came out&lt;/li&gt;
&lt;li&gt;records the timings (or not)&lt;/li&gt;
&lt;li&gt;the file could be run on the command line by others for downloadable examples.
&lt;ul&gt;
&lt;li&gt;I believe the format is the same on BSD and Linux&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;problems&#34;&gt;Problems&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;no way to convert these files directly to SVG or GIF or asciinema files (AFAIK)&lt;/li&gt;
&lt;li&gt;it&amp;rsquo;s nigh-impossible to get the timing right, and not show off bad  / slow typing&lt;/li&gt;
&lt;li&gt;editing of content or timing is not really possible
&lt;ul&gt;
&lt;li&gt;technically you can do it with &lt;a href=&#34;https://savannah.gnu.org/projects/teseq&#34;&gt;teseq&lt;/a&gt; which is &amp;hellip; not a joy
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://asciinema.org/a/7445&#34;&gt;Recording of How to edit here (9 min)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;script -&amp;gt; file -&amp;gt; teseq -&amp;gt; new file -&amp;gt; editor -&amp;gt; reseq&lt;/li&gt;
&lt;li&gt;editing with teseq is doable, but the file format is &lt;em&gt;not&lt;/em&gt; very easy to work with.&lt;/li&gt;
&lt;li&gt;one thing it &lt;em&gt;can&lt;/em&gt; do that&amp;rsquo;s useful is edit timings&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;asciinema&#34;&gt;Asciinema&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://asciinema.org&#34;&gt;asciinema.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/asciinema&#34;&gt;GitHub repo&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/asciinema/asciinema-player&#34;&gt;Player (js + css)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/asciinema/asciinema&#34;&gt;terminal session recorder&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can self-host (just needs the &lt;code&gt;.js&lt;/code&gt; and &lt;code&gt;.css&lt;/code&gt; files), or upload your recordings to Asciinema.org. Who knows how long Asciinema.org will continue to exist though.&lt;/p&gt;
&lt;h4 id=&#34;what-it-does&#34;&gt;What it does&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;records what you type and what came out&lt;/li&gt;
&lt;li&gt;records the timings&lt;/li&gt;
&lt;li&gt;stores a format that can be shared via a web page&lt;/li&gt;
&lt;li&gt;stores in a format that can be replayed in a terminal&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;problems&#34;&gt;Problems&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;editing is not possible.
&lt;ul&gt;
&lt;li&gt;content or timing&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;power-up-combo&#34;&gt;Power-up Combo&lt;/h2&gt;
&lt;p&gt;how to make sweet looking recordings without typos or weird pauses.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;figure out exactly what commands you want to execute&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;create a file &lt;code&gt;itsalive&lt;/code&gt; (or &lt;code&gt;doitlive&lt;/code&gt;) with those commands
My recommendation is to use &lt;code&gt;itsalive&lt;/code&gt; though because of the ability to record comments to yourself and the viewer.&lt;/p&gt;
&lt;p&gt;Note that it&amp;rsquo;s not going to be recording timings, or edits or anything like that. It just records the commands you enter, and the file is &lt;em&gt;only&lt;/em&gt; those commands, so it&amp;rsquo;s really simple.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;add &lt;code&gt;asciinema rec &amp;lt;filename&amp;gt;&lt;/code&gt; to the start of it so that it starts &lt;code&gt;asciinema&lt;/code&gt; recording&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;add a  &lt;code&gt;##@pause&lt;/code&gt; comment in your script and then type &lt;code&gt;^d&lt;/code&gt; to exit &lt;code&gt;asciinema&lt;/code&gt; without seeing the word &lt;code&gt;exit&lt;/code&gt; typed out.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;launch &lt;code&gt;itsalive myfile.sh&lt;/code&gt; or &lt;code&gt;SHELL=/path/to/shell itsalive myfile.sh&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;launch the presenter view in a separate terminal &lt;code&gt;itsalive presenter_view&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;click back into your original terminal but keep presenter view visible.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Watch the presenter view&lt;/em&gt; not the real terminal. As you mash keys it&amp;rsquo;ll show you your progress against the characters in the line. This makes it trivial to hit &lt;code&gt;CTRL+e&lt;/code&gt; at the right point to make it look like you pasted, or to quickly finish off long lines for any other reason.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mash keys / hit return at appropriate times to move through the steps of the script&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Party.&lt;/p&gt;
&lt;p&gt;Now you&amp;rsquo;ve got a shell script for itsalive and an asciinema file to do with as you want. You probably don&amp;rsquo;t need the doitlive anymore, as it&amp;rsquo;ll likely produce different results when run months, or years, in the future, but maybe it&amp;rsquo;ll be useful to use as a starting point when you need to make a new recording for an updated version of the tool.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;real-world-example&#34;&gt;Real World Example&lt;/h2&gt;
&lt;p&gt;Here are the things I used to make some documentation for &lt;a href=&#34;https://github.com/masukomi/masuconfigs/blob/master/bin/git-scripts/git-link-to-commit&#34;&gt;my git link-to-commit script&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;What follows is the bash file that I ran with &lt;code&gt;itsalive&lt;/code&gt;. Things of note:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lines starting with &lt;code&gt;##&lt;/code&gt; are notes to myself because I&amp;rsquo;m watching the &lt;code&gt;presenter_view&lt;/code&gt; as I run it.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;#&lt;/code&gt; lines are comments that will be included in the output.&lt;/li&gt;
&lt;li&gt;The blank lines are significant, in that they actually cause a return to be emitted as if you hit return on the terminal.&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;m kicking off the &lt;code&gt;asciinema&lt;/code&gt; recording from &lt;em&gt;within&lt;/em&gt; the &lt;code&gt;itsalive&lt;/code&gt; script so that the recording does not include me kicking off the &lt;code&gt;itsalive&lt;/code&gt; playback.&lt;/li&gt;
&lt;li&gt;The first &lt;code&gt;##@pause&lt;/code&gt; line is because the first invocation of &lt;code&gt;git link-to-commit&lt;/code&gt; is going to require me to interact with a pull-down, so I need to pause the playback.&lt;/li&gt;
&lt;li&gt;The second one is because I haven&amp;rsquo;t figured out how to make it emit a &lt;code&gt;CTRL+d&lt;/code&gt; to stop &lt;code&gt;asciinema&lt;/code&gt;&amp;rsquo;s recording. So I need to have interactive control over the terminal. I could have had it type &lt;code&gt;exit&lt;/code&gt; but that would have been ugly.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Getting the timing right is still a bit of an art. The &lt;code&gt;presenter_view&lt;/code&gt; really helped, but I needed to re-record a few times to get all the interactions and timings smooth enough. So, I just started the script off by having it delete any prior recordings (if present).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm git-link-to-commit.asciinema 2&amp;gt;  /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;## MOVE FAST AFTER THIS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;asciinema rec git-link-to-commit.asciinema
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git log -n1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# generate a link&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;## remember to mash then ^e when you get to the hash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git link-to-commit 2a15b8dea0ae606dedb8335e1c3106342e2d79ed
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;##@pause&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;##  ^r to RESUME playback&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# skip the &amp;#34;choose a repo&amp;#34; step&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;## remember to mash then ^e when you get to the hash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git link-to-commit -o origin 2a15b8dea0ae606dedb8335e1c3106342e2d79ed
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;## EXIT ASCIINEMA&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;##@pause&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;## HIT ^d&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;## EXIT itsalive&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;demo&#34;&gt;Demo&lt;/h2&gt;
&lt;p&gt;The final result.&lt;/p&gt;
&lt;div id=&#39;git-link-to-commit.asciinema&#39;&gt;&lt;/div&gt;
&lt;script&gt;
    AsciinemaPlayer.create(
        &#34;/asciinema/git-link-to-commit.asciinema&#34;,
        document.getElementById(&#39;git-link-to-commit.asciinema&#39;),
        {terminalLineHeight: 2}
    );
  
&lt;/script&gt;

</description>
    </item>
    
    <item>
      <title>Raku Signature Errors with Arrays &amp; Hashes</title>
      <link>https://weblog.masukomi.org/posts/raku_arrays_and_hashes_signature_errors/</link>
      <pubDate>Sat, 01 Oct 2022 00:01:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/posts/raku_arrays_and_hashes_signature_errors/</guid>
      <description>&lt;p&gt;A quick post to help future Raku geeks understand a couple of confusing error messages:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;expected Positional[Array] but got Array&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;and&lt;/p&gt;
&lt;p&gt;&lt;code&gt;expected Associative[Hash] but got Hash&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;These are conceptually the same problem. If you&amp;rsquo;ve received one of these errors it means you&amp;rsquo;ve double-specified your parameter by using the &lt;code&gt;@&lt;/code&gt; or &lt;code&gt;%&lt;/code&gt; &lt;em&gt;and&lt;/em&gt; &lt;code&gt;Array&lt;/code&gt; or &lt;code&gt;Hash&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;A parameter of &lt;code&gt;Hash %foo&lt;/code&gt; says &amp;ldquo;I would like to be passed something that implements Associative and  has a Hash in it.&amp;rdquo; (a Hash of Hashes). Likewise &lt;code&gt;Array @foo&lt;/code&gt; says &amp;ldquo;I would like to be passed something that implements Positional and has an Array in it&amp;rdquo;. Yes, that sounds backwards. No, I can&amp;rsquo;t explain why.&lt;/p&gt;
&lt;p&gt;To solve this for hashes you &lt;em&gt;either&lt;/em&gt; need to specifiy &lt;code&gt;Hash&lt;/code&gt; OR you need to use &lt;code&gt;%&lt;/code&gt;, but not both.
To solve this for arrays you &lt;em&gt;either&lt;/em&gt; need to specify &lt;code&gt;Array&lt;/code&gt; OR you need to use &lt;code&gt;@&lt;/code&gt;, but not both.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-raku&#34; data-lang=&#34;raku&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# This won&amp;#39;t work&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;sub&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;bad-hash-signature&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;Hash&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;%foo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nb&#34;&gt;say&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&amp;#34;&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;this will error when passed a simple Hash&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;#34;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Solution 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;sub&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;good-hash-signature&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;%foo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nb&#34;&gt;say&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&amp;#34;&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;hash was &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;~&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;%foo&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;raku&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Solution 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;sub&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;alternate-good-hash-signature&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;Hash&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$foo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nb&#34;&gt;say&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&amp;#34;&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;hash was &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;~&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$foo&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;raku&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, to be extra pedantic, &amp;ldquo;Solution 1&amp;rdquo; will allow &lt;em&gt;anything&lt;/em&gt; that implements the &lt;a href=&#34;https://docs.raku.org/type/Associative&#34;&gt;Associative role&lt;/a&gt;. If you &lt;em&gt;really&lt;/em&gt; want to lock it down to &lt;em&gt;only&lt;/em&gt; accept &lt;code&gt;Hash&lt;/code&gt; you need to go with &amp;ldquo;Solution 2&amp;rdquo;. The same idea applies to the &lt;a href=&#34;https://docs.raku.org/type/Positional&#34;&gt;Positional role&lt;/a&gt; and arrays.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Mirroring With Gitea</title>
      <link>https://weblog.masukomi.org/2022/09/26/mirroring-with-gitea/</link>
      <pubDate>Mon, 26 Sep 2022 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2022/09/26/mirroring-with-gitea/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-goal&#34;&gt;The Goal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-process&#34;&gt;The Process&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#the-learnings&#34;&gt;The Learnings&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;Following on the heels of my &lt;a href=&#34;https://weblog.masukomi.org/2022/09/24/do-and-dont-self-host-your-repos/&#34;&gt;last post on why you should (not) self host your
git repos&lt;/a&gt;, I went ahead and used &lt;a href=&#34;https://gitea.io&#34;&gt;Gitea&lt;/a&gt; to set up a local mirror of all my
repositories, and all the repositories I don&amp;rsquo;t want to loose access to.&lt;/p&gt;
&lt;p&gt;The results were surprising, and after reading this, you might want to do the
same. This post will be a qick overview of how I did it, some tips that&amp;rsquo;ll help,
and what I learned as a result.&lt;/p&gt;
&lt;p&gt;Installation was pretty straightforward. I grabbed my old Raspberry Pi 3B and
followed &lt;a href=&#34;https://pimylifeup.com/raspberry-pi-gitea/&#34;&gt;this spectacualar step-by-step guide for installation for installing
Gitea.&lt;/a&gt; Afterwards a friend pointed out that I could have just installed
installed it on our Synology with a Docker image.&lt;/p&gt;
&lt;h2 id=&#34;the-goal&#34;&gt;The Goal&lt;/h2&gt;
&lt;p&gt;My goal was two-fold:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I wanted a backup of all my repos. Many of them &lt;em&gt;only&lt;/em&gt; existed in GitHub.&lt;/li&gt;
&lt;li&gt;I wanted to delete every fork I&amp;rsquo;d made &lt;em&gt;just&lt;/em&gt; to guarantee I had a copy.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;the-process&#34;&gt;The Process&lt;/h2&gt;
&lt;p&gt;With that in mind I started working through my list of repositories&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;. Gitea
makes it trivial to mirror a repo. You just choose &amp;ldquo;new migration&amp;rdquo; from under
the &amp;ldquo;+&amp;rdquo; menu, and then click on the service you&amp;rsquo;re migrating from. There are 3
things that can make your life easier here if you&amp;rsquo;re importing lots&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Bookmark the form that comes up after choosing a service to migrate from.&lt;/li&gt;
&lt;li&gt;If you&amp;rsquo;re going to be importing a lot you&amp;rsquo;ll probably want to use a &lt;a href=&#34;https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token&#34;&gt;personal
access token (GitHub docs)&lt;/a&gt;. That way you won&amp;rsquo;t get rate limited by the API,
unless you&amp;rsquo;re migrating (not mirroring) something with many thousands of
issues.&lt;/li&gt;
&lt;li&gt;Use a clipboard manager. It doesn&amp;rsquo;t remember your API key so you&amp;rsquo;ll be
pasting it into every form, along with the URL of the repo you&amp;rsquo;re importing.
I use &lt;a href=&#34;https://maccy.app/&#34;&gt;Maccy&lt;/a&gt;, and I would recommend it.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For each repo in my list of repos on github, I&amp;rsquo;d make a couple quick decisions.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;for things I authored
&lt;ul&gt;
&lt;li&gt;If it was something I am either maintaining or may poke in the future I&amp;rsquo;d
just grab the url and tell Gitea to mirror it.&lt;/li&gt;
&lt;li&gt;If it was something I wandered off from years ago, and am unlikely to ever
touch again, I&amp;rsquo;d mark it as archived.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;for the backups of other people&amp;rsquo;s things
&lt;ul&gt;
&lt;li&gt;I&amp;rsquo;d click through and see if i&amp;rsquo;d added anything, or if it was just an old
copy.
&lt;ul&gt;
&lt;li&gt;If I&amp;rsquo;d added something, and the original repo hadn&amp;rsquo;t been touched, I&amp;rsquo;d
mirror my fork.&lt;/li&gt;
&lt;li&gt;If I&amp;rsquo;d added something, but the original had moved forwards some
significant amount I just abandoned my changes, and mirrored theirs.&lt;/li&gt;
&lt;li&gt;If mine was just an ancient copy of a repo that&amp;rsquo;d moved on, I&amp;rsquo;d go to the
parent repo.
&lt;ul&gt;
&lt;li&gt;If the parent repo was archived I&amp;rsquo;d just tell Gitea to import it but not
bother mirroring. There aren&amp;rsquo;t going to be updates.&lt;/li&gt;
&lt;li&gt;If the parent repo indicated that &lt;em&gt;it too&lt;/em&gt; was a mirror, I&amp;rsquo;d follow that
back to the source repo and mirror &lt;em&gt;that&lt;/em&gt; instead.&lt;/li&gt;
&lt;li&gt;After successfully mirroring I&amp;rsquo;d delete my copy.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;the-learnings&#34;&gt;The Learnings&lt;/h2&gt;
&lt;p&gt;(In no particular order)&lt;/p&gt;
&lt;p&gt;First off, &lt;a href=&#34;https://gitea.io&#34;&gt;Gitea&lt;/a&gt; is really impressive. Those devs have done a great job and
should be proud of what they&amp;rsquo;ve built.&lt;/p&gt;
&lt;p&gt;Along the way, I discovered that many of the repos that I&amp;rsquo;d forked had moved on
significantly. I had copies that were so old they probably wouldn&amp;rsquo;t run with
modern versions of things. They were also frequently missing lots of new
features and bug fixes.&lt;/p&gt;
&lt;p&gt;While this isn&amp;rsquo;t terribly surprising if you think about it, the notable learning
is that that&amp;rsquo;s never going to be a problem again, because Gitea is &lt;em&gt;mirroring&lt;/em&gt;
them and regularly polling them for updates. If they disappear I&amp;rsquo;ll have the
latest copy before they went away. Github doesn&amp;rsquo;t give me that option.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not the only one forking repos just to have a copy. Multiple times I clicked
through to the parent repo, and got curious. I&amp;rsquo;d see hundreds of forks, click
into the insights page and see that essentially no-one was hacking on it except
for the original authors. I guess lots of folks have gotten burned when they
discovered that some repo they&amp;rsquo;d starred or bookmarked was gone when they went
to check it out again.&lt;/p&gt;
&lt;p&gt;Mirroring isn&amp;rsquo;t something you can turn on later in Gitea. You &lt;em&gt;must&lt;/em&gt; set a repo up
as a mirror from the beginning.&lt;/p&gt;
&lt;p&gt;Gitea can&amp;rsquo;t mirror &lt;em&gt;everything&lt;/em&gt;. Some repos (like &lt;a href=&#34;https://github.com/oz/tz&#34;&gt;this great command line time
zone tool&lt;/a&gt;) always error out. Gitea provides no information as to &lt;em&gt;why&lt;/em&gt; it failed
to clone them down too. I think I encountered three repos like that. Also, I
can&amp;rsquo;t figure out how to clone anything from &lt;a href=&#34;https://sourcehut.org/&#34;&gt;Sourcehut&lt;/a&gt;&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;. Even when I tried
to clone repos manually their http links for cloning always error.&lt;/p&gt;
&lt;p&gt;I realized that if i don&amp;rsquo;t &lt;em&gt;just&lt;/em&gt; mirror the tools that I author, and want backups
of, but &lt;em&gt;also&lt;/em&gt; mirror the repos of tools that I need to reference the source code
of regularly then I have a single place I can search for &lt;em&gt;only&lt;/em&gt; stuff that&amp;rsquo;s
relevant to me. For example, it&amp;rsquo;s not uncommon for me to know that &lt;em&gt;one&lt;/em&gt; of the
libraries I use frequently has a piece of functionality, but not remember &lt;em&gt;which&lt;/em&gt;
library. Searching Google or Github would be frustrating, because there are just
too many responses. But now, I can just search my Gitea install.&lt;/p&gt;
&lt;p&gt;The experience of doing this was very cathartic for me. I now know that I have
&lt;em&gt;up-to-date&lt;/em&gt; copies of all the useful tools I care about. I was also able to
delete about 100 repositories from &lt;a href=&#34;https://github.com/masukomi?tab=repositories&#34;&gt;my list of repositories on Github.&lt;/a&gt; Now, if a
future employer checks them out, they&amp;rsquo;re almost &lt;em&gt;all&lt;/em&gt; things I have actively
worked on to some degree. It&amp;rsquo;s also nice to know that from now on I have a
trivially easy way to mirror any useful tool I care about. No more ancient
frozen it time forks, and no more bookmarks &amp;amp; stars that cease to exist.&lt;/p&gt;
&lt;p&gt;My next step? Going through all the repos I&amp;rsquo;ve bookmarked, but not forked, and
see which of those are worth mirroring.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Before working through your list of repositories, be sure to sort them by
name. Mine were sorted by recency and that made things a little harder towards
the end.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;For a sense of scale I ended up mirroring or migrating 169 repos into
Gitea.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;In addition to having a visual style from the 1990&amp;rsquo;s, and having UX from
hell, Sourcehut appears to also just not &lt;em&gt;fucking&lt;/em&gt; work as a git host. I don&amp;rsquo;t
understand why anyone uses them, nevermind why anyone pays for them.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Do (not) Self-Host your repos</title>
      <link>https://weblog.masukomi.org/2022/09/24/do-and-dont-self-host-your-repos/</link>
      <pubDate>Sat, 24 Sep 2022 00:00:00 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/2022/09/24/do-and-dont-self-host-your-repos/</guid>
      <description>&lt;h1 id=&#34;table-of-contents&#34;&gt;Table of Contents&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;#org5fd34c4&#34;&gt;Why You &lt;em&gt;Should&lt;/em&gt; Self-Host&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;➠&lt;a href=&#34;#org647e5e9&#34;&gt;What about GitLab and other Competitors?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#org379a435&#34;&gt;Why You Shouldn&amp;rsquo;t Self-Host&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#orge80cd4c&#34;&gt;So what&amp;rsquo;s a geek to do?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#orge2c2733&#34;&gt;What am &lt;em&gt;I&lt;/em&gt; going to do?&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Once upon a time, GitHub was a successful geek enterprise. Then Microsoft bought it, and folks started arguing that you should abandon ship. You should self-host your repos they say.&lt;/p&gt;
&lt;p&gt;I 100% agree, and 100% disagree. Let me explain.&lt;/p&gt;
&lt;p&gt;GitHub&amp;rsquo;s been a benevolent host. When &lt;a href=&#34;https://github.blog/2020-03-16-npm-is-joining-github/&#34;&gt;they bought NPM&lt;/a&gt; they went from being a de facto piece of internet infrastructure to an &lt;em&gt;actual&lt;/em&gt; piece of &lt;em&gt;critical&lt;/em&gt; infrastructure.  At this point you may as well argue that we should sever our connection to the electric company.&lt;/p&gt;
&lt;p&gt;But there&amp;rsquo;s a difference between &lt;em&gt;needing&lt;/em&gt; the electric company and ignoring the fact that sometimes the power goes. Usually it&amp;rsquo;s temporary. Days isn&amp;rsquo;t uncommon in wintery climes. But every now and then, it&amp;rsquo;s more. In the case of internet SAAS apps, it&amp;rsquo;s sometimes permanent.&lt;/p&gt;
&lt;p&gt;&lt;a id=&#34;org5fd34c4&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;why-you-should-self-host&#34;&gt;Why You &lt;em&gt;Should&lt;/em&gt; Self-Host&lt;/h1&gt;
&lt;p&gt;The biggest argument, of course, is backups and continuity of service. If something hapened and you lost access to your GitHub account right now, what would you loose? If you maintain a project with many users and contributors, what would it do to your community, and your work?&lt;/p&gt;
&lt;p&gt;GitHub isn&amp;rsquo;t &lt;em&gt;just&lt;/em&gt; where your Git repos are hosted, but where all the metadata that surrounds them. This means years of Issues, Pull Requests, wiki pages, and frequently the project&amp;rsquo;s web site.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve derived a ton of value from old tickets on GitHub projects. They regularly answer questions, and provid workarounds. The takedown off a popular repo could be a huge loss.&lt;/p&gt;
&lt;p&gt;GitHub suspends accounts, and deletes repositories for  a variety of reasons.  If yours targeted for seemingly &amp;ldquo;no reason&amp;rdquo; it wouldn&amp;rsquo;t be the first.&lt;/p&gt;
&lt;p&gt;Even if you believe it won&amp;rsquo;t, or can&amp;rsquo;t, happen to you, there&amp;rsquo;s another reason reason to consider self-hosting: Lock in. Right &lt;em&gt;now&lt;/em&gt; (September 2022) GitHub is very good about letting you export everything. As far as I know, there&amp;rsquo;s no data you can put into GitHub that you can&amp;rsquo;t also get out via their APIs. In theory.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Our migration has been in the process for a while, but every time we run it we find that our attempts were missing some data, so we need to re-run to fetch missing data, if we had higher limits it wouldn&amp;rsquo;t take so long to find these issues. Github doesn&amp;rsquo;t provide tokens with higher limits, so we have to work around that. We even had people with [GitHub Enterprise] subscriptions ask, and they got the same response.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://social.gitea.io/@gitea/108833229447552270&#34;&gt;Gitea on Mastodon&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://gitea.io/&#34;&gt;Gitea&lt;/a&gt; is an open source GitHub alternative, whose creation started out &lt;em&gt;on&lt;/em&gt; GitHub. Eventually, the software got really robust, and they decided to host their own repo and issues. The problem is, they&amp;rsquo;ve got over 20,000 Issues &amp;amp; PRs they want to export. Thousands of those are still open, and the longer it takes them to cut over, the larger those numbers get.&lt;/p&gt;
&lt;p&gt;To be fair, 99% of GitHub users wouldn&amp;rsquo;t have this problem. We don&amp;rsquo;t have projects that are popular enough, but companies who use GitHub do, and there&amp;rsquo;s no advantage to GitHub to help large projects or customers leave. They may even consider locking that metadata down to guarantee they stay.&lt;/p&gt;
&lt;p&gt;&lt;a id=&#34;org647e5e9&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;what-about-gitlab-and-other-competitors&#34;&gt;What about GitLab and other Competitors?&lt;/h2&gt;
&lt;p&gt;You can apply the same reasoning to GitHub&amp;rsquo;s hosted alternatives. Plus, none of them are as financially successful as GitHub.  They&amp;rsquo;re far more likely to go out of business, and screw everyone who uses them.&lt;/p&gt;
&lt;p&gt;&lt;a id=&#34;org379a435&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;why-you-shouldnt-self-host&#34;&gt;Why You Shouldn&amp;rsquo;t Self-Host&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Right now&lt;/em&gt; it&amp;rsquo;s incredibly improbable that you&amp;rsquo;ll have your account suspended. The stories of suspended accounts are rare. &lt;em&gt;Most&lt;/em&gt; of them seem to be from government action,or &amp;ldquo;Terms of Service&amp;rdquo; violations that most geeks react to with &amp;ldquo;Yup. Seems fair.&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s also the fact that self-hosting is work. But let&amp;rsquo;s set that aside for the moment. Let&amp;rsquo;s pretend there&amp;rsquo;s some magical free button you can click that takes care of everything. &lt;strong&gt;Boop&lt;/strong&gt;. You&amp;rsquo;re self-hosted now.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s also assume you&amp;rsquo;ve got a project that&amp;rsquo;s popular / useful enough to get Issues and the occasional Pull Request.&lt;/p&gt;
&lt;p&gt;How is that going to happen on your new site?  Well, first they&amp;rsquo;re going to need to set up an account on your server. Are they going to think it&amp;rsquo;s worth it? Worth it enough to give their email to yet another stranger? If they want to submit a fix / feature, is it also worth it to figure out how to fork it in this not-GitHub? Worth it to figure out how its PR equivalents work? These probably aren&amp;rsquo;t hard, but every little difference they have to navigate is another reason to not bother.&lt;/p&gt;
&lt;p&gt;And then there&amp;rsquo;s discovery. GitHub isn&amp;rsquo;t &lt;em&gt;only&lt;/em&gt; the default place to look for code. They&amp;rsquo;ve also got massive &amp;ldquo;website authority&amp;rdquo; in Google. It doesn&amp;rsquo;t matter if you&amp;rsquo;re the only place hosting your thing. Any project on GitHub that&amp;rsquo;s remotely similar to your search terms is likely to come up before your site.&lt;/p&gt;
&lt;p&gt;But, even if you&amp;rsquo;re ok with all of that. There&amp;rsquo;s an even bigger reason you shouldn&amp;rsquo;t self host. A reason we &lt;em&gt;shouldn&amp;rsquo;t&lt;/em&gt; encourage folks to self host. Sooner or later you&amp;rsquo;ll get sick of bothering, or you&amp;rsquo;ll die. One is guaranteed. The other has lots of historical precedence.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve bookmarked thousands of useful web sites over the years. A huge chunk of those have been useful, and insightful blog posts about development. Hundreds of them don&amp;rsquo;t exist anymore. Mostly because the person who ran them simply didn&amp;rsquo;t feel like bothering with it anymore. How many millions of others have poofed out of existence?&lt;/p&gt;
&lt;p&gt;But, a repo isn&amp;rsquo;t some just random thoughts. Almost every repo contains some useful tool or library. Sooner or later, someone&amp;rsquo;s going to need tha. There are thousands, probably millions, of little repos out there containing the only bit of code in existence, that solves that particular problem. Sometimes they&amp;rsquo;re just the only thing that solves it in that particular language. When you stop hosting it, for whatever reason, that useful tool ceases to exist. Even if it&amp;rsquo;s &amp;ldquo;just a port&amp;rdquo;. That&amp;rsquo;s a lot of work that someone will need to recreate, and debug.&lt;/p&gt;
&lt;p&gt;&lt;a id=&#34;orge80cd4c&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;so-whats-a-geek-to-do&#34;&gt;So what&amp;rsquo;s a geek to do?&lt;/h1&gt;
&lt;p&gt;Before I answer that, let me note that this bit gets into implementation strategies. If you just came for the question of &amp;ldquo;should I, or shouldn&amp;rsquo;t I?&amp;rdquo; you can stop reading. Thanks for making it this far. Good luck whatever you choose.&lt;/p&gt;
&lt;p&gt;–&lt;/p&gt;
&lt;p&gt;So, what to do…&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Short short version&lt;/strong&gt;:
&lt;em&gt;If lots of people rely on your project&lt;/em&gt;, then mirror your code to a large competitor and accept that you may loose access to your issues, PRs, etc. . Stick a note in your README so that folks know where to find your mirror &lt;em&gt;before&lt;/em&gt; lightning strikes.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re like most open source developers, you&amp;rsquo;ve got some repos that are mostly ignored by the world, and receive essentially no issues or PRs. No-one&amp;rsquo;s going to be stressed if your repo disappears for a week. So, Install Gitea on your computer. Tell it to mirror your repos and forget about it. Or, just clone the all locally and set up a cron job to regularly pull down changes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Longer version&lt;/strong&gt;:
I think that depends a lot on what, if any, metadata exists in your GitHub repos. Most devs have small repos that are mostly just used by them.  If this sounds like you, then simply keeping an up-to-date copy of them on your home computer could be fine.&lt;/p&gt;
&lt;p&gt;Things are different if you maintain some repo that other people actually care about enough to make issues, or even contribute code to.&lt;/p&gt;
&lt;p&gt;In that case my &lt;em&gt;personal&lt;/em&gt; advice is to host your stuff on Github, but have it mirrored to a second system. Ideally you&amp;rsquo;d want all your issues, PRs, etc. mirrored to it. But as far as I know, that&amp;rsquo;s not actually something you can do. It&amp;rsquo;s easy to keep the &lt;em&gt;code&lt;/em&gt; synced to a mirror. It&amp;rsquo;s the metadata that&amp;rsquo;s a problem. To be clear, I&amp;rsquo;m not saying it&amp;rsquo;s not &lt;em&gt;technically&lt;/em&gt; possible. I&amp;rsquo;m saying, I don&amp;rsquo;t think anyone&amp;rsquo;s actually written the code to keep those synced between GitHub and any open source alternative. It&amp;rsquo;s a hard problem because Issues, PRs, comments, and just about everything else can be edited.&lt;/p&gt;
&lt;p&gt;So, that leaves you with regularly backing up your stuff. I&amp;rsquo;m going to assume you&amp;rsquo;re not someone with ~10k open &amp;amp; closed issues, plus another ~10k PRs like Gitea. So, &lt;em&gt;exporting&lt;/em&gt; your issues is probably something that&amp;rsquo;s actually doable. Exporting. &lt;em&gt;Not&lt;/em&gt; syncing. However, the more things you have to export, and the more frequently you want to back it up, the more likely you are to hit your rate limits.&lt;/p&gt;
&lt;p&gt;If you go this route, you&amp;rsquo;ve got two options. You could use something like &lt;a href=&#34;https://gitea.com/gitea/migrator/&#34;&gt;the gitea-github-migrator&lt;/a&gt; that can export everything. Tools like that are made to create a &lt;em&gt;new&lt;/em&gt; repo in GitHub alternatives, not &lt;em&gt;sync&lt;/em&gt; to them. You&amp;rsquo;d be constantly churning, deleting old repos and setting up new ones.&lt;/p&gt;
&lt;p&gt;A better solution might be something like &lt;a href=&#34;https://github.com/matomo-org/github-issues-mirror&#34;&gt;github-issues-mirror&lt;/a&gt; which can download all your issues as JSON files. Keep that running in the background and if worst comes to worst you can write an importer for wherever you&amp;rsquo;ve been mirroring your code.&lt;/p&gt;
&lt;p&gt;&lt;a id=&#34;orge2c2733&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;what-am-i-going-to-do&#34;&gt;What am &lt;em&gt;I&lt;/em&gt; going to do?&lt;/h1&gt;
&lt;p&gt;I think I&amp;rsquo;m going to install Gitea on my Raspberry Pi. I&amp;rsquo;ll tell it to mirror all my repos, and all the repos of useful tools I want to always have a copy of. I do maintain some repos which are somewhat useful to other people if GitHub deletes them. No-one will be screwed, and I can take my time in uploading a backup somewhere else. I&amp;rsquo;ll stick it in the basement with the router and back it up to our &lt;a href=&#34;https://en.wikipedia.org/wiki/Network-attached_storage&#34;&gt;NAS&lt;/a&gt;, which backs up to &lt;a href=&#34;https://www.backblaze.com/b2/cloud-storage.html&#34;&gt;B2&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Syncing Homebrew Installs</title>
      <link>https://weblog.masukomi.org/2022/09/07/syncing-homebrew-installs/</link>
      <pubDate>Wed, 07 Sep 2022 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2022/09/07/syncing-homebrew-installs/</guid>
      <description>&lt;p&gt;Those of us who love the command line, have a tendency to install a lot of useful utilities, and want them available on all our computers. On macOS we tend to use &lt;a href=&#34;https://brew.sh&#34;&gt;Homebrew&lt;/a&gt;. This document serves to describe three ways to generate a useful file to solve that problem.&lt;/p&gt;
&lt;p&gt;As I see it there are 3 basic approaches to syncing your homebrew utilities across machines.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I don&amp;rsquo;t care about the details, just make it work.&lt;/li&gt;
&lt;li&gt;I would like a simple installation document that
&lt;ul&gt;
&lt;li&gt;lists what I&amp;rsquo;ve installed&lt;/li&gt;
&lt;li&gt;what each is for&lt;/li&gt;
&lt;li&gt;can be used to install the same things on other machines&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;I would like an efficient installation document that
&lt;ul&gt;
&lt;li&gt;lists what I&amp;rsquo;ve installed&lt;/li&gt;
&lt;li&gt;what each is for&lt;/li&gt;
&lt;li&gt;can be used to install the same things on other machines&lt;/li&gt;
&lt;li&gt;won&amp;rsquo;t waste time trying to reinstall things already installed&lt;/li&gt;
&lt;li&gt;can handle post-install tasks, and make sure they only get run once.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This pots will address each of those, in order.&lt;/p&gt;
&lt;h2 id=&#34;i-dont-care-about-the-details-just-make-it-work&#34;&gt;I don&amp;rsquo;t care about the details, just make it work&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;run &lt;code&gt;brew bundle dump&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;creates a &lt;code&gt;Brewfile&lt;/code&gt; document in the current directory.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;copy that to the other machine&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd&lt;/code&gt; to the same directory as the &lt;code&gt;Brewfile&lt;/code&gt; on the new machine&lt;/li&gt;
&lt;li&gt;run &lt;code&gt;brew bundle&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That&amp;rsquo;s it. You&amp;rsquo;re done.&lt;/p&gt;
&lt;h2 id=&#34;id-like-a-simple-installation-document&#34;&gt;I&amp;rsquo;d like a simple installation document…&lt;/h2&gt;
&lt;p&gt;The following script will generate a documented bash script called &lt;code&gt;brews.sh&lt;/code&gt; which you can then sync across machines via whatever your normal method is. The downside to this is that rerunning it on a synced machine after adding one or two entries is going to  be really slow. Also, there&amp;rsquo;s no good way to include post-install setup and have it still be &lt;a href=&#34;https://ldapwiki.com/wiki/Idempotent&#34;&gt;idempotent&lt;/a&gt; and not break things. Post-install setups should generally only be run once, not every time you load the file.&lt;/p&gt;
&lt;p&gt;The file will look like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;brew tap charmbracelet/tap
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew tap d12frosted/emacs-plus
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Strip or convert ANSI codes into HTML, (La)Tex, RTF, or BBCode&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# http://www.andre-simon.de/doku/ansifilter/ansifilter.html&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew install ansifilter
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Official Amazon AWS command-line interface&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# https://aws.amazon.com/cli/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew install awscli
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Clone of cat(1) with syntax highlighting and Git integration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# https://github.com/sharkdp/bat&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew install bat
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#... and so on&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here&amp;rsquo;s the script that generated it (presumes you&amp;rsquo;re runing in &lt;code&gt;bash&lt;/code&gt; / &lt;code&gt;zsh&lt;/code&gt; shell)&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;#!/bin/sh&amp;#39;&lt;/span&gt; &amp;gt; brews.sh&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew leaves --installed-on-request &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep --color&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;none &lt;span class=&#34;s2&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sed -e &lt;span class=&#34;s2&#34;&gt;&amp;#34;s/\(.*\)\/.*/\1/&amp;#34;&lt;/span&gt; -e &lt;span class=&#34;s2&#34;&gt;&amp;#34;s/^/brew tap /&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sort -u &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  &amp;gt;&amp;gt; brews.sh&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew info &lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;brew leaves --installed-on-request&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt; 2&amp;gt;/dev/null &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep --color&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;none -A2 &lt;span class=&#34;s2&#34;&gt;&amp;#34;==&amp;gt; [^[:space:]]\+:&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep -v -- &lt;span class=&#34;s2&#34;&gt;&amp;#34;--&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sed -e &lt;span class=&#34;s1&#34;&gt;&amp;#39;s/==&amp;gt; \(.*\):.*/brew install \1/&amp;#39;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    -e &lt;span class=&#34;s1&#34;&gt;&amp;#39;/^brew install/!s/\(.*\)/# \1/&amp;#39;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; ruby -e &lt;span class=&#34;s1&#34;&gt;&amp;#39;lines=STDIN.each_line.to_a; (2..(lines.size - 1)).step(3){|n| puts &amp;#34;\n#{lines[n - 1]}&amp;#34;; puts lines[n]; puts lines[n - 2]}&amp;#39;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;   &amp;gt;&amp;gt; brews.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod u+x brews.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a id=&#34;org307d98b&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;id-like-an-efficient-installation-document&#34;&gt;I&amp;rsquo;d like an efficient installation document…&lt;/h2&gt;
&lt;p&gt;This is basically the same idea BUT it adds in 3 bash functions at the top, which make rerunning this much faster and allow you to do post-install setup if any of the things you&amp;rsquo;re installing need that.&lt;/p&gt;
&lt;p&gt;Start by creating a new file called &lt;code&gt;brews.sh&lt;/code&gt; and adding this to the top of it. I&amp;rsquo;ll explain how to use them at the end of this section.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#!/usr/bin/env bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# NOTE TO FUTURE ME&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# run the following to extract the relevant info to manually append to this&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# brew info &amp;lt;some_command&amp;gt; | head -n3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;##############################&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# BEGIN FUNCTIONS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;function&lt;/span&gt; maybrew&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; ! is_installed &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		install_or_die &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;-- Skipping &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; (installed already)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;function&lt;/span&gt; install_or_die&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	brew install &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;-- Installing &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	brew install &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$?&lt;/span&gt; -ne &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;problem installing &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;exiting&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;function&lt;/span&gt; is_installed&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; brew ls --versions &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt; &amp;gt; /dev/null&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;c1&#34;&gt;# the package is installed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;c1&#34;&gt;# the package is not installed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;nb&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# END FUNCTIONS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;##############################&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next we&amp;rsquo;ll run a script that&amp;rsquo;s almost identical to the last one, except instead of calling &lt;code&gt;brew install foo&lt;/code&gt; it&amp;rsquo;s going to call &lt;code&gt;maybrew foo&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew leaves --installed-on-request &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;	&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep --color&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;none &lt;span class=&#34;s2&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;	&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sed -e &lt;span class=&#34;s2&#34;&gt;&amp;#34;s/\(.*\)\/.*/\1/&amp;#34;&lt;/span&gt; -e &lt;span class=&#34;s2&#34;&gt;&amp;#34;s/^/brew tap /&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;	&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sort -u &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;	&amp;gt;&amp;gt; brews.sh&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew info &lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;brew leaves --installed-on-request&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt; 2&amp;gt;/dev/null &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;	&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep --color&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;none -A2 &lt;span class=&#34;s2&#34;&gt;&amp;#34;==&amp;gt; [^[:space:]]\+:&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;	&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep -v -- &lt;span class=&#34;s2&#34;&gt;&amp;#34;--&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;	&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sed -e &lt;span class=&#34;s1&#34;&gt;&amp;#39;s/==&amp;gt; \(.*\):.*/maybrew &amp;#34;\1&amp;#34;/&amp;#39;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;	-e &lt;span class=&#34;s1&#34;&gt;&amp;#39;/^maybrew/!s/\(.*\)/# \1/&amp;#39;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;	&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; ruby -e &lt;span class=&#34;s1&#34;&gt;&amp;#39;lines=STDIN.each_line.to_a; (2..(lines.size - 1)).step(3){|n| puts &amp;#34;\n#{lines[n - 1]}&amp;#34;; puts lines[n]; puts lines[n - 2]}&amp;#39;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;	&amp;gt;&amp;gt; brews.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod u+x
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Once again, you&amp;rsquo;ve got a &lt;code&gt;brews.sh&lt;/code&gt; file that you can sync, and append to over time.&lt;/p&gt;
&lt;h3 id=&#34;the-three-functions&#34;&gt;The Three Functions&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;maybrew&lt;/code&gt; takes a package name as an argument and asks homebrew if it&amp;rsquo;s installed. If not, it attempts to install it. The script will die if it fails, because you&amp;rsquo;ve got bigger problems to sort out at this point.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;install_or_die&lt;/code&gt; takes a package name, and installs it or dies. called by &lt;code&gt;maybrew&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;is_installed&lt;/code&gt; performs the fastest test i could find to determine if a homebrew package is installed. This is what you&amp;rsquo;re going to want to use if you need to do post install setup.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;usage&#34;&gt;Usage&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;maybrew&lt;/p&gt;
&lt;p&gt;Just call it with the name of a package: &lt;code&gt;maybrew foo&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;install_or_die&lt;/p&gt;
&lt;p&gt;Just call it with the name of a package: &lt;code&gt;install_or_die foo&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;is_installed&lt;/p&gt;
&lt;p&gt;Use this in an if statement to test if something&amp;rsquo;s been installed. If not, install it, and perform whatever post-install things the given script needs. For example, here&amp;rsquo;s how i use it to install &lt;code&gt;fzf&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; ! is_installed &lt;span class=&#34;s2&#34;&gt;&amp;#34;fzf&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# install it&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	brew install fzf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# now do post install setup for fzf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	y &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;brew --prefix&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;/opt/fzf/install
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;-- Skipping fzf (installed already)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;an-explanation&#34;&gt;An explanation&lt;/h2&gt;
&lt;p&gt;For those of you who think those scripts look like dark magic, and would like to understand how they work, here&amp;rsquo;s a breakdown. For everone else, you can stop here. Good luck.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# DO NOT RUN THIS ONE. IT WON&amp;#39;T WORK&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# There isn&amp;#39;t a way (that i know of), to continue a line ( \ ) AND&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# have a comment before the next line.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# create a new file with a &amp;#34;shebang line&amp;#34;. Unix reads the first line&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# of the executable and if it starts with `#!` and a path it will pass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# the contents of the file to whatever executable lives at that path&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# the  `&amp;gt; brews.sh`  tells it to send the output of echo to a new file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# named brews.sh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;#!/bin/sh&amp;#39;&lt;/span&gt; &amp;gt; brews.sh&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# `brew leaves` outputs the minimal list of things to install&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# to regenerate your setup. Their dependencies will fill in the gaps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# BUT that&amp;#39;s not necessarily the list of things you specifically&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# told it to install. `--installed-on-request` should be just&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# the list of things you specifically told it to install.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew leaves --installed-on-request &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;	&lt;span class=&#34;c1&#34;&gt;# if the line has a / in it, it means its a package installed from a tap&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# and we need to run `brew tap` on them before we can install them&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# so i&amp;#39;m trying to extract the taps. This isn&amp;#39;t perfect, but it seems to work.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# `--color=none` is to compensate for anyone who has their grep configured to&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# highlight matches (like me).&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep --color&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;none &lt;span class=&#34;s2&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;	&lt;span class=&#34;c1&#34;&gt;# strips off the last slash and everything after it&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# foo/bar/baz becomes foo/bar&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# then replaces the start of the line with `brew tap`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sed -e &lt;span class=&#34;s2&#34;&gt;&amp;#34;s/\(.*\)\/.*/\1/&amp;#34;&lt;/span&gt; -e &lt;span class=&#34;s2&#34;&gt;&amp;#34;s/^/brew tap /&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;	&lt;span class=&#34;c1&#34;&gt;# sort the results and only include unique items&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sort -u &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;	&lt;span class=&#34;c1&#34;&gt;# append the output to the brews.sh file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&amp;gt;&amp;gt; brews.sh&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# `brew info` optionally takes multiple lines of input.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# If you do this it&amp;#39;s way faster than calling brew info&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# on each item that `brew leaves` returns individually.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# so that&amp;#39;s what we&amp;#39;re doing. HOWEVER this always produces&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# errors and warnings on my machine that you can&amp;#39;t do anthing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# about so `2&amp;gt;/dev/null` instructs it to take everything printed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# to Standard Error and shove it into a black hole.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew info &lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;brew leaves --installed-on-request&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt; 2&amp;gt;/dev/null &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;	&lt;span class=&#34;c1&#34;&gt;# this is a long piece of output, but we&amp;#39;re looking for the&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# lines with package names. Those can be identified by&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# the fact that they all start with this (but with the appropriate&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# package name)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# `==&amp;gt; package_name:`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# extract those lines with `grep` using a regexp that asks for&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# lines with ==&amp;gt; followed by a single space, and 1 or more non-space&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# characters and then a colon.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# we also want the 2 lines that follow.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# the first line afterwards is the short description of the package&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# the 2nd line afterwards is the url where you can find it.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# for example:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# ➜ brew info git | head -n3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# ==&amp;gt; git: stable 2.37.3 (bottled), HEAD&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# Distributed revision control system&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# https://git-scm.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep --color&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;none -A2 &lt;span class=&#34;s2&#34;&gt;&amp;#34;==&amp;gt; [^[:space:]]\+:&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;	&lt;span class=&#34;c1&#34;&gt;# each section is separated by a `--` line.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# get rid of those lines with `grep -v`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# this is problematic because shells can&amp;#39;t tell the&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# difference between an argument of -- and &amp;#34;--&amp;#34; so&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# it interprets the -- as the start of a command like&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# `--color=none` from above. So, we use a common Unix&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# idiom of passing JUST `--` which is generally interpreted&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# to designate the end of the options to the command.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# now that it knows the next thing won&amp;#39;t be an option,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# we can give it the thing we actually want it to search for &amp;#34;--&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep -v -- &lt;span class=&#34;s2&#34;&gt;&amp;#34;--&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;	&lt;span class=&#34;c1&#34;&gt;# the line with the ==&amp;gt; is the one with the command name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# perform a regular expression capture for the stuff&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# after the space and before the colon (the command name)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# then replace the line with `brew install &amp;lt;captured text&amp;gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# `\1` just means &amp;#34;the first capture group&amp;#34;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sed -e &lt;span class=&#34;s1&#34;&gt;&amp;#39;s/==&amp;gt; \(.*\):.*/brew install \1/&amp;#39;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;	&lt;span class=&#34;c1&#34;&gt;# take every line that DOES NOT start with &amp;#34;brew install&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# The `/!s/` bit is the pice that makes this magic work&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# capture the entire line, and then print out a #&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# to make it into a comment, and then the whole captured line.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	-e &lt;span class=&#34;s1&#34;&gt;&amp;#39;/^brew install/!s/\(.*\)/# \1/&amp;#39;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;	&lt;span class=&#34;c1&#34;&gt;# things are in the wrong order.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# as you can see in the `brew info git` example above, its&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# 1. command, 2. description, 3. url.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# I want the 2. description, 3. url, 1. command.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# this would probably be a nightmare in bash, so i just&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# did a ruby onliner that reads everything from Standard input&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# into an array, iterates over the array jumping 3 ahead each time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# (it&amp;#39;s always a set of 3 lines), then prints out the lines&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# in the order i want with an extra newline before the first one&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; ruby -e &lt;span class=&#34;s1&#34;&gt;&amp;#39;lines=STDIN.each_line.to_a; (2..(lines.size - 1)).step(3){|n| puts &amp;#34;\n#{lines[n - 1]}&amp;#34;; puts lines[n]; puts lines[n - 2]}&amp;#39;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;	&lt;span class=&#34;c1&#34;&gt;# append it all to the brews.sh file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&amp;gt;&amp;gt; brews.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# make the file executable.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod u+x brews.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>On the &#34;problem&#34; with AI generated art</title>
      <link>https://weblog.masukomi.org/2022/09/03/on-the-problem-with-ai-generated-art/</link>
      <pubDate>Sat, 03 Sep 2022 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2022/09/03/on-the-problem-with-ai-generated-art/</guid>
      <description>&lt;p&gt;There has been a lot of uproar about the &amp;ldquo;ethics&amp;rdquo; of AI generated art from tools like MidJourney, Stable Diffusion, and Dall-E. People talking about &amp;ldquo;theft&amp;rdquo; and &amp;ldquo;copyright infringement&amp;rdquo; and how artists should be paid for &amp;ldquo;stealing&amp;rdquo; their styles.&lt;/p&gt;
&lt;p&gt;This blog post intends to break down the ridiculousness of those claims with simple logic, and  historical counterarguments. I&amp;rsquo;ll show how the uproar is ultimately just an emotional knee-jerk reaction by people ignorant of the reality of art, illustration, and these AI systems.&lt;/p&gt;
&lt;p&gt;For context, I&amp;rsquo;m speaking as someone who owes their childhood and early adult life to the visual arts. My mother was an artist. She literally lived with, and studied under, Picasso. Her works hang in multiple museums. She taught privately, and at many colleges, including Harvard. I personally spent years as a Graphic Designer. When I wasn&amp;rsquo;t making brochures for people I was making graphic art for myself. Since then I&amp;rsquo;ve become a programmer, but I&amp;rsquo;ve never stopped thinking about art, and I am grateful for what art has done for me, including, but not limited to putting a roof over my head, and feeding me.&lt;/p&gt;
&lt;p&gt;The biggest, and most frequent argument is that artists should be paid for the &amp;ldquo;style&amp;rdquo;. This is a purely emotional reaction based in ignorance of many, many things.&lt;/p&gt;
&lt;p&gt;First, copying the style of other artists is literally the core functionality of an art student. Studying the work of those who have gone before us and succeeded is how we learn &lt;em&gt;anything&lt;/em&gt; efficiently. You want to learn how to capture light? Go study Rembrandt. Attempt to replicate his pieces until you intuitively understand the techniques he used. That is to say, learn his stuff until you can make things that look like Rembrandt made them. Want to learn another technique? Go find another artist who&amp;rsquo;s great at it and repeat. This isn&amp;rsquo;t juts good advice. This is literally what they instruct you to do at art school. It&amp;rsquo;s what every generation of artists have done.&lt;/p&gt;
&lt;p&gt;At a simpler level, think of all the kids drawing anime style art. They are literally copying the style of people who are good at the art they like. Nobody is yelling at them that they should pay Toei Animation Co., Ltd. for not only &amp;ldquo;stealing&amp;rdquo; Sailor Moon&amp;rsquo;s style. Toei isn&amp;rsquo;t coming down on them demanding money when they grow up and start making their own Anime or Manga in a similar style.&lt;/p&gt;
&lt;p&gt;As I said, the core functionality of an art student is studying other artists, learning their style, and incorporating it into their own experience and expression. This is literally what tools like Midjourney do. They study other art styles, learn from them, and learn to create new things based on what they&amp;rsquo;ve learned from &lt;em&gt;all&lt;/em&gt; the styles.&lt;/p&gt;
&lt;p&gt;Why then would this be acceptable practice for a human, but not for a computer? It&amp;rsquo;s literally the exact same thing. Is it because computers are &amp;ldquo;better&amp;rdquo; at it than humans?&lt;/p&gt;
&lt;p&gt;Saying they&amp;rsquo;re &amp;ldquo;better&amp;rdquo; at it is bullshit. For generations there have been master forgers who have not only replicated the style of master artists but their paintings down to the brush-strokes. They can do it to such a degree that the &amp;ldquo;experts&amp;rdquo; have been fooled. Mostly, they have just replicated the style of another artist meticulously, and sold &amp;ldquo;newly discoverd&amp;rdquo; paintings by them. A computer can learn more styles well than the average artist, but I assure you they&amp;rsquo;re still not &amp;ldquo;better&amp;rdquo; at replicating it than a master forger.&lt;/p&gt;
&lt;p&gt;Keep in mind that creating a master forgery is 100% legal for a human. If the forger didn&amp;rsquo;t try to claim it was someone else&amp;rsquo;s they&amp;rsquo;d be probably praised for their incredible talent. Alas, artists are paid crap, so they&amp;rsquo;re better off pretending their work is someone else&amp;rsquo;s and never receiving credit for their years of practic and incredible skill.&lt;/p&gt;
&lt;p&gt;So, again, why is this acceptable practice for a human, but not for a computer?&lt;/p&gt;
&lt;p&gt;Artists have used the best technology available to them since the beginning. The pinhole camera came into use around 300BC to trace the world. They added a lens to it in the 1500s and called it a &lt;a href=&#34;https://en.wikipedia.org/wiki/Camera_obscura&#34;&gt;Camera Obscura&lt;/a&gt;. In 1806 the &lt;a href=&#34;https://en.wikipedia.org/wiki/Camera_lucida&#34;&gt;Camera Lucida&lt;/a&gt; was invented. John W. Audubon (son of the famous Audubon) used it to reduce the size of his fathers folio of prints to a more affordable size. Literally used to copy the style, color, and everything else to the most exacting details possible at the time. None of these technologies are illegal, and no-one is yelling that they should be. If the argument is that technology shouldn&amp;rsquo;t be allowed to facilitate the replication of someone else&amp;rsquo;s style then surely these are ever more forbidden, because they are made specifically to replicate the &lt;em&gt;exact&lt;/em&gt; thing you&amp;rsquo;re looking at.&lt;/p&gt;
&lt;p&gt;The most &amp;ldquo;cogent&amp;rdquo; argument I&amp;rsquo;ve heard for why this shouldn&amp;rsquo;t be allowed is that illustrators will go out of business. This is exactly the same argument illustrators used when we started being able to print photographs. Guess what, we still have illustrators. &amp;ldquo;Ahh but this is different! because…. computers!&amp;rdquo; Just. No. Anyone who claims this doesn&amp;rsquo;t know what they&amp;rsquo;re talking about. They don&amp;rsquo;t know what it means to be a professional illustrator, and they don&amp;rsquo;t know what modern AIs are actually capable of.&lt;/p&gt;
&lt;p&gt;An illustrator is paid to convey a specific idea. They&amp;rsquo;re paid to interpret what the client is asking for, and translate that through their style or a style of the client&amp;rsquo;s choosing, into a piece of art that reflects what they asked for. Yes, clients dictate style all the time. What the client rarely considers is that they&amp;rsquo;re also hiring the artist for their experience both in knowing what kind of things work to convey the idea visuall, but in what types of things the target audience will find acceptable.&lt;/p&gt;
&lt;p&gt;As a general statement, clients have no &lt;em&gt;fucking&lt;/em&gt; clue what they need, only a vague sense of what they want, and &lt;em&gt;frequently&lt;/em&gt; ignore the advice of the expert they&amp;rsquo;ve hired to produce a useful illustration, before trying to pay them too little for their services.&lt;/p&gt;
&lt;p&gt;So, let&amp;rsquo;s take a look a the current state of the art. It&amp;rsquo;s not clear to me who generated the following but &lt;a href=&#34;https://lexica.art/prompt/99d4c030-38d4-4846-a7da-aadb5659fbe3&#34;&gt;you can find the originals here.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s look at what they asked for.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Gigantic extraterrestrial futuristic alien ship landed on the kingdom of julius caesar, roman historic works in brand new condition, not ruins, hyper-detailed, artstation trending, world renowned artists, historic artworks society, antique renewel, good contrast, realistic color, cgsociety, by greg rutkowski, gustave dore, deviantart&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And here&amp;rsquo;s what they got&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.forestry.io/res2/V_kCaVLehtNzSM5DupurFwhXjCaIxmfCoS4ZBU4J9ek/fit/512/512/sm/0/aHR0cHM6Ly9hcHAu/Zm9yZXN0cnkuaW8v/cmFpbHMvYWN0aXZl/X3N0b3JhZ2UvYmxv/YnMvZXlKZmNtRnBi/SE1pT25zaWJXVnpj/MkZuWlNJNklrSkJh/SEJDVDNkUGFWSk5Q/U0lzSW1WNGNDSTZi/blZzYkN3aWNIVnlJ/am9pWW14dllsOXBa/Q0o5ZlE9PS0tZDYz/YzczNmE5ZjEyMzEy/OWZkODFmODRmMGRi/NjRlY2M4NzJlNDIw/ZS9haV9hcnRfZXhh/bXBsZS5qcGc&#34; alt=&#34;four images mostly showing severly degraded sandstone-like structures that may have once been architecture. the last shows 2 ruins of things like the roman colleseum&#34;&gt;&lt;/p&gt;
&lt;p&gt;Things they asked for but didn&amp;rsquo;t get:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;an alien ship (giant or otherwise)&lt;/li&gt;
&lt;li&gt;roman historic works in brand new condition (frequently no roman works at all)&lt;/li&gt;
&lt;li&gt;not ruins&lt;/li&gt;
&lt;li&gt;something that looked like it was made by &amp;ldquo;gustave dore&amp;rdquo;&lt;/li&gt;
&lt;li&gt;something that looked like it was made by &amp;ldquo;greg rutkowski&amp;rdquo;&lt;/li&gt;
&lt;li&gt;realistic color&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, the digital illustrator has utterly failed to capture the design in &lt;em&gt;every meaningful way&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;It did, however, produce cool images. This is not even remotely atypical.&lt;/p&gt;
&lt;p&gt;The thing is, describing an image is exceedingly difficult. If a picture is worth &amp;ldquo;a thousand words&amp;rdquo; it&amp;rsquo;s only because we have enough shared context to understand all the implied things that are left out of those thousand. To describe an image to a computer in sufficient detail as to actually get what you&amp;rsquo;re imagining would require tens of thousands of words, because computers don&amp;rsquo;t have an understanding of what it is to be human. Furthermore, they don&amp;rsquo;t understand language… Like, at all. They&amp;rsquo;re exceptionally bad at extracting meaning. Witness the dumpster-fire of the results above. Witness the sentence &amp;ldquo;dumpster-fire&amp;rdquo; and how it doesn&amp;rsquo;t actually mean that there is a dumpster, on, or with a fire in that context.&lt;/p&gt;
&lt;p&gt;In my experience with Midjourney there are a few things you can get it to do well. Very, very, few of those things are actually directed in any meaningful way.&lt;/p&gt;
&lt;p&gt;For example, some friends of mine like turtles. I decided to try and make them a cool racing turtle. I started by asking for a turtle with exhaust pipes getting a pit stop. I got this.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.forestry.io/res2/7WLIGXlOKvcROgF7dJmeNvhzwkzEQ2nc6uS18QWus7Q/fit/512/512/sm/0/aHR0cHM6Ly9hcHAu/Zm9yZXN0cnkuaW8v/cmFpbHMvYWN0aXZl/X3N0b3JhZ2UvYmxv/YnMvZXlKZmNtRnBi/SE1pT25zaWJXVnpj/MkZuWlNJNklrSkJh/SEJDVUdOUGFWSk5Q/U0lzSW1WNGNDSTZi/blZzYkN3aWNIVnlJ/am9pWW14dllsOXBa/Q0o5ZlE9PS0tNzNh/YWQ1NjYzZmI2OWFk/NmJkMDllMWI5Njky/NWYwYWZiYmFjYWRi/Zi9haV9yYWNpbmdf/dHVydGxlLnBuZw&#34; alt=&#34;four images of vaguely turtle shaped things with smoke around them, some have weird tubes coming out, some have wheels&#34;&gt;&lt;/p&gt;
&lt;p&gt;I then tried to get a turtle that was either racing, or in a racing car. I went with a more cartooney style because it didn&amp;rsquo;t understand what a turtle was at all, and after generating nearly 400 individual images this was the best I could do.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.forestry.io/res2/lBCTqr5JJSZoYUfzUwf-jJZnBDNwm9zkRrpTxWd8EOk/fit/512/512/sm/0/aHR0cHM6Ly9hcHAu/Zm9yZXN0cnkuaW8v/cmFpbHMvYWN0aXZl/X3N0b3JhZ2UvYmxv/YnMvZXlKZmNtRnBi/SE1pT25zaWJXVnpj/MkZuWlNJNklrSkJh/SEJDVUZsUGFWSk5Q/U0lzSW1WNGNDSTZi/blZzYkN3aWNIVnlJ/am9pWW14dllsOXBa/Q0o5ZlE9PS0tNjdl/MzBjMjdjMDFkMTYx/ZjI4NTZmNzFmZjU5/ZGJiN2YxY2JmOTA1/Mi9haV9yYWNpbmdf/dHVydGxlX2ZpbmFs/LnBuZw&#34; alt=&#34;a smiling maybe-turtle drives a very cartoonish vehicle. up close there is something very wrong with its face&#34;&gt;&lt;/p&gt;
&lt;p&gt;I was however, able to get a bunny in a racing car. Midjourney is oddly good at bunnies.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.forestry.io/res2/JQXRQ53MFyb11jFWzLjAn0iyDE1bOYCsN9iNyadhJpc/fit/512/512/sm/0/aHR0cHM6Ly9hcHAu/Zm9yZXN0cnkuaW8v/cmFpbHMvYWN0aXZl/X3N0b3JhZ2UvYmxv/YnMvZXlKZmNtRnBi/SE1pT25zaWJXVnpj/MkZuWlNJNklrSkJh/SEJDVUZWUGFWSk5Q/U0lzSW1WNGNDSTZi/blZzYkN3aWNIVnlJ/am9pWW14dllsOXBa/Q0o5ZlE9PS0tNDhm/YTY4MzU3N2E0OGY1/NTQwYzgzMTBlMWQx/MjI3YTRjNTM2NzRm/NC9haV9yYWNpbmdf/YnVubnkucG5n&#34; alt=&#34;a huge, but cute, semi-realistic bunny head sits out of the drivers compartment of a cartoonish racing car with matte colors in the background hinting at buildings&#34;&gt;&lt;/p&gt;
&lt;p&gt;Overall, Midjourney is incredible. It can do amazing things, and you&amp;rsquo;ve probably seen them. For example, here are some of the things from the community feed as I write this.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.forestry.io/res2/pWTw83egfvyvODh1_uJCDclm6Ps4v4VgjDa61eoNMqo/fit/512/512/sm/0/aHR0cHM6Ly9hcHAu/Zm9yZXN0cnkuaW8v/cmFpbHMvYWN0aXZl/X3N0b3JhZ2UvYmxv/YnMvZXlKZmNtRnBi/SE1pT25zaWJXVnpj/MkZuWlNJNklrSkJh/SEJDUkRCUWFWSk5Q/U0lzSW1WNGNDSTZi/blZzYkN3aWNIVnlJ/am9pWW14dllsOXBa/Q0o5ZlE9PS0tNGUy/ZTQwYzJiNjVmM2Yy/NzA5ZDQwMTM1ZmNl/YmRjZjM3MjZkMDI2/ZS9haV9taWRqb3Vy/bmV5X2ZlZWQucG5n&#34; alt=&#34;a screenshot of some of the beautiful items on the midjourney feed&#34;&gt;&lt;/p&gt;
&lt;p&gt;What you&amp;rsquo;re not seeing is that the amazing images being shown off are the cherry-picked best-of-the-best. Your not seeing the countless horrible, distorted, inhuman attempts that it took to make them. You&amp;rsquo;re not seeing the fact that basically &lt;em&gt;none&lt;/em&gt; of these are what the person asked for. You&amp;rsquo;re not seeing that if you take the exact phrase they used, you will get something radically different.&lt;/p&gt;
&lt;p&gt;For example. In the composite image below, the large image on the left is something a community member called &lt;a href=&#34;https://www.midjourney.com/app/feed/246480551605698561/&#34;&gt;CannedGoods&lt;/a&gt; generated. &lt;a href=&#34;https://www.midjourney.com/app/jobs/70c70d2f-2b18-4e5b-b996-d6b2a0c1206a/&#34;&gt;The original is here if you&amp;rsquo;re a Midjourney user.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To the right, is what Midjourney emitted when I entered the exact same phrase they used.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;an advanced world with ethereal temples suspended in fractal clouds echoing the past, high detail, intricate Fibonacci design, epic emotional detailed cyberpunk sci-fi fantasy pre-Raphaelite art&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.forestry.io/res2/9o5LpLcTpTpQSHznms55n4zhw38CxqwrvYntposrwUs/fit/512/512/sm/0/aHR0cHM6Ly9hcHAu/Zm9yZXN0cnkuaW8v/cmFpbHMvYWN0aXZl/X3N0b3JhZ2UvYmxv/YnMvZXlKZmNtRnBi/SE1pT25zaWJXVnpj/MkZuWlNJNklrSkJh/SEJDVHpCUGFWSk5Q/U0lzSW1WNGNDSTZi/blZzYkN3aWNIVnlJ/am9pWW14dllsOXBa/Q0o5ZlE9PS0tMGFj/NjM4NGY2MjhjMWE0/YWU1OTc1NGU0ZTY0/ZmFmOWUwN2Y1MTI4/MC9haV9jb21wYXJp/c29uX2ltYWdlX2Nv/bXBvc2l0ZS5qcGc&#34; alt=&#34;5 images. to the left is some sort of tower with a circular top. you can see the light glowing around the circle and shining through its center. someone sits at its base. to the right of that are four images, mostly of stylized cities floating in or above clouds&#34;&gt;&lt;/p&gt;
&lt;p&gt;As with the prior example, what was generated isn&amp;rsquo;t what they asked for. Mine is closer to the brief, but there still aren&amp;rsquo;t &amp;ldquo;fractal cloud&amp;rdquo;, it&amp;rsquo;s not &amp;ldquo;high detail&amp;rdquo;, and it doesn&amp;rsquo;t involve &amp;ldquo;Fibonacci&amp;rdquo; in any obvious way. What&amp;rsquo;s important though is that there is &lt;em&gt;nothing replicate-able here&lt;/em&gt;. What&amp;rsquo;s generated is almost entirely random. As a general statement, you can&amp;rsquo;t get what you want.&lt;/p&gt;
&lt;p&gt;The problem of getting what you want is so bad that a business called &lt;a href=&#34;https://promptbase.com/&#34;&gt;PromptBase&lt;/a&gt; has cropped up to sell collections of keywords that will generate a particular style on a particular AI. It&amp;rsquo;s not going to help you get the &lt;em&gt;content&lt;/em&gt; you asked for, but you will help you guide it to a particular style.&lt;/p&gt;
&lt;p&gt;At this point, someone&amp;rsquo;s probably yelling about how this is what they&amp;rsquo;re talking about. They&amp;rsquo;re yelling that the artists are getting screwed, and other people are profiting from it: the AI systems, and now these people selling things to use the AI systems. This is where I have to remind them that the artists were &lt;em&gt;never&lt;/em&gt; profiting from it. The fact that there&amp;rsquo;s a computer copying their style is irrelevant. Style isn&amp;rsquo;t, and shouldn&amp;rsquo;t be, copyrightable.&lt;/p&gt;
&lt;p&gt;So, let&amp;rsquo;s address that. An artists &amp;ldquo;style&amp;rdquo; is even harder to define than &amp;ldquo;obscenity&amp;rdquo; which infamously boils down to &amp;ldquo;we&amp;rsquo;ll know it when we see it.&amp;rdquo; The idea of copyrighting &amp;ldquo;style&amp;rdquo; would be a legal nightmare that, if implemented, would functionally destroy the visual arts industry. &amp;ldquo;Style&amp;rdquo; could be defined so broadly, and an artist could have so many &amp;ldquo;styles&amp;rdquo; that you&amp;rsquo;d end up with a few people owning everything and no-one else ever being able to sell anything. You think patent-trolls are bad? Just wait. But, it also has the same problem. Just about any &amp;ldquo;style&amp;rdquo; you try and claim as your own has prior art. New &amp;ldquo;styles&amp;rdquo; are rare. Practically, even some brain-damaged idiot did decide to save the patient buy cutting of it&amp;rsquo;s head, it&amp;rsquo;s not copyrightable &lt;em&gt;now&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;And, while I&amp;rsquo;m at it, why is no-one bitching about the &amp;ldquo;theft&amp;rdquo; of written style? AI has been doing that for years and no-one gives a damn. As with visual artists, writers have been doing it since the beginning of writing.&lt;/p&gt;
&lt;p&gt;But let&amp;rsquo;s get back to the generation of images. As I said, it&amp;rsquo;s terrible at giving you exactly what you want, &lt;em&gt;unless&lt;/em&gt; what you want is to wander down a rabbit hole of imagination and see where you end up. The people in the Midjourney discord are celebrating these pieces of uncontrolled emergent beauty.&lt;/p&gt;
&lt;p&gt;For example. Midjourney went down for a few minutes while I was writing this. Today&amp;rsquo;s commnity theme is &amp;ldquo;echo&amp;rdquo;, so i created this: &amp;ldquo;echoes of a time when midjourney was down and the people found themselves with lost and wandering&amp;rdquo;. Each of these is a new piece of art, synthesized from the study of thousands of artists, processed through a system divorced from any real linguistic understanding.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.forestry.io/res2/fB4woLxZveHHi6DjQmqJNRL26qil5BOyrB4ShYoATzY/fit/512/512/sm/0/aHR0cHM6Ly9hcHAu/Zm9yZXN0cnkuaW8v/cmFpbHMvYWN0aXZl/X3N0b3JhZ2UvYmxv/YnMvZXlKZmNtRnBi/SE1pT25zaWJXVnpj/MkZuWlNJNklrSkJh/SEJDVUVWUGFWSk5Q/U0lzSW1WNGNDSTZi/blZzYkN3aWNIVnlJ/am9pWW14dllsOXBa/Q0o5ZlE9PS0tMTNi/NzZlMzk5NGMwZTlm/ODVlODU3ZTEzOWNh/ZDFjODEyNjhhZGQ3/MC9haV9pbWFnZV9l/Y2hvZXNfb2ZfYV90/aW1lLnBuZw&#34; alt=&#34;four images. the 1st shows a stylized impressionist road with a silhoutte of a person on it. another person-like shape stands to the right of the road. to the right of that is an impressionist landscape of the southwest US. bottom left is rows of people seen from behind. they stand in water and there is a blue sky with white puffy clouds. bottom right is a black and white fuzzy portrait of a womman with abstract shapes behind her. she has a gold highlight running across part of her garment&#34;&gt;&lt;/p&gt;
&lt;p&gt;These are &lt;em&gt;beautiful&lt;/em&gt; unique, heretofore unseen pieces of art. And they&amp;rsquo;re just the starting point. Each one is a road waiting to be explored. With some skill, you might even be able to guide them.&lt;/p&gt;
&lt;p&gt;To summarize:&lt;/p&gt;
&lt;p&gt;Copying style is how artist learn to do what they do. No-one &amp;ldquo;owns&amp;rdquo; their style, and attempting to make style legally copyrightable would destroy the industry. The best available technology has &lt;em&gt;always&lt;/em&gt; been used to copy the style of others. It always will be.&lt;/p&gt;
&lt;p&gt;There is no way in &lt;em&gt;hell&lt;/em&gt; that illustrators are going to go out of business as a result of AIs like Midjourney, or Dall-E, or Stable Diffusion. The systems simply aren&amp;rsquo;t capable of giving you what you ask for. If you think that&amp;rsquo;s &amp;ldquo;just around the corner&amp;rdquo;, you are showing your ignorance about how hard the computational problem of language comprehension is, and how incredibly important lived experience is to providing context even when you know the meaning of the individual words.&lt;/p&gt;
&lt;p&gt;If you are honestly concerned about the fate of illustration and want to do something to improve it, &lt;em&gt;pay an illustrator to illustrate&lt;/em&gt;. Do not complain at their prices. Do not haggle, because you don&amp;rsquo;t think it&amp;rsquo;s &amp;ldquo;worth that much&amp;rdquo;. You don&amp;rsquo;t need to have some business reason to commission them. If you like an illustrator&amp;rsquo;s work, &lt;em&gt;pay them money&lt;/em&gt; to make you some.&lt;/p&gt;
&lt;p&gt;If you are an illustrator, and still fear for your job after reading this, &lt;a href=&#34;https://masukomi.org&#34;&gt;drop me a note&lt;/a&gt;, and we can discuss it.  If you&amp;rsquo;re not an illustrator, and you&amp;rsquo;re not paying illustrators for their art, then please shut up. Your attempts to help are ignorant, and if you succeed you will screw all the arts massively. It&amp;rsquo;s hard enough to make a living as an artist without your &amp;ldquo;help&amp;rdquo;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>gh-url script to get GitHub url for a file</title>
      <link>https://weblog.masukomi.org/2022/08/15/gh_url_script/</link>
      <pubDate>Mon, 15 Aug 2022 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2022/08/15/gh_url_script/</guid>
      <description>&lt;h2 id=&#34;the-problem&#34;&gt;The Problem&lt;/h2&gt;
&lt;p&gt;For the past decade or so, I&amp;rsquo;ve noticed a trend amongst my coworkers.
When they need to look at the contents of a file that they&amp;rsquo;re not
currently editing, they will go to GitHub, and click their way down
through the folder structure until they eventually find the file they
want to see the contents of.&lt;/p&gt;
&lt;p&gt;On a related note, I believe that most of my coworkers don&amp;rsquo;t know how
to take a relative path in a repo, and tell their text editors to
open it.&lt;/p&gt;
&lt;p&gt;For example, let&amp;rsquo;s assume we&amp;rsquo;re working in the same repo, and you&amp;rsquo;ve
already got a file open in it in your editor. If I were to tell you to
open &lt;code&gt;foo/bar/baz.rb&lt;/code&gt; would you know how to tell your editor to open that
file directly, without manually clicking to open the foo and bar folders and
then clicking on the &lt;code&gt;baz.rb&lt;/code&gt; file? For most developers the answer
seems to be &amp;ldquo;no&amp;rdquo;, even though their editors can probably do it easily.&lt;/p&gt;
&lt;p&gt;So, if I need to communicate the file I want you to look at, how do I
do so in a way that makes your life as easy as possible, assuming
you&amp;rsquo;re like most devs?&lt;/p&gt;
&lt;p&gt;Easy, I give you a link to the file in GitHub. But how do &lt;em&gt;i&lt;/em&gt; easily
acquire that link?&lt;/p&gt;
&lt;h2 id=&#34;the-solution&#34;&gt;The Solution&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/masukomi/masuconfigs/blob/master/bin/gh-url&#34;&gt;gh-url&lt;/a&gt; is a script I wrote to take a given path within a repo and generate a GitHub url for it, and optionally, open it in your browser.&lt;/p&gt;
&lt;p&gt;So, for example i could say take that &lt;code&gt;foo/bar/baz.rb&lt;/code&gt; path and say
&lt;code&gt;gh-url foo/bar/baz.rb&lt;/code&gt; and it would output a link to that file in
GitHub. It takes care of making sure it links to the right branch, and
if you have multiple remotes, it asks you which one. Just run it
without any arguments to see the usage instructions.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>On GitHub Achievements</title>
      <link>https://weblog.masukomi.org/2022/06/09/on-github-achievements/</link>
      <pubDate>Thu, 09 Jun 2022 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2022/06/09/on-github-achievements/</guid>
      <description>&lt;p&gt;GitHub &lt;a href=&#34;https://github.blog/2022-06-09-introducing-achievements-recognizing-the-many-stages-of-a-developers-coding-journey/&#34;&gt;recently announced GitHub
achievements&lt;/a&gt;.
It&amp;rsquo;s a great idea, but I&amp;rsquo;m really left scratching my head by &lt;em&gt;what&lt;/em&gt; the
achievements are.&lt;/p&gt;
&lt;p&gt;The “Pull Shark” is open pull requests that have been merged. I’ve got a “4x”
version. 4x makes NO sense to me given the number of repos I’ve contributed to,
but&amp;hellip; ok. Maybe it just maxes out at 4x.&lt;/p&gt;
&lt;p&gt;That’s it, though, except for “Arctic Code Vault Contributor” which … is more
chance than anything else.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/06/10/masukomi_github_achievements-2x.png&#34; alt=&#34;a screenshot of my GitHub Achievements showing a &amp;ldquo;Pull Shark&amp;rdquo; and an &amp;ldquo;Artic
Code Vault&amp;rdquo; badge.&#34;&gt;&lt;/p&gt;
&lt;p&gt;I don’t really care that I don’t have more. BUT I can’t figure out what the eff
they’re expecting a person to do that they would use to “recogniz[e] the many
stages of a developer’s coding journey” that I haven’t done in my GitHub
account.&lt;/p&gt;
&lt;p&gt;Doubly so because &lt;a href=&#34;https://coderwall.com/&#34;&gt;Coderwall&lt;/a&gt; already did this for
GitHub profiles years ago. They give  you “achievement badges” by assigning you
to “Organizations” that represent your achievements, and then those show up as
icons in your “organizations”&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/06/10/masukomi_github_orgs-2x.png&#34; alt=&#34;a screenshot of my organizations with a few blurred out. The ones that
correspond to coderwall achievements are described below but each contain an
image of one or more animals that correspond to the
name&#34;&gt;&lt;/p&gt;
&lt;p&gt;…and they’re cool. Really well thought out. I’m having difficulty finding a full list of the Coderwall achievements, and I&amp;rsquo;m not sure this is even something they do anymore, but here’s the ones I have. I’m not suggesting they should ALL be used as GH achievements, especially not the language specific ones like “Mongoose” (see below) BUT things like the “Charity” and the “Walrus” badges? Those would be &lt;em&gt;great&lt;/em&gt; GH achievements.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lemmings 100: …have open sourced at least one original repo that’s being
watched by more than 100 devs.&lt;/li&gt;
&lt;li&gt;Charity:  …members that have forked and commited to someone’s open source
project.&lt;/li&gt;
&lt;li&gt;Opabinia: members that started social coding on GitHub within 6 months of its
first signs of life.&lt;/li&gt;
&lt;li&gt;Forked: …members that have open sourced a project valued enough to be forked
by someone else.&lt;/li&gt;
&lt;li&gt;Forked 20: members that have open sourced a project valued enough to be forked
at least 20 times.&lt;/li&gt;
&lt;li&gt;Komodo Dragon: members that have open sourced at least one original repo where
Java is the dominant language.&lt;/li&gt;
&lt;li&gt;Mongoose: members that have open sourced at least one original repo where Ruby
is the dominant language.&lt;/li&gt;
&lt;li&gt;Mongoose 3: (same as Mongoose &amp;gt; 3x)&lt;/li&gt;
&lt;li&gt;Raven: …members that have open sourced at least one original repo where some
form of shell script is the dominant language.&lt;/li&gt;
&lt;li&gt;Velociraptor: …members that have open sourced at least one original repo where
Perl is the dominant language.&lt;/li&gt;
&lt;li&gt;Walrus: …members that use at least four different languages throughout their
open source repos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I guess my thinking is that I’ve done just about everything a person could do in
GH except for having a repo used by millions BUT even on that I prolly
contributed to one at some point.  And yet, all i have is recognition for
getting a PR merged?!?!&lt;/p&gt;
&lt;p&gt;I know it sounds egotistical, and entitled, but the reality is that I&amp;rsquo;ve been using GitHub professionally and personally since roughly the time it began. Off the top of my head here are the things I&amp;rsquo;ve done in GitHub that are relevant to &amp;ldquo;the many stages of a developer&amp;rsquo;s journey&amp;rdquo;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I&amp;rsquo;ve got original and forked repos in piles of languages.&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;ve contributed to other people&amp;rsquo;s open source repos in the form of reporting issues, contributing to discussions, and submitting PRs.&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;ve taken over ownership of other people&amp;rsquo;s repos when they abandoned them.&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;ve done work in obscure languages, popular languages, and even Bash.&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;ve had a repo starred by hundreds&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;ve had repos forked my &amp;hellip; many&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;ve got repos in compiled and interpreted languages&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;ve done all the normal, and most of the rare things you can do with git.&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;ve shared my dotfiles for others&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;ve contributed to languages, frameworks, and libraries&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;ve got repos with server code and repos with client code.&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;ve made private repos public, and public repos private.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What else is there in a &amp;ldquo;coding journey&amp;rdquo; that GitHub could be aware of that I
haven&amp;rsquo;t done? I assume &amp;ldquo;YoLo&amp;rdquo; is some whimsical thing that maybe I haven&amp;rsquo;t done
but setting aside random silly / quirky achievements, the fact that the &lt;em&gt;only&lt;/em&gt;
one I&amp;rsquo;ve got is &amp;ldquo;PR Shark&amp;rdquo; makes me wonder if they actually &lt;em&gt;have&lt;/em&gt; any more than
the 3 shown on their announcement page.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How To Register an Internationalized Domain Name</title>
      <link>https://weblog.masukomi.org/2022/05/26/registering-internationalized-domain-names/</link>
      <pubDate>Thu, 26 May 2022 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2022/05/26/registering-internationalized-domain-names/</guid>
      <description>&lt;p&gt;( A guide for English speakers as of May, 2022)&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m going to assume that this isn&amp;rsquo;t terrible if you speak a language which doesn&amp;rsquo;t look anything like English. I&amp;rsquo;m going to assume that &lt;em&gt;your&lt;/em&gt; domain name registrar&amp;rsquo;s don&amp;rsquo;t have their heads up their butts.&lt;/p&gt;
&lt;p&gt;Over here in the English speaking world they&amp;rsquo;re too anglocentric to notice anything that goes on in languages that have non-ascii characters. Since you&amp;rsquo;re reading this, you probably use a lot of software that was written by American companies. This means that even if you do succeed in buying an Internationalized Domain Name (IDN) there&amp;rsquo;s a very good chance that anything you try and stick it in that isn&amp;rsquo;t a browser will reject it. Especially if you try and use it for email.&lt;/p&gt;
&lt;p&gt;If you still want to do it, the process isn&amp;rsquo;t terrible, &lt;em&gt;if&lt;/em&gt; you know how things work.&lt;/p&gt;
&lt;h2 id=&#34;key-information&#34;&gt;Key Information&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Not all Top Level Domains (TLDs) like .com, .org, and so on) allow IDNs.&lt;/li&gt;
&lt;li&gt;The companies that control each TLD, sometimes require you to specify the alphabet type you&amp;rsquo;re registering (Japanese, Chinese, etc.). As far as I can tell this is completely unnecessary but they require it anyway.&lt;/li&gt;
&lt;li&gt;Most registrars &lt;em&gt;don&amp;rsquo;t allow you to specify the character set&lt;/em&gt; so it doesn&amp;rsquo;t matter if the TLD supports it or not because you can&amp;rsquo;t register it without specifying.&lt;/li&gt;
&lt;li&gt;IDNs are an ugly hack, and aren&amp;rsquo;t actually unicode.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;finding-a-tld-that-supports-your-language&#34;&gt;Finding A TLD That Supports Your Language.&lt;/h2&gt;
&lt;p&gt;I have &lt;em&gt;no&lt;/em&gt; good advice for you here. All I can say is that &lt;em&gt;if&lt;/em&gt; you&amp;rsquo;ve seen a domain in your language, then you know you can use whatever TLD it used. Searching for this is &lt;em&gt;hard&lt;/em&gt; but the keywords you &lt;em&gt;need&lt;/em&gt; are &amp;ldquo;IDN&amp;rdquo; and &amp;ldquo;registrar&amp;rdquo;. You can &lt;em&gt;try&lt;/em&gt; searching for the domain on &lt;a href=&#34;https://gandi.net&#34;&gt;Gandi.net&lt;/a&gt; and &lt;em&gt;hope&lt;/em&gt; there&amp;rsquo;s a globe next to the TLD you want in your results. If there is, you can try specifying the language you want and it&amp;rsquo;ll either accept it or tell you it&amp;rsquo;s not allowed. If there&amp;rsquo;s no globe, the TLD may or may not support IDNs but it probably won&amp;rsquo;t work if you try to buy it there even if it does. &lt;code&gt;.com&lt;/code&gt;, for example, &lt;em&gt;does&lt;/em&gt; support IDNs &lt;em&gt;but&lt;/em&gt; has no globe, and gives you an error when you try and buy it even for languages that &lt;em&gt;are&lt;/em&gt; allowed.&lt;/p&gt;
&lt;h2 id=&#34;getting-a-punycode&#34;&gt;Getting A Punycode&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s address that last point first, because it&amp;rsquo;s critical to you being able to register an IDN. Let&amp;rsquo;s say you want to register &lt;code&gt;バター.com&lt;/code&gt; You can&amp;rsquo;t actually do it (even if no-one else has). You have to convert it to &amp;ldquo;&lt;a href=&#34;https://en.wikipedia.org/wiki/Punycode&#34;&gt;Punycode&lt;/a&gt;&amp;rdquo;. In this case the punycode is &lt;code&gt;xn--5ck7a3i.com&lt;/code&gt;. You &lt;em&gt;can&lt;/em&gt;, in theory, register that.&lt;/p&gt;
&lt;p&gt;In practice, you still can&amp;rsquo;t. At least, not with most registrars, but I&amp;rsquo;ll get to that in a minute.&lt;/p&gt;
&lt;p&gt;There are 2 ways to get your punycode:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;use a punycode converter like &lt;a href=&#34;https://www.punycoder.com/&#34;&gt;https://www.punycoder.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;just type the domain you want into Firefox. If it works, someone has it and you&amp;rsquo;ll need to think of something else. If it doesn&amp;rsquo;t it&amp;rsquo;ll give you an error message with the punycode version.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;NOTE: Do not include the TLD in the punycode conversion. So, again, if we want &lt;code&gt;バター.com&lt;/code&gt; we enter &lt;code&gt;バター&lt;/code&gt; into the converter and it gives us &lt;code&gt;xn--5ck7a3i&lt;/code&gt; then, take that and add the TLD like `.com to it.&lt;/p&gt;
&lt;p&gt;Do not even bother trying to mix character sets like this &lt;code&gt;バターสมศักดิ์&lt;/code&gt;. It&amp;rsquo;ll convert to Punycode just fine ( &lt;code&gt;xn--12c2bwb2ai8bxa6ql661a3ea9s&lt;/code&gt; ) but you&amp;rsquo;ll hit the problem of the TLD owners wanting you to specify the character set and you can&amp;rsquo;t specify more than one.&lt;/p&gt;
&lt;h2 id=&#34;registering-your-punycode-domain&#34;&gt;Registering your Punycode Domain&lt;/h2&gt;
&lt;p&gt;Ok, now you&amp;rsquo;ve got the punycode. How do you register it?&lt;/p&gt;
&lt;p&gt;In, theory, you register it just like any other domain name, &lt;em&gt;but&lt;/em&gt; as noted above, you have to indicate the character set, &lt;em&gt;or&lt;/em&gt; you have to find a registrar who can figure it out automatically and do that for you. In practice, there&amp;rsquo;s no way to know if it&amp;rsquo;ll work until you try and actually buy it.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s my experience&lt;br&gt;
( tl;dr: go to &lt;a href=&#34;https://101domain.com&#34;&gt;101domain.com&lt;/a&gt; )&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://hover.com&#34;&gt;Hover.com&lt;/a&gt; has the problem that you can&amp;rsquo;t seach for &lt;code&gt;バター.com&lt;/code&gt;. It deletes the &lt;code&gt;バター&lt;/code&gt;  part and thinks you&amp;rsquo;re searching for &lt;code&gt;com&lt;/code&gt;. If you enter &lt;code&gt;バター&lt;/code&gt; it thinks you&amp;rsquo;re searching for nothing. You &lt;em&gt;can&lt;/em&gt; search for the punycode version though. After getting past that I got &amp;ldquo;order completed&amp;rdquo; &amp;ldquo;payment rejected&amp;rdquo; and some other error I&amp;rsquo;ve forgotten at checkout. I got different, or multiple, messages / errors on each attempt. It wasn&amp;rsquo;t the payment at all. It was Hover.&lt;/p&gt;
&lt;p&gt;So I tried &lt;a href=&#34;https://gandi.net&#34;&gt;Gandi.net&lt;/a&gt;. There I noticed something interesting. For &lt;em&gt;some&lt;/em&gt; TLDs it had a globe icon which gave you a form to choose a character set when you clicked it. There wasn&amp;rsquo;t one for &lt;code&gt;.com&lt;/code&gt;, but when I tried to complete my order it give me a brief alert telling me I needed to specify the character set. It wasn&amp;rsquo;t possible with their site, but at least I had a clue what the problem was.&lt;/p&gt;
&lt;p&gt;After some googling I found &lt;a href=&#34;https://101domain.com&#34;&gt;101domain.com&lt;/a&gt;. I gave them a shot because they &lt;em&gt;also&lt;/em&gt; support Internationalized TLDs. I figured if they did that, they &lt;em&gt;must&lt;/em&gt; have a clue about the &amp;ldquo;normal&amp;rdquo; IDNs, and I was right. Even better, it handled unicode searches like &lt;code&gt;バター&lt;/code&gt;, and when I went to buy my shiny new domain they handled specifying the character set silently.&lt;/p&gt;
&lt;p&gt;They&amp;rsquo;re not my first choice is registrars for a number of reasons, but they don&amp;rsquo;t seem to be trying to scam anyone, checkout was relatively painless, and my new domain works. In 60 days I&amp;rsquo;ll try transferring it to Hover with my other domains.&lt;/p&gt;
&lt;h2 id=&#34;what-about-internationalized-tlds&#34;&gt;What about Internationalized TLDs&lt;/h2&gt;
&lt;p&gt;These exist. For example &lt;code&gt;.コム&lt;/code&gt; is a Japanese TLD. My advice, at this point in time, is to assume that these will not work anywhere &lt;em&gt;except&lt;/em&gt; the browsers. The thing is, you enter your domain name in a &lt;em&gt;lot&lt;/em&gt; of places that aren&amp;rsquo;t browsers. For example, every time you enter an email address, or paste a link in Slack.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;re going to have an even harder time finding a registrar that supports those, but if you do they&amp;rsquo;ll probably handle the other problems well.&lt;/p&gt;
&lt;p&gt;I have &lt;em&gt;no&lt;/em&gt; idea how to convert a TLD like &lt;code&gt;.コム&lt;/code&gt; to ASCII, but I assume it has to happen and that there&amp;rsquo;s a magic incantation there. If you know, contact me and I&amp;rsquo;ll update this.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>What you need to know about Mastodon</title>
      <link>https://weblog.masukomi.org/2022/05/01/what-you-need-to-know-about-mastodon/</link>
      <pubDate>Sun, 01 May 2022 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2022/05/01/what-you-need-to-know-about-mastodon/</guid>
      <description>&lt;p&gt;The goal of this post is to give you the information you&amp;rsquo;ll need to start using Mastodon before Twitter becomes even more of a dumpster fire than it currently is. It assumes that you&amp;rsquo;re familiar with Twitter and that you&amp;rsquo;d like to see if you can continue your twitter-like postings over on Mastodon.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m going to cover the following topics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;what the deal is with all the different servers / instances&lt;/li&gt;
&lt;li&gt;instances as communities&lt;/li&gt;
&lt;li&gt;moderation&lt;/li&gt;
&lt;li&gt;choosing an instance&lt;/li&gt;
&lt;li&gt;how you use Mastodon&lt;/li&gt;
&lt;li&gt;what&amp;rsquo;s different&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Before that, I&amp;rsquo;d like to recommend you watch this 6 minute intro to Mastodon. I&amp;rsquo;ll fill in the details afterwards.&lt;/p&gt;
&lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/S57uhCQBEk0&#34; title=&#34;YouTube video player&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;Ok, assuming you&amp;rsquo;ve watched that, let&amp;rsquo;s talk about the biggest mental hurdle &amp;ldquo;the servers&amp;rdquo;, why they exist, and how to choose one.&lt;/p&gt;
&lt;h2 id=&#34;the-servers--instances&#34;&gt;The Servers / Instances&lt;/h2&gt;
&lt;p&gt;Every Mastodon instance has a unique domain name (think &lt;code&gt;gmail.com&lt;/code&gt; or &lt;code&gt;hotmail.com&lt;/code&gt;) and every user has a username at that domain (think &lt;code&gt;me@gmail.com&lt;/code&gt;). And just like email, everyone can send messages to each other even if they have accounts with different domain names. &lt;code&gt;me@gmail.com&lt;/code&gt; can send an email to &lt;code&gt;you@hotmail.com&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The only difference is that Mastodon is sending tweets &amp;hellip; er &amp;ldquo;toots&amp;rdquo;, instead of email.&lt;/p&gt;
&lt;p&gt;Just like email, you have to pick an instance / domain before you can start sending messages. Just like email, &lt;a href=&#34;https://docs.joinmastodon.org/user/moving/&#34;&gt;you can move your account&lt;/a&gt;, with its history of messages to another server.&lt;/p&gt;
&lt;h2 id=&#34;instances-as-communities&#34;&gt;Instances as communities&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s where things start to diverge from email. Mastodon instances are communities. Some of them are topical. Some of them are more like Twitter, and encourage folks to talk about whatever they want.&lt;/p&gt;
&lt;p&gt;For example: I&amp;rsquo;m on one with a focus on Tabletop Role Playing Games, and another that&amp;rsquo;s for any topic, as long as it&amp;rsquo;s in Esperanto. My wife is on one that&amp;rsquo;s for anyone talking about anything.&lt;/p&gt;
&lt;p&gt;Like real world communities each one has its own set of rules about what type of things are allowed. Sometimes, the only notable thing about an instance is this social contract. For example one of the larger instances &lt;a href=&#34;https://mstdn.social&#34;&gt;mstdn.social&lt;/a&gt; isn&amp;rsquo;t topical at all. Its server rules are essentially &amp;ldquo;Don&amp;rsquo;t be a bigot, and don&amp;rsquo;t do bad things&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s really important that you check out the &amp;ldquo;server rules&amp;rdquo; before joining because they tell you &lt;em&gt;a lot&lt;/em&gt; about the values of the people on that instance.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/05/02/2022_05_01_mastodon_server_rules.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll cover what the practical effect of choosing one of these communities in the section on how you use Mastodon.&lt;/p&gt;
&lt;h2 id=&#34;moderation&#34;&gt;Moderation&lt;/h2&gt;
&lt;p&gt;The server rules are the first line of defense for keeping mastodon communities healthy, but they&amp;rsquo;re not the &lt;em&gt;only&lt;/em&gt; defense.  Every instance has at least one moderator, and they aren&amp;rsquo;t beholden to any corporate restrictions. They can, and should, boot anyone from the server that violates their social contract. No checking special wording from HQ. Just, you&amp;rsquo;re a jerk, so I&amp;rsquo;m banning you.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s another more heavy-handed defense that you&amp;rsquo;ll also see. On most instances, if you scroll down below the &amp;ldquo;server rules&amp;rdquo; you&amp;rsquo;ll see a list of servers that are being blocked outright, media that&amp;rsquo;s being filtered, and so on. More importantly, you can see the &lt;em&gt;reason&lt;/em&gt; they were blocked. That tells you a lot about the values of the moderators on that instance.&lt;/p&gt;
&lt;p&gt;Because anyone can set up a new Mastodon instance, there are a instances that gather folks who want to discuss&amp;hellip; topics most folks wouldn&amp;rsquo;t find acceptable.&lt;/p&gt;
&lt;p&gt;On Twitter you can message your favorite movie star, even if they&amp;rsquo;ve never heard of you. Mastodon is exactly the same. It&amp;rsquo;s not uncommon for an instance administrator to decide &amp;ldquo;that instance over there is almost entirely racists looking to cause trouble, so I&amp;rsquo;m going to block them to protect my community.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;As a result, Mastodon is a much &lt;em&gt;nicer&lt;/em&gt; place overall because small communities can protect themselves better than some massive company trying to enforce a &amp;ldquo;fair&amp;rdquo; set of rules.&lt;/p&gt;
&lt;h2 id=&#34;choosing-an-instance&#34;&gt;Choosing an instance&lt;/h2&gt;
&lt;p&gt;Most people start at &lt;a href=&#34;https://joinmastodon.org&#34;&gt;joinmastodon.org&lt;/a&gt;, click the &amp;ldquo;Get Started&amp;rdquo; button and look for an instance to join.&lt;/p&gt;
&lt;p&gt;This is a great start, but if you don&amp;rsquo;t find an instance you&amp;rsquo;re interested in, Google is a good option. For example, I searched for &amp;ldquo;mastodon server for ttrpg geeks&amp;rdquo; and i found a server that was precisely that.&lt;/p&gt;
&lt;p&gt;Once you find a potential server, &lt;em&gt;read their server rules&lt;/em&gt;, then click the &amp;ldquo;See What&amp;rsquo;s Happening&amp;rdquo; link. See what conversations are like, and if you&amp;rsquo;d like to be on an instance with these folks. As above, I&amp;rsquo;ll discuss the practical effects of your choice of instance in the section on how you use Mastodon.&lt;/p&gt;
&lt;p&gt;If you don&amp;rsquo;t find &lt;em&gt;any&lt;/em&gt; instances that sound like a great fit you&amp;rsquo;ve got two options. The easiest is to just find one that isn&amp;rsquo;t a &lt;em&gt;bad&lt;/em&gt; fit.&lt;/p&gt;
&lt;p&gt;The other option is to actually start up your own instance. &lt;a href=&#34;https://masto.host&#34;&gt;Masto.host&lt;/a&gt; makes this easy and using a services like theirs shouldn&amp;rsquo;t require any geeky skills. Start with the cheapest plan and upgrade as more people join. Note that you don&amp;rsquo;t have to open your instance to the public. You can restrict it to just people you invite.&lt;/p&gt;
&lt;p&gt;Side note: when you&amp;rsquo;re checking out the most popular instances you&amp;rsquo;re likely to see a &lt;em&gt;lot&lt;/em&gt; of Japanese. This is because Mastodon is &lt;em&gt;really&lt;/em&gt; popular in Japan.&lt;/p&gt;
&lt;h3 id=&#34;what-if-find-a-better-instance-later&#34;&gt;What if find a better instance later?&lt;/h3&gt;
&lt;p&gt;You can move an account between instances. Under &amp;ldquo;account&amp;rdquo; on the old instance you tell it about your new one. On the new instance you do the opposite.&lt;/p&gt;
&lt;p&gt;More importantly, you don&amp;rsquo;t have to abandon the history of things you&amp;rsquo;ve &amp;ldquo;tooted&amp;rdquo;. If you want to bring that along, it&amp;rsquo;s just a matter of exporting them from the old server and importing them into the new one. &lt;a href=&#34;https://blog.joinmastodon.org/2019/06/how-to-migrate-from-one-server-to-another/&#34;&gt;Instructions are here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;how-you-use-mastodon&#34;&gt;How you use Mastodon&lt;/h2&gt;
&lt;h3 id=&#34;sending-messages&#34;&gt;Sending Messages&lt;/h3&gt;
&lt;p&gt;If you know how to send a tweet on Twitter you know how to send a Toot on Mastodon.&lt;/p&gt;
&lt;p&gt;The mechanism is the same as Twitter. Fill in the text field. Press the button to send it. Where the button is, and how it&amp;rsquo;s labeled depends entirely on if you&amp;rsquo;re using the web site or one of the many phone clients. You can attach images, and links just like Twitter. The only notable difference is that Mastodon gives you &lt;em&gt;way&lt;/em&gt; more text per message.&lt;/p&gt;
&lt;h3 id=&#34;finding-people-to-follow&#34;&gt;Finding People to Follow&lt;/h3&gt;
&lt;p&gt;Every instance has a &amp;ldquo;local&amp;rdquo; timeline. This is where choosing an instance becomes important. The &amp;ldquo;local&amp;rdquo; timeline is all the stuff that all of those people are saying. This is where you&amp;rsquo;ll find your first people to follow. Just like when you first started Twitter.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s also a &amp;ldquo;federated&amp;rdquo; timeline.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The federated timeline is a view of all the public toots your servers knows about from across the whole network (including local ones). The most common reason that something appears in the federated timeline is that someone from your server follows the author of that toot. -  &lt;a href=&#34;https://blog.joinmastodon.org/2018/08/mastodon-quick-start-guide/&#34;&gt;joinmastodon.org&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Just like Twitter, you look for people talking about things you&amp;rsquo;re interested in and follow them. Just like Twitter you can search for hashtags.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/05/02/2022_05_01_mastodon_timelines.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Just like Twitter there are trending hashtags. Like the federated timeline, these are based on the toots your instance knows about, not &lt;em&gt;all the toots everywhere&lt;/em&gt;. So, again it&amp;rsquo;s important to try and choose an instance with like-minded folks.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2022/05/02/2022_05_01_mastodon_trending_topics.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;following-people-by-their-username&#34;&gt;Following people by their username&lt;/h3&gt;
&lt;p&gt;If you have a friend on Mastodon you just plug their username &lt;code&gt;@their_username@their_instance&lt;/code&gt; into the search field, go to their profile, and click &amp;ldquo;follow&amp;rdquo;.&lt;/p&gt;
&lt;h2 id=&#34;so-whats-different&#34;&gt;So What&amp;rsquo;s Different&lt;/h2&gt;
&lt;p&gt;There are a few notable differences.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lots more space to get your thought out:&lt;/strong&gt;&lt;br&gt;
Mastodon gives you 500 characters per toot. Twitter&amp;rsquo;s still at 280.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What you see:&lt;/strong&gt;&lt;br&gt;
There&amp;rsquo;s your personal timeline (usually labeled &amp;ldquo;Home&amp;rdquo;). There&amp;rsquo;s the local timeline, and there&amp;rsquo;s the federated timeline. Your personal timeline is conceptually exactly the same as what you normally see on Twitter. The &amp;ldquo;federated&amp;rdquo; timeline is more restricted than Twitter&amp;rsquo;s because it&amp;rsquo;s just not possible to show you &lt;em&gt;everything&lt;/em&gt;. Of course, Twitter&amp;rsquo;s not showing you &amp;ldquo;everything&amp;rdquo; either.  And of course, the local timeline I discussed above.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Who sees your messages:&lt;/strong&gt;&lt;br&gt;
On twitter everyone can theoretically see what you post, but in practice only the people following you are likely to.  On Mastodon there&amp;rsquo;s a &lt;em&gt;very&lt;/em&gt; good chance that &lt;em&gt;many&lt;/em&gt; of the people on the &amp;ldquo;local&amp;rdquo; timeline will see what you post. So, when you&amp;rsquo;re getting started it&amp;rsquo;s not like you&amp;rsquo;re just shouting into a void.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The instance is costing someone money&lt;/strong&gt;&lt;br&gt;
Twitter pays for itself by showing you ads. There&amp;rsquo;s no advertising on Mastodon, so &lt;em&gt;someone&lt;/em&gt; is paying to host the instance. On instances with a lot of people this can be hundreds or thousands of dollars a month. Even on smaller instances it can be expensive.  So, when your server administrators ask for donations, or sets up a Patreon, you should definitely consider helping them out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;No Quote Tweets&lt;/strong&gt;&lt;br&gt;
I really miss Quote Tweeting. There were so many things I found that I wanted to share with a tiny bit of added commentary. The problem is that this feature regularly gets used for abuse and the spreading of flame wars on Twitter. So, the Mastodon devs have decided to not do it. &lt;a href=&#34;https://github.com/mastodon/mastodon/issues/309&#34;&gt;There&amp;rsquo;s a long GitHub thread discussing it here&lt;/a&gt;, if you care.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Discovery Is Harder&lt;/strong&gt;&lt;br&gt;
Logically, it shouldn&amp;rsquo;t be. None of us see &lt;em&gt;all&lt;/em&gt; the Tweets on Twitter. We see the tweets of folks we follow, and the stuff they retweet. I &lt;em&gt;think&lt;/em&gt; the problem is that most of the people with name recognition, or significant followings, just haven&amp;rsquo;t embraced the Fediverse yet. I discovered a lot of cool people, by seeing retweets from people I respect, and then seeing what other things that person had to say.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s a &amp;ldquo;chicken and egg&amp;rdquo; problem. People with notable followings don&amp;rsquo;t want to loose their audience, so they don&amp;rsquo;t try embracing a tool where they have no audience. As a result, we don&amp;rsquo;t have many of those human social hubs, sharing interesting things from many people. So we don&amp;rsquo;t have as many opportunities to discover random interesting people.&lt;/p&gt;
&lt;p&gt;The local and federated timelines help a lot, but right now (2022) the Fediverse isn&amp;rsquo;t nearly as active as Twitter.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Network Effect is Real&lt;/strong&gt;&lt;br&gt;
As noted in the last section, the Fediverse, at least in the US, isn&amp;rsquo;t nearly as active as Twitter. People don&amp;rsquo;t want to move to a place where they don&amp;rsquo;t know anyone. People &lt;em&gt;want&lt;/em&gt; others to hear what they have to say. People with something to sell need to talk about it &lt;em&gt;where there are listeners&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The Fediverse is also &lt;em&gt;very&lt;/em&gt; resistant to paid advertising, by design. There&amp;rsquo;s nowhere a big company can go and spend thousands of dollars to put their ad in front of millions of people. So you&amp;rsquo;ve got no major companies shouting &amp;ldquo;Follow us on Mastodon!&amp;rdquo; I really hate ads, but I have to admit that things like that help drive awareness.&lt;/p&gt;
&lt;h2 id=&#34;in-conclusion&#34;&gt;In Conclusion&lt;/h2&gt;
&lt;p&gt;Using Mastodon is very similar to Twitter. The most significant difference is that you need to try and find an instance that&amp;rsquo;s a good fit for you. This is, admittedly, a big hurdle for new people, but it&amp;rsquo;s the key to Mastodon not being a dumpster-fire. Each instance is responsible for its own social contract, and moderation.&lt;/p&gt;
&lt;p&gt;There are a lot of technical and ease-of-use advantages to centralized systems like Twitter and Facebook, but as we&amp;rsquo;ve all seen, they&amp;rsquo;re incapable of &lt;em&gt;good&lt;/em&gt; moderation, and what moderation they do practice is &lt;em&gt;very&lt;/em&gt; unevenly implemented. Mastodon&amp;rsquo;s solution isn&amp;rsquo;t perfect, but it&amp;rsquo;s &lt;em&gt;way&lt;/em&gt; better.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Splitting an org-roam collection</title>
      <link>https://weblog.masukomi.org/2022/01/28/splitting-an-org-roam-collection/</link>
      <pubDate>Fri, 28 Jan 2022 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2022/01/28/splitting-an-org-roam-collection/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://www.orgroam.com/manual.html#How-do-I-have-more-than-one-Org_002droam-directory_003f&#34;&gt;org-roam supports multiple directories&lt;/a&gt; and it should work fine if you &lt;em&gt;start&lt;/em&gt; that way, but if you&amp;rsquo;ve already got an org-roam project that you need to split up, it&amp;rsquo;s a pain in the butt.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s how I managed to divide my org-roam project into multiple directories after much trial and error and googling.&lt;/p&gt;
&lt;p&gt;A note before continuing: If you&amp;rsquo;re googling around for this you&amp;rsquo;re going to find a bunch of old commands from when people were upgrading from v1 to v2. Many of these won&amp;rsquo;t work because their names have been changed.&lt;/p&gt;
&lt;h2 id=&#34;step-1-config-cleanup&#34;&gt;Step 1 config cleanup&lt;/h2&gt;
&lt;p&gt;Remove these from your &lt;code&gt;init.el&lt;/code&gt; (&lt;code&gt;config.el&lt;/code&gt; in doom emacs)&lt;/p&gt;
&lt;pre style=&#34;color: #FDF4C1; background-color: #282828;&#34;&gt;
&lt;span style=&#34;color: #5C7E81; background-color: #30434C;&#34;&gt; (&lt;/span&gt;&lt;span style=&#34;color: #DD6F48; background-color: #30434C;&#34;&gt;setq&lt;/span&gt;&lt;span style=&#34;background-color: #30434C;&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color: #83A598; background-color: #30434C;&#34;&gt;org-roam-directory&lt;/span&gt;&lt;span style=&#34;background-color: #30434C;&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color: #837486; background-color: #30434C;&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #A89984; background-color: #30434C;&#34;&gt;file-truename&lt;/span&gt;&lt;span style=&#34;background-color: #30434C;&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color: #528B8B; background-color: #30434C;&#34;&gt;&#34;~/Documents/org-roam&#34;&lt;/span&gt;&lt;span style=&#34;color: #837486; background-color: #30434C;&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color: #5C7E81; background-color: #30434C;&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;background-color: #30434C;&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color: #5C7E81; background-color: #30434C;&#34;&gt; (&lt;/span&gt;&lt;span style=&#34;color: #83A598; background-color: #30434C;&#34;&gt;org-roam-db-autosync-mode&lt;/span&gt;&lt;span style=&#34;color: #5C7E81; background-color: #30434C;&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;background-color: #30434C;&#34;&gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Setting a default org-roam-directory is just going to cause you headaches and accidentally writing to the wrong place. Leaving the autosync in there will just cause errors when you load.&lt;/p&gt;
&lt;h2 id=&#34;step-2-dir-localsel&#34;&gt;Step 2 .dir-locals.el&lt;/h2&gt;
&lt;p&gt;create a &lt;code&gt;.dir-locals.el&lt;/code&gt; file with contents like this. It should be in the directory specified by &lt;code&gt;org-roam-directory&lt;/code&gt;&lt;/p&gt;
&lt;pre style=&#34;color: #FDF4C1; background-color: #282828;&#34;&gt;
&lt;span style=&#34;color: #5C7E81; background-color: #30434C;&#34;&gt; (&lt;/span&gt;&lt;span style=&#34;color: #837486; background-color: #30434C;&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;background-color: #30434C;&#34;&gt;nil . &lt;/span&gt;&lt;span style=&#34;color: #9C6F68; background-color: #30434C;&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #7B665C; background-color: #30434C;&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #83A598; background-color: #30434C;&#34;&gt;org-roam-directory&lt;/span&gt;&lt;span style=&#34;background-color: #30434C;&#34;&gt; . &lt;/span&gt;&lt;span style=&#34;color: #528B8B; background-color: #30434C;&#34;&gt;&#34;/absolute/path/to/project&#34;&lt;/span&gt;&lt;span style=&#34;color: #7B665C; background-color: #30434C;&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;background-color: #30434C;&#34;&gt;
 &amp;#9474;        &lt;/span&gt;&lt;span style=&#34;color: #7B665C; background-color: #30434C;&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #83A598; background-color: #30434C;&#34;&gt;org-roam-db-location&lt;/span&gt;&lt;span style=&#34;background-color: #30434C;&#34;&gt; . &lt;/span&gt;&lt;span style=&#34;color: #528B8B; background-color: #30434C;&#34;&gt;&#34;/absolute/path/to/project/org-roam.db&#34;&lt;/span&gt;&lt;span style=&#34;color: #7B665C; background-color: #30434C;&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color: #9C6F68; background-color: #30434C;&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color: #837486; background-color: #30434C;&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color: #5C7E81; background-color: #30434C;&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;background-color: #30434C;&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color: #5C7E81; background-color: #30434C;&#34;&gt; (&lt;/span&gt;&lt;span style=&#34;color: #83A598; background-color: #30434C;&#34;&gt;org-roam-db-autosync-mode&lt;/span&gt;&lt;span style=&#34;color: #5C7E81; background-color: #30434C;&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;background-color: #30434C;&#34;&gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Warning: emacs doesn&amp;rsquo;t actually read this file until you open something in the same directory or one of the subdirectories. This means that until you do that &lt;code&gt;org-roam-directory&lt;/code&gt; is either unset, or set to whatever it was last.&lt;/p&gt;
&lt;p&gt;So, always start an org-roam editing session by opening one of the files in the project.&lt;/p&gt;
&lt;h2 id=&#34;step-3&#34;&gt;Step 3&lt;/h2&gt;
&lt;p&gt;Copy over the subset of files that you want to be part of this project into the directory alongside the &lt;code&gt;.dir-locals.el&lt;/code&gt; (dailies should be in a &lt;code&gt;dailies&lt;/code&gt; subfolder).&lt;/p&gt;
&lt;p&gt;Make sure you do not have the &lt;code&gt;*.db&lt;/code&gt; file from the original project.&lt;/p&gt;
&lt;h2 id=&#34;step-4&#34;&gt;Step 4&lt;/h2&gt;
&lt;p&gt;Open &lt;em&gt;every single one of those files&lt;/em&gt;. I tried every relevant command I could find that didn&amp;rsquo;t invole doing this. None worked.&lt;/p&gt;
&lt;p&gt;Evaluate &lt;code&gt;(org-roam-db-sync)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;If you get errors about uniqueness constraint then run the following&lt;/p&gt;
&lt;p&gt;&lt;code&gt;(org-id-update-id-locations (org-roam-list-files))&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Then re-evaluate &lt;code&gt;(org-roam-db-sync)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;No, I have &lt;em&gt;no&lt;/em&gt; idea how it&amp;rsquo;s possible that the &lt;em&gt;brand new&lt;/em&gt; sqlite database could possibly have uniqueness constraints but somehow this is a thing that happens.&lt;/p&gt;
&lt;h2 id=&#34;step-5&#34;&gt;Step 5&lt;/h2&gt;
&lt;p&gt;Wonder if maybe you should be using &lt;a href=&#34;https://github.com/akirak/org-multi-wiki#readme&#34;&gt;org-multi-wiki&lt;/a&gt; instead. I know I am&amp;hellip;&lt;/p&gt;
&lt;h1 id=&#34;months-later&#34;&gt;Months Later&amp;hellip;&lt;/h1&gt;
&lt;p&gt;I really wanted to like org-roam. The pitch is great, but I just kept
having database related problems.&lt;/p&gt;
&lt;p&gt;In the end I switched to
&lt;a href=&#34;https://protesilaos.com/emacs/denote&#34;&gt;Denote&lt;/a&gt; and have been &lt;em&gt;very&lt;/em&gt;
happy every since. He&amp;rsquo;s taken a unix style approach of using
simple, proven, filesystem based tools, and making something really
useful by combining them. Because of what it&amp;rsquo;s based on it &amp;ldquo;just
works&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://youtu.be/mLzFJcLpDFI&#34;&gt;Check out the author&amp;rsquo;s intro video on YouTube&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If org-roam is working for you, then stick with it. If it starts
giving you headaches like it did me, then definitely check out Denote.
I think it solves the same problem in a much simpler, and more
reliable way.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>You&#39;ve been lied to about the newline character</title>
      <link>https://weblog.masukomi.org/2021/06/15/youve-been-lied-to-about-newline/</link>
      <pubDate>Tue, 15 Jun 2021 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2021/06/15/youve-been-lied-to-about-newline/</guid>
      <description>&lt;h1 id=&#34;youve-been-lied-to-about-the-newline-character&#34;&gt;You&amp;rsquo;ve been lied to about the Newline Character&lt;/h1&gt;
&lt;p&gt;The humble newline character: &lt;code&gt;\n&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ve seen it in countless code examples. Usually something like&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;foo\n
bar\n
\n
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You look at that and probably think, it represents the end of a line. Or maybe you think it represents the start of a line. If you believe either of those things, I&amp;rsquo;m sorry to inform you that you&amp;rsquo;re wrong.&lt;/p&gt;
&lt;p&gt;Fortunately, by the end of this post you&amp;rsquo;ll have a much better mental model of &lt;code&gt;\n&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Please note that this post is &lt;em&gt;extremely pedantic&lt;/em&gt;, but so are computers, and in this case it actually makes a practical difference. You&amp;rsquo;ll need to set aside your language training, and what it means &lt;em&gt;to you&lt;/em&gt;, and think like an incredibly &lt;em&gt;dumb&lt;/em&gt; and &lt;em&gt;excessively pedantic&lt;/em&gt; computer. That&amp;rsquo;s what we&amp;rsquo;re giving instructions to as programmers, and that&amp;rsquo;s where this becomes relevant.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The only accurate way to think about &lt;code&gt;\n&lt;/code&gt; is as the &lt;em&gt;boundary&lt;/em&gt; between two lines. It &lt;em&gt;exclusively&lt;/em&gt; marks the ending of one line, and the beginning of another.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When you open your text editor you see&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;foo
bar
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;but that&amp;rsquo;s not what&amp;rsquo;s actually stored. The file is a stream of characters: &lt;code&gt;foo\nbar\n&lt;/code&gt;. The &lt;code&gt;\n&lt;/code&gt; marks the boundary between &amp;ldquo;lines&amp;rdquo; that don&amp;rsquo;t actually exist.  There&amp;rsquo;s also an end of file character but we can ignore that here.&lt;/p&gt;
&lt;p&gt;So, let&amp;rsquo;s logic this out. Our &lt;a href=&#34;https://en.wikipedia.org/wiki/Ground_truth&#34;&gt;ground truth&lt;/a&gt; is the fact that &lt;code&gt;foo&lt;/code&gt; with no &lt;code&gt;\n&lt;/code&gt; is a perfectly valid line. If &lt;code&gt;\n&lt;/code&gt; indicated the start of a new line then 2 things must be true:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;lines must start with &lt;code&gt;\n&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;foo&lt;/code&gt; must represent either the middle or end of a line, but not the start or entirety of one.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Since we know that &lt;code&gt;foo&lt;/code&gt; is a valid line then both of those must be false.  You could argue that computers are making a special exception for the start of a file and have special handling for that situation, but they don&amp;rsquo;t &lt;em&gt;and&lt;/em&gt; that would be way more work than just treating it as a boundary indicator.&lt;/p&gt;
&lt;p&gt;If &lt;code&gt;\n&lt;/code&gt; indicates the end of a line then the following must be true:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;lines must end with &lt;code&gt;\n&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;foo&lt;/code&gt; must represent the start or middle of a line, but not the end or entirety of one.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Again, both statements are false.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s also a simple tool to prove that it &lt;em&gt;must&lt;/em&gt; be a boundary: the &lt;code&gt;split&lt;/code&gt; function. Before we explore that, I want you to think about &amp;ldquo;splitting&amp;rdquo; a piece of paper. If you make one cut through a piece of paper you end up with two pieces of paper. Cut it again, and you get three. You always end up with &lt;code&gt;cuts + 1&lt;/code&gt; pieces of paper. &amp;ldquo;Splitting&amp;rdquo; a string is the same, or it should be. Some languages have inconsistent behavior around &lt;code&gt;\n&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re going to be working with &lt;code&gt;foo\nbar\n\n&lt;/code&gt; which most code examples would show you on 3 lines like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;foo\n
bar\n
\n
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;While the &lt;em&gt;intent&lt;/em&gt; of the &lt;code&gt;\n&lt;/code&gt; character may have been to indicate the start of a line (technically it was used to move a print head down a &amp;ldquo;line&amp;rdquo; worth of distance), what we actually recorded was a &lt;em&gt;boundary&lt;/em&gt; indicator. You see, the above isn&amp;rsquo;t 3 lines. It&amp;rsquo;s 4, and here&amp;rsquo;s the proof.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;iex(1)&amp;gt; String.split(&amp;quot;foo\nbar\n\n&amp;quot;, &amp;quot;\n&amp;quot;)
[&amp;quot;foo&amp;quot;, &amp;quot;bar&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here our string is split on &lt;code&gt;\n&lt;/code&gt; into &lt;code&gt;n+1&lt;/code&gt; elements, just like our hypothetical paper. Personally I find it easier to visualize like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;foo|bar||
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The line is a piece of paper and each &lt;code&gt;|&lt;/code&gt; is where I&amp;rsquo;m going to cut with my scissors. Elixir split that string exactly as you&amp;rsquo;d expect, and gives us four elements.&lt;/p&gt;
&lt;p&gt;One of my coworkers (paraphrased) asked how you would differentiate &lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt; from &lt;code&gt;&amp;quot;\n&amp;quot;&lt;/code&gt;, and &lt;code&gt;&amp;quot;\n\n&amp;quot;&lt;/code&gt; if it didn&amp;rsquo;t do that?&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;iex(1)&amp;gt; String.split(&amp;quot;&amp;quot;, &amp;quot;\n&amp;quot;)
[&amp;quot;&amp;quot;]
iex(2)&amp;gt; String.split(&amp;quot;\n&amp;quot;, &amp;quot;\n&amp;quot;)
[&amp;quot;&amp;quot;, &amp;quot;&amp;quot;]
iex(3)&amp;gt; String.split(&amp;quot;\n\n&amp;quot;, &amp;quot;\n&amp;quot;)
[&amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Each &lt;code&gt;\n&lt;/code&gt; in the initial string is an indicator of where to cut. No cuts and you still have the whole paper. One cut, and you have two pieces, and so on.&lt;/p&gt;
&lt;p&gt;IF &lt;code&gt;\n&lt;/code&gt; were truly a start of line (&amp;ldquo;new line&amp;rdquo;) character then  &lt;code&gt;String.split(&amp;quot;\nfoo&amp;quot;, &amp;quot;\n&amp;quot;)&lt;/code&gt; should result in 1 line, because the &lt;code&gt;\n&lt;/code&gt; would mean &amp;ldquo;start a line&amp;rdquo;, and there&amp;rsquo;s no second line started  with another &lt;code&gt;\n&lt;/code&gt;. Thus we have &lt;code&gt;[explicit begin character]foo[implicit end]&lt;/code&gt; which gives us only one line. Splitting on &lt;code&gt;\n&lt;/code&gt; in that string gives us &lt;code&gt;[&amp;quot;&amp;quot;, &amp;quot;foo&amp;quot;]&lt;/code&gt; thus proving it&amp;rsquo;s &lt;em&gt;not&lt;/em&gt; an indicator of a line&amp;rsquo;s start. Or at least, the computer doesn&amp;rsquo;t think of it as one.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s the key here. It&amp;rsquo;s irrelevant what &lt;em&gt;you or I&lt;/em&gt; think it should represent. What&amp;rsquo;s important, is what it represents &lt;em&gt;to the computer.&lt;/em&gt; To the computer, there is no situation in which &lt;code&gt;\n&lt;/code&gt; exists &lt;em&gt;and&lt;/em&gt; there is only one &amp;ldquo;line&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re dealing with a legacy term from a time when computers had no screens, that was brought to us by a special gearing from the bar you slapped on a typewriter to shift a roller sideways and rotate it &amp;ldquo;one line&amp;rdquo; worth of distance. The &amp;ldquo;new line&amp;rdquo; term has persisted, but no longer reflects what&amp;rsquo;s actually happening.&lt;/p&gt;
&lt;p&gt;--&lt;/p&gt;
&lt;p&gt;All of this came about because of very real bug in code I wrote to parse request headers. I knew how to fix the bug, but I couldn&amp;rsquo;t understand &lt;em&gt;why&lt;/em&gt; it was a bug in the first place. This was because I kept stubbornly, and incorrectly, thinking that the following was only three lines, because I&amp;rsquo;ve always treated it as an &amp;ldquo;end of line&amp;rdquo; character.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;foo\n
bar\n
\n
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The most obvious practical takeaway is that splitting a string, by any means is suddenly going to match up with your expectations if you think of it as a boundary character instead of a &amp;ldquo;new line&amp;rdquo; character.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Trollphabet</title>
      <link>https://weblog.masukomi.org/2021/02/23/trollphabet/</link>
      <pubDate>Tue, 23 Feb 2021 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2021/02/23/trollphabet/</guid>
      <description>&lt;p&gt;Once upon a time a group of friends gathered at a restaurant. We passed the time trying to devise the worst phonetic alphabet. One that, when &lt;strong&gt;heard&lt;/strong&gt;, would do the best possible job of not successfully conveying the letters you were trying to communicate. This is what we came up with.&lt;/p&gt;
&lt;p&gt;A aye&lt;br&gt;
B bdellium (the b is silent)&lt;br&gt;
C cent&lt;br&gt;
D djin&lt;br&gt;
E eye&lt;br&gt;
F fore&lt;br&gt;
G gnu&lt;br&gt;
H heir&lt;br&gt;
I I&lt;br&gt;
J jicama&lt;br&gt;
K know&lt;br&gt;
L like&lt;br&gt;
M  mnemosyne&lt;br&gt;
N no&lt;br&gt;
O oops&lt;br&gt;
P psalm&lt;br&gt;
Q quatar (pronounced kutter)&lt;br&gt;
R really&lt;br&gt;
S sea&lt;br&gt;
T two&lt;br&gt;
U umm&lt;br&gt;
V varies&lt;br&gt;
W why&lt;br&gt;
X xenomorph&lt;br&gt;
Y Yes&lt;br&gt;
Z zero&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example Usage&lt;/strong&gt; (Say these out loud)&lt;strong&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;no: &amp;ldquo;no oops&amp;rdquo;&lt;/li&gt;
&lt;li&gt;hair: &amp;ldquo;heir aye i really&amp;rdquo;&lt;/li&gt;
&lt;li&gt;salmon: &amp;ldquo;sea aye like mnomosyne oops no&amp;rdquo;&lt;/li&gt;
&lt;li&gt;rowan oak: &amp;ldquo;really ooops why eye no oops aye know&amp;rdquo;&lt;/li&gt;
&lt;li&gt;aisle: &amp;ldquo;aye i sea like eye&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Some of us need bigger text</title>
      <link>https://weblog.masukomi.org/2020/12/04/some-of-us-need-bigger-text/</link>
      <pubDate>Fri, 04 Dec 2020 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2020/12/04/some-of-us-need-bigger-text/</guid>
      <description>&lt;p&gt;That sounds pretty obvious. It &lt;em&gt;is&lt;/em&gt; pretty obvious. Anyone with &lt;em&gt;any&lt;/em&gt; familiarity with older humans knows that they generally have trouble reading small text, or making out fine details. Every drug store has a rack of magnifying glasses. Everyone&amp;rsquo;s seen an older person doing the thing where they lift up their bifocals and start moving a thing closer and farther with their arm trying to find a spot where it both large enough to be readable but far away enough to be in focus. They&amp;rsquo;re not the only ones who need bigger text, of course, but they are the ones &lt;em&gt;everyone&lt;/em&gt; should be familiar with, and likely has in their lives.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m bothering to tell you this, because you, my young friend, with your 20/20 vision, or something close, are building the web sites that I attempt to read, and you&amp;rsquo;ve forgotten to consider that not everyone has your beautiful and capable eyes.&lt;/p&gt;
&lt;p&gt;This post is to give you a glimpse of what the internet looks like for us, &amp;amp; to teach you how to easily see it. Actually &lt;em&gt;fixing&lt;/em&gt; the problem is usually quite easy once you can see it. This post &lt;em&gt;won&amp;rsquo;t&lt;/em&gt; be addressing the things you need to do to help users with screen readers, &lt;em&gt;but&lt;/em&gt; the techniques I do discuss will help many people who are functionally and legally &amp;ldquo;blind&amp;rdquo; but still make use of their screens.&lt;/p&gt;
&lt;h2 id=&#34;whats-the-problem&#34;&gt;What&amp;rsquo;s the problem&lt;/h2&gt;
&lt;p&gt;There are 2 parts to this problem.&lt;/p&gt;
&lt;h3 id=&#34;the-fundamental-misunderstanding&#34;&gt;The Fundamental Misunderstanding&lt;/h3&gt;
&lt;p&gt;The biggest, is the fundamental fallacy that the web designer has the final say on how a web page is displayed. They don&amp;rsquo;t, and this is a good thing. If you choose teeny tiny fonts that look beautiful to you, I can&amp;rsquo;t read them. If you choose a font with very thin lines, I&amp;rsquo;m going to still be squinting even when I increase the size. &lt;em&gt;However&lt;/em&gt; on the web, the &lt;em&gt;reader&lt;/em&gt; has the final say over fonts. &lt;em&gt;We&lt;/em&gt; can say &amp;ldquo;oh, I need it bigger&amp;rdquo;, or &amp;ldquo;I like it smaller&amp;rdquo;, or &amp;ldquo;I need a font that helps with my dyslexia&amp;rdquo;. Whatever is comfortable &lt;em&gt;for you&lt;/em&gt; is going to be unreadable by &lt;em&gt;some&lt;/em&gt; of your visitors, and that&amp;rsquo;s ok.&lt;/p&gt;
&lt;h3 id=&#34;the-design-problem&#34;&gt;The Design Problem&lt;/h3&gt;
&lt;p&gt;Almost every time I encounter this problem it is the result of a designer trying to put text in a box, but not allowing that box to grow to fit the content. The &amp;ldquo;box&amp;rdquo; can take many forms, and is frequently invisible. Sometimes designers allow the boxes to grow to fit the text, but then don&amp;rsquo;t allow them to re-flow, so they start overlapping each other, or slide off the edge of the screen instead of moving down the page.&lt;/p&gt;
&lt;p&gt;Also, I need to specifically call out graphing libraries. Graphing libraries, in general, are terrible about how they handle the text in labels. They fail when it&amp;rsquo;s too big, or when there&amp;rsquo;s too much of it. Those same failing result in a product that&amp;rsquo;s very hostile to people with accessibility needs. In many cases it&amp;rsquo;s better to just make an image. We can zoom that. Yes, it&amp;rsquo;ll be terrible for totally blind folks, but most of the time your graph was completely unusable to them anyway.&lt;/p&gt;
&lt;h4 id=&#34;some-examples&#34;&gt;Some examples:&lt;/h4&gt;
&lt;p&gt;I count at least 8 different errors in Amazon&amp;rsquo;s Navigation Bar right now.  We&amp;rsquo;ve got forced box size, poorly handled overflow, assumptions about how tall a font is, and more.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2020/12/04/amazon_nav.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a pretty typical example of not allowing a box to resize from the &lt;a href=&#34;https://2020.stateofcss.com&#34;&gt;State of CSS 2020&lt;/a&gt; web site. In these situations odds seem even that stuff will either be poking out the side like this, or just cut off and unreadable.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2020/12/04/state_of_css_menu_overflow_shorter.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;From the same site, we have an example of forcing a font size. You can see that regardless of what text size you need (big or small), the graph is imposing its own ideas on what is the &amp;ldquo;correct&amp;rdquo; size.  The text above the graph, in both images, is the size the browser has been told to render text as. This means that the graph library is likely also overriding the designer&amp;rsquo;s choice of &amp;ldquo;correct&amp;rdquo; size for the page&amp;rsquo;s text.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2020/12/04/forced_font_size.png&#34; alt=&#34;the text above the graph is large, but the graph labels are not&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2020/12/04/forced_font_size_small.png&#34; alt=&#34;the text above the bar graph is teeny, but the graph labels are not&#34;&gt;&lt;/p&gt;
&lt;p&gt;The color key in this graph is detached from the normal &amp;ldquo;flow&amp;rdquo; of the text and didn&amp;rsquo;t shift over as the text beside it increased in size.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2020/12/04/graph_key.png&#34; alt=&#34;a graph key with numbers overlapping colored boxes, hampering readability&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;how-to-see-what-we-see&#34;&gt;How to See What We See&lt;/h2&gt;
&lt;p&gt;&amp;ldquo;Zoom&amp;rdquo; is the enemy. Zoom, in its most common form, changes nothing. Your layout looks just as great &amp;ldquo;zoomed&amp;rdquo; as it does at the size you designed it at. This is because &amp;ldquo;zooming&amp;rdquo; the page is like taking a magnifying glass to it. It&amp;rsquo;s great for extremely low vision folks, but In the end it doesn&amp;rsquo;t meaningfully alter anything about it, and makes your stuff so big that much of it falls off the side of my screen.&lt;/p&gt;
&lt;p&gt;Many of us don&amp;rsquo;t want or need your images zoomed. For example: imagine an image of someone holding their credit card out to a store clerk. I don&amp;rsquo;t need to be able to read the numbers on the card to know that that&amp;rsquo;s what they&amp;rsquo;re holding. I can extract all the relevant info from the picture without zooming &amp;ldquo;oh, it&amp;rsquo;s an example someone buying something in a store&amp;rdquo;. Similarly, I don&amp;rsquo;t want my monitor filled with your &amp;ldquo;hero image&amp;rdquo; when I came to read your text.&lt;/p&gt;
&lt;p&gt;When a browser forces me to zoom to read the text it also forces me to work in a mode designed for &lt;em&gt;incredibly&lt;/em&gt; low vision people (think &amp;ldquo;legally blind&amp;rdquo;). It&amp;rsquo;s great that that&amp;rsquo;s an option for them, but I just need to not squint at your text.&lt;/p&gt;
&lt;p&gt;Here are the settings in Firefox, Chrome, and Safari. Note the &amp;ldquo;Zoom Text Only&amp;rdquo; checkbox in Firefox. Chrome doesn&amp;rsquo;t have this.* This is going to make your life, and mine, &lt;em&gt;much easier&lt;/em&gt;. Check this in Firefox can now whack Command &lt;code&gt;+&lt;/code&gt;  (or Control &lt;code&gt;+&lt;/code&gt; on Windows) a bunch to see what your page looks like with a fat font, and then Command + &lt;code&gt;0&lt;/code&gt; to reset it. In Chrome and Safari Zoom will &lt;em&gt;only&lt;/em&gt; magnify the whole page. Sadly Safari has no obvious way to set a default font size, only a minimum.  If you want to zoom text only in Safari you have to hold down the option key, and click on the &amp;ldquo;View&amp;rdquo; menu. Then you will see &amp;ldquo;Make text bigger&amp;rdquo; instead of &amp;ldquo;Zoom in&amp;rdquo;**. I am unaware of a way to do this without the mouse.&lt;/p&gt;
&lt;p&gt;All three have the ability to set a &lt;em&gt;minimum&lt;/em&gt; font size. Firefox hides this under an &amp;ldquo;Advanced&amp;hellip;&amp;rdquo; button. This is significant for designers, because it means that even if you do a &lt;em&gt;great&lt;/em&gt; job and make all your font sizes relative to the browser&amp;rsquo;s base font size, the browser &lt;em&gt;may&lt;/em&gt; still use a lower bound that is higher than you expected.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2020/12/04/firefox_settings.png&#34; alt=&#34;firefox preferences screen showing the text size configuration&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2020/12/04/chrome_settings.png&#34; alt=&#34;chrome preferences screen showing the text size configuration&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2020/12/04/safari_settings.png&#34; alt=&#34;safari preferences screen showing the minimum text size configuration&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;how-to-deal&#34;&gt;How to Deal&lt;/h2&gt;
&lt;p&gt;In general, the solution is to let go of the idea of pixel perfect web sites, and embrace &amp;ldquo;Responsive Design&amp;rdquo; and Flexbox layouts. It&amp;rsquo;s never going to look exactly the same on every computer and OS anyway.&lt;/p&gt;
&lt;p&gt;The great thing about &amp;ldquo;responsive&amp;rdquo; web sites is that when I jack my  font up to huge sizes, they just reset themselves as if i were on a  device with a smaller screen, which in a way I am.&lt;/p&gt;
&lt;p&gt;The other thing that will dramatically help, is to stop replacing the browser&amp;rsquo;s widgets with &amp;ldquo;prettier&amp;rdquo; CSS + JavaScript versions. Pull-downs and multi-selects are the most common example of this. These custom widgets are &lt;em&gt;rarely&lt;/em&gt; designed with accessibility in mind, and &lt;em&gt;frequently&lt;/em&gt; need to be tweaked to handle whatever your specific use case is. Those tweaks almost never take accessibility into account, because &lt;em&gt;most&lt;/em&gt; developers don&amp;rsquo;t think about a11y. Firefox, Chrome, and Safari have all done a great job of making sure that their built-in widgets work really well for folks with accessibility needs.&lt;/p&gt;
&lt;p&gt;As noted above, graphs are a problem. No-one wants to write their own graphing libraries, and few of the existing ones are good at accessibility. Try them out at varying font sizes and with &lt;em&gt;lots&lt;/em&gt; of elements and see what happens. Unfortunately there&amp;rsquo;s not really a &lt;em&gt;good&lt;/em&gt; answer here. Using a graph is frequently the right call, they&amp;rsquo;re notoriously problematic, and writing your own graphing library is almost always the &lt;em&gt;wrong&lt;/em&gt; call.&lt;/p&gt;
&lt;p&gt;As far as sticking text in boxes though. That&amp;rsquo;s not actually a problem. There are lots of good reasons to do it. Nav bars, grouping, highlighting a specific thing&amp;hellip; These are all reasonable design decisions. If you need to use a box keep these things in mind:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Make boxes that expand in a controlled manner with the text within them.&lt;/li&gt;
&lt;li&gt;If expanding the box isn&amp;rsquo;t an option, don&amp;rsquo;t just cut off text and make it impossible to read. Make it obvious that there is text that isn&amp;rsquo;t currently being displayed, and provide a mechanism to easily read it. For example, have scroll bars appear when contents overflow. They are there to help people read.&lt;/li&gt;
&lt;li&gt;Avoid CSS&amp;rsquo;s &lt;code&gt;overflow: hidden&lt;/code&gt; property when dealing with  text, &lt;em&gt;unless&lt;/em&gt; you provide scroll bars. It almost always results in cutting off the text and leaving  people like me unable to read whatever you wanted us to read. &lt;code&gt;text-overflow: ellipsis&lt;/code&gt; looks better, but the intended text is still cut off.&lt;/li&gt;
&lt;li&gt;if clicking an item causes a sub-menu (or whatever) to be displayed, make sure that that sub-item is anchored to the boxes &lt;em&gt;current&lt;/em&gt; location, not some hard-coded number of pixels or &lt;code&gt;em&lt;/code&gt; spaces across the page.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;
&lt;p&gt;There are millions of folks who have visibility issues, and you&amp;rsquo;re likely to become one as you age. So, embrace responsive design. Use native widgets, and never try to make &amp;ldquo;pixel perfect&amp;rdquo; designs.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve got more suggestions on how to improve sites for low vision folks please &lt;a href=&#34;https://masukomi.org/&#34;&gt;contact me&lt;/a&gt; and I&amp;rsquo;ll add it to this page.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Footnotes:&lt;br&gt;
* Chrome doesn&amp;rsquo;t have the built-in ability to zoom text only, BUT there is a &lt;a href=&#34;https://chrome.google.com/webstore/detail/zoom-text-only/jamhfhbppcmkgghlkeieococonlbppjg/related&#34;&gt;Zoom Text Only&lt;/a&gt; plugin which over 10,000 people have installed. There are probably many thousands of other users who didn&amp;rsquo;t know this was an option, or weren&amp;rsquo;t tech savvy enough to even look for something like this.&lt;br&gt;
** Not it is not reasonable to expect anyone to &amp;ldquo;just know&amp;rdquo; that holding down the option key when clicking on a menu will change its contents.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Ubiquity Upgrade Fiasco</title>
      <link>https://weblog.masukomi.org/2020/11/20/ubiquity-upgrade-fiasco/</link>
      <pubDate>Fri, 20 Nov 2020 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2020/11/20/ubiquity-upgrade-fiasco/</guid>
      <description>&lt;p&gt;[⚠️ This is a blow-by-blow ranty post about what happened when Ubiquity screwed up a software upgrade ⚠️]&lt;/p&gt;
&lt;p&gt;This morning has been&amp;hellip; a journey.&lt;/p&gt;
&lt;p&gt;Our Wifi coverage has been kinda 💩 at the new house because there&amp;rsquo;s way more space between us and the Access Point.&lt;/p&gt;
&lt;p&gt;So, let&amp;rsquo;s just run some ethernet across the floor for now! Should be quick! 🤦🏻‍♀️&lt;/p&gt;
&lt;p&gt;We run it into my wife&amp;rsquo;s iMac. No problem. All good. Fast fast. Another cable, through her office, past front door, into my office, And&amp;hellip;. &amp;ldquo;wait&amp;hellip; wtf do i plug this into?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Flashback to about two weeks ago: When we moved in the Ubiquity setup needed administering because&amp;hellip; who knows. It did, and we needed internet, because &amp;ldquo;duh&amp;rdquo;. We don&amp;rsquo;t have a hardware controller (yet) and have to use the stupid Java app, but couldn&amp;rsquo;t get on the wifi to administer it because it needed administering. So we went with the fastest option, buying an ethernet adapter from Staples down the road, even though that meant another potential exposure incident. We like getting paid and being able to pay our mortgage.&lt;/p&gt;
&lt;p&gt;They had two options. A &amp;ldquo;thunderbolt&amp;rdquo; adapter and a USB-A adapter. &amp;ldquo;Thunderbolt&amp;rdquo; is, of course, a useless term when your goal is to figure out if it will fit into one of the holes in your device. They showed something that MAY have been USB-C and MAY have been the mini-display port shaped thing the older macs had. There was no side-view to confirm. Fortunately I have both options available (yay old computers). We bought both adapters just in case. It turned out to be the old style, which is fine, because that&amp;rsquo;s where the stupid Java app lived.&lt;/p&gt;
&lt;p&gt;Back to today:
The &amp;ldquo;Thunderbolt&amp;rdquo; adapter is useless for this modern mac which has Thunderbolt, but we had the USB-A adapter. Ethernet to USB-A adapter into USB-A to USB-C adapter into new mac, because Apple cares more about selling you more dongles than a good user experience.&lt;/p&gt;
&lt;p&gt;The speed is terrible. Google says &amp;ldquo;Oh Ethernet-&amp;gt;USB-A adapters are crap and max out at 100Gb&amp;rdquo;. Well that didn&amp;rsquo;t help at all.&lt;/p&gt;
&lt;p&gt;But hey, our friend was kind enough to send us a loaner access point we hadn&amp;rsquo;t tried plugging in yet because OMG MOVING AND LIFE. So i plug it in.&lt;/p&gt;
&lt;p&gt;Now, let&amp;rsquo;s configure that thing. Boot up the stupid Ubiquity Java app. &amp;ldquo;Unable to load Java Runtime&amp;rdquo; &amp;hellip;WTF? I booted this like 2 weeks ago and it was fine?! Google says &amp;ldquo;install java&amp;rdquo; UGH I&amp;rsquo;ve avoided that for years, I guess it was running some that came with my mac but&amp;hellip; whatever. Fine. I&amp;rsquo;ll install the latest Java.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2020/11/20/java_plus_you_marketing_image.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;[BEGIN tangent]
Side note: Oracle&amp;rsquo;s marketing department has NO fucking clue what Java is because they think &lt;em&gt;this&lt;/em&gt; is a reasonable representation of people who download Java and what they&amp;rsquo;re doing while downloading it. Ignoring the fact that we&amp;rsquo;re in an industry dominated by white males, no-one is all &amp;ldquo;doo-de-doo I&amp;rsquo;m just layin&amp;rsquo; here on the floor. I think I&amp;rsquo;ll download Java. That sounds fun! See how happy I am?&amp;rdquo; No. No-one is fucking happy to download Java, &lt;em&gt;including&lt;/em&gt; Java developers, and I speak from experience here. It&amp;rsquo;s &lt;em&gt;way&lt;/em&gt; less annoying than it was 15 years ago, but it always involves more BS and legalese than it needs to. I&amp;rsquo;m surprised they didn&amp;rsquo;t try and trick me into downloading NetBeans. Is that still a thing?
[END tangent]&lt;/p&gt;
&lt;p&gt;ANYWAY&amp;hellip; I download and install Java. I reboot the Ubiquity controller. It has me launch a browser to connect to the local server. All good. All normal.&lt;/p&gt;
&lt;p&gt;New UI. &amp;hellip;.wtf? New UI that&amp;rsquo;s all &amp;ldquo;Hey welcome to Ubiquity!&amp;rdquo; Hofuck. Not good. &amp;ldquo;Enter a username and password&amp;rdquo; [type type] &amp;ldquo;Nah, that one&amp;rsquo;s no good&amp;rdquo; &amp;ldquo;oh shit.&amp;rdquo; [reread the instructions and enter my passy for the Ubiquity web site].&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a &amp;ldquo;Or restore from backup&amp;rdquo; at the bottom, which sounds like a &lt;em&gt;great&lt;/em&gt; option right now except that the old UI never told me to &lt;em&gt;make&lt;/em&gt; a backup or that that was even a thing it could do.&lt;/p&gt;
&lt;p&gt;I forge onward.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2020/11/20/ubiquity_no_devices.jpeg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You have no devices
Connect devices to your network.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;At this point I am connected to the internet via the old Access point which is plugged into a Ubiquity switch, which is plugged into a Ubiquity Security Gateway&amp;hellip; and on to the internet. ALL THE !@#$!$@  DEVICES ARE CONNECTED!!!!&lt;/p&gt;
&lt;p&gt;Now, it turns out this is actually a security feature. The devices that &lt;em&gt;are&lt;/em&gt; connected are like &amp;ldquo;we&amp;rsquo;re managed by someone else. We ain&amp;rsquo;t letting you touch us.&amp;rdquo; That way some random schmoe out on the street can&amp;rsquo;t take over your network, which is great, if there&amp;rsquo;s a random schmoe on the street looking to get into your network but pretty fucking terrible when Ubiquity has somehow managed to upgrade your software without telling you and without asking if you wanted to make a !#@$!@ backup first.&lt;/p&gt;
&lt;p&gt;Note that this isn&amp;rsquo;t like a App store app. It has never auto-upgraded behind the scenes in all the years I&amp;rsquo;ve had it installed (at least that I was aware of) and I &lt;em&gt;definitely&lt;/em&gt; haven&amp;rsquo;t upgraded it in the last couple weeks. Even if I somehow managed to tell it to upgrade, and then completely forgot about it, it should have never actually upgraded because I didn&amp;rsquo;t have the required Java it needed. This has two separate, and glaringly obvious paths to screwing over the user.&lt;/p&gt;
&lt;p&gt;The way to get around this lovely &amp;ldquo;feature&amp;rdquo; is to do a hardware reset. To do a hardware reset you need a paperclip.&lt;/p&gt;
&lt;p&gt;You know what I don&amp;rsquo;t happen to have in my possession? A !@$##$@ paperclip. We found a safety pin, but that just stabbed into the plastic button. Eventually we found a teeny-weeny Allen wrench that happened to fit in the hole. Reset it. Software didn&amp;rsquo;t see it. Nuffin&amp;hellip;. Then (despite my having refreshed the page) it suddenly saw it. Said it showed up &amp;ldquo;4 minutes ago&amp;rdquo;. 🤦🏻‍♀️&lt;/p&gt;
&lt;p&gt;Great, except it&amp;rsquo;s bypassing the security gateway and just going straight to the internet via our router. Presumably because the security gateway is managed by some &amp;ldquo;other&amp;rdquo; network.&lt;/p&gt;
&lt;p&gt;Wheee I&amp;rsquo;m standing naked on the Internet Superhighway!&lt;/p&gt;
&lt;p&gt;The next step is to poke every device on our network with the Allen wrench and then go through the steps to recreate the network we had in order to be able to control it because Ubiquity felt like upgrading some software without permession, warning, or any way to transition smoothly.&lt;/p&gt;
&lt;p&gt;Except, I can&amp;rsquo;t do that because you know, work, and meetings &lt;em&gt;over the internet&lt;/em&gt;. I sigh and go back to my desk, switch to the wifi that has been functional and really slow, but at least has a hardware firewall.&lt;/p&gt;
&lt;p&gt;I can&amp;rsquo;t connect to the internet. It&amp;rsquo;s like. &amp;ldquo;Umm&amp;hellip;. urrr&amp;hellip;. maybe&amp;hellip;. um. I &amp;hellip; I think I can see it. It&amp;rsquo;s so far away though. &amp;quot; I&amp;rsquo;ve got an RSSI of -73 Db, which is low but should be more functional than it is. I have no idea what RSSI stands for but I understand decibels as they affect radio waves if it gets too quiet you&amp;rsquo;ve got issues. My computer still says 5 bars of wifi but in practice no web page loads.&lt;/p&gt;
&lt;p&gt;The same computer, on the same wifi, on the same access point, going into the same hardware that it&amp;rsquo;s been in for like two weeks&amp;hellip; Turns out the new access point is clobbering the old access point because they&amp;rsquo;re probably on the same channel because they&amp;rsquo;re not all being managed in a coordinated manner by the controller. 🤦🏻‍♀️&lt;/p&gt;
&lt;p&gt;🔥  FUCK YOU 2020. 🔥&lt;/p&gt;
&lt;p&gt;It works in the living room still. I just have to give up my monitor, my keyboard, my camera, and my microphone. But, you know&amp;hellip; no biggie. That&amp;rsquo;s not disruptive.&lt;/p&gt;
&lt;p&gt;Maybe I should just consider myself lucky it isn&amp;rsquo;t all on fire.&lt;/p&gt;
&lt;p&gt;At least in the new version of the Unifi Controller it&amp;rsquo;s all &amp;ldquo;you want me to do automatic backups?&amp;rdquo; right at the start, which is great. Would have been great if it did it with the old one too. Would have been better if i also knew &lt;em&gt;where&lt;/em&gt; they were. Would have been &lt;em&gt;even&lt;/em&gt; better if I didn&amp;rsquo;t find myself suddenly needing them because some jackwad at Ubiquity thought it&amp;rsquo;d be a good idea to &lt;em&gt;upgrade my network controller and wipe all my settings without asking!!!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I was actually intending to be productive today. To do a little more work for our client. Really though? All my spoons have been used up on this stupid ass spontaneous &amp;ldquo;upgrade&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Oh, and next week we&amp;rsquo;ll have a hardware controller coming in. If I could have done this in a controlled manner as intended next week, I would have found out there was an ability to backup your settings in the old software, and then restore them to the new hardware.&lt;/p&gt;
&lt;p&gt;As an aside: I still think Ubiquity hardware is amazing, and in general their software is pretty damn excellent, and we&amp;rsquo;re happily throwing more money at them, but this situation still sucks.&lt;/p&gt;
&lt;p&gt;[update] The old wifi stopped working in any meaningful way for the 2019 mac. Is usable on the 2013 mac sitting on the same desk.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The Coin Game</title>
      <link>https://weblog.masukomi.org/2020/09/21/the-coin-game/</link>
      <pubDate>Mon, 21 Sep 2020 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2020/09/21/the-coin-game/</guid>
      <description>&lt;p&gt;The Coin Game is one of the tools I&amp;rsquo;ve come up with to help myself recognize when I &lt;em&gt;do&lt;/em&gt; accomplish something of value. It also helps motivate me to do more.&lt;/p&gt;
&lt;p&gt;Boring tasks are hard, especially for ADHD brains. On top of this, when we &lt;em&gt;do&lt;/em&gt; actually manage to accomplish something, we don&amp;rsquo;t give ourselves credit for it. Sometimes it feels like it shouldn&amp;rsquo;t count because of how long it takes. Sometimes getting it done involved lots of irrelevant tangents, and we &amp;ldquo;yeah but&amp;rdquo; all the value away. At the same time, most of us &lt;em&gt;do&lt;/em&gt; actually contribute enough value to our employers that they keep us on staff.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2020/09/21/bank_and_booty.jpg&#34; alt=&#34;The Coin Game: a picture of the Bank and Booty&#34;&gt;&lt;/p&gt;
&lt;p&gt;The short short version is that you earn a coin every time you deliver a unit of value. Originally the idea was you&amp;rsquo;d use these coins to &amp;ldquo;buy&amp;rdquo; yourself some guilt free break time. After working with this for five months what I&amp;rsquo;ve come to learn is that the &lt;em&gt;real&lt;/em&gt; value of this &amp;ldquo;game&amp;rdquo; is the physical evidence that you&amp;rsquo;ve accomplished something. On days when motivation is lacking, or it feels like you&amp;rsquo;re just being useless, each coin is proof that you&amp;rsquo;ve accomplished something of value.&lt;/p&gt;
&lt;p&gt;The coins you earn are based on things that &lt;em&gt;you&lt;/em&gt; consider valuable about what you do. Working towards these &lt;em&gt;intrinsic&lt;/em&gt; (not extrinsic) goals makes all the difference. Every time I earn a coin, I  do a happy dance, and get a real sense of accomplishment. &amp;ldquo;I earned a coin!&amp;rdquo; Every time I feel like I&amp;rsquo;m not making any progress I look down and see &amp;ldquo;Hey, I&amp;rsquo;ve already delivered x coin(s) worth of value today.&amp;rdquo;&lt;/p&gt;
&lt;h2 id=&#34;how-it-works&#34;&gt;How it works&lt;/h2&gt;
&lt;p&gt;Prerequisites:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;an idea of what your valuable contributions are&lt;/li&gt;
&lt;li&gt;a small stack of coins&lt;/li&gt;
&lt;li&gt;2 Post-It™️ note sized pieces of paper.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The key to this is coming up with a list of things you do for your job that constitute &amp;ldquo;delivering value&amp;rdquo;. How long it takes you to do the thing is irrelevant. What matters is if it&amp;rsquo;s actually providing notable value to you and/or your coworkers. This is important because we can&amp;rsquo;t reward ourselves for doing something valuable if we don&amp;rsquo;t know what value we provide. This is also going to help us set realistic expectations for ourselves.&lt;/p&gt;
&lt;p&gt;In addition to the actions you&amp;rsquo;ve been hired to perform, think about the actions you take that improve life/work for your coworkers or company in notable ways. These have value too. You may not have been hired to improve that process, or code up some useful utility, but if it makes the lives of you or your coworkers better, you&amp;rsquo;ve delivered value.&lt;/p&gt;
&lt;p&gt;Here are some of my &amp;ldquo;valuable&amp;rdquo; things (I&amp;rsquo;m a programmer):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;creating a &amp;ldquo;Pull Request&amp;rdquo; for some new functionality or bug fix (a code deliverable)&lt;/li&gt;
&lt;li&gt;carefully reviewing and testing a coworker&amp;rsquo;s Pull Request&lt;/li&gt;
&lt;li&gt;implementing non-trivial changes requested by a coworker&amp;rsquo;s review.&lt;/li&gt;
&lt;li&gt;representing our team in some politically important meeting&lt;/li&gt;
&lt;li&gt;spending 15 minutes researching, and making a decision that will save us hours / days of frustration going forward.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once you&amp;rsquo;ve got an initial list, you&amp;rsquo;ll need some &amp;ldquo;coins&amp;rdquo;. You can use &amp;ldquo;normal&amp;rdquo; coins like quarters, but I think it&amp;rsquo;s better if you can use something &amp;ldquo;novel&amp;rdquo;. I 3D printed some &amp;ldquo;Pirates of the Caribbean&amp;rdquo; coins. You could grab some tokens from a board game, use foreign currency, or whatever. Most days I deliver 1-3 units of value.  I have actually had a 5 coin day and it was kinda mind-blowing.&lt;/p&gt;
&lt;p&gt;Next, you&amp;rsquo;ll need 2 Post-It™️ note size pieces of paper. The first one is &amp;ldquo;The Bank&amp;rdquo;. The other one is &amp;ldquo;Booty!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Take both of these pieces of paper and place them on your desk. They should be in your normal line of sight, but where they&amp;rsquo;re not in the way.&lt;/p&gt;
&lt;p&gt;At the start of each day you take all your booty and move it back to the Bank. Every time you deliver something of value, you earn a coin and move it from The Bank, to your Booty!.&lt;/p&gt;
&lt;p&gt;Each coin is a physical representation your accomplishments. It&amp;rsquo;s &lt;em&gt;proof&lt;/em&gt; that you delivered value. You&amp;rsquo;ve done your job. Feel free to go go off and &lt;a href=&#34;https://youtu.be/-6WCkTwW6xg&#34; title=&#34;video - How to give your brain the stimulation it needs&#34;&gt;replenish your dopamine levels&lt;/a&gt;. Doing it &lt;em&gt;without&lt;/em&gt; thinking about how you &amp;ldquo;should be working&amp;rdquo; is going to help you come back more refreshed, and more capable of earning more coins&amp;hellip; er&amp;hellip; delivering more value. ;)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Some followup thoughts:&lt;/p&gt;
&lt;p&gt;Most days I earn 1-3 coins. That&amp;rsquo;s 1-3 things units of real value to the company. One coin sounds like very little, but sometimes it just takes a day to get a thing done, and that&amp;rsquo;s ok. In the past I&amp;rsquo;ve worked on tasks where I haven&amp;rsquo;t &amp;ldquo;delivered&amp;rdquo; anything for a month, but along the way I finished off a number of sub-tasks. If that happens again, I&amp;rsquo;ll reward myself for the accomplishments along the way. It&amp;rsquo;s important to recognize that we &lt;em&gt;are&lt;/em&gt; accomplishing things even if they&amp;rsquo;re not ready to hand off to others.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>First Principles &amp; Scheme</title>
      <link>https://weblog.masukomi.org/2020/07/26/first-principles-and-scheme/</link>
      <pubDate>Sun, 26 Jul 2020 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2020/07/26/first-principles-and-scheme/</guid>
      <description>&lt;p&gt;(Or, The Value of Working at Lower Levels of Abstraction.)&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m loving working in Scheme because it &lt;em&gt;forces&lt;/em&gt; me to work from &lt;a href=&#34;https://en.wikipedia.org/wiki/First_principle&#34;&gt;First Principles&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a &lt;em&gt;huge&lt;/em&gt; value in the convenience functions that most languages wrap around those first principles, but it&amp;rsquo;s like buying and using a car vs. building the car you&amp;rsquo;re using.&lt;/p&gt;
&lt;p&gt;The latter &lt;em&gt;is&lt;/em&gt; more work but you&amp;rsquo;re going to &lt;em&gt;really&lt;/em&gt; understand how that car works and you&amp;rsquo;re going to have the perfect car for your needs.&lt;/p&gt;
&lt;p&gt;Some languages (cars) are built for speed (Rust, Go). Some are built for user happiness (Ruby). Some are built for making a specific task easy (SQL). Each has its &lt;a href=&#34;https://www.merriam-webster.com/dictionary/pros%20and%20cons&#34;&gt;pros and cons&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Scheme feels like it&amp;rsquo;s built to be buildable. It&amp;rsquo;s the Lego™ set of languages.&lt;/p&gt;
&lt;p&gt;Like Lego™ if you want to quickly build some complex thing, it&amp;rsquo;s going to require a lot more time and effort unless you&amp;rsquo;ve got some pieces pre-built (by you or others). Like Lego™ there is &lt;em&gt;very&lt;/em&gt; little limitation to what you can do with it.&lt;/p&gt;
&lt;p&gt;The car you build won&amp;rsquo;t necessarily be the fastest possible car, but it will be the perfect car for your needs. Imagine making a pick-up truck that lets you safely chain additional truck-beds to it when you have big loads. No-one makes a car/truck like that. They make faster cars. They make better looking cars. They make &lt;a href=&#34;https://amzn.to/3hwIkrU&#34;&gt;cars your kids can drive&lt;/a&gt;. But they don&amp;rsquo;t make the &lt;em&gt;perfect&lt;/em&gt; car for every use case.&lt;/p&gt;
&lt;p&gt;Understanding first principles allows you to create that perfect vehicle for your needs. Most languages are pre-built cars. Some are highly specialized Formula-1 models that will send inexperienced developers hurtling into the wall at high speed. Some are comfortable Honda station wagons that&amp;rsquo;ll get you to your destination safely. Some are Porche 911&amp;rsquo;s: fun, relatively safe, go reasonably fast, but they&amp;rsquo;re terrible for taking the whole family and picking up groceries.&lt;/p&gt;
&lt;p&gt;Most of the time, that&amp;rsquo;s perfect. You get the right kind of car for the type of stuff you&amp;rsquo;re doing. If you&amp;rsquo;re writing cutting edge video games it&amp;rsquo;s probably the Formula-1. It&amp;rsquo;ll be hard to steer, and easy to crash, but you can go &lt;em&gt;really&lt;/em&gt; fast with it. If you&amp;rsquo;re writing a typical webapp it&amp;rsquo;ll be the Honda station wagon: safe, easy to drive, san handle a load of unexpected groceries, plenty of service stations.&lt;/p&gt;
&lt;p&gt;From a productivity perspective it&amp;rsquo;s great to be able to hop into a &amp;ldquo;normal&amp;rdquo; car and just drive. You don&amp;rsquo;t have to worry about weather much because it&amp;rsquo;s got windshield wipers, heater, and AC built in. You just want to get to your destination relatively quickly and comfortably.&lt;/p&gt;
&lt;p&gt;But, it&amp;rsquo;s terrible for ever learning how the car works, or how to make something more appropriate than the car they handed you.&lt;/p&gt;
&lt;p&gt;And that brings us back to Lego™ and Scheme.  Frankly, they&amp;rsquo;re both terrible for getting things done quickly if all you have is the raw pile of &amp;ldquo;Bricks&amp;rdquo;. But they&amp;rsquo;re spectacular for learning how to make things, and thus how to make a thing perfectly suited to your current needs.&lt;/p&gt;
&lt;p&gt;Once you learn those first principles, AND you&amp;rsquo;ve chosen a scheme with good libraries,&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; you&amp;rsquo;re left with a tool for building the perfect thing for your needs.&lt;/p&gt;
&lt;p&gt;Scheme is a machine shop with a lathe and a cutter. Scheme + libraries is a machine shop with a lathe, a cutter, a CNC, and all the other machines people built with &lt;em&gt;their&lt;/em&gt; machine shops.&lt;/p&gt;
&lt;p&gt;Ruby + libraries (for example) is a woodshop with saw, chisel, hammer, and a bunch of useful &lt;a href=&#34;https://en.wikipedia.org/wiki/Jig_(tool)&#34;&gt;Jigs&lt;/a&gt; built by other woodworkers.&lt;/p&gt;
&lt;h2 id=&#34;practical-realities&#34;&gt;Practical Realities&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;But.. that’s just a tool shop. I want a tool &lt;em&gt;box&lt;/em&gt; 99% of the time&lt;/p&gt;
&lt;p&gt;Python is a toolbox. It’s not the fastest &amp;amp; not the best. But it builds &lt;thing&gt; pretty quickly 🤷‍♀️&lt;/p&gt;
&lt;p&gt;Not saying I wouldn’t learn Scheme. Just prioritizing trade offs. e.g., I learned C++ in 2018 for reasons. - &lt;a href=&#34;https://twitter.com/joshkehn/status/1287177143823347712&#34;&gt;Joshua Kehn&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Josh&amp;rsquo;s got a good point. That type of thinking is embraced by basically &lt;em&gt;every&lt;/em&gt; programmer trying to get something built in a timely manner. For example when my coworkers and I sit down to work we either use &lt;a href=&#34;https://www.ruby-lang.org/&#34;&gt;Ruby&lt;/a&gt; + &lt;a href=&#34;https://rubyonrails.org/&#34;&gt;Rails&lt;/a&gt; or &lt;a href=&#34;https://www.ruby-lang.org/&#34;&gt;Elixir&lt;/a&gt; + &lt;a href=&#34;https://phoenixframework.org/&#34;&gt;Phoenix&lt;/a&gt;. We&amp;rsquo;re not &lt;em&gt;just&lt;/em&gt; working in high level languages, we&amp;rsquo;re also using libraries that give us &lt;em&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Burj_Khalifa&#34;&gt;skyscraper levels of abstraction&lt;/a&gt;&lt;/em&gt;.  It&amp;rsquo;s all about using off-the shelf tools that&amp;rsquo;ll get us to our destination quickly. For us, making reliably things quickly translates either directly, or indirectly into money.&lt;/p&gt;
&lt;p&gt;But, some folks who really understood first principles had to spend a lot of time building those abstractions. I&amp;rsquo;m incredibly grateful to them, but I don&amp;rsquo;t want to be limited to &lt;em&gt;their&lt;/em&gt; abstractions, and I don&amp;rsquo;t want to be tied to &lt;em&gt;their&lt;/em&gt; choice of language to use them.&lt;/p&gt;
&lt;p&gt;For example. Let&amp;rsquo;s take the &lt;a href=&#34;https://en.wikipedia.org/wiki/Monad_(functional_programming)#An_example:_Maybe&#34;&gt;Maybe Monad&lt;/a&gt;. It&amp;rsquo;s incredibly useful, but Ruby didn&amp;rsquo;t have that baked in. So some rails developer who understood first principles added the &lt;a href=&#34;https://guides.rubyonrails.org/active_support_core_extensions.html#try&#34;&gt;.try method&lt;/a&gt;. It took until ~2016 for Ruby to add &lt;a href=&#34;https://tiagoamaro.com.br/2016/08/27/ruby-2-3-dig/&#34;&gt;.dig&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.try&lt;/code&gt; and &lt;code&gt;.dig&lt;/code&gt; are incredibly useful, but if you didn&amp;rsquo;t understand the core principles of programming you either wouldn&amp;rsquo;t think to add them, or you&amp;rsquo;d implement it in a worse way, because you aren&amp;rsquo;t aware that there are established and efficient patterns for implementing that stuff.&lt;/p&gt;
&lt;p&gt;This brings me back to why I love Scheme. There are geeks who love reading academic and abstract programming guides that have no direct practical bearing on their day job, and &lt;em&gt;critically&lt;/em&gt; can actually remember the stuff the next week. Then, there are the rest of us, who don&amp;rsquo;t remember any of that crap unless we actually use it, &lt;em&gt;repeatedly&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Scheme forces me to use it. Scheme forces me to &lt;em&gt;understand&lt;/em&gt; it. Every day I spend programming Scheme I better understand fundamental concepts that give me more options in my day job. Every day I use Scheme I build up a few more abstractions in code that are perfectly suited to &lt;em&gt;my&lt;/em&gt; tasks and &lt;em&gt;my&lt;/em&gt; way of approaching those tasks.&lt;/p&gt;
&lt;p&gt;To put it another way, by having so little baked in, and having such great support for building good things, I&amp;rsquo;m building my own perfect framework.&lt;/p&gt;
&lt;p&gt;Would it have been faster to use Ruby + &lt;a href=&#34;http://sinatrarb.com/&#34;&gt;Sinatra&lt;/a&gt;? Absolutely. Would the end result have met my goals as well? Not even remotely.  Would I have learned &lt;em&gt;anything&lt;/em&gt; along the way? Not a chance.&lt;/p&gt;
&lt;p&gt;So, yes, I&amp;rsquo;m going to reach for Ruby or Elixir in my day job. But for my personal work, I&amp;rsquo;m going to keep working in Scheme and improving my libraries, and eventually I&amp;rsquo;ll have my own framework, that is more efficient than Rails or Phoenix for the things &lt;em&gt;I&amp;rsquo;m&lt;/em&gt; trying to accomplish.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://www.racket-lang.org/&#34;&gt;Racket&lt;/a&gt; and &lt;a href=&#34;https://www.call-cc.org/&#34;&gt;Chicken Scheme&lt;/a&gt; both have great collections of pre-built libraries. Racket&amp;rsquo;s language, and library ecosystem have some of the best documentation available for any language.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Scheme Is My Vim</title>
      <link>https://weblog.masukomi.org/2020/07/27/scheme-is-my-vim/</link>
      <pubDate>Sun, 26 Jul 2020 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2020/07/27/scheme-is-my-vim/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://www.gnu.org/software/emacs/&#34;&gt;Emacs&lt;/a&gt; is arguably the most powerful tool available to the modern programmer. &lt;a href=&#34;https://www.vim.org/&#34;&gt;Vim&lt;/a&gt;&amp;rsquo;s pretty close. Both require more effort to learn than say &lt;a href=&#34;https://atom.io/&#34;&gt;Atom&lt;/a&gt; or &lt;a href=&#34;https://www.sublimetext.com/&#34;&gt;Sublime Text&lt;/a&gt;. But, the additional start-up effort pays off quickly.&lt;/p&gt;
&lt;p&gt;Like &lt;a href=&#34;https://en.wikipedia.org/wiki/Scheme_(programming_language)&#34;&gt;Scheme&lt;/a&gt;, they both suck out-of-the-box. Unaltered they&amp;rsquo;re both horrible bare-bones skeletons of an editor. Their potential is incredible though. If you&amp;rsquo;re just going to do something quickly, and never spend the time to customize them, they are a terrible choice.&lt;/p&gt;
&lt;p&gt;But, if you&amp;rsquo;re willing to invest a little time and tweak them to your needs (a macro here, a plugin-there) then you&amp;rsquo;ll end up with an amazing tool perfectly suited to &lt;em&gt;your&lt;/em&gt; brain and &lt;em&gt;your&lt;/em&gt; approach to programming.&lt;/p&gt;
&lt;p&gt;Watching an experienced Atom / Sublime user with vs. an experienced Emacs / Vim user with a setup customized to their brain is the difference between watching 8 year olds attempting to play Soccer and watching the final match of the World Cup.&lt;/p&gt;
&lt;p&gt;Scheme is my Vim. I&amp;rsquo;m still learning how to customize it, but I can see the possibilities.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Delve RPG Review (not Ironsworn Delve)</title>
      <link>https://weblog.masukomi.org/2020/07/19/delve-rpg-review/</link>
      <pubDate>Sun, 19 Jul 2020 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2020/07/19/delve-rpg-review/</guid>
      <description>&lt;p&gt;There&amp;rsquo;s a little known RPG called &amp;ldquo;&lt;a href=&#34;https://www.drivethrurpg.com/product/259575/Delve---Second-Edition&#34;&gt;Delve&lt;/a&gt;&amp;rdquo; that is not to be confused with Ironsworn Delve.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2020/07/19/delve_cover_small.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Welcome to Delve
You awaken on a beach surrounded by the debris from a wrecked ship, you are not alone as others seem to be also awakening from their ordeal. You had no time to pack and all you have is what is in your pockets or what you can find amongst the wreckage. This begins your adventures on the island of Cragbarren.
Delve is a fantasy RPG of discovery and adventure, you are on a lost island with no way to leave. The island is filled with dungeons, ruined cities, old caves, mad mages and monsters, with a lot of opportunity for an awesome GM to create their own.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I was intrigued. I figured it&amp;rsquo;d be an interesting minimalist system. Players couldn&amp;rsquo;t have much to work with, having woken up on a beach. The cover made me think there&amp;rsquo;d be interesting rules regarding how you survived through dangerous caverns and dungeons with no resources. Because of the beach thing I figured it might be some kind of rules plus replay-able adventure module.&lt;/p&gt;
&lt;p&gt;The reality was a poorly organized, unedited, unfinished world book with new rules for old ideas, cliché racism and sexism, and old D&amp;amp;D monsters. I see no reason for anyone to buy this.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;You awaken on a beach surrounded by the debris from a wrecked ship&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There&amp;rsquo;s a quick little loot table to see what you start with. Next you find some caves which you enter for no apparent reason. Here players will have to contend with rules tracking how long their light sources will last.&lt;/p&gt;
&lt;p&gt;Eventually there&amp;rsquo;s a goblin camp, light at the end of the tunnel and a ticket booth with a bored guy who congratulates you on making it past the goblins and tells you there&amp;rsquo;s a town down the road.&lt;/p&gt;
&lt;p&gt;Everyone who washes up on this island comes through those caves. The goblins occasionally attempt to raid the town and are easily repelled. For some reason the goblins don&amp;rsquo;t bother to eat the guy at the ticket booth, and despite them regularly killing shipwreck survivors and being a nuisance the town doesn&amp;rsquo;t seem inclined to do anything about them.&lt;/p&gt;
&lt;p&gt;When you get to town you learn that there&amp;rsquo;s no money here. Everything is barter, but in order to make the game a bit easier every item has an abstract numerical value. Some might call it a &amp;ldquo;price&amp;rdquo; if &amp;ldquo;money&amp;rdquo; were a thing here.&lt;/p&gt;
&lt;p&gt;Despite the marketing of washing up on a deserted island, you &lt;em&gt;very&lt;/em&gt; quickly find a town with a tavern, a blacksmith / weapon-smith / armor-smith, a merchant, mage&amp;rsquo;s guild with many members, and everything else you might need to equip yourself for adventure.&lt;/p&gt;
&lt;p&gt;As far as the world-book portion of this, there&amp;rsquo;s a good town (as in not evil) populated with people who&amp;rsquo;ve washed ashore called &amp;ldquo;Wreck Haven&amp;rdquo; It is every medium sized town in every fantasy RPG, but with three detailed NPCs, each with a 1 page description.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s also a bad town (evil), the &amp;ldquo;City of Stench&amp;rdquo; which has a history multiple centuries old, and known to the old people of Wreck Haven despite them only having been here for 100 years.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you spoke to the oldest person on Cragbarren they would tell you that the city became corrupt, that the ground swallowed up the buildings and churches and then spewed out death, that deep beneath the island evil dwells and it manifested itself by rupturing and creating the rotten and pungent orifice that now dominates the city, a running pustule of rot and evil.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It is of course, infested with undead, and ruled by a demon. Thus your adventurers who have no possessions, must go there, and risk their lives because&amp;hellip;. 🤷‍♀️reasons. There are some details, a map of the requisite underground portion, and a loot table for this city.&lt;/p&gt;
&lt;p&gt;Then there are lots of monsters taken directly from D&amp;amp;D via the Open Gaming License: Ankheg, Basilisk, Blink Hound, etc. If there&amp;rsquo;s an original monster I missed it.&lt;/p&gt;
&lt;h2 id=&#34;details&#34;&gt;Details&lt;/h2&gt;
&lt;h3 id=&#34;organization&#34;&gt;Organization&lt;/h3&gt;
&lt;p&gt;Good organization is critical to an RPG rule-book. Essentially no-one ever remembers all the rules, and you&amp;rsquo;re going to need to grab it and quickly find the answer to how Combat works (or whatever).&lt;/p&gt;
&lt;p&gt;Here all the reference information is presented inline with a running narration of gameplay. You learn about &amp;ldquo;Hunger&amp;rdquo; as you wander the beach. You learn about combat when you encounter your first creature. You learn that you can cast spells and that they cost magic points, at this time too, but not what spells are available, or how many points you have. That&amp;rsquo;s&amp;hellip;&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s no index or chapter markings for any of this. You just have to remember that it&amp;rsquo;s somewhere in &amp;ldquo;Into the Caves&amp;rdquo;. Technically there&amp;rsquo;s a &amp;ldquo;Rules Summary&amp;rdquo; on page 58 (you just have to remember this). It&amp;rsquo;s not all the rules that have been presented so far or any that are yet to come, and it doesn&amp;rsquo;t tell you what page to go look at to find the details on anything.&lt;/p&gt;
&lt;p&gt;The armor and weapons tables are hidden in the chapter of the city / town of &amp;ldquo;Wreck Haven&amp;rdquo;. You can find them after the page detailing the blacksmith NPC &amp;ldquo;Er-varin&amp;rdquo; and before the page describing the flotsam merchant named &amp;ldquo;Flotsmam&amp;rdquo;.  The table of standard gear in between description of Flotsam and the Mages Guild.&lt;/p&gt;
&lt;h3 id=&#34;racism--sexism&#34;&gt;Racism &amp;amp; Sexism&lt;/h3&gt;
&lt;p&gt;Racism in RPGs is no better than racism in real life. If the dwarves rise up in your game world and start committing genocide or something similarly evil, it&amp;rsquo;s reasonable for everyone else to distrust them. In Delve though dwarves &amp;ldquo;&amp;hellip;have always been warlike, considered untrustworthy in matters of business, and drunks.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Sorry, did you want to play an honorable dwarf? Tough shit, everyone&amp;rsquo;s going to treat you like an untrustworthy drunk. And every species is like this except the Half-elves. These quotes are all taken straight from the book:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Elves are often seen as haughty, adventurous, jaded, cruel and pompous all of which are justified and are opinions&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Halflings had for years been seen as small communities of happy and social people&amp;hellip; but that is all just a façade. Halflings are thieves, and not only thieves but also assassins, spies and murderers.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Half orcs have been known to attempt to remove their teeth, lighten their skin and even slice their own faces in order to become less orc like&amp;hellip;To be a half orc is to be hated, untrusted, despised and rejected&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;But humans are tenacious and will turn a blind eye to the suffering and death of others, even their own kind just to line the pockets of the few.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The half-orcs are especially depressing. Everyone hates you so much that you despise your own skin and try to pretend you&amp;rsquo;re another species.&lt;/p&gt;
&lt;p&gt;Why would &lt;em&gt;anyone&lt;/em&gt; want to play in a world where before you even start, everyone hates you and has terrible preconceptions about you based on your race. No matter what you do, most of society is going to be prejudiced against you for the rest of your life.&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t worry though, we&amp;rsquo;re not done. In addition to the baked-in racism we also have baked in sexism&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Witches can be seen differently from the Mage within society, seen as evil or less powerful many are viewed as the mad old woman, or the strange hermit. They spend a lot of time gathering herbs and fungi for their brews.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yeah that&amp;rsquo;s right ladies; if you have any power they&amp;rsquo;ll see you as evil, less powerful than the men, or mad, and you&amp;rsquo;re expected to spend your life &amp;ldquo;gathering herbs&amp;rdquo; and cooking potions while the men go off and do manly things.&lt;/p&gt;
&lt;h2 id=&#34;rules&#34;&gt;Rules&lt;/h2&gt;
&lt;p&gt;There are rules for all sorts of things: parrying, attacking from horseback, how long light sources last, hunger, called shots, firing into melee, etc. It&amp;rsquo;s simultaneously more than most players want to bother with and not enough to satisfy those who would crave a &amp;ldquo;realistic simulation&amp;rdquo;.  They&amp;rsquo;re also very difficult to find in the book.&lt;/p&gt;
&lt;p&gt;Everything is percentage based, which you&amp;rsquo;d think might make things easier, because you&amp;rsquo;re just rolling two d10s all the time, and seeing if you beat the odds, but what percentage you have to beat is constantly changing based on circumstances, and may frequently involve summing three things and subtracting from your base percentage, or whatever. As a bonus, unlike d20 systems, where you roll and immediately know what number you got, now every roll you make now involves figuring out which of the two die that just rolled across the table is the 10s and which is the 1s, then doing the math to add them up.&lt;/p&gt;
&lt;p&gt;I saw nothing in the rules that was innovative, new, or even a new twist on an old idea, other than the fact that you can only level in a Tavern.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Delvers can only level up in a tavern, they cannot level up whilst adventuring and I recommend that GMs wait until they reach a tavern before handing out experience points.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There&amp;rsquo;s only one tavern on the island though, so players best hope it doesn&amp;rsquo;t burn down.&lt;/p&gt;
&lt;h2 id=&#34;magic&#34;&gt;Magic&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s a fairly standard manna point magic system. The two magic classes are &amp;ldquo;Witches&amp;rdquo; and &amp;ldquo;Mages&amp;rdquo; There is a strong implication that witches are female and mages are men, but it&amp;rsquo;s not explicitly stated (see sexism above).&lt;/p&gt;
&lt;p&gt;You learn spells via the conveniently located and surprisingly well staffed mages guild with its stores selling potions and magic items and library&amp;hellip; in a small town on an island comprised entirely of shipwrecked people and their offspring.&lt;/p&gt;
&lt;p&gt;Spells are typically once sentence long and inconsistent. Some ranged spells mention how many feet they can go. Some don&amp;rsquo;t. They&amp;rsquo;re presented in two columns of center aligned text for no apparent reason. They&amp;rsquo;re located at the end of the chapter on Wreck Haven between the information on the Mages Guild and the City of Stench.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Literally the only good thing I have to say about this book is that I liked the description of the three NPCs. Every time I think about the rest, I&amp;rsquo;m pissed off by the blatant racism and sexism. The whole shipwreck thing is pointless because other than an excuse for starting with nothing you promptly find yourself in a well stocked town with every convenience. Magic potions, magic items. &amp;ldquo;Anything can be found at Flotsam with rarer items appearing on a d6 roll of 4,5 or 6.&amp;rdquo;  If it&amp;rsquo;s not there today, just wait. No matter how rare it is you&amp;rsquo;ve got a 50% chance it&amp;rsquo;ll wash up shortly.&lt;/p&gt;
&lt;p&gt;The organization of the book is frustrating at best. The drawings are cobbled together from a variety of artists with inconsistent styles. The monsters are literally taken straight from D&amp;amp;D with minor tweaks for this game system.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s no concept of alignment, which is fine, because everyone is a fucking racist who hates everyone who doesn&amp;rsquo;t look like them so it goes without saying that essentially everyone is Lawful Evil. And that&amp;rsquo;s ok, because the dwarves are all alcoholics, and the halflings are all murders, and the half-orcs hate their bodes, and and and&amp;hellip;.&lt;/p&gt;
&lt;p&gt;Please don&amp;rsquo;t buy this.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Covid Decision Flowchart</title>
      <link>https://weblog.masukomi.org/2020/07/12/covid-decision-flowchart/</link>
      <pubDate>Sun, 12 Jul 2020 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2020/07/12/covid-decision-flowchart/</guid>
      <description>&lt;p&gt;There are a number of people who want to stay safe during the COVID-19 pandemic, but have found themselves making questionable decisions, because they&amp;rsquo;ve become acclimatized to it, and because they &lt;em&gt;want&lt;/em&gt; to believe that their friends are healthy, because they &lt;em&gt;look&lt;/em&gt; healthy, and reason that &amp;ldquo;of course, those friends are responsible, and &lt;em&gt;I&amp;rsquo;m&lt;/em&gt; responsible, so it should be safe to get together and do something.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Friends and family are the big problem. We need them. We&amp;rsquo;re social creatures. The thing is, if your friends choose to get together with you in a non-socially distanced way, it proves that they aren&amp;rsquo;t being careful, and then you have to wonder about all the &lt;em&gt;other&lt;/em&gt; not-careful people they&amp;rsquo;ve been in contact with, and the people &lt;em&gt;they&amp;rsquo;ve&lt;/em&gt; been in contact with and on and on.&lt;/p&gt;
&lt;p&gt;When you come close to another human, you&amp;rsquo;re not just interacting with their germs and viruses. You&amp;rsquo;re interacting with the germs and viruses they&amp;rsquo;ve acquired from their friends, and their friends friends and&amp;hellip;&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s really hard to see the danger. It&amp;rsquo;s part of what&amp;rsquo;s helped our species survive. Minimizing danger is what allowed our ancient forefathers to go out and try to stab a mastodon with a spear.&lt;/p&gt;
&lt;p&gt;So, here&amp;rsquo;s a flowchart to help you decide if going out, or getting together with others is a reasonable, logical, decision, and not just an emotional want.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://weblog.masukomi.org/images/2020/07/12/covid_decision_flowchart.jpg&#34;&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2020/07/12/covid_decision_flowchart.jpg&#34; alt=&#34;covid decision flow chart&#34;&gt;&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Hating Email, and Loving Hey</title>
      <link>https://weblog.masukomi.org/2020/06/26/hating-email-and-loving-hey/</link>
      <pubDate>Fri, 26 Jun 2020 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2020/06/26/hating-email-and-loving-hey/</guid>
      <description>&lt;p&gt;I&amp;hellip; really hate email.&lt;/p&gt;
&lt;p&gt;By the time I left my last company I had successfully trained everyone around me to stop sending me email, or at least not expect me to have seen anything they sent me. My friends are similarly trained.&lt;/p&gt;
&lt;p&gt;The thing is, I don&amp;rsquo;t &lt;em&gt;actually&lt;/em&gt; hate email.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I hate traditional email clients and the bullshit usage patterns the force on us&lt;/strong&gt;, and I hate the bullshit way most employers use email.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I&amp;rsquo;m _loving _&lt;/strong&gt;&lt;a href=&#34;https://hey.com&#34; title=&#34;Hey&#34;&gt;&lt;strong&gt;Hey&lt;/strong&gt;&lt;/a&gt;, because it solves the first problem.&lt;/p&gt;
&lt;p&gt;Let me explain. I apologize, that this is a little ranty, but I&amp;rsquo;ve been dealing with this BS for decades and it negatively affected my ability to communicate with friends, family, and coworkers.&lt;/p&gt;
&lt;h2 id=&#34;heres-where-were-starting-from&#34;&gt;Here&amp;rsquo;s where we&amp;rsquo;re starting from.&lt;/h2&gt;
&lt;p&gt;Essentially every web site I have an account on, or buy something from sends me email. I want less than 1% of it. Marathon sports just let me know that &amp;ldquo;Sketchers Performance Footwear is Here!&amp;rdquo; and that &amp;ldquo;Dad Deserves the best!&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;I also get &amp;ldquo;recruiter spam&amp;rdquo; and other solicitations that may be &amp;ldquo;personalized&amp;rdquo; for me and not &lt;em&gt;directly&lt;/em&gt; trying to sell me crap and thus doesn&amp;rsquo;t count as &amp;ldquo;spam&amp;rdquo; for the purposes of automatic filtering.  I want none of it. &amp;ldquo;Kay! We have an urgent need for a developer with 5 years of [tech that&amp;rsquo;s not on my resume]!&amp;rdquo; &amp;ldquo;Hey masukomi, we can apply [buzzword] &amp;rsquo;technology&amp;rsquo; to masukomi.org to boost your [other buzzword]&amp;rdquo;&lt;/p&gt;
&lt;p&gt;My inbox is &lt;em&gt;MY&lt;/em&gt; inbox. It&amp;rsquo;s not &lt;em&gt;their&lt;/em&gt; delivery basket. No-one should get to say what shows up in &lt;em&gt;my&lt;/em&gt; inbox but &lt;em&gt;me&lt;/em&gt;. I&amp;rsquo;m the one who has to read it. &lt;em&gt;They&lt;/em&gt; don&amp;rsquo;t get to decide what I have to read.&lt;/p&gt;
&lt;p&gt;Make no mistake, you &lt;em&gt;have&lt;/em&gt; to read everything in your inbox if you want a clue what&amp;rsquo;s there. You may just be reading the subject line, but you&amp;rsquo;ve still read it. You still need to decide &amp;ldquo;do I want to open this?&amp;rdquo;. I do not want to be wasting my mental bandwidth and &lt;a href=&#34;https://en.wikipedia.org/wiki/Decision_fatigue&#34;&gt;limited decision making power&lt;/a&gt; on something that I never asked for and don&amp;rsquo;t want.&lt;/p&gt;
&lt;p&gt;So, the starting point, &lt;em&gt;the baseline&lt;/em&gt;, of this discussion for most folks is an inbox that is filled with &lt;em&gt;thousands&lt;/em&gt; of emails from people trying to sell them stuff or get them to do something they don&amp;rsquo;t want to do. Somewhere in that torrent are a couple emails from friends or family. Maybe. Hard to tell.&lt;/p&gt;
&lt;p&gt;I declared email bankruptcy in May of 2018. Since then I&amp;rsquo;ve unsubscribed from dozens of mailing lists. It&amp;rsquo;s June of 2020. I have just under twenty two thousand non-spam emails. Essentially none of them are from anyone I care about. I&amp;rsquo;ve seen maybe 1% of those that &lt;em&gt;are&lt;/em&gt; from people I care about. That&amp;rsquo;s roughly 34 emails a day. I &lt;em&gt;think&lt;/em&gt; my friends, so thoroughly trained to not bother sending me email &lt;em&gt;maybe&lt;/em&gt; send me 1 email a month&amp;hellip;&lt;em&gt;maaaybe&lt;/em&gt;. I hear about them after the fact: &amp;ldquo;oh, you don&amp;rsquo;t know what&amp;rsquo;s going on because it was in an email thread.&amp;rdquo; Let&amp;rsquo;s say they have actually sent me one email per month. That&amp;rsquo;s 0.09615% of my email that 1 actually &lt;em&gt;care&lt;/em&gt; about.  Let&amp;rsquo;s add in the notes from my credit cards when there&amp;rsquo;s a suspicious or notable charge. Let&amp;rsquo;s be generous. Let&amp;rsquo;s say that those increase the email worth having my &lt;em&gt;an order of magnitude&lt;/em&gt;. Now 0.9% of my email is worth having.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;ZERO POINT NINE PERCENT of my email is worth having.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Or, to put it another way, if I bothered to actually address my email 99.1% of that time would be spent looking at things I don&amp;rsquo;t want to see, most of which actively annoy me.&lt;/p&gt;
&lt;p&gt;And we still haven&amp;rsquo;t touched on the work email, which honestly, isn&amp;rsquo;t much better, what with the email threads you don&amp;rsquo;t need to be CCd on, the digests from software you&amp;rsquo;re forced to use, and literally thousands of notifications and alerts you don&amp;rsquo;t need (if you&amp;rsquo;re a developer). &lt;a href=&#34;https://www.atlassian.com/incident-management/on-call/alert-fatigue&#34;&gt;Alert Fatige Anyone?&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;so-how-does-hey-help&#34;&gt;So, how does Hey help?&lt;/h2&gt;
&lt;p&gt;The biggest difference is that, no-one gets to put anything in my inbox without me approving them. Everything goes into the &amp;ldquo;screener&amp;rdquo; where I yes/no every sender. So, yes I have to deal with emails from them, but only once. Not &lt;em&gt;every time they try&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This &lt;em&gt;is&lt;/em&gt; a bit &lt;em&gt;more&lt;/em&gt; up-front work. For each new sender I have to decide if i want it, and if I want it in my &amp;ldquo;Imbox&amp;rdquo;, or in one of the other 2 bins. &lt;em&gt;But&lt;/em&gt; this 1 time per sender task means that my &amp;ldquo;Imbox&amp;rdquo; is going to only have things I actually want to see in it.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve heard people argue that they want this to be automatically done.  That they like how Google automatically shoves things into &amp;ldquo;Promotions&amp;rdquo; or &amp;ldquo;Updates&amp;rdquo;. Well, Google does have the best AI in the business, and incredible quantities of training data. But, that brought me from 26,000 emails down to 6,500 so I paid &lt;a href=&#34;https://www.sanebox.com/&#34;&gt;SaneBox&lt;/a&gt; to bring it down to 2,100. My current Inbox in GMail is displaying a full page of emails (and another one if I scroll down) with literally &lt;em&gt;none&lt;/em&gt; that I actually want in my Inbox. So, even with the best AI in the business the results are still terrible. There&amp;rsquo;s still &lt;em&gt;way&lt;/em&gt; too much for me to deal with that I shouldn&amp;rsquo;t &lt;em&gt;have&lt;/em&gt; to deal with.&lt;/p&gt;
&lt;p&gt;Filing by sender solves this. This isn&amp;rsquo;t perfect. Because if some company uses the same email address for their billing as their newsletter then you either don&amp;rsquo;t see the billing promptly or you always see the newsletter you don&amp;rsquo;t care much about.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m ok with this. The &lt;em&gt;reason&lt;/em&gt; I&amp;rsquo;m ok with this is that &lt;em&gt;I don&amp;rsquo;t want the !@#$ newsletter anyway&lt;/em&gt;. And yes, some of them are actually worth reading, &lt;em&gt;but&lt;/em&gt; 99.999% of the time my time would be better spent reading a book, or writing some code, or petting my animals, or simply staring out the window and breathing for a minute. Newsletters are, in general, the high calorie, nutrition free food of the internet.&lt;/p&gt;
&lt;p&gt;The second biggest difference is that notifications are off by default. My phone isn&amp;rsquo;t pinging me about all the 33 emails a day that &lt;em&gt;I actively don&amp;rsquo;t want&lt;/em&gt;. Of course, because of the screener there isn&amp;rsquo;t much in my inbox anyway. Yes yes, I&amp;rsquo;m sure some of you are yelling that it isn&amp;rsquo;t going to ping me about things auto-filed to &amp;ldquo;Promotions&amp;rdquo;. It doesn&amp;rsquo;t matter. Every notification I &lt;em&gt;do&lt;/em&gt; get is &lt;em&gt;still&lt;/em&gt; something I don&amp;rsquo;t want. There are a &lt;em&gt;lot&lt;/em&gt; of emails that are important for me to &lt;em&gt;see&lt;/em&gt; but are &lt;em&gt;not&lt;/em&gt; important for me to be notified about. I just got an alert from Gmail that Hipstamatic wants me to buy some new filters in their app. Yay. I don&amp;rsquo;t even know why I was on that mailing list.&lt;/p&gt;
&lt;p&gt;Those two things remove the &lt;em&gt;vast&lt;/em&gt; majority of my problems with email.&lt;/p&gt;
&lt;p&gt;On top of fixing &lt;em&gt;most&lt;/em&gt; of my problems with email by implementing two &lt;em&gt;very old ideas&lt;/em&gt;, they then went and made hundreds of tiny usability changes to how you &lt;em&gt;interact&lt;/em&gt; with your email. Some of them like being able to &amp;ldquo;Read together&amp;rdquo; or addressing all your &amp;ldquo;Reply Later&amp;quot;s in one screen are dramatic and awesome. Some of them, like always showing tiny hints about keyboard shortcuts so that you learn them as you go, or having a button available where you can see the list, are tiny &lt;em&gt;and awesome&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The privacy improvements are pretty sweet too.&lt;/p&gt;
&lt;h2 id=&#34;is-hey-perfect&#34;&gt;Is Hey perfect?&lt;/h2&gt;
&lt;p&gt;Nope. But, for me it&amp;rsquo;s a thousand times better than everything else. I&amp;rsquo;m happily throwing my money at them because, I don&amp;rsquo;t really want to build an email client despite how many times I&amp;rsquo;ve been tempted.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m happy so far, but what I&amp;rsquo;m really hoping is that this is the kick-in-the-pants developers need to get off their asses and &lt;em&gt;rethink email&lt;/em&gt;. Not, make yet another client that looks like every other email client but &amp;ldquo;lets me treat my email like a todo-list&amp;rdquo; or whatever bullshit continues to put the senders desires before mine.&lt;/p&gt;
&lt;p&gt;I want more people to write clients that say &amp;ldquo;Hey, you know what? This is &lt;em&gt;your&lt;/em&gt; inbox. It&amp;rsquo;s not about what &lt;em&gt;they&lt;/em&gt; want. It&amp;rsquo;s about what &lt;em&gt;you&lt;/em&gt; need. It&amp;rsquo;s not about seeing all their crap. It&amp;rsquo;s about not missing the things that are important to you, and not wasting your time.&amp;rdquo;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>D&amp;D vs. The Fantasy Trip</title>
      <link>https://weblog.masukomi.org/2020/02/23/d-and-d-vs-the-fantasy-trip/</link>
      <pubDate>Sun, 23 Feb 2020 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2020/02/23/d-and-d-vs-the-fantasy-trip/</guid>
      <description>&lt;p&gt;In 1987 I was a sophomore in High School. A teacher had an after-school class where he taught us to play Melee and Wizards. Our characters battled each other with spells and weapons on a wide open hex grid. Little cardboard punch-outs with terrible drawings marked our places on the map.&lt;/p&gt;
&lt;p&gt;I loved it.&lt;/p&gt;
&lt;p&gt;Decades later, as an adult, I payed someone $40 US for them, because I kept thinking about them. Together Melee and Wizards made up a combat system. The Fantasy Trip was the Role playing system built around it to compete with D&amp;amp;D.&lt;/p&gt;
&lt;p&gt;I never got to play them with anyone, but then &lt;a href=&#34;https://www.kickstarter.com/projects/sjgames/the-fantasy-trip-old-school-roleplaying/description&#34;&gt;The Fantasy Trip&amp;rsquo;s Kickstarter&lt;/a&gt; came out and I &lt;em&gt;threw&lt;/em&gt; my money at it. Fun combat system combined with the joy of D&amp;amp;D Role Playing?! Sign me up!&lt;/p&gt;
&lt;p&gt;Now I have it, and I&amp;rsquo;m trying to figure out if I should use it in my next campaign.&lt;/p&gt;
&lt;p&gt;This is a long post. There&amp;rsquo;s a summary of my thoughts at the bottom if you don&amp;rsquo;t have time for it all.&lt;/p&gt;
&lt;h2 id=&#34;comparing-and-contrasting&#34;&gt;Comparing and Contrasting&lt;/h2&gt;
&lt;p&gt;So, what&amp;rsquo;s the difference? Why choose one over the other? The way I see it there are four notably different aspects. I&amp;rsquo;m going to cover each below. There will be a lot of simplification.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Character Stats &amp;amp; Rolls&lt;/li&gt;
&lt;li&gt;Combat&lt;/li&gt;
&lt;li&gt;Healing&lt;/li&gt;
&lt;li&gt;Magic&lt;/li&gt;
&lt;li&gt;Leveling&lt;/li&gt;
&lt;li&gt;Source Material&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Before that, I&amp;rsquo;d like to put an idea in your head. It&amp;rsquo;s a bit of an oversimplification, but I think it works. In D&amp;amp;D adventurers go from being slightly gifted individuals to demigods of incredible power. In TFT adventurers go from being slightly gifted individuals to exceptionally skilled individuals. It&amp;rsquo;s more of an “athletic child” to “Olympic Track and Field gold medalist” kind of scale.&lt;/p&gt;
&lt;p&gt;Quick terminology:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TFT: &lt;a href=&#34;https://thefantasytrip.game/&#34;&gt;The Fantasy Trip&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;D&amp;amp;D: &lt;a href=&#34;https://dnd.wizards.com/&#34;&gt;Dungeons and Dragons&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;DM: Dungeon Master. The person running the game. In TFT they&amp;rsquo;re Game Masters. I&amp;rsquo;ll use DM throughout for simplicity.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;character-stats-creation--rolls&#34;&gt;Character Stats, Creation, &amp;amp; Rolls&lt;/h3&gt;
&lt;h4 id=&#34;the-fantasy-trip&#34;&gt;The Fantasy Trip&lt;/h4&gt;
&lt;p&gt;In The Fantasy Trip you have 3 stats:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Strength: health level &amp;amp; literal strength&lt;/li&gt;
&lt;li&gt;Dexterity: how easy it is to hit or dodge things &amp;amp; literal dexterity&lt;/li&gt;
&lt;li&gt;Intelligence: how smart you are &amp;amp; how powerful the spells you can cast are.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It only uses a D6 (six sided die). You almost always roll 3 of them. You&amp;rsquo;re also always trying to roll under whatever your stat is.&lt;/p&gt;
&lt;p&gt;There is also a concept of “adjusted dexterity” (adjDX). It&amp;rsquo;s a bit fluid and varies based on what you&amp;rsquo;re wearing and relative positioning of enemies.&lt;/p&gt;
&lt;p&gt;When you need players to roll for something they know they&amp;rsquo;re going to need 3 dice, and they&amp;rsquo;re all going to be D6s. You probably won&amp;rsquo;t have to tell them which stat to roll against either.&lt;/p&gt;
&lt;p&gt;If I said “roll to see if you can avoid the falling rock” it&amp;rsquo;s pretty obvious that you&amp;rsquo;d be rolling against your Dexterity. You&amp;rsquo;d also roll 3d6 because that&amp;rsquo;s what you always roll.&lt;/p&gt;
&lt;p&gt;This allows for much more free-form interactions. I don&amp;rsquo;t have to tell you to roll a specific check for something. A player can say “do they have a heartbeat?” and the DM can respond with “roll to find out!” I don&amp;rsquo;t have to tell them which stat. Intelligence is the obvious choice, as Dexterity was for avoiding a falling rock.&lt;/p&gt;
&lt;p&gt;To summarize:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;3 stats that are extremely easy to intuit&lt;/li&gt;
&lt;li&gt;1 kind of die and almost always rolling 3 of it.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;dd&#34;&gt;D&amp;amp;D&lt;/h4&gt;
&lt;p&gt;In D&amp;amp;D you have 6 stats. Each one has a “modifier” which is relative to how much above or below 10 it is. For every two points you add ( or subtract ) 2. I&amp;rsquo;m not going to go into each one because, there&amp;rsquo;s just too much.&lt;/p&gt;
&lt;p&gt;Each of the six stats has an associated “Saving Throw”. Rolling for a “Strength Saving Throw” for example is a D20 + your Strength Modifier.&lt;/p&gt;
&lt;p&gt;There are 18 “Skills”. Each skill associated with one of the 6 stats, and it&amp;rsquo;s not obvious which one. Rolling for one of these skills uses a D20 + the modifier of the associated stat. Different races might give you a bonus to certain Skill Checks.&lt;/p&gt;
&lt;p&gt;Characters are also “proficient” in some skills. If you are proficient in the skill the DM asks for then you also add your “proficiency bonus”.&lt;/p&gt;
&lt;p&gt;Your “proficiency bonus” starts at 2 and increases by one, at levels 5, 9, 13, and 17.&lt;/p&gt;
&lt;p&gt;When the DM asks for a skill check or a saving through &lt;em&gt;it&amp;rsquo;s always a D20&lt;/em&gt;, but players have six different dice in front of them. I can not tell you how many times I&amp;rsquo;ve seen players ask “what do I roll?” even many many sessions into their 1st campaign.&lt;/p&gt;
&lt;p&gt;Depending on the class you choose you have a different Hit die. Usually a D8 or D6. Each time you level you roll it again, and add your constitution modifier to see how many Hit Points you have.&lt;/p&gt;
&lt;p&gt;When a player asks “Do they have a pulse?” The DM needs to instruct them to “Roll a medicine check!”. It&amp;rsquo;s not obvious to the player what check to roll otherwise. “Investigation” seems reasonable, as do “Perception” and “Survival”. Even “Intelligence” isn&amp;rsquo;t a crazy idea.&lt;/p&gt;
&lt;p&gt;New players will usually respond with “what do I roll?” and then  “what do I add to that?” They&amp;rsquo;re not sure what Stat Modifier it&amp;rsquo;s associated with. They don&amp;rsquo;t know if they&amp;rsquo;re Proficient in it or not,  or what they have to add if they &lt;em&gt;are&lt;/em&gt; Proficient.&lt;/p&gt;
&lt;p&gt;To summarize:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;6 Stats&lt;/li&gt;
&lt;li&gt;6 Modifiers (one per stat)&lt;/li&gt;
&lt;li&gt;6 Saving throws (one per stat)&lt;/li&gt;
&lt;li&gt;1 proficiency modifier&lt;/li&gt;
&lt;li&gt;18 skills (some you&amp;rsquo;re proficient in, some you&amp;rsquo;re not, each associated with a non-obvious skill)&lt;/li&gt;
&lt;li&gt;6 different kinds of dice&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;backgrounds&#34;&gt;Backgrounds&lt;/h4&gt;
&lt;p&gt;Both systems encourage players to create interesting backgrounds for their characters. You want them to feel like living beings. Players know how to roll play a situation, because they know what this character&amp;rsquo;s life has been like.&lt;/p&gt;
&lt;p&gt;D&amp;amp;D&amp;rsquo;s 5th edition has worked hard to make it easy for players to  create rich backstories for their characters.  It is spectacular for players who are new to Role Playing or aren&amp;rsquo;t very good about coming up with stuff like that. They also keep adding new background creation tools.&lt;/p&gt;
&lt;p&gt;The Fantasy Trip is, in essence, a reprint of a book from the 80s, where they hadn&amp;rsquo;t figured out how to do this well.&lt;/p&gt;
&lt;h4 id=&#34;races&#34;&gt;Races&lt;/h4&gt;
&lt;p&gt;In TFT you have humans, elves, dwarves halflings, orcs, goblins. This affects your starting stats, but not much else.&lt;/p&gt;
&lt;p&gt;In D&amp;amp;D you have those, and &lt;em&gt;many&lt;/em&gt; more. Different races have different starting bonuses, and abilities. More importantly, they have different histories, personalities, and places within the social fabric.&lt;/p&gt;
&lt;p&gt;With almost every new book D&amp;amp;D introduces new playable races. Each new race helps people explore and express different aspects of their personality. It helps them to find their place in the wide world of role playing.&lt;/p&gt;
&lt;h4 id=&#34;aside&#34;&gt;Aside&lt;/h4&gt;
&lt;p&gt;&lt;a href=&#34;https://company.wizards.com/&#34;&gt;Wizards of the Coast&lt;/a&gt; deserves tremendous praise. Every image they provide is another starting point for your imagination. They&amp;rsquo;ve made sure to show women and people of color as player characters in these scenes. They&amp;rsquo;ve been working very hard to make D&amp;amp;D into a space where &lt;em&gt;everyone&lt;/em&gt; is encouraged to participate. We need so much more of this.&lt;/p&gt;
&lt;h4 id=&#34;historical-note&#34;&gt;Historical Note&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;Back in the late seventies, when &lt;strong&gt;&lt;em&gt;The Fantasy Trip&lt;/em&gt;&lt;/strong&gt; was first published, only the six-sided die was easy to acquire. Steve Jackson described it best in _The Space Game_r #10 (Feb-Mar 1977) where he wrote:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;“The special dice are expensive and sometimes hard to find; it is monumentally aggravating, for instance, to purchase &lt;strong&gt;&lt;em&gt;D&amp;amp;D&lt;/em&gt;&lt;/strong&gt; and then find you can&amp;rsquo;t play without laying out more money and waiting another couple of weeks for dice.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://www.warehouse23.com/products/the-fantasy-trip-hexagram-issue-number-3&#34;&gt;Hexagram Issue #3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;combat&#34;&gt;Combat&lt;/h3&gt;
&lt;p&gt;When watching people play, the most visible difference between TFT and D&amp;amp;D is how they handle combat. TFT&amp;rsquo;s rules originally came in little rules pamphlets for Melee and Wizard. Those pamphlets are really small. You could probably print all the combat instructions on two sides of an 8 1/2“ x 11” sheet. D&amp;amp;D&amp;rsquo;s rules come in a book about ~200 pages long, but it turns out, very few of those pages are actually combat rules. I wanted to get a sense for the relative complexity of combat, so I flow charted them both.&lt;/p&gt;
&lt;p&gt;The details aren&amp;rsquo;t important at the moment, and I&amp;rsquo;ve made this image low-rez so that we don&amp;rsquo;t get caught up in them. What&amp;rsquo;s important in this image is the relative complexity of each.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2020/02/23/d_and_d_vs_the_fantasy_trip_combat_flow.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;So, is TFT harder / more complex? Well. Yes?… and no.&lt;/p&gt;
&lt;h4 id=&#34;dd-1&#34;&gt;D&amp;amp;D&lt;/h4&gt;
&lt;p&gt;In D&amp;amp;D everything about combat is simplified to the point of being hand-wavey. From the standpoint of the rules, everyone is just a floating blob of Hit Points. &lt;em&gt;Do you want to stab someone in the back while they were looking the other way?&lt;/em&gt; Not gonna happen. D&amp;amp;D doesn&amp;rsquo;t care what way they&amp;rsquo;re facing. &lt;em&gt;Is your friend between you and the enemy while you shoot that arrow?&lt;/em&gt; No worries, you literally can&amp;rsquo;t hit them. The D&amp;amp;D fans are yelling about “natural 1” now, but nothing in the rules says “and thus shalt thou hit thine friend!” It&amp;rsquo;s all the DM improvising. Improv like that is &lt;em&gt;great.&lt;/em&gt; It is the heart of great RPG, but at the same time it feels like it&amp;rsquo;s verging closer to a simple board game.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Hold on, lemme dig through my&lt;/em&gt; &lt;em&gt;backpack. I know I&amp;rsquo;ve got something I can use… just… I think it&amp;rsquo;s under my bedroll. Yeah I&lt;/em&gt; &lt;em&gt;know&lt;/em&gt; &lt;em&gt;we were trying to kill each other but gimme a sec…&lt;/em&gt; &lt;em&gt;sheesh!”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&#34;tft&#34;&gt;TFT&lt;/h4&gt;
&lt;p&gt;TFT doesn&amp;rsquo;t get crazy nit-picky about switching weapons but it does have a concept of a “readied” weapon. So, &lt;em&gt;having&lt;/em&gt; a dagger on you doesn&amp;rsquo;t mean you&amp;rsquo;re constantly able to stab someone with it.&lt;/p&gt;
&lt;p&gt;In its defense D&amp;amp;D, only lets you switch weapons without dropping &lt;em&gt;if&lt;/em&gt; you spend your action doing it. There&amp;rsquo;s never a movement penalty, but most DMs just say “sure, grab &amp;amp; stow!” D&amp;amp;D encourages this attitude of making it simple for the players. TFT is striving for simple but trying to balance that with keeping things a bit more plausible.&lt;/p&gt;
&lt;p&gt;In TFT if you&amp;rsquo;re shooting an arrow past your friend, you might hit them. With a spear, you&amp;rsquo;re more likely to hit  from 10&amp;rsquo; away than you are from 20&amp;rsquo; away. When someone&amp;rsquo;s looking in the opposite direction it&amp;rsquo;s easier to stab them.&lt;/p&gt;
&lt;p&gt;TFT also has some optional rules about “aimed shots” and “crippling hits”. For example, you could attempt to cut off someone&amp;rsquo;s leg and then they wouldn&amp;rsquo;t be able to walk around. In D&amp;amp;D it doesn&amp;rsquo;t matter how much damage you do to someone or where. They are never affected by it until they&amp;rsquo;re dead.&lt;/p&gt;
&lt;h3 id=&#34;healing&#34;&gt;Healing&lt;/h3&gt;
&lt;p&gt;I&amp;rsquo;ll cover magical healing in a minute, but what about regular “natural” healing?&lt;/p&gt;
&lt;h2 id=&#34;dd-2&#34;&gt;D&amp;amp;D&lt;/h2&gt;
&lt;p&gt;D&amp;amp;D wants players to heal up and be ready for whatever comes next regardless of what&amp;rsquo;s happened to them.&lt;/p&gt;
&lt;p&gt;In D&amp;amp;D you have “Hit Dice”. You get 1 per level.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;A short rest is a period of downtime, at least 1 hour long, during which a character does nothing more strenuous than eating, drinking, reading, and tending to wounds.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;A character can spend one or more Hit Dice at the end of a short rest, up to the character&amp;rsquo;s maximum number of Hit Dice… For each Hit Die spent in this way, the player rolls the die and adds the character&amp;rsquo;s Constitution modifier to it.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So, in theory, you could heal any amount of damage during a short rest. You can take many of these during a day, but you can never roll more than your total hit dice during the day. If you have 4, rolling 2 now and 2 later is fine.&lt;/p&gt;
&lt;p&gt;And then there&amp;rsquo;s the “long rest”…&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;At the end of a long rest, a character regains all lost hit points. The character also regains spent Hit Dice, up to a number of dice equal to half of the character&amp;rsquo;s total number of them (minimum of one die).&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A good night&amp;rsquo;s sleep heals all wounds. Literally.&lt;/p&gt;
&lt;h4 id=&#34;tft-1&#34;&gt;TFT&lt;/h4&gt;
&lt;p&gt;The Fantasy Trip takes a somewhat more realistic approach.&lt;/p&gt;
&lt;p&gt;Physical damage can be healed in 3 ways:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Someone with some First-Aid training (a “Physicker”) can give you First Aid, and heal 2 points of damage. 3 points if they&amp;rsquo;ve got advanced training (a “Master Physicker”). It takes five minutes to do, so it won&amp;rsquo;t happen in a battle.&lt;/li&gt;
&lt;li&gt;Potions that heal 1 point of damage only.&lt;/li&gt;
&lt;li&gt;Sitting around and healing at a rate of &lt;strong&gt;&lt;em&gt;1 point a day&lt;/em&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;magical-healing&#34;&gt;Magical Healing&lt;/h4&gt;
&lt;p&gt;D&amp;amp;D has many magical healing options. The more powerful spells require touch, and the stronger potions are fairly expensive. Many of the classes have access to minor healing abilities. To put it another way, while death is always a possibility, healing is relatively easy to come by.&lt;/p&gt;
&lt;p&gt;In TFT there are healing potions, but they they cost $150 and only heal one point. Their biggest value is preventing someone who &lt;em&gt;just&lt;/em&gt; dropped to 0 points from dying.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;There are no permanent healing spells.&lt;/strong&gt; This probably seems crazy to most D&amp;amp;D players. In 2019 Steve Jackson (TFT&amp;rsquo;s creator) &lt;a href=&#34;http://forums.sjgames.com/showthread.php?t=157621&#34;&gt;proposed one on their forum&lt;/a&gt; and the resulting conversation says a lot about playing TFT.&lt;/p&gt;
&lt;p&gt;I thought this quote summed it up well:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Having played TFT for years with no healing spells, rare fragile healing potions that cost $100 for one dose that heals one point of damage, and having to devise ways to survive years of adventure anyway (making sure you have enough people and a physicker, and/or finding safe places to heal and actually resting), I still feel your original design was best.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;It makes injury significant. There are ways to survive and triumph despite no healing spells, and I still find that more interesting and satisfying than the typical alternative of easy healing, which I find tends to make injuries less relevant, and actually tends to up the stakes of combat as players expect to be able to fight people and get hurt but then heal up relatively quickly for no really serious consequence. –&lt;/em&gt; &lt;a href=&#34;http://forums.sjgames.com/showpost.php?p=2178894&amp;amp;postcount=12&#34;&gt;&lt;em&gt;Skarg&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&#34;healing-consequences-on-gameplay&#34;&gt;Healing Consequences on Gameplay&lt;/h4&gt;
&lt;p&gt;The consequences on gameplay are &lt;em&gt;huge&lt;/em&gt;. In TFT characters typically have less than 40 points total spread over 3 stats while creatures roll at least 1d6 per hit. Damage &lt;em&gt;is&lt;/em&gt; mitigated by armor and such, but when you&amp;rsquo;ve got maybe 15 or less Strength points to begin with, every point counts.&lt;/p&gt;
&lt;p&gt;In D&amp;amp;D players are self-regenerating killing machines. They start with ~8 HP and can end up with well over 100 as they level. As long as they can get a rest in between fights they can keep going.&lt;/p&gt;
&lt;p&gt;Barely survived a fight? There really aren&amp;rsquo;t any consequences if you can get a night&amp;rsquo;s rest.&lt;/p&gt;
&lt;p&gt;It TFT players have to be &lt;em&gt;much&lt;/em&gt; more careful, or they need to pull a cart filled with carefully protected potion bottles behind them. ;)&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t think either is &lt;em&gt;better&lt;/em&gt;. It&amp;rsquo;s more a question of what feels right for your campaign and / or your players. That being said, making a long “dungeon crawl” survivable is going to take a lot more work on the DMs part in TFT.&lt;/p&gt;
&lt;h3 id=&#34;magic&#34;&gt;Magic&lt;/h3&gt;
&lt;h4 id=&#34;magic-in-the-fantasy-trip&#34;&gt;Magic in The Fantasy Trip&lt;/h4&gt;
&lt;p&gt;I love the &lt;em&gt;idea&lt;/em&gt; behind how magic works in TFT. There your magical forces comes from your physical health. When you cast a spell it saps your strength. Strength (Hit Points) lost via magic regenerate at 1 point per 15 minutes (notably faster than physical damage). You &lt;em&gt;can&lt;/em&gt; kill yourself by casting too many spells.&lt;/p&gt;
&lt;p&gt;More powerful spells require more strength. So you can&amp;rsquo;t save up your really powerful spells for the end because you won&amp;rsquo;t be able to power them.&lt;/p&gt;
&lt;p&gt;If you read the Dragonlance Chronicles, this is very much like &lt;a href=&#34;https://en.wikipedia.org/wiki/Raistlin_Majere&#34;&gt;Raistlin&lt;/a&gt;. He&amp;rsquo;d cast a powerful spell and then become weak and wracked by coughing fits.&lt;/p&gt;
&lt;p&gt;As you grow more powerful you can store up “mana” in your staff and use that to power your spells instead of your own strength. However, it caps out at the same level as your IQ, (maybe 20 points max) and you have to spend your experience points to make it instead of leveling your stats.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a catch though. Excluding what power you can store in your staff, you can&amp;rsquo;t store very much. You need IQ to be able to cast powerful spells, but you need Strength to be able to survive the spells you cast, and the enemies that you encounter.&lt;/p&gt;
&lt;p&gt;After you use up you staff&amp;rsquo;s mana each spell will drain you physically. Meaning, every spell you cast, also makes you easier to kill. It doesn&amp;rsquo;t matter how healthy you are at the start of the fight. Every casting brings you closer to death.&lt;/p&gt;
&lt;p&gt;There are balances though. Every wizard is also an enchanter, infusing magical items with spells they know in their downtime. The process takes weeks, or months, and frequently require the help of other wizards. Magical items can enable Wizards to do things that might otherwise be impossible during combat, but many still drain your health. So, no free fireballs.&lt;/p&gt;
&lt;p&gt;Unlike D&amp;amp;D everyone who casts has access to the same pools of spells, and can all create new ones, and can enchant items. The only limitation is their intelligence and access to strength for powerful spells. Everyone can cast a spell in theory, but Wizards study for years to be able to learn spells more efficiently.&lt;/p&gt;
&lt;p&gt;There are roughly 250 spells to choose from and creating your own is something explicitly mentioned in the rule book. You memorize new spells by spending experience points.&lt;/p&gt;
&lt;p&gt;Spells are typically &lt;em&gt;very&lt;/em&gt; simple. They come in 4 flavors:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Missile: used to damage someone (roll to hit)&lt;/li&gt;
&lt;li&gt;Thrown: act on a creature but don&amp;rsquo;t hurt it.&lt;/li&gt;
&lt;li&gt;Creation: bring something into being (images, illusion, etc).&lt;/li&gt;
&lt;li&gt;Special: anything else (Teleportation, Dazzle, etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&amp;rsquo;s a &lt;em&gt;complete&lt;/em&gt; spell description from the book.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;IQ 10:&lt;/em&gt; &lt;strong&gt;&lt;em&gt;Dispel Missiles&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;(T) Dispels any missile spells (or missile or thrown weapons) aimed at the spell&amp;rsquo;s subject. They simply vanish. Cost: 1 ST to cast, 1 to continue.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That, is it. The “(T)” means it&amp;rsquo;s a “thrown” spell.&lt;/p&gt;
&lt;h4 id=&#34;magic-in-dd&#34;&gt;Magic in D&amp;amp;D&lt;/h4&gt;
&lt;p&gt;In D&amp;amp;D there&amp;rsquo;s a limit to what you can cast, but doesn&amp;rsquo;t hurt you. Casting doesn&amp;rsquo;t make you easier to kill. Some classes have fewer spells, but get them back after a Short Rest. Some have more spells, and flexibility in spell choice, but only get them back after a Long Rest. Some spells can be cast as a “ritual” which takes longer but doesn&amp;rsquo;t use up one of your available casting “slots”.&lt;/p&gt;
&lt;p&gt;What class you are affects what spells you have access to, and how many of them you can cast at each level. While you &lt;em&gt;can&lt;/em&gt; create new spells it&amp;rsquo;s not generally done, and enchanting items is something only specific classes can do, and it&amp;rsquo;s &lt;em&gt;way&lt;/em&gt; more limited than in TFT. That being said, there are a &lt;em&gt;lot&lt;/em&gt; of spells to choose from.&lt;/p&gt;
&lt;p&gt;The fact that it&amp;rsquo;s not tied to your health means that you can save your really powerful spells for the end… “just in case”. The fact that they&amp;rsquo;re tied to neither intelligence, nor health means that as you level you &lt;em&gt;will&lt;/em&gt; eventually become a demigod of power.&lt;/p&gt;
&lt;p&gt;Spells can be created by players but generally are not. That&amp;rsquo;s not a big deal though because there are literally over 500 to choose from.&lt;/p&gt;
&lt;p&gt;Spells have 10 aspects each:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Level&lt;/li&gt;
&lt;li&gt;Casting time&lt;/li&gt;
&lt;li&gt;Duration&lt;/li&gt;
&lt;li&gt;Range / Area (can be a distance or a volumetric shape of a specified size)&lt;/li&gt;
&lt;li&gt;Components (verbal, somatic, and/or material)&lt;/li&gt;
&lt;li&gt;School (mostly ignored)&lt;/li&gt;
&lt;li&gt;Attack / Save (is a roll required? if so, who rolls?)&lt;/li&gt;
&lt;li&gt;Damage / Effect (what kind, how many dice are rolled, what kind of dice, any plusses)&lt;/li&gt;
&lt;li&gt;Classes that can cast it.&lt;/li&gt;
&lt;li&gt;Info on how the spell changes (or not) as you level.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Components are great for role play, but are frequently ignored in favor of just using a “focus”.&lt;/p&gt;
&lt;h3 id=&#34;leveling&#34;&gt;Leveling&lt;/h3&gt;
&lt;p&gt;In both systems you gain Experience Points (XP) as you play.&lt;/p&gt;
&lt;p&gt;In D&amp;amp;D these experience points eventually cross a threshold and your character levels up. Every time you level you get more Hit Points. Melee classes get more abilities. Casting classes get more spells and access to more powerful spells. Each subsequent level requires more experience points to reach.&lt;/p&gt;
&lt;p&gt;In TFT there are no levels. You spend your experience points to improve your basic stats, to learn new spells and talents, for gold, for a Lesser Wish spell, or to improve your magic staff&amp;rsquo;s Mana stat. Each stat increase requires more and more XP to reach, and the cost is based on your &lt;em&gt;total&lt;/em&gt; stats.&lt;/p&gt;
&lt;p&gt;D&amp;amp;D lets you choose from carefully curated lists that are relevant to the class you chose. Some levels don&amp;rsquo;t get you much. Some levels are an exciting set of decisions “ooh I could take this spell, or that one, but ….which?!”&lt;/p&gt;
&lt;p&gt;TFT is more “With study and practice you can be whatever you want to be!” Players will save up for the thing they&amp;rsquo;ve been looking forward to, or the thing they really “need”.&lt;/p&gt;
&lt;h3 id=&#34;source-material&#34;&gt;Source Material&lt;/h3&gt;
&lt;p&gt;This is a very unfair comparison.&lt;/p&gt;
&lt;h4 id=&#34;tft-2&#34;&gt;TFT&lt;/h4&gt;
&lt;p&gt;TFT is, as I mentioned, basically a reprint of a book from the 80s. In that time Wizards of the Coast has been iterating and perfecting what they do. In addition to the time to do this their recent popularity has given the financial resources to create more content. &lt;a href=&#34;http://www.sjgames.com/&#34;&gt;Steve Jackson Games&lt;/a&gt; only recently reacquired the rights to TFT and hasn&amp;rsquo;t had a chance to create much of anything new for it.&lt;/p&gt;
&lt;p&gt;If we&amp;rsquo;re lucky folks will start playing TFT and demanding more from its creators.&lt;/p&gt;
&lt;p&gt;As it stands though… There are some spells. There are some monsters. The choices pale in comparison.&lt;/p&gt;
&lt;p&gt;Some monsters have stats. Some don&amp;rsquo;t. None of them have stats organized in a consistent way. There is no sense of relative difficulty between them. Many don&amp;rsquo;t have images, and the ones that do tend to be very mediocre quality black and white (literally black, and white, not grayscale). The descriptions are decent.&lt;/p&gt;
&lt;p&gt;Planning an encounter is frustrating and difficult for people who aren&amp;rsquo;t intimately familiar with the game.&lt;/p&gt;
&lt;p&gt;There are some &amp;ldquo;pre-programmed adventures&amp;rdquo; (as there were called) but they&amp;rsquo;re &lt;em&gt;short&lt;/em&gt;. The one that comes with it is 24 pages. Many are much shorter. By comparison The Curse of Strahd for D&amp;amp;D is a 256 page hard cover book with many beautiful illustrations and maps.&lt;/p&gt;
&lt;h4 id=&#34;dd-3&#34;&gt;D&amp;amp;D&lt;/h4&gt;
&lt;p&gt;D&amp;amp;D has tons of source material. It is gorgeous. It is well organized. You don&amp;rsquo;t have to come up with everything from scratch. You don&amp;rsquo;t have to tweak everything to make it work. Tons of monsters to spark your imagination. Lots of “modules” (pre-planned adventures) to steal ideas from, or send your players on if you don&amp;rsquo;t have the time or inclination to create one yourself. There are short community ones, and epic ones from Wizards like the The Curse of Strahd.&lt;/p&gt;
&lt;p&gt;Everything about spells and monsters is more complex, &lt;em&gt;but&lt;/em&gt; it is presented with such consistency, and predictability, and structured &amp;ldquo;stat blocks&amp;rdquo; that it doesn&amp;rsquo;t matter.&lt;/p&gt;
&lt;p&gt;D&amp;amp;D also has an incredible wealth of &lt;a href=&#34;https://www.dmsguild.com/&#34;&gt;high quality fan content&lt;/a&gt;. I think &lt;em&gt;much&lt;/em&gt; of this can be attributed to their &lt;a href=&#34;https://en.wikipedia.org/wiki/Open_Game_License&#34;&gt;Open Game License&lt;/a&gt;. This basically says you can include lots of their spells, and creatures, and other intellectual property in your content and software, &lt;em&gt;even if you&amp;rsquo;re selling it&lt;/em&gt; as long as you don&amp;rsquo;t try and claim it&amp;rsquo;s yours. As a result, people can create new adventures for you without having to create all new monsters or spells.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;
&lt;p&gt;I &lt;em&gt;love&lt;/em&gt; the simplicity of TFT&amp;rsquo;s stat system. While I can see the argument that it&amp;rsquo;s &lt;em&gt;too&lt;/em&gt; simple, D&amp;amp;D&amp;rsquo;s stats and rolling things are &lt;em&gt;way&lt;/em&gt; too complex. I realize that 5e is a dramatic simplification from 4e but that doesn&amp;rsquo;t change the fact that it&amp;rsquo;s way more complex. There are way too many complications when it comes to answering the question of “what should I roll?” and “what do I add to that?”&lt;/p&gt;
&lt;p&gt;I love how much more plausible combat feels in TFT. D&amp;amp;D has brushed over complications like shooting through spaces occupied by your friends. It ignores how it should be easier to stab someone that&amp;rsquo;s facing away from you. Accounting for that in TFT adds complication, but D&amp;amp;D isn&amp;rsquo;t much better. It may actually be worse. The simple case is easy in both. D&amp;amp;D can get very complex when you have multiple buffs, and debuffs, from friends and enemies, each potentially involving different dice.&lt;/p&gt;
&lt;p&gt;I really &lt;em&gt;like&lt;/em&gt; D&amp;amp;D&amp;rsquo;s use of different &lt;a href=&#34;https://amzn.to/2HJy289&#34;&gt;polyhedral dice&lt;/a&gt;. They&amp;rsquo;re just more fun. Having all those “choices” may add confusion for new users, but combat is &amp;ldquo;roll a d20&amp;rdquo; and then find and roll the right dice for damage. I think the confusion is more tied to the myriad stats and modifiers. The lack of confidence from that bleeds over into combat.&lt;/p&gt;
&lt;p&gt;I want the simplicity of being able to say “roll to find out” and knowing that a TFT player will have confidence in what to roll, and against which stat. D&amp;amp;D requires more explicit telling, and more calculating by the player who is rolling.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m unsure about the fragility and lack of healing in TFT. My gut says that it would encourage DMs to create small encounters separated by weeks or months of game time. The short length of every TFT module I&amp;rsquo;ve encountered seems to confirm this.&lt;/p&gt;
&lt;p&gt;Those adventures are fine, but what about the epic journeys through enemy lands in search of… whatever? There &lt;em&gt;seem&lt;/em&gt; to be DMs who have been playing epic campaigns without altering the healing rules. I need experience playing it to find out how much of a problem this is or isn&amp;rsquo;t. I suspect that the secret to keeping wizards alive is having them craft magic items.&lt;/p&gt;
&lt;p&gt;In contrast, D&amp;amp;D feels too much like the adventurers are 1970&amp;rsquo;s Super Heroes. They get crazy powerful and it doesn&amp;rsquo;t matter how badly hurt they were in the last comic. They&amp;rsquo;ll all be healed and ready to go in the next issue. “Oh, did they run you through with a spear? Take a nap Dear. You&amp;rsquo;ll be fine in an hour.”&lt;/p&gt;
&lt;p&gt;Judging how powerful a TFT character is, is &lt;em&gt;very&lt;/em&gt; difficult for a new DM and there are no guidelines. D&amp;amp;D&amp;rsquo;s levels provide a very simple, albeit rough, way to judge that. Their “Challenge Rating” of monsters is flawed, but generally sufficient to building a balanced encounter.&lt;/p&gt;
&lt;p&gt;In TFT there&amp;rsquo;s no clear progression of monster difficulty. There&amp;rsquo;s no easy way to choose reasonably balanced monsters for my players to encounter. I&amp;rsquo;d &lt;em&gt;love&lt;/em&gt; to be able to take the monsters from the D&amp;amp;D monster manuals and “translate” their stats for use in TFT but no-one has come up with a good way to do that. It may not be doable because of how characters progress in TFT, and how varied their choices for spending their Experience Points are.&lt;/p&gt;
&lt;p&gt;TFT players seem to use &amp;ldquo;attribute points&amp;rdquo; in place of levels. Where a D&amp;amp;D module might say &amp;ldquo;for levels 3-4&amp;rdquo; a TFT module would say &amp;ldquo;for 32-35 point characters&amp;rdquo;. As a new TFT DM it&amp;rsquo;s not clear what that really means in terms of how much damage a character can dish out. With D&amp;amp;D it&amp;rsquo;s clear that as you progress in levels you dish out (and can withstand) more damage. Characters are guaranteed to have more hit points each level. Every few levels they&amp;rsquo;re granted access to more powerful spells or abilities that do more damage. Maybe I&amp;rsquo;m worrying over nothing, and &amp;ldquo;attribute points&amp;rdquo; are a perfectly good scale. Either way, I still don&amp;rsquo;t know how to compare that to monsters.&lt;/p&gt;
&lt;p&gt;&amp;hellip;&lt;/p&gt;
&lt;p&gt;After going through all this, I want to play TFT even more, but I want to do the work of creating a campaign in it even less. If Steve Jackson Games released a Monster Manual that was as well written and organized as D&amp;amp;Ds, I would have &lt;em&gt;no&lt;/em&gt; hesitation.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Note for the nit-picky geeks. Yes, I am aware there are oversimplifications in this, like saying you &amp;ldquo;always roll 3 dice&amp;rdquo; in TFT. I know there are exceptions.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Software That Lasts</title>
      <link>https://weblog.masukomi.org/2020/02/15/software-that-lasts/</link>
      <pubDate>Sat, 15 Feb 2020 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2020/02/15/software-that-lasts/</guid>
      <description>&lt;h2 id=&#34;the-cloud-problem&#34;&gt;The Cloud Problem&lt;/h2&gt;
&lt;p&gt;When your data only exists in software that you don&amp;rsquo;t host yourself it is no longer yours. It can disappear at any moment. Its future is dependent upon a company&amp;rsquo;s continued profits and interests.&lt;/p&gt;
&lt;p&gt;Imagine you&amp;rsquo;ve been building up a knowledge base for two years, but you fall on &amp;ldquo;hard times&amp;rdquo;. Maybe you can&amp;rsquo;t afford it. Maybe something happened and you&amp;rsquo;re literally unable to (accidents, medical issues, legal restrictions). What happens to all that data?&lt;/p&gt;
&lt;p&gt;If you’re lucky the site has a good export feature, and you have the opportunity to use it, before its too late.&lt;/p&gt;
&lt;p&gt;You can&amp;rsquo;t rely on a company&amp;rsquo;s VC money continuing to last. They might get bought and end their &amp;ldquo;&lt;a href=&#34;https://ourincrediblejourney.tumblr.com/&#34;&gt;incredible journey&lt;/a&gt;&amp;rdquo;.  They may simply loose interest in the product.&lt;/p&gt;
&lt;p&gt;If you’ve put years worth of effort into it. It would be a full time job to recreate it in another system. So, really you’re screwed.&lt;/p&gt;
&lt;h2 id=&#34;the-local-problem&#34;&gt;The Local Problem&lt;/h2&gt;
&lt;p&gt;When the software lives locally, on your phone, or on your desktop, the situation a bit better. It should continue to work until your Operating System eventually upgrades enough to break it. If you know a breaking update is coming you could stop upgrading your device… forever. This problem is guaranteed to happen for every piece of unmaintained software.&lt;/p&gt;
&lt;h2 id=&#34;the-solution&#34;&gt;The Solution&lt;/h2&gt;
&lt;p&gt;There are two parts to the solution.&lt;/p&gt;
&lt;h3 id=&#34;the-data-solution&#34;&gt;The Data Solution&lt;/h3&gt;
&lt;p&gt;Software that manages text (documents, spreadsheets, etc) must be stored natively in a human readable, text format. You must be able to open up its files with a text editor, and with some motivation, be able to make sense of them.&lt;/p&gt;
&lt;p&gt;Image and video data is harder, but the formats are generally public so we &lt;em&gt;should&lt;/em&gt; be able to read them in 40 years.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.defectivebydesign.org/&#34;&gt;Anything with DRM is guaranteed to stop working&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;the-software-solution&#34;&gt;The Software Solution&lt;/h3&gt;
&lt;p&gt;The software &lt;em&gt;must&lt;/em&gt; be &lt;a href=&#34;https://opensource.com/resources/what-open-source&#34;&gt;open source&lt;/a&gt;. I don’t say this as an open source zealot. No company lasts forever. This is especially true for technology companies. Sooner or later, &lt;em&gt;every single piece of proprietary software will die&lt;/em&gt;. The question is will it die before, or after you do. This sounds dramatic, but it’s actually a very real consideration. All proprietary software will eventually be abandoned. All of its creators will die.&lt;/p&gt;
&lt;p&gt;If you’re going to put data into a piece of software, and you want that data to last for years, it must be open source software. You don’t need to be able to maintain it, but anyone who cares about it needs to have that option. In the worst case scenario, you will always be able to pay someone to make it work with your current computer.&lt;/p&gt;
&lt;p&gt;But, being open source isn’t enough. Imagine, for example, that the world moves on from MS Word, and Microsoft decides to open source it. It’s an incredibly large and complex codebase. Many pieces are tied to the version of the operating system they were written for. It’s also, probably not documented very well internally. To keep MS Word alive and useful for the next 40 years will require a large team, working countless hours. A future government that really wants to read their digital archives, might be able to fund this. It’s not going to help normal mortals.&lt;/p&gt;
&lt;p&gt;The software needs to be open source, &lt;em&gt;documented&lt;/em&gt;, and reasonably focused in its scope. It must be something that a handful of dedicated fans can keep alive.&lt;/p&gt;
&lt;p&gt;The considerations needed to design software that will last 40 years is another post entirely.&lt;/p&gt;
&lt;h2 id=&#34;choosing-well&#34;&gt;Choosing Well&lt;/h2&gt;
&lt;p&gt;For now I want you to consider a some things about the software choices you are making:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Will my livelihood be affected if the the developers who make this die, or suddenly kill this product?&lt;/li&gt;
&lt;li&gt;If I keep using this, will I loose years of data that I care about when the developers die, or go out of business?
&lt;ul&gt;
&lt;li&gt;Can I export my data?&lt;/li&gt;
&lt;li&gt;If so, would it be in a format I could do something with? For example: PDFs are nice, but they’re terrible for transferring data from one piece of software to another. They&amp;rsquo;re also annoying to extract data from.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;If I suddenly become poor, or otherwise unable to pay my bills, will I loose years of data I care about?
&lt;ul&gt;
&lt;li&gt;Note that many sites will delete your data to save space if you stop paying.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;If I forget my password, or no longer have an old email address, will I loose years of data I care about?&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>A personal journey through programming languages</title>
      <link>https://weblog.masukomi.org/2020/01/04/personal-journey-through-programming-languages/</link>
      <pubDate>Sat, 04 Jan 2020 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2020/01/04/personal-journey-through-programming-languages/</guid>
      <description>&lt;p&gt;A little while ago there was a post about &lt;a href=&#34;https://apenwarr.ca/log/?m=201903&#34;&gt;Programmer Migration Patterns&lt;/a&gt; through programming languages. I didn&amp;rsquo;t agree with it, but it got me thinking, about my 30+ years of programming, the languages I&amp;rsquo;ve been through, and when I can take away from that.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2020/01/04/a_history_of_language_learning.png&#34; alt=&#34;a graph of masukomi&amp;rsquo;s journey through programming languages&#34;&gt;&lt;/p&gt;
&lt;p&gt;When I was a wee thing my mother brought home a used &lt;a href=&#34;https://en.wikipedia.org/wiki/Texas_Instruments_TI-99/4A&#34;&gt;Texas Instruments TI99/4A&lt;/a&gt; that had been velcroed into a suitcase. I had a lot of fun with that computer. With the help of the Learn To Program Basic books from the library, I made circles and squares appear and move on the screen and did other silly things.&lt;/p&gt;
&lt;p&gt;Fast forward a few years and I was a young teen sitting in the computer lab of my mom&amp;rsquo;s college writing Choose Your Own Adventure games in Basic on an &lt;a href=&#34;https://en.m.wikipedia.org/wiki/Apple_IIe&#34;&gt;Apple //e&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Another fifteen years or so and I&amp;rsquo;m doing freelance web design with HTML &amp;amp; JavaScript; pure &lt;a href=&#34;http://vanilla-js.com/&#34;&gt;Vanilla JS&lt;/a&gt;. Front-end interaction wasn&amp;rsquo;t enough though, so I learned Perl, which lead quickly to learning Bash and SQL, which have served me well ever since.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://weblog.masukomi.org/2007/07/31/you-treat-her-like-a-sex-toy/&#34;&gt;I loved Perl&lt;/a&gt;. It&amp;rsquo;s an awesome language to work in when you have the discipline to write clean, maintainable code.&lt;/p&gt;
&lt;p&gt;Despite my love of Perl, &lt;a href=&#34;https://sun.com&#34;&gt;Sun&lt;/a&gt; spent millions getting everyone excited about Java, and it worked. All the large companies were hiring Java devs. All the cool new stuff was being  made in Java. So, I learned it&amp;hellip;&lt;/p&gt;
&lt;p&gt;I think Java&amp;rsquo;s. It&amp;rsquo;s an incredibly capable language, and it taught me a lot. It&amp;rsquo;s also completely soul-less. There&amp;rsquo;s no joy in it. While my days were spent poking Java for big companies, I dabbled in Python and picked up enough PHP to help on a contract. I hated PHP. I feel it&amp;rsquo;s a messy junk-drawer of a language.&lt;/p&gt;
&lt;p&gt;Perl came back into my life for a while when my employer bought a company with a Perl codebase, and that was a nice change.&lt;/p&gt;
&lt;p&gt;Around that time (2006ish) I discovered Rails, which thanks to Ruby, was a much nicer way to build web sites than anything before it. I think &lt;a href=&#34;https://matz.rubyist.net/&#34;&gt;Matz&lt;/a&gt; created something great when he built Ruby. Its guiding principle of &amp;ldquo;optimizing for developer happiness&amp;rdquo; has had wonderful consequences. I&amp;rsquo;ll be forever grateful to &lt;a href=&#34;https://en.wikipedia.org/wiki/Dave_Thomas_(programmer)&#34;&gt;Dave Thomas&lt;/a&gt; for writing &lt;a href=&#34;https://pragprog.com/book/ruby/programming-ruby&#34;&gt;the book&lt;/a&gt; that helped bring this language to the US.&lt;/p&gt;
&lt;p&gt;Ruby lead me on a brief trip through Smalltalk, which I undervalued at the time (&lt;a href=&#34;https://gtoolkit.com/&#34;&gt;Glamorous Toolkit&lt;/a&gt; didn&amp;rsquo;t exist yet either). Looking for something that wasn&amp;rsquo;t just another C-like thing I turned to Common Lisp. CL was great, for the time it was written. We have learned a lot since then, and certain things like &amp;ldquo;the internet&amp;rdquo;, and &amp;ldquo;package managers&amp;rdquo;, and interacting with &amp;ldquo;other applications&amp;rdquo; have proved to be really useful ideas. Common Lisp has managed to incorporated essentially none of them, although &lt;a href=&#34;https://www.quicklisp.org/&#34;&gt;Quicklisp&lt;/a&gt; is starting to change that.&lt;/p&gt;
&lt;p&gt;I wanted to love it but it honestly felt like it hadn&amp;rsquo;t been updated for 30 years, and trying to anything that involve things invented since then was ridiculously difficult.  Combine that with things like looping being having its own excessively complicated mini language, and other common APIs also having way too many ways to invoke them and I gave up. I don&amp;rsquo;t want to have to fight with my language to get basic shit done.&lt;/p&gt;
&lt;p&gt;It was around this time that i started to be concerned about distribution. If I wrote something in Common Lisp, how would I give it to you to run? You probably don&amp;rsquo;t have it installed. What about something I ran in Ruby? Ruby&amp;rsquo;s even worse. You need to know about installing different versions of it. You need to know what a &amp;ldquo;Gem&amp;rdquo; is. You need to know what &amp;ldquo;Bundler&amp;rdquo; is and how to use it. If it&amp;rsquo;s a rails app there&amp;rsquo;s another layer of setup and invocation knowledge that&amp;rsquo;s required.&lt;/p&gt;
&lt;p&gt;Developers immersed in a language&amp;rsquo;s ecosystem forget just how much built up knowledge it takes just to &amp;ldquo;launch&amp;rdquo; an app. I want to be able to create things I can just give to you and have you use, regardless of your favorite language or if you&amp;rsquo;re even a developer.&lt;/p&gt;
&lt;p&gt;It was clear that lisp was something special that still had a lot to teach me, and I wanted to find a way to work with it.  That led me to Scheme, which is awesome but has tons of flavors to choose from. Fortunately, I had a couple more criteria to help whittle down the list.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;It had to produce a binary that other people could run with no knowledge of the language or ecosystem it was created in.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It had to be something that made it easy to work with the internet, databases, and filesystems. Yes, I know. Most developers take it as a given that you can do that.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I ended up with the &lt;a href=&#34;https://www.call-cc.org/&#34;&gt;Chicken Scheme&lt;/a&gt; because it has a great collection of modern libraries and is very enthusiastically kept in the present by its users. It also &lt;a href=&#34;https://en.wikipedia.org/wiki/Source-to-source_compiler&#34;&gt;transpiles to C&lt;/a&gt; and then uses a native compiler to compile that to an executable. So, I&amp;rsquo;ve got tools for the modern world, and a binary you can &amp;ldquo;just run&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Unfortunately, Schemes are &amp;ldquo;batteries not included&amp;rdquo; languages. Their Standard Libraries are very bare bones, and the significant number of things you have to write for yourself is a bit jarring when coming from languages like Ruby and Perl. The number of &amp;ldquo;eggs&amp;rdquo; (libraries) helped a lot, but I still ended up writing my own set of list functions, and comparators, and other &amp;ldquo;core&amp;rdquo; stuff like that.&lt;/p&gt;
&lt;p&gt;I feel like getting stuff done in a scheme is a lot more work than in a &amp;ldquo;batteries included&amp;rdquo; language, but I&amp;rsquo;m not &amp;ldquo;fighting&amp;rdquo; with the language. Scheme is happy to help me make the tools to get stuff done. It just doesn&amp;rsquo;t have them pre-built.&lt;/p&gt;
&lt;p&gt;Around the same time I started looking at &lt;a href=&#34;https://crystal-lang.org/&#34;&gt;Crystal&lt;/a&gt;. It&amp;rsquo;s essentially a statically typed, compiled version of Ruby. I&amp;rsquo;m a huge fan of Statically typed languages and explicitly defining what everything is. The compiler errors help me develop faster, and the explicit annotations are wonderful for improving the maintainability of the codebase. To me, though Crystal is just a better Ruby. I&amp;rsquo;ve gotten a lot of value out of it, but it hasn&amp;rsquo;t taught me anything new, and I&amp;rsquo;ve been hanging out in Ruby land for a very long time now.&lt;/p&gt;
&lt;p&gt;After building my Chicken Scheme and Crystal executables I rediscovered the headaches of &lt;a href=&#34;https://www.cs-fundamentals.com/tech-interview/c/difference-between-static-and-dynamic-linking.php&#34;&gt;dynamically linked libraries&lt;/a&gt; (dylibs). Both languages gave me an executable that worked great, if you happened to have the right libraries installed on your system. They didn&amp;rsquo;t even work on all of my computers never-mind a non-developer&amp;rsquo;s. On top of that, it turns out that macOS  (my preferred OS) really REALLY doesn&amp;rsquo;t want you to generating statically linked binaries.&lt;/p&gt;
&lt;p&gt;As far as I know it&amp;rsquo;s not possible to make a 100% statically linked binary for macOS, but you can statically link everything except the system libraries.  There are some tools for finding those dylibs in your executable and statically bundling them into it. At the time, I could not find them, and the languages didn&amp;rsquo;t offer static linking as an option. Crystal may have, but I recall still having some issues testing it. At the time of writing Crystal and Chicken scheme both offer it and I know for a fact that the Chicken Scheme works well, but the documentation is kinda crap.&lt;/p&gt;
&lt;p&gt;I wanted a language that really &amp;ldquo;got&amp;rdquo; this distribution problem, understood the modern world, and now my latest criteria&amp;hellip; had a good solution for &lt;a href=&#34;https://blog.golang.org/concurrency-is-not-parallelism&#34;&gt;concurrency or parallelism&lt;/a&gt;.  [side note: Crystal actually had concurrency from early on, and now offers parallelism too.]&lt;/p&gt;
&lt;p&gt;I tried Go. Partially because it really understands this distribution problem, and &amp;ldquo;all the cool kids are doing it&amp;rdquo; which is useful when job hunting. Unfortunately the more I used it the more I disliked it. I kept telling myself that it was created by some geeks with serious &lt;a href=&#34;https://www.wordnik.com/words/cred&#34;&gt;cred&lt;/a&gt;, and that if I stuck with it, I&amp;rsquo;d surely learn something good.&lt;/p&gt;
&lt;p&gt;What I learned was that I have fundamental philosophical differences with the people who created it. I&amp;rsquo;m crossing my fingers that I don&amp;rsquo;t need to get a job programming in it.&lt;/p&gt;
&lt;h2 id=&#34;conclusions&#34;&gt;Conclusions&lt;/h2&gt;
&lt;p&gt;So, what have I learned from all this?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Learning new languages just makes you better at whatever language they pay you to write.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Being a &amp;ldquo;good&amp;rdquo; language isn&amp;rsquo;t the same as a &amp;ldquo;good&amp;rdquo; language for you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;People don&amp;rsquo;t value learning a lisp nearly enough.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;People aren&amp;rsquo;t thinking enough about the importance of easy distribution.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;What&amp;rsquo;s Next?&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;learning-languages-makes-you-better&#34;&gt;Learning languages makes you better.&lt;/h3&gt;
&lt;p&gt;Fundamentally there are only a handful of programming constructs. Learning a new language teaches you to distinguish between basic programming features, and the &lt;a href=&#34;https://en.wikipedia.org/wiki/Syntactic_sugar&#34;&gt;syntactic sugar&lt;/a&gt; your language adds to them to make life &amp;ldquo;better&amp;rdquo; for the developer.&lt;/p&gt;
&lt;p&gt;As you learn more languages you pick up more core tools. You gain new ways to use the ones you have. After the first couple, every new language you learn reinforces your core understanding of what &amp;ldquo;programming&amp;rdquo; is, and that learning the next language is just a matter of learning the syntax for the concepts you already mastered.&lt;/p&gt;
&lt;h3 id=&#34;different-strokes-for-different-folks&#34;&gt;&amp;ldquo;Different Strokes for Different Folks&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;Different people think about things different ways. It&amp;rsquo;s why working through problems with other people is so useful. I loved how Perl let me solve my problems in 20 different ways. I hated how Python forced me to use 1, or maybe 2 solutions for a thing. It was never a &amp;ldquo;bad&amp;rdquo; solution, but it forced me solve problems from an approach that I just didn&amp;rsquo;t want. At the same time, that simplicity and lack of complication is joyful for some people. I totally understand why people love Python.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s ok to hate a language others love. It&amp;rsquo;s ok to love a language others hate. Try and find one that works well with the way you think, and helps you to express your thoughts with the least interference.&lt;/p&gt;
&lt;h3 id=&#34;lisps&#34;&gt;Lisps&lt;/h3&gt;
&lt;p&gt;Even after a decade of programming it was still a major eye-opener to learn a Lisp. I suspect that learning something even more functional, like Haskell, would be a great learning experience even now.  I think it&amp;rsquo;s ridiculous how people get all bent out of shape about &amp;ldquo;all those parentheses&amp;rdquo;. There are tools for this, people. It&amp;rsquo;s a solved problem.&lt;/p&gt;
&lt;p&gt;And macros, oh my. Lisp macros are a beautiful thing. Being able to easily change and improve any aspect of a language&amp;hellip; it&amp;rsquo;s an amazing thing. It&amp;rsquo;s also a dangerous tool that, when taken too far can make it difficult for others to contribute to your project.&lt;/p&gt;
&lt;p&gt;My advice is to learn a Scheme. Racket is probably a great place to start. There are lots of books, the documentation is great, and it&amp;rsquo;s designed for teaching and learning. I went with Chicken Scheme because of its ecosystem (Racket&amp;rsquo;s is even better) and because it compiles to C code (or straight on to an executable), which means I can build it anywhere easily. The 5.0 release made creating statically linked binaries easy too.&lt;/p&gt;
&lt;h3 id=&#34;distribution&#34;&gt;Distribution&lt;/h3&gt;
&lt;p&gt;Code distribution is a serious problem that&amp;rsquo;s not getting nearly enough attention. The required knowledge to get a Ruby programming running is ridiculous, and it&amp;rsquo;s the same with most modern languages. The Go community is one of the few that really gets this problem. They&amp;rsquo;ll give you a binary for your system that requires zero knowledge of Go or Go libraries to run. On top of this, their binaries can be statically linked. This radically changes who can use your creation and how hard it&amp;rsquo;ll be for them. Wanna know how to run a Go app? Just execute it. It&amp;rsquo;ll either start working, or give you usage instructions.&lt;/p&gt;
&lt;p&gt;It is frustrating to me that no-one seems to care about this.&lt;/p&gt;
&lt;h2 id=&#34;whats-next&#34;&gt;What&amp;rsquo;s Next&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve &lt;a href=&#34;https://www.psychologytoday.com/us/blog/high-octane-women/201311/the-tell-tale-signs-burnout-do-you-have-them&#34;&gt;burnt out&lt;/a&gt; twice in the past decade. The first time was bad. The second time was worse. I&amp;rsquo;m trying to avoid a third time. The effects of this color all my decisions now.&lt;/p&gt;
&lt;p&gt;The most significant effect (relative to this post) is that I don&amp;rsquo;t have &lt;a href=&#34;https://www.wordnik.com/words/give%20a%20fuck&#34;&gt;enough fucks to give&lt;/a&gt; for languages that I don&amp;rsquo;t enjoy. I spend 8+ hours a day thinking about code. Most of it is frustratingly terrible code that I&amp;rsquo;m wading through. I don&amp;rsquo;t need any additional frustration coming at me from the language I&amp;rsquo;m working in.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been learning &lt;a href=&#34;https://www.rust-lang.org/&#34;&gt;Rust&lt;/a&gt; for a work project, and I&amp;rsquo;m gaining serious respect for it. It&amp;rsquo;s a really great solution to the problem its creators had. But I don&amp;rsquo;t have the problems its creators have. I&amp;rsquo;m fine with garbage collection. In fact, I like garbage collection.&lt;/p&gt;
&lt;p&gt;After 30+ years of writing software. I like not having to deal. I like not having to specify every little detail for the compiler to know what I mean. Crystal does a great job of letting me not deal. I even specify all the types that it could figure out implicitly because it makes it all so easy, and my doing so makes it trivial for the people who come after me to figure out what I intended.  But, like I said, I&amp;rsquo;m getting tired of Ruby.&lt;/p&gt;
&lt;p&gt;My advice to you? Don&amp;rsquo;t waste your limited time in a language you don&amp;rsquo;t enjoy. There are too many good ones out there. Search them out. Some of them are new, and rough, but worth helping grow. Some are old and filled with amazing tools. Learn Smalltalk. Learn Lisp.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not sure what language I&amp;rsquo;ll end up playing with next. I do know that I&amp;rsquo;ll be trying to find a way to spend it with one that makes me happy.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How SSH Keys let you into servers - a metaphor</title>
      <link>https://weblog.masukomi.org/2019/06/17/how-ssh-keys-let-you-into-servers-a-metaphor/</link>
      <pubDate>Mon, 17 Jun 2019 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2019/06/17/how-ssh-keys-let-you-into-servers-a-metaphor/</guid>
      <description>&lt;p&gt;SSH Keys can be a little confusing to new developers. Here&amp;rsquo;s a quick little metaphor to help you think about how they work.&lt;/p&gt;
&lt;p&gt;tldr;  Your public key is your business card. You can give it to people so that they can add it to the list of people authorized to access a machine or service. Your private key is a tool that proves that you&amp;rsquo;re the person associated with that business card.&lt;/p&gt;
&lt;p&gt;&amp;hellip;&lt;/p&gt;
&lt;p&gt;Imagine that remote machines as members-only nightclubs. The bouncer will prevent anyone from entering if their name isn&amp;rsquo;t on the list.&lt;/p&gt;
&lt;p&gt;You get your name added to the list by having a trusted member of the nightclub add it.&lt;/p&gt;
&lt;p&gt;Once that happens, you go up to the door, prove that that name is really you, and then you are allowed entry.&lt;/p&gt;
&lt;p&gt;With regards to SSH keys, every key is actually a key pair. There&amp;rsquo;s the public half (the &lt;code&gt;.pub&lt;/code&gt; file) , and the private half. Frequently these are called &lt;code&gt;id_rsa.pub&lt;/code&gt; and &lt;code&gt;id_rsa&lt;/code&gt;. But, they could be called anything. Your public key is like a business card. You should feel comfortable giving it to &lt;em&gt;anyone&lt;/em&gt; you think could use it.&lt;/p&gt;
&lt;p&gt;In this metaphor, you gave your business card to a nightclub member and they attached it to the list, so that the bouncer would know to let you in. In real life, you give your public key to a system administrator and they add it to a literal list of keys of people/machines allowed to access something.&lt;/p&gt;
&lt;p&gt;Your private key is super secret. You don&amp;rsquo;t let anyone see it. You don&amp;rsquo;t even let the &lt;em&gt;bouncer&lt;/em&gt; see it. The private key is a tool that lets you prove to the bouncer that you&amp;rsquo;re the person on the list. The bouncer says &amp;ldquo;prove you&amp;rsquo;re XXX&amp;rdquo; and you use your private key to do just that.&lt;/p&gt;
&lt;p&gt;&amp;hellip;&lt;/p&gt;
&lt;p&gt;There are different forms of encryption that can be used in generating your key pair, and different reasons for each, but that&amp;rsquo;s largely irrelevant to &lt;em&gt;how&lt;/em&gt; they&amp;rsquo;re used.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Go will never belong to the community until they decide its future</title>
      <link>https://weblog.masukomi.org/2019/05/29/go-will-never-belong-to-the-community-until-they-decide-its-future/</link>
      <pubDate>Wed, 29 May 2019 01:03:48 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/2019/05/29/go-will-never-belong-to-the-community-until-they-decide-its-future/</guid>
      <description>&lt;p&gt;There was a recent post* about how &lt;a href=&#34;https://utcc.utoronto.ca/~cks/space/blog/programming/GoIsGooglesLanguage&#34;&gt;Go is Google&amp;rsquo;s language, not ours&lt;/a&gt;. It was an opinionated post, but it provided &lt;a href=&#34;https://peter.bourgon.org/blog/2018/07/27/a-response-about-dep-and-vgo.html&#34;&gt;some evidence&lt;/a&gt; to back up its claims.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://swtch.com/~rsc/&#34;&gt;Russ Cox&lt;/a&gt; (a Tech Lead for the Go language) posted &lt;a href=&#34;https://groups.google.com/d/msg/golang-nuts/6dKNSN0M_kg/Y1yDJRwQBgAJ&#34;&gt;a reasoned response&lt;/a&gt; to this which, I think basically tried to say that it wasn&amp;rsquo;t true, and they had regular meetings to discuss community proposals.&lt;/p&gt;
&lt;p&gt;But for me, the telling bit of it was this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We have talked in the past about whether to explicitly look for people outside Google to sit in our weekly meeting, but if that&amp;rsquo;s really important, then we are not doing our job right.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;It doesn&amp;rsquo;t matter how many different types of people you let speak at a meeting if you don&amp;rsquo;t let those same types of people participate in the &lt;em&gt;decision&lt;/em&gt; at the end.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a &lt;em&gt;huge&lt;/em&gt; difference between &lt;em&gt;listening&lt;/em&gt; to people unlike yourself and truly &lt;em&gt;understanding&lt;/em&gt; people unlike yourself. For example, I&amp;rsquo;m white. I try really hard to listen to members of the black community, but I am in no way equipped to truly &lt;em&gt;understand&lt;/em&gt; what it&amp;rsquo;s like to be a black person in this country. I&amp;rsquo;m definitely not equipped to make decisions on their behalf.&lt;/p&gt;
&lt;p&gt;This same thinking applies to any group. If the community is not participating in the decisions about their needs then they have no real voice, and whatever you&amp;rsquo;re discussing &lt;em&gt;absolutely does not belong to them&lt;/em&gt;. It&amp;rsquo;s just something you&amp;rsquo;ve chosen to share with them, and let them talk about.&lt;/p&gt;
&lt;p&gt;For a real world example of this, consider politicians. Their job is to listen to community proposals about what to do with the community. Recently &lt;a href=&#34;https://www.theguardian.com/us-news/2019/may/14/alabama-abortion-ban-white-men-republicans&#34;&gt;25 white men who just decided that they were better judges of what to do with women&amp;rsquo;s bodies than women&lt;/a&gt;. Similarly, politicians with stable incomes have been making it increasingly illegal to be homeless. This is what happens when the community gets to speak, but only one type of person gets to decide.&lt;/p&gt;
&lt;p&gt;Until the community has a voice in the &lt;em&gt;decisions&lt;/em&gt; about Go&amp;rsquo;s future Go is not theirs.&lt;/p&gt;
&lt;p&gt;[UPDATE] Russ responded &lt;a href=&#34;https://twitter.com/masukomi/status/1133656515645255680&#34;&gt;to my post on twitter&lt;/a&gt; with more thoughtful words. The core of it seemed to be that I was misunderstanding the purpose of the &amp;ldquo;room&amp;rdquo; discussed above. I may be. But in my experience, whenever an insular group is discussing things that affects others, and asks &amp;ldquo;should we allow them in here?&amp;rdquo; the answer should essentially always be &amp;ldquo;yes&amp;rdquo;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;* Recent as of May 29 2019&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>oho&#39;s Backstory</title>
      <link>https://weblog.masukomi.org/2019/05/23/ohos_backstory/</link>
      <pubDate>Thu, 23 May 2019 01:03:48 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/2019/05/23/ohos_backstory/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m going tell you the tale of &lt;a href=&#34;https://github.com/masukomi/oho/#readme&#34;&gt;oho&lt;/a&gt;, a program which is arguably the world&amp;rsquo;s greatest ANSI text to HTML converter, and how it solved a real business problem. I&amp;rsquo;m sharing this because, as a geek, it&amp;rsquo;s important to remember that you can frequently solve work needs, while having fun creating open source tools that interest you.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Side note&lt;/strong&gt;: ANSI escape sequences are the things that cause text to be colored, bolded, etc when displayed in a terimnal.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;One of the roles I played at One Door was that of Release Manager. The core of that task was figuring out what code was included in, or missing from, a release - and then communicating that info to the Project Managers and Scrum Masters. Most importantly, I needed to make it clear to them if there were things they should be concerned about.&lt;/p&gt;
&lt;p&gt;I accomplished this by writing a series of small, focused, command line tools that embodied the &lt;a href=&#34;https://en.wikipedia.org/wiki/Unix_philosophy&#34;&gt;Unix Philosophy&lt;/a&gt; and worked together to extract data from Git, Github, and Jira, then combine it into a report which was transmitted to the interested parties via Slack.&lt;/p&gt;
&lt;p&gt;The larger releases presented a problem though. Project Managers didn&amp;rsquo;t really &lt;em&gt;want&lt;/em&gt; to read through the status of 300+ tickets, or contemplate what unexpected commits might mean to their release. It was too daunting of a task, and they had enough things on their todo list.&lt;/p&gt;
&lt;p&gt;One of the strategies I took to help address this was to highlight unimplemented tickets, or unexpected commits, in different colors. Unfortunately, there&amp;rsquo;s no good mechanism to get terminal colors into Slack. Colored text just isn&amp;rsquo;t supported. For multiple reasons, the right answer seemed to be to give them a PDF version of what I was seeing in the output of my tools.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t find any extant ANSI to PDF converters, but that wasn&amp;rsquo;t surprising.  I did find a number of HTML to PDF converters though, and I knew you could convert ANSI to HTML. So, I set up an &lt;code&gt;ANSI -&amp;gt; HTML -&amp;gt; PDF&lt;/code&gt; pipeline and quickly discovered that my PDFs looked &lt;em&gt;terrible&lt;/em&gt;. The problem was the HTML. Every existing ANSI to HTML converter had some aspect of it that made it just unusable. In one case, my half-page test grid of colors ended up being an unreadably small postage stamp in the corner once it made the final transition. Others didn&amp;rsquo;t actually support the various color codes very well.&lt;/p&gt;
&lt;h2 id=&#34;choosing-a-technology&#34;&gt;Choosing a technology&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/theZiz/aha&#34;&gt;aha&lt;/a&gt; (Ansi HTML Adapter) seemed the best of the available tools. It was written in C. I figured it was better (and faster) to debug and tweak something that was fast and mostly working, than it was to write something from scratch. Unfortunately, it&amp;rsquo;s source code was not up to my standards. It worked, but it wasn&amp;rsquo;t very readable, or commented, or well organized. It was more a stream of consciousness in code form. As I spent more time refactoring it, I realized that by the time I was done, I&amp;rsquo;d have a completely different codebase that was readable, and maintainable, but still not very extensible.&lt;/p&gt;
&lt;p&gt;So, I began to write &lt;a href=&#34;https://github.com/masukomi/oho/#readme&#34;&gt;oho&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It was clear from my work refactoring aha that this was going to be a non-trivial codebase with multiple files. I wanted to write it in a language that would allow me to distribute it &lt;em&gt;without&lt;/em&gt; people having to know anything about the ecosystem surrounding it. Ruby is terrible for that because you need to know about Gems, and Bundler, and most systems ship with old Ruby versions and&amp;hellip; I wanted this to be simple for users. So, I needed a compiled language. &lt;a href=&#34;https://crystal-lang.org/&#34;&gt;Crystal&lt;/a&gt; met those requirements, and I&amp;rsquo;d been using it for a while and found it rather enjoyable, so that&amp;rsquo;s what I used.&lt;/p&gt;
&lt;p&gt;Crystal produces Dynamically Linked executables (like most compiled languages) so distribution was just a matter of creating a Homebrew script (for Mac users) that told people&amp;rsquo;s computers where to download it and what dynamic libraries it dependend on. The same can be done for other systems with little difficulty.&lt;/p&gt;
&lt;p&gt;Chicken Scheme would have been another choice I could have easily worked with, but beyond just producing a single executable, Crystal is less intimidating to most developers. Lisps are treated as exotic things with &amp;ldquo;too many parentheses.&amp;rdquo; I wanted something that could be easily enhanced by anyone in the Open Source community. Crystal looks very similar to Ruby (it&amp;rsquo;s essentially just Statically Typed Ruby), and organizes its code along lines that are familiar to most developers who use descendents of C (Ruby, Python, Java, etc). Crystal also has a decent testing framework built in. It could be better, but it gets the job done relatively painlessly.&lt;/p&gt;
&lt;p&gt;So, I chose a language that would give me a single executable that required no knowledge of the language or ecosystem it was written in to install, would be easy to test, and easy to extend by people unfamiliar with the codebase. If I had it to do again, I might write it in Go, because of the &lt;a href=&#34;https://en.wikipedia.org/wiki/Static_library&#34;&gt;Statically Linked&lt;/a&gt; executables it creates, along with easy cross-compilation.&lt;/p&gt;
&lt;p&gt;In the end, I had a fast tool that I installed at work and began presenting the project managers with colorful PDFs for each release. Since then, I&amp;rsquo;ve added support for more esoteric escape sequences, and plan on continuing to do so in the future.&lt;/p&gt;
&lt;p&gt;I also had fun writing it.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Quality Is Rarely Job 1</title>
      <link>https://weblog.masukomi.org/2019/03/03/quality-is-rarely-job-1/</link>
      <pubDate>Sun, 03 Mar 2019 15:13:58 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/2019/03/03/quality-is-rarely-job-1/</guid>
      <description>&lt;p&gt;In 1981 &lt;a href=&#34;https://www.autonews.com/article/20160629/RETAIL03/160629819/robert-cox-ad-man-behind-ford-s-quality-is-job-1-pitch-dies&#34;&gt;Robert Cox&lt;/a&gt;
came up with a slogan for Ford; &amp;ldquo;Quality is Job 1&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;It has always stuck with me.&lt;/p&gt;
&lt;p&gt;In the software industry there are few slogans could be further from the truth.
C-level&amp;rsquo;s and other customer facing types frequently proclaim the &amp;ldquo;quality&amp;rdquo; of
their products, but they aren&amp;rsquo;t the ones &lt;em&gt;making&lt;/em&gt; the product. They&amp;rsquo;re
frequently not even the ones &lt;em&gt;using&lt;/em&gt; the product.&lt;/p&gt;
&lt;p&gt;In software there are two viable ways to release quality software. You can
release it when everything you want done is done, or you can release what you
happen to have done at a specific date. You can&amp;rsquo;t combine the two, although
almost every software company tries to.&lt;/p&gt;
&lt;p&gt;People outside of engineering tell clients X will be ready on Y date. That date
is inevitably too soon for the promised features to be completed.&lt;/p&gt;
&lt;p&gt;Realistically, there is only one way to combine promised dates and promised
features in software. You compromise the quality. People could, promise a date
generously far in the future, but that&amp;rsquo;s not very helpful meeting to this
quarter&amp;rsquo;s sales goals.&lt;/p&gt;
&lt;p&gt;In order to deliver quality an engineer needs the support of  management to
&lt;em&gt;not&lt;/em&gt; deliver code that isn&amp;rsquo;t done. &amp;ldquo;Done&amp;rdquo; of course doesn&amp;rsquo;t mean &amp;ldquo;It seems to
work.&amp;rdquo; or &amp;ldquo;QA didn&amp;rsquo;t complain.&amp;rdquo; Done means &amp;ldquo;I have tests to prove it works.&amp;rdquo;
Done means &amp;ldquo;QA can prove it works when users get ahold of it.&amp;rdquo; Done means &amp;ldquo;It&amp;rsquo;s
intuitive for users.&amp;rdquo; For multi-user systems Done means &amp;ldquo;We can prove it works
when tons of users try to use it at the same time.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Done might not mean &amp;ldquo;It does everything that was requested.&amp;rdquo; There are always
more features to add. It does mean that everyone, even the client, agrees that
the features that are Done, are &amp;ldquo;enough&amp;rdquo; for now.&lt;/p&gt;
&lt;p&gt;I believe that there are a few companies out there that actually deliver
&amp;ldquo;quality&amp;rdquo; software that even their engineers believe in. I&amp;rsquo;ve never worked for
someone else&amp;rsquo;s company that did this. Features sure, but overall product
quality? No.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Your Own God(s)</title>
      <link>https://weblog.masukomi.org/2019/01/12/your-own-gods/</link>
      <pubDate>Sat, 12 Jan 2019 21:03:48 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/2019/01/12/your-own-gods/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve had an idea &lt;a href=&#34;https://weblog.masukomi.org/2008/10/14/buzzbbuling-definition/&#34;&gt;buzzbuling&lt;/a&gt; around my head for a while, that I&amp;rsquo;d like to share with you.  If you&amp;rsquo;re a devout follower of any religion, I ask that you set aside what your preconceptions for a few minutes, and listen openly to this somewhat heretical thought.&lt;/p&gt;
&lt;h2 id=&#34;premise&#34;&gt;Premise&lt;/h2&gt;
&lt;p&gt;All, or at least &lt;em&gt;most&lt;/em&gt;, gods are created by people. Maybe I&amp;rsquo;m wrong, and there is one &lt;em&gt;true&lt;/em&gt; deity, but logically if one is true, then all the conflicting gods must be the creation of human minds.  If none are true, then they&amp;rsquo;re all human fiction.&lt;/p&gt;
&lt;p&gt;No-one has any proof that &lt;em&gt;their&lt;/em&gt; deity, or deities, are the true ones that will &lt;em&gt;really&lt;/em&gt; handle our souls in the afterlife. Statistically speaking it is improbable that whatever god you&amp;rsquo;ve been told is the real one is, &lt;em&gt;actually&lt;/em&gt; the real one (assuming any are).  There are just too many gods.  Plus, just because a lot of people agree about something doesn&amp;rsquo;t mean they&amp;rsquo;re correct. There is far too much historical evidence for that statement. In terms of religions, look at the Greek pantheon. Essentially no-one believes that the Greek gods exist, or ever existed, and yet countless people prayed to them daily. &amp;ldquo;Everyone&amp;rdquo; knew they were real, and now &amp;ldquo;everyone knows&amp;rdquo; they&amp;rsquo;re just old human fiction.&lt;/p&gt;
&lt;p&gt;Additionally, we have the fact that holy teachings are constantly being twisted by their &amp;ldquo;faithful&amp;rdquo;. Witness the Christian Crusades completely ignoring the &amp;ldquo;Thou shalt not kill.&amp;rdquo;  and &amp;ldquo;Love thy neighbor.&amp;rdquo; rules when they went off and killed or tortured vast swaths of people who believed differently.  Priests of &lt;em&gt;every&lt;/em&gt; religion disagree about what their god(s) want you to do all the time. The Bible, for example, has had the meaning of many of its passages dramatically changed through translation &amp;ldquo;errors&amp;rdquo; over the many versions since its original Aramaic. Even if the deities you were told were the &amp;ldquo;true&amp;rdquo; ones are actually, the true ones it is incredibly unlikely that what you were taught about what they want is actually &amp;ldquo;true&amp;rdquo;. Could &lt;em&gt;any&lt;/em&gt; human language accurately, and unerringly, capture and describe the will of a god?&lt;/p&gt;
&lt;h2 id=&#34;reality&#34;&gt;Reality&lt;/h2&gt;
&lt;p&gt;There&amp;rsquo;s no denying that the &lt;em&gt;belief&lt;/em&gt; in deities has a very real value to very many people. The more difficult our lives are, the more we reach out to the gods for comfort and protection. Many people who truly pray seem to feel &lt;em&gt;something&lt;/em&gt; positive come from their actions, even if it&amp;rsquo;s just the sense that someone is watching out for them.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Prayer, like meditation, influences our state of mind, which, in turn, influences our &amp;ldquo;state of body&amp;rdquo;. It reduces the experience of anxiety, elevates a depressed mood, lowers blood pressure, stabilizes sleep patterns and impacts autonomic functions like digestion and breathing. Further, in influencing our state of body-mind, prayer and meditation also influence our thinking. This prompts a shift in the habits of the mind, and, subsequently, patterns of behavior. These changes, in turn and over time, induce changes in the brain, further influencing our subjective and objective experience of the world and how we participate in it. - &lt;a href=&#34;https://www.psychologytoday.com/us/blog/enlightened-living/201007/the-science-psychology-and-metaphysics-prayer&#34;&gt;Psychology Today&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;heresy&#34;&gt;Heresy&lt;/h2&gt;
&lt;p&gt;If gods are human fiction, and it&amp;rsquo;s unlikely that whatever god(s) you believe in are real, &lt;em&gt;but&lt;/em&gt; having someone or something to believe in, and pray to, can provide us with comfort and solace, then why not create your own god or gods that reflect the world as you see it?&lt;/p&gt;
&lt;p&gt;Imagine what happens when you start to live in a world surrounded by gods you know intimately; gods who manipulate, or ignore, the world around us in ways that are entirely sensible, because they are the ways you envisioned.&lt;/p&gt;
&lt;p&gt;Maybe you create new ones. Maybe you repackage the ones you grew up with in newer garb that makes more sense to you. Maybe you love Jehovah, but can&amp;rsquo;t believe everything in a Bible that regularly contradicts itself. Maybe Zeus is still around, but not living on Mt. Olympus anymore. Maybe Media is a new god that far too many people pray to&amp;hellip;  It&amp;rsquo;s entirely possible that your personal god(s) may actually be a true description of the &amp;ldquo;real&amp;rdquo; god(s)  given to you by holy inspiration.&lt;/p&gt;
&lt;p&gt;Everything we&amp;rsquo;re taught tells us this is &amp;ldquo;wrong&amp;rdquo;. History, however, tells us this this is what humans have always done. For me the real question is, will you give yourself permission to take this leap? Will you give yourself permission to do what our ancestors did again and again? Even an atheist can benefit from their own personal pantheon to pray to, or swear by.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Basic Readiness</title>
      <link>https://weblog.masukomi.org/2018/12/01/basic_readiness/</link>
      <pubDate>Sat, 01 Dec 2018 11:12:49 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/2018/12/01/basic_readiness/</guid>
      <description>&lt;p&gt;Basic readiness is a problem for most people. We assume that we&amp;rsquo;ll always have power, water, and food. We ignore the fact that this stuff goes away regularly, because it usually happens to someone else.&lt;/p&gt;
&lt;p&gt;There was a snow storm here in Vermont (USA) last week. This was not a blizzard. As far as weather goes, this wasn&amp;rsquo;t particularly dramatic. There was just a lot of heavy snow and some high winds. Monday night the news came that towns were starting to loose power. As the weight of the snow took down more and more trees and branches, it became clear that this was going to be major.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;[Green Mountain Power] tripled its field force with external crews from Massachusetts, New York, New Hampshire, Connecticut and Ontario and Quebec in Canada. GMP also doubled its tree crews with teams from Pennsylvania, New York and New Hampshire.&amp;rdquo; - &lt;a href=&#34;https://greenmountainpower.com/news/gmp-crews-restore-power-to-more-than-90000-customers-after-snow-storm-knocks-out-power-to-more-than-106000/&#34;&gt;Green Mountain Power&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;They let folks know early on that some people wouldn&amp;rsquo;t have power restored until Saturday (five days later). On Friday this was reported:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Winter is here in full force and is prepared to hit us again with another storm forecasted for Saturday. Green Mountain Power crews have been out all week and so far, restored power to more than 100,000 customers. Crews are on track to finish restorations tomorrow, just as forecasters say a new storm system will hit Vermont. GMP is preparing for the possibility of new outages starting Saturday night. The storm is expected to bring wet snow, freezing rain and ice to already hard-hit areas of central and southern Vermont.&amp;rdquo; - &lt;a href=&#34;https://vermontbiz.com/news/2018/november/30/storm-cleanup-continues-new-one-coming&#34;&gt;Vermont Biz&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;100,000 people&lt;/em&gt; were without power. Some of them for almost a week. Cell phone towers usually have a few hours of emergency power. Outside of the city, when a tree takes out power lines it frequently takes out your phone, cable, and internet too.&lt;/p&gt;
&lt;p&gt;Emergencies like this happen. They&amp;rsquo;re not rare. They just tend to get spread out, and we assume that because &lt;em&gt;we&lt;/em&gt; haven&amp;rsquo;t had an emergency like that we&amp;rsquo;ll be fine. But even 24 hours without power can be a big deal in the winter or on summer days when the temperature is around the 100°F (38°C) mark.&lt;/p&gt;
&lt;p&gt;So, here&amp;rsquo;s my question to you. If your neighborhood lost power for 3 days in the dead of winter, what would you do? What if you were snowed in? What if the storm was still going?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Can you keep your family and pets from freezing?&lt;/li&gt;
&lt;li&gt;Can you keep your pipes from freezing?&lt;/li&gt;
&lt;li&gt;Do you have enough food?&lt;/li&gt;
&lt;li&gt;Do your pets have enough food?&lt;/li&gt;
&lt;li&gt;If you live in a rural area, how will you know when the roads are safe?&lt;/li&gt;
&lt;li&gt;If someone gets hurt, how will you contact emergency personnel? (remember: no phone, cell, or internet)&lt;/li&gt;
&lt;li&gt;What if someone becomes hypothermic?&lt;/li&gt;
&lt;li&gt;Does your town have a warming shelter? If they don&amp;rsquo;t, where&amp;rsquo;s the nearest one? Do they allow pets?&lt;/li&gt;
&lt;li&gt;What if the roads aren&amp;rsquo;t drivable?&lt;/li&gt;
&lt;li&gt;What about medical devices (even &lt;a href=&#34;https://en.wikipedia.org/wiki/Continuous_positive_airway_pressure&#34;&gt;CPAP&lt;/a&gt;s) or things like insulin that need to be kept at a certain temperature?&lt;/li&gt;
&lt;li&gt;How will you get water if the water pumps have no power?&lt;/li&gt;
&lt;li&gt;What about food? Supermarkets get cleared out &lt;em&gt;before&lt;/em&gt; a storm, and don&amp;rsquo;t like taking deliveries or doing business when they have no lights, or refrigeration, and can&amp;rsquo;t process anyone&amp;rsquo;s credit / debit cards.&lt;/li&gt;
&lt;li&gt;If your car breaks down on the side of the road when people were told not to drive, how will you call for help? How will you keep from freezing?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And that&amp;rsquo;s just questions for winter. What about something like the California wildfires?&lt;/p&gt;
&lt;p&gt;I wish it wasn&amp;rsquo;t so hard to get people to think about these things. I wish people wouldn&amp;rsquo;t keep disregarding these types of simple emergencies that happen to people in first world countries every year. Climate change creates more extreme weather, and is even being &lt;a href=&#34;https://nuscimag.com/does-climate-change-really-trigger-earthquakes-41a91477e7fc&#34;&gt;linked to earthquakes&lt;/a&gt;. These events will happen with increasing frequency, but even if it didn&amp;rsquo;t, it already happens with &lt;em&gt;enough&lt;/em&gt; frequency that we should all take it seriously.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.ready.gov/&#34;&gt;Ready.gov&lt;/a&gt; has basic guidelines to get you started with planning for events like these.  They&amp;rsquo;ve also got a guide to putting together &lt;a href=&#34;https://www.ready.gov/build-a-kit&#34;&gt;a simplistic emergency kit&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Libraries, Fameworks, and DSLs</title>
      <link>https://weblog.masukomi.org/2018/08/16/libraries_frameworks_and_dsls/</link>
      <pubDate>Thu, 16 Aug 2018 23:23:07 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2018/08/16/libraries_frameworks_and_dsls/</guid>
      <description>&lt;p&gt;One of my coworkers was trying to understand the differences between libraries,
frameworks, and DSLs and asked me&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;how do I know what i&amp;rsquo;m using when all these things are&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;interacting and being used &lt;em&gt;within&lt;/em&gt; each other, etc&lt;/p&gt;
&lt;p&gt;To some degree, you don&amp;rsquo;t, and it doesn&amp;rsquo;t matter, but that&amp;rsquo;s not a very helpful
answer. So let me step back and talk about what each of these are. &lt;/p&gt;
&lt;h2 id=&#34;libraries&#34;&gt;Libraries&lt;/h2&gt;
&lt;p&gt;Libraries are the simplest. A library is just a collection of code intended to
be reused. They&amp;rsquo;re typically packaged using a package manager, but it doesn&amp;rsquo;t
&lt;em&gt;need&lt;/em&gt; to be &amp;ldquo;packaged&amp;rdquo;. It could be just some file of useful code that you load
into your code like any other source file.&lt;/p&gt;
&lt;p&gt;A library is the hardest to &amp;ldquo;know&amp;rdquo; you&amp;rsquo;re using because it generally provides
some new classes or methods. Unless you happen to know where those clasess and
methods came from you don&amp;rsquo;t know you&amp;rsquo;re using it. In languages like Ruby where
you can alter code at runtime a library could change the behavior of existing
code; no new methods, no new code, things just behave differently.&lt;/p&gt;
&lt;h2 id=&#34;dsls&#34;&gt;DSLs&lt;/h2&gt;
&lt;p&gt;DSLs are Domain Specific Languages. The greatest example, in my opinion is SQL.
For example&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;select&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;students&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;where&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;age&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Without any SQL knowledge you can probably guess that there&amp;rsquo;s a list of students
somewhere, and running that line will return the names of each one who is older
than 7.&lt;/p&gt;
&lt;p&gt;SQL is very powerful, but it&amp;rsquo;s very focused on querying and manipulating tables
of data. It makes that very easy, but it&amp;rsquo;s really crappy at everything else.
That&amp;rsquo;s pretty typical of a DSL.&lt;/p&gt;
&lt;p&gt;In the Ruby world we have a lot of DSLs but people tend to not recognize them as
such. For example, an &lt;a href=&#34;http://rspec.info/&#34;&gt;RSpec&lt;/a&gt; test might have something like
this&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;describe&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Math&amp;#34;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	 &lt;span class=&#34;n&#34;&gt;context&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;double&amp;#34;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	   &lt;span class=&#34;n&#34;&gt;it&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;should return twice the input&amp;#34;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	     &lt;span class=&#34;n&#34;&gt;expect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;Math&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;double&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;to&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;eq&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	   &lt;span class=&#34;k&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	 &lt;span class=&#34;k&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Like SQL it&amp;rsquo;s pretty easy to guess what it does. &lt;/p&gt;
&lt;p&gt;You might be thinking &amp;ldquo;But rspec&amp;rsquo;s just Ruby code. That&amp;rsquo;s just Ruby methods.&amp;rdquo;
This is true. RSpec is a DSL written in Ruby. It&amp;rsquo;s not limited to Ruby though. I
could port RSpec to most languages and maintain the same syntax.&lt;/p&gt;
&lt;p&gt;You can think of a DSL as a collection of commands that simplify instructing the
computer to do something in a focused domain.&lt;/p&gt;
&lt;p&gt;How do you know when you&amp;rsquo;re code from a DSL instead of your core language? If
you are dealing with a non-trivial set of commands, that aren&amp;rsquo;t part of the core
language, and are all focused on helping with one specific aim, you&amp;rsquo;re probably
using a DSL. &lt;/p&gt;
&lt;p&gt;RSpec, is a DSL, that&amp;rsquo;s packaged up as a library, that can be added to your
project. Loading the library teaches the Ruby compiler how to understand the
RSpec DSL.&lt;/p&gt;
&lt;h2 id=&#34;frameworks&#34;&gt;Frameworks&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://stackoverflow.com/users/1407434/neha-choudhary&#34;&gt;Neha Choudhary&lt;/a&gt;
&lt;a href=&#34;https://stackoverflow.com/a/12733126/13973&#34;&gt;described it like this&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If I told you to cut a piece of paper with dimensions 5m by 5m, then surely
you would do that. But suppose I ask you to cut 1000 pieces of paper of the
same dimensions. In this case, you won&amp;rsquo;t do the measuring 1000 times;
obviously, you would make a frame of 5m by 5m, and then with the help of it
you would be able to cut 1000 pieces of paper in less time.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That sounds a lot like a DSL, and from some perspectives there is overlap. But a
framework doesn&amp;rsquo;t make it easier to do only one thing. It provides a large
infrastructure to facilitate the connection of things in many domains.&lt;/p&gt;
&lt;p&gt;I like to think of them like skeletons. Skeletons are collections of bones. Some
bones are for protection. Some facilitate locomotion. Some facilitate eating.
Collected together they are a framework with areas specialized for holding
digestive bits, and areas specialized helping us move around, and so on.
Creatures can exist without them, but once you have a skeleton lots of things
become easier to accomplish. Code can exist without frameworks, but frameworks
make it easier to create code that does big complex things.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s look at Rails (a web development framework) as an example.&lt;/p&gt;
&lt;p&gt;Rails (like most web frameworks) provides infrastructure to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;facilitate object relational mapping to store the data you&amp;rsquo;ve collected
about some object in your system in a database, and then take the data in a
database and convert it back to objects in your system.&lt;/li&gt;
&lt;li&gt;facilitate the handling of HTTP requests from a web server and make it easy
to query all their relevant pieces (form data, headers, query string data,
cookies, etc.)&lt;/li&gt;
&lt;li&gt;facilitate the generation of HTTP responses to a web server with all their
relevant pieces (headers, cookies, mime types, content (html, javascript,
css, etc)&lt;/li&gt;
&lt;li&gt;facilitate the handling of those http request objects it created for you&lt;/li&gt;
&lt;li&gt;template management (in various templating DSLs, haml, erb, etc)&lt;/li&gt;
&lt;li&gt;facilitating the connection of templates to the things handling the requests&lt;/li&gt;
&lt;li&gt;logging&lt;/li&gt;
&lt;li&gt;testing (of models, of controllers, of views)&lt;/li&gt;
&lt;li&gt;and many, many more things.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You could say that almost all of those involve some DSLs. Making a class a
descendent of &lt;code&gt;ActiveRecord::Base&lt;/code&gt; connects it to a database table, gives it a
getter and setter method that corresponds to every column of that database
table, functions to update, validate, save, delete, etc. There are even methods
for describing the relationship between other classes tied into tables like
&lt;code&gt;belongs_to :some_class&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;All those methods are part of a DSL for manipulating the data in database
tables. Just like SQL. But, that DSL doesn&amp;rsquo;t know anything about manipulating
HTTP requests, even though Rails does.&lt;/p&gt;
&lt;p&gt;Rails is a Framework, made of a collection of DSLs, packaged in a Library.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;
&lt;p&gt;So, how do you know when you&amp;rsquo;re using a Library, a DSL, or a Framework?&lt;/p&gt;
&lt;p&gt;The only way you&amp;rsquo;re &lt;em&gt;not&lt;/em&gt; using a library is if you&amp;rsquo;re writing something that
only uses code from the smallest beating core of your language.&lt;/p&gt;
&lt;p&gt;Most languages come with a &amp;ldquo;Standard Library&amp;rdquo; which is a collection of classes
to save people from writing a lot of obnoxious low level code. For example: most
languages have a &lt;code&gt;Date&lt;/code&gt; class (or something like one). That&amp;rsquo;s part of the
Standard Library. Compilers have no need of a &lt;code&gt;Date&lt;/code&gt; class. They can do their
job just fine without one. That&amp;rsquo;s a convenience library for the humans.&lt;/p&gt;
&lt;p&gt;Are you using a DSL? If using methods defined as part of a Framework then
there&amp;rsquo;s a good chance you are. Frameworks are frequently collections of things
that could be classified as DSLs. If you&amp;rsquo;re using a set of commands that would
be useless for anything other than one focused domain, then you&amp;rsquo;re probably
using a DSL.&lt;/p&gt;
&lt;p&gt;Are you using a framework? That&amp;rsquo;s the easiest. Did you load a framework? Are you
calling methods defined in that framework? Then yes, you&amp;rsquo;re using a framework.&lt;/p&gt;
&lt;p&gt;If you are using methods defined in a framework, that are also a DSL, then
you&amp;rsquo;re using all three, because frameworks are collections of code intended to
be reused.&lt;/p&gt;
&lt;p&gt;Ultimately, it doesn&amp;rsquo;t matter what you&amp;rsquo;re using, but there is value in knowing
where the commands you&amp;rsquo;re calling come from. When you start another project, you
will know what libraries to pull in to give you those commands again without
having to create them from scratch.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Converting HTML to PDF on the command line</title>
      <link>https://weblog.masukomi.org/2018/05/25/html-to-pdf-on-the-command-line/</link>
      <pubDate>Sun, 27 May 2018 21:39:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2018/05/25/html-to-pdf-on-the-command-line/</guid>
      <description>&lt;p&gt;I recently needed to convert some HTML to PDF on the command line and went hunting down the options.&lt;/p&gt;
&lt;p&gt;There numerous posts saying &amp;ldquo;X is great&amp;rdquo; &amp;ldquo;Y works great for me&amp;rdquo; but no-one gives examples that show you anything.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve tried &lt;a href=&#34;https://weasyprint.org/&#34;&gt;WeasyPrint&lt;/a&gt;, &lt;a href=&#34;https://wkhtmltopdf.org/&#34;&gt;wkhtmltopdf&lt;/a&gt;, &lt;a href=&#34;https://pandoc.org/&#34; title=&#34;Pandoc&#34;&gt;Pandoc&lt;/a&gt; and Google Chrome (yes via the command line). The test was simple. Take a simple color chart, made from pre-formatted text and render it as a pdf.  This doesn&amp;rsquo;t test any fancy CSS grid layout, or sizing or &amp;hellip; anything. Just straight pre-formatted text with some spans that only define colors.&lt;/p&gt;
&lt;p&gt;Here is &lt;a href=&#34;https://weblog.masukomi.org/images/2018/05/26/colortest.html&#34;&gt;the original html&lt;/a&gt; and here&amp;rsquo;s what the conversions looked like.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2018/05/26/three_pdfs_from_one_html.png&#34; alt=&#34;3 pdfs from the same HTML&#34;&gt;&lt;/p&gt;
&lt;p&gt;The version rendered from Chrome is perfect. I have zero complaints.&lt;/p&gt;
&lt;p&gt;The version from WeasyPrint is cut off on the right edge. Note that it is not the window that&amp;rsquo;s cutting it off. That&amp;rsquo;s the edge of the PDF itself.&lt;/p&gt;
&lt;p&gt;The wkhtmltopdf is perfect &lt;em&gt;if&lt;/em&gt; you zoom waaaaaay into it. Realistically though it&amp;rsquo;s unusable crap because it&amp;rsquo;s so small.  Note that it has also added a border&lt;/p&gt;
&lt;p&gt;Pandoc (not included in the screenshot above) seems to be really focused on &lt;em&gt;text&lt;/em&gt;. The result was completely devoid of color, used a different font, and was centered in the page. It did maintain the formatting within the table though.&lt;/p&gt;
&lt;p&gt;The winner, for me, is clearly Chrome. The magic incantation is as follows. Save it in a file called &lt;code&gt;html_to_pdf&lt;/code&gt; and then you can convert your html with&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;html_to_pdf path/to/my/html_file.html
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It will generate an &lt;code&gt;output.pdf&lt;/code&gt; file in the current directory.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/sh

# on linux everything before --headless can be replaced with just
# chrome
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \
  --headless \
  --disable-gpu \
  --no-margins \
  --print-to-pdf $1
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;p&gt;This all came about because I&amp;rsquo;d recently written &lt;a href=&#34;https://github.com/masukomi/oho#readme&#34;&gt;oho (an app for converting your colorful terminal output to HTML)&lt;/a&gt;, and I wanted to convert that HTML to PDF to more easily share with my coworkers over Slack. Oho is perfect for sharing terminal output on a blog though. ;)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Zed Shaw&#39;s Utu: Saving the internet with hate</title>
      <link>https://weblog.masukomi.org/2018/03/25/zed-shaws-utu-saving-the-internet-with-hate/</link>
      <pubDate>Sun, 25 Mar 2018 13:51:38 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2018/03/25/zed-shaws-utu-saving-the-internet-with-hate/</guid>
      <description>&lt;p&gt;A high level summary (and paraphrasing) of &lt;a href=&#34;https://zedshaw.com/&#34;&gt;Zed Shaw&lt;/a&gt;&amp;rsquo;s &lt;a href=&#34;https://youtu.be/ziTMh8ApMY4?t=1m33s&#34;&gt;talk at DEFCON 15&lt;/a&gt; (in 2007)  because I couldn&amp;rsquo;t find a good text version.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Utu is the Maori word for a system of revenge used by Maori society to provide social controls and retribution. Utu is also a protocol that uses cryptographic models of social interaction to allow peers to vote on their dislike of other peer&amp;rsquo;s behavior. The goal of Utu is to experiment with the effects of bringing identity, reputation, and retribution to human communications on the Internet. A secondary goal is wiping out IRC because apparently nobody really likes IRC.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The Utu project is now dead, but &lt;a href=&#34;https://github.com/zedshaw/utu&#34;&gt;its source code can be found on Github&lt;/a&gt;. While reading this keep in mind that the core idea is a centralized chat server.&lt;/p&gt;
&lt;h1 id=&#34;part-1-the-idea&#34;&gt;Part 1: The Idea&lt;/h1&gt;
&lt;h2 id=&#34;philosophical-foundations&#34;&gt;Philosophical Foundations&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Strong Identity&lt;/li&gt;
&lt;li&gt;Reputation&lt;/li&gt;
&lt;li&gt;Retribution&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you have and combine those, you can start to implement some controls available in human communications.&lt;/p&gt;
&lt;h3 id=&#34;strong-identity&#34;&gt;Strong Identity&lt;/h3&gt;
&lt;p&gt;In order to have strong identity everyone has a cryptographic key, but because keys are so easy to create you have to be invited, and you have to have a handshake as part of the invitation because you need to care about who the invitee is. This doesn&amp;rsquo;t work if any jerk can invite any other jerk without consequence.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Zed certify that he wants to invite Joe.&lt;/li&gt;
&lt;li&gt;Joe certifies that yes, that invite is from Zed.&lt;/li&gt;
&lt;li&gt;Joe takes action to assert that they actually want the invite&lt;/li&gt;
&lt;li&gt;Zed says yup, I really did want Joe to join us.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;reputation&#34;&gt;Reputation&lt;/h3&gt;
&lt;p&gt;Rather than associating likes with an identity or posts you associate &amp;ldquo;hate&amp;rdquo; with an identity, and over time that hate builds up from many people.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Wouldn&amp;rsquo;t it be great to punish the dickheads?&amp;rdquo;&lt;/p&gt;
&lt;h3 id=&#34;retribution&#34;&gt;Retribution&lt;/h3&gt;
&lt;p&gt;(Keep in mind that Utu was intended as a chat network)&lt;/p&gt;
&lt;p&gt;As a person builds up hate they have to do some cryptographic proof of work before they can do anything. The more hate they have the more work their computer has to do before they can say anything.&lt;/p&gt;
&lt;p&gt;This accretion of hate gives you a weighted social network that you can crunch numbers on. You can figure out who &amp;ldquo;hates&amp;rdquo; who, who talks to who, where they come from, and we can start looking at the social problem.&lt;/p&gt;
&lt;p&gt;You can say &amp;ldquo;Hey, if we change the hate model to be this way, or we change the hate model to be that way, how does the social network change? Do the jerks go further away?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Another alternative to hate is distance, because people aren&amp;rsquo;t prevented from talking to you it just takes them longer.&lt;/p&gt;
&lt;h1 id=&#34;part-2-the-implementation&#34;&gt;Part 2: The Implementation&lt;/h1&gt;
&lt;h2 id=&#34;geeky-details&#34;&gt;Geeky Details&lt;/h2&gt;
&lt;h3 id=&#34;the-protocol&#34;&gt;The Protocol&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Sends 2 bytes for size &lt;code&gt;(htons(size))&lt;/code&gt;  (for framing)&lt;/li&gt;
&lt;li&gt;Sends the data structure (&amp;ldquo;Stackish&amp;rdquo;)
&lt;ul&gt;
&lt;li&gt;S-expressions with netstrings in a FORTH stack order&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[[&#39;4:test&#39; 1234 child root&lt;/code&gt; is equivalent to this lisp &lt;code&gt;(root (child (1234 &#39;4:test&#39;)))&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;That&amp;rsquo;s it.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;semantics&#34;&gt;Semantics&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Determined by the Hub (everyone talking to hub)
&lt;ul&gt;
&lt;li&gt;routes things to different chat rooms&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;One Stackish node for header&lt;/li&gt;
&lt;li&gt;Another for body&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;data-encoding&#34;&gt;Data Encoding&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Always ASCII text, but you can put anything you want in BLOBs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;simplicity-is-key&#34;&gt;Simplicity is Key&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;2 bytes for frame&lt;/li&gt;
&lt;li&gt;Stackish for header and body&lt;/li&gt;
&lt;li&gt;easy to implement&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;security-preventions&#34;&gt;Security Preventions&lt;/h3&gt;
&lt;p&gt;Zed believes that you need to design your software with the assumption&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;..that everyone on the internet is a fucking ass hole and they need to be taken down&amp;hellip;If it goes on the internet it&amp;rsquo;s social software. It shouldn&amp;rsquo;t be designed assuming everyone likes you&amp;hellip; Eventually some person is going to hack it. Eventually someone is going to try and abuse it.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not going to be able to stop everyone&amp;hellip;but if the server and the protocol, like from the base of the protocol on up is designed to make it so it&amp;rsquo;s harder&amp;hellip; it&amp;rsquo;s not making it impossible, just harder&amp;hellip; then what I&amp;rsquo;m banking on is the predator concept. A predator, when picking two different types of prey, will pick the weakest one.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Client does all the crypto work to prove identity first and the server just validates it. If it&amp;rsquo;s wrong the server puts the identity in a blacklist and then boots them.&lt;/li&gt;
&lt;li&gt;Client is considered hostile&lt;/li&gt;
&lt;li&gt;Booted immediately&lt;/li&gt;
&lt;li&gt;A Finite State Machine controls&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;the-cryptography&#34;&gt;The Cryptography&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Never write your own. Let the pros do it.&lt;/li&gt;
&lt;li&gt;Follow the rules&lt;/li&gt;
&lt;li&gt;Use standard stuff&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Details on exactly what it uses are &lt;a href=&#34;https://youtu.be/ziTMh8ApMY4?t=20m48s&#34;&gt;at 20:48 in the talk&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;secure-coding-practices&#34;&gt;Secure Coding Practices&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;All code &amp;ldquo;ruthelessly&amp;rdquo; run through a test suite on a loop, with running stats used to compare releases.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;statistical-quality-control&#34;&gt;Statistical Quality Control&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Collect Information on
&lt;ul&gt;
&lt;li&gt;Valigrind erros&lt;/li&gt;
&lt;li&gt;Unit test errors&lt;/li&gt;
&lt;li&gt;Logged Errors&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Analyzed the changes over time&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;code-auditing&#34;&gt;Code Auditing&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Review my code repeatedly.&lt;/li&gt;
&lt;li&gt;Consistent &amp;ldquo;rules&amp;rdquo; I follow.&lt;/li&gt;
&lt;li&gt;Assume it&amp;rsquo;s always broken.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;c-coding-practices&#34;&gt;C Coding Practices&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bstring library for strings&lt;/li&gt;
&lt;li&gt;All functions have valiadtions
&lt;ul&gt;
&lt;li&gt;Assert&lt;/li&gt;
&lt;li&gt;Preconditions / postconditions&lt;/li&gt;
&lt;li&gt;Extensive Unit Testing.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;secure-unix-server-practices&#34;&gt;Secure Unix Server Practices&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The Server Always chroots ALWAYS&lt;/li&gt;
&lt;li&gt;Leave minimum resources open.&lt;/li&gt;
&lt;li&gt;Minimum configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;practical-demonstration&#34;&gt;Practical Demonstration&lt;/h3&gt;
&lt;p&gt;This &lt;a href=&#34;https://youtu.be/ziTMh8ApMY4?t=30m41s&#34;&gt;starts at 30:41 in the talk&lt;/a&gt; and involves a fair number of geeky commentary. For non geeks a) why did you read this far b) it&amp;rsquo;s just a really simplistic chat client.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The Guy Who Loved His Work</title>
      <link>https://weblog.masukomi.org/2018/03/21/the-guy-who-loved-his-work/</link>
      <pubDate>Wed, 21 Mar 2018 17:23:02 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2018/03/21/the-guy-who-loved-his-work/</guid>
      <description>&lt;p&gt;(or Why A Healthy Work-Life Balance Is Important)&lt;/p&gt;
&lt;p&gt;During the dot com boom I worked at a company with a developer who loved his work. The problems were challenging, and we really valued the things he produced.  Everyone who worked late late got dinner, and sometimes he&amp;rsquo;d work so late that he ended up sleeping by his desk. Bob (not his real name) wasn&amp;rsquo;t pushed to do this. He just really liked his job.&lt;/p&gt;
&lt;p&gt;After about five years the dot com crash hit.  A third of the company was laid off. Then another third of the company was laid off. Then everyone left was laid off and all the assets were sold to IBM.&lt;/p&gt;
&lt;p&gt;Bob was left with a five year gap in his life. He had nothing to show for that time. No real relationships. No software he could point to. It had disappeared into the bowels of IBM. I assume he became a better programmer during this time, but everything else suffered.&lt;/p&gt;
&lt;p&gt;Bob &lt;em&gt;could&lt;/em&gt; have been spending those hours writing cool software for himself. He &lt;em&gt;could&lt;/em&gt; have been helping open source projects that were important to him. He &lt;em&gt;could&lt;/em&gt; have spent time with the people he cared about. He &lt;em&gt;could&lt;/em&gt; have found new people to care about. He &lt;em&gt;could&lt;/em&gt; have been falling in love.&lt;/p&gt;
&lt;p&gt;Day after day, most of us help someone else&amp;rsquo;s company to thrive, and many of us forget that it&amp;rsquo;s not &lt;em&gt;our&lt;/em&gt; company. It&amp;rsquo;s not our &amp;ldquo;baby&amp;rdquo;. We don&amp;rsquo;t get rich if it succeeds, and we suffer when the people in charge make bad decisions. Your company may get sold, or implode. The people in charge may decide to abandon the thing you&amp;rsquo;ve devoted your time to. Even in a healthy company, your work rarely makes the world a better place. It rarely makes the people in it healthier, or happier.&lt;/p&gt;
&lt;p&gt;Our time on this planet is too limited, and most of our waking hours go to someone else. They aren&amp;rsquo;t devoted to improving &lt;em&gt;our&lt;/em&gt; lives or &lt;em&gt;our&lt;/em&gt; happiness.&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t let yourself wake up one day and discover you&amp;rsquo;re another Bob. Put in the hours you agreed to when you signed up, and then go do something for you.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Getting Started With Scuttlebutt</title>
      <link>https://weblog.masukomi.org/2017/12/26/getting-started-with-scuttlebutt/</link>
      <pubDate>Tue, 26 Dec 2017 09:56:35 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/2017/12/26/getting-started-with-scuttlebutt/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2017/12/hermies_300x300.png&#34; alt=&#34;Scuttlebutt Logo&#34;&gt;&lt;/p&gt;
&lt;p&gt;Ok, you&amp;rsquo;ve been hearing about &lt;a href=&#34;https://scuttlebutt.nz&#34;&gt;Scuttlebutt&lt;/a&gt;  and decided that &amp;ldquo;Yes, I do want to join an amazing social network with lots of good people that no company can control and also happens to also work offline.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a quick overview with the basics you need to know.&lt;/p&gt;
&lt;p&gt;First off Scuttlebutt is a protocol on which many different kinds of apps can be built.&lt;/p&gt;
&lt;p&gt;As for the social network, there are many clients, just like there are many Twitter clients. It doesn&amp;rsquo;t really matter which one you use. They&amp;rsquo;re all talking on the same network.&lt;/p&gt;
&lt;p&gt;As of Dec 2017 Patchwork is the most polished client and it doesn&amp;rsquo;t require you to know any geeky stuff. The only caveat is that it just wants to run on one computer. &lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; and your identity is tied to the files on the computer you install it on.&lt;/p&gt;
&lt;h2 id=&#34;step-0&#34;&gt;Step 0&lt;/h2&gt;
&lt;p&gt;If you haven&amp;rsquo;t done so already go to &lt;a href=&#34;https://www.scuttlebutt.nz/&#34;&gt;the Scuttlebutt Home Page&lt;/a&gt; and watch the video. Then come back.&lt;/p&gt;
&lt;h2 id=&#34;step-1&#34;&gt;Step 1&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;http://dinosaur.is/patchwork-downloader/&#34;&gt;Download Patchwork&lt;/a&gt;, and install like any other app.&lt;/p&gt;
&lt;h2 id=&#34;step-2&#34;&gt;Step 2&lt;/h2&gt;
&lt;p&gt;Boot it up and set up your profile.&lt;/p&gt;
&lt;p&gt;It doesn&amp;rsquo;t matter what name you put. It can be your real name. It can be a nickname. Like the real world it&amp;rsquo;s entirely possible for multiple people to have the same name. Your friends can give you nicknames too.&lt;/p&gt;
&lt;p&gt;You don&amp;rsquo;t need to upload an image, but I recommend that you do, because it&amp;rsquo;s much easier to figure out who is talking when there&amp;rsquo;s a visual, and the defaults are really generic. Some people use a photo of themselves. Some people use a random avatar they like, just like Twitter.&lt;/p&gt;
&lt;p&gt;The text area, like every text area in Patchwork uses &lt;a href=&#34;http://commonmark.org/help/&#34;&gt;markdown&lt;/a&gt;  formatting&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;Save that when you&amp;rsquo;re done.&lt;/p&gt;
&lt;h2 id=&#34;step-3&#34;&gt;Step 3&lt;/h2&gt;
&lt;p&gt;Get connected.
Because Scuttlebutt is a distributed network you need to find some people to follow. This is partially because it&amp;rsquo;s really &lt;em&gt;really&lt;/em&gt; boring if you&amp;rsquo;re not listening to anyone and no-one is listening to you. It&amp;rsquo;s also because you get &amp;ldquo;gossip&amp;rdquo; from the people you follow. &amp;ldquo;Gossip&amp;rdquo; is more than just info about people you&amp;rsquo;re interested in. It is also the name of &lt;a href=&#34;https://en.wikipedia.org/wiki/Gossip_protocol&#34;&gt;a protocol&lt;/a&gt; that Scuttlebutt uses to share information.&lt;/p&gt;
&lt;h3 id=&#34;connecting-locally&#34;&gt;Connecting Locally&lt;/h3&gt;
&lt;p&gt;Most of us don&amp;rsquo;t happen to be sitting next to someone else on the network. If you &lt;em&gt;are&lt;/em&gt; you&amp;rsquo;ll see them listed under &amp;ldquo;local&amp;rdquo; on the left. Click their profile to see more about them, and click &amp;ldquo;Follow&amp;rdquo; if you feel like following what that person has to say (just like Twitter).  You&amp;rsquo;ll start downloading information from them that they&amp;rsquo;ve posted to the network &lt;em&gt;and&lt;/em&gt; information their friends have posted.&lt;/p&gt;
&lt;h3 id=&#34;remotely&#34;&gt;Remotely&lt;/h3&gt;
&lt;p&gt;Even if you &lt;em&gt;are&lt;/em&gt; next to someone you&amp;rsquo;ll still want to connect to a &amp;ldquo;pub&amp;rdquo; server so that you can exchange info with others if no-one is nearby. In the video they&amp;rsquo;re described as being more like bartenders than pubs, because it&amp;rsquo;s the bartender who you gossip with at the pub, and shares the gossip of others.&lt;/p&gt;
&lt;p&gt;Go to &lt;a href=&#34;https://github.com/ssbc/scuttlebot/wiki/Pub-Servers&#34;&gt;the list of pub servers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Open one up in a new tab and you&amp;rsquo;ll see something like this.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2017/12/pub_server_page_1.png&#34; alt=&#34;pub server example&#34;&gt;&lt;/p&gt;
&lt;p&gt;Click the button to &amp;ldquo;Get An Invitation&amp;rdquo; and it&amp;rsquo;ll generate a custom invitation code just for you. Copy the whole thing. Then click the &amp;ldquo;+ Join Pub&amp;rdquo; button in Patchwork.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2017/12/join_pub_button.png&#34; alt=&#34;+ Join Pub button&#34;&gt;&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a limit to how far gossip will travel through a network of people, and the bartender at a pub is just another &amp;ldquo;person&amp;rdquo; in the chain. Because of this it&amp;rsquo;s good to connect to a few pubs. Also, it spreads the load.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; If you&amp;rsquo;ve already got a friend on Scuttlebutt, ask them what pub(s) they follow. Otherwise it&amp;rsquo;s possible that you&amp;rsquo;ll be out of range of each other, so to speak.&lt;/p&gt;
&lt;p&gt;The pub&amp;rsquo;s you&amp;rsquo;re currently connected to are listed on the left side if you click on &amp;ldquo;Public&amp;rdquo;.&lt;/p&gt;
&lt;h2 id=&#34;getting-all-the-gossip&#34;&gt;Getting all the Gossip&lt;/h2&gt;
&lt;p&gt;As soon as you connect to a pub or start following a person Scuttlebutt will start syncing down all the &amp;ldquo;gossip&amp;rdquo; they have for you, and pass on any &amp;ldquo;gossip&amp;rdquo; you have for them. *The first time you connect to a pub server there will be a lot to download. * So, give it some time.&lt;/p&gt;
&lt;h2 id=&#34;get-social&#34;&gt;Get Social!&lt;/h2&gt;
&lt;p&gt;You&amp;rsquo;ll see some channels listed in &amp;ldquo;Active channels&amp;rdquo; on the left, but the &amp;ldquo;More&amp;rdquo; menu up at the top has a &amp;ldquo;Browse All&amp;rdquo; option under &amp;ldquo;Channels&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2017/12/browse_all.png&#34; alt=&#34;browse all button&#34;&gt;&lt;/p&gt;
&lt;p&gt;Find a topic that looks interesting and start reading. When you&amp;rsquo;re ready to &amp;ldquo;Publish&amp;rdquo; remember that it uses Markdown formatting.&lt;/p&gt;
&lt;p&gt;Remember, it doesn&amp;rsquo;t matter if you&amp;rsquo;re online or not. You&amp;rsquo;ll still see all the images, and you&amp;rsquo;ll be able to respond to posts and create new ones. The next time you connect to a local person or a pub server everything will connect up. When you&amp;rsquo;re online this will happen constantly, and responses can appear very quickly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; There is no edit. There is no Undo. There is no delete. So, use your spellcheck, actually look at the Preview (When 	and publish mad.&lt;/p&gt;
&lt;h2 id=&#34;linking-to-things&#34;&gt;Linking To Things&lt;/h2&gt;
&lt;p&gt;Sooner or later you&amp;rsquo;re going to want to link to some web page. With markdown formatting that&amp;rsquo;s just &lt;code&gt;[display text](destination url)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;How do you link to other messages &lt;em&gt;in&lt;/em&gt; Scuttlebutt though? Well, first you need the message id. Right click on a link to the message you want to link to and choose &amp;ldquo;Copy Message ID&amp;rdquo; Then make a link just like a normal url link but use the message id as the destination url.&lt;/p&gt;
&lt;p&gt;Profiles are a little different. A profile is a feed for a single person. So, in that case you want to use &amp;ldquo;Copy Link Ref&amp;rdquo; For example, if I wanted to link to André&amp;rsquo;s profile I&amp;rsquo;d say &lt;code&gt;[here&#39;s André&#39;s profile](@QlCTpvY7p9ty2yOFrv1WU1AE88aoQc4Y7wYal7PFc+w=.ed25519)&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&#34;sharing-scuttlebutt-things-with-other-people&#34;&gt;Sharing Scuttlebutt things with other people&lt;/h3&gt;
&lt;p&gt;I wanted to share a really interesting conversation with a friend of mine who wasn&amp;rsquo;t on Scuttlebutt yet, so I right clicked on the first message in the thread, chose &amp;ldquo;Copy External Link&amp;rdquo; and then messaged them that link. You could Tweet it or post it on Facebook, or whatever.  The link goes to a public site where you can see, but not interact with, posts on Scuttlebutt.&lt;/p&gt;
&lt;p&gt;It should be noted that people can indicate that they don&amp;rsquo;t want their stuff shown on public sites or in search results on sites like Google.&lt;/p&gt;
&lt;h2 id=&#34;stay-happy-and-safe&#34;&gt;Stay Happy and Safe&lt;/h2&gt;
&lt;p&gt;Don&amp;rsquo;t worry, if come across someone whose views make you uncomfortable. You can always block them, and you&amp;rsquo;ll never receive any of their posts again, and they won&amp;rsquo;t get yours either.&lt;/p&gt;
&lt;hr&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://weblog.masukomi.org/2017/12/19/using-1-scuttlebutt-identity-on-multiple-devices/&#34;&gt;Here&amp;rsquo;s how to run it on multiple computers.&lt;/a&gt; Just remember to &lt;em&gt;never&lt;/em&gt; run it on multiple computers at the same time.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;The official scuttlebutt markdown reference is &lt;a href=&#34;https://www.scuttlebutt.nz/faq/applications/patchwork-markup.html&#34;&gt;here&lt;/a&gt; but it&amp;rsquo;s layout is terrible, and it doesn&amp;rsquo;t show the results.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Do Social Networks Need Companies?</title>
      <link>https://weblog.masukomi.org/2017/12/22/do-social-networks-need-companies/</link>
      <pubDate>Fri, 22 Dec 2017 09:37:51 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/2017/12/22/do-social-networks-need-companies/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been thinking a lot about &lt;a href=&#34;https://scuttlebutt.nz&#34;&gt;Scuttlebutt&lt;/a&gt; lately (see
my &lt;a href=&#34;https://weblog.masukomi.org/2017/12/20/why-scuttlebutt/&#34;&gt;Why Scuttlebutt&lt;/a&gt;
post), and &lt;a href=&#34;https://mellified.men/@srol&#34;&gt;Srol&lt;/a&gt; just wrote a great post about how
&lt;a href=&#34;https://theoutline.com/post/2689/mastodon-makes-the-internet-feel-like-home-again&#34;&gt;Mastodon makes the internet feel like home again&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a lot of good reasons for people to use tools like them for socializing
online, and I don&amp;rsquo;t want these services to just wither as their users wander
off. I want there to be options that aren&amp;rsquo;t controlled by large companies, but
at the same time services that require servers (like Mastodon) need someone to
pay for those servers.  And while Scuttlebutt doesn&amp;rsquo;t &lt;em&gt;need&lt;/em&gt; servers, the &amp;ldquo;pub&amp;rdquo;
servers do play an important role. I find myself wondering what is required for
a social network to succeed? Are businesses a critical part of the equation?&lt;/p&gt;
&lt;p&gt;I think yes, and no. I think sites like &lt;a href=&#34;https://www.patreon.com/&#34;&gt;Patreon&lt;/a&gt; its like,
have shown that people are
willing to support the people and projects that are important to them.  So, I
think that from a purely financial standpoint that &lt;em&gt;no&lt;/em&gt; we don&amp;rsquo;t need the
corporate money to keep these spaces afloat. Also, hosting costs for distributed
systems like this are dirt cheap, and getting cheaper. There are a million
people using Mastodon on servers paid for entirely by people who just feel like
it.&lt;/p&gt;
&lt;p&gt;At the same time corporate presence helps with the legitimacy of young networks.
When major businesses establish a presence on a network it reinforces the idea
that this is a &amp;ldquo;real&amp;rdquo; place, and that it&amp;rsquo;ll probably be around for a while.&lt;/p&gt;
&lt;p&gt;From the business perspective, social networks aren&amp;rsquo;t great for selling things
(instagram ads seeming to be the major exception to this),
but they&amp;rsquo;re great for supporting your customers and finding like-minded people.
Think, for example about what &lt;a href=&#34;https://www.rei.com/&#34;&gt;REI&lt;/a&gt; has done with their
&lt;a href=&#34;https://www.rei.com/blog/news/optoutside-will-you-go-out-with-us&#34;&gt;Opt Outside&lt;/a&gt;
campaign.&lt;/p&gt;
&lt;p&gt;Small companies, like indie software developers, survive &lt;em&gt;because&lt;/em&gt; of their
social interactions. They can&amp;rsquo;t afford the big marketing. So they make human
contact, and support their customers, and help them to succeed in their
business, or play, or whatever.  And the customers appreciate it. Many of us
become fantastically loyal to a product or company specifically because of the
social interactions we have with the people behind them.&lt;/p&gt;
&lt;p&gt;I look forward to getting on to Scuttlebutt and seeing what new things people
have had to say, just like Srol looks forward to getting on Mastodon. Having to
then switch to Twitter to ask a question of some developer whose software I
use&amp;hellip; it&amp;rsquo;s not hard, but it is a barrier, and it also means i&amp;rsquo;m going to have
to deal with whatever&amp;rsquo;s going on &amp;ldquo;over there&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;I love Twitter, but if I&amp;rsquo;m not speaking with the Esperanto people there I&amp;rsquo;m
pretty much guaranteed to get stressed out with some new political BS, and
Facebook has always annoyed me.&lt;/p&gt;
&lt;p&gt;But, it takes a lot of effort to for a company to have an effective social
presence on a network, all that effort isn&amp;rsquo;t cheap. There&amp;rsquo;s got to be a reason
why it&amp;rsquo;s worth the effort to have a presence there.  They&amp;rsquo;ll come, if the people
are there, of course, but the question on my mind, is will it help the people to
come, or stay, if the businesses are there?&lt;/p&gt;
&lt;p&gt;Do the creators of need to think about how companies could derive value from
their platform? Not for any financial benefit of the creators, but as a tool to
help the platform thrive.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t think McDonalds, for example, being on Twitter devalues the Twitter
experience in any way. I don&amp;rsquo;t follow them. They don&amp;rsquo;t affect me. I do think
that the fact the companies I &lt;em&gt;do&lt;/em&gt; care about are on Twitter enhances the
experience for me. Is there a downside to the users to making the network more
useful to those companies?&lt;/p&gt;
&lt;p&gt;To be clear, I am explicitly &lt;em&gt;not&lt;/em&gt; talking about allowing them to put ads in
front of users, or charge for anything, or directly recognize revenue in any
way. I&amp;rsquo;m talking about helping them to know that their presence on the network
provides benefit to their company. Maybe it&amp;rsquo;s just knowing they got the word out
about something important. Maybe it&amp;rsquo;s supporting their users.&lt;/p&gt;
&lt;p&gt;I think maybe we should be thinking about the companies, if we want to see these
new networks survive to maturity.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Why Scuttlebutt</title>
      <link>https://weblog.masukomi.org/2017/12/20/why-scuttlebutt/</link>
      <pubDate>Wed, 20 Dec 2017 22:35:40 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/2017/12/20/why-scuttlebutt/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;I fell in love with the scuttleverse because of the people who are inhabiting
it. Regardless of UX/UI, I continually come back because here I found people
discussing practical ways of building their own airships, and what life is
like doing guerilla gardening in Berlin or living in a self-reliant shack on
top of a lava flow. There&amp;rsquo;s a distinct social anarchist bent to the
discussion, and folks are not only discussing alternate societies at length,
but also have the skills to realize them. &amp;ndash;
&lt;a href=&#34;http://between-two-worlds.dk:8807/@ZqH7Mctu/7DNInxuwl12ECjfrAKUX2tBLq1rOldNhg0=.ed25519&#34;&gt;Zack!&lt;/a&gt;
-&amp;gt; &lt;a href=&#34;http://between-two-worlds.dk:8807/%25iC8NsaNMuYjRrvSrHcQUkHNxeRzisBbE7zcOAIGdRMs=.sha256&#34;&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The other day André Saltz wrote about &lt;a href=&#34;https://staltz.com/a-plan-to-rescue-the-web-from-the-internet.html&#34;&gt;A Plan To Rescue The Web From The Internet&lt;/a&gt;,
which had some good points, wrapped in a lot of&amp;hellip; extra that tended to make my
eyes glaze over.  Before that &lt;a href=&#34;https://staltz.com/the-web-began-dying-in-2014-heres-how.html&#34;&gt;he explained how the web has been dying since 2014&lt;/a&gt;. I
definitely recommend you read the latter.&lt;/p&gt;
&lt;p&gt;The heart of André&amp;rsquo;s post about saving the web is important though. Instead of
trying to restate his thoughts I figured I&amp;rsquo;d give you mine on why you, like
André, should care about Scuttlebutt, and the similar new ideas that are
emerging and trying to take the internet back from the highly controlled walled
gardens of Facebook and their ilk.&lt;/p&gt;
&lt;h2 id=&#34;once-upon-a-time&#34;&gt;Once Upon A Time&amp;hellip;&lt;/h2&gt;
&lt;p&gt;Once upon a time the web was a free-for-all. It was
glorious. It was ugly. It was filled with failed and successful experiments.
Every page looked and worked differently, but you could at least count on there
being links you could click on that would take you somewhere. Making pages
required learning some &amp;ldquo;HTML&amp;rdquo; thing, but then we got blogging software got
better until we had things like &lt;a href=&#34;https://wordpress.org/&#34;&gt;WordPress&lt;/a&gt; which made
that problem go away entirely.&lt;/p&gt;
&lt;p&gt;It also wasn&amp;rsquo;t filled with ads. You didn&amp;rsquo;t have to log in, or launch an app to
see the contents of a site. Maybe you used bookmarks. Maybe you used used an
&lt;a href=&#34;https://en.wikipedia.org/wiki/RSS&#34;&gt;RSS&lt;/a&gt; reader.  Regardless, you read the stuff
you wanted, in the way it was intended, and it was good; occasionally ugly, but
good.&lt;/p&gt;
&lt;h2 id=&#34;more-recently&#34;&gt;More Recently&amp;hellip;&lt;/h2&gt;
&lt;p&gt;More recently we got Facebook. I say &amp;ldquo;Facebook&amp;rdquo; but really
I mean any of the similar walled gardens than have come and gone, and the future
ones that will come and go again.&lt;/p&gt;
&lt;p&gt;Facebook and friends have done some very good things. They&amp;rsquo;ve made it easy to
see all the posts from the people you care about in one central place. The pages
have a consistent navigation, and while it&amp;rsquo;s hard to say that Facebook is
gorgeous, It is fairly easy on the eyes.&lt;/p&gt;
&lt;p&gt;Unfortunately  the things you upload are only technically yours, and once they
got everyone on the site, they changed the rules.&lt;/p&gt;
&lt;p&gt;The Oatmeal&amp;rsquo;s comic on &amp;ldquo;&lt;a href=&#34;http://theoatmeal.com/comics/reaching_people&#34;&gt;Reaching People On The
Internet&lt;/a&gt;&amp;rdquo; summed it up nicely.&lt;/p&gt;
&lt;p&gt;Eventually Facebook will stop being &amp;ldquo;the cool site&amp;rdquo;, and everyone will move on
to something else. The doors will close and billions upon billions of posts,
photos, memories, and well-wishes will be lost.  There&amp;rsquo;s already evidence of
this starting with younger generations and Facebook.&lt;/p&gt;
&lt;h2 id=&#34;enter-scuttlebutt&#34;&gt;Enter Scuttlebutt&lt;/h2&gt;
&lt;p&gt;Scuttlebutt is one of a number of new ideas emerging to
address the problem of these walled gardens, government censorship, corporate
BS, and more.&lt;/p&gt;
&lt;p&gt;Technically it&amp;rsquo;s a protocol, like the HTTP protocol that most of the internet is
built on. Some people use it share blog posts and Tweets. Some people use it for
chat. Some people build games. Some people use it to serve data for specific
applications.&lt;/p&gt;
&lt;p&gt;Scuttlebutt has some &lt;em&gt;huge&lt;/em&gt; differences though:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Once it&amp;rsquo;s been shared, nothing can be lost, or deleted, or censored.
&lt;ul&gt;
&lt;li&gt;links to old articles and blog posts never die&lt;/li&gt;
&lt;li&gt;great for people living under oppressive regimes&lt;/li&gt;
&lt;li&gt;politicians can&amp;rsquo;t take back stupid or racist statements&lt;/li&gt;
&lt;li&gt;companies can&amp;rsquo;t walk away with years of your posts and images.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;everything is silently encrypted
&lt;ul&gt;
&lt;li&gt;private messages are &lt;em&gt;truly&lt;/em&gt; private.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;it&amp;rsquo;s decentralized, and works offline
&lt;ul&gt;
&lt;li&gt;millions of people in rural and/or poor areas don&amp;rsquo;t have  constant, or
fast, internet connections.&lt;/li&gt;
&lt;li&gt;no company or government can control it.&lt;/li&gt;
&lt;li&gt;no-one can act as a gatekeeper&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/ssbc/patchwork#readme&#34;&gt;Patchwork&lt;/a&gt; is one of &lt;a href=&#34;https://www.scuttlebutt.nz/applications.html&#34;&gt;the many
applications&lt;/a&gt; that run on
Scuttlebutt.  It&amp;rsquo;s one of the social apps, but really they&amp;rsquo;re more akin to web
browsers than &amp;ldquo;social apps&amp;rdquo;. Some people like this one. Some people like that
one. They all look a little different, but they generally let you do the same
thing.&lt;/p&gt;
&lt;p&gt;So what do you do with it?&lt;/p&gt;
&lt;p&gt;Using Patchwork is conceptually similar to Slack or irc: There are public
channels that are topics for discussion: #games, #birds, #boats, #esperanto,
etc. But there are also public channels that are blogs:
&lt;a href=&#34;http://between-two-worlds.dk:8807/channel/spider-farm?showAll&#34;&gt;#spider-farm&lt;/a&gt;
being an oddly enjoyable one that has nothing to do with spiders.  All of these
posts can be filled with images, and attachments, that work perfectly offline.
The big difference between it and Slack or IRC is that most people are posting
thoughtful multi-paragraph things, not chatty one-liners.&lt;/p&gt;
&lt;p&gt;You can also send private messages that are truly private thanks to the
encryption working behind the scenes.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s also a little like Facebook. You have a profile page, and a network of
people you follow, and they have a network of people they follow, and you can
see who you have in common.&lt;/p&gt;
&lt;p&gt;But, like real life, you can only send a message to someone if there&amp;rsquo;s a chain
of connections between you and them. This is because Scuttlebutt transfers data
using the power of &lt;a href=&#34;https://en.wikipedia.org/wiki/Gossip_protocol&#34;&gt;Gossip&lt;/a&gt;. No
really, that&amp;rsquo;s the name of the protocol. Messages pass from person to person
across the network, but you don&amp;rsquo;t have to download every message for every
person. It&amp;rsquo;s all about the network of people you&amp;rsquo;re connected to, and who
they&amp;rsquo;re connected to.&lt;/p&gt;
&lt;p&gt;And that, is where the &amp;ldquo;distributed&amp;rdquo; and &amp;ldquo;offline&amp;rdquo; aspects come in to play.    I
can turn off my wifi, and still read other people&amp;rsquo;s posts, still see images,
even reply to posts, create new ones, and update my profile. When i get back
online everything all of that will go out to the people I&amp;rsquo;m connected to and
they&amp;rsquo;ll see it the next time they connect.&lt;/p&gt;
&lt;p&gt;But, it&amp;rsquo;s better than that sounds. Imagine I&amp;rsquo;m in a rural area but one of the
people in my Scuttlebutt network comes by. We can connect over a local network
(think AirDrop). I can get the latest stuff she has, and she can get the latest
stuff I have. Every time one of us connects to another friend the information
will continue on until one of us connects out to a wider network like the
internet.&lt;/p&gt;
&lt;p&gt;This sounds like it&amp;rsquo;d be very slow, but when everyone is online, message
transfers are actually very quick. And when you&amp;rsquo;re in the middle of nowhere and
it takes two days for a friend of a friend to connect to the internet, it&amp;rsquo;s
still a lot better than &lt;em&gt;no&lt;/em&gt; connection. Plus, you can still use the system in
between visits.&lt;/p&gt;
&lt;p&gt;Right now, Facebook is useless to the 4 &lt;em&gt;billion&lt;/em&gt; people with poor or
intermittent connectivity. Imagine if those people started using a tool like
Scuttlebutt &lt;em&gt;before&lt;/em&gt; Facebook was able to get its hooks into them.&lt;/p&gt;
&lt;p&gt;[quick implementation note] you don&amp;rsquo;t have to know someone on the network to use
Scuttlebutt. There are &amp;ldquo;pub servers&amp;rdquo; whose job is to be someone you can connect
to, and help you share &amp;ldquo;gossip&amp;rdquo;. Connecting to one is generally the first thing you
do when you start up a new client.&lt;/p&gt;
&lt;h2 id=&#34;and-one-more-thing&#34;&gt;And one more thing&lt;/h2&gt;
&lt;p&gt;Right now the internet is a &lt;em&gt;toxic&lt;/em&gt; place for those of us
in the US. You can&amp;rsquo;t look at any of the social networks, without encountering a
constant stream of stress-inducing pro or anti-Trump rants. Wouldn&amp;rsquo;t it be nice
to have a place online where you could go, and be social with others without all
of that?&lt;/p&gt;
&lt;p&gt;On top of all that, the people on Scuttlebutt right now are actively thinking
about ways to make things better: their lives, the internet, everything.&lt;/p&gt;
&lt;h2 id=&#34;share-some-gossip&#34;&gt;Share some gossip&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://www.scuttlebutt.nz/&#34;&gt;Watch the video overview&lt;/a&gt;.
Grab a copy of &lt;a href=&#34;https://github.com/ssbc/patchwork#readme&#34;&gt;Patchwork&lt;/a&gt;,
and &lt;a href=&#34;http://between-two-worlds.dk:8807/@LzTjF5eAVC6xprPMGeNzqEP/EEBIGpM6hDaaY10hrz8=.ed25519&#34;&gt;join me&lt;/a&gt;
and others in an ad free oasis filled with some pretty cool thinkers.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;P.S. Patchwork is stable and good, but we&amp;rsquo;re still figuring out how best to
use it. It&amp;rsquo;s like the early days of web browsers. I recommend you don&amp;rsquo;t install
it on your work computer, because it likes to only be run on one computer at a
time, and if they suddenly fire you (or burn to the ground), you&amp;rsquo;ll loose the
computer with the keys to prove your identity, and decript all the private stuff
you&amp;rsquo;ve shared and received. It&amp;rsquo;s not hard to &lt;a href=&#34;https://weblog.masukomi.org/2017/12/19/using-1-scuttlebutt-identity-on-multiple-devices/&#34;&gt;share the same identity on multiple computers&lt;/a&gt;
though.&lt;/p&gt;
&lt;p&gt;P.P.S The links to Scuttlebutt posts and profiles in this article are not links
to Scuttlebutt itself, but to a read-only web view into it.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How to use the same Scuttlebutt identity on multiple computers.</title>
      <link>https://weblog.masukomi.org/2017/12/19/using-1-scuttlebutt-identity-on-multiple-devices/</link>
      <pubDate>Tue, 19 Dec 2017 22:43:35 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/2017/12/19/using-1-scuttlebutt-identity-on-multiple-devices/</guid>
      <description>&lt;p&gt;v2.1&lt;/p&gt;
&lt;p&gt;(Note: &lt;a href=&#34;https://www.manyver.se/&#34;&gt;Manyverse&lt;/a&gt; / mobile users please see the
warning at the end.)&lt;/p&gt;
&lt;p&gt;Offically &lt;a href=&#34;https://www.scuttlebutt.nz/&#34;&gt;Scuttlebutt&lt;/a&gt; doesn&amp;rsquo;t support posting
from the same identity on multiple computers (as of Dec 2017). Unofficially,
it&amp;rsquo;s easy but requires a little bit of care. In practice this means never run
the Scuttlebutt client on two computers at the same time.&lt;/p&gt;
&lt;p&gt;The gotcha is that if you post from both computers before the changes of one
have had a chance to replicate to the second &lt;em&gt;via&lt;/em&gt; scuttlebutt one or both of
your feeds will get screwed up and other people won&amp;rsquo;t see some of your own posts ever
again.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; These instructions require using the command line. I&amp;rsquo;ll show you how
to do it on a Mac. Hopefully that&amp;rsquo;ll be enough of a clue for Other OS&amp;rsquo;s too.&lt;/p&gt;
&lt;h3 id=&#34;step-one&#34;&gt;Step one.&lt;/h3&gt;
&lt;p&gt;On the computer where Scuttlebutt is already running, Take your &lt;code&gt;~/.ssb/secret&lt;/code&gt;
and make a backup of it in some secure encrypted location like
&lt;a href=&#34;https://1password.com/&#34;&gt;1Password&lt;/a&gt;, because you really don&amp;rsquo;t want to loose that
and you don&amp;rsquo;t want to give folks keys to your identity.&lt;/p&gt;
&lt;p&gt;How?&lt;br&gt;
Open your Terminal app and type&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;open ~/.ssb
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;(then return). A window will open up in the finder showing the contentns of your
&lt;code&gt;~/.ssb&lt;/code&gt; directory. Copy the &lt;code&gt;secret&lt;/code&gt; file from that directory and put it
somewhere safe. Then send it and the &lt;code&gt;gossip.json&lt;/code&gt; file to the 2nd computer.&lt;/p&gt;
&lt;h3 id=&#34;step-two&#34;&gt;Step two&lt;/h3&gt;
&lt;p&gt;On the 2nd computer create a &lt;code&gt;~/.ssb&lt;/code&gt; directory in there and put a copy of your
&lt;code&gt;secret&lt;/code&gt; and &lt;code&gt;gossip.json&lt;/code&gt; files in there.&lt;/p&gt;
&lt;p&gt;How?&lt;br&gt;
Open up your terminal app and type:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mkdir ~/.ssb
open ~/.ssb
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now drag a copy of your &lt;code&gt;secret&lt;/code&gt; and &lt;code&gt;gossip.json&lt;/code&gt; file into the window that just opened.&lt;/p&gt;
&lt;h3 id=&#34;step-three&#34;&gt;Step three&lt;/h3&gt;
&lt;p&gt;Confirm Patchwork is off on the 1st computer.
Boot Patchwork on the 2nd computer.
It will ask you to fill in a profile. &lt;em&gt;DO NOT FILL IT IN&lt;/em&gt;. Instead click
&amp;ldquo;Cancel&amp;rdquo;. Then wait. It&amp;rsquo;s going to have to re-download everything you had
before, including your profile. After it&amp;rsquo;s done syncing quit, then relaunch Patchwork to make it
re-attempt to connect to other pubs. Currently (Dec 2017) it doesn&amp;rsquo;t always
sync with all the pubs you were connected to the first time it loads.&lt;/p&gt;
&lt;h3 id=&#34;warning&#34;&gt;WARNING&lt;/h3&gt;
&lt;p&gt;Do NOT make Patchwork an app that opens at startup. Do not start Patchwork
immediately after waking up a computer. Always quit patchwork on one computer
before opening it on the second one. Then wait for all the posts to finish
syncing before you publish anything or update your profile.&lt;/p&gt;
&lt;h2 id=&#34;manyverse-users&#34;&gt;Manyverse users&lt;/h2&gt;
&lt;p&gt;Currently the SSB Mobile client &lt;a href=&#34;https://www.manyver.se/&#34;&gt;Manyverse&lt;/a&gt; is still
very new. Mobile devices add a whole bunch of weird edge cases to how and when
things function. My personal advise is to &lt;em&gt;not&lt;/em&gt; try sharing your identity with a
mobile device at this point in time. In theory, as long as you let the posts from
your computer(s) sync to your mobile device before posting from there, and
vice-versa, you &lt;em&gt;should&lt;/em&gt; be ok. That being said, the consequences of this going
wrong are being forced to abandon your old identity because 1/2 of the world
can&amp;rsquo;t see any new posts from it. It&amp;rsquo;s just not worth the risk.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t have an Android phone so I can&amp;rsquo;t test it. Instructions are available in
Scuttlebutt though if you&amp;rsquo;re willing to take the risk.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>100(ish) things</title>
      <link>https://weblog.masukomi.org/2017/01/01/100-ish-things/</link>
      <pubDate>Sun, 01 Jan 2017 16:23:34 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/2017/01/01/100-ish-things/</guid>
      <description>&lt;p&gt;Many would not guess it, but I am a minimalist at heart. I don&amp;rsquo;t like looking around and seeing all the crap I&amp;rsquo;ve accumulated. So this year, I&amp;rsquo;m going to do something about it. This year, I&amp;rsquo;m working towards only owning 100(ish) things, and I&amp;rsquo;d like to encourage you to too.&lt;/p&gt;
&lt;p&gt;The 100 is easy. The &amp;ldquo;ish&amp;rdquo; requires some explaining, but I feel it is the key to making this workable.&lt;/p&gt;
&lt;p&gt;What follows is &lt;em&gt;my&lt;/em&gt; guidelines for paring down to 100ish items. If that sounds like a goal you&amp;rsquo;d like to achieve too, keep reading.&lt;/p&gt;
&lt;h2 id=&#34;ish-1&#34;&gt;ish #1&lt;/h2&gt;
&lt;p&gt;100 is a target, not a hard and fast rule. If I whittle it down to 104, and getting rid of those last 4 would be painful, I&amp;rsquo;ll stop at 104.&lt;/p&gt;
&lt;h2 id=&#34;ish-2&#34;&gt;ish #2&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Heath, safety, and &amp;ldquo;regular maintenance&amp;rdquo; items don&amp;rsquo;t count.&lt;/strong&gt; Your &lt;a href=&#34;http://amzn.to/2hGPUpE&#34;&gt;first aid kit&lt;/a&gt; doesn&amp;rsquo;t count, even if it has 1000 items in it. Your tooth paste, soap, and tooth brush, don&amp;rsquo;t count. Your pills don&amp;rsquo;t count. Health and regular maintenance aren&amp;rsquo;t just limited to you though. Your car needs regular maintenance, and checkups too. Tire guage, &lt;a href=&#34;http://amzn.to/2ivZI5h&#34;&gt;Snow Chains for your car&lt;/a&gt;, &lt;a href=&#34;http://amzn.to/2iw0383&#34;&gt;Window Breaker&lt;/a&gt;, &lt;a href=&#34;http://amzn.to/2isFeIo&#34;&gt;Snow Brush&lt;/a&gt;&amp;hellip; All safety / maintenance items.  &lt;a href=&#34;https://en.wikipedia.org/wiki/Bug-out_bag&#34;&gt;Go Bags&lt;/a&gt; are also a form of safety item. Dog toys? Maintenance item (also, they&amp;rsquo;re not really yours), but maybe your dog(s) don&amp;rsquo;t need &lt;em&gt;all&lt;/em&gt; those toys.&lt;/p&gt;
&lt;p&gt;You will need to be careful with the &amp;ldquo;regular maintenance&amp;rdquo; items though. It&amp;rsquo;s easy to go &amp;ldquo;oh yeah i need that for &lt;code&gt;____&lt;/code&gt;&amp;rdquo; when it&amp;rsquo;s more a &amp;ldquo;want&amp;rdquo; or a &amp;ldquo;nice-to-have&amp;rdquo;, instead of a real need.&lt;/p&gt;
&lt;h2 id=&#34;ish-3&#34;&gt;ish #3&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Atypical Activities&lt;/strong&gt;: Limiting yourself to 100 items will free us up mentally, but it&amp;rsquo;ll hamper our ability to do the non-everyday things that bring us joy. Camping, as an example, requires special equipment: sleeping bag, camp stove, water filter, etc. You should not have to give up camping, to enjoy downsizing. The items required for you whatever activity you love in your off time: they don&amp;rsquo;t count, &lt;em&gt;but&lt;/em&gt; you still have to sit down and ask yourself which ones you actually &lt;em&gt;need&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&#34;bonus-items&#34;&gt;Bonus items!&lt;/h2&gt;
&lt;p&gt;Anything digital doesn&amp;rsquo;t count. It takes up no physical space. You can have 10,000 books!&lt;/p&gt;
&lt;h2 id=&#34;gray-areas&#34;&gt;Gray areas&lt;/h2&gt;
&lt;p&gt;To me, pills like Ibuprofin, count as health and maintenance. Any in the first aid kit, or medicine cabinet I won&amp;rsquo;t count, but if I choose to carry an extra bottle in my backpack? That bottle will count.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Groupings&lt;/strong&gt; are complicated too. A keyring has many keys, but most people would call it one item. An Altoids tin filed with useful everyday items? Maybe. A box filled with crap you can&amp;rsquo;t decide on? Probably not one item.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Shared items.&lt;/strong&gt; I don&amp;rsquo;t feel it&amp;rsquo;s right for me to get rid of items that my wife uses regularly too (like the stereo), but do I count that towards my 100? I dunno. I &lt;em&gt;can&lt;/em&gt; talk to her about getting rid of items we don&amp;rsquo;t use anymore.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Work items.&lt;/strong&gt; A woodworker needs a lot of tools, but maybe, they don&amp;rsquo;t need &lt;em&gt;all&lt;/em&gt; their tools. Could you get your job done well with fewer things? Try working without them for 6 months. If you find you don&amp;rsquo;t need them, get rid of them.&lt;/p&gt;
&lt;h2 id=&#34;getting-to-100ish&#34;&gt;Getting to 100(ish)&lt;/h2&gt;
&lt;p&gt;How each of us gets to 100 is going to be different. For me it&amp;rsquo;s going to start with Marie Kondo&amp;rsquo;s advice in &lt;a href=&#34;http://amzn.to/2hGxh3e&#34;&gt;The Life-Changing Magic of Tidying Up&lt;/a&gt; (It&amp;rsquo;s available on &lt;a href=&#34;http://amzn.to/2iU1CJr&#34;&gt;Audible&lt;/a&gt; too). At the heart of her teaching is a simple question: &amp;ldquo;Does this item bring me joy?&amp;rdquo; If it doesn&amp;rsquo;t, you get rid of it. I&amp;rsquo;d modify that slightly: &amp;ldquo;Does this item bring me joy? Is it actually required?&amp;rdquo; For example: I consider having a backpack to be a requirement. I use it to carry my laptop to work safely. Fortunately, I love &lt;a href=&#34;http://amzn.to/2hH9v7h&#34;&gt;my backpack&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;My plan is simple. Each weekend I&amp;rsquo;ll address a room, or part of a room. I&amp;rsquo;ll do as much as I can find time for. I&amp;rsquo;ll  choose the items I want to keep,  and donate, or discard the rest. Once I&amp;rsquo;ve finished going through the house, I&amp;rsquo;ll go back, start counting, and repeat the process until I&amp;rsquo;m down to 100.&lt;/p&gt;
&lt;h2 id=&#34;staying-at-100ish&#34;&gt;Staying at 100(ish)&lt;/h2&gt;
&lt;p&gt;I, like many of you, lust after things. I hear the siren call of &amp;ldquo;better&amp;rdquo;, and that&amp;rsquo;s ok. When you only have a few items it&amp;rsquo;s important to make sure they&amp;rsquo;re the best they can be. So, feel free to window shop. Just don&amp;rsquo;t pull the trigger unless you &lt;em&gt;know&lt;/em&gt; that it&amp;rsquo;s an improvement over what you currently have, and &lt;em&gt;know&lt;/em&gt; what you&amp;rsquo;re going to be getting rid of to compensate.&lt;/p&gt;
&lt;p&gt;In the end, this will mean spending more money on fewer, but &lt;em&gt;better&lt;/em&gt; things. In my experience, this will leave you with items that you really value, and appreciate having around.&lt;/p&gt;
&lt;h2 id=&#34;to-summarize&#34;&gt;To summarize&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s work on getting rid of things we don&amp;rsquo;t need, but keep ourselves safe and well cared for in the process. Only keep the stuff you really love, or really need. Get rid of all the &amp;ldquo;maybes&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;If this sounds good to you, but you&amp;rsquo;re still on the fence, consider these &lt;a href=&#34;http://www.becomingminimalist.com/encouragement-for-your-first-step-towards-living-with-less/&#34;&gt;7 reasons that keep people from getting started with minimalism&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Dear Esperanto Beginner</title>
      <link>https://weblog.masukomi.org/2016/11/03/dear-esperanto-beginner/</link>
      <pubDate>Thu, 03 Nov 2016 21:43:23 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2016/11/03/dear-esperanto-beginner/</guid>
      <description>&lt;h2 id=&#34;dear-esperanto-beginner&#34;&gt;Dear Esperanto Beginner:&lt;/h2&gt;
&lt;p&gt;I love Twitter,  butI have not found a good place for a beginner to practice their Esperanto there. So, I made &lt;a href=&#34;https://twitter.com/praktiku&#34;&gt;@praktiku&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Say hello to &lt;a href=&#34;https://twitter.com/praktiku&#34;&gt;@praktiku&lt;/a&gt; and practice with me. You don&amp;rsquo;t need to be skillful, just willing to practice.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Kara Esperanto Komencanto:&lt;/p&gt;
&lt;p&gt;Mi amas Twitter, sed mi ne trovis sekura placo por komencantoj praktiki sian Esperanton tie.  Do, mi faris  &lt;a href=&#34;https://twitter.com/praktiku&#34;&gt;@praktiku&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Diru saluton al &lt;a href=&#34;https://twitter.com/praktiku&#34;&gt;@praktiku&lt;/a&gt;, kaj praktiku kun mi. Vi ne bezonas esti lerta, nur volanta praktiki.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Keeping a great Changelog</title>
      <link>https://weblog.masukomi.org/2016/07/03/keeping-a-great-changelog/</link>
      <pubDate>Sun, 03 Jul 2016 13:03:55 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2016/07/03/keeping-a-great-changelog/</guid>
      <description>&lt;p&gt;Changelogs are an invaluable, and often neglected part of &lt;em&gt;any&lt;/em&gt; software
project. So, how do you do that?&lt;/p&gt;
&lt;p&gt;A good changelog helps you users to understand:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Why they should care about your latest version&lt;/li&gt;
&lt;li&gt;If any of your changes affect the problems or frustrations they&amp;rsquo;ve been
having.&lt;/li&gt;
&lt;li&gt;If there are any changes that might affect how they use your app / library.&lt;/li&gt;
&lt;li&gt;Why your efforts are worth their continued support.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A &lt;em&gt;great&lt;/em&gt; changelog does all that, &lt;em&gt;and&lt;/em&gt; shows the personality of your team.&lt;/p&gt;
&lt;p&gt;Shifty Jelly&amp;rsquo;s &lt;a href=&#34;http://www.shiftyjelly.com/pocketcasts/&#34;&gt;Pocket Casts&lt;/a&gt; is
notorious for their fun, and informative changelog entries:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Equal Opportunity variable speed playback. Why should MP3s have all the fun?
Welcome AAC &amp;amp; OGG!  * Bzzz. Bzzz. You can now choose which podcasts to be
notified of.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://slack.com/&#34;&gt;Slack&amp;rsquo;s&lt;/a&gt; been doing a pretty bang-up job too:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Fixed: The app now automatically scrolls down when you begin writing a file
comment, giving your precious fingertips much needed beauty rest.  * Fixed:
Time zones were sometimes shown with incorrect deltas. Now your coworker who
is 5 hours ahead of you will no longer simultaneously be 8 hours behind you.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;I can&amp;rsquo;t overstate how valuable it is to have a Changelog with personality. As
soon as you see that one of the apps you use has a great changelog you look out
for them, and always stay on top of what they&amp;rsquo;ve fixed and added. Then you start
spreading the word, because not only did they add good stuff, or fix that really
annoying bug, they made you smile along the way.&lt;/p&gt;
&lt;p&gt;A Changelog with personality helps build evangelism for the thing you&amp;rsquo;ve spent
so much time building.&lt;/p&gt;
&lt;h2 id=&#34;the-guts-of-a-good-changelog-entry&#34;&gt;The guts of a good Changelog Entry&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;It must speak in terms users understand. Most of them won&amp;rsquo;t be intimately
familiar with your source code. Don&amp;rsquo;t use internal jargon. If a bug is fixed,
speak in terms of the actions that caused it, or the behavior it exhibited,
but not the specific classes, unless you absolutely have to.&lt;/li&gt;
&lt;li&gt;It must be knowledge that&amp;rsquo;s useful to your users. Speak to the features and
flaws that affect your customers. Users don&amp;rsquo;t care that you refactored some
unit test, or reformatted your comments.&lt;/li&gt;
&lt;li&gt;It has to be at the right level of abstraction. Even if your writing an open
source library. The Slack timezone bug above was handled perfectly. They
could have mentioned which class &amp;amp; method had the bug, or the conceptual flaw
that caused the bug, but that&amp;rsquo;s all too fine grained for a Changelog.
Instead, they spoke at a higher level of abstraction.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;changes-need-to-be-grouped-by-type&#34;&gt;Changes need to be grouped by type&lt;/h2&gt;
&lt;p&gt;Group your bug fixes. Group your features. Group &amp;ldquo;all the things!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Imagine a user who&amp;rsquo;s been particularly frustrated by a bug in your app. They&amp;rsquo;re
going to open your changelog and immediately try and find out if you&amp;rsquo;ve fixed it
in this release. Help them. Don&amp;rsquo;t frustrate them further by making them hunt for
it in a jumble of features, fixes, and changes.&lt;/p&gt;
&lt;h2 id=&#34;dates-are-important&#34;&gt;Dates are important&lt;/h2&gt;
&lt;p&gt;Versioning your software is great, but dates are important too. When did version
6.0.0 come out? Did I have that problem before then or after?&lt;/p&gt;
&lt;p&gt;Additionally, not everyone in the world keeps dates in the same format.
06-08-16. Is that August 6th or June 8th? It depends on who&amp;rsquo;s reading it. Year
Month Day is the only one that makes any &lt;em&gt;logical&lt;/em&gt; sense no matter where you
are. XKCD even had a &lt;a href=&#34;http://xkcd.com/1179/&#34;&gt;Public Service Announcement about it&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;to-summarize&#34;&gt;To summarize&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Write at a high level of abstraction&lt;/li&gt;
&lt;li&gt;Speak to things that affect users, not developers.&lt;/li&gt;
&lt;li&gt;Group things so that people can find them easily.&lt;/li&gt;
&lt;li&gt;Add some personality.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;want-an-easy-tool-to-help-manage-this&#34;&gt;Want an easy tool to help manage this?&lt;/h2&gt;
&lt;p&gt;Check out
&lt;a href=&#34;https://github.com/masukomi/changelog_manager#readme&#34;&gt;changelog_manager&lt;/a&gt;. It&amp;rsquo;s
a free and open source tool to help you easily generate high quality Changelog
entries.&lt;/p&gt;
&lt;h2 id=&#34;related-posts&#34;&gt;Related Posts:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://weblog.masukomi.org/2016/06/30/why-you-cant-auto-generate-your-changelog/&#34;&gt;Why you can&amp;rsquo;t auto-generate your Changelog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Why you can&#39;t auto-generate your Changelog</title>
      <link>https://weblog.masukomi.org/2016/06/30/why-you-cant-auto-generate-your-changelog/</link>
      <pubDate>Thu, 30 Jun 2016 08:28:07 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2016/06/30/why-you-cant-auto-generate-your-changelog/</guid>
      <description>&lt;p&gt;Let&amp;rsquo;s start by taking it as a given that a &lt;a href=&#34;http://keepachangelog.com&#34;&gt;Changelog&lt;/a&gt; file is something &lt;em&gt;very&lt;/em&gt; valuable that &lt;em&gt;every&lt;/em&gt; product should come with. Even if your &amp;ldquo;product&amp;rdquo; is a library for other developers.&lt;/p&gt;
&lt;p&gt;With that in mind, the question rises of &amp;ldquo;How can I make it really easy to generate one&amp;rdquo;. Many developers have had exactly that thought. There are many free and some paid solutions that will &amp;ldquo;Autogenerate your changelog from your git commits/tickets&amp;rdquo;.  The simple fact is, that no matter how well they&amp;rsquo;re written, you shouldn&amp;rsquo;t use any of them.&lt;/p&gt;
&lt;h2 id=&#34;a-good-changelog-entry-has&#34;&gt;A good Changelog entry has&amp;hellip;&lt;/h2&gt;
&lt;p&gt;A good Changelog entry has three primary aspects&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It&amp;rsquo;s at the right level of abstraction. Consumers of your product don&amp;rsquo;t care what files you tweaked or how. They care about the fixes and changes you&amp;rsquo;ve made that may impact them.&lt;/li&gt;
&lt;li&gt;It needs to be knowledge that&amp;rsquo;s useful to the consumer of your product. It&amp;rsquo;s a simple judgement call, but it&amp;rsquo;s one that has to be made.&lt;/li&gt;
&lt;li&gt;It needs to be written in a way that people who either aren&amp;rsquo;t geeks, or at least aren&amp;rsquo;t intimately familiar with your codebase can understand.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;changelogs-from-commits&#34;&gt;Changelogs from commits&lt;/h2&gt;
&lt;h3 id=&#34;commits-are-at-the-wrong-level-of-abstraction&#34;&gt;Commits are at the wrong level of abstraction&lt;/h3&gt;
&lt;p&gt;A git log is filled with commits like: &amp;ldquo;ensured current_and_future_campaigns returns a relation&amp;rdquo;, or &amp;ldquo;cleaned up whitespace in User.rb&amp;rdquo;, or &amp;ldquo;fixed expected aspect name in update test for locations_controller_spec&amp;rdquo; These &lt;em&gt;are&lt;/em&gt; useful to other developers on the project, but they &lt;em&gt;aren&amp;rsquo;t&lt;/em&gt; things that are useful to the users of your product.&lt;/p&gt;
&lt;p&gt;In short, they contain too much detail, at the wrong level of abstraction.&lt;/p&gt;
&lt;h3 id=&#34;commits-are-messages-from-one-developer-on-a-team-to-another-one&#34;&gt;Commits are messages from one developer on a team to another one&lt;/h3&gt;
&lt;p&gt;They&amp;rsquo;re not messages to your users, and they shouldn&amp;rsquo;t be.&lt;/p&gt;
&lt;p&gt;Commits frequently use jargon, and references to specific elements of code. This is absolutely fine, but it&amp;rsquo;s probably meaningless or useless to most of your consumers.&lt;/p&gt;
&lt;h3 id=&#34;theres-no-point&#34;&gt;There&amp;rsquo;s no point&lt;/h3&gt;
&lt;p&gt;If I wanted a geek level listing of all the changes in your git history I could just ask git: &lt;code&gt;git log --oneline&lt;/code&gt; Plus, git will let me slice and dice that information sixteen ways from Sunday.&lt;/p&gt;
&lt;h3 id=&#34;you-cant-edit-them&#34;&gt;You can&amp;rsquo;t edit them&lt;/h3&gt;
&lt;p&gt;As &lt;a href=&#34;http://www.commitlogsfromlastnight.com/&#34;&gt;Commits From Last Night&lt;/a&gt; proves. Commit messages frequently aren&amp;rsquo;t written in a customer friendly way. Even if you&amp;rsquo;ve got very polite developers, everyone makes typos. You can&amp;rsquo;t edit the old commit. If you want a changelog that looks professional you&amp;rsquo;re going to have to manually edit it, the same mistakes every single time you generate it.&lt;/p&gt;
&lt;h2 id=&#34;tickets-are-at-the-right-level-of-abstraction&#34;&gt;Tickets &lt;em&gt;are&lt;/em&gt; at the right level of abstraction&lt;/h2&gt;
&lt;p&gt;&amp;hellip;but they rarely have titles that are appropriate for a changelog.&lt;/p&gt;
&lt;p&gt;How about &amp;ldquo;Item Finder - Page gets wonky after searching for content that doesn&amp;rsquo;t exist - plus 404&amp;rdquo;, or &amp;ldquo;Something&amp;rsquo;s eating up all the ram and taking down the servers&amp;rdquo; Not really appropriate for your changelog.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re really following agile an agile methodology you have user stories that look like &amp;ldquo;As a &lt;user type&gt; I should be able to ___ because ___&amp;rdquo; and that&amp;rsquo;s no good for your changelog.&lt;/p&gt;
&lt;p&gt;Some projects do take the time to curate their ticket titles. The results are &lt;em&gt;almost&lt;/em&gt; usable as changelog entries too, but there are always exceptions. They&amp;rsquo;re generally worded well for the people who need to work on them, but not your consumers.&lt;/p&gt;
&lt;h2 id=&#34;its-a-matter-of-human-judgement&#34;&gt;It&amp;rsquo;s a matter of human judgement&lt;/h2&gt;
&lt;p&gt;You want a changelog with the information that is useful to your consumers, and written at the right level of abstraction. This means people need to ask themselves some questions. &amp;ldquo;Do we need a changelog entry for this?&amp;rdquo;, and if so, &amp;ldquo;How do I summarize this change in a  way that&amp;rsquo;s useful to our users?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The first question sometimes eliminates information, through curation. That&amp;rsquo;s something tools can&amp;rsquo;t do. The second question changes the form of the information conveyed. It was directed internally, now it&amp;rsquo;s directed externally.&lt;/p&gt;
&lt;h2 id=&#34;want-an-easy-tool-to-help-manage-this&#34;&gt;Want an easy tool to help manage this?&lt;/h2&gt;
&lt;p&gt;Check out &lt;a href=&#34;https://github.com/masukomi/changelog_manager#readme&#34;&gt;changelog_manager&lt;/a&gt;. It&amp;rsquo;s a free and open source tool to help you easily generate high quality Changelog entries.&lt;/p&gt;
&lt;h2 id=&#34;related-posts&#34;&gt;Related Posts:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://weblog.masukomi.org/2016/07/03/keeping-a-great-changelog/&#34;&gt;Keeping a Great Changelog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>On Being A Manager</title>
      <link>https://weblog.masukomi.org/2016/05/13/on-being-a-manager/</link>
      <pubDate>Fri, 13 May 2016 08:15:00 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2016/05/13/on-being-a-manager/</guid>
      <description>&lt;p&gt;At its core, being a manager is about power.  I feel that many managers fail to understand what that power is for.&lt;/p&gt;
&lt;p&gt;A manager is a lot like being the King or Queen of a tiny, tiny kingdom. The sovereign of a country &lt;em&gt;can&lt;/em&gt; impose their will upon their people, but that&amp;rsquo;s not their job.&lt;/p&gt;
&lt;p&gt;A sovereign&amp;rsquo;s job is to keep their people safe, happy, and prosperous. The more prosperous the people become, the more power &lt;em&gt;they&lt;/em&gt; gain. The more power your people have, the more power &lt;em&gt;you&lt;/em&gt; have.  The more powerful and successful the people are the more powerful the sovereign becomes.&lt;/p&gt;
&lt;p&gt;A good sovereign only imposes their will upon their people to protect them.  A &lt;em&gt;really&lt;/em&gt; good sovereign convinces their people to take the action themselves.&lt;/p&gt;
&lt;p&gt;The people above you made you a manager because they believed in, and trusted you. They grant you power, but that power is titular, until you have the support and trust of your people. Your people&amp;rsquo;s success, and happiness, proves that trust was well placed. It encourages those above you to have more faith in you, and trust you more. That is your voice at the table. That is your strength in negotiations big and small. Your true power is to influence the future of your company to support your people.&lt;/p&gt;
&lt;p&gt;There are times when you will be asked to bring your people unhappy tidings. If you&amp;rsquo;ve done your job, your people will trust you. They will trust that you will help them through the unpleasantness. They may not agree with you, but they will trust that they have their best interests at heart. They&amp;rsquo;ll trust that will do everything you can to protect them.&lt;/p&gt;
&lt;p&gt;Internal threats are the only time a manager, wields their power downwards. If your people are threatened &lt;em&gt;from within&lt;/em&gt;, you try and fix the problem. If the problem can not be fixed, you exorcise it. Sometimes the problem is a person. Sometime&amp;rsquo;s it&amp;rsquo;s a process.&lt;/p&gt;
&lt;p&gt;When the threat is external, you raise awareness, of the problem, and its consequences. Diplomacy play a key role in this. Few of us are particularly good at diplomacy, so do your best, and learn from your mistakes.&lt;/p&gt;
&lt;p&gt;Your people give you power. Protect and encourage them. Use your people&amp;rsquo;s power to reinforce that protection an encouragement within your world. Spread their influence through success.&lt;/p&gt;
&lt;p&gt;Work with your people to build their power and trust in you.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Weeding Wednesday</title>
      <link>https://weblog.masukomi.org/2016/05/09/weeding-wednesday/</link>
      <pubDate>Mon, 09 May 2016 07:02:45 -0400</pubDate>
      
      <guid>https://weblog.masukomi.org/2016/05/09/weeding-wednesday/</guid>
      <description>&lt;p&gt;&amp;ldquo;Follow Friday&amp;rdquo; has been a longstanding tradition on Twitter. It&amp;rsquo;s a great idea. People you follow, make curated recommendations of good content. Well, the world needs balance, and I&amp;rsquo;m instituting Weeding Wednesday.&lt;/p&gt;
&lt;h2 id=&#34;weeding-wednesday-is-a-day-for-reducing-internet-noise&#34;&gt;Weeding Wednesday is a day for reducing internet noise.&lt;/h2&gt;
&lt;p&gt;This Weeding Wednesday watch your Twitter feed from a different perspective. Don&amp;rsquo;t look for the great posts. Look for the &amp;ldquo;meh&amp;rdquo; posts, then unfollow anyone with a low cool to meh ratio.&lt;/p&gt;
&lt;p&gt;Spend a few minutes scrolling through the first couple pages of your email inbox. Unsubscribe from things you don&amp;rsquo;t want. Filter out things you don&amp;rsquo;t need to see all the time into different folders.&lt;/p&gt;
&lt;p&gt;Find places where &amp;ldquo;weeds&amp;rdquo; have crept into your media consumption, and clean them out:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Twitter&lt;/li&gt;
&lt;li&gt;Email&lt;/li&gt;
&lt;li&gt;Instagram&lt;/li&gt;
&lt;li&gt;Facebook&lt;/li&gt;
&lt;li&gt;Podcasts&lt;/li&gt;
&lt;li&gt;RSS Feeds&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Everywhere&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Your next week on the net will be higher quality, with less overload. I guarantee it.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Creating a Terminal Emulator from Scratch (where to start)</title>
      <link>https://weblog.masukomi.org/2016/01/30/terminal_emulator_from_scratch/</link>
      <pubDate>Sat, 30 Jan 2016 10:13:19 -0500</pubDate>
      
      <guid>https://weblog.masukomi.org/2016/01/30/terminal_emulator_from_scratch/</guid>
      <description>&lt;h1 id=&#34;where-to-start-creating-a-terminal-emulator-from-scratch&#34;&gt;Where to start creating a Terminal Emulator from scratch&lt;/h1&gt;
&lt;p&gt;Before I get started I need to link you to &lt;a href=&#34;http://unix.stackexchange.com/a/4132/124338&#34;&gt;this great answer on the Unix &amp;amp; Linux Stack Exchange&lt;/a&gt; which explains the differences between a Terminal (tty), a Console, and a Shell. That knowledge will be key to writing a terminal emulator.&lt;/p&gt;
&lt;h2 id=&#34;vt100-and-beyond&#34;&gt;VT100 (and beyond)&lt;/h2&gt;
&lt;p&gt;Setting the stage with a little background.&lt;/p&gt;
&lt;p&gt;Most terminal emulators claim to be VT100 emulators. VT100 came out of DEC somewhere around 1977. There were a number of subsequent versions (52,102,220,330,420,510,520). The problem is, that VT100 is a rather limited subset of what people expect:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VT100s have no function keys.&lt;/li&gt;
&lt;li&gt;VT100s do not do color.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But there is some relevant stuff that came out of this. Eventually the geeks of the world said &amp;ldquo;Hey, we should probably standardize this stuff&amp;rdquo;, and that resulted in these standards:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://www.ecma-international.org/publications/standards/ECMA-035.HTM&#34;&gt;ECMA-35&lt;/a&gt;, Character Code Structure and Extension Techniques (ISO/IEC 2022:1994)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.ecma-international.org/publications/standards/ECMA-043.HTM&#34;&gt;ECMA-43&lt;/a&gt;, 8-Bit Coded Character Set Structure and Rules (ISO/IEC 4873)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.ecma-international.org/publications/standards/ECMA-048.HTM&#34;&gt;ECMA-48&lt;/a&gt;, Control Functions for Coded Character Sets, (ISO/IEC 6429)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Today XTerm is the 500lb gorilla in the room.  Modern xterm (as of 2013) implements 546 control sequences. Most VT100 emulators (VT102 really) only implement 68. That being said, there are a good number of competitors to xterm which claim to emulate &amp;ldquo;most&amp;rdquo; of XTerm&amp;rsquo;s controls, the reality is that &amp;ldquo;none of the other terminal emulators emulates &amp;lsquo;most&amp;rsquo; of xterm. Instead, they implement the most commonly-used control sequences, and there are differences between them&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;The takeaway is that, XTerm may be bad-ass, but you don&amp;rsquo;t need &amp;ldquo;most&amp;rdquo; of it to create something that&amp;rsquo;s very useful.  Even better, you can use &lt;a href=&#34;http://invisible-island.net/xterm/ctlseqs/ctlseqs.html&#34;&gt;XTerms list of control sequences&lt;/a&gt; as a todo list of things to implement. If you want to create something that is &lt;em&gt;just&lt;/em&gt; functional enough to use Vim &amp;amp; Emacs in, then all you need is VT100(ish).&lt;/p&gt;
&lt;h2 id=&#34;some-example-projects-whose-source-you-can-explore&#34;&gt;Some Example Projects whose source you can explore&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://hyper.is/&#34;&gt;hyper&lt;/a&gt; (&lt;a href=&#34;https://github.com/vercel/hyper&#34;&gt;GitHub here&lt;/a&gt;) looks like a promising step into the future for terminal emulators / interactive shells. It&amp;rsquo;s a node.js app with an &lt;a href=&#34;http://electron.atom.io/&#34;&gt;Electron&lt;/a&gt; front end. Because its UI is html, the possibilities open to it are pretty limitless.  The things that &lt;a href=&#34;https://acko.net/blog/on-termkit/&#34;&gt;TermKit&lt;/a&gt; promised us back in 2011 can finally be realized with this, or some clone / descendent of it.&lt;/p&gt;
&lt;p&gt;iTerm 2 is arguably the best OS X terminal emulator available. It&amp;rsquo;s written in Objective-C.&lt;a href=&#34;https://github.com/gnachman/iTerm2&#34;&gt;The source code is here on Github&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s &lt;a href=&#34;https://liftoff.github.io/GateOne/Developer/terminal.html&#34;&gt;Terminal.py&lt;/a&gt; which is a terminal emulator written in pure python. Being Python I suspect its source code would be a bit easier to wrap your head around (less low level stuff to deal with relative to an Obj-c codebase). It claims to support XTerm emulation, but I can&amp;rsquo;t say how much of xterm it actually emulates.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/Gottox/terminal.js&#34;&gt;Terminal.js&lt;/a&gt;. This one&amp;rsquo;s a little different: Node.js sets up a wee server on your desktop and you interact with it via a Terminal.js which you load up in your browser. There&amp;rsquo;s &lt;a href=&#34;https://github.com/Gottox/node-webterm&#34;&gt;a demo app for it&lt;/a&gt;. Not sure what exactly that gets you.&lt;/p&gt;
&lt;p&gt;And of course, there&amp;rsquo;s &lt;a href=&#34;http://invisible-island.net/xterm/&#34;&gt;XTerm&lt;/a&gt; but I suspect that it&amp;rsquo;s not a great place to start. Too much functionality built up over too many years. I wouldn&amp;rsquo;t go there until I&amp;rsquo;d gotten a handle on the basics.&lt;/p&gt;
&lt;h2 id=&#34;credits&#34;&gt;Credits&lt;/h2&gt;
&lt;p&gt;Much of the info here was gleaned from &lt;a href=&#34;http://vt100.net/emu/&#34;&gt;this page on vt100.net&lt;/a&gt;,  and the &lt;a href=&#34;http://invisible-island.net/xterm/xterm.faq.html&#34;&gt;XTerm FAQ&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Adding Press and Hold Characters to macOS (OS X)</title>
      <link>https://weblog.masukomi.org/2015/12/13/esperanto-press-and-hold-characters/</link>
      <pubDate>Sun, 13 Dec 2015 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2015/12/13/esperanto-press-and-hold-characters/</guid>
      <description>&lt;p&gt;EDIT: As of Monterrey Apple has &lt;em&gt;completely&lt;/em&gt; locked down the files you need to edit.&lt;/p&gt;
&lt;p&gt;There are 2 ways I know of to do this, and neither of them is as good.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;use &lt;a href=&#34;https://textexpander.com/&#34;&gt;TextExpander&lt;/a&gt;. You can tell it that
when you type cx to &amp;ldquo;expand&amp;rdquo; it to &lt;code&gt;ĉ&lt;/code&gt;. You&amp;rsquo;ll probably have
to copy the character you want from here or any other page with it.
Then do the same for all the other characters that need &lt;code&gt;ˆ&lt;/code&gt;. &lt;a href=&#34;https://app.textexpander.com/public/942f62a9ba40b286d70055902ee4c78b&#34;&gt;Here is
a public snippet group with the Esperanto Diacritics&lt;/a&gt; that I&amp;rsquo;ve put together. Just type cx to get &lt;code&gt;ĉ&lt;/code&gt;, and so on for all the characters that use the &lt;code&gt;ˆ&lt;/code&gt; or &lt;code&gt;˘&lt;/code&gt; diacritics.&lt;/li&gt;
&lt;li&gt;use &lt;a href=&#34;https://keyman.com&#34;&gt;Keyman&lt;/a&gt;. They specificaly have &lt;a href=&#34;https://keyman.com/keyboards/install/esperantohx&#34;&gt;a QWERTY Esperanto keyboard layout&lt;/a&gt;. &lt;em&gt;However&lt;/em&gt; it&amp;rsquo;s not what you think. It doesn&amp;rsquo;t give you press-and-hold menu, and it doesn&amp;rsquo;t actually let you type a &lt;code&gt;ĉ&lt;/code&gt;. what it does, is exactly the same thing as Text Expander, only with +h or +x. Basically, what you get is an incredibly limited free version of Text Expander, that only works with the QWERTY keyboard layout.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In short, buy Text Expander, because you&amp;rsquo;re going to get a ton of
other cool functionality &lt;em&gt;and&lt;/em&gt; it&amp;rsquo;ll work regardless of what keyboard
layout you use.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;OS X makes it easy to type accented characters by simply holding down the letter you want accented. If you hold down &lt;code&gt;c&lt;/code&gt; (for example) you&amp;rsquo;ll see this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2015/12/press-and-hold-characters-example.png&#34; alt=&#34;press and hold characters example&#34;&gt;&lt;/p&gt;
&lt;p&gt;Well, &lt;em&gt;I&lt;/em&gt; do. You probably don&amp;rsquo;t see that 4th option: &amp;ldquo;ĉ&amp;rdquo;, and that&amp;rsquo;s what this post is about. I needed to add that, and others to support typing in Esperanto without switching to a different language keyboard. This technique is also useful if there is a language keyboard you want to use but it doesn&amp;rsquo;t have the Press and Hold support you want.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the deal though. The files you need to edit, are in an area of the system that Apple has locked down so hard that even the root user can&amp;rsquo;t touch it. Normally the &lt;code&gt;root&lt;/code&gt; user can do anything it feels like.  You&amp;rsquo;ll need to &lt;em&gt;temporarily&lt;/em&gt; disable &lt;a href=&#34;https://en.wikipedia.org/wiki/System_Integrity_Protection&#34;&gt;System Integrity Protection&lt;/a&gt; and run a few commands in the terminal to replace the XML file that defines what characters show up in the Press and Hold menus.  You&amp;rsquo;ll need a &lt;em&gt;developer&amp;rsquo;s&lt;/em&gt; text editor (not Text Edit), and knowledge of how to copy and move files on the command line.&lt;/p&gt;
&lt;p&gt;If that&amp;rsquo;s all gobbledygook and/or scary to you, then you should probably stop here. I&amp;rsquo;m sorry. Apple&amp;rsquo;s made this a geek-only operation.&lt;/p&gt;
&lt;p&gt;Still here?  Good.&lt;/p&gt;
&lt;h2 id=&#34;here-be-dragons&#34;&gt;Here Be Dragons&lt;/h2&gt;
&lt;p&gt;There&amp;rsquo;s a system folder in which You&amp;rsquo;ll find a variety of files. We need to modify the file in there that corresponds to your default language. If you&amp;rsquo;re reading this your default language is probably English, so you&amp;rsquo;ll want to &lt;code&gt;Keyboard-en.plist&lt;/code&gt; (&amp;ldquo;en&amp;rdquo; for English). If not, find the file with the 2 letter abbreviation that corresponds to your system&amp;rsquo;s  language.&lt;/p&gt;
&lt;p&gt;In El Capitan this folder is here&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	/System/Library/Input&lt;span class=&#34;se&#34;&gt;\ &lt;/span&gt;Methods/PressAndHold.app/Contents/Resources/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In Sierra this folder is here&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	/System/Library/Input&lt;span class=&#34;se&#34;&gt;\ &lt;/span&gt;Methods/PressAndHold.app/Contents/PlugIns/PAH_Extension.appex/Contents/Resources/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;If you just want to add Esperanto character&amp;rsquo;s to your English Press and Hold menus
then &lt;a href=&#34;https://weblog.masukomi.org/misc/2015/12/Keyboard-en.plist&#34;&gt;download this file&lt;/a&gt; (right click, save as
&lt;code&gt;Keyboard-en.plist&lt;/code&gt;) and skip down to the part about Disabling System Integrity
Protection.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;modifying-your-press-and-hold-plist-file&#34;&gt;Modifying your Press and Hold plist file.&lt;/h2&gt;
&lt;p&gt;Once you&amp;rsquo;ve found the appropriate file copy it into another directory and start editing. You can&amp;rsquo;t edit it in place.&lt;/p&gt;
&lt;p&gt;First find the &lt;code&gt;&amp;lt;key&amp;gt;...&amp;lt;/key&amp;gt;&lt;/code&gt; line that corresponds to the key you want to edit.  When I went to add a capital C with a caret over it I found the &lt;code&gt;&amp;lt;key&amp;gt;Roman-Accent-C&amp;lt;/key&amp;gt;&lt;/code&gt; line, then edited the &lt;code&gt;&amp;lt;dict&amp;gt;...&amp;lt;/dict&amp;gt;&lt;/code&gt; block below it. I&amp;rsquo;m fairly certain that the first character must not be changed. The other characters are the ones that will show up in the Press and Hold pop-up. Modify them however you want. You can even put emoticons in there.  I just modified to have the &lt;code&gt;Ĉ&lt;/code&gt; you see below.  Note that there are spaces between each character. What happens if you string multiple letters together without a space? Dunno. I&amp;rsquo;m betting you&amp;rsquo;ll get an entire word for an item in the menu.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;nt&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;Roman-Accent-C&lt;span class=&#34;nt&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;nt&#34;&gt;&amp;lt;dict&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;nt&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;Direction&lt;span class=&#34;nt&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;nt&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;right&lt;span class=&#34;nt&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;nt&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;Keycaps&lt;span class=&#34;nt&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;nt&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;C Ç Ć Č Ĉ&lt;span class=&#34;nt&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;nt&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;Strings&lt;span class=&#34;nt&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;nt&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;C Ç Ć Č Ĉ&lt;span class=&#34;nt&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;nt&#34;&gt;&amp;lt;/dict&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Once you&amp;rsquo;ve modified all the uppercase and lowercase versions of the letters you want the pop-up for it&amp;rsquo;s time to replace the original. I recommend making a back-up first. Just in case.&lt;/p&gt;
&lt;h2 id=&#34;temporarily-disabling-system-integrity-protection&#34;&gt;Temporarily disabling System Integrity Protection&lt;/h2&gt;
&lt;p&gt;You&amp;rsquo;ll probably want to print out / write down these instructions because you won&amp;rsquo;t be seeing them after restarting.&lt;/p&gt;
&lt;p&gt;Restart your computer. Hold down the &amp;ldquo;Command&amp;rdquo; key and the &amp;ldquo;R&amp;rdquo; key when you hear the restart sound. You&amp;rsquo;ll see a progress bar as it boots you into Recovery Mode. Ignore the window listing backups and disk utility. Click on the &amp;ldquo;Utilities&amp;rdquo; menu, and choose Terminal.&lt;/p&gt;
&lt;p&gt;Disable SIP and reboot (to make it take effect).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;csrutil disable&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; reboot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Log in, then run this for El Capitan&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo cp path/to/your/edited/Keyboard-en.plist /System/Library/Input&lt;span class=&#34;se&#34;&gt;\ &lt;/span&gt;Methods/PressAndHold.app/Contents/Resources/Keyboard-en.plist
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;or this for Sierra &amp;amp; High Sierra&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo cp path/to/your/edited/Keyboard-en.plist /System/Library/Input&lt;span class=&#34;se&#34;&gt;\ &lt;/span&gt;Methods/PressAndHold.app/Contents/PlugIns/PAH_Extension.appex/Contents/Resources/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Reboot and go back into Recovery Mode. Open up the Terminal again, and run&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;csrutil enable&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; reboot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That&amp;rsquo;s it. You&amp;rsquo;re done. Now your customized popover will be available to any keyboard in your default language.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>On offering up Grad School Recommendations</title>
      <link>https://weblog.masukomi.org/2015/12/05/recommendation-for-grad-school/</link>
      <pubDate>Sat, 05 Dec 2015 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2015/12/05/recommendation-for-grad-school/</guid>
      <description>&lt;p&gt;I was recently asked to provide a letter of recommendation to a past coworker who is trying to get in to grad school. The experience was excessively time-consuming,  and left me with little belief that any of these schools are worth attending because their systems were (with one exception) all painful to use, and (with no exceptions) all looked like shit. If you can&amp;rsquo;t teach your students how to build a decent system for letting people upload recommendations, then how the @#$% can I expect you to teach anyone graduate level concepts? I know that some of the following schools are actually quite good, but they show no evidenced of it in the code they offer up for professors and professionals to use.&lt;/p&gt;
&lt;h2 id=&#34;carnegie-mellon&#34;&gt;Carnegie Mellon&lt;/h2&gt;
&lt;p&gt;asked my to put my letter of recommendation on &amp;ldquo;a letterhead&amp;rdquo; in PDF or Word format. Seriously? WTF does &amp;ldquo;letterhead&amp;rdquo; even mean in the digital age? You want me to paste my company logo at the top?  In the age of paper this had meaning. It proved you&amp;rsquo;d spent money going to a printer in support of your company / institution. It was an easy way to help confirm the reviewer actually worked at the company they claimed to. Now? Now, it doesn&amp;rsquo;t mean Jack.&lt;/p&gt;
&lt;h2 id=&#34;nyus&#34;&gt;NYU&amp;rsquo;s&lt;/h2&gt;
&lt;p&gt;form a) has a full page of documentation on how to upload a recommendation letter b) is completely teacher centric, as though no-one would every come with a recommendation from a the world of &lt;em&gt;gasp&lt;/em&gt; business c) is a 3 page process. Forces me to &amp;ldquo;Please compare the applicant&amp;rsquo;s academic ability to that of other students.&amp;rdquo; which makes me either lie (because I&amp;rsquo;m a manager not a professor) or choose &amp;ldquo;I prefer not to answer&amp;rdquo;, which would raise flags if &lt;em&gt;I&lt;/em&gt; was reviewing this recommendation. Also, they made me &amp;ldquo;sign&amp;rdquo; the form twice.&lt;/p&gt;
&lt;h2 id=&#34;stanford-cornell-and-university-of-michigan&#34;&gt;Stanford, Cornell, and University of Michigan&lt;/h2&gt;
&lt;p&gt;all use the system for managing your account, but each ask different questions in different ways.&lt;/p&gt;
&lt;h3 id=&#34;stanford&#34;&gt;Stanford&lt;/h3&gt;
&lt;p&gt;mostly wanted me to prove I was a worthy reviewer and asked questions like &amp;ldquo;How many years have you evaluated people in this group?&amp;rdquo; and &amp;ldquo;Approximately how many people are in the group, totaled over those years?&amp;rdquo;&lt;/p&gt;
&lt;h3 id=&#34;cornell&#34;&gt;Cornell&lt;/h3&gt;
&lt;p&gt;did a surprisingly good job of making it easy for me to give them info that would be helpful to their evaluations, like a quick rating on Academic Performance, Intellectual Potential, Creativity and originality, and Motivation for graduate study.&lt;/p&gt;
&lt;h3 id=&#34;university-of-michigan&#34;&gt;University of Michigan&lt;/h3&gt;
&lt;p&gt;had a similar form but with even better questions which would not only help judge him, but his potential usefulness to the school with the typical tasks a grad student is asked to perform.&lt;/p&gt;
&lt;h2 id=&#34;boston-university-metropolitan-college&#34;&gt;Boston University Metropolitan College&lt;/h2&gt;
&lt;p&gt;only allows 10 characters for your title.  I put &amp;ldquo;Tech Lead&amp;rdquo; because it sounds better than just &amp;ldquo;Manager&amp;rdquo;, but then at the bottom of the form I realized they meant Mr. / Mrs. / Dr. / etc. They don&amp;rsquo;t allow enough characters in the phone field to put in an international number with any formatting.  They also make you agree to a typically large &amp;ldquo;Terms of Service&amp;rdquo;, which of course I didn&amp;rsquo;t read.  They were, however, the first school that actually grasped the idea that people outside of academia might be providing reviews.&lt;/p&gt;
&lt;h2 id=&#34;columbias&#34;&gt;Columbia&amp;rsquo;s&lt;/h2&gt;
&lt;p&gt;was the least painful, but very meh.&lt;/p&gt;
&lt;h2 id=&#34;u-mass&#34;&gt;U Mass&lt;/h2&gt;
&lt;p&gt;let me know that  &amp;ldquo;When entering your recommendation, please save your progress every 15 minutes, or changes may be lost.&amp;rdquo; which doesn&amp;rsquo;t speak highly of their computing department if they can&amp;rsquo;t keep their system from blowing up every 15 minutes, or figure out how to use that fancy &amp;ldquo;AJAX&amp;rdquo; technology that&amp;rsquo;s only been on the scene for 10+ years. They then ask me to fill in this sentence &amp;ldquo;I would rank this student in the top &lt;code&gt;_____&lt;/code&gt; % of approximately students I have taught in &lt;code&gt;_____&lt;/code&gt; years. And, of course, after filing it with &amp;ldquo;NA&amp;rdquo; it decided it didn&amp;rsquo;t like it (when I attempted to upload a PDF ?!?!), so I put my cursor in a field and used the delete key, which took me to the prior page, and when I went forward again it lost all my data, just like the form promised. So, I ranked him in the top 100% of the 0 students I&amp;rsquo;ve taught in the past 20 years.  They also asked me for my &amp;ldquo;Title&amp;rdquo; but after the last one I have no clue what they meant.&lt;/p&gt;
&lt;p&gt;After finally managing to upload the PDF it suggested I click the &amp;ldquo;View&amp;rdquo; button to make sure it looks correct. So I did, and the browser promptly blocked their Pop-Up window. Pop-Up blockers have been shipped on by default in browsers for how many years now?  If their recommendation form is any indication U Mass is an absolutely shitty place to study computer science.&lt;/p&gt;
&lt;h2 id=&#34;university-of-southern-californias&#34;&gt;University of Southern California&amp;rsquo;s&lt;/h2&gt;
&lt;p&gt;process is relatively painless, and gathers some useful info, but also allows you to upload your review in &amp;ldquo;.jpg, .pict, .gif, .bmp, .tif or .png format&amp;rdquo; in addition to normal text things&amp;hellip; which is somewhat disturbing.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Software worth recommending</title>
      <link>https://weblog.masukomi.org/2015/11/14/sofware-worth-recommending/</link>
      <pubDate>Sat, 14 Nov 2015 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2015/11/14/sofware-worth-recommending/</guid>
      <description>&lt;p&gt;There are lots of great tools out there. Far too many to try. Here are the ones that I&amp;rsquo;ve tried, and found worth recommending. Mostly they&amp;rsquo;re&lt;/p&gt;
&lt;h2 id=&#34;os-x&#34;&gt;OS X&lt;/h2&gt;
&lt;h3 id=&#34;developer-things&#34;&gt;Developer Things&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;http://happenapps.com/#quiver&#34;&gt;Quiver&lt;/a&gt; is a &amp;ldquo;Programmer&amp;rsquo;s Notebook&amp;rdquo;. I&amp;rsquo;ve recently switched to it from &lt;a href=&#34;http://shpakovski.com/codebox/&#34;&gt;CodeBox&lt;/a&gt; which seems to have been abandoned by its developer. I&amp;rsquo;ve got some minor quibbles with Quiver, but overall it&amp;rsquo;s pretty nice and I&amp;rsquo;ll be bringing all my code snippets and reference material over to it.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://kapeli.com/dash&#34;&gt;Dash&lt;/a&gt; is excellent for anyone who needs to search language / framework docs semi-regularly.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/b4winckler/macvim&#34;&gt;MacVim&lt;/a&gt; because I can&amp;rsquo;t fathom why anyone who wants to use vim on a mac would limit themselves to using it in a terminal when they don&amp;rsquo;t have to.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.kaleidoscopeapp.com/&#34;&gt;Kaleidoscope&lt;/a&gt; It&amp;rsquo;s a great visual diffing app. If you use diff on anything resembling a regular basis, you should give Kaleidoscope a try.&lt;/p&gt;
&lt;h3 id=&#34;markdown&#34;&gt;Markdown&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;http://marked2app.com/&#34;&gt;Marked 2&lt;/a&gt; for previewing Markdown files and exporting them to other formats, this is the app you want. That being said, I&amp;rsquo;d only recommend it to people who really love Markdown. People who only use it occasionally probably don&amp;rsquo;t care enough to justify buying this.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.decksetapp.com/&#34;&gt;Deckset&lt;/a&gt; It&amp;rsquo;s presentation software, but you build your presentations with Markdown. Yay. Not as full featured as I&amp;rsquo;d like, but it&amp;rsquo;ll let you build very nice presentations.&lt;/p&gt;
&lt;h3 id=&#34;flow-charting&#34;&gt;Flow Charting&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.omnigroup.com/omnigraffle/&#34;&gt;OmniGraffle&lt;/a&gt; is the king of the flow charting apps. It&amp;rsquo;s awesome. End of story.&lt;/p&gt;
&lt;p&gt;But&amp;hellip;&lt;br&gt;
&lt;a href=&#34;http://monodraw.helftone.com/&#34;&gt;Monodraw&lt;/a&gt; has earned a special place in my heart. Recently I had to wrap my head around a complicated data flow. When I was done, I created a flow chart in Monodraw and pasted it into the source code so that the next time I have to look at that code I&amp;rsquo;ll have a nice graphic to guide me through it.&lt;/p&gt;
&lt;h3 id=&#34;miscellaneous&#34;&gt;Miscellaneous&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;http://noiz.io/&#34;&gt;Noizio&lt;/a&gt; is great for noisy work environments. Turn it on, along with some music and you won&amp;rsquo;t make out anything your coworkers are blabbing about. And no I&amp;rsquo;m not suggesting making everything so loud as to drown them out.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://dayoneapp.com/&#34;&gt;Day One&lt;/a&gt; This is a really beautiful app, and the iPhone version is great. The companion app on the watch looks like a really nice addition too. I haven&amp;rsquo;t been using it much, but it&amp;rsquo;s the kind of app that makes you &lt;em&gt;want&lt;/em&gt; to use it.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.pixelmator.com/mac/&#34;&gt;Pixelmator&lt;/a&gt; Screw Photoshop. Get Pixelmator. It&amp;rsquo;s affordable, powerful, and exceptionally well made.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.daisydiskapp.com/&#34;&gt;DaisyDisk&lt;/a&gt; Helps you figure out what&amp;rsquo;s taking up your disk space. I don&amp;rsquo;t need this very often, but when I do it&amp;rsquo;s invaluable.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://evernote.com/skitch/&#34;&gt;Skitch&lt;/a&gt; If you need to make and annotate screenshots, this is the app to use.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.macbartender.com/&#34;&gt;Bartender&lt;/a&gt; Helps address an excess of menu bar icons.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://panic.com/transmit/&#34;&gt;Transmit&lt;/a&gt; If you deal with FTP, SFTP, S3, or pretty much any other file transfer system on a regular basis, then you want this app.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.telestream.net/screenflow/&#34;&gt;Screenflow&lt;/a&gt; Excellent, easy to use screencast software, that lets you go back and add really useful annotations,  highlights, and more.&lt;/p&gt;
&lt;h2 id=&#34;multiplatform&#34;&gt;Multiplatform&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/syl20bnr/spacemacs#readme&#34;&gt;Spacemacs&lt;/a&gt; &amp;ldquo;The best editor is neither Emacs nor Vim, it&amp;rsquo;s Emacs *and* Vim!&amp;rdquo;. I love Vim. I envy the extensibility of Emacs. This is the first implementation of Vim (technically it&amp;rsquo;s &lt;a href=&#34;http://www.emacswiki.org/emacs/Evil&#34;&gt;Evil&lt;/a&gt;) on Emacs that has come even close to working. Normally they piss me off within 30 seconds. This has me wanting to take the time to figure out how to replicate my vim workflows in it.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.literatureandlatte.com/scrivener.php&#34;&gt;Scrivener&lt;/a&gt; Writing anything of significant length? This is what you want. Be sure to go through the tutorial. There are a ton of powerful features hiding in plain sight. Out of the way until you need them.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://agilebits.com/onepassword&#34;&gt;1Password&lt;/a&gt; It&amp;rsquo;s the best password manager out there, and they&amp;rsquo;ve had their code independently audited by security experts. Don&amp;rsquo;t even get me started on how ignorant / stupid it is for people to not be using a password manager.&lt;/p&gt;
&lt;h3 id=&#34;vim-plugins&#34;&gt;Vim plugins&lt;/h3&gt;
&lt;p&gt;The list of plugins I&amp;rsquo;m currently using is generally in flux. I&amp;rsquo;m always trying to improve my vim setup. Check &lt;a href=&#34;https://github.com/masukomi/masuconfigs/blob/master/.vimrc&#34;&gt;my .vimrc&lt;/a&gt; for the lastest complete list. Here are some that I think are definitely worth sharing by all.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/gmarik/Vundle.vim&#34;&gt;Vundle&lt;/a&gt; Best vim plugin manager I&amp;rsquo;ve found.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/tpope/vim-fugitive&#34;&gt;Fugitive&lt;/a&gt;  Spectacular git integration. If nothing else, check out the GBlame command.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/godlygeek/tabular&#34;&gt;Tabular&lt;/a&gt; Align your text! Make things more readable. Check out &lt;a href=&#34;http://vimcasts.org/episodes/aligning-text-with-tabular-vim/&#34;&gt;this vimcast&lt;/a&gt; for a good idea of what you can do with this.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/tomtom/tcomment_vim&#34;&gt;tcomment&lt;/a&gt; lets you easily toggle if a piece of text is commented out or not.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/bling/vim-airline&#34;&gt;airline&lt;/a&gt; it&amp;rsquo;s the successor to Powerline.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/terryma/vim-expand-region&#34;&gt;expand region&lt;/a&gt; is a Vim plugin that allows you to visually select increasingly larger regions of text using the same key combination. Doesn&amp;rsquo;t seem like much but in practice has proven pretty nice.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/clarke/vim-renumber&#34;&gt;vim-renumber&lt;/a&gt; For folks who like to edit markdown in vim. This will renumber ordered lists for you.&lt;/p&gt;
&lt;h2 id=&#34;command-line&#34;&gt;Command Line&lt;/h2&gt;
&lt;h3 id=&#34;git-related&#34;&gt;Git related&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/masukomi/oh-my-git&#34;&gt;Oh My Git&lt;/a&gt; The best prompt enhancement I&amp;rsquo;ve found to tell you what branch you&amp;rsquo;re on, if it&amp;rsquo;s been pushed or not, and tons more. That link&amp;rsquo;s to my fork of the project, which has some visual tweaks. The original is &lt;a href=&#34;https://github.com/arialdomartini/oh-my-git&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/masukomi/git-wtf&#34;&gt;git-wtf&lt;/a&gt; Helps you know wtf the differences are between your current branch and the upstream branch it&amp;rsquo;s tracking.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/nvbn/thefuck&#34;&gt;The Fuck&lt;/a&gt; Every time you type out some long command and then git is all &amp;ldquo;did you mean&amp;hellip;&amp;rdquo; because you made a typo? Yeah well, The Fuck fixes that. It picks up on the suggested correction, and let you type &lt;code&gt;fuck&lt;/code&gt; to execute the command you &lt;em&gt;meant&lt;/em&gt; to type.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Static vs. Dynamic Blogging</title>
      <link>https://weblog.masukomi.org/2015/10/18/static-vs-dynamic-blogging/</link>
      <pubDate>Sun, 18 Oct 2015 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2015/10/18/static-vs-dynamic-blogging/</guid>
      <description>&lt;p&gt;You&amp;rsquo;ve got a lot of software options when setting up a blog. Over the years. I&amp;rsquo;ve used or tried most of the options including, but not limited to: &lt;a href=&#34;https://wordpress.com/&#34;&gt;WordPress&lt;/a&gt;, &lt;a href=&#34;https://jekyllrb.com/&#34;&gt;Jekyll&lt;/a&gt;, &lt;a href=&#34;http://octopress.org/&#34;&gt;Octopress&lt;/a&gt;, and at least 3 custom built systems.&lt;/p&gt;
&lt;p&gt;What follows is my thinking on the pros and cons of each option, and why I&amp;rsquo;m switching back to a static blog system (&lt;a href=&#34;http://gohugo.io/&#34;&gt;Hugo&lt;/a&gt; this time).&lt;/p&gt;
&lt;h2 id=&#34;dynamic-blogs-wordpress-etc&#34;&gt;Dynamic Blogs (WordPress, etc.)&lt;/h2&gt;
&lt;p&gt;Dynamic blogs, like WP, have a lot going for them:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Easy to use&lt;/li&gt;
&lt;li&gt;Lots of plugins&lt;/li&gt;
&lt;li&gt;Great media handling&lt;/li&gt;
&lt;li&gt;Usable from any internet connected device with a browser.&lt;/li&gt;
&lt;li&gt;Great selection of themes&lt;/li&gt;
&lt;li&gt;Instant publishing&lt;/li&gt;
&lt;li&gt;Scheduled posts&lt;/li&gt;
&lt;li&gt;Multiple Authors&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, what&amp;rsquo;s the downside? It seems like every few months one of our WordPress blogs gets hacked and Google starts warning folks it has malware. You have to constantly log in to update it, and every time you do you run the risk of hosing your database (admittedly a rare occurrence), or breaking compatibility with one of your plugins (happened a few times to us).&lt;/p&gt;
&lt;p&gt;Another big downside is when you do happen to write something popular, and thousands of people try hitting your site at once. Many a WordPress (and
similar) blog has gone down under the strain of success.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://squarespace.com/&#34;&gt;Squarespace&lt;/a&gt; would be an excellent option except for the $8+ per month, per site price tag. $24 if you want to be able to actually modify the HTML, CSS, or JavaScript. &lt;em&gt;Maybe&lt;/em&gt;, if you only have one, but I manage 11+.&lt;/p&gt;
&lt;h2 id=&#34;static-blogs&#34;&gt;Static Blogs&lt;/h2&gt;
&lt;p&gt;There are notably good things about static blogs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The fastest possible page loads.&lt;/li&gt;
&lt;li&gt;Can withstand crazy high request loads&lt;/li&gt;
&lt;li&gt;Zero maintenance or security worries.&lt;/li&gt;
&lt;li&gt;Minimal hosting requirements&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://whatismarkdown.com/&#34;&gt;Markdown&lt;/a&gt; support
&lt;ul&gt;
&lt;li&gt;you may not care, but I demand it of a blogging platform.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are a number of downsides though:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Can only blog from home computer (without bullshit hoop jumping)
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://prose.io/&#34;&gt;Prose&lt;/a&gt; is the only decent exception I know of. &lt;a href=&#34;https://tinypress.co/&#34;&gt;Tinypress&lt;/a&gt; may be an option too, but they&amp;rsquo;re too new to say.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Multistep publishing
&lt;ul&gt;
&lt;li&gt;run build script&lt;/li&gt;
&lt;li&gt;sync files over scp / rsync / ftp / whatever.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Generally weak media support
&lt;ul&gt;
&lt;li&gt;no auto-resizing&lt;/li&gt;
&lt;li&gt;no media players&lt;/li&gt;
&lt;li&gt;have to think about where the images live&lt;/li&gt;
&lt;li&gt;very limited selection of plugins (if any)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Typically poor selection of themes&lt;/li&gt;
&lt;li&gt;Limited layout capabilities
&lt;ul&gt;
&lt;li&gt;they all use markdown, and Markdown can only produce a restricted subset of HTML.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Slow site generation
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://gohugo.io/&#34;&gt;Hugo&lt;/a&gt; is the &lt;em&gt;only&lt;/em&gt; exception I&amp;rsquo;ve seen to this rule.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Metadata gets mixed in with posts instead of stored in a separate database
&lt;ul&gt;
&lt;li&gt;All static blogs seem to use &lt;a href=&#34;https://jekyllrb.com/&#34;&gt;Jekyll&lt;/a&gt; idea of
&lt;a href=&#34;https://gohugo.io/content/front-matter/&#34;&gt;Front Matter&lt;/a&gt; embeded at the top of your post.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Multi-author sites require either human organization or hacking. It&amp;rsquo;s not really supported well out of the box.&lt;/li&gt;
&lt;li&gt;Geeky
&lt;ul&gt;
&lt;li&gt;Very few of the static blog options seem particularly usable by the non-geeks out there.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;note&#34;&gt;Note&lt;/h3&gt;
&lt;p&gt;Being a geek, I&amp;rsquo;ve got some advantages. When I used Jekyll I wrote
&lt;a href=&#34;https://github.com/masukomi/JekyllMail&#34;&gt;JekyllMail&lt;/a&gt; which lets you create blog posts via email. It even handles attached images. I could do that for any other platform too. That addresses what&amp;rsquo;s probably the biggest downside to static blogs.  Again, using &lt;a href=&#34;http://prose.io/&#34;&gt;Prose&lt;/a&gt; would too, but that&amp;rsquo;d tie me to Jekyll on the back end, and I just wasn&amp;rsquo;t thrilled with it.&lt;/p&gt;
&lt;h2 id=&#34;whyd-i-choose-static&#34;&gt;Why&amp;rsquo;d I Choose Static?&lt;/h2&gt;
&lt;p&gt;With so few upsides, and so many downsides, a dynamic blog would seem
the obvious choice. So why would I switch back to a static blog?&lt;/p&gt;
&lt;p&gt;At this point I require any dynamic system to also be a &lt;em&gt;managed&lt;/em&gt; system (like
Squarespace) that doesn&amp;rsquo;t cost a boatload of money to run a bunch of sites on. Also, I need to actually like the software. &lt;a href=&#34;https://ghost.org&#34;&gt;Ghost&lt;/a&gt;
is a decent, and relatively affordable option but I&amp;rsquo;ve had problems with their import, and I&amp;rsquo;m not thrilled with the software.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://medium.com/&#34;&gt;Medium&lt;/a&gt; and &lt;a href=&#34;https://svbtle.com/&#34;&gt;Svbtle&lt;/a&gt; both have their proponents, but posting there doesn&amp;rsquo;t contribute to your success or credentials. It contributes to their&amp;rsquo;s.&lt;/p&gt;
&lt;p&gt;Static blogs give me a few big things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The ability to stop compensating for or worrying about hackers&lt;/li&gt;
&lt;li&gt;The confidence my site will stay up when I post something popular&lt;/li&gt;
&lt;li&gt;The ability to customize the look and feel&lt;/li&gt;
&lt;li&gt;Unlimited blog sites for zero additional dollars.
&lt;ul&gt;
&lt;li&gt;I just pay a monthly fee for hosting space with as many domains as I want.&lt;/li&gt;
&lt;li&gt;Or do it totally free by using GitHub pages&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Also, and I realize this is totally illogical, building a site with a static
blog gives me a feeling of having actually been a part of it&amp;rsquo;s creation.&lt;/p&gt;
&lt;p&gt;So, for now I&amp;rsquo;m using &lt;a href=&#34;http://gohugo.io/&#34;&gt;Hugo&lt;/a&gt;. I&amp;rsquo;m going to have to start converting my other blogs over because they&amp;rsquo;ve been hacked again. I just need to find a way to enable my wife to easily post to our shared blog at &lt;a href=&#34;http://corporaterunaways.com&#34;&gt;CorporateRunaways&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Want to debate this? Think I missed something? Hit me up &lt;a href=&#34;https://twitter.com/masukomi&#34;&gt;on Twitter&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Why I won&#39;t be backing Mou&#39;s crowdfunding Campaign</title>
      <link>https://weblog.masukomi.org/2014/10/09/why-i-wont-be-backing-mous-crowdfunding-campaign/</link>
      <pubDate>Thu, 09 Oct 2014 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2014/10/09/why-i-wont-be-backing-mous-crowdfunding-campaign/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://25.io/mou/&#34;&gt;Mou&lt;/a&gt; as your Markdown loving Mac geeks know, is a split pane Markdown editor. It&amp;rsquo;s been around for years and it&amp;rsquo;s really quite good. I even donated to its creator in the past to support it. Now he&amp;rsquo;s put together &lt;a href=&#34;https://www.indiegogo.com/projects/mou-1-0-markdown-editor-on-os-x-for-you&#34;&gt;an IndieGoGo campaign&lt;/a&gt; to pay for people to work on it full time, but I won&amp;rsquo;t be contributing.&lt;/p&gt;
&lt;h2 id=&#34;some-background-first&#34;&gt;Some background first&lt;/h2&gt;
&lt;p&gt;Mou was never open source. I&amp;rsquo;m ok with that. I use a bunch of great proprietary apps. Unfortunately, that means that when its developer (&lt;a href=&#34;http://twitter.com/chenluois&#34;&gt;Chen Lou&lt;/a&gt;) was busy with his life, Mou languished, and no-one could help improve it. Eventually he decided he couldn&amp;rsquo;t give it the attention it deserved and tried to sell it. Sadly, I found out about this after the fact or &lt;em&gt;damn&lt;/em&gt; would I have been trying to put together the money to buy it.&lt;/p&gt;
&lt;h2 id=&#34;life-moves-on&#34;&gt;Life Moves On&lt;/h2&gt;
&lt;p&gt;During the process of trying to sell it Chen appears to have decided to try and put together a company to work on it full time, which is great, but when the sale was announced &lt;a href=&#34;https://uranusjr.com/&#34;&gt;UranusJr&lt;/a&gt; (otherwise known as Tzu-Ping Chung) got a bit concerned.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It came as a great shock when Chen Luo announced that he felt he could not actively continue the development, and wished to sell the ownership of Mou. No suitable offers surfaced (I honestly do not think there will be, either), and I decided that instead of waiting for others to do something about this, I should act myself.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And act he did. UranusJr&amp;rsquo;s been working like a madman on an MIT licensed clone of Mou called &lt;a href=&#34;http://macdown.uranusjr.com/&#34;&gt;MacDown&lt;/a&gt;. He&amp;rsquo;s been adding features on a regular basis, and is constanly asking for and listening to feedback from the community. He allows those of us who use it, but aren&amp;rsquo;t skilled at Objective-C to feel that we are making some kind of worthwile contribution by trying out his beta code and discussing the ideas that he, and the community, come up with.&lt;/p&gt;
&lt;h2 id=&#34;the-crowdfunding&#34;&gt;The crowdfunding&lt;/h2&gt;
&lt;p&gt;Meanwhile Chen Lou&amp;rsquo;s IndieGoGo campaign is offering the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;We&amp;rsquo;ll pick the most wanted features from our contributors, implement them in 1.0.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Free license to Mou when it hits 1.0&lt;/li&gt;
&lt;li&gt;Jumping metal frog&lt;/li&gt;
&lt;li&gt;Metal stand shaped like the Mou&amp;rsquo;s &amp;ldquo;M&amp;rdquo; in various colors.&lt;/li&gt;
&lt;li&gt;If we&amp;rsquo;re really lucky and it reaches $100,000 ( 5 times it&amp;rsquo;s goal ) he will open source it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, let&amp;rsquo;s compare those perks to what MacDown is offering:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MacDown implements the most wanted features from the community, not just a select few, and if &lt;em&gt;you&lt;/em&gt; want a feature badly enough you can write it and there&amp;rsquo;s a good chance it&amp;rsquo;ll get merged in. Also, he&amp;rsquo;s regularly adding features just because he wants them himself.&lt;/li&gt;
&lt;li&gt;MacDown accepts feature requests from everyone. Also, it&amp;rsquo;s not like Mou would ignore a great feature request from a non-backer. So this is kinda BS anyway.&lt;/li&gt;
&lt;li&gt;MacDown&amp;rsquo;s already free so I don&amp;rsquo;t need a license&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t need a jumping metal frog&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t need a metal stand shaped like an &amp;ldquo;M&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;ALREADY&lt;/strong&gt;&lt;/em&gt; open source.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mou&amp;rsquo;s campaign encourages us to &amp;ldquo;Forget the crappy clones, let&amp;rsquo;s open source the original Mou!&amp;rdquo; But why should we? UranusJr&amp;rsquo;s done a spectacular job with &lt;a href=&#34;http://macdown.uranusjr.com/&#34;&gt;MacDown&lt;/a&gt;. It&amp;rsquo;s true that it&amp;rsquo;s not &lt;em&gt;quite&lt;/em&gt; as polished as Mou yet. I does have a couple rough edges, but it&amp;rsquo;s polishing up quickly, and the driving force behind it is incredibly responsive to community feedback. With MacDown I&amp;rsquo;ve got a great app that I&amp;rsquo;m using daily, and it&amp;rsquo;s released under one of the most permissive licenses there is.&lt;/p&gt;
&lt;p&gt;At this point I see no reason to back Mou. Not long ago I would have happily thrown Chen some more money to start working on it full time, but Mou missed its opportunity. Someone else stepped in to fill the need.&lt;/p&gt;
&lt;h2 id=&#34;ps&#34;&gt;P.S&lt;/h2&gt;
&lt;p&gt;This post? Totally written with &lt;a href=&#34;http://macdown.uranusjr.com/&#34;&gt;MacDown&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The Five Virtues of a Great Programmer</title>
      <link>https://weblog.masukomi.org/2014/10/03/the-five-virtues-of-a-great-programmer/</link>
      <pubDate>Fri, 03 Oct 2014 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2014/10/03/the-five-virtues-of-a-great-programmer/</guid>
      <description>&lt;p&gt;In Programming Perl Larry Wall (in)famously suggested that programmers had &lt;a href=&#34;http://threevirtues.com/&#34;&gt;three great virtues: Laziness, Impatience and Hubris&lt;/a&gt;. Over the years I&amp;rsquo;ve kept coming back to those because there&amp;rsquo;s a real truth to the idea as he originally presented it, but it&amp;rsquo;s limited, and his definition of &amp;ldquo;Hubris&amp;rdquo; has no relation to the actual word.
I believe that those may be aspects of real programmers, a &lt;em&gt;great&lt;/em&gt; programmer goes beyond that. Building on Larry&amp;rsquo;s idea, I present you &lt;strong&gt;The Five Virtues of a Great Programmer&lt;/strong&gt;:&lt;/p&gt;
&lt;h2 id=&#34;laziness&#34;&gt;Laziness&lt;/h2&gt;
&lt;p&gt;The quality that makes you go to great effort to reduce overall energy expenditure. It makes you write labor-saving programs that other people will find useful and document what you wrote so you don&amp;rsquo;t have to answer so many questions about it.&lt;/p&gt;
&lt;h2 id=&#34;impatience&#34;&gt;Impatience&lt;/h2&gt;
&lt;p&gt;The anger you feel when the computer is being lazy. This makes you write programs that don&amp;rsquo;t just react to your needs, but actually anticipate them. Or at least pretend to.&lt;/p&gt;
&lt;h2 id=&#34;hubris&#34;&gt;Hubris&lt;/h2&gt;
&lt;p&gt;The belief that you can do a better job than the people who came before you.&lt;/p&gt;
&lt;h2 id=&#34;humility&#34;&gt;Humility&lt;/h2&gt;
&lt;p&gt;The belief that despite your hubris, there are more talented coders than you, and anything you produce could be better. This leads to well tested code, because you might have screwed up.&lt;/p&gt;
&lt;h2 id=&#34;unselfishness&#34;&gt;Unselfishness&lt;/h2&gt;
&lt;p&gt;The quality that makes you document your code, and leave helpful comments and commit messages, so that others don&amp;rsquo;t have to puzzle out what you&amp;rsquo;ve done. It makes you take the time to help coworkers understand things, and change your code to take their needs into consideration.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Vampire Bug [Definition]</title>
      <link>https://weblog.masukomi.org/2014/10/01/vampire-bug/</link>
      <pubDate>Wed, 01 Oct 2014 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2014/10/01/vampire-bug/</guid>
      <description>&lt;p&gt;Vampire Bug: n. something that worked when you went to bed at 2AM, but when exposed to the light of the next day dies horribly. Typically the exposure proves that it couldn&amp;rsquo;t possibly have been working at 2AM either.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How to enable GitHub 2 factor Authentication on new device / app</title>
      <link>https://weblog.masukomi.org/2014/09/30/how-to-enable-github-2-factor-authentication-on-new-device-slash-app/</link>
      <pubDate>Tue, 30 Sep 2014 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2014/09/30/how-to-enable-github-2-factor-authentication-on-new-device-slash-app/</guid>
      <description>&lt;p&gt;( as of Sept 30th 2014 )&lt;/p&gt;
&lt;p&gt;These are the instructions for how to do it &lt;em&gt;if&lt;/em&gt; you&amp;rsquo;ve already got it configured and need to add a new app / device. If you &lt;em&gt;don&amp;rsquo;t&lt;/em&gt; have it set up already, &lt;a href=&#34;https://help.github.com/articles/configuring-two-factor-authentication-via-a-totp-mobile-app&#34;&gt;GitHub&amp;rsquo;s docs&lt;/a&gt; are&amp;hellip; probably passable.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to Settings&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/settings/security&#34;&gt;Click on Security&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;In the &amp;ldquo;Two-factor authentication&amp;rdquo; section click &amp;ldquo;Edit&amp;rdquo;
&lt;ul&gt;
&lt;li&gt;Yes, even though you don&amp;rsquo;t want to edit it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Delivery options&amp;rdquo; click &amp;ldquo;&lt;a href=&#34;https://github.com/settings/two_factor_authentication/intro&#34;&gt;Reconfigure two-factor authentication&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Yes, even though you don&amp;rsquo;t want to reconfigure it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click &amp;ldquo;Set up using an app&amp;rdquo; or &amp;ldquo;Set up using SMS&amp;rdquo;&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>What would you want to do?</title>
      <link>https://weblog.masukomi.org/2014/07/23/what-would-you-want-to-do/</link>
      <pubDate>Wed, 23 Jul 2014 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2014/07/23/what-would-you-want-to-do/</guid>
      <description>&lt;p&gt;This afternoon my intern asked me this simple question. She&amp;rsquo;s a new developer, and a friend of hers is working in a fresh codebase, with best practices. Everything is nice, and he can keep the entirety of it in his head. She&amp;rsquo;s working with my team, Support Engineering. We&amp;rsquo;re the front-line bug squashers at our company. We&amp;rsquo;ve got a legacy codebase with no tests and brain melting insanity around every bend.&lt;/p&gt;
&lt;p&gt;So she asked me which environment I&amp;rsquo;d want to be working in if I was her. The question, and the answer speak a lot to what it takes to become a great programmer.&lt;/p&gt;
&lt;p&gt;What I would &lt;em&gt;want&lt;/em&gt; if I was her is simple. I&amp;rsquo;d &lt;em&gt;want&lt;/em&gt; to be working in the new codebase. There&amp;rsquo;s no question. A new codebase is always more enjoyable to work on.  But, what I would want is not what I would &lt;em&gt;recommend&lt;/em&gt; with 19 years of professional programming experience.&lt;/p&gt;
&lt;p&gt;My suggestion was that right now she was in the best place she could be: debugging a bad codebase with good instincts and helpful mentors, and that&amp;rsquo;s why I&amp;rsquo;m writing this.&lt;/p&gt;
&lt;p&gt;I firmly believe that &lt;em&gt;the most important skill you can learn as a programmer is how to debug&lt;/em&gt;: how to debug well, and how to debug fast.&lt;/p&gt;
&lt;p&gt;New codebases are great, but they&amp;rsquo;re like kittens. One day they&amp;rsquo;re cute and fun, and the next thing you know they&amp;rsquo;ve grown into a tom cat who&amp;rsquo;s running around spraying your furniture.  It&amp;rsquo;ll be too big to hold it all in your head, and large swaths of it will have been written by other people. Even if you&amp;rsquo;re really lucky, and people have written great tests, and some god has smiled down upon you and granted you the only significant codebase with no bugs, you&amp;rsquo;ll still need to use your debugging skills.&lt;/p&gt;
&lt;p&gt;In the typical case you&amp;rsquo;ll need debugging skills to figure out where the problem is, and then what exactly is going wrong. In our mythical perfect codebase you&amp;rsquo;ll need to figure out where a feature is implemented and how it works in order to build on it. There&amp;rsquo;s really very little difference: hunt something down, understand it, make some changes, write some tests, move on.&lt;/p&gt;
&lt;p&gt;People with bad-ass debugging skills get things done faster, in any industry.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s just the start of why our situation is a better one for her than the happy-fun-land her friend is in.  New developers haven&amp;rsquo;t experienced pain yet. They&amp;rsquo;ve seen &lt;a href=&#34;http://www.amazon.com/s/?_encoding=UTF8&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;field-keywords=programming%20patterns&amp;amp;linkCode=ur2&amp;amp;tag=masukomiorg-20&amp;amp;url=search-alias%3Daps&amp;amp;linkId=XK64VNFBQ7WHUJNT&#34;&gt;the patterns books&lt;/a&gt; but they haven&amp;rsquo;t internalized the problems that resulted in those patterns. They won&amp;rsquo;t know what problems those patterns were designed to avoid, so they won&amp;rsquo;t know when they&amp;rsquo;re about to create that problem. I think that even if they were to go read the best pattern book for their situation they wouldn&amp;rsquo;t be able to truly appreciate it because they don&amp;rsquo;t know the classes of problems they&amp;rsquo;ve got to deal with.&lt;/p&gt;
&lt;p&gt;Debugging a legacy codebase though&amp;hellip; If you&amp;rsquo;ve got good instincts, or good mentors (preferably both) you&amp;rsquo;ll be able to see all the ways to &lt;em&gt;not&lt;/em&gt; do something. You&amp;rsquo;ll encounter things that just feel wrong, and have people who can explain to you why they&amp;rsquo;re wrong, or what piece of the puzzle you&amp;rsquo;re missing. Once you&amp;rsquo;ve found the bad, you&amp;rsquo;ll have to figure out how to make it good, and you&amp;rsquo;ll learn about tradeoffs, because professional coders rarely have the luxury of refactoring everything to be the best it could be, especially in crufty old legacy codebases. No, you have to find the balance. You have to figure out what you can do to improve the situation without spending so much time that the other bugs pile up.  It&amp;rsquo;s a lesson I&amp;rsquo;m still learning nearly 20 years in.&lt;/p&gt;
&lt;p&gt;When she eventually moves on from her job as a professional bug slayer she may not know the &lt;em&gt;right&lt;/em&gt; way to write good code, but she&amp;rsquo;ll definitely know how to not write bad code, how to make code that other people can understand (because she had to wade through so much incomprehensible stuff), and why you don&amp;rsquo;t violate encapsulation.&lt;/p&gt;
&lt;p&gt;A year from now her friend will just be starting to experience the consequences of his inexperienced decisions.  A year from now she will be ready to tackle anything.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Writing good User Stories</title>
      <link>https://weblog.masukomi.org/2014/02/20/writing-good-user-stories/</link>
      <pubDate>Thu, 20 Feb 2014 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2014/02/20/writing-good-user-stories/</guid>
      <description>&lt;p&gt;First, it should be noted that not &lt;em&gt;all&lt;/em&gt; stories are &amp;ldquo;User Stories&amp;rdquo;. For example a developer might be tasked with manually running some script. The Story might simply be &amp;ldquo;run the fooberry script&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;For everything that effects the UI, use a template:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As a &amp;lt; type of user &amp;gt;&lt;br&gt;
I want &amp;lt; to perform some &lt;strong&gt;task&lt;/strong&gt; &amp;gt;&lt;br&gt;
So that &amp;lt; I can achieve some &lt;strong&gt;goal&lt;/strong&gt; &amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Note that it&amp;rsquo;s all about what the user wants. This isn&amp;rsquo;t about instructing what change to make to a system. It&amp;rsquo;s about advising implementers on what the desires of the user are.&lt;/p&gt;
&lt;h2 id=&#34;sizing-details-content&#34;&gt;Sizing, details, content&lt;/h2&gt;
&lt;p&gt;Now, everyone says user stories should be &amp;ldquo;testable&amp;rdquo;, and &amp;ldquo;small&amp;rdquo;, but what does that mean?&lt;/p&gt;
&lt;h3 id=&#34;stories-should-be-testable&#34;&gt;Stories should be &amp;ldquo;Testable&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;You&amp;rsquo;ve heard it before, but its a horrible way of expressing the intent.  In general, a story is not directly testable. A Story is only testable through its &lt;em&gt;Acceptance Criteria&lt;/em&gt;.&lt;/p&gt;
&lt;h4 id=&#34;acceptance-criteria&#34;&gt;Acceptance Criteria?&lt;/h4&gt;
&lt;p&gt;Each Story should have a compliment of Acceptance Criteria which cover &lt;em&gt;every&lt;/em&gt; interaction, and outcome of the Story. Think of it this way. If you write code that meets every Acceptance Criteria and &lt;em&gt;nothing else&lt;/em&gt; your coding work should be done. You should not need to write &lt;em&gt;anything&lt;/em&gt; else in order to satisfy the Product Owner.  Furthermore, you should be able to write a unit or functional test for each acceptance criteria. If you find your test is testing multiple aspects of the system then your acceptance criteria is too large in scope.&lt;/p&gt;
&lt;p&gt;For example: if you&amp;rsquo;ve added a new page to your app one of the acceptance criteria might be &amp;ldquo;Administrative users will see a link to the new page in the upper nav. on all pages&amp;rdquo;  This acceptance criteria would pass regardless of &lt;em&gt;where&lt;/em&gt; the new link appeared in the &amp;ldquo;upper nav.&amp;rdquo; If the Product Owner cares where it appears then the criteria isn&amp;rsquo;t specific enough.  Note that it also specifies what pages it will appear on. Without that you could put it on the &amp;ldquo;wrong&amp;rdquo; page and still pass the criteria.&lt;/p&gt;
&lt;p&gt;In XP (Extreme Programming) they use a 3&amp;quot;x5&amp;quot; index card to create all their user stories. The story (in template form) goes on the front, and the acceptance criteria go on the back. The rule-of-thumb is that if the acceptance criteria don&amp;rsquo;t fit on the back of the card, then the story is almost guaranteed to be too big.&lt;/p&gt;
&lt;h4 id=&#34;story-sizing&#34;&gt;Story Sizing&lt;/h4&gt;
&lt;p&gt;How small is too small? A Story is too small if, by itself, it provides no business value, like this: &amp;ldquo;As an Administrative User I want to have a link to the new page so that I can navigate to it.&amp;rdquo;  Unless someone&amp;rsquo;s already created and deployed the new page, it&amp;rsquo;s a link to nowhere.  The next question, of course is how big is too big? I&amp;rsquo;d say it&amp;rsquo;s too big if it can still be decomposed into multiple smaller pieces of deliverable business value.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://s3.amazonaws.com/mobtvse_masukomi/2014_2_20_user_story_decomposition.png&#34;&gt;&lt;img src=&#34;https://s3.amazonaws.com/mobtvse_masukomi/2014_2_20_user_story_decomposition_med.png&#34; alt=&#34;User Story Decomposition&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;general-tips&#34;&gt;General Tips&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Know your users&lt;/strong&gt;,  before you can write a story about what a user wants, you need to know who your users are. Put together, and commonly agreed upon set of user Personas, and use those persona names when writing the &amp;ldquo;As a&amp;hellip; &amp;quot; portion of your user story. E.g. &amp;ldquo;As an Accounts Manager I want&amp;hellip;&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Focus on the user&lt;/strong&gt;, not the product. Keep your stories focused on the user&amp;rsquo;s goals, and helping them to achieve them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Start big, and decompose&lt;/strong&gt; It&amp;rsquo;s generally much easier to write an &amp;ldquo;Epoch&amp;rdquo; level story (one that comprises many units of business value) and break that down into increasingly smaller stories, than it is to start with fine grained stories.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use index cards&lt;/strong&gt; (to start with at least). The physical limitations of the card really help make it obvious when a story is too large, because you can&amp;rsquo;t fit it, or it&amp;rsquo;s acceptance tests on one side of a card (unless you write in &lt;em&gt;verrry&lt;/em&gt; small print, and that&amp;rsquo;s cheating).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Acceptance tests should be automatable&lt;/strong&gt; If you can&amp;rsquo;t automate the acceptance test, it&amp;rsquo;s probably not a good one. They should be very focused, and very precise.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Finding the Github Pull Request for a topic branch</title>
      <link>https://weblog.masukomi.org/2013/12/24/finding-the-github-pull-request-for-a-topic-branch/</link>
      <pubDate>Tue, 24 Dec 2013 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2013/12/24/finding-the-github-pull-request-for-a-topic-branch/</guid>
      <description>&lt;p&gt;Finding the Github pull request associated with a branch.&lt;/p&gt;
&lt;p&gt;Work on a large enough project, with other people and sooner or later you&amp;rsquo;re going to find some commit, or branch, and want to know what was in the pull request that merged it in.  Maybe you want to see what other commits got merged over at the same time. Maybe you want to see what the diff was at that point in time. But, how do you get from a branch name to a pull-request.&lt;/p&gt;
&lt;p&gt;The key to solving this is knowing that pull requests are actually branches. They&amp;rsquo;re just&amp;hellip; hidden branches. So, first you start tracking them&amp;hellip;&lt;/p&gt;
&lt;p&gt;Locate the section for your github remote in the &lt;code&gt;.git/config&lt;/code&gt; file. It looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[remote &amp;quot;origin&amp;quot;]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = git@github.com:joyent/node.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now add the line &lt;code&gt;fetch = +refs/pull/*/head:refs/remotes/origin/pr/*&lt;/code&gt; to this section. Obviously, change the github url to match your project&amp;rsquo;s URL. It ends up looking like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[remote &amp;quot;origin&amp;quot;]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = git@github.com:joyent/node.git
    fetch = +refs/pull/*/head:refs/remotes/origin/pr/*
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now, after a &lt;code&gt;git fetch origin&lt;/code&gt; you can say &lt;code&gt;git checkout pr/999&lt;/code&gt; to checkout pull request number 999 as a local branch and diff it, or do pretty-much anything else with it.&lt;/p&gt;
&lt;p&gt;Once you&amp;rsquo;ve got that set up, it&amp;rsquo;s just a matter of comparing your local topic branch to the other branches in your system to find other branches that point to whatever branch you&amp;rsquo;re interested in.&lt;/p&gt;
&lt;p&gt;I use a shell script called &lt;code&gt;git-find-twins&lt;/code&gt; which iterates over the known branches (including pull request branches) and finds any whose &lt;a href=&#34;https://www.kernel.org/pub/software/scm/git/docs/gitglossary.html#def_tree-ish&#34;&gt;tree-ish&lt;/a&gt; matches that of the current branch.  You can &lt;a href=&#34;https://github.com/masukomi/masuconfigs/blob/master/bin/find_in_branches&#34;&gt;find the latest source here in Github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[Note: My apologies for the disappearing code on the right side in these examples. Just grab the source from the link above.]&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;#!/bin/sh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# Finds other git branches whose HEADs point to the same &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# treeish as this branch.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# thanks to mockinterface on &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# http://stackoverflow.com/a/20756047/13973&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# for showing how to do this.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Looking for branches pointing to: &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;git rev-parse HEAD&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    git &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;-each-ref --format&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;%(refname)&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;        xargs -I refname   &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;        sh -c &lt;span class=&#34;s1&#34;&gt;&amp;#39;[[ $(git rev-parse HEAD^{tree}) == $(git rev-parse refname^{tree}) ]] &amp;amp;&amp;amp; echo refname&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;DONE&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Add that to your path, and make it executable then check out the branch you want to find the pull request for, and run your new shell script with &lt;code&gt;git find-twins&lt;/code&gt; (note the space) and you&amp;rsquo;ll see output like this.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git find-twins
Looking for branches pointing to: cb3c2dcf606a0a26107131697dd37aef53d44aad
refs/heads/9284_vzw_bug_fixtures_without_fixture_types
refs/remotes/origin/9284_vzw_bug_fixtures_without_fixture_types
refs/remotes/origin/pr/530
DONE
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That last one is what you want. 530 the number of the pull request, which you can put into an URL to see the pull request. Now, you&amp;rsquo;re probably saying &amp;ldquo;Yeah, but what URL?&amp;rdquo; well, one way to get the correct url is to just bring up any other pull request in the current project and change the number in the url. Or you can add this shell script, which I call url_for_pr which generates an url for the pull request number in the current repo. It&amp;rsquo;s based on the assumption that &amp;ldquo;origin&amp;rdquo; is the Github repo. If it isn&amp;rsquo;t you&amp;rsquo;ll need to tweak what remote it gets its info from. You can &lt;a href=&#34;https://github.com/masukomi/masuconfigs/blob/master/bin/url_for_pr&#34;&gt;find the latest source here on Github&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[Note: My apologies for the disappearing code on the right side in this example. Just grab the source from the link above.]&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;#!/bin/sh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# when run from a git repository, and passed the number &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# for a pull request, it will generate an url for &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# where to find it on Github. This assumes that&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# &amp;#34;origin&amp;#34; is pointing to the Github repo.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# This will work with Github Enterprise too.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$#&lt;/span&gt; -eq &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nv&#34;&gt;ROOT_URL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;git config --get remote.origin.url &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;            sed s/.*@// &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;sed s/&lt;span class=&#34;se&#34;&gt;\.&lt;/span&gt;git// &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sed s/&lt;span class=&#34;se&#34;&gt;\:&lt;/span&gt;/&lt;span class=&#34;se&#34;&gt;\\&lt;/span&gt;//&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nv&#34;&gt;PR_NUM&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$ROOT_URL&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/pull/&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Please pass in a Pull Request number&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Note that this should be run within a git repository&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Bonsai Coding</title>
      <link>https://weblog.masukomi.org/2013/12/06/bonsai-coding/</link>
      <pubDate>Fri, 06 Dec 2013 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2013/12/06/bonsai-coding/</guid>
      <description>&lt;p&gt;Writing code is a lot like maintaining a &lt;a href=&#34;http://en.wikipedia.org/wiki/Bonsai&#34;&gt;Bonsai Tree&lt;/a&gt;.
If you stop pruning it it&amp;rsquo;ll stop
being a Bonsai and turn into a bush.  Little tweaks, frequently aesthetic ones,
will help to keep it beautiful and under control.  It will still grow in
unexpected directions, as other developers make changes, but careful pruning
will keep it balanced, and healthy.&lt;/p&gt;
&lt;p&gt;What is &amp;ldquo;careful pruning&amp;rdquo; then?&lt;/p&gt;
&lt;p&gt;Each file is a branch on our tree. The methods, are leaves. We come in to work
and start examining one of the branches. Some days we need to encourage it to
grow a specific way by adding a feature. Some days we make little snips to
correct a bug. But what happens if, upon examining your branch for other
reasons, you discover that it&amp;rsquo;s grown into spirals and knots. You can&amp;rsquo;t reach
your clippers in to snip the leaves you need. You can&amp;rsquo;t do much of anything
without difficulty and frustration, and frankly, it looks like crap. The
unexpected spirals and knots need to go.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This&lt;/em&gt;, however, is the point where you&amp;rsquo;ll hear other developers saying &amp;ldquo;No!
Don&amp;rsquo;t do that!&amp;rdquo; They&amp;rsquo;re upset, because your task wasn&amp;rsquo;t related to the knots and
spirals. You were just there to trim some leaves. If you go and get rid of the
&amp;ldquo;other&amp;rdquo; problems then how will they be able to tell where you trimmed?&lt;/p&gt;
&lt;p&gt;To abandon the metaphor for a minute, they&amp;rsquo;re concerned that the diffs will be
so filled with aesthetic changes that they can&amp;rsquo;t see the changes that were
relevant to the bug fix, or feature add. And, they have a point. Being able to
look back and understand the changes another developer made is a very valuable
tool. But some developers get so obsessed with this idea, or so beaten down by
others who are obsessed with it that they say things like this,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;The rule for controlled development is that if the line is not relevant to the
fix, you do not modify it. If we want to go through and fix all the lines in
our product that are over 80 characters, then we log a bug for it.&amp;rdquo; - A rule
you shouldn&amp;rsquo;t follow&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This solution will never leave us with a beautiful tree. I don&amp;rsquo;t know of any
professional developer who has the time to deal with tickets that are that low
priority, and no-one &lt;em&gt;wants&lt;/em&gt; to anyway.&lt;/p&gt;
&lt;p&gt;If you accept that there is value in making the line / file readable, then you
must also accept that there will be change unrelated to any bug fix or feature
request. You must also accept, that if those changes get put off for &amp;ldquo;later&amp;rdquo; our
tree will become a bush, and require so much work that it will be almost
unrecognizable the day after the change.&lt;/p&gt;
&lt;p&gt;So, how do we balance these two concerns? How do we make readability changes to
our code without obscuring the functional changes? My recommendations are as
follows.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It should be acceptable for whatever method you&amp;rsquo;re directly trying to enhance
or fix to be refactored for readability. Even if you&amp;rsquo;re refactoring a 20 line
method, for a one line fix. To do otherwise is like having a child make their
bed but leave their clothes and toys strewn about the floor. Don&amp;rsquo;t do a
half-assed job. Leave the method better than you found it.&lt;/li&gt;
&lt;li&gt;Separate other aesthetic changes out into separate commits. It would be nicer
if you could commit the fix, then commit the aesthetic changes, but we
frequently need to make the aesthetic changes in order to make the code readable
enough to understand it. So, make it readable, but leave it broken. Commit that
change. Then fix it and commit that change.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The downside to 2 is that you have to instruct reviewers to review specific
commits, rather than the changeset as a whole. So, an alternative is to make the
aesthetic changes, create a pull request  / request review of your branch to be
merged, and then, once that&amp;rsquo;s done create another pull request for the bug fix.
I think it&amp;rsquo;s a judgement call, and the appropriate choice depends on the
situation.&lt;/p&gt;
&lt;p&gt;As per usual, if you&amp;rsquo;ve decent test coverage everything becomes much easier.
Code reviewing the aesthetic commits can be just a matter of seeing if the tests
pass, and giving it a quick glance to make sure the other developer didn&amp;rsquo;t go
all crazy-pants with their changes, like changing the indentation style to
something no-other files use. You don&amp;rsquo;t have to stop and consider the funcional
impact of the changes, because there shouldn&amp;rsquo;t be any. &amp;ldquo;Yup, still compiles,
still passes the tests, looks more readable. Approved!&amp;rdquo;&lt;/p&gt;
&lt;h2 id=&#34;summary-codebases-are-like-bonsai-trees-regular-aesthetic-changes-are-as&#34;&gt;Summary Codebases are like Bonsai Trees. Regular aesthetic changes are as&lt;/h2&gt;
&lt;p&gt;important a part of keeping your codebase healthy as regular refactorings. Some
trivial changes to how you commit your work can elimanate the diffing problems
that arise when combining fixes / features with aesthetic changes.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The Daily Team Tracker Worksheet</title>
      <link>https://weblog.masukomi.org/2013/08/22/the-daily-team-tracker-worksheet/</link>
      <pubDate>Thu, 22 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2013/08/22/the-daily-team-tracker-worksheet/</guid>
      <description>&lt;p&gt;The &lt;a href=&#34;http://en.wikipedia.org/wiki/Stand-up_meeting&#34;&gt;Daily Standup Meeting&lt;/a&gt; is a core aspect of Agile development. The simplified idea is that you want to start the day with a very quick status check of what everyone&amp;rsquo;s working on, and helps &amp;ldquo;&amp;hellip;to coordinate efforts to resolve difficult and/or time-consuming issues&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;But, how do you keep track of the things your minions are working on &lt;em&gt;today&lt;/em&gt; and deal with your own tasks, and 400 daily interruptions?  For me the answer was to put together the Daily Team Tracker Worksheet.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://s3.amazonaws.com/mobtvse_masukomi/2013_8_22_daily_team_tracker_med.jpg&#34; alt=&#34;Daily Team Tracker&#34;&gt;&lt;/p&gt;
&lt;p&gt;The idea is simple. Each morning, as you go through your Daily Standup write down what each person will be working on &lt;em&gt;today&lt;/em&gt;. If they expect to complete the task today there&amp;rsquo;s a little checkbox to indicate that. There is, of course, another to indicate it&amp;rsquo;s done, a notes section, a place for emergent tasks, and more.&lt;/p&gt;
&lt;p&gt;When 3pm comes around and I&amp;rsquo;m wondering, &amp;ldquo;What was Charles working on? Was he expecting to finish that today? Should I be checking in or leaving  him alone?&amp;rdquo; I can check my sheet and see.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s also good to have prior days sheets because you can easily see that at task that was supposed to be done &amp;ldquo;today&amp;rdquo; has been on someone&amp;rsquo;s plate for three days now, enabling you say &amp;ldquo;Wait, weren&amp;rsquo;t you expecting to finish that two days ago? What&amp;rsquo;s gone awry? Is there anything I can do to help, or any lesson we can take from that?&amp;rdquo; (It&amp;rsquo;s all about the Kaizen baby). Some of that will, of course, be covered in your stand-up, but sometimes it&amp;rsquo;s good to have that reminder.&lt;/p&gt;
&lt;p&gt;There are two versions of this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://s3.amazonaws.com/mobtvse_masukomi/2013_8_22_daily_team_tracker.pdf&#34;&gt;Daily Team Tracker PDF&lt;/a&gt; (for teams of over 3 people).
&lt;ul&gt;
&lt;li&gt;Page 1 is a the 3 person view with section for notes and diagramming.&lt;/li&gt;
&lt;li&gt;Page 2 has sections for 5 more folks with a mini notes / diagram section&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://s3.amazonaws.com/mobtvse_masukomi/2013_8_22_daily_team_tracker_2_sided.pdf&#34;&gt;Daily Team Tracker PDF 2 Sided&lt;/a&gt; (for teams of 3 or less)
&lt;ul&gt;
&lt;li&gt;Page 1 and 2 are the same 3 person view so that you can print it on both sides of a piece of paper and save some trees.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://s3.amazonaws.com/mobtvse_masukomi/2013_8_23_daily_team_tracker_v1.graffle&#34;&gt;Daily Team Tracker OmniGraffle file&lt;/a&gt; If anyone out there has OmniGraffle and feels like tweaking the original.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This file is (cc) 2013 K Rhodes ( masukomi.org ) and distributed under the Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>[Review] CruxSKUNK iPad keyboard / case</title>
      <link>https://weblog.masukomi.org/2013/06/01/review-cruxskunk-ipad-keyboard-slash-case/</link>
      <pubDate>Sat, 01 Jun 2013 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2013/06/01/review-cruxskunk-ipad-keyboard-slash-case/</guid>
      <description>&lt;h3 id=&#34;the-backstory&#34;&gt;The backstory&lt;/h3&gt;
&lt;p&gt;Once upon a time there was &lt;a href=&#34;http://www.kickstarter.com/projects/spywire/cruxskunktm-powerful-ipad-laptop&#34;&gt;a Kickstarter&lt;/a&gt; to make the world&amp;rsquo;s most awesome keyboard / case &amp;hellip; thing to &amp;ldquo;Turn your iPad® into a laptop&amp;rdquo;.  As with most hardware projects on Kickstarter the expected delivery date came and went, and came and went again, but I feel the folks at Crux did a great job of keeping the backers informed, and the reasons it got set back almost always boiled down to them not being willing to accept half-assed Chinese manufacturing even if it would have gotten it into our hands sooner.&lt;/p&gt;
&lt;p&gt;They really wanted to make the best product they could. They went so far with this that they actually &lt;em&gt;lost&lt;/em&gt; money on each one that was made, and these are guys aren&amp;rsquo;t new to manufacturing hardware. They&amp;rsquo;ve had similar products built in China before. When it comes to something like this, I&amp;rsquo;m ok with having to wait a bit longer to get a better product.&lt;/p&gt;
&lt;p&gt;So, did they deliver?&lt;/p&gt;
&lt;h3 id=&#34;first-impressions&#34;&gt;First impressions&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;https://s3.amazonaws.com/mobtvse_masukomi/2013_5_31_image_med.jpg&#34; alt=&#34;CruxSKUNK Triptic&#34;&gt;&lt;/p&gt;
&lt;p&gt;The first thing you notice is the weight. This is &lt;em&gt;not&lt;/em&gt; a flimsy POS product. They promised a CNC milled block of aluminum with a quality level that was right on par with the Macbook, and they came pretty close. Is it as beautiful as a Macbook Air? No, but we knew that going in. This is essentially a really fancy picture frame for your iPad with an attached keyboard. They &lt;em&gt;could&lt;/em&gt; have put a sheet of aluminum behind the iPad&amp;rsquo;s back, but it would have made the whole thing thicker and heavier. The reason I have to say &amp;ldquo;pretty close&amp;rdquo; is that Apple&amp;rsquo;s manufacturing standards are very, very high and the tolerances aren&amp;rsquo;t just good, they&amp;rsquo;re &lt;em&gt;precise&lt;/em&gt;. So, for Crux, or anyone else, to get &amp;ldquo;pretty close&amp;rdquo;, is pretty damn good.&lt;/p&gt;
&lt;p&gt;The case it comes with is actual leather, &lt;em&gt;with&lt;/em&gt; a layer of padding and a fuzzy fake fur lining to keep your baby safe. Will I use it? Probably not. Is it nice? Yes.&lt;/p&gt;
&lt;h4 id=&#34;setup&#34;&gt;Setup&lt;/h4&gt;
&lt;p&gt;Inserting the iPad was pretty simple. By default the little hinges that hold it in at the bottom are configured for an iPad 2 I suspect. The iPad 3 and 4 are a bit thicker, so I had to grab the included alan wrench and loosen them up (as instructed by the user manual) so that they would fit over my iPad 3. I also managed to put the iPad in backwards which obscured all the ports, but as soon as my foolishness was pointed out I just opened the hinges, flipped it around, and voillá the cutouts for the the ports and button lined up perfectly, but the space around the  ports is only barely adequate. The headphone jack works fine with the Apple headphones, but anything with a thicker plastic portion won&amp;rsquo;t fit. The main 30 pin port is only enough for the power adapter. I have to press the iPad &amp;ldquo;into&amp;rdquo; the case and / or pull down on the edge of the case to make enough room for my connector cable to fit. The adapters for the &lt;a href=&#34;http://store.apple.com/us/product/MC531ZM/A/apple-ipad-camera-connection-kit&#34;&gt;Apple Camera Connection Kit&lt;/a&gt; don&amp;rsquo;t fit at all. I have to take the iPad out of the Crux Skunk to use them. Not a huge deal, as I don&amp;rsquo;t use them that often, but I suspect I&amp;rsquo;ll be using them much more frequently on the road and it&amp;rsquo;ll be annoying then. The HDMI adapter does fit either, so you cross this right off your list if you&amp;rsquo;re hoping to use it for presentations because even with pressing you can&amp;rsquo;t make it fit while in the case. I can&amp;rsquo;t comment on how accessible the Lightning port on the iPad 4 would be.&lt;/p&gt;
&lt;p&gt;My first thought upon seeing my iPad in it&amp;rsquo;s new &amp;ldquo;laptop&amp;rdquo; incarnation? &amp;ldquo;It&amp;rsquo;s so wee!&amp;rdquo; Visually it&amp;rsquo;s pretty good. The keyboard comes up through an aluminum plate, which is fine, but I&amp;rsquo;m not thrilled with visuals the seam that follows around its edge meets up with the base. Apple chose put the flat plate on the bottom of the Macbook so that you&amp;rsquo;re not seeing it every time you use your laptop. I think this would have been a better choice for Crux, even if it did necessitate the use of screws, which Crux has managed to avoid. Also, the tolerances along that seam are good, but not Apple good.  You can see it in the top right photo. I just can&amp;rsquo;t help but think &amp;ldquo;Oh look, there&amp;rsquo;s a metal plate that&amp;rsquo;s been snapped to the base&amp;rdquo;, every time I look down at it, and I don&amp;rsquo;t want to think that. I don&amp;rsquo;t want to be aware of that at any level. It should be hidden from me.&lt;/p&gt;
&lt;h4 id=&#34;pairing&#34;&gt;Pairing&lt;/h4&gt;
&lt;p&gt;Pairing it was pretty straightforward, except that I pushed the &amp;ldquo;LED window&amp;rdquo; instead of the &amp;ldquo;Sync button&amp;rdquo; because the &amp;ldquo;LED window has the light that they were talking about seeing. Doing so felt wrong, but it still moved significantly as if it was a badly done button. But no, it&amp;rsquo;s a thing that looks like a button but really isn&amp;rsquo;t, and moves in a disconcerting way when pushed by someone who&amp;rsquo;s not paying close enough attention. Fortunately, I should never have to push the &amp;ldquo;Sync button&amp;rdquo; again, and it should be noted that if I&amp;rsquo;d read the instructions more carefully I wouldn&amp;rsquo;t have pushed it in the first place.&lt;/p&gt;
&lt;h4 id=&#34;keyboard&#34;&gt;Keyboard&lt;/h4&gt;
&lt;p&gt;The keyboard itself feels&amp;hellip; well it feels pretty good. The keys on a Macbook Pro have a softer feel at the terminus of your stroke. These have a little bit more of a &amp;ldquo;whack&amp;rdquo; at that point. Is it bad? No. It&amp;rsquo;s just different. You might start to feel it after an hour or more of typing. As for the layout, my fingers don&amp;rsquo;t feel even remotely cramped like they do on a typical netbook, but the key layout &lt;em&gt;is&lt;/em&gt; smaller than that on the Apple Wireless Keyboard.&lt;/p&gt;
&lt;p&gt;The CruxSKUNK comes with a variety of useful specialty keys: home, search, slideshow, languages, screen toggle, copy, paste, a lock button, plus music and volume controls. Some work, some don&amp;rsquo;t. I don&amp;rsquo;t know if this is a bug in Crux&amp;rsquo;s bluetooth software or just functionality that&amp;rsquo;s not supported by my older iPad 3. The ones that &lt;em&gt;don&amp;rsquo;t&lt;/em&gt; work are: language, copy, and paste. I was really hoping those copy paste buttons worked. Alas, &amp;ldquo;comnd+c&amp;rdquo; and &amp;ldquo;comnd+v&amp;rdquo; (not a typo) do not copy / paste either. But, You can use shift+arrow keys to select text like with any other keyboard, and that&amp;rsquo;s a hell of a lot better than the touch based text selection tools.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve typed about about 1,500 words on the thing so far, and I&amp;rsquo;m enjoying it. I&amp;rsquo;ve always been painfully slow typing on iOS devices. Now, I can touch-type full speed (~100 wpm) without issue. Geeks like me will be happy to know there&amp;rsquo;s a way to convince your iPad to use a Dvorak layout with bluetooth keyboards like this one. So all 4 of you can rejoice. Yay.&lt;/p&gt;
&lt;h4 id=&#34;the-lid--hinge&#34;&gt;The lid / hinge&lt;/h4&gt;
&lt;p&gt;Closing and opening the lid sleeps and wakes the iPads screen respectively, as you&amp;rsquo;d hope. The hinge is designed such that you can keep opening until the back of the iPad is  directly against the bottom of the case. They call this &amp;ldquo;Movie Mode.&amp;rdquo; I guess the idea is that you could flip it over into an A-frame and set it on something. Nifty. Will I use it? Possibly. Only time, and travel, will tell. I doubt I&amp;rsquo;d use it in day-to-day life.&lt;/p&gt;
&lt;p&gt;Speaking of the hinge. There were a couple revisions in the hinge during production and I think they&amp;rsquo;ve absolutely paid off. It feels solid, and reassuring. The iPad&amp;rsquo;s weight is not going to gradually pull it open. On the downside, the hinge is so strong that you can&amp;rsquo;t actually close the &amp;ldquo;lid&amp;rdquo; all the way, or more accurately, you can close it all the way but the hinge opens it back up about an eighth of an inch as soon as you let go (see the photo above), which looks a bit crap if you ask me. It makes me wonder if that&amp;rsquo;s one of the reasons they included a case.&lt;/p&gt;
&lt;h3 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;I recognize that, having just received it, and only typed a thousand or so words on it, it&amp;rsquo;s still pretty early to make any claims about it&amp;rsquo;s long term value, but I think that this is just the beginning of a &lt;em&gt;radical&lt;/em&gt; transformation in how I interact with my iPad. Previously, typing on the thing was so frustrating that I wouldn&amp;rsquo;t even respond to tweets. I&amp;rsquo;d switch over to the laptop. Now, I&amp;rsquo;m typing 1,500 word articles on it.&lt;/p&gt;
&lt;p&gt;But, it does what it claims and turns your iPad into a laptop, which is absolutely &lt;em&gt;not&lt;/em&gt; what some people want. The iPad is a spectacular tablet, so you definitely sacrifice something when making it into a laptop, and while the wee hinges that hold in the iPad are easy to open or close, it&amp;rsquo;s not really the kind of thing that you&amp;rsquo;ll be wanting to pop your iPad in and out of constantly.&lt;/p&gt;
&lt;p&gt;Is it better than just using an Apple Wireless Keyboard? That depends on who you ask. I think the Apple Wireless Keyboard is great, but using it with an iPad is crap unless you&amp;rsquo;re sitting at a table or desk. With the CruxSKUNK I can type on my iPad with it in my lap, at a desk, or anywhere else.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;postscript&#34;&gt;Postscript&lt;/h3&gt;
&lt;p&gt;For those curious, yes, this post was created entirely on the iPad using &lt;a href=&#34;http://getwritingkit.com/&#34;&gt;Writing Kit&lt;/a&gt;, and &lt;a href=&#34;http://getwritingkit.com/&#34;&gt;Diptic&lt;/a&gt;, and typed on my CruxSKUNK. If you like Markdown, and you need to lookup information (and URLs) on the web whilst writing things, I &lt;em&gt;highly&lt;/em&gt; recommend Writing Kit.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The Thing About Today</title>
      <link>https://weblog.masukomi.org/2013/04/16/the-thing-about-today/</link>
      <pubDate>Tue, 16 Apr 2013 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2013/04/16/the-thing-about-today/</guid>
      <description>&lt;p&gt;The thing about today is that &lt;em&gt;we&lt;/em&gt; have the power.&lt;/p&gt;
&lt;p&gt;We, can destroy this fear.&lt;/p&gt;
&lt;p&gt;Not by being stoic. Not by being &amp;ldquo;strong&amp;rdquo;. By smiling. By being human. By being the neighbors we wish we were surrounded by.&lt;/p&gt;
&lt;p&gt;Go outside.&lt;br&gt;
Smile at a stranger.&lt;br&gt;
Ask someone how they&amp;rsquo;re doing and mean it.&lt;br&gt;
Listen.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.google.com/search?q=boston+marathon+bombing&amp;amp;aq=f&amp;amp;oq=boston+marathon+bombing&amp;amp;aqs=chrome.0.57j60l3j59l2.2993j0&amp;amp;sourceid=chrome&amp;amp;ie=UTF-8&#34;&gt;Yesterday&amp;rsquo;s act&lt;/a&gt; was horrific, but I will light up this mother fucking town with smiles, because we are alive, and this world is filled with brilliant people with warm hearts, and their own 200 watt smiles, just waiting to shine.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Git push is not what you think</title>
      <link>https://weblog.masukomi.org/2013/03/13/git-push-is-not-what-you-think/</link>
      <pubDate>Wed, 13 Mar 2013 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2013/03/13/git-push-is-not-what-you-think/</guid>
      <description>&lt;h2 id=&#34;tldr&#34;&gt;&lt;a href=&#34;https://www.google.com/search?q=define+tldr&amp;amp;aq=f&amp;amp;oq=define+tldr&amp;amp;aqs=chrome.0.57j0l2j62.1565&amp;amp;sourceid=chrome&amp;amp;ie=UTF-8&#34;&gt;tldr;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;git&amp;rsquo;s default configuration with regards to &lt;code&gt;push&lt;/code&gt; is potentially very dangerous.&lt;/li&gt;
&lt;li&gt;make sure you&amp;rsquo;ve run &lt;code&gt;git config --global push.default current&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;There are other options for push.default but make sure you read the docs before setting them.&lt;/li&gt;
&lt;li&gt;setting &lt;code&gt;current&lt;/code&gt; as your default behavior means no more complaints about setting upstream when pushing.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;perception-vs-reality-vis-à-vis-git-push&#34;&gt;Perception vs. Reality vis-à-vis git push&lt;/h2&gt;
&lt;p&gt;When it comes to &lt;code&gt;git push&lt;/code&gt; most people think &amp;ldquo;It pushes my current branch&amp;rsquo;s updates up to the remote server&amp;rdquo; but that&amp;rsquo;s only a small part of what&amp;rsquo;s happening, and ignorance about the rest can leave you with very upset coworkers. I know, because that&amp;rsquo;s exactly what happened to me today when I ran &lt;code&gt;git push -f&lt;/code&gt; on a coworker&amp;rsquo;s computer that happened to have the default configuration.&lt;/p&gt;
&lt;p&gt;I mistakenly believed that &amp;ldquo;Hey, &lt;code&gt;git push&lt;/code&gt; just pushes the current branch up, so &lt;code&gt;git push -f&lt;/code&gt; will just force push this current branch up. I &lt;em&gt;want&lt;/em&gt; to wipe out history on this topic branch, so no worries.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git push&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Updates remote refs using local refs, while sending objects necessary to complete the given refs.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Note that nothing in that statement is singular: ref&lt;strong&gt;s&lt;/strong&gt;&amp;hellip; plural.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;push&lt;/code&gt; (in its default configuration) is effectively the opposite of &lt;code&gt;fetch&lt;/code&gt;. Fetch pulls down all the changes from branches you&amp;rsquo;re tracking. &lt;code&gt;push&lt;/code&gt; uploads all your changes to branches you&amp;rsquo;re tracking. Now, normally this won&amp;rsquo;t get you in trouble. The branches you&amp;rsquo;re not currently working are either: older  (or current) versions of what&amp;rsquo;s on the remote repo (in which case nothing happens), or incompatible versions of what&amp;rsquo;s up there (in which case they get rejected), or possible new commits that can safely be updated. The latter case can be annoying, but it&amp;rsquo;s rarely that bad, and can be easily backed out.&lt;/p&gt;
&lt;p&gt;The problem is when you add &lt;code&gt;-f&lt;/code&gt;	 to push in a default configuration and don&amp;rsquo;t specify what repo and branch you&amp;rsquo;re pushing to. This essentially says &amp;ldquo;Hey remote repo. &lt;em&gt;All&lt;/em&gt; these branches I&amp;rsquo;m tracking? Yeah, make yours match. No. I don&amp;rsquo;t care that I&amp;rsquo;m blowing away work. You can take those rejections and shove them where the sun don&amp;rsquo;t shine.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The more remote branches you&amp;rsquo;re tracking, the more damage it can do. And, you&amp;rsquo;re probably tracking master, which is usually the most important branch in any repo, which means there&amp;rsquo;s a good chance you&amp;rsquo;ll be doing some notable damage.&lt;/p&gt;
&lt;p&gt;But, if you change your default configuration by running &lt;code&gt;git config --global push.default current&lt;/code&gt; then the default behavior stops being &amp;ldquo;everything I can find a matching name for&amp;rdquo; and starts being &amp;ldquo;the current branch&amp;rdquo; which is what everyone generally assumes is happening anyway. People don&amp;rsquo;t want, or expect this &amp;ldquo;reverse fetch&amp;rdquo; behavior. They expect something akin to &amp;ldquo;my branch will go up&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Making this change to push&amp;rsquo;s default behavior also means that when you do do &lt;code&gt;git push&lt;/code&gt; on a brand new branch it won&amp;rsquo;t complain about you not having set upstream. Instead it will just create a new remote branch for you that matches the current (new) branch.&lt;/p&gt;
&lt;h2 id=&#34;what-to-do-when-youve-run-push--f&#34;&gt;What to do when you&amp;rsquo;ve run push -f&lt;/h2&gt;
&lt;p&gt;In the default configuration?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;pray&lt;/li&gt;
&lt;li&gt;apologize profusely to everyone who&amp;rsquo;s working on your repo.&lt;/li&gt;
&lt;li&gt;ask very nicely if every could please do a push to all the branches they&amp;rsquo;re tracking.&lt;/li&gt;
&lt;li&gt;thank the deit(y/ies) that someone came up with a distributed version control system where everyone&amp;rsquo;s got a legitimate copy of the repo.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The only circumstance under which 3 will fail to recover the data is if you did the most recent work that was pushed to a remote branch, then reset or rebased your local copy of it to some prior state, then force pushed before anyone else had a chance to download your changes. Alternately, everyone hates you and refuses to push their copy in order to force you to recreate all the work you blew away. If that&amp;rsquo;s the case you should probably go look for another team.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Setting the Atomic Clock</title>
      <link>https://weblog.masukomi.org/2013/02/21/setting-the-atomic-clock/</link>
      <pubDate>Thu, 21 Feb 2013 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2013/02/21/setting-the-atomic-clock/</guid>
      <description>&lt;p&gt;This morning&amp;rsquo;s shower brought me an interesting series of thoughts that I thought you might appreciate, and it all started with the simple question of &amp;ldquo;How do you set The Atomic Clock?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;My first thought was that at some point you have to find some other clock and precisely sync up with it. Then again, they may have said &amp;ldquo;fuck it&amp;rdquo; and just had Bob press a button when some other clock flipped over, but then I wondered &amp;ldquo;How do we know what time it is in the first place?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Well, our calendar is based on the birth of Jesus, and we claim we know what day that was, and what town that was in. I&amp;rsquo;m ignoring that the details in the Bible point to a date that&amp;rsquo;s nowhere near Dec. 25th. Anyway&amp;hellip; The first moment of the first day would, I suspect, be associated with the moment at which dawn broke in Jerusalem that morning. Or maybe some more esoteric moment that day. Regardless, let&amp;rsquo;s stick with dawn for the sake of attempting to figure out what time it is.&lt;/p&gt;
&lt;p&gt;So, dawn, in Jerusalem, on day 1. Great we can work forwards from there. But, wait&amp;hellip; how do we know how long a year is?&lt;/p&gt;
&lt;p&gt;A year is the time it takes for the Earth to travel around the Sun, but how do we know when we are at the same place in the rotation we were exactly one year ago? You could try and position yourself relative to other heavenly bodies &amp;ldquo;When star X is directly behind the Sun.&amp;rdquo;  But our orbit&amp;rsquo;s not circular, it&amp;rsquo;s elliptical. Actually, that&amp;rsquo;s not true either &amp;ldquo;&lt;a href=&#34;http://www.dnr.mo.gov/energy/cc/cc7.htm&#34;&gt;The Earth travels around the sun in an elliptical orbit that varies in shape, with time from nearly circular to distinctly elliptical.&lt;/a&gt;&amp;rdquo;  Then there&amp;rsquo;s the fact that every galaxy in the universe is shooting out away from the center of it.&lt;/p&gt;
&lt;p&gt;If you ignore the orbital complication and say &amp;ldquo;ok, we can compensate for orbital weirdness&amp;rdquo;, how do you verify it with observation? Well you&amp;rsquo;d look up on&amp;hellip; wait a minute. How the fuck do know where the same up is? In order to calculate our point in the Earths solar orbit we have to first be able to look up at the same point on different days.  Which means we have to calculate exactly how long a day is, but &amp;ldquo;&lt;a href=&#34;http://www.dnr.mo.gov/energy/cc/cc7.htm&#34;&gt;The tilt of the earth changes cyclically between 21 3/4 degrees and 24 1/4 degrees. The period of cyclicity is 42,000 years.&lt;/a&gt;&amp;rdquo;. On top of that we&amp;rsquo;re going around the sun.&lt;/p&gt;
&lt;p&gt;So, even if the Earth wasn&amp;rsquo;t wobbling, and even if I knew exactly how long it took to spin 360° when I looked up the sun would be in a different place because we&amp;rsquo;ve moved around it. The stars would be in a different place because we&amp;rsquo;ve moved around the sun, and even if we hadn&amp;rsquo;t done that, the contents of the universe is still shifting outwards.&lt;/p&gt;
&lt;p&gt;Back to figuring out how long a day is. So, we look up. We find something in the universe that we&amp;rsquo;re &lt;em&gt;not&lt;/em&gt; rotating around to mark as a point of reference. We can compensate for the universe&amp;rsquo;s expansion by observing its &lt;a href=&#34;http://en.wikipedia.org/wiki/Redshift&#34;&gt;Redshift&lt;/a&gt; (i think). So, we look up but once 23 hours have passed and we&amp;rsquo;re ready to start looking straight up again to observe the exact instant we&amp;rsquo;re lined up with that distant star (or whatever) the planet has wobbled on its own axis and now &amp;ldquo;up&amp;rdquo; will be pointed in a different direction than it was exactly one day ago. So, now we have to calculate the the wobble of the planet&amp;hellip;&lt;/p&gt;
&lt;p&gt;At that point I needed to get out of the shower. But I do know that the wobble&amp;rsquo;s going to be affected by the fact that we&amp;rsquo;re on a large ball of rock that&amp;rsquo;s got a molten core, which means liquid sloshing around in the center (for some definition of &amp;ldquo;sloshing&amp;rdquo;). I&amp;rsquo;ve no clue how one would determine that we even have a liquid center. Maybe by the fact that we&amp;rsquo;re wobbling?&lt;/p&gt;
&lt;p&gt;To summarize:&lt;/p&gt;
&lt;p&gt;In order to calculate the correct time you must:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Figure out the speed at which the universe is expanding so that we can use a distant star as a reference point to observationally confirm all the other things we need to figure out.&lt;/li&gt;
&lt;li&gt;Figure out the Earth&amp;rsquo;s eccentric wobble. No clue how to do that. My shower ended. Once you&amp;rsquo;ve got that you can then figure out how long a day is.&lt;/li&gt;
&lt;li&gt;Now store away what you&amp;rsquo;ve learned about our wobbling rock with a liquid center. We&amp;rsquo;ll need that.&lt;/li&gt;
&lt;li&gt;Once you know how long a day is, and what direction you&amp;rsquo;re pointing after a given span of time, you can then start observing our orbit by marking the location of the sun relative to you and some distant star. So, now you can figure out how long it takes you to get around the sun. Unfortunately that&amp;rsquo;s going to change every single year as our orbital path changes.&lt;/li&gt;
&lt;li&gt;So observe &lt;em&gt;those&lt;/em&gt; changes for enough years to calculate how our orbit changes. Then factor in the effects of a wobbling mass on an orbit.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once you&amp;rsquo;ve done all that you can &lt;em&gt;then&lt;/em&gt; work backwards to calculate out where the hell the sun was over Jerusalem on December 25th 2013 years ago, and &lt;em&gt;then&lt;/em&gt; you can work forwards to figure out what time it is.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;re still going to have the problem of actually syncing the clock with the math though.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;P.S. How was &lt;em&gt;your&lt;/em&gt; shower?&lt;br&gt;
P.P.S. Those links? Missouri Department of Natural Resources, Division of Energy. &amp;ldquo;&lt;a href=&#34;http://www.dnr.mo.gov/energy/cc/cc7.htm&#34;&gt;Global Climate Change: Effect of the Earth&amp;rsquo;s Orbit&lt;/a&gt;&amp;rdquo;&lt;br&gt;
P.P.P.S. I&amp;rsquo;m not a Physicist. I just play one on the Internet.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Some useful Vim plugins</title>
      <link>https://weblog.masukomi.org/2013/02/20/some-useful-vim-plugins/</link>
      <pubDate>Wed, 20 Feb 2013 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2013/02/20/some-useful-vim-plugins/</guid>
      <description>&lt;p&gt;There are two things that make using vim awesome&amp;hellip; no there are about 200,000 &lt;em&gt;but&lt;/em&gt; most of them involve adding a few lines to your &lt;code&gt;.vimrc&lt;/code&gt; to enable them, or installing a plugin. My &lt;code&gt;.vimrc&lt;/code&gt; is just over 300 lines after all these years of use and customization. But, rather than go into all that, I figured some of the vim geeks out there might appreciate a pointer to some of the plugins I use. I&amp;rsquo;d also be happy to hear suggestions any alternatives to the ones I &lt;em&gt;am&lt;/em&gt; running.&lt;/p&gt;
&lt;p&gt;I should note that some of these rely on the use of ctags which seems to be a dying art these days. So many people are unaware of the awesomeness contained therein. If you don&amp;rsquo;t know about ctags, &lt;a href=&#34;http://andrewradev.com/2011/06/08/vim-and-ctags/&#34;&gt;go read this&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;vim-plugins-i-use&#34;&gt;Vim Plugins I use&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://www.vim.org/scripts/script.php?script_id=1879&#34;&gt;AutoComplPop&lt;/a&gt; (acp) Autocomplete popup. It&amp;rsquo;s a little too aggressive. I need to find something that&amp;rsquo;s mare accepting of me not wanting what it&amp;rsquo;s offering.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.vim.org/scripts/script.php?script_id=1343&#34;&gt;AutoTag&lt;/a&gt;  Automatically reruns ctags on a source file when you save it.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/cespare/vim-bclose&#34;&gt;bclose&lt;/a&gt; Deletes a buffer without closing the window.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.vim.org/scripts/script.php?script_id=42&#34;&gt;bufexplorer&lt;/a&gt; allows you to quickly and easily switch between buffers&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.vim.org/scripts/script.php?script_id=1984&#34;&gt;FuzzyFinder&lt;/a&gt; (fuf) allows you to search for a file by name or via ctags&amp;hellip; has a tendency to totally hang vim far too often.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/nathanaelkane/vim-indent-guides&#34;&gt;indent_guides&lt;/a&gt; visually displays indent levels in code. I don&amp;rsquo;t use it much, but it&amp;rsquo;s nice to have sometimes.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/Lokaltog/vim-powerline&#34;&gt;powerline&lt;/a&gt; makes the vim statusline awesome. For extra awesome install the modded font.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/tpope/vim-rails&#34;&gt;rails&lt;/a&gt; I have never used this, although I probably should.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/tpope/vim-fugitive&#34;&gt;Fugitive&lt;/a&gt; Install this, if for no other reason than to have awesome Git Blame integration&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://vim-taglist.sourceforge.net/&#34;&gt;taglist&lt;/a&gt; I never use this but really ought to. There&amp;rsquo;s &lt;a href=&#34;http://vimeo.com/4069219&#34;&gt;a video on it here&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/airblade/vim-gitgutter&#34;&gt;gitgutter&lt;/a&gt; Puts a little indication of what lines have been added, modified, or deleted in the left hand gutter. Read the FAQ after install if gutter section for non-modified lines looks ugly.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;plugins-ive-installed-but-should-probably-get-rid-of&#34;&gt;Plugins I&amp;rsquo;ve installed but should probably get rid of&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://www.vim.org/scripts/script.php?script_id=664&#34;&gt;scratch&lt;/a&gt; I&amp;rsquo;ve never used this.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.vim.org/scripts/script.php?script_id=90&#34;&gt;vcscommand&lt;/a&gt; for interacting with version control systems. I should probably kill this as there are better ones that are git specific like&amp;hellip;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.vim.org/scripts/script.php?script_id=3574&#34;&gt;gitv&lt;/a&gt; gitk for vim&amp;hellip; I can&amp;rsquo;t remember using this and I&amp;rsquo;ve got &lt;a href=&#34;http://kaleidoscopeapp.com&#34;&gt;Kaleidoscope&lt;/a&gt; and &lt;a href=&#34;http://www.sourcetreeapp.com/&#34;&gt;SourceTree&lt;/a&gt; which are awesome so I don&amp;rsquo;t really need it.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.vim.org/scripts/script.php?script_id=3252&#34;&gt;l9&lt;/a&gt; I have no clue why I installed this, and I&amp;rsquo;m somewhat unclear on what it does (documentation sucks).&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Mage Knight Co-Op Rules</title>
      <link>https://weblog.masukomi.org/2013/02/17/mage-knight-co-op-rules/</link>
      <pubDate>Sun, 17 Feb 2013 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2013/02/17/mage-knight-co-op-rules/</guid>
      <description>&lt;p&gt;We love the game &lt;a href=&#34;https://www.amazon.com/dp/B005S8KR6Q/ref=as_li_ss_til?tag=masukomiorg-20&amp;amp;camp=0&amp;amp;creative=0&amp;amp;linkCode=as4&amp;amp;creativeASIN=B005S8KR6Q&amp;amp;adid=1QG597PJXG8FDWK3TQFT&amp;amp;&#34;&gt;Mage Knight&lt;/a&gt;, but the co-op rules are widely regarded as crap. The following rules have been collected  primarily from &lt;a href=&#34;http://boardgamegeek.com/&#34;&gt;Board Game Geek&lt;/a&gt;, an tweaked ever so slightly here, and there, in an effort to make the game cooperative and yet, still balanced.&lt;/p&gt;
&lt;p&gt;This document covers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#assistive_spellcasting&#34;&gt;Assistive Spellcasting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#sharing&#34;&gt;Sharing of fame and loot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#trading&#34;&gt;Trading of cards, crystals, and units&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#card_mods&#34;&gt;Modifications for Interactive cards&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#token_mods&#34;&gt;Modifications for Interactive skill tokens&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name=&#34;assistive_spellcasting&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;assistive-spellcasting&#34;&gt;Assistive Spellcasting&lt;/h2&gt;
&lt;p&gt;Any number of players are able to cast spells on an ally&amp;rsquo;s turn so long as they are within 4 hexes of the ally they wish to help. The spell resolves as if the active player had cast it. The inactive player may use a die from the source in addition to the die used by the active player. If he does, he can&amp;rsquo;t use a die from the source during his next turn.&lt;/p&gt;
&lt;p&gt;To prevent the inactive player from accidentally drawing up, or anyone else using the inactive players spent die before they can re-roll it at the end of their natural turn, leave the spent play card (and spent die) in the play area until the end of their natural turn.&lt;/p&gt;
&lt;p&gt;&lt;a name=&#34;sharing&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;dispersal-of-loot-fame-and-rep&#34;&gt;Dispersal of Loot, Fame, and Rep&lt;/h2&gt;
&lt;p&gt;Inactive players share equally in the fame at the end of the active player&amp;rsquo;s turn. If the total number does not divide evenly the remainder goes to the active player.&lt;/p&gt;
&lt;p&gt;Positive and Negative reputation go to the active player only.&lt;/p&gt;
&lt;p&gt;Any loot (artifacts, spells, etc.) go to the active player, but may (at the active players discretion) be traded via Adjacent Trading or Keep Trading.&lt;/p&gt;
&lt;p&gt;&lt;a name=&#34;trading&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;adjacent-trading&#34;&gt;Adjacent Trading&lt;/h2&gt;
&lt;p&gt;Players are able to trade units, crystals, and/or artifacts. When adjacent to another player, but not in the middle of combat, they may give or take spells, artifacts, and advanced actions. When invading a city, all trades must take place before revealing the city&amp;rsquo;s monsters.&lt;/p&gt;
&lt;p&gt;A player receiving crystals may not exceed the normal three crystals per color limit. Artifacts are traded from one players hand to the other&amp;rsquo;s &lt;em&gt;discard&lt;/em&gt; pile.&lt;/p&gt;
&lt;h3 id=&#34;trading-of-units&#34;&gt;Trading of Units&lt;/h3&gt;
&lt;p&gt;Units may also, be traded but only if the receiver ends their movement on a space adjacent to the giver. Furthermore, the receiver must have greater reputation than the giver. Influence may be used to boost this number, but only during the receiver&amp;rsquo;s turn.&lt;/p&gt;
&lt;p&gt;The idea here is that you have to convince the troops that they&amp;rsquo;ll be better off following you instead of their current leader, and that it&amp;rsquo;s going to take a little time to do so (thus ending movement there). You can not woo troops and continue to move in the same turn.&lt;/p&gt;
&lt;p&gt;Any traded units are placed under the new owner&amp;rsquo;s command token, which may require another unit to be discarded to make space.&lt;/p&gt;
&lt;p&gt;Command tokens may not be traded.&lt;/p&gt;
&lt;h2 id=&#34;keep-trading&#34;&gt;Keep Trading&lt;/h2&gt;
&lt;p&gt;Player are able to trade units, crystals, and/or artifacts at keeps. A player who ends his movement on a keep may throw away a unit, crystal, and/or artifact from his hand. Another player may end his turn on any keep and take the cards or items.&lt;/p&gt;
&lt;p&gt;Any acquired units are placed under the new owner&amp;rsquo;s command token, which may require another unit to be discarded to make space. A player receiving crystals may not exceed the normal three crystals per color limit. Artifacts are placed in the receiving player&amp;rsquo;s &lt;em&gt;discard&lt;/em&gt; pile.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a name=&#34;card_mods&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;modifications-for-pvp-cards&#34;&gt;Modifications for PVP Cards&lt;/h2&gt;
&lt;h3 id=&#34;mana-meltdownmana-radiance--mana-growthmana-radiance&#34;&gt;Mana Meltdown/Mana Radiance → Mana Growth/Mana Radiance&lt;/h3&gt;
&lt;h4 id=&#34;mana-growth&#34;&gt;Mana Growth&lt;/h4&gt;
&lt;p&gt;Each other player may choose a crystal in their Inventory and get another crystal of that color. You may gain one crystal any one other play got in this way.&lt;/p&gt;
&lt;h4 id=&#34;mana-radiance&#34;&gt;Mana Radiance&lt;/h4&gt;
&lt;p&gt;When you play this, choose a basic mana color. Gain two crystal of the chosen color to your Inventory. Each player who has no crystal of that color gains one.&lt;/p&gt;
&lt;h3 id=&#34;mana-claim--mana-curse--mana-gain--mana-blessing&#34;&gt;Mana Claim / Mana Curse → Mana Gain / Mana Blessing&lt;/h3&gt;
&lt;h4 id=&#34;mana-gain&#34;&gt;Mana Gain&lt;/h4&gt;
&lt;p&gt;Take a mana die from the Source and set it to any basic color. You gain 3 crystals of that color. Do not re-roll this die when you return it to the Source.&lt;/p&gt;
&lt;h4 id=&#34;mana-blessing&#34;&gt;Mana Blessing&lt;/h4&gt;
&lt;p&gt;Same as the basic effect. In addition, until the end of the Round: Each time another player uses mana of that color from the Source on their turn it doesn&amp;rsquo;t count to the limit of one die per turn you can use from the source.&lt;/p&gt;
&lt;h3 id=&#34;mind-read--mind-steal--mental-recovery--mental-heal&#34;&gt;Mind Read / Mind Steal → Mental Recovery / Mental Heal&lt;/h3&gt;
&lt;h4 id=&#34;mental-recovery&#34;&gt;Mental Recovery&lt;/h4&gt;
&lt;p&gt;Choose a color. Gain a crystal of the chosen color to your Inventory. Each other player may search their discard pile for a basic action card of that color and put it to their hand.&lt;/p&gt;
&lt;h4 id=&#34;mental-heal&#34;&gt;Mental Heal&lt;/h4&gt;
&lt;p&gt;Same as the basic effect. In addition to that , you may search your discard pile for any action card of that color (no Spell) and put it to your hand.&lt;/p&gt;
&lt;h3 id=&#34;energy-flow--energy-steal--energy-gain--energy-boost&#34;&gt;Energy Flow / Energy Steal → Energy Gain / Energy Boost&lt;/h3&gt;
&lt;h4 id=&#34;energy-gain&#34;&gt;Energy Gain&lt;/h4&gt;
&lt;p&gt;Ready a Unit. If you do, you must ready one Unit of level II or less in each other player&amp;rsquo;s Unit area.&lt;/p&gt;
&lt;h4 id=&#34;energy-boost&#34;&gt;Energy Boost&lt;/h4&gt;
&lt;p&gt;Ready a Unit. If you do, that Unit also gets Healed, and you must ready one unit of level III or less in each other player&amp;rsquo;s Unit area.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a name=&#34;token_mods&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;modifications-for-interactive-skill-tokens&#34;&gt;Modifications for Interactive Skill Tokens&lt;/h2&gt;
&lt;h3 id=&#34;tovak&#34;&gt;Tovak&lt;/h3&gt;
&lt;h4 id=&#34;mana-exploit&#34;&gt;Mana Exploit&lt;/h4&gt;
&lt;p&gt;Once a round: Choose a color other than gold and gain a mana token of that color. Until the start of your next turn, other players heal 1 when they use mana of any other color on their turn, limit 1 healing per color per player. Then take this token back and flip it.&lt;/p&gt;
&lt;h3 id=&#34;norowas&#34;&gt;Norowas&lt;/h3&gt;
&lt;h4 id=&#34;prayer-of-weather&#34;&gt;Prayer of Weather&lt;/h4&gt;
&lt;p&gt;Once a round: Put this skill token in the center. Until the start of your next turn, the Move cost of all terrain is reduced by 2 for you (to a minimum of 1) and is reduced by 1 for all other players (to a minimum of 1). Then take this token back and flip it.&lt;/p&gt;
&lt;h3 id=&#34;arythea&#34;&gt;Arythea&lt;/h3&gt;
&lt;h4 id=&#34;healing-ritual&#34;&gt;Healing Ritual&lt;/h4&gt;
&lt;p&gt;Once a round, except in combat: Flip this to throw away up to two wounds from your hand. One other hero may throw away one wound from their hand.&lt;/p&gt;
&lt;h3 id=&#34;goldyx&#34;&gt;Goldyx&lt;/h3&gt;
&lt;h4 id=&#34;source-freeze&#34;&gt;Source Freeze&lt;/h4&gt;
&lt;p&gt;Once a round: Put this skill token in the Source. While it is there, other players can use one extra die from the source. On your next turn, gain one crystal of any basic color represented in the Source to your inventory (do not reroll that die), then take that token back and flip it.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;credit-where-credit-is-due&#34;&gt;Credit where credit is due&lt;/h2&gt;
&lt;p&gt;Most of the suggestions originated on the following threads on Board Game Geek:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://www.boardgamegeek.com/thread/818087/making-coop-more-cooperative&#34;&gt;Making Coop More Cooperative&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.boardgamegeek.com/thread/838466/using-the-interactive-spells-in-a-co-op-game&#34;&gt;Using the &amp;ldquo;interactive&amp;rdquo; spells in a co-op game&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.boardgamegeek.com/thread/737047/using-the-interactive-skill-tokens-in-a-co-op-game&#34;&gt;Using the &amp;ldquo;interactive&amp;rdquo; skill tokens in a co-op game&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Rebasing A Pull Request on GitHub</title>
      <link>https://weblog.masukomi.org/2013/02/07/rebasing-a-pull-request-on-github/</link>
      <pubDate>Thu, 07 Feb 2013 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2013/02/07/rebasing-a-pull-request-on-github/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s generally good practice to rebase commits on a topic branch into a single commit before merging. It results in a much cleaner commit history, and makes rollbacks easier.&lt;/p&gt;
&lt;h2 id=&#34;the-question&#34;&gt;The Question&lt;/h2&gt;
&lt;p&gt;However, the question was raised: what happens if you&amp;hellip;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;fix a bug (commit 1)&lt;/li&gt;
&lt;li&gt;create a Pull Request&lt;/li&gt;
&lt;li&gt;get feedback via the Pull Request&lt;/li&gt;
&lt;li&gt;fix the bug fix (commit 2)&lt;/li&gt;
&lt;li&gt;rebase those two commits together (new tree-ish)&lt;/li&gt;
&lt;li&gt;push that back to GitHub (requires &lt;code&gt;push -f&lt;/code&gt; )&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The answer is based on understanding that a GitHub pull request has two forms of commenting:
* comments on the pull request itself
* comments on the commits that the pull request encapsulates. These are the comments made  on specific lines in the diff.&lt;/p&gt;
&lt;h2 id=&#34;the-answer&#34;&gt;The Answer&lt;/h2&gt;
&lt;p&gt;When you rebase and then force that changed version of history up onto GitHub you are effectively throwing out the old commit (the old tree-ish no longer exists) and replacing it with a new one.&lt;/p&gt;
&lt;p&gt;As a result any comments created on the diffs (and thus tied to a specific commit) will be lost, but the comments on the pull request itself will be preserved.&lt;/p&gt;
&lt;p&gt;So, the proposed rule of thumb is to simply NOT rebase once you have made a pull request. Instead, just add commits to your topic branch. This will maintain the comment history for future people curious about this piece of code.&lt;/p&gt;
&lt;h2 id=&#34;alternate-solutions&#34;&gt;Alternate Solutions&lt;/h2&gt;
&lt;p&gt;There are alternate solutions, of course, but the consequences of them tend to not be worth it.&lt;/p&gt;
&lt;h3 id=&#34;rebase-anyway&#34;&gt;Rebase Anyway&lt;/h3&gt;
&lt;p&gt;Decide that you don&amp;rsquo;t care about maintaining the inline comments, then rebase and &lt;code&gt;push -f&lt;/code&gt; back up to the server. The downside here is that at this point someone has already started looking at your code and has likely pulled it down. They will now be forced to blow away their old branch (or at least &lt;code&gt;reset --hard&lt;/code&gt; back to a point in its history before your commit), which is a pain and not obvious unless you tell them directly.&lt;/p&gt;
&lt;h3 id=&#34;make-a-second-topic-branch&#34;&gt;Make A Second Topic Branch&lt;/h3&gt;
&lt;p&gt;You could close the first pull request after having gotten the set of commits to an approvable state, and then open a new pull request from a separate topic branch with all those commits having been rolled up into one. The problem here is that if your new pull request is merged in then git blame will point to the tree-ish of the new one and no-one will ever see the comments on the old pull request unless they search, but when they do they may find that the commits in the original request don&amp;rsquo;t exist in the codebase (they&amp;rsquo;re all under the rebased commit).&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>[Review] The Sketchnote Handbook (Video Edition)</title>
      <link>https://weblog.masukomi.org/2013/01/31/review-the-sketchnote-handbook-video-edition/</link>
      <pubDate>Thu, 31 Jan 2013 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2013/01/31/review-the-sketchnote-handbook-video-edition/</guid>
      <description>&lt;div align=&#34;center&#34;&gt;&lt;a href=&#34;http://www.flickr.com/photos/rohdesign/8321233515/&#34; title=&#34;Nathan Reading The Sketchnote Handbook by Mike Rohde, on Flickr&#34;&gt;&lt;img src=&#34;http://farm9.staticflickr.com/8223/8321233515_c7933b11ba_q.jpg&#34; width=&#34;150&#34; height=&#34;150&#34; alt=&#34;Nathan Reading The Sketchnote Handbook&#34;&gt;&lt;/a&gt;&lt;a href=&#34;http://www.flickr.com/photos/rohdesign/7768426058/&#34; title=&#34;First inked spread of the Sketchnote Handbook. Liking how it&#39;s looking! by Mike Rohde, on Flickr&#34;&gt;&lt;img src=&#34;http://farm9.staticflickr.com/8294/7768426058_64d699149b_q.jpg&#34; width=&#34;150&#34; height=&#34;150&#34; alt=&#34;First inked spread of the Sketchnote Handbook. Liking how it&#39;s looking!&#34;&gt;&lt;/a&gt;&lt;a href=&#34;http://www.flickr.com/photos/rohdesign/8160101108/&#34; title=&#34;Mike Rohde (Color - Square) by Mike Rohde, on Flickr&#34;&gt;&lt;img src=&#34;http://farm8.staticflickr.com/7268/8160101108_c33ce29d5f_q.jpg&#34; width=&#34;150&#34; height=&#34;150&#34; alt=&#34;Mike Rohde (Color - Square)&#34;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;h2 id=&#34;who-should-read-this&#34;&gt;Who should read this?&lt;/h2&gt;
&lt;p&gt;Anyone who&amp;rsquo;s seen &lt;a href=&#34;http://sketchnotearmy.com&#34;&gt;The Sketchnote Army&lt;/a&gt; and wished they could do that. Anyone who&amp;rsquo;s sick of useless meeting notes they never remember, and never go back to read. Anyone who wants a way to provide information to people in a way that people will actually &lt;em&gt;enjoy&lt;/em&gt; consuming, and not just skim through.&lt;/p&gt;
&lt;h2 id=&#34;the-best-laid-plans&#34;&gt;The best laid plans&amp;hellip;&lt;/h2&gt;
&lt;p&gt;My initial intent was to create this review in Sketchnote form, but Sketchnoting is, in no small part, the art of filtering essential ideas from a stream of words, and presenting them in a semi-visual fashion in order to help convey and emphasize the important points. The problem is that &lt;a href=&#34;https://www.amazon.com/dp/0321885112/ref=as_li_ss_til?tag=masukomiorg-20&amp;amp;camp=0&amp;amp;creative=0&amp;amp;linkCode=as4&amp;amp;creativeASIN=0321885112&amp;amp;adid=0ZKQWQZX38148ZC0XA58&amp;amp;&#34;&gt;The Sketchnote Handbook&lt;/a&gt; has already done this. Every point I wanted to note was something &lt;a href=&#34;http://rohdesign.com/&#34;&gt;Mike Rohde&lt;/a&gt; (the author) had already created a succinct Sketchnote about. To create an even remotely comprehensive review I&amp;rsquo;d have to draw out most of the book.&lt;/p&gt;
&lt;p&gt;So, I&amp;rsquo;m left with words.&lt;/p&gt;
&lt;h2 id=&#34;some-background&#34;&gt;Some background&lt;/h2&gt;
&lt;p&gt;Most people know me as either &lt;a href=&#34;https://github.com/masukomi&#34;&gt;a programmer&lt;/a&gt;, or &lt;a href=&#34;http://www.CorporateRunaways.com&#34;&gt;an adventurer&lt;/a&gt;, but not many know that &lt;a href=&#34;http://illustration.masukomi.org&#34;&gt;I occasionally do illustrations&lt;/a&gt; for folks too.&lt;/p&gt;
&lt;p&gt;I ordered this book because I&amp;rsquo;ve been fascinated with Sketchnotes; their look, their personality, and their ability to convey the essential information from any event. &lt;a href=&#34;http://www.DacharyCarey.com&#34;&gt;Dachary&lt;/a&gt; and I have been pondering not just writing our next &lt;a href=&#34;http://www.CorporateRunaways.com&#34;&gt;adventure&lt;/a&gt; but Sketchnoting it as well. If we can pull it off, the result would be an incredibly engaging way of keeping up with an adventure.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d seen &lt;a href=&#34;http://sketchnotearmy.com&#34;&gt;plenty of Sketchnotes&lt;/a&gt;, and with a childhood spent in art classes the technical details of &lt;em&gt;how&lt;/em&gt; they were created wasn&amp;rsquo;t a question. Anyone who applies &lt;em&gt;any&lt;/em&gt; thought to the matter should be able to figure that out (text + related doodles equals sketchnote). From a technical perspective they&amp;rsquo;re pretty trivial. What&amp;rsquo;s been missing is information about the &lt;em&gt;approach&lt;/em&gt;. How does one go about sketchnoting? How do you manage to keep up with a speaker? What is the process by which one chooses what things to emphasize, what layout to use, when to draw and when to write?&lt;/p&gt;
&lt;p&gt;And that, is where, and why the Sketchnote Handbook excels.&lt;/p&gt;
&lt;h2 id=&#34;the-book&#34;&gt;The Book&lt;/h2&gt;
&lt;p&gt;By page 18 this book has addressed the common problem of people running around claiming &amp;ldquo;I can&amp;rsquo;t draw&amp;rdquo;. It does this, by conveying the simple fact that Sketchnotes are about &amp;ldquo;IDEAS NOT ART&amp;rdquo;, points out that everything can be drawn with 5 simple elements (Circle, Square, Triangle, Line, Dot), provides a handful of quickie examples, and then proceeds to do what every other Sketchnote resource should have done: moves on.&lt;/p&gt;
&lt;p&gt;To me, that was the moment I realized &amp;ldquo;Holy crap! This book is actually going to be about Sketchnoting not &amp;lsquo;Stick Figures 101&amp;rsquo;.&amp;rdquo;  And that&amp;rsquo;s what makes this book incredible. Seriously, this is an &lt;em&gt;incredible&lt;/em&gt; book, and one you &lt;em&gt;must&lt;/em&gt; buy if you have any interest in learning to create your own Sketchnotes.&lt;/p&gt;
&lt;p&gt;What makes this incredible is that it&amp;rsquo;s about the &lt;em&gt;process&lt;/em&gt; of Sketchnoting. It says &amp;ldquo;Hey, this is what Sketchnoting is. This is why it&amp;rsquo;s valuable. Here&amp;rsquo;s how to listen. Here&amp;rsquo;s how you make a Sketchnote. Here are common patterns, and approaches people take to making them.&amp;rdquo; Only then, once he&amp;rsquo;s given you everything you need (146 very quick pages in) does he go back to the &amp;ldquo;Stick Figures 101&amp;rdquo;, which is probably good, because drawing is a lot like singing. People are convinced they&amp;rsquo;re horrible at it, which leads to them not having the guts to try it and find out that that can be pretty decent at it if they would only give themselves permission to try.&lt;/p&gt;
&lt;div align=&#34;center&#34;&gt;&lt;a href=&#34;http://www.flickr.com/photos/rohdesign/7587660756/&#34; title=&#34;Sketchnotes pg 1 by Mike Rohde, on Flickr&#34;&gt;&lt;img src=&#34;http://farm9.staticflickr.com/8146/7587660756_8632082b1c_q.jpg&#34; width=&#34;150&#34; height=&#34;150&#34; alt=&#34;Sketchnotes pg 1&#34;&gt;&lt;/a&gt;&lt;a href=&#34;http://www.flickr.com/photos/rohdesign/8135949501/&#34; title=&#34;Sketchnote Handbook: Chapter 1 Illustration Sample by Mike Rohde, on Flickr&#34;&gt;&lt;img src=&#34;http://farm9.staticflickr.com/8335/8135949501_e50984fe4e_q.jpg&#34; width=&#34;150&#34; height=&#34;150&#34; alt=&#34;Sketchnote Handbook: Chapter 1 Illustration Sample&#34;&gt;&lt;/a&gt;&lt;a href=&#34;http://www.flickr.com/photos/rohdesign/7953576212/&#34; title=&#34;Chapter 5, inked and scanned. Nighty night. by Mike Rohde, on Flickr&#34;&gt;&lt;img src=&#34;http://farm9.staticflickr.com/8181/7953576212_e35277e0c8_q.jpg&#34; width=&#34;150&#34; height=&#34;150&#34; alt=&#34;Chapter 5, inked and scanned. Nighty night.&#34;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Because the book is itself a Sketchnote, there&amp;rsquo;s no need to skim to &amp;ldquo;the important part&amp;rdquo;. It is exclusively important parts, and key concepts. While you don&amp;rsquo;t need to be an artist to create amazing Sketchnotes, Sketchnoting is itself an art form, and as such you can&amp;rsquo;t define it with explicit rules. There are core concepts, and basic techniques that are shared across all Sketchnotes, but like all art, there&amp;rsquo;s no &amp;ldquo;correct&amp;rdquo; way to do it. There are only guidelines that you may or may not choose to follow, and Mike&amp;rsquo;s done a wonderful job of conveying those, and showing how those concepts play out through examples from many talented Sketchnoters with diverse styles.&lt;/p&gt;
&lt;h2 id=&#34;the-video-edition&#34;&gt;The Video Edition&lt;/h2&gt;
&lt;div align=&#34;center&#34;&gt;&lt;a href=&#34;http://www.flickr.com/photos/rohdesign/7587630702/&#34; title=&#34;Shooting the TSH intro by Mike Rohde, on Flickr&#34;&gt;&lt;img src=&#34;http://farm8.staticflickr.com/7122/7587630702_e78d501240_q.jpg&#34; width=&#34;150&#34; height=&#34;150&#34; alt=&#34;Shooting the TSH intro&#34;&gt;&lt;/a&gt;&lt;a href=&#34;http://www.flickr.com/photos/rohdesign/7587630572/&#34; title=&#34;Mike B-Roll by Mike Rohde, on Flickr&#34;&gt;&lt;img src=&#34;http://farm8.staticflickr.com/7270/7587630572_580c27beaf_q.jpg&#34; width=&#34;150&#34; height=&#34;150&#34; alt=&#34;Mike B-Roll&#34;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The quality of the videos is quite good, even though, for the most part, you&amp;rsquo;re just watching Mike at a desk or literally looking over his shoulder as he&amp;rsquo;s drawing. But&amp;hellip; I&amp;rsquo;m not full sold on them.&lt;/p&gt;
&lt;p&gt;I think that, for the most part, the book does a better job of conveying the information. Much of the video feels like &amp;ldquo;Highlights from the book&amp;rdquo;, but there is definitely some additional value there. There&amp;rsquo;s a surprising difference between reading that he&amp;rsquo;ll bring a speaker&amp;rsquo;s photo up on his iPhone and seeing him holding the iPhone whilst propping up a corner of the notebook with the same hand and drawing with the other. Watching him draw even the simplest of visual elements like dividers and lines is somehow much more&amp;hellip; accessible, and achievable, than seeing a static page of them. This is, I think, incredibly valuable for people who don&amp;rsquo;t have faith in their drawing ability.&lt;/p&gt;
&lt;p&gt;The 9th video is the most important one in the series, because it&amp;rsquo;s just watching over Mike&amp;rsquo;s shoulder, in real time, while he Sketchnotes a talk. It&amp;rsquo;s fascinating to watch what information he chooses to incorporate, and what information gets left out, to see some things the speaker said earlier on enter the page a minute or two later, when you thought he was going to leave it out entirely.&lt;/p&gt;
&lt;p&gt;I have to say though, I wasn&amp;rsquo;t thrilled with the way that most of the videos were edited down into two to three minute clips. To me that was more frustrating, because you&amp;rsquo;re not going to watch just one. You&amp;rsquo;re going to watch a swath of them, but you keep having to go back and click on the next one. I think it would have been much better served by breaking the 70 minutes of footage down into three of four sections.&lt;/p&gt;
&lt;p&gt;If I had to do it again, knowing what I know now, would I buy the video edition? Yes, if only for the 9th video. If I was to recommend this to someone who wasn&amp;rsquo;t confident in their ability to doodle though I would &lt;em&gt;absolutely&lt;/em&gt; recommend the video. It really helps to show that Sketchnoting is something that &lt;em&gt;anyone&lt;/em&gt; can do.&lt;/p&gt;
&lt;p&gt;With that said, I can&amp;rsquo;t recommend buying the &amp;ldquo;Video Edition&amp;rdquo; of the physical book. When you buy it there&amp;rsquo;s a stiff square insert in the back that &lt;em&gt;looks&lt;/em&gt; like it contains a DVD. It doesn&amp;rsquo;t. There&amp;rsquo;s a pull-tab that reveals a code to the web site where you can watch the video on the Peachpit website, which feels like a total deception to me. There is, however, a &lt;a href=&#34;https://www.amazon.com/dp/0321885139/ref=as_li_ss_til?tag=masukomiorg-20&amp;amp;camp=0&amp;amp;creative=0&amp;amp;linkCode=as4&amp;amp;creativeASIN=0321885139&amp;amp;adid=071072R7CHBC3M6B4ZNA&amp;amp;&#34;&gt;&amp;ldquo;Multimedia DVD&amp;rdquo; edition&lt;/a&gt; which does come with a DVD. Buy that if you want the video, or get the regular version and go to &lt;a href=&#34;http://www.peachpit.com&#34;&gt;Peachpit.com&lt;/a&gt; and pay for the video separately.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;re interested in trying you hand a sketchnoting, then &lt;a href=&#34;https://www.amazon.com/dp/0321857895/ref=as_li_ss_til?tag=masukomiorg-20&amp;amp;camp=0&amp;amp;creative=0&amp;amp;linkCode=as4&amp;amp;creativeASIN=0321857895&amp;amp;adid=142G6FTRVF7WYFJY6DCK&amp;amp;&#34;&gt;buy this book&lt;/a&gt; ( or &lt;a href=&#34;https://www.amazon.com/dp/0321885139/ref=as_li_ss_til?tag=masukomiorg-20&amp;amp;camp=0&amp;amp;creative=0&amp;amp;linkCode=as4&amp;amp;creativeASIN=0321885139&amp;amp;adid=16VC5R99WPX959QHBCN6&amp;amp;&#34;&gt;get it with the DVD&lt;/a&gt;).&lt;/p&gt;
&lt;h2 id=&#34;contest&#34;&gt;Contest!&lt;/h2&gt;
&lt;p&gt;Yup. To all those lovely folks who&amp;rsquo;ve made it this far I offer you a simple contest. Draw me something that makes me smile. Ball point pen, watercolors, crayons, charcoal, whatever. Stick it online and &lt;a href=&#34;http://twitter.com/masukomi&#34;&gt;tweet me&lt;/a&gt; a link. First one to make me smile wins a copy of the regular (sans video) edition.&lt;/p&gt;
&lt;p&gt;[Update: Too late! I&amp;rsquo;ve been made to smile! Thanks for reading this far though. Now, go buy a copy. It&amp;rsquo;s worth every penny.]&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Git: pushing and pulling from multiple repos</title>
      <link>https://weblog.masukomi.org/2013/01/31/git-pushing-and-pulling-from-multiple-repos/</link>
      <pubDate>Thu, 31 Jan 2013 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2013/01/31/git-pushing-and-pulling-from-multiple-repos/</guid>
      <description>&lt;p&gt;Lets assume you&amp;rsquo;ve already cloned a remote repo and have been working with it. Now, someone has set up a second repo out there for the same codebase, and you&amp;rsquo;d like to interact with both.&lt;/p&gt;
&lt;p&gt;*Please note: The following is based on the assumption that you have write privileges to the second repo, but don&amp;rsquo;t worry, you do essentially the same thing if you don&amp;rsquo;t and I&amp;rsquo;ll cover the differences at the end. *&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;git remote add &amp;lt;local_name_for_remote_repo&amp;gt; &lt;url&gt;&lt;/li&gt;
&lt;li&gt;git checkout -b &lt;branch name&gt; &amp;lt;local_name_for_remote_repo&amp;gt;/master
&lt;ul&gt;
&lt;li&gt;could be any branch on that repo, not necessarily master&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now, your new local branch is now set up to track (push and pull to/from) the remote repo&amp;rsquo;s &amp;ldquo;master&amp;rdquo; branch. All your pre-existing branches will continue to track whatever they were tracking previously&lt;/p&gt;
&lt;p&gt;A practical example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git remote add repo2  git@github.com:masukomi/kudos.git
git checkout -b repo2_kudos -t repo2/master
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;workflow&#34;&gt;Workflow&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s say you&amp;rsquo;ve decided to add a new feature in the &lt;code&gt;kudos&lt;/code&gt; repo we just connected to.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Checkout the &lt;code&gt;repo2_kudos&lt;/code&gt; branch&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git pull&lt;/code&gt; to get the latest code from repo2/master&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git checkout -b adding_feature_x&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;this new topic branch is not &lt;em&gt;yet&lt;/em&gt; tracking anything so if you attempt to &lt;code&gt;push&lt;/code&gt; or &lt;code&gt;pull&lt;/code&gt; it won&amp;rsquo;t work, because it won&amp;rsquo;t know what endpoint you want to interact with.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Make your changes on this topic branch.&lt;/li&gt;
&lt;li&gt;When you&amp;rsquo;re ready run &lt;code&gt;git push -u repo2 adding_feature_x&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;This will do three things:
&lt;ol&gt;
&lt;li&gt;It will create a new branch in the repo2 repository named &amp;ldquo;adding_feature_x&amp;rdquo;&lt;/li&gt;
&lt;li&gt;It will push the contents of your &lt;code&gt;adding_feature_x&lt;/code&gt; branch into the corresponding one on repo2.&lt;/li&gt;
&lt;li&gt;It will configure things so that your local &lt;code&gt;adding_feature_x&lt;/code&gt; branch is now tracking the remote &lt;code&gt;adding_feature_x&lt;/code&gt; branch so &lt;code&gt;push&lt;/code&gt; and &lt;code&gt;pull&lt;/code&gt; will work without additional arguments. &lt;strong&gt;You &lt;em&gt;must&lt;/em&gt; pass the &lt;code&gt;-u&lt;/code&gt; parameter for tracking to be set up here.&lt;/strong&gt; If you fail to pass the &lt;code&gt;-u&lt;/code&gt; parameter at this point then &lt;code&gt;push&lt;/code&gt; and &lt;code&gt;pull&lt;/code&gt; won&amp;rsquo;t work without additional parameters. You can, however, set up tracking after the fact with &lt;code&gt;git branch -u repo2/adding_feature_x&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now that you&amp;rsquo;ve pushed your changes to the new branch on the remote repo you can initiate pull requests from your topic branch into the main branches (if you&amp;rsquo;re using github) or you can simple tell others about it so that they can interact with it.&lt;/p&gt;
&lt;p&gt;Keep in mind that it&amp;rsquo;s best practice to regularly pull from your main branch into your topic branch (&lt;code&gt;repo2_kudos&lt;/code&gt; into &lt;code&gt;adding_feature_x&lt;/code&gt; in this case) so as to avoid large merge conflicts. Alternately you could pull from the corresponding main branch on the second repo (&lt;code&gt;repo2/master&lt;/code&gt; in this case) since they should be equivalent.&lt;/p&gt;
&lt;h2 id=&#34;when-you-dont-have-write-privileges&#34;&gt;When you don&amp;rsquo;t have write privileges&lt;/h2&gt;
&lt;p&gt;If you don&amp;rsquo;t have write privileges to the second repo things change slightly. The difference is in where you push your new topic branch (&lt;code&gt;adding_feature_x&lt;/code&gt;) to. You can either push as a new branch on whatever repo your local repo was cloned from (if you&amp;rsquo;ve got write privileges to that) &lt;em&gt;or&lt;/em&gt; you can create a third remote repo that you control, and push the branch to that. The third repo would be configured in the same way as the second, and you should be able to push to it in the same way we pushed to the second. Git makes it easy to flow code from one repo to another, or through multiple repos.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Why you should wear a bow tie</title>
      <link>https://weblog.masukomi.org/2013/01/25/why-you-should-wear-a-bow-tie/</link>
      <pubDate>Fri, 25 Jan 2013 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2013/01/25/why-you-should-wear-a-bow-tie/</guid>
      <description>&lt;p&gt;In many situations, the standard tie has become &lt;a href=&#34;http://www.merriam-webster.com/dictionary/de%20rigueur&#34;&gt;de rigueur&lt;/a&gt;, and so commonplace that it is generally only noticeable in its absence. This is not something that can be said of the bow tie.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://s3.amazonaws.com/mobtvse_masukomi/2013_1_25_paisley_oootie_med.jpg&#34; alt=&#34;Paisley Bow Tie&#34;&gt;&lt;/p&gt;
&lt;p&gt;Imagine you&amp;rsquo;re going to a job interview. If you wear a tie no-one will take note of it (unless you&amp;rsquo;re a lady). It&amp;rsquo;s simply what you do. A bow tie on the other hand, says a number of things about you, and makes you more memorable.&lt;/p&gt;
&lt;p&gt;A bow tie says that you have made a conscious decision to improve your appearance. It says that you are capable of making your own decisions, and not just follow some common list of what you &amp;ldquo;should&amp;rdquo; wear.&lt;/p&gt;
&lt;p&gt;A bow tie says you are capable of &lt;em&gt;not only&lt;/em&gt; making your own decisions, but are willing to display them publicly, and defend them when needed.  - Sooner or later someone&amp;rsquo;s going to ask why you&amp;rsquo;re wearing a bow tie, and you&amp;rsquo;ll have a good reason or four.&lt;/p&gt;
&lt;p&gt;A bow tie says that you have taken time to learn a skill that the vast majority of the men around you don&amp;rsquo;t have (learning to tie a bow tie).&lt;/p&gt;
&lt;p&gt;A bow tie is memorable, if for no other reason than the fact that they are so rarely worn.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://s3.amazonaws.com/mobtvse_masukomi/2013_1_25_sir_winston_churchill_small_med.jpg&#34; alt=&#34;Sir Winston Churchill&#34;&gt;&lt;/p&gt;
&lt;p&gt;Bow Tie Wearers: Sir Winston Churchill, Pee-wee Herman, PSY, The 11th Doctor, Indiana Jones, and the classic Playboy Bunny outfit (can&amp;rsquo;t forget the ladies).&lt;/p&gt;
&lt;p&gt;Where to get one? Well, there are a variety of places, but I like checking &lt;a href=&#34;http://www.oootie.com/&#34;&gt;OoOTie&lt;/a&gt; first, because they&amp;rsquo;re great guys, and second because have the best paisleys, plus nifty things like embroidered mars rovers, silk screened mustaches, and more. And no, I get nothing from promoting them.&lt;/p&gt;
&lt;p&gt;P.S. For those days when you&amp;rsquo;re wearing a standard tie, please learn how to tie &lt;a href=&#34;http://www.tie-a-tie.net/halfwindsor.html&#34;&gt;a Half Windsor&lt;/a&gt;  or a &lt;a href=&#34;http://www.tie-a-tie.net/windsor.html&#34;&gt;Windsor&lt;/a&gt;. There are far too many lopsided tie knots in the world.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Life: An Instructional Flow Chart</title>
      <link>https://weblog.masukomi.org/2013/01/10/life-an-instructional-flow-chart/</link>
      <pubDate>Thu, 10 Jan 2013 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2013/01/10/life-an-instructional-flow-chart/</guid>
      <description>&lt;p&gt;An instructional flow chart to help live a better life.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://s3.amazonaws.com/mobtvse_masukomi/2013_1_10_life_instructional_flow.png&#34;&gt;&lt;img src=&#34;https://s3.amazonaws.com/mobtvse_masukomi/2013_1_10_life_instructional_flow_med.png&#34; alt=&#34;Life: Instructional Flow Chart&#34;&gt;&lt;/a&gt;&lt;br&gt;
(click to embiggen)&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m thinking I need to artify this and make it into a t-shirt. &lt;a href=&#34;mailto:masukomi@masukomi.org&#34;&gt;Drop me an e-mail&lt;/a&gt; if you&amp;rsquo;d be interested in one.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Office Memo</title>
      <link>https://weblog.masukomi.org/2012/12/06/office-memo/</link>
      <pubDate>Thu, 06 Dec 2012 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2012/12/06/office-memo/</guid>
      <description>&lt;p&gt;Dear Sir or Madam:&lt;/p&gt;
&lt;p&gt;You may not be aware but liquids are capable of flowing through holes. If you place a container of liquid in such a manner that its opening is below the level of the liquid, the liquid will flow through that opening.&lt;/p&gt;
&lt;p&gt;Please take a moment to consider the implications of this, and discuss them with your coworkers, as some of them are apparently unaware of this fun fact. Yesterday, one of them placed a carton of cream on its side, with the opening below the level of the fluid inside. As a result, we now have cream all over the bottom of the fridge.&lt;/p&gt;
&lt;p&gt;P.S.&lt;/p&gt;
&lt;p&gt;The responsible party may want to consider taking a sick day, leveraging our health plan, and going to see a doctor. Potential brain tumors should not be treated lightly.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Never register a domain name with your hosting provider</title>
      <link>https://weblog.masukomi.org/2012/11/19/never-register-a-domain-name-with-your-hosting-provider/</link>
      <pubDate>Mon, 19 Nov 2012 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2012/11/19/never-register-a-domain-name-with-your-hosting-provider/</guid>
      <description>&lt;p&gt;A smart developer I respect recently asked my why I didn&amp;rsquo;t just register my
domain names through my hosting provider. I hoped he was joking, that he knew
why this was a horrible idea. He did not, and I know some other smart people who
register domains with their hosting providers. Education is needed.&lt;/p&gt;
&lt;p&gt;The problem is simple: conflict of interest. Should you ever decide to switch to
a different hosting provider it&amp;rsquo;s in their best interest to &lt;em&gt;prevent&lt;/em&gt; you from
moving your domain. Why? Because if you point it to some other hosting provider
you stop having to pay them.&lt;/p&gt;
&lt;p&gt;It doesn&amp;rsquo;t matter how great your current hosting provider is. It doesn&amp;rsquo;t matter
how great their morals, customer support, or promises are. There is no guarantee
they won&amp;rsquo;t be bought by an ass-hole tomorrow. There&amp;rsquo;s no guarantee some greedy
concepts won&amp;rsquo;t start to permiate their management.&lt;/p&gt;
&lt;p&gt;Your domain name is your online identity, or that of your company. Do you really
want to risk the possibility of having it stuck at a company with rapidly
declining quality of service or support? Or, maybe a company that starts jacking
prices through the roof? If your hosting provider controls your domain name&amp;rsquo;s
registration you &lt;em&gt;are&lt;/em&gt; taking this risk.&lt;/p&gt;
&lt;p&gt;The solution, however, is simple, and cheap. Transfer your domain to a company
that is primarily a registrar &lt;em&gt;today&lt;/em&gt;. You don&amp;rsquo;t need to change your hosting
setup, and you don&amp;rsquo;t need to wait until your current domain regstration is about
to expire. When you transfer a domain name you get the current time remaining on
your registration &lt;em&gt;plus&lt;/em&gt; the year, or more, you choose to pay for at the new
registrar.&lt;/p&gt;
&lt;p&gt;Currently I&amp;rsquo;m recommending people go to &lt;a href=&#34;http://www.hover.com/&#34;&gt;Hover.com&lt;/a&gt;. I
don&amp;rsquo;t get anything for referring you there. They&amp;rsquo;re just refreshingly easy to
use and don&amp;rsquo;t try and sell you &lt;em&gt;any&lt;/em&gt; other services.&lt;/p&gt;
&lt;p&gt;Before you say &amp;ldquo;my hosting company would never prevent me from leaving.&amp;rdquo; I would
remind you of the famous saying&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Those who cannot remember the past are condemned to repeat it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;George Santayana&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;While it may not happen much these days, back when hosting providers started
offering registration services this practice of locking customers in was
actually quite common. I encountered quite a few people who were forced to
abandon their domain name because they wanted to leave a corrupt, or at least
bad, hosting company.&lt;/p&gt;
&lt;p&gt;There are some measures in place to help prevent this, but you will still have a
miserable time getting your domain away from a hosting provider that doesn&amp;rsquo;t
want you to go and tries to thwart your exodus.&lt;/p&gt;
&lt;p&gt;If you have any domain names that are currently managed by your hosting
provider, please transfer them away ASAP. Most of you won&amp;rsquo;t have a problem. Some
of you &lt;em&gt;will&lt;/em&gt;. For those who will, keep in mind that it&amp;rsquo;s much better to learn
your hosting provider is an ass now, then when you actually &lt;em&gt;need&lt;/em&gt; to move it at
some point down the road.&lt;/p&gt;
&lt;h3 id=&#34;update-a-response-to-the-comments&#34;&gt;Update: A response to the comments&lt;/h3&gt;
&lt;p&gt;The key to this happening is that hosting providers your register a domain name
through will frequently set themselves as the administrative contact, because,
they would argue, they are the ones administering the domain. You&amp;rsquo;ve paid them
to do so. &lt;em&gt;BUT&lt;/em&gt; the administrative contact also holds the keys to the kingdom as
it were. It&amp;rsquo;s &lt;em&gt;their&lt;/em&gt; email address that will be involved in the confirmation
process during a transfer, and their approval of the transfer that will be
required.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s absolutely true that the situation has gotten better, and that you&amp;rsquo;re safer
with the large, well established hosting companies, but I&amp;rsquo;m not trying to spread
&lt;a href=&#34;http://en.wikipedia.org/wiki/Fear,_uncertainty_and_doubt&#34;&gt;FUD&lt;/a&gt; here. This has
happened in the past to many companies and individuals, and I would not be
surprised to hear  that it&amp;rsquo;s still happening. Yes, there are higher authorities
you can go to, but in the end most people who encounter this problem fight with
their evil host for a month or more, and don&amp;rsquo;t know who that higher authority
is, know how to report it to them, or have enough fight left in them to bother
starting the whole process over again.&lt;/p&gt;
&lt;p&gt;Some helpful folks have mentioned some other great registrars in the comments,
and I do have domains at &lt;a href=&#34;http://www.gandi.net&#34;&gt;Gandi.net&lt;/a&gt; but I&amp;rsquo;m recommending
&lt;a href=&#34;http://www.hover.com&#34;&gt;Hover&lt;/a&gt; because they don&amp;rsquo;t try and sell you anything else
and the&amp;rsquo;ve got a nice uncluttered and easy to figure out UI.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>An unexpected benefit to being an adventurer</title>
      <link>https://weblog.masukomi.org/2012/10/29/an-unexpected-benefit-to-being-an-adventurer/</link>
      <pubDate>Mon, 29 Oct 2012 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2012/10/29/an-unexpected-benefit-to-being-an-adventurer/</guid>
      <description>&lt;p&gt;The edges Sandy were upon us last night and Dachary commented about how I wasn&amp;rsquo;t taking the storm too seriously. It&amp;rsquo;s true. I&amp;rsquo;ve been pretty chill about it. But here&amp;rsquo;s why: we&amp;rsquo;re adventurers, and are pretty much good to go on a worldwide adventure at a moments notice, and it turns out that our &amp;ldquo;life on the road&amp;rdquo; kit makes a pretty damn good disaster kit too.&lt;/p&gt;
&lt;p&gt;If the power goes out we&amp;rsquo;ve got a &lt;a href=&#34;http://www.jetboil.com/&#34;&gt;JetBoil&lt;/a&gt; propane stove with a backup canister. If we run out of propane we&amp;rsquo;ve got the multifuel stove and spare gasoline. If we run out of gasoline we&amp;rsquo;ve got oil. If we run out of oil we&amp;rsquo;ve got some alcohol. We&amp;rsquo;ve got a pretty good first-aid kit (including sterile needles and syringes and splints). We&amp;rsquo;ve got a little camp food and we&amp;rsquo;ve got &lt;a href=&#34;http://www.rei.com/product/767831/first-need-xl-water-purifier&#34;&gt;a bad-ass water purifier&lt;/a&gt; that can filter out things as small as viruses (Brita&amp;rsquo;s can&amp;rsquo;t dream of this) so I wouldn&amp;rsquo;t be too bothered if I had to go suck up water from puddles on the street.&lt;/p&gt;
&lt;p&gt;We bought six gallons of water, and filled up another six liters worth of camelbacks (we have at least another 25 liters worth of &lt;a href=&#34;http://www.rei.com/search?query=msr+bladder&#34;&gt;bladders&lt;/a&gt; and &lt;a href=&#34;http://www.camelbak.com&#34;&gt;Camelbaks&lt;/a&gt; we could fill up if we wanted to). We bought some non-perisable things at the store, but not too much as it&amp;rsquo;d be pretty surprising if Boston fell into Katrina level badness from this.&lt;/p&gt;
&lt;p&gt;If it gets too cold we can set up a tent in the house to conserve our radient heat. We&amp;rsquo;ve got plenty of sleeping bags and air mattresses for us and the dogs. Living in New England, and occasionally riding motorcycles at speed over mountain ranges, we&amp;rsquo;re also set on the cold weather clothing front.&lt;/p&gt;
&lt;p&gt;And, when it goes dark we&amp;rsquo;ve got headlamps, tent lamps, and spare batteries.&lt;/p&gt;
&lt;p&gt;So yeah. I&amp;rsquo;m not too worried.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Creating an Interview Worksheet</title>
      <link>https://weblog.masukomi.org/2012/10/12/creating-an-interview-worksheet/</link>
      <pubDate>Fri, 12 Oct 2012 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2012/10/12/creating-an-interview-worksheet/</guid>
      <description>&lt;p&gt;Once again, I&amp;rsquo;d like to pick your brain.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m working on an &amp;ldquo;Interview Worksheet&amp;rdquo;. It&amp;rsquo;s a simple form that you&amp;rsquo;ll fill out while interviewing someone, and prepping for an interview with them. There is, of course, a section for questions you want to ask them, one for taking notes during your discussion, and one for the common &amp;ldquo;How would you rate yourself on skill X&amp;rdquo; questions. But, I&amp;rsquo;ve also got a section where you can quickly rate the person on various attributes that you tend to look for.&lt;/p&gt;
&lt;p&gt;There are two things I&amp;rsquo;d like to hear from you:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Suggestions for other rateable attributes that you look for that aren&amp;rsquo;t in my list below.&lt;/li&gt;
&lt;li&gt;A &lt;em&gt;quick&lt;/em&gt; piece of advice for other interviewers: just one or two sentences, something you try and look for in a candidate that others should consider looking for too, or maybe something you do in an interview that reveals important details.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;My idea is to collect the advice and put it on the back of the sheet. Better to have helpful suggestions from other smart interviewers than a field of white.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s my current list of rateable attributes. Each will be presented on the form in such a way that you could  fill them out whilst keeping the meaning of your actions hidden.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Experience (how much?)&lt;/li&gt;
&lt;li&gt;Personality (how good?)&lt;/li&gt;
&lt;li&gt;Skills (how skilled are they?)&lt;/li&gt;
&lt;li&gt;Group Fit (you may love them, but how good will they be with the team?)&lt;/li&gt;
&lt;li&gt;Communication (you know, like&amp;hellip; with the words &amp;rsquo;n stuff)&lt;/li&gt;
&lt;li&gt;Passion (how passionate are they about the task you&amp;rsquo;re interviewing them for?)&lt;/li&gt;
&lt;li&gt;Additivity ( A measure of how many talents / skills they&amp;rsquo;d bring to your team that you don&amp;rsquo;t already have. I could &lt;em&gt;really&lt;/em&gt; use a better word for this, and would love your suggestions.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, what do you look for? What tips do you have to share?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>There&#39;s always more to learn</title>
      <link>https://weblog.masukomi.org/2012/10/10/theres-always-more-to-learn/</link>
      <pubDate>Wed, 10 Oct 2012 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2012/10/10/theres-always-more-to-learn/</guid>
      <description>&lt;p&gt;My mother was an incredibly talented artist. For most of my life, she made here living teaching private students, and getting them ready for entry into art colleges.&lt;/p&gt;
&lt;p&gt;Once upon a time a student of hers got her a present. It was a Horse-hair calligraphy brush, a solid ink stick (add water and rub), and an instructional book on Chinese calligraphy.&lt;/p&gt;
&lt;p&gt;She was very worried about giving the gift though. She didn&amp;rsquo;t want to instruct a teacher she greatly respected by giving her an introductory how-to book. But it was a gift from the heart, and one she believed my mother would enjoy.&lt;/p&gt;
&lt;p&gt;My mother was a master of all the traditional western fine-arts media: oils, pencils, sculpture&amp;hellip; but she had no direct experience with Chinese calligraphy, and I suspect they&amp;rsquo;d had had a discussion about it during one of their lessons.&lt;/p&gt;
&lt;p&gt;It was one of the most precious gifts she ever received. It taught her something, and meant all the more because of the students courage in giving it. She gradually worked through that ink stick, playing with calligraphic brush lines, and remembering who gave it to her.&lt;/p&gt;
&lt;p&gt;She never let ego get in the way of learning, and it was a lesson I&amp;rsquo;ll never forget.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s always more to learn, and sometimes, it comes from unexpected places. Always welcome it with open arms.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Don&#39;t talk about what your product is</title>
      <link>https://weblog.masukomi.org/2012/10/01/dont-talk-about-what-your-product-is/</link>
      <pubDate>Mon, 01 Oct 2012 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2012/10/01/dont-talk-about-what-your-product-is/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;It&amp;rsquo;s really important, &lt;strong&gt;not&lt;/strong&gt; to talk about what your product is.&lt;/p&gt;
&lt;p&gt;Nobody Cares.&lt;/p&gt;
&lt;p&gt;Talk about what the customer feels, wants, dreams of, etcetera.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;That&amp;rsquo;s&lt;/strong&gt; what they care about.&lt;/p&gt;
&lt;p&gt;&amp;ndash; &lt;a href=&#34;http://http://unicornfree.com/&#34;&gt;Amy Hoy&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Speaking on the &lt;a href=&#34;http://rubyrogues.com/072-rr-entrepreneurship-with-amy-hoy/&#34;&gt;Ruby Rogues Podcast #72&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</description>
    </item>
    
    <item>
      <title>The Entrepreneur&#39;s Notebook (part 1)</title>
      <link>https://weblog.masukomi.org/2012/09/27/the-entrepreneurs-notebook-part-1/</link>
      <pubDate>Thu, 27 Sep 2012 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2012/09/27/the-entrepreneurs-notebook-part-1/</guid>
      <description>&lt;h2 id=&#34;part-1-of-3&#34;&gt;Part 1 of 3&lt;/h2&gt;
&lt;p&gt;See also:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://weblog.masukomi.org/2012/09/27/the-entrepreneurs-notebook-part-2&#34;&gt;Part 2 - Tips for more productive note-taking&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://weblog.masukomi.org/2012/09/27/the-entrepreneurs-notebook-part-3&#34;&gt;Part 3 - Searchability, Notebook choices, and backups&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;“Write down the thoughts of the moment. Those that come unsought for are commonly the most valuable.” - Francis Bacon, Sr.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I contend that the best thing you can do to improve your entrepreneurial skills is to practice thinking like one. What follows is my favorite technique for doing just that, and if you choose to emulate it, I guarantee you&amp;rsquo;ll end up with more business ideas to work on than you every imagined you had in you.&lt;/p&gt;
&lt;h2 id=&#34;what-is-an-entrepreneurs-notebook&#34;&gt;What is an Entrepreneur&amp;rsquo;s Notebook?&lt;/h2&gt;
&lt;p&gt;Simply put, it&amp;rsquo;s a collection of entrepreneurial ideas for businesses you have, or are thinking of creating: products, marketing, sales, strategy, etc. The techniques that follow will help you to massively multiply the quantity of ideas you have, your recall of past ideas, and your ability to create connections between ideas. And the only thing you have to buy, is a notebook.&lt;/p&gt;
&lt;p&gt;These three posts will lay out the process, why it works, techniques for making a more useful notebook, backup strategies, and tips for choosing a good notebook, and more.&lt;/p&gt;
&lt;h2 id=&#34;step-one-get-a-good-notebook&#34;&gt;Step One: Get a good notebook.&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2012/09/27/notebook.jpg&#34; alt=&#34;notebook on a rail overlooking trees&#34;&gt;&lt;br&gt;
(CC &lt;a href=&#34;https://www.flickr.com/photos/thomas-h/3490481377/&#34;&gt;photo&lt;/a&gt; by thomas@flickr, on Flickr)&lt;/p&gt;
&lt;p&gt;First, you need to get a notebook; a real, &lt;em&gt;paper&lt;/em&gt; notebook. Lots of you will think &amp;ldquo;But I love [insert favorite note-taking app here].&amp;rdquo; Trust me, you want a physical notebook. A physical notebook always exists. It doesn&amp;rsquo;t disappear when you quit it. It doesn&amp;rsquo;t need to be launched. It doesn&amp;rsquo;t get low batteries, or need to be woken up, and you won&amp;rsquo;t be able to forget about it when you&amp;rsquo;re constantly carrying it around. It sits there, on the edge of your vision, silently encouraging you to write in it.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s easy to ignore, or forget about something you wrote down in an app, especially when it isn&amp;rsquo;t visible at the moment, but, your notebook is right there, and as you flip through it, looking for the next blank page, you are reminded of all the other ideas you&amp;rsquo;ve written down in it, and connections begin to form that wouldn&amp;rsquo;t otherwise.&lt;/p&gt;
&lt;p&gt;Now, &amp;ldquo;Good&amp;rdquo; is &lt;em&gt;very&lt;/em&gt; subjective when it comes to notebooks, but you&amp;rsquo;ll find my suggestions on what to look for in &lt;a href=&#34;https://weblog.masukomi.org/2012/09/27/the-entrepreneurs-notebook-part-2&#34;&gt;Part 2&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;step-two-carry-it-with-you-everywhere&#34;&gt;Step Two: Carry it with you &lt;em&gt;everywhere&lt;/em&gt;.&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2012/09/27/notebook_with_fries.jpg&#34; alt=&#34;notebook and fries&#34;&gt;&lt;br&gt;
cc &lt;a href=&#34;https://www.flickr.com/photos/goblinbox/&#34;&gt;mush m.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The act of carrying your notebook with you constantly is far more important than &lt;em&gt;which&lt;/em&gt; notebook you choose. Make sure you&amp;rsquo;ve always got your notebook and a couple spare pens or pencils. While you&amp;rsquo;re buying your notebook, take a moment to grab yourself some writing instruments that you&amp;rsquo;ll actually enjoy using, rather than whatever cheapy ball-point you found on your desk.&lt;/p&gt;
&lt;h3 id=&#34;dont-leave-your-notebook-in-your-bag&#34;&gt;Don&amp;rsquo;t leave your notebook in your bag&lt;/h3&gt;
&lt;p&gt;Pull it out and put it on your desk when you get to work. Set it on the end-table when you relax at home. Make it a constant part of your daily routine.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://weblog.masukomi.org/images/2012/09/27/notebook_with_coffee.jpg&#34; title=&#34;Inside my Traveler&#39;s Notebook by koalazymonkey, on Flickr&#34;&gt;&lt;img src=&#34;http://farm4.staticflickr.com/3651/3591759602_fc9a85200c.jpg&#34; alt=&#34;Inside my Traveler&amp;rsquo;s Notebook&#34;&gt;&lt;/a&gt;&lt;br&gt;
(CC photo by koalazymonkey, on Flickr)&lt;/p&gt;
&lt;h2 id=&#34;step-three-write-every-idea-down-in-it-immediately&#34;&gt;Step Three: Write &lt;em&gt;every&lt;/em&gt; idea down in it &lt;em&gt;immediately&lt;/em&gt;.&lt;/h2&gt;
&lt;p&gt;Time and again you&amp;rsquo;ve sat at your desk, read an article, and had some little spark of an idea go off, and then kept reading and promptly forgot all about it. Don&amp;rsquo;t ever do that again. It doesn&amp;rsquo;t matter if it&amp;rsquo;s a &lt;em&gt;good&lt;/em&gt; idea or not. What matters is the act of capturing and exploring it. Whenever you have one of these ideas, stop your self immediately and write it down in your notebook. The article / video / TV show / boring business meeting will be there when you&amp;rsquo;re done.&lt;/p&gt;
&lt;p&gt;My ideas notebook travels in my backpack, which goes with me just about everywhere, but I also carry a tiny pocket reporters-notebook in my jacket pocket so that, if I have an idea while walking down the street, I can just stop walking, pull the pocket-notebook out, jot down my idea, and keep going. Interesting ideas are not allowed to escape undocumented.&lt;/p&gt;
&lt;p&gt;If you can take a few minutes to explore the idea, do so. You don&amp;rsquo;t have to flesh it out completely, just let the thoughts flow, unjudged, and unimpeded until they come to a natural stopping point.&lt;/p&gt;
&lt;p&gt;If you have an idea for a web interface, sketch it out. If you thought of a great way to market something, write it down. If you thought of a gotcha that might send everything swirling down the drain, write it down. Thought of some software that would make creating it easier? Write it down.&lt;/p&gt;
&lt;p&gt;It is very important that you &lt;em&gt;do not worry about the &lt;strong&gt;quality&lt;/strong&gt; of the ideas at this point.&lt;/em&gt; Just get them down on paper; good, bad, and mediocre.&lt;/p&gt;
&lt;p&gt;Repeat.&lt;/p&gt;
&lt;p&gt;The more you do this the more ideas you&amp;rsquo;ll capture, and not just because you&amp;rsquo;ll be accreting them over time. The act of capturing these ideas helps you to notice them more, and the more you notice, the more you write down. You&amp;rsquo;re having interesting ideas constantly, everyone is, but they slip through the graps of most people because they simply haven&amp;rsquo;t trained themselves to capture them.&lt;/p&gt;
&lt;h3 id=&#34;dont-use-it-for-grocery-lists&#34;&gt;Don&amp;rsquo;t use it for grocery lists&lt;/h3&gt;
&lt;p&gt;You&amp;rsquo;ve got to draw the line somewhere. Doodling doesn&amp;rsquo;t affect the quality of the content in your notebook because it doesn&amp;rsquo;t contain information your brain needs to parse, but things like grocery lists contain information that&amp;rsquo;s irrelevant to your projects and become random noise that pollutes an otherwise useful resource.&lt;/p&gt;
&lt;p&gt;With that said, you may find it to be a good place for to-do lists related to the projects in your notebook. I generally avoid this myself. My task-lists are constantly growing and changing.&lt;/p&gt;
&lt;h2 id=&#34;step-four-evaluate&#34;&gt;Step Four: Evaluate&lt;/h2&gt;
&lt;p&gt;The more you do this the more your brain will start buzzing about all these possible businesses you could be starting or projects you could be working on. Choose whichever one you&amp;rsquo;re most excited about at the moment and dive into it. With me, I just hit a point every couple days where my brain is so abuzz with ideas for some app I want to create that I have to just stop and write for the next ten to twenty minutes. It&amp;rsquo;s almost always one that I&amp;rsquo;ve accreted a page or two of notes on already.&lt;/p&gt;
&lt;p&gt;When you find one that you really think might be worth starting as a business, take some time to try and figure out every possible way you could monetize it. &lt;em&gt;How&lt;/em&gt; would you have to market it? &lt;em&gt;Where&lt;/em&gt; would you have to market it? How bad is the competition? If there isn&amp;rsquo;t any, take a minute to figure out why.  Do a little research and see if there are actually enough people interested in this type of thing.&lt;/p&gt;
&lt;p&gt;Draw circles and arrows. Make connections. Read &lt;a href=&#34;http://www.amazon.com/gp/product/1591843065/ref=as_li_ss_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1591843065&amp;amp;linkCode=as2&amp;amp;tag=masukomiorg-20&#34;&gt;Dan Roam&amp;rsquo;s: Back Of The Napkin&lt;/a&gt;. It is an incredible resource that is guaranteed to quickly, and easily improve the quality of your notes.&lt;/p&gt;
&lt;h2 id=&#34;why-this-works&#34;&gt;Why this works&lt;/h2&gt;
&lt;p&gt;At the start of this post I promised this technique would &amp;ldquo;…help you to massively multiply the quantity of ideas you have, your recall of past ideas, and your ability to create connections between ideas.&amp;rdquo; Here&amp;rsquo;s why:&lt;/p&gt;
&lt;p&gt;Physically writing creates links between the spacial and verbal parts of the brain, and studies have shown that by some strange quirk of biology, the brain thinks that writing something is the same as if we were actually doing it. This is similar to how the practice of actively visualizing something can trick the brain into thinking it&amp;rsquo;s actually doing it.&lt;/p&gt;
&lt;p&gt;Conversely, the more time you spend trying to recall something, the more likely you are to forget it in the future. It is better to look something up directly, than attempt to dredge it from your hazy recollection of a half-remembered thought stream.&lt;/p&gt;
&lt;p&gt;Studies have shown that writing things down longhand improves recall. In part this is due to the fact that it increases blood flow to the parts of the brain that handle memory. If &lt;em&gt;I&lt;/em&gt; remember correctly your recall is typically improved by 10%. Alas, I can&amp;rsquo;t find the study to quote for you.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;…a psych professor at Dominican University of California found that people who wrote down their goals, shared them with others, and maintained accountability for their goals were 33% more likely to achieve them, versus those who just formulated goals…* and a survey of note-taking studies found several examples where [longhand note-taking] helped students with recall and academic performance.&amp;rdquo; - &lt;a href=&#34;http://lifehacker.com/5738093/why-you-learn-more-effectively-by-writing-than-typing&#34;&gt;LifeHacker&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Now, there haven&amp;rsquo;t been any studies I&amp;rsquo;m aware of that address my claim as to quantity of ideas, but I find that entrepreneurial thinking is a skill that improves with practice, just like any other. Carrying an Entrepreneur&amp;rsquo;s notebook is just as much about having a central place to capture and connect ideas as it is about having a process that encourages you to think entrepreneurially on a regular basis. As I mentioned above, by getting in the habit of writing down every entrepreneurial idea the moment you have it you become more aware of them.&lt;/p&gt;
&lt;p&gt;As to my final claim of creating connections to ideas, that should be obvious. You&amp;rsquo;ll have a book of them that you&amp;rsquo;ll be regularly flipping through. How can you not make connections in that situation?&lt;/p&gt;
&lt;h2 id=&#34;what-next&#34;&gt;What next?&lt;/h2&gt;
&lt;p&gt;Go get yourself a blank notebook!&lt;/p&gt;
&lt;p&gt;If you want some helpful suggestions that will improve the usability of that notebook, continue on to &lt;a href=&#34;https://weblog.masukomi.org/2012/09/27/the-entrepreneurs-notebook-part-2&#34;&gt;Part 2&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;see-also&#34;&gt;See also:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://weblog.masukomi.org/2012/09/27/the-entrepreneurs-notebook-part-2&#34;&gt;Part 2 - Tips for more productive note-taking&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://weblog.masukomi.org/2012/09/27/the-entrepreneurs-notebook-part-2&#34;&gt;Part 3 - Searchability, Notebook choices, and Backups&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>The Entrepreneur&#39;s Notebook (part 2)</title>
      <link>https://weblog.masukomi.org/2012/09/27/the-entrepreneurs-notebook-part-2/</link>
      <pubDate>Thu, 27 Sep 2012 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2012/09/27/the-entrepreneurs-notebook-part-2/</guid>
      <description>&lt;h2 id=&#34;tips-for-more-productive-note-taking&#34;&gt;Tips for more productive note-taking&lt;/h2&gt;
&lt;h3 id=&#34;part-2-of-3&#34;&gt;Part 2 of 3&lt;/h3&gt;
&lt;p&gt;See also:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://weblog.masukomi.org/2012/09/27/the-entrepreneurs-notebook-part-1&#34;&gt;Part 1 - Introducing the Entrepreneur&amp;rsquo;s Notebook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://weblog.masukomi.org/2012/09/27/the-entrepreneurs-notebook-part-3&#34;&gt;Part 3 - Searchability, Notebook choices, and backups&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, you&amp;rsquo;ve decided you want to try keeping &lt;a href=&#34;https://weblog.masukomi.org/2012/09/27/the-entrepreneurs-notebook-part-1&#34;&gt;an Entrepreneur&amp;rsquo;s Notebook&lt;/a&gt;, or maybe you already do, but want some tips on making it more useful. Excellent. What follows are the techniques I&amp;rsquo;ve found to be most useful in my entrepreneurial notebooks. If you&amp;rsquo;ve got some tips of your own, please &lt;a href=&#34;mailto:masukomi@masukomi.org&#34;&gt;drop me a note&lt;/a&gt; or leave a comment.&lt;/p&gt;
&lt;h3 id=&#34;one-notebook-for-everything&#34;&gt;One notebook for everything&lt;/h3&gt;
&lt;p&gt;While there are some good arguments to be made for per-project notebooks, I&amp;rsquo;m going to &lt;em&gt;strongly&lt;/em&gt; recommend you avoid this approach until you find yourself with a project that is starting to overwhelm your main notebook and is likely to consume &lt;em&gt;many&lt;/em&gt; more pages.&lt;/p&gt;
&lt;p&gt;The problem with multiple notebooks is that two things will keep happening if you take this approach: 1) you won&amp;rsquo;t have the &amp;ldquo;correct&amp;rdquo; notebook with you when an idea strikes 2) you&amp;rsquo;ll end up with a lot of notebooks with almost nothing in them, which isn&amp;rsquo;t just wasteful, but leaves you feeling like you&amp;rsquo;ve let the ball drop on an idea.&lt;/p&gt;
&lt;h3 id=&#34;title-every-page-with-the-project-name&#34;&gt;Title every page with the project name&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/2012_9_17_titles_500x375.jpg&#34; alt=&#34;Entrepreneur&amp;rsquo;s Notebook Page Titles&#34;&gt;&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t worry about getting a good name for it at the start. Just write down something that describes it well enough for you to know what you were talking about like &amp;ldquo;Chihuahua Jackets&amp;rdquo;. I typically write my title over a thick black line that extends to the edge of the page and is always at the same place on the page so that as I&amp;rsquo;m flipping through pages I can easily find the ones pertaining to the idea I&amp;rsquo;m looking for.&lt;/p&gt;
&lt;p&gt;When I eventually do figure out a domain name for the site (and have bought it) I&amp;rsquo;ll go back and write the new name above the old titles, so that the new name is on all the pertinent pages.&lt;/p&gt;
&lt;h3 id=&#34;only-one-project-per-page&#34;&gt;Only one project per page&lt;/h3&gt;
&lt;p&gt;Sometimes you&amp;rsquo;ll just have one wee idea to write down. Don&amp;rsquo;t be tempted to use that empty space on the bottom of the last page. If you do you&amp;rsquo;ll end up with a notebook where everything is mixed together on every page and hard to find.&lt;/p&gt;
&lt;p&gt;Just flip to the next blank page, give it a title and start writing.  Don&amp;rsquo;t worry about wasting paper, because you &lt;em&gt;will&lt;/em&gt; have more thoughts on the topic later. When you do, use your Table of Contents (see below) or flip back until you find its page and add the new thoughts to it.&lt;/p&gt;
&lt;p&gt;Doing this, you&amp;rsquo;ll wind up with one project&amp;rsquo;s notes interspersed with pages of notes from other projects. &lt;em&gt;This isn&amp;rsquo;t a bad thing.&lt;/em&gt; When you&amp;rsquo;ve got an A5 sized notebook (or larger) you&amp;rsquo;ll have a decent amount of text (or drawings) on each page, and seeing the titles from your other projects as you&amp;rsquo;re looking for something will help keep those projects fresh in your mind.&lt;/p&gt;
&lt;p&gt;I find that a typical pocket-sized Moleskine is detrimental to this kind of note-taking because you simply can&amp;rsquo;t fit much on a page. The extra portability just isn&amp;rsquo;t worth it in the end.&lt;/p&gt;
&lt;h3 id=&#34;no-spare-pages&#34;&gt;No spare pages&lt;/h3&gt;
&lt;p&gt;Sooner or later you&amp;rsquo;ll have an idea where you&amp;rsquo;ll be tempted to leave a few blank pages at the end of your note for the thoughts you plan on adding later. &lt;em&gt;Don&amp;rsquo;t do this&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;You will never guess the right number and you&amp;rsquo;ll end up with notebook filled with swaths of blank pages, which leaves you feeling that you&amp;rsquo;ve failed to flush out an idea, and that you&amp;rsquo;ve been wasteful to boot. Plus, good notebooks aren&amp;rsquo;t cheap.&lt;/p&gt;
&lt;h3 id=&#34;number-each-page&#34;&gt;Number each page&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/2012_9_17_page_numbers_500x375.jpg&#34; alt=&#34;Entrepreneur&amp;rsquo;s Notebook Page Numbers&#34;&gt;&lt;/p&gt;
&lt;p&gt;This will be important in the next step, but don&amp;rsquo;t bother numbering them all in advance. That&amp;rsquo;s just annoying. Number them as you go. Maybe pre-numbering a dozen or so pages ahead if you really feel like it.&lt;/p&gt;
&lt;h3 id=&#34;create-an-table-of-contents&#34;&gt;Create an Table of Contents&lt;/h3&gt;
&lt;p&gt;It&amp;rsquo;s easier to do than you might think, especially if you&amp;rsquo;ve followed the two steps above. First, set aside the first 3-5 pages of your notebook, and write &amp;ldquo;Table of Contents&amp;rdquo; on the first one. This is the only exception to the &amp;ldquo;No Spare Pages&amp;rdquo; rule.&lt;/p&gt;
&lt;p&gt;Since you&amp;rsquo;ve only got one project per page, each page has a page number, and you&amp;rsquo;re titling each page by project, it becomes much easier to reference where things live in your notebook.&lt;/p&gt;
&lt;p&gt;When a new project / topic gets entered flip back to the table of contents and add a new line. I recommend skipping one line between projects, because it&amp;rsquo;s hard to predict which ones your brain will get all excited about in the long run, and the ones that do will end up with a lot of associated pages. Write down the name of the project and follow it with the page number of the page you just added about it. Just write in the new numbers as you add pages. For example:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Entrepreneurs Notebook: 11, 27, 29-32, 44&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I find it easiest to add to, or update the table of context when I&amp;rsquo;m flipping through the book later. Trying to remember to write down the page number in the index &lt;em&gt;when&lt;/em&gt; I&amp;rsquo;m having the both risks distracting yourself (&amp;ldquo;oh yeah, I forgot about that other project…&amp;rdquo;) and feels a bit too much like work. My table of contents frequently languishes until I am reviewing or need to find something specific, then I&amp;rsquo;ll go through and add the new entries that hadn&amp;rsquo;t been noted since the last time. Usually it&amp;rsquo;s just a handful.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve got a page that really important to the project, and you&amp;rsquo;re likely to need to reference repeatedly, then circle (or similarly highlight) the page number here.&lt;/p&gt;
&lt;h3 id=&#34;doodle-in-it&#34;&gt;Doodle in it&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/2012_9_17_doodles_500x375.jpg&#34; alt=&#34;Entrepreneur&amp;rsquo;s Notebook Doodles&#34;&gt;&lt;/p&gt;
&lt;p&gt;Seriously. Even if it&amp;rsquo;s just silly swirly things to alleviate the boredom of a meeting. &lt;em&gt;The act of using your notebook for something as inconsequential as doodling lowers the barrier to writing in it.&lt;/em&gt; If you just use it for &amp;ldquo;serious&amp;rdquo; stuff then you&amp;rsquo;ll be more hesitant to open it up to note those half-formed ideas that are still just tickling the edges of your brain.&lt;/p&gt;
&lt;p&gt;A new notebook can be somewhat daunting. I recommend that the first thing you do with a new notebook is to give it a title page, and doodle on it. Once you&amp;rsquo;ve done that it&amp;rsquo;s no longer perfect, and pristine. It&amp;rsquo;s no longer limited to pretty or good things. Now, you don&amp;rsquo;t have to worry about the quality of the stuff that comes next.&lt;/p&gt;
&lt;h3 id=&#34;emphasize-the-important&#34;&gt;Emphasize the Important&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/2012_9_17_highlight_500x375.jpg&#34; alt=&#34;Entrepreneur&amp;rsquo;s Notebook Highlights&#34;&gt;&lt;/p&gt;
&lt;p&gt;Wrote something down that&amp;rsquo;s particularly important? Draw a box around it. Circle it. Underline it. Use big arrows. Use red ink. Do whatever it takes to emphasize the things that are important to you. It&amp;rsquo;ll make them stick out when flipping through, make them easier to find when searching, and just make your notebook more interesting looking.&lt;/p&gt;
&lt;h3 id=&#34;save-non-business-ideas-too&#34;&gt;Save non-business ideas too&lt;/h3&gt;
&lt;p&gt;While I wouldn&amp;rsquo;t recommend using your Entrepreneur&amp;rsquo;s Journal for diary style journaling, or throw-away things like grocery lists, you are going to have some interesting thoughts that aren&amp;rsquo;t necessarily related to business. Maybe you&amp;rsquo;ll encounter a great quote. Maybe you&amp;rsquo;ll watch a &lt;a href=&#34;http://www.ted.com/talks&#34;&gt;a great talk&lt;/a&gt; and think of some new goal to work towards. This will help reinforce the idea that &lt;em&gt;this&lt;/em&gt; is where to go when you have a neat idea.&lt;/p&gt;
&lt;h3 id=&#34;accept-the-rough-edges-of-life&#34;&gt;Accept the rough edges of life&lt;/h3&gt;
&lt;p&gt;Doodling, especially if you doodle in margins, has the side-effect of making it easier to accept the times when you&amp;rsquo;ll need to cross out a misspelled word, or scratch out an &amp;ldquo;incorrect&amp;rdquo; thought.&lt;/p&gt;
&lt;p&gt;Accept that you &lt;em&gt;will&lt;/em&gt; make mistakes and scratch things out. It&amp;rsquo;s ok. This isn&amp;rsquo;t a notebook of perfect things. It&amp;rsquo;s a notebook of thoughts, and ideas.&lt;/p&gt;
&lt;h3 id=&#34;making-things-readable&#34;&gt;Making things readable.&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2012/09/27/notebook.jpg&#34; alt=&#34;fancy hand lettering&#34;&gt;&lt;br&gt;
(CC &lt;a href=&#34;http://flic.kr/p/9pYGjb&#34;&gt;INK photo&lt;/a&gt; by anroKath on Flickr)&lt;/p&gt;
&lt;p&gt;Most people I know are convinced that their handwriting is crap. Some of them are correct in that belief. Improving it really isn&amp;rsquo;t that hard though. All it takes is a little practice, and a little mindfulness. &lt;a href=&#34;http://www.austinkleon.com/2012/05/23/how-to-improve-your-handwriting/&#34;&gt;Austin Kleon has improved his&lt;/a&gt; by finding examples of beautiful handwriting he admires and working to emulate it. My recommendation, if you want to improve yours, is to write the alphabet once a day, and &lt;em&gt;be mindful as you write&lt;/em&gt;. If you create a particularly egregious piece of handwriting, scratch it out and redo it, or endeavor to make the words that follow it as readable as possible.&lt;/p&gt;
&lt;p&gt;As a side-effect improving your handwriting will increase the chances that handwriting recognition software (OCR) will be able to understand it (see &lt;a href=&#34;https://weblog.masukomi.org/2012/09/27/the-entrepreneurs-notebook-part-3&#34;&gt;Part 3&lt;/a&gt;)&lt;/p&gt;
&lt;h2 id=&#34;see-also&#34;&gt;See also:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://weblog.masukomi.org/2012/09/27/the-entrepreneurs-notebook-part-1&#34;&gt;Part 1 - Introducing the Entrepreneur&amp;rsquo;s Notebook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://weblog.masukomi.org/2012/09/27/the-entrepreneurs-notebook-part-3&#34;&gt;Part 3 - Searchability, Notebook choices, and backups&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>The Entrepreneur&#39;s Notebook (part 3)</title>
      <link>https://weblog.masukomi.org/2012/09/27/the-entrepreneurs-notebook-part-3/</link>
      <pubDate>Thu, 27 Sep 2012 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2012/09/27/the-entrepreneurs-notebook-part-3/</guid>
      <description>&lt;h2 id=&#34;notebook-choices-and-backups&#34;&gt;Notebook choices, and backups&lt;/h2&gt;
&lt;h3 id=&#34;part-3-of-3&#34;&gt;Part 3 of 3&lt;/h3&gt;
&lt;p&gt;See also:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://weblog.masukomi.org/2012/09/27/the-entrepreneurs-notebook-part-1&#34;&gt;Part 1 - Introducing the Entrepreneur&amp;rsquo;s Notebook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://weblog.masukomi.org/2012/09/27/the-entrepreneurs-notebook-part-2&#34;&gt;Part 2 - Tips for more productive note-taking&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;what-about-backups-and-searchability&#34;&gt;What about backups and searchability?&lt;/h2&gt;
&lt;p&gt;This is one place where the digital age is unquestionably superior. Dropbox, iCloud, email… there are myriad ways to back up your digital writing, and text is easy to search. On the mac, Spotlight gives you great search across every document you&amp;rsquo;ve ever written and searching within a document is easy in any text editor. Paper… not so much.&lt;/p&gt;
&lt;h2 id=&#34;searchability&#34;&gt;Searchability&lt;/h2&gt;
&lt;p&gt;In practice though, searchability is not a big deal, especially if you&amp;rsquo;ve got a Table of Contents (see &lt;a href=&#34;https://weblog.masukomi.org/2012/09/27/the-entrepreneurs-notebook-part-2&#34;&gt;Part 2&lt;/a&gt;), but even without one, you&amp;rsquo;re just flipping through a notebook&amp;rsquo;s worth of pages, that are all clearly titled by project. Finding your notes on a given idea turns out to be fast and easy, and as I mentioned in &lt;a href=&#34;https://weblog.masukomi.org/2012/09/27/the-entrepreneurs-notebook-part-1&#34;&gt;Part 1&lt;/a&gt;, the process of flipping through pages helps to keep other ideas fresh, and connect things that wouldn&amp;rsquo;t otherwise be connected.&lt;/p&gt;
&lt;h2 id=&#34;backups&#34;&gt;Backups&lt;/h2&gt;
&lt;p&gt;This, is a notable limitation. The best strategy I&amp;rsquo;ve found is to simply take a picture of it. If you&amp;rsquo;ve got a smartphone the quality should be plenty good to zoom in on your computer and read whatever&amp;rsquo;s there. If you don&amp;rsquo;t have a smartphone any digital camera should have decent enough resolution.&lt;/p&gt;
&lt;p&gt;I should call out the &lt;a href=&#34;http://www.moleskine.com/au/collections/model/evernote-smart-notebooks&#34;&gt;Evernote Smart Notebook&lt;/a&gt;. &amp;ldquo;For the Evernote Smart Notebook by Moleskine, &lt;a href=&#34;https://evernote.com&#34;&gt;Evernote&lt;/a&gt; finds the dot pattern and even corrects the skew of the photo. This means that the images that end up in your account are perfect for Evernote’s handwriting recognition, so that you’ll be able to find you thoughts anytime. &amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2012/09/27/evernote_smart_notebook.png&#34; alt=&#34;Evernote Smart Notebook&#34;&gt;&lt;/p&gt;
&lt;p&gt;Having had personal experience with handwriting recognition I can say that it absolutely can work, &lt;em&gt;if you have clean handwriting&lt;/em&gt;, but, if you&amp;rsquo;re scribbling down ideas as fast as they come to you, you&amp;rsquo;re handwriting is not going to be &amp;ldquo;clean&amp;rdquo;, and OCR software is terrible about dealing with the more visual note-taking styles. Imagine you wrote &amp;ldquo;bigger&amp;rdquo; in a bubble with an arrow pointing to a diagram? How is the software supposed to know where to put it in a text only version of your page? I wouldn&amp;rsquo;t even know where to put it. With that said, &lt;a href=&#34;http://evernote.com/&#34;&gt;Evernote&lt;/a&gt; is probably the best tool currently available for backing up your notebook pages, and there are very few people trying to tackle this particular problem.&lt;/p&gt;
&lt;h3 id=&#34;scanning-vs-photographing&#34;&gt;Scanning vs. Photographing&lt;/h3&gt;
&lt;p&gt;In general scanning a bound book is annoying. You can&amp;rsquo;t run the pages through an automated scanner, and on a flatbed scanner you have to press down consistently on the spine for the length of the scan or risk having a  shadow over everything written close to the spine.&lt;/p&gt;
&lt;p&gt;While scanning is always going to take longer, and be more annoying than simply photographing your notebook&amp;rsquo;s pages, it will always get you better results. But, you have to ask yourself if it really matters enough to bother. In my experience it doesn&amp;rsquo;t. I almost never reference scans, and if I did manage to loose a notebook I&amp;rsquo;d previously photographed or scanned I suspect that I&amp;rsquo;d just print out the relevant pictures and staple them into my current notebook, or just copy the info.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&#34;http://jimwhittle.com/boundless.html&#34;&gt;Boundless Notebook&lt;/a&gt; mentioned below sidesteps the major scanning problems by letting you use standard 8 1/2&amp;rdquo; x 11&amp;quot; paper which you fold in half (approximately A5 size). When you&amp;rsquo;re done you can pull it out, flatten the fold, and put in in a scanner with an automatic feed, or do them one by one on a flatbed scanner, without having to hold down the spine and worrying about shadows. As a bonus, they&amp;rsquo;re easy to put back together when you&amp;rsquo;re done.&lt;/p&gt;
&lt;p&gt;If having high quality backups is important to you, I can&amp;rsquo;t think of a better solution than the Boundless Notebook, especially when combined with an automatic feed scanner, which you&amp;rsquo;ll frequently find on those ginormous copy/scan/fax machines at work.&lt;/p&gt;
&lt;h4 id=&#34;scanning-tip&#34;&gt;Scanning Tip&lt;/h4&gt;
&lt;p&gt;Most scanners have a white surface behind whatever you&amp;rsquo;re scanning in order to reflect the maximum amount of light back to the scanning head. This is a problem when scanning something with writing on both sides because it can make the back side visible through the paper. To get around this, put a piece of black construction paper behind whatever you&amp;rsquo;re scanning. The light that passes through your paper won&amp;rsquo;t be reflected back to the scanning head. You can try scotch-taping the black paper to the top of your scanner but it may cause issues with automatic-feeds.&lt;/p&gt;
&lt;h2 id=&#34;notebook-suggestions&#34;&gt;Notebook suggestions&lt;/h2&gt;
&lt;p&gt;If I was to recommend a traditional notebook I&amp;rsquo;d vote for the &lt;a href=&#34;http://rhodiapads.com/collections_boutique_webnotebook_A5black.shtml&#34;&gt;Rhodia Webnotebook&lt;/a&gt; in the A5 size with &amp;ldquo;Dot Grid&amp;rdquo; pages. A5 is roughly the same size as an 8 1/2&amp;quot; x 11&amp;quot; page folded in half. It&amp;rsquo;s small enough to carry around but big enough to fit decent sized sketches of your next brilliant ideas.  A dot grid is what you&amp;rsquo;d get if you removed all the lines from grid paper but left a dot where each of the intersections used to be; a literal grid of dots. Grid paper feels like it simply has too much on it for me, and lined paper feels too restricted to writing. Dot grids provide a nice balance. The dots stay out of the way. Your paper isn&amp;rsquo;t covered with lines. Your writing stays relatively straight, and it&amp;rsquo;s easy to sketch things with the grid of dots to guide you.&lt;/p&gt;
&lt;p&gt;If the dot grid doesn&amp;rsquo;t seem your style, I&amp;rsquo;d recommend picking up an &lt;a href=&#34;http://www.amazon.com/gp/product/8883701143/ref=as_li_ss_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=8883701143&amp;amp;linkCode=as2&amp;amp;tag=masukomiorg-20&#34;&gt;A5 (&amp;ldquo;Large&amp;rdquo;) Blank Moleskine&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://flic.kr/p/4FqvMr&#34; title=&#34;Behance Dot Grid Notebook by retro traveler, on Flickr&#34;&gt;&lt;img src=&#34;http://farm3.staticflickr.com/2321/2415196527_c9ac60fafb.jpg&#34; alt=&#34;Behance Dot Grid Notebook&#34;&gt;&lt;/a&gt;&lt;br&gt;
(&lt;strong&gt;Look closely to see the dot grid&lt;/strong&gt; - CC Photo by retro traveler, on Flickr)&lt;/p&gt;
&lt;p&gt;Rhodia&amp;rsquo;s Dot Grid notebooks are somewhat hard to find, but you can get one &lt;a href=&#34;http://www.jetpens.com/search?q=rhodia+webnotebook+a5+dot+grid&#34;&gt;from JetPens&lt;/a&gt; along with some nice writing utensils and free shipping, or pick up a &lt;a href=&#34;http://www.amazon.com/gp/product/8883701143/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=masukomiorg-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=8883701143&#34;&gt;Large Blank Moleskine from Amazon&lt;/a&gt;. Moleskine has recently come out with the &lt;a href=&#34;http://blog.evernote.com/2012/08/24/the-new-evernote-smart-notebook-by-moleskine/&#34;&gt;Evernote Smart Notebook&lt;/a&gt; (see the section on this above) which comes in a variety of sizes, in ruled and dot grid variants.&lt;/p&gt;
&lt;p&gt;Another interesting option is the &lt;a href=&#34;http://jimwhittle.com/boundless.html&#34;&gt;Boundless Notebook&lt;/a&gt; by Jim Whittle. It&amp;rsquo;s essentially a large piece of leather with a couple carefully placed slits that allow you to slide your own paper in. What&amp;rsquo;s cool about this, is that the more creative folks out there can pre-print your pages with whatever structure best suits your needs. Kind of like those pre-printed day-planners, only &lt;em&gt;designed by you&lt;/em&gt; to meet your needs perfectly. The downside to this notebook is that you&amp;rsquo;ll need to find something to do with the pages once you&amp;rsquo;ve filled them and need to insert new ones. But, maybe that&amp;rsquo;s a good time to just photograph them or scan them in for backup.&lt;/p&gt;
&lt;iframe src=&#34;http://player.vimeo.com/video/28688093&#34; width=&#34;500&#34; height=&#34;281&#34; frameborder=&#34;0&#34; webkitAllowFullScreen mozallowfullscreen allowFullScreen&gt;&lt;/iframe&gt;
&lt;p&gt;And, of course, there&amp;rsquo;s &lt;a href=&#34;http://www.midori-japan.co.jp/tr/english/&#34;&gt;the Traveler&amp;rsquo;s Notebook by Midori&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://flic.kr/p/a8RT44&#34; title=&#34;简单一点让皮质本身去散发魅力-达米畅的TN by guccio@文房具社, on Flickr&#34;&gt;&lt;img src=&#34;http://farm7.staticflickr.com/6001/5996158613_7bb873243e.jpg&#34; alt=&#34;简单一点让皮质本身去散发魅力-达米畅的TN&#34;&gt;&lt;/a&gt;&lt;br&gt;
(CC photo by guccio@文房具社, on Flickr)&lt;/p&gt;
&lt;p&gt;This gorgeous soft leather notebook comes in two sizes and has an almost cult-like following, and a good variety of accessories, but the large version&amp;rsquo;s unique sizing means you can only get refills specifically designed for it, and there are only a handful of vendors in the US. There&amp;rsquo;s &lt;a href=&#34;http://www.gourmetpens.com/2012/02/resor-shop-review-midori-travelers.html&#34;&gt;a good review of the Traveler&amp;rsquo;s Notebook here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve fallen in love with my Traveler&amp;rsquo;s Notebook.&lt;/p&gt;
&lt;h2 id=&#34;choosing-the-right-instrument&#34;&gt;Choosing the right instrument&lt;/h2&gt;
&lt;p&gt;In my opinion, finding a good writing instrument greatly enhances and encourages the continued use of your notebook. It doesn&amp;rsquo;t matter what pen, or pencil, you use, and it certainly doesn&amp;rsquo;t have to be anything fancy or expensive. What matters is that you enjoy the one you&amp;rsquo;ve chosen. Maybe you choose your pens for the looks, maybe for the feel, or the way the ink flows. Whatever makes you happy.&lt;/p&gt;
&lt;p&gt;For a while my go-to pen has been the &lt;a href=&#34;http://www.staples.com/Staples-OptiFlow-Rollerball-Pens-Fine-Point-Black-Dozen/product_486573&#34;&gt;OptiFlow Rollerball from Staples&lt;/a&gt;, because I love how smoothly it writes, and how much ink it flows onto the page, and they have them in the supply closet at work ;) But I&amp;rsquo;m starting to use the &lt;a href=&#34;http://www.jetpens.com/Pilot-Double-Sided-Brush-Pen-Hard-Tip-Black-Gray-Ink/pd/2740&#34;&gt;Pilot Double-Sided Brush Pen&lt;/a&gt; for writing and the &lt;a href=&#34;http://www.jetpens.com/Kuretake-No.-13-Fountain-Brush-Pen-Black-Body/pd/2660&#34;&gt;Kuretake No. 13 Fountain Brush Pen&lt;/a&gt; for drawing. I love pens with thick confident lines. They remind me of the felt-tip pen my father always used to use.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re just &amp;ldquo;meh&amp;rdquo; on your current tool, check out &lt;a href=&#34;http://www.jetpens.com/guides&#34;&gt;the Selection Guides at JetPens&lt;/a&gt;. Then buy yourself a sampler of  pens that sound interesting to you, and give them all a go.&lt;/p&gt;
&lt;h2 id=&#34;interested-in-getting-an-entrepreneurs-notebook&#34;&gt;Interested in getting an Entrepreneur&amp;rsquo;s Notebook?.&lt;/h2&gt;
&lt;p&gt;If 150 people express an interest, in an Entrepreneur&amp;rsquo;s Notebook style refill (supporting the workflow described in &lt;a href=&#34;https://weblog.masukomi.org/2012/09/27/the-entrepreneurs-notebook-part-2&#34;&gt;part 2&lt;/a&gt;) I&amp;rsquo;ll make one. It would have a section laid out for your Table of contents, a dark line to go below the project name at the top of each page, and a circle in the lower outside corners for the page numbers, probably with a dot-grid body. They&amp;rsquo;d be designed as refills for the &lt;a href=&#34;http://www.midori-japan.co.jp/tr/english/trnotebook/products/&#34;&gt;Midori&amp;rsquo;s Traveler&amp;rsquo;s Notebook&lt;/a&gt;, but could also be used as stand-alone notebooks.&lt;/p&gt;
&lt;p&gt;Please, &lt;a href=&#34;http://eepurl.com/pYqEn&#34;&gt;let me know you&amp;rsquo;re interested&lt;/a&gt; so that we can make this happen. ;)&lt;/p&gt;
&lt;h2 id=&#34;references&#34;&gt;References:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://online.wsj.com/article/SB10001424052748704631504575531932754922518.html&#34;&gt;Wall Street Journal - How Handwriting Boosts The Brain&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.lifehack.org/articles/productivity/writing-and-remembering-why-we-remember-what-we-write.html&#34;&gt;Lifehacker - Writing and Remembering: Why We Remember What We Write&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://lifehacker.com/5738093/why-you-learn-more-effectively-by-writing-than-typing&#34;&gt;LifeHacker - Why You Learn More Effectively By Writing Than Typing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://psychology.about.com/od/educationalpsychology/tp/effective-learning.htm&#34;&gt;About.com - How to Become a More Effective Learner&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://psychology.about.com/b/2009/04/18/tip-of-the-tongue-research.htm&#34;&gt;About.com - Word on the Tip of Your Tongue? Study Suggests You&amp;rsquo;re Better Off Looking Up The Answer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;www.positivityblog.com/index.php/2010/09/30/write-things-down/&#34;&gt;Positivity Blog - 7 Powerful Reasons Why You Should Write Things Down&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.recordingthoughts.com/index.php/archives/2011/12/09/one-notebook-or-many-part-1-the-case-for-one-notebook/&#34;&gt;Recording Thoughts: One Notebook or Many?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;see-also&#34;&gt;See also:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://weblog.masukomi.org/2012/09/27/the-entrepreneurs-notebook-part-1&#34;&gt;Part 1 - Introducing the Entrepreneur&amp;rsquo;s Notebook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://weblog.masukomi.org/2012/09/27/the-entrepreneurs-notebook-part-2&#34;&gt;Part 2 - Tips for more productive note-taking&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Appcelerator: extortion is just part of the job...</title>
      <link>https://weblog.masukomi.org/2012/09/22/appcelerator-extortion-is-just-part-of-the-job-dot-dot-dot/</link>
      <pubDate>Sat, 22 Sep 2012 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2012/09/22/appcelerator-extortion-is-just-part-of-the-job-dot-dot-dot/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.appcelerator.com/&#34;&gt;Appcelerator&lt;/a&gt; was recently &lt;a href=&#34;http://developer.appcelerator.com/question/142516/warning-licensing-of-titanium-chaotic-and-unclear-how-to-avoid-extortionate-fees&#34;&gt;caught extorting one of its free users, and then that users client&lt;/a&gt; for £5000, and then others spoke up to say it&amp;rsquo;d happened to them too.&lt;/p&gt;
&lt;p&gt;Initially it looked like it could have either been a bullshit company policy, or just a salesperson lacking in morals. In the end, it turns out to be both, but the response by the CEO is why I would strongly encourage you to never use an Appcelerator product (free or otherwise) for your project.&lt;/p&gt;
&lt;p&gt;He starts out with a kind of hand-wavey apology that doesn&amp;rsquo;t really address what happened, and mentions &amp;ldquo;confusion over licensing&amp;rdquo; when the user&amp;rsquo;s real confusion was why they were being extorted. But, eventually he added a comment that did address what happened &amp;hellip; kindof:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Let me first say that you are right, this should not have happened and it is totally unacceptable to have contacted your customer if that is what you say has happened. We should NEVER do that EVER without your permission or without your assistance. This is WRONG and if this happened, it&amp;rsquo;s not appropriate. I don&amp;rsquo;t know how to be more clear than that.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;At first read, this part sounds good, but then you notice one very subtle, but important, thing that&amp;rsquo;s left out. He mentions that it&amp;rsquo;s &amp;ldquo;unacceptable&amp;rdquo; for them to have contacted the user&amp;rsquo;s customer&amp;hellip; but there is *no mention of it being unacceptable to attempt to extort money from the user themselves. *&lt;/p&gt;
&lt;p&gt;And then there&amp;rsquo;s the &amp;ldquo;if that is what you say has happened&amp;rdquo; clause. This is after they spent time looking into the problem, and then proceeded to apologize for it. The apology implicitly states that this incident occurred, otherwise why would you apologize? To essentially say &amp;ldquo;I&amp;rsquo;m truly sorry for our actions but really you could just be a lying schmuck&amp;rdquo; That&amp;rsquo;s bullshit. You should either have the balls to accept that the bad thing happened or to call the user a liar. But that&amp;rsquo;s not the truly egregious part&amp;hellip;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;However, not everything is done to be malicious and we certainly NEVER intend to extort money from anyone. I simply don&amp;rsquo;t see how you can draw a straight line from spending literally tens of MILLIONS of dollars this year alone on Titanium and providing it for FREE to well over 98% of the users &amp;ndash; and then say that we&amp;rsquo;re &amp;ldquo;extorting people&amp;rdquo;. Let&amp;rsquo;s get some perspective.&lt;/p&gt;
&lt;p&gt;Was the sales rep over eager and trying to hussle to get a deal? Probably. In my opinion, that&amp;rsquo;s the job of the rep and we work with hundreds of new paying customers each quarter and we&amp;rsquo;ve only had a few complaints about it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;ldquo;&amp;hellip;we certainly never INTEND to extort money from anyone&amp;hellip;&amp;rdquo; (emphasis mine). You don&amp;rsquo;t intend it but&amp;hellip; but what? This is just &amp;ldquo;one of those things&amp;rdquo; that happens from time to time?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;&amp;hellip;we&amp;rsquo;ve only had a few complaints about it.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Wait&amp;hellip; &lt;strong&gt;&lt;em&gt;what?!&lt;/em&gt;&lt;/strong&gt; You&amp;rsquo;ve had &lt;em&gt;multiple&lt;/em&gt; complaints about your salespeople attempting to extort money from users in the past&amp;hellip; and they&amp;rsquo;re still doing it?!&lt;/p&gt;
&lt;p&gt;Notice, that in none of the CEOs responses is any mention of having reprimanded, or better yet, fired the salesperson in question. There is no mention of talking to the whole sales team to make sure they understand that they are not allowed to attempt to extort people. Obviously, since this has happened multiple times in the past this is either not something the salespeople understand, or something the company is actively encouraging.&lt;/p&gt;
&lt;p&gt;If the former it speaks of a hiring process so broken that it repeatedly hires individuals with moral compasses so broken that they don&amp;rsquo;t understand that it&amp;rsquo;s wrong to extort people, and so stupid as to not realize that it&amp;rsquo;s illegal. If the latter, then you&amp;rsquo;ve got a company with a broken moral compass that is spreading that disease to its employees.&lt;/p&gt;
&lt;p&gt;There is one other logical explanation. They&amp;rsquo;ve had one particular salesperson who has been repeatedly extorting people for money, received multiple complaints, and for some inexplicable reason is &lt;em&gt;still employed&lt;/em&gt; there.&lt;/p&gt;
&lt;p&gt;So, which is it Appcelerator? Are you morally bankrupt and encouraging your employees to follow your lead? Are you repeatedly hiring morally bankrupt individuals? Or, are you so lacking in concern for your community that you refuse to fire a salesperson who keeps extorting its members?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I hope you&amp;rsquo;ll give us the same respect and professionalism as well.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You know, I think I&amp;rsquo;ll do just that:  &amp;ldquo;Fuck you Appcelerator.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Oh, was that not respectful, or professional? NEITHER IS &lt;em&gt;REPEATEDLY EXTORTING YOUR USERS&lt;/em&gt; YOU FUCK!&lt;/p&gt;
&lt;p&gt;The iPad app we&amp;rsquo;ve been working on is currently using a very useful plugin that can only be found in the Appcelerator ecosystem. I shall be ripping that out and finding some other solution to the problem. There are plenty of competitors in this space. I think it likely that none of them consider extortion an unpleasant but acceptable consequence of having salespeople.&lt;/p&gt;
&lt;h2 id=&#34;disclaimer&#34;&gt;Disclaimer:&lt;/h2&gt;
&lt;p&gt;This is an opinion piece. The logical conclusions are ones I have come to from reading the public comments by their CEO. It is entirely possible that I am 100% wrong.&lt;/p&gt;
&lt;p&gt;But, if it were my company (and I&amp;rsquo;ve had a few small ones), everyone who was caught attempting to extort money from my customers would be handed a box and fired on the spot, along with anyone else who was found to be aware of the activity. If it turned out to be a persistent problem I would fire whoever had been hiring these broken excuses for humanity. I would call &lt;em&gt;everyone&lt;/em&gt; together after each incident and make it clear that this type of behavior was 100% unacceptable. I would tell them exactly why person X had been fired, and I would make sure that nothing like that ever happened again.&lt;/p&gt;
&lt;p&gt;I would call up the user who had been extorted and personally apologize, on the phone (not via a forum), let them know the salesperson had been fired and give them an free unlimited lifetime subscription to whatever the most valuable plan on offer was.  Morals are not trainable. Simply saying you&amp;rsquo;re sorry, but noting that this stuff doesn&amp;rsquo;t happen very often is so fucking wrong it isn&amp;rsquo;t funny.&lt;/p&gt;
&lt;h3 id=&#34;do-not-work-with-this-company-please&#34;&gt;Do not work with this company. Please.&lt;/h3&gt;
&lt;p&gt;You&amp;rsquo;re better than that. 99.99999% of humanity is better than that, and if you&amp;rsquo;ve got clients you definitely don&amp;rsquo;t want to risk your reputation with them by working with a company this morally bankrupt. If you&amp;rsquo;re a one person operation you don&amp;rsquo;t want to end up having to rewrite your entire app, or hire lawyers when they start demanding payment for their free service, or additional payment for one of their paid ones.&lt;/p&gt;
&lt;h2 id=&#34;update&#34;&gt;Update:&lt;/h2&gt;
&lt;p&gt;It should be noted that my quotes were taken from the CEOs comments to his &amp;ldquo;accepted answer&amp;rdquo;. You may need to click to expand the comments to see them.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Cheshire [Definition]</title>
      <link>https://weblog.masukomi.org/2012/09/20/cheshire-definition/</link>
      <pubDate>Thu, 20 Sep 2012 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2012/09/20/cheshire-definition/</guid>
      <description>&lt;p&gt;Cheshire: the collective noun for sidecar motorcycles (alternately known as &amp;ldquo;hacks&amp;rdquo;) owing to the extraordinarily high probability of generating smiles in the people they pass relative to all other vehicles.&lt;/p&gt;
&lt;p&gt;Usage:&lt;/p&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Upon encountering a cheshire of sidecars one should strongly consider playing the lottery.&amp;rdquo; or  &amp;ldquo;Wow! There goes a cheshire of hacks.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
</description>
    </item>
    
    <item>
      <title>Blog post dates: Precision, or freshness. What&#39;s important?</title>
      <link>https://weblog.masukomi.org/2012/08/24/blog-post-dates-precision-or-freshness/</link>
      <pubDate>Fri, 24 Aug 2012 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2012/08/24/blog-post-dates-precision-or-freshness/</guid>
      <description>&lt;p&gt;Not too long ago I sent out a question. I asked people when, and why, dates were important to them on blog posts. The responses were revealing, both for what they did, and did not contain.&lt;/p&gt;
&lt;p&gt;There are some situations where having a date on your blog posts is obviously needed. If you write about anything techy you absolutely need them. I come across tons of sites with perfectly good code examples, that have been obsolete for years. Ditto for how-to&amp;rsquo;s related to software and operating systems. The other place where dates are critical is anything related to news or politics.&lt;/p&gt;
&lt;p&gt;Basically, if you&amp;rsquo;ve written something that will be used as research material later on, you need a date. Everyone seems to agree on that. But, what about pieces where the passage of time really doesn&amp;rsquo;t have much of an effect. For example, I wrote &lt;a href=&#34;https://weblog.masukomi.org/2012/07/06/task-order-up&#34;&gt;a post about a paper-based task management system&lt;/a&gt;. Read it today, read it two years from today&amp;hellip; it doesn&amp;rsquo;t impact the usefulness or relevancy of the content at all. And that was the basis of my questioning. If you had a blog filled with posts like that, would there be any real value in including dates on the post?&lt;/p&gt;
&lt;p&gt;The responses were overwhelmingly &amp;ldquo;YES&amp;rdquo;, but not for the reasons I&amp;rsquo;d expected.&lt;/p&gt;
&lt;h2 id=&#34;freshness-and-precision&#34;&gt;Freshness and Precision&lt;/h2&gt;
&lt;p&gt;While they used different words, everyone was in agreement that an indication of freshness was &lt;em&gt;very&lt;/em&gt; important to them. Sometimes, it was just to help them know if the blog had been abandoned or not. More often, it was simply to know if the information in the posts was still relevant or not.&lt;/p&gt;
&lt;p&gt;What was interesting, was that when pressed for details, almost everyone claimed that a simple freshness indicator (e.g. &amp;ldquo;three months ago&amp;rdquo;) wasn&amp;rsquo;t sufficient. They claimed that they needed to-the-day precision. They claimed that having this level of precision allowed them to compare it to what was happening in their lives at the time; they could look compare the date to their calendar, and see what they were doing then.&lt;/p&gt;
&lt;p&gt;These claims seemed&amp;hellip; suspect to me. They felt like the type of answers people give when they&amp;rsquo;re trying to explain something they&amp;rsquo;ve accepted as true, or necessary, but have never actually thought about. Like, the idea that going out in the cold will lead to catching a cold.* So, I pressed for details. I wanted someone to give me a real world situation when they would look at a date on a blog post and actually do what they claimed. When would they &lt;em&gt;ever&lt;/em&gt; compare the date of one to what was going on in their lives at that time, or to what was going on in the world at large at that point. The response, was a resounding silence.&lt;/p&gt;
&lt;h2 id=&#34;conclusions&#34;&gt;Conclusions&lt;/h2&gt;
&lt;p&gt;As far as I can tell, if you exclude the types of posts where dates are obviously required (news, politics, content that will become obsolete) no-one actually &lt;em&gt;needs&lt;/em&gt; dates with any real specificity, but because everyone &lt;em&gt;believes&lt;/em&gt; they need them, their absence makes them uncomfortable, or at the very least, slightly annoyed.&lt;/p&gt;
&lt;p&gt;I believe that relative dates are a much closer match to what people &lt;em&gt;need&lt;/em&gt;, and much easier to actually use. &amp;ldquo;Three months ago&amp;rdquo; translates quickly to &amp;ldquo;recent, but not &lt;em&gt;too&lt;/em&gt; recent&amp;rdquo;, whereas 5/24/12 requires you to figure out what month 5 is (&amp;ldquo;let&amp;rsquo;s see that&amp;rsquo;s&amp;hellip;May&amp;rdquo;), compare the day of that month (24) to the day of the current month (&amp;ldquo;Are they the same? Is that one earlier in the month than this one? Does that make it more time or less, and is that enough to bother worrying about?&amp;rdquo;) before you can actually leverage the information in a meaningful way. But, what we need, and what makes sense logically, isn&amp;rsquo;t always what we want.&lt;/p&gt;
&lt;p&gt;I believe that &lt;a href=&#34;http://www.kirkjerk.com&#34;&gt;Kirk&lt;/a&gt;&amp;rsquo;s proposal of &amp;ldquo;mid-June 2011&amp;rdquo; is probably the best compromise between usability and need. It&amp;rsquo;s easier for a human to parse than 6/15/11. It &lt;em&gt;feels&lt;/em&gt; much more useful than &amp;ldquo;over a year ago&amp;rdquo; or &amp;ldquo;15 months ago&amp;rdquo;, even though once you get that far from a dates post your true need for even to-the-month specificity is doubtful.&lt;/p&gt;
&lt;p&gt;With that said, the more recent something is, the more precision seems to matter to people. So, you could probably improve on Kirk&amp;rsquo;s suggestion by a building a system where dates are written with to-the-day specificity for one month, and then switching to &amp;ldquo;early May 2012&amp;rdquo; style dates after that.&lt;/p&gt;
&lt;h2 id=&#34;closing-thoughts&#34;&gt;Closing Thoughts&lt;/h2&gt;
&lt;p&gt;When pondering dates in blogging, &lt;em&gt;context is everything&lt;/em&gt;, and many, if not most, blogs have posts from multiple contexts. Hardly anyone writes a blog where the value of each post is unaffected by time. With that in mind, a blog&amp;rsquo;s posts should be dated using a method that supplies the maximum level of precision required. If you write a blog of fictional stories, but occasionally comment on news that affects writers you need to-the-day precision, either that, or use a different level of precision on every post, but really, no-one wants to go through that much trouble.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;* As it so happens, it&amp;rsquo;s probable that being exposed to the cold for a while will increase your odds of catching one. Some scientists did an experiment where they had some college students stand in buckets of cold water for a while, and compared which of them got colds soon afterwards. The kids who stood in the cold water got more colds than the kids who didn&amp;rsquo;t. I just wish I could find the research again&amp;hellip;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>An offer for Web Geeks</title>
      <link>https://weblog.masukomi.org/2012/08/17/an-offer-for-web-geeks/</link>
      <pubDate>Fri, 17 Aug 2012 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2012/08/17/an-offer-for-web-geeks/</guid>
      <description>&lt;p&gt;I&amp;rsquo;d like to make a simple offer to the web geeks out there:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;One hour of one person&amp;rsquo;s skills, to make the web a little bit more awesome, and raise $75 for your favorite environmental or medical charity.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Information Architects (the people behind iAWriter) have come up with a really spectacular JavaScript / CSS widget. When you load one of their long articles (&lt;a href=&#34;http://informationarchitects.net/blog/ipad-scroll-or-card/&#34;&gt;like this one&lt;/a&gt;) you&amp;rsquo;ll see a widget in the top right corner that says &amp;ldquo;Older | Newer&amp;rdquo; and links you to the previous or next article. No big deal. What&amp;rsquo;s cool, is that as you gradually scroll through the article the widget disappears, then returns, hovering beside your scroll bubble (wherever that may be in its track); its message now telling you how many minutes it&amp;rsquo;ll take you to finish the article, at an average reading speed. When you get to the bottom it reverts back to the &amp;ldquo;Older | Newer&amp;rdquo; state.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This is something that I&amp;rsquo;d love to see flourish.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The CSS and JavaScript that powers it isn&amp;rsquo;t particularly complicated, but I don&amp;rsquo;t have time at the moment to break it out into a reusable library the way I did with &lt;a href=&#34;https://github.com/masukomi/kudos&#34;&gt;Kudos&lt;/a&gt;. So, here&amp;rsquo;s my offer. &lt;strong&gt;For the first person&lt;/strong&gt; to create a public domain or &lt;a href=&#34;http://en.wikipedia.org/wiki/MIT_License&#34;&gt;MIT licensed&lt;/a&gt; repository on Github that makes it trivial to add similar functionality to any blog, &lt;strong&gt;I&amp;rsquo;ll donate $75 to the environmental or medical charity of their choice&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m thinking a repo with one JavaScript file, one CSS file, an example HTML file, and a README. Simple. Less than an hour&amp;rsquo;s work for a good front-end geek.&lt;/p&gt;
&lt;p&gt;Please note: IA&amp;rsquo;s stuff is copywritten so, while you can take inspiration for them, you can&amp;rsquo;t just extract (steal) their code. If you did, the MIT License wouldn&amp;rsquo;t be valid.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>I love the internet</title>
      <link>https://weblog.masukomi.org/2012/08/09/i-love-the-internet/</link>
      <pubDate>Thu, 09 Aug 2012 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2012/08/09/i-love-the-internet/</guid>
      <description>&lt;p&gt;Something kind-of amazing just happened.&lt;/p&gt;
&lt;h3 id=&#34;background&#34;&gt;Background:&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://unglue.it&#34;&gt;Unglue.it&lt;/a&gt; is a really cool site, that I&amp;rsquo;d never heard of until
&lt;a href=&#34;http://blog.unglue.it/2012/08/09/open-thread-amazon-forces-unglue-it-to-suspend-crowdfunding-for-creative-commons-ebooks/&#34;&gt;Amazon decided to stop processing payments for them&lt;/a&gt;.
Think Kickstarter for freeing out-of print books. They get people to create a
wishlist of books they&amp;rsquo;d like to see released as Creative Commons licensed
DRM-free ebooks.  They then talk to the authors and publishers of the books
people want to find out how much money it would take to &amp;ldquo;unglue&amp;rdquo; them. Then they
crowdsource that amount.&lt;/p&gt;
&lt;p&gt;Cool as that is, it&amp;rsquo;s not the amazing bit. The amazing bit is what happened
next.&lt;/p&gt;
&lt;h3 id=&#34;the-amazing&#34;&gt;The Amazing:&lt;/h3&gt;
&lt;p&gt;Having read of their plight, and pondered their coolness, I started thinking
about alternatives. &lt;a href=&#34;https://www.dwolla.com/&#34;&gt;Dwolla&lt;/a&gt; is a similarly cool
service that aims to replace PayPal and Credit Cards with something that doesn&amp;rsquo;t
screw everyone involved. They&amp;rsquo;ve already started to change the way banks do
business with each other, and I&amp;rsquo;ve got really high hopes for them. At the moment
they don&amp;rsquo;t do the kind of delayed payments that crowdfunding sites need, but
there&amp;rsquo;s a lot of money to be made by payment processors who can help
crowdfunding sites manage their pledges, so I figured that Dwolla had probably
been thinking about this.&lt;/p&gt;
&lt;p&gt;How amazing would it be if projects didn&amp;rsquo;t have to give up 5% of their
crowdfunded revenue to a payment processor? Dwolla only charges $0.25 per
transaction, and only on ones over $10. I really wish I could chose to pay with
Dwolla on the projects I help out on Kickstarter.  And, while Unglue.it is still
fairly small, it&amp;rsquo;d be great press. &amp;ldquo;Dwolla enters the crowfunding scene by
helping to free out-of-print books.&amp;rdquo; Sounds good to me.&lt;/p&gt;
&lt;p&gt;So I sent a little tweet pondering the connection&amp;hellip;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;masukomi&lt;/strong&gt;: I&amp;rsquo;m wondering if @dwolla wouldn&amp;rsquo;t be able to help @unglueit out
with their current problems with Amazon payments.
&lt;a href=&#34;http://blog.unglue.it/2012/08/09/open-thread-amazon-forces-unglue-it-to-suspend-crowdfunding-for-creative-commons-ebooks/%C2%A0%E2%80%A6&#34;&gt;http://blog.unglue.it/2012/08/09/ope…&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And that&amp;rsquo;s where the amazing began. &lt;a href=&#34;http://bpmilne.tumblr.com/&#34;&gt;Ben Milne&lt;/a&gt;
(bpmilne) is the founder of Dwolla, and while I didn&amp;rsquo;t directly message him,
he&amp;rsquo;s (unsurprisingly) watching the @dwolla stream.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;bpmilne&lt;/strong&gt;: @masukomi @dwolla @unglueit sure - drop us a line.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;unglueit&lt;/strong&gt;: @bpmilne Emailed you via contact form on your web site.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;unglueit&lt;/strong&gt;: @bpmilne Will do. @masukomi @dwolla&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;bpmilne&lt;/strong&gt;: @unglueit @masukomi &amp;lt;&amp;gt; @ajt&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ajt&lt;/strong&gt;: @bpmilne @unglueit @masukomi Hey- email me at [censored] and/or
&lt;a href=&#34;mailto:API@dwolla.com&#34;&gt;API@dwolla.com&lt;/a&gt; happy to help! :)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;bpmilne&lt;/strong&gt;: @ajt @unglueit @masukomi connected- i love the internet.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I couldn&amp;rsquo;t agree more.&lt;/p&gt;
&lt;p&gt;I hope it works out for them. I&amp;rsquo;d love to see Unglue.it succeed, and I&amp;rsquo;d love to
see more places start letting me use Dwolla to pay them.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Turning Down Apple</title>
      <link>https://weblog.masukomi.org/2012/08/09/turning-down-apple/</link>
      <pubDate>Thu, 09 Aug 2012 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2012/08/09/turning-down-apple/</guid>
      <description>&lt;p&gt;I just turned down an interview with Apple.&lt;/p&gt;
&lt;p&gt;There are a few companies who, when they call with a job offer you&amp;rsquo;ll respond with &amp;ldquo;fuck yes&amp;rdquo;. Apple is on that list for me. And yet&amp;hellip;&lt;/p&gt;
&lt;p&gt;A recruiter called me the other day. Apple needs someone and my particular skillset and background. It seemed to be a pretty good match, and she&amp;rsquo;d been looking for a while. An internal tool building kind of job, in a language I enjoy, for a company I admire? Fuck yes. Would you be willing to move? &amp;ldquo;Fuck yes.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Examining the actual job posting and pondering some of the recruiter&amp;rsquo;s comments made me wonder if the skillset they were asking for was actually the what they really wanted, but it was still close enough to be worth trying for. It&amp;rsquo;s Apple after all.&lt;/p&gt;
&lt;p&gt;But then we did a little research. For an additional $600 per month we could get a one bedroom apartment in a complex in some nearby burbville*, versus our 2 bedroom house abutting a park in Cambridge. Yeah, I&amp;rsquo;d have a bit more cash at the end of each month, but I&amp;rsquo;d still be stuck in a cube, in a soul-sucking burbville, in an apartment complex. Even if we could find a place by the nearby state parks we&amp;rsquo;d still have to deal with burbs, sprawl, and strip malls every time we ventured outside for anything.&lt;/p&gt;
&lt;p&gt;Alternately we could move to some beautiful portion of Vermont and I could telecommute to my current job. The drop in living expenses would be bring me about as much additional take-home as a salary bump from Apple. Yeah, the project&amp;rsquo;s not as interesting, and the company&amp;rsquo;s not as cool as Apple (few are), but being able to work in a home office I created? Being able to causally fuck-off for 20 minutes without stressing about pretending to work, as every coder I know has to do, because it&amp;rsquo;s not humanly possibly (excluding severe autistics) to focus on a single task all day long?&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve got the self-discipline to work from home and still get your tasks done on schedule, the bump in your quality of life is so dramatic that it easily cancels out many of the workplace frustrations, and totally trumps extra cash. To me the idea of being able to look out my window and see trees, to take a break to play with the dogs or chat with Dachary&amp;hellip; That&amp;rsquo;s worth so much.&lt;/p&gt;
&lt;p&gt;So, I thanked her for her interest, and turned down what&amp;rsquo;s likely to be my only chance to work at Apple&amp;hellip; unless of course, they find a position I could telecommute for. Or, if they set up shop in the middle of the woods. ;)&lt;/p&gt;
&lt;p&gt;A good life is better than a good paycheck any day of the week. Even if that paycheck&amp;rsquo;s from a great company.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;* I consider track housing to be the urban planning equivalent of the office cubicle. The lower half of California is rife with these things, and the more standard burbs aren&amp;rsquo;t much better if you ask me, but just to be clear: I do currently live in Cambridge MA, which is pretty far from a view of beautiful trees, but I do love this city, and if I&amp;rsquo;m not in the woods, it&amp;rsquo;s one of the few places I&amp;rsquo;d be happy living. That being said, we have been discussing finding a place in VT with trees, and a nice net connection. ;)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Major MObtvse Update</title>
      <link>https://weblog.masukomi.org/2012/08/08/major-mobtvse-update/</link>
      <pubDate>Wed, 08 Aug 2012 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2012/08/08/major-mobtvse-update/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve just merged the experimental branch of &lt;a href=&#34;http://mobtvse.com&#34;&gt;MObtvse&lt;/a&gt; into master. This represents a huge update and in addition to the feature list below there&amp;rsquo;s a nice update to the default theme, great new editor, improved Kudos integration on the admin screen, and a number of more subtle improvements. I&amp;rsquo;m really happy with the progress I&amp;rsquo;ve been able to make on MObtvse in my free time, and if you&amp;rsquo;ve been considering it, now is definitely the time to &lt;a href=&#34;https://github.com/masukomi/mobtvse&#34;&gt;grab it from Github&lt;/a&gt; and give it a spin.&lt;/p&gt;
&lt;p&gt;It should be noted that while it&amp;rsquo;s fairly easy to install, and the README attempts to cover all the details, people who&amp;rsquo;ve never installed a Rails app before, or used the command line, may feel a bit out of their depth.&lt;/p&gt;
&lt;p&gt;Sorry non-geeks, we&amp;rsquo;ve got a little ways to go before installation is totally painless for you, but I&amp;rsquo;m working on it.&lt;/p&gt;
&lt;h2 id=&#34;current-feature-list-as-of-aug-7-2012&#34;&gt;Current Feature List (as of Aug 7, 2012):&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Kudos&lt;/li&gt;
&lt;li&gt;Live Markdown preview&lt;/li&gt;
&lt;li&gt;Drafts&lt;/li&gt;
&lt;li&gt;Scheduled posts&lt;/li&gt;
&lt;li&gt;Image uploads via S3&lt;/li&gt;
&lt;li&gt;Disqus integration&lt;/li&gt;
&lt;li&gt;Google Analytics integration&lt;/li&gt;
&lt;li&gt;Archives page with Tags and Kudos integration (&lt;a href=&#34;https://weblog.masukomi.org/archive&#34;&gt;example here&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pull requests will be happily accepted. ;)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Task Order Up!</title>
      <link>https://weblog.masukomi.org/2012/07/06/task-order-up/</link>
      <pubDate>Fri, 06 Jul 2012 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2012/07/06/task-order-up/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been a big fan of &lt;a href=&#34;http://davidseah.com/productivity-tools/&#34;&gt;David Seah&amp;rsquo;s Productivity Tools&lt;/a&gt; for a while now, but when it comes to task management his needs, and mine frequently diverge. As a freelancer he needs to track hours in a way that is totally irrelevant to me. He&amp;rsquo;s got no-one to answer to but his clients, whereas I&amp;rsquo;ve got a boss and coworkers who are asking for details on current and past tasks in ways that clients rarely do.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d seen his &lt;a href=&#34;http://davidseah.com/blog/node/the-task-order-up/&#34;&gt;Task Order Up! sheets&lt;/a&gt; a while ago, but they just didn&amp;rsquo;t work for me. Upon revisiting his site the other week I had a little brainstorm. They &lt;em&gt;could&lt;/em&gt; be just about perfect for me with a few tweaks. Throw in a couple office supplies and I&amp;rsquo;ve got a useful  task management and archive system.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://s3.amazonaws.com/mobtvse_masukomi/2012_7_6_task_order_up_reimagined.pdf&#34;&gt;Task Order Up (re-imagined) - PDF&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;requirements&#34;&gt;Requirements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;must be able to show me exactly what I&amp;rsquo;m supposed to be working on &lt;em&gt;now&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;must help me easily recap what I did in the previous week for my status report.&lt;/li&gt;
&lt;li&gt;must help me out when the boss comes by and asks how I resolved that issue last week that I&amp;rsquo;ve entirely forgotten the details of.&lt;/li&gt;
&lt;li&gt;must help me know who I need to talk to about a specific task&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;the-system&#34;&gt;The System&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ll cover the changes I made to David&amp;rsquo;s sheets in a second, but first I&amp;rsquo;d like to cover the system that transforms this from a glorified notepad into an extremely functional tool.&lt;/p&gt;
&lt;p&gt;Now, David&amp;rsquo;s original idea was to use these similarly to how a waitress would take your order, put it on a little pad, go to the back and stick that sheet on &lt;a href=&#34;http://www.ex-cell.com/index.php?main_page=product_info&amp;amp;cPath=4_18&amp;amp;products_id=488&#34;&gt;a restaurant order check rail&lt;/a&gt;. It&amp;rsquo;s a good idea, but having a whole bunch of visible tasks is too distracting for me. I want my To Do list to show me exactly what I should be working on right now and keep me from pondering about all the other stuff. Also, I needed some system to be able to look back into the near past to answer questions about what I had been working on. Chefs don&amp;rsquo;t care what they made 30 minutes ago, they just care about what they need to cook now, and what&amp;rsquo;s coming down the line.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/2012_7_6_four_stacks_500x375.jpg&#34; alt=&#34;The Four Stacks&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;four-stacks&#34;&gt;Four Stacks&lt;/h3&gt;
&lt;p&gt;In this system there are 4 stacks of Task Order Up! sheets:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A stack of blanks (silver &lt;a href=&#34;http://en.wikipedia.org/wiki/Binder_clip&#34;&gt;binder clip&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;A stack of tasks I&amp;rsquo;m currently assigned / working on (red binder clip)&lt;/li&gt;
&lt;li&gt;A stack of tasks that I finished this week (yellow binder clip)&lt;/li&gt;
&lt;li&gt;A stack of tasks that I finished last week (blue binder clip)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For the most part I don&amp;rsquo;t care about tasks that were completed at some point before last week, but for the odd occasion when someone does ask me about older tasks I take all the old ones and throw them into the &amp;ldquo;archive&amp;rdquo; which is actually just a larger black binder clip that lives on the back of the desk and holds the ever increasing stack. I could just as easily shove them in a drawer, but things in drawers may as well not exist to my brain.&lt;/p&gt;
&lt;p&gt;The &amp;ldquo;current&amp;rdquo; stack (red binder clip) is prioritized, so the most pressing task is on the top, the next most pressing just below it, and so on.  The completed stacks are prioritized by completion date  (reverse chronological, like a blog) simply by virtue of the fact that new ones get added to the top.&lt;/p&gt;
&lt;h3 id=&#34;binder-clips&#34;&gt;Binder Clips&lt;/h3&gt;
&lt;p&gt;The color coded clips aren&amp;rsquo;t necessary, but I think they help. The clips keep the sheets together, should they accidentally get knocked, and the colors help me know which stack is which if they get moved around. This makes cleaning your desk much easier. Our office manager managed to find wee colored ones a little over a centimeter wide. If your office only has the larger binder clips you might want to go with colored paperclips instead. Most people don&amp;rsquo;t work on enough tasks in a week to exceed the holding capacity of a paperclip.&lt;/p&gt;
&lt;h3 id=&#34;flow&#34;&gt;Flow&lt;/h3&gt;
&lt;p&gt;Tasks start on the left (with the stack of blanks) and proceed to the right as they pass through the stages (current, completed this week, completed last week). The archived ones from earlier weeks go somewhere out of the way.&lt;/p&gt;
&lt;h3 id=&#34;usage&#34;&gt;Usage&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/2012_7_6_new_tasks_500x375.jpg&#34; alt=&#34;New Tasks&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;new-task&#34;&gt;New Task&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Grab a blank.&lt;/li&gt;
&lt;li&gt;Fill it out.&lt;/li&gt;
&lt;li&gt;Put in in the current (red binder clip) stack.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/2012_7_6_completed_tasks_500x375.jpg&#34; alt=&#34;Completed Tasks&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;completing-a-task&#34;&gt;Completing a task&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fill in the &amp;ldquo;Done&amp;rdquo; check-mark.&lt;/li&gt;
&lt;li&gt;Move it to the top of the &amp;ldquo;completed this week&amp;rdquo; stack (yellow binder clip).&lt;/li&gt;
&lt;li&gt;Start working on whatever&amp;rsquo;s on top of the &amp;ldquo;current&amp;rdquo; stack (red binder clip).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;new-week&#34;&gt;New Week&lt;/h4&gt;
&lt;p&gt;At the start of a new week your completed stacks are now a week too old and need to be shifted down the line.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Grab all the tasks that were completed two weeks ago (blue binder clip) and move them to the archive.&lt;/li&gt;
&lt;li&gt;Grab all the tasks completed last week (yellow binder clip) and move them to the   stack for tasks completed last week (the now empty blue binder clip).&lt;/li&gt;
&lt;li&gt;Your &amp;ldquo;completed this week&amp;rdquo; (yellow) binder clip will just sit there waiting for you until you finish something. So get cracking!&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;the-task-sheets&#34;&gt;The Task Sheets&lt;/h2&gt;
&lt;p&gt;Now &lt;a href=&#34;http://davidseah.com/blog/node/the-task-order-up/&#34;&gt;David&amp;rsquo;s Task Order Up!&lt;/a&gt; sheet&amp;rsquo;s are pretty great, and if you need to keep track of billable hours his are definitely a better choice. &amp;ldquo;The System&amp;rdquo; will work with either, but my variant doesn&amp;rsquo;t have any hour tracking.&lt;/p&gt;
&lt;h3 id=&#34;other-changes&#34;&gt;Other Changes&lt;/h3&gt;
&lt;h4 id=&#34;people&#34;&gt;People&lt;/h4&gt;
&lt;p&gt;Across the bottom of the sheet is a &amp;ldquo;People&amp;rdquo; section, with a bunch of icons. If you&amp;rsquo;re a freelancer you could use this to indicate what client the job was for. If you&amp;rsquo;re putting these sheets on a shared board to keep track of what&amp;rsquo;s being worked on you could indicate the person the task has been assigned to. In my case I use it to note which of my coworkers have knowledge of that section of our codebase&amp;hellip; who I should go to when I have questions.&lt;/p&gt;
&lt;p&gt;The icons are intentionally simplistic so that, in your bored moments (translation: meetings), you can doodle little hats, faces, glasses, moustaches, and anything else on them.&lt;/p&gt;
&lt;h4 id=&#34;notes--resolution&#34;&gt;Notes &amp;amp; Resolution&lt;/h4&gt;
&lt;p&gt;I&amp;rsquo;ve replaced the &amp;ldquo;Steps that need to be accomplished&amp;rdquo; with a generic lined field for &amp;ldquo;Notes&amp;rdquo; and &amp;ldquo;Resolution&amp;rdquo;. Sometimes I need to write down steps, but more frequently I need to write down notes, like what user encountered a bug, and how to replicate it.  The &amp;ldquo;Resolution&amp;rdquo; lines are where I note how the issue was addressed, because people keep asking me. However, the &amp;ldquo;Resolution&amp;rdquo; text is intentionally light enough that you could write right over it and it wouldn&amp;rsquo;t hamper readability.&lt;/p&gt;
&lt;h4 id=&#34;job-code&#34;&gt;Job Code&lt;/h4&gt;
&lt;p&gt;I&amp;rsquo;ve brought the Job Code / Reference Number block up because our team, like many others, uses a web-based ticket system, and I need to be able to easily associate the task with its identifier in the system, or vice-versa if someone asks me about ticket #4238.&lt;/p&gt;
&lt;h4 id=&#34;done-check&#34;&gt;Done Check&lt;/h4&gt;
&lt;p&gt;I&amp;rsquo;ve added a little checkmark to the right of the Due Date field, so that when you finish your task you can fill in the check and enjoy that satisfaction of a job well done&amp;hellip; and give yourself a nice visual indicator of which tasks have been finished.&lt;/p&gt;
&lt;h3 id=&#34;features-from-david&#34;&gt;Features from David&lt;/h3&gt;
&lt;h4 id=&#34;whens-it-due&#34;&gt;When&amp;rsquo;s it due?&lt;/h4&gt;
&lt;p&gt;David&amp;rsquo;s provided a couple useful ways for tracking when a task is due. Use whichever one works best for you.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The Due Date field is pretty much  what you&amp;rsquo;d expect; a place to put the date the task is due.&lt;/li&gt;
&lt;li&gt;The Week Num: If this is a multi-week project you can write the week number it&amp;rsquo;s due in, and then circle the&amp;hellip;.&lt;/li&gt;
&lt;li&gt;Days of the Week: Circle the day of the week its due on, and AM or PM if it matters.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Due Date&amp;rsquo;s aren&amp;rsquo;t generally an issue for me. It&amp;rsquo;s ASAP for almost everything, but when there is a due date it&amp;rsquo;s generally in the same week and I&amp;rsquo;ll just circle the day of the week rather than trying to figure out what that date is.&lt;/p&gt;
&lt;h3 id=&#34;brainpower&#34;&gt;Brainpower&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;http://davidseah.com/&#34;&gt;David&lt;/a&gt; did all the heavy lifting here. My version wouldn&amp;rsquo;t be possible without his creative shoulders to stand on. Go to his site, check out his stuff.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/2012_7_6_demo_task_order_up_sheet_small.jpg&#34; alt=&#34;Demo Task Order Up Sheet - small&#34;&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>About</title>
      <link>https://weblog.masukomi.org/2012/07/05/about/</link>
      <pubDate>Thu, 05 Jul 2012 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2012/07/05/about/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://weblog.masukomi.org/images/2012/07/05/self_portrait_in_mc_mirror.jpg&#34;&gt;&lt;img src=&#34;https://weblog.masukomi.org/2012/07/05/self_portrait_in_mc_mirror_small.jpg&#34; alt=&#34;Self Portrait&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I am &lt;a href=&#34;http://www.corporaterunaways.com&#34;&gt;an adventurer&lt;/a&gt;, a geek, an entrepreneur, an esperantist, and a writer. I&amp;rsquo;m passionate about about exploring the world and helping people to get out of their cubes and actually &lt;em&gt;live&lt;/em&gt; their lives.&lt;/p&gt;
&lt;p&gt;You can find out more, including all the latest contact info, at &lt;a href=&#34;http://masukomi.org&#34;&gt;masukomi.org&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Want Some Kudos?</title>
      <link>https://weblog.masukomi.org/2012/05/12/want-some-kudos/</link>
      <pubDate>Sun, 13 May 2012 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2012/05/12/want-some-kudos/</guid>
      <description>&lt;p&gt;I think &lt;a href=&#34;http://dustincurtis.com/&#34;&gt;Dustin Kurtis&amp;rsquo;&lt;/a&gt; idea of &amp;ldquo;Kudos&amp;rdquo; is spectacular. A simple tool for people viewing your post to say &amp;ldquo;I really appreciated this.&amp;rdquo; You can see it in action in the upper-right corner of every blog post in the &lt;a href=&#34;http://Svbtle.com/&#34;&gt;Svbtle&lt;/a&gt; blogging network.&lt;/p&gt;
&lt;p&gt;I really want to bring it to &lt;a href=&#34;http://MObtvse.com&#34;&gt;MObtvse&lt;/a&gt;, but first I had to figure out how it worked. So, I&amp;rsquo;ve put together &lt;a href=&#34;https://github.com/masukomi/kudos&#34;&gt;an example implementation of Svbtle-style Kudos&lt;/a&gt; that can be incorporated into your blogging software with a few easy changes.&lt;/p&gt;
&lt;p&gt;I want to see Kudos everywhere. I want readers like me to have a way to tell great bloggers like you when you&amp;rsquo;ve written something great.  So, go grab the code and add it to your blog system.&lt;/p&gt;
&lt;h3 id=&#34;update&#34;&gt;UPDATE:&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;http://mobtvse&#34;&gt;MObtvse&lt;/a&gt; now has Kudo support built in. This blog has a different UI implementation from Svbtle&amp;rsquo;s (and the example repo), but it&amp;rsquo;s still backed by MObtvse&amp;rsquo;s new Kudo functionality.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;P.S. If you&amp;rsquo;re looking to add Kudos to your WordPress install checkout the &lt;a href=&#34;https://github.com/scavone/wordpress-svbtle&#34;&gt;wordpress-svbtle&lt;/a&gt; theme from &lt;a href=&#34;http://scav1.com/&#34;&gt;scavone&lt;/a&gt;. It&amp;rsquo;s got them built in, and is where I went to figure out how this works.&lt;/p&gt;
&lt;p&gt;P.P.S If you&amp;rsquo;ve got good CSS chops I&amp;rsquo;d love to see some improvements on the texts that&amp;rsquo;s displayed during the animation in the  &lt;a href=&#34;https://github.com/masukomi/kudos&#34;&gt;example implementation of Svbtle-style Kudos&lt;/a&gt;. Send me a pull request and I&amp;rsquo;ll happily incorporate it.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Introducing MObtvse</title>
      <link>https://weblog.masukomi.org/2012/05/01/introducing-mobtvse/</link>
      <pubDate>Tue, 01 May 2012 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2012/05/01/introducing-mobtvse/</guid>
      <description>&lt;p&gt;Today, I would like to introduce you to &lt;a href=&#34;http://mobtvse.com&#34;&gt;MObtvse&lt;/a&gt;. It&amp;rsquo;s a fork of &lt;a href=&#34;http://natewienert.com/&#34;&gt;Nate Wienert&amp;rsquo;s&lt;/a&gt; &lt;a href=&#34;https://github.com/NateW/obtvse&#34;&gt;Obtvse&lt;/a&gt;, a Markdown based blogging system written with Ruby on Rails. Obtvse is itself, &lt;a href=&#34;http://natewienert.com/codename-obtvse&#34;&gt;a reverse engineering&lt;/a&gt; of the &lt;a href=&#34;http://svbtle.com/&#34;&gt;Svbtle&lt;/a&gt; blogging platform / network.&lt;/p&gt;
&lt;p&gt;The notable differences between MObtvse and Obtvse are that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MObvtse uses &lt;a href=&#34;www.mongodb.org&#34;&gt;MongoDB&lt;/a&gt; via &lt;a href=&#34;mongoid.org&#34;&gt;MongoID&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;MObtvse allows posts to be tagged. Readers can click the tags to see all other posts with the same tag, and Administrators can use the tag cloud to help find specific, or related, posts.&lt;/li&gt;
&lt;li&gt;MObtvse uses &lt;a href=&#34;http://haml-lang.com/&#34;&gt;Haml&lt;/a&gt; (partially implemented)&lt;/li&gt;
&lt;li&gt;Responsive CSS layout via the &lt;a href=&#34;http://foundation.zurb.com/&#34;&gt;Foundation&lt;/a&gt; framework.&lt;/li&gt;
&lt;li&gt;MObtvse has &lt;a href=&#34;https://github.com/masukomi/mobtvse/blob/master/ToDo.mkdn&#34;&gt;big plans for the future&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;MObtvse doesn&amp;rsquo;t currently generate static pages, but support for statically generated pages is a top priority. The faster serving helps SEO and allows a single server to handle far greater numbers of readers.&lt;/p&gt;
&lt;p&gt;There are a number of planned features like Disqus integration for comments, Mixpanel for stats (it already supports Google Analytics), easy image uploading, and much more.&lt;/p&gt;
&lt;h2 id=&#34;reasoning&#34;&gt;Reasoning&lt;/h2&gt;
&lt;h3 id=&#34;why-another-blogging-system&#34;&gt;Why another blogging system?&lt;/h3&gt;
&lt;p&gt;I know. I know. But, the reasons are pretty simple:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I love blogging with Markdown. It has totally changed my perception of blogging.&lt;/li&gt;
&lt;li&gt;Wordpress is a bloated behemoth that can&amp;rsquo;t withstand serious load without a really good hosting package, and all the Markdown plugins for it suck in one way or another.&lt;/li&gt;
&lt;li&gt;Blogging with command line tools like Jekyll and Octopress have serious limitations, frustrations, and complications.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;why-a-new-fork&#34;&gt;Why a new fork?&lt;/h3&gt;
&lt;p&gt;I created a totally separate project, instead of working to extend the common Obtvse codebase, because there are a number of changes that I have made, and intend to make, that are far beyond what Nate appears interested in doing with Obtvse, which is fine. I&amp;rsquo;ll contribute back as I can, but MObtvse is quickly moving to a point where most of the new code simply won&amp;rsquo;t be compatible with Obtvse&amp;rsquo;s.&lt;/p&gt;
&lt;p&gt;I started with Obtvse because writing something from scratch would have taken too much of my limited time, and Rails&amp;rsquo; ecosystem allows me to rapidly introduce many of the features I want without having to code them all from scratch.&lt;/p&gt;
&lt;h3 id=&#34;why-mongodb&#34;&gt;Why MongoDB?&lt;/h3&gt;
&lt;p&gt;Simple, by switching to MongoDB users can now throw an instance of MObtvse up on Heroku and use one of the free MongoDB hosting plans to store their data. These plans generally cap their storage but there are very few blogs out there that would even approach the limits they impose.&lt;/p&gt;
&lt;h3 id=&#34;why-not-stick-with-octopress&#34;&gt;Why not stick with Octopress?&lt;/h3&gt;
&lt;p&gt;I&amp;rsquo;ve really enjoyed the switch to blogging with Markdown, but &lt;a href=&#34;http://www.octopress.org&#34;&gt;Octopress&lt;/a&gt; just hasn&amp;rsquo;t been cutting it for me. I spend almost all my working days staring at terminals, so it&amp;rsquo;s not that I mind getting down and dirty with the command line, but from the perspective of wanting to write, the process kind-of-sucks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;bundle exec rake new_post[&amp;ldquo;some title&amp;rdquo;]&lt;/li&gt;
&lt;li&gt;select and copy the new file path it generates&lt;/li&gt;
&lt;li&gt;open said file with a text editor (I&amp;rsquo;ve been using &lt;a href=&#34;bywordapp.com&#34;&gt;Byword&lt;/a&gt; lately).&lt;/li&gt;
&lt;li&gt;skip the chance to preview what it would look like in the final version because that would require regenerating the entire site which takes forever.&lt;/li&gt;
&lt;li&gt;add it to git.&lt;/li&gt;
&lt;li&gt;push that to the server, which will then background the generation of the entire site for me via a git post-receive hook. Most people have to sit around twiddling their thumbs waiting for it to finish generating and then upload via FTP / SCP / Rsync / carrier pigeon.&lt;/li&gt;
&lt;li&gt;wait a few minutes for the entire site to be regenerated on the server (even when you just upload one post).&lt;/li&gt;
&lt;li&gt;View the post and hope you don&amp;rsquo;t spot any typos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And if you want to write a quick blog post from work? No good way to do it without downloading your entire blogging system to your work computer or install and configure &lt;a href=&#34;https://github.com/masukomi/JekyllMail&#34;&gt;JekyllMail&lt;/a&gt;. Even then you can&amp;rsquo;t make an update. Actually&amp;hellip; JekyllMail makes blogging with Octopress way easier. Just send an email, with attached photos and placeholder image tags and you&amp;rsquo;re all good.*&lt;/p&gt;
&lt;p&gt;The YAML data structure embedded in the top of my Markdown posts drives me nuts (Octopress inherited this from Jekyll) even though &lt;a href=&#34;http://markedapp.com&#34;&gt;Marked&lt;/a&gt; will auto-filter that out on preview for me. This is just &lt;em&gt;wrong&lt;/em&gt;. Markdown&amp;rsquo;s supposed to be about simplicity and ease of writing. Embedding an incomptable, and manually managed raw data structure at the top of each post instead of a centralized metadata solution that would allow the app to make intelligent decisions about what needs to be regenerated and what doesn&amp;rsquo;t&amp;hellip; &lt;em&gt;UGH!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The problem, of course, is that right now Octopress is one of, if not &lt;em&gt;the&lt;/em&gt; most feature-packed Markdown specific blogging platforms there is.&lt;/p&gt;
&lt;h2 id=&#34;how-about-looks&#34;&gt;How about looks?&lt;/h2&gt;
&lt;p&gt;MObtvse will always strive to keep its interface clean, simple, and easy to use. The admin section is fairly close to that of Obtvse with the addition of tag support, responsive css, and modifications to better support mobile devices.&lt;/p&gt;
&lt;p&gt;The Reading page currently (May 2012) takes many of its cues from weblog.masukomi.org but I expect that to change in the near future.&lt;/p&gt;
&lt;h4 id=&#34;the-admin-page&#34;&gt;The Admin Page&lt;/h4&gt;
&lt;p&gt;&lt;img src=&#34;http://mobtvse.com/images/mobtvse_admin_screen_500.jpg&#34; alt=&#34;The Admin Page&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;creating-or-editing-a-post&#34;&gt;Creating or Editing a Post&lt;/h4&gt;
&lt;p&gt;&lt;img src=&#34;http://mobtvse.com/images/mobtvse_editing_a_post_500.jpg&#34; alt=&#34;Creating or Editing a Post&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;reading-a-post&#34;&gt;Reading a post&lt;/h4&gt;
&lt;p&gt;&lt;img src=&#34;http://mobtvse.com/images/mobtvse_single_post_500.jpg&#34; alt=&#34;Reading a Post&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;like-what-you-see&#34;&gt;Like what you see?&lt;/h2&gt;
&lt;p&gt;Go to &lt;a href=&#34;http://MObtvse.com&#34;&gt;MObtvse.com&lt;/a&gt; for more details, or head directly over to &lt;a href=&#34;https://github.com/masukomi/mobtvse&#34;&gt;MObtvse&amp;rsquo;s Github repo&lt;/a&gt; and grab (or fork) a copy. MObtvse is all about integrating kick-ass new features, so your pull-requests will be warmly met.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;* Footnote: I&amp;rsquo;m mostly done with a complete refactoring of JekyllMail which fixes some bugs and makes it way more extensible. I just need to test it before releasing it into the wild.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Announcing ListfulThinking</title>
      <link>https://weblog.masukomi.org/2012/04/17/announcing-listfulthinking/</link>
      <pubDate>Tue, 17 Apr 2012 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2012/04/17/announcing-listfulthinking/</guid>
      <description>&lt;p&gt;Friends, Romans, Countrymen! Lend me your ears.&lt;/p&gt;
&lt;p&gt;Actually, that should read, &amp;ldquo;Friends, Romans, and Countrymen who own iPads or Macs!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Eight years ago I stumbled across a brilliant way of creating a self-organizing ToDo list. My initial proof-of-concept app was really ugly, but worked wonderfully. A few years later, I translated the method into a paper version, which looked great, and worked pretty well. Sadly, lines on paper aren&amp;rsquo;t very good about rearranging themselves on command. So this year Alexander ( our wonderful Russian programmer ) and I have been working to create a beautiful version of this app with all the features I wished the previous incarnations had.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://listfulthinking.com/?source=mblog&amp;amp;camp=pre-release&#34;&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/2012_7_6_listful_thinking_rounded.png&#34; alt=&#34;ListfulThinking Logo&#34; title=&#34;ListfulThinking Logo&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you find yourself staring at your tasks list wondering &amp;ldquo;What should I work on next?!&amp;rdquo; or simply feel overloaded by the size of the list, you need to &lt;a href=&#34;http://listfulthinking.com/?source=mblog&amp;amp;camp=pre-release&#34;&gt;go here and sign onto our announcement list&lt;/a&gt;. If you find little tasks slipping through the cracks, then &lt;a href=&#34;http://listfulthinking.com/?source=mblog&amp;amp;camp=pre-release&#34;&gt;go here and sign onto our announcement list&lt;/a&gt;. We&amp;rsquo;ll drop you a note when we&amp;rsquo;re ready for beta testers, and we&amp;rsquo;ll drop you a note when it hits the App Stores.&lt;/p&gt;
&lt;p&gt;Want to help make ListfulThinking the best ToDo app for you? Take one minute and reply to the signup confirmation e-mail. Or poke &lt;a href=&#34;http://twitter.com/#!/ListfulSupport&#34;&gt;@ListfulSupport&lt;/a&gt; on Twitter. Tell us what frustrates you about your current task management system. Are you losing tasks? Or tell us the most awesome thing about it that you don&amp;rsquo;t think anyone can beat. I don&amp;rsquo;t care if you&amp;rsquo;re using OmniFocus, pen and paper, or carefully timed carrier pigeons. We want to hear from you, because every insight helps.&lt;/p&gt;
&lt;p&gt;So, if you&amp;rsquo;re wishing your ToDo list would organize itself, please &lt;a href=&#34;http://listfulthinking.com/?source=mblog&amp;amp;camp=pre-release&#34;&gt;sign onto our announcement list&lt;/a&gt; and be one of the first to give it a try.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;P.S. ListfulThinking&amp;rsquo;s excellent logo was designed by &lt;a href=&#34;http://www.dfdesigner.blogspot.com/&#34;&gt;Doug Fuller&lt;/a&gt; If you need a logo designed, and are willing to pay for quality, I&amp;rsquo;d highly recommend you drop him a line.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Using Git Bisect to Crush Your Enemies</title>
      <link>https://weblog.masukomi.org/2012/04/10/using-git-bisect-to-crush-your-enemies/</link>
      <pubDate>Tue, 10 Apr 2012 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2012/04/10/using-git-bisect-to-crush-your-enemies/</guid>
      <description>&lt;h2 id=&#34;using-git-bisect&#34;&gt;Using Git Bisect&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&amp;hellip;to crush your enemies and/or bugs&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Or, how to save countless hours and find out where things broke&lt;/p&gt;
&lt;p&gt;Git bisect is the most awesome, and most poorly publicized feature of git. It allows git to walk through your branch and quickly find out which commit broke things.&lt;/p&gt;
&lt;p&gt;The usage is simple. You point git to a bad commit ( usually the most recent one ) and you point it to a good commit (the most recent one you know of when things were working).  So, if, for example, things were working on Tuesday morning, you bring up git log and scroll until you find one from Tuesday morning or maybe late Monday and copy its hash.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git bisect start
$ git bisect bad
	# that tells it that the current commit is bad
	# but you could say git bisect bad 48476f7b15022526393e6c4f44f610f552736fdc
$ git bisect good 71f45f2a0302b5fb2331c268ee2bfb3cfde452ab
	# that&#39;s the hash of some commit you know to have been good
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;git will then find the commit mid-way through and wait for you to tell it if it&amp;rsquo;s good or bad (&lt;code&gt;git bisect good&lt;/code&gt; or &lt;code&gt;git bisect bad&lt;/code&gt;). If it&amp;rsquo;s bad it knows the offending commit was earlier. If it&amp;rsquo;s good it knows the offending commit was later. It continues on in that vein, bisecting the commits with each step until it eventually says something like &lt;code&gt;54cb86bd35c226dc0df83dc2e2d4c8702fcf2c04 is the first bad commit&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;When you&amp;rsquo;re done you run the following to reset your branch to its original state&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git bisect reset
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;full-automation&#34;&gt;Full Automation&lt;/h2&gt;
&lt;p&gt;But it&amp;rsquo;s even better than that. You can fully automate git bisect. Just kick it off and have it test each branch. All you have to do is write a script that can be executed from the shell and exits with 0 if the commit is good, and a number from 1-124 if it is bad.&lt;/p&gt;
&lt;p&gt;You only have to do one thing differently. Once you&amp;rsquo;ve told it a good and a bad commit it will bisect the commits as usual and give you a system prompt and wait for you to tell it if it is a good or bad commit, but instead of telling it if it&amp;rsquo;s good or bad, you tell it what it needs to run to test it.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git bisect run my_test_script.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For example: I&amp;rsquo;m working on a rails project at the moment and just used this simple rake task which would blow up if the .fixtures method wasn&amp;rsquo;t loaded correctly:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# lib/tasks/location_test.rake
namespace :location_test do

	desc &amp;quot;tests location.fixtures classload issue&amp;quot;
	task :run =&amp;gt; :environment do
		begin 
				Location.first.fixtures
				$stderr.puts &amp;quot;it worked&amp;quot;
		rescue Exception=&amp;gt;e
				$stderr.puts &amp;quot;it died: #{e}&amp;quot;
				exit(1)
		end
		exit(0)
	end
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So, my run looked like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git bisect start 
$ git bisect good bebcc378d16d8fe74736c763c144753b2a382933
$ git bisect bad
$ git bisect run bundle exec rake location_test:run 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And git bisect proceeded about its merry way until it found the offending commit. Then I ran &lt;code&gt;git bisect reset&lt;/code&gt; and went about fixing the bug.&lt;/p&gt;
&lt;h2 id=&#34;pro-tip&#34;&gt;Pro-Tip&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;http://book.git-scm.com/5_finding_issues_-_git_bisect.html&#34;&gt;The Git Book adds this great note&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note that the version which git-bisect checks out for you at each point is just a suggestion, and you&amp;rsquo;re free to try a different version if you think it would be a good idea. For example, occasionally you may land on a commit that broke something unrelated; run&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;$ git bisect visualize
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;which will run gitk and label the commit it chose with a marker that says &amp;ldquo;bisect&amp;rdquo;. Choose a safe-looking commit nearby, note its commit id, and check it out with:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;$ git reset --hard fb47ddb2db...
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;then test, run &amp;ldquo;bisect good&amp;rdquo; or &amp;ldquo;bisect bad&amp;rdquo; as appropriate, and continue.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Obviously this won&amp;rsquo;t work if you&amp;rsquo;re running a fully automated bisect, and it points to the one gotcha of git bisect. If there are multiple bugs that inhibit your ability to test it ( either manually or via a more automated means) it can leave you with no obvious candidate. Most of the time, this isn&amp;rsquo;t a problem, especially when you have done your best to chose the most recent &amp;ldquo;good&amp;rdquo; commit that you are confident in.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Tourists and Adventurers</title>
      <link>https://weblog.masukomi.org/2012/04/04/tourists-and-adventurers/</link>
      <pubDate>Wed, 04 Apr 2012 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2012/04/04/tourists-and-adventurers/</guid>
      <description>&lt;p&gt;This post was written as response to &lt;a href=&#34;http://www.thetravelchica.com/2012/04/san-pedro-atacama-desert-chile-flooding/&#34;&gt;The Travel Chica&amp;rsquo;s post about the flooding of the Atacama&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Travel Chica just discovered that &amp;ldquo;the driest place on the planet is flooding&amp;rdquo;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The two most beautiful places on my itinerary for Chile have
experienced environmental disasters just before my arrival.
First, there was the fire in Torres del Paine.
And now the driest place on the planet is flooding.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;&lt;br&gt;
I just spent US$100 on a bus ticket to get here, dealt with the discomfort of an
overnight bus ride, and left a city I loved and wanted to explore more.  And I am not
going to be able to take pictures of this landscape photographer’s dream destination.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;&lt;br&gt;
People are being evacuated.&lt;br&gt;
The military is handing out mattresses and blankets on the square.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;&lt;br&gt;
The only thing for me to do is book a bus ticket out of here.
&amp;hellip;And wait until I can escape to northern Argentina&amp;hellip;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So, let&amp;rsquo;s recap:
People&amp;rsquo;s homes are flooded. Entire villages are being evacuated, and she&amp;rsquo;s complaining about a $100 bus ticket and the &amp;ldquo;discomfort of an overnight bus ride&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;She&amp;rsquo;s traveled to a &amp;ldquo;photographer&amp;rsquo;s dream destination&amp;rdquo; and when she finds out that she will not be able to take the same pictures everyone else has been taking for years, but instead has been presented with the opportunity to photograph something that has never happened within our lifetime &amp;ldquo;the only thing for [her] to do is book a ticket out&amp;hellip;&amp;rdquo; Just imagine how extraordinary (literally) it would be to go to the same places of all those beautiful pictures she admired, and find beauty in a landscape transformed by an element that is almost never present.&lt;/p&gt;
&lt;p&gt;This, is a spectacular example of the differences between a typical tourist and an adventurer. A tourist books itineraries, expects comfort everywhere despite the being in a land rife with poverty, and gets upset when things don&amp;rsquo;t go according to plan.&lt;/p&gt;
&lt;p&gt;An adventurer says &amp;ldquo;Holy shit! How fortunate am I to be experiencing something that has never happened in my lifetime, to be in a place where the money I bring to the community when paying for food, guides, and shelter can have a real impact in this time of crisis, to be able to photograph things no-one else will have the opportunity to, to tell stories no-one else can tell, and to have the ability to hop the next bus out whenever I want.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The adventurer thrives in the unexpected moments of life. The tourist gets annoyed.&lt;/p&gt;
&lt;p&gt;I will never be a tourist.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>I Saw a Man Walking Down the Street...</title>
      <link>https://weblog.masukomi.org/2012/03/19/i-saw-a-man-walking-down-the-street/</link>
      <pubDate>Mon, 19 Mar 2012 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2012/03/19/i-saw-a-man-walking-down-the-street/</guid>
      <description>&lt;p&gt;&amp;hellip; and it reminded me of everything I hope for.&lt;/p&gt;
&lt;p&gt;The man in question had serious physical disabilities. His left foot pointed
almost directly inward. His legs didn&amp;rsquo;t seem to be oriented in the way that
yours or mine are. I suspect his spine didn&amp;rsquo;t curve in a typical direction
either.&lt;/p&gt;
&lt;p&gt;He walked forcefully, arms flailing out to the sides. His feet stamped their way
into the concrete. With every step you feared he might topple forwards, but he
didn&amp;rsquo;t. My first reaction was to look away &amp;ldquo;don&amp;rsquo;t stare ate the disabled person
and make them uncomfortable&amp;rdquo;. But, I forced myself to look back, as I always do.
It&amp;rsquo;s unnatural to not stare at a sight like that. I think it&amp;rsquo;s doing them a
great injustice to pretend they aren&amp;rsquo;t who, and what, they are. So I looked&amp;hellip;&lt;/p&gt;
&lt;p&gt;He wore a nicely trimmed beard, light blue dress shirt, navy blue pants, black
socks, and brown leather dress shoes, and a face that demanded my respect,
because he wasn&amp;rsquo;t &amp;ldquo;flailing&amp;rdquo;. He was walking, and he wasn&amp;rsquo;t giving up. He could
have taken the easy route and used a wheelchair, but he didn&amp;rsquo;t. He got up, got
dressed, and walked to work, despite all the looks he knew he&amp;rsquo;d get, despite the
fact that he was burning more calories than a jogger on his way in to work.&lt;/p&gt;
&lt;p&gt;I want to be that bad-ass.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Great Apps for Your New iPad</title>
      <link>https://weblog.masukomi.org/2012/03/16/great-apps-for-your-new-ipad-3/</link>
      <pubDate>Fri, 16 Mar 2012 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2012/03/16/great-apps-for-your-new-ipad-3/</guid>
      <description>&lt;p&gt;A quick listing of some of my favorite iPad apps, which I hope new iPad owners may find useful.&lt;/p&gt;
&lt;h2 id=&#34;reading&#34;&gt;Reading&lt;/h2&gt;
&lt;h3 id=&#34;early-edition-2&#34;&gt;&lt;a href=&#34;http://www.glasshouseapps.com/&#34;&gt;Early Edition 2&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A newspaper style feed reader. This is the best app of this genre on any platform. It does crash from time to time, but not enough to be particularly annoying. My recommendation is to not put your full list of feeds into it. Instead, put a selected subset of them that would work well if you were reading them in a physical newspaper.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Warning:&lt;/em&gt; &amp;ldquo;Early Edition 2&amp;rdquo; was released separately from &amp;ldquo;Early Edition&amp;rdquo;. Be sure to buy v2. It&amp;rsquo;s a signficant upgrade in features from the original and there is no free upgrade path to owners of the original.&lt;/p&gt;
&lt;h3 id=&#34;instapaper&#34;&gt;&lt;a href=&#34;http://www.instapaper.com/&#34;&gt;Instapaper&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Instapaper is a great offline reading app. It&amp;rsquo;s main competitors are Read it Later and Readability. I recommend Instapaper though because it&amp;rsquo;s very well thought out, and by buying the app you&amp;rsquo;re supporting a developer who is dedicated to making this the best reading app out there.&lt;/p&gt;
&lt;h2 id=&#34;social-media&#34;&gt;Social Media&lt;/h2&gt;
&lt;h3 id=&#34;flipboard&#34;&gt;&lt;a href=&#34;http://www.flipboard.com/&#34;&gt;Flipboard&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Flipboard is a great way to see interesting things you Twitter and Facebook contacts have uploaded or linked to. It&amp;rsquo;s free, well made, and a lot of fun.&lt;/p&gt;
&lt;h3 id=&#34;tweed&#34;&gt;&lt;a href=&#34;http://lithiumcorp.com/tweed/&#34;&gt;Tweed&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Tweed watches your Twitter feed and pulls out all the links from the people you are following. Unlike clipboard it doesn&amp;rsquo;t bother with tweets that don&amp;rsquo;t include any links. It&amp;rsquo;s good enough to warrant mentioning here, but I find I don&amp;rsquo;t use it very much. Usually, if I&amp;rsquo;m interested in something like that I&amp;rsquo;ll just open Flipboard.n&lt;/p&gt;
&lt;h3 id=&#34;tweetbot&#34;&gt;&lt;a href=&#34;http://tapbots.com/software/tweetbot/&#34;&gt;Tweetbot&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;One of the best Twitter clients on iPhone or iPad.&lt;/p&gt;
&lt;h3 id=&#34;twittelator&#34;&gt;&lt;a href=&#34;http://stone.com/Twittelator/&#34;&gt;Twittelator&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Honestly, I think Twittelator is the most beautiful Twitter client available on the iPad, but it lacks Tweetbot&amp;rsquo;s ability to easily see an entire conversation thread. Right now I&amp;rsquo;m using Tweetbot, but if they add that I&amp;rsquo;ll switch back.&lt;/p&gt;
&lt;h3 id=&#34;beejiveim&#34;&gt;&lt;a href=&#34;http://www.beejive.com/&#34;&gt;BeejiveIM&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I&amp;rsquo;m not a big fan of using IM on the iPad, but if you&amp;rsquo;ve got to do it, this is the best app for the job.&lt;/p&gt;
&lt;h3 id=&#34;skype&#34;&gt;&lt;a href=&#34;http://www.skype.com/intl/en/get-skype/on-your-mobile/download/ipad-for-skype/&#34;&gt;Skype&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;It&amp;rsquo;s not that I love Skype so much that I think you ought to run out and get it for your iPad, but if you&amp;rsquo;re traveling and want to keep in touch with friends and family, Skype&amp;rsquo;s iPad client is a great option, especially on iPads with front-facing cameras (not the 1st generation)&lt;/p&gt;
&lt;h2 id=&#34;productivity&#34;&gt;Productivity&lt;/h2&gt;
&lt;h3 id=&#34;soulver&#34;&gt;&lt;a href=&#34;http://www.acqualia.com/soulver/&#34;&gt;Soulver&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&amp;ldquo;Soulver helps you work things out. It&amp;rsquo;s quicker to use than a spreadsheet, and smarter and clearer than a traditional calculator.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Imagine you took a typical calculator app and dipped it in awesome-sauce. That&amp;rsquo;s Soulver.&lt;/p&gt;
&lt;h3 id=&#34;omnifocus-for-ipad&#34;&gt;&lt;a href=&#34;http://www.omnigroup.com/products/omnifocus-ipad&#34;&gt;OmniFocus for iPad&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I hate to recommend someone-else&amp;rsquo;s todo app when I&amp;rsquo;m in the middle of developing my own, but there is no denying that OmniFocus for iPad is &lt;em&gt;the best&lt;/em&gt; GTD app available right now.&lt;/p&gt;
&lt;h3 id=&#34;mindnode&#34;&gt;&lt;a href=&#34;http://www.mindnode.com/&#34;&gt;MindNode&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Most people seem to talk about &lt;a href=&#34;http://www.ithoughts.co.uk/iThoughtsHD/Welcome.html&#34;&gt;iThoughtsHD&lt;/a&gt; when discussing mind-mapping software for the iPad, but I really dislike its graphics. MindNode looks good and is &lt;em&gt;very&lt;/em&gt; easy to use. Dachary and I have gotten a lot of value out of this for helping to plan our adventures.&lt;/p&gt;
&lt;h3 id=&#34;imockups&#34;&gt;&lt;a href=&#34;http://www.endloop.ca/imockups/&#34;&gt;iMockups&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A great tool for quickly mocking up web pages, iOS apps, and just about anything else. I have a copy of Balsamiq Mockups on my desktop but I&amp;rsquo;ll choose iMockups over it almost every time. Manipulating your mock-ups with a  finger just feels, right, and has significant advantages when creating an iOS app.&lt;/p&gt;
&lt;h3 id=&#34;business-model-toolbox&#34;&gt;&lt;a href=&#34;http://www.businessmodelgeneration.com/toolbox&#34;&gt;Business Model Toolbox&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I debated whether or not I should include this one. For most people pondering their business, or starting a business, I suggest just getting the book and skipping the app. For serial entrepreneurs, like me, who are constantly pondering different business models for potential new businesses it&amp;rsquo;s a great way to work out the rough numbers and customer or supplier channels for a business. The problem is that it has some significant limitations. For example, when mocking up an iOS app you can tell it that apple with take x dollars per sale, but you can&amp;rsquo;t say that it will take x percent of each sale. This means that every time you want to explore the consequences of changing your app price you have to go back and manually change the amount that apple will be taking. There are lots of little financial things like this that keep leaving me less than thrilled with this app. What&amp;rsquo;s worse, is that while it doesn&amp;rsquo;t have any bugs (that I&amp;rsquo;ve discovered) I can&amp;rsquo;t remember ever having gotten an update for the app. They&amp;rsquo;re just not working on it. Buying the book and just working out the numbers on paper may be a better option than buying this app. Or, better yet, figure out the channels, with this, or the lessons in the book, and then work up the numbers in &lt;a href=&#34;http://www.acqualia.com/soulver/&#34;&gt;Soulver&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;writing&#34;&gt;Writing&lt;/h2&gt;
&lt;p&gt;I think the are two things that are required to do any serious writing on the iPad:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;An external keyboard. The Apple wireless bluetooth keyboard is wonderfully thin and adds almost no space when you lay it over your iPad.&lt;/li&gt;
&lt;li&gt;A willingness to use Markdown&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Markdown allows you to use trivially simple markup, like sticking an asterisk on either side of a word to make it &lt;em&gt;italic&lt;/em&gt;. With it you can quickly and easily generate well formatted documents on your iPad without ever having to use iOSs text selection tools to bold, italicize, create headings, bullet lists or any of the other common formattings.&lt;/p&gt;
&lt;p&gt;Now, markdown can be created in any text editor, but an app that&amp;rsquo;s specifically designed to handle Markdown can preview the formatted text, and turn it into a good looking email or PDF.&lt;/p&gt;
&lt;p&gt;The best app of the bunch is &lt;a href=&#34;http://www.getwritingkit.com/&#34;&gt;Writing Kit&lt;/a&gt;. ScreenCastsOnline has made an in-depth screencast on it, which you can find on WritingKit&amp;rsquo;s web site.&lt;/p&gt;
&lt;p&gt;With that said, there are a bunch of really good iPad Markdown editors. If Writing Kit isn&amp;rsquo;t your style check out &lt;a href=&#34;http://bywordapp.com/&#34;&gt;Byword&lt;/a&gt; and &lt;a href=&#34;http://www.iawriter.com/&#34;&gt;iAWriter&lt;/a&gt;, both of which sync very well with their OS X counterparts.&lt;/p&gt;
&lt;h2 id=&#34;blogging&#34;&gt;Blogging&lt;/h2&gt;
&lt;h3 id=&#34;posts&#34;&gt;&lt;a href=&#34;http://www.picodev.com/postsapp/&#34;&gt;Posts&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If you want a more standard &lt;a href=&#34;http://en.wikipedia.org/wiki/WYSIWYG&#34;&gt;WYSIWIG&lt;/a&gt; interface for your blogging &lt;a href=&#34;http://www.picodev.com/postsapp/&#34;&gt;Posts&lt;/a&gt; is a beautiful app that works great. It&amp;rsquo;s the best looking blogging app I&amp;rsquo;ve seen on the iPad, and it works with Blogger and Wordpress&lt;/p&gt;
&lt;h3 id=&#34;poster&#34;&gt;&lt;a href=&#34;http://www.tomwitkin.com/poster/&#34;&gt;Poster&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If you&amp;rsquo;ve got a WordPress blog and want to post with Markdown check out &lt;a href=&#34;http://www.tomwitkin.com/poster/&#34;&gt;Poster&lt;/a&gt;. I haven&amp;rsquo;t used this personally but it&amp;rsquo;s been getting great reviews and it&amp;rsquo;s one of the only ones that supports blogging with markdown without any special plugins on your blog.&lt;/p&gt;
&lt;h2 id=&#34;fun&#34;&gt;Fun&lt;/h2&gt;
&lt;h3 id=&#34;spice-bandits&#34;&gt;&lt;a href=&#34;http://www.chillingo.com/&#34;&gt;Spice Bandits&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A great, and challenging, Tower Defense game. It offers in-app purchases to help jump-start things, but a real Spice Bandit &lt;em&gt;doesn&amp;rsquo;t need&lt;/em&gt; in-app purchases.&lt;/p&gt;
&lt;h3 id=&#34;carcasonne&#34;&gt;&lt;a href=&#34;http://carcassonneapp.com/&#34;&gt;Carcasonne&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A wonderful port of the board game of the same name. If you like the board game you&amp;rsquo;ll like the iPad version. Great sound, great voicework on the tutorial. Even includes a &amp;ldquo;solitary&amp;rdquo; mode.&lt;/p&gt;
&lt;h3 id=&#34;tower-madness&#34;&gt;&lt;a href=&#34;http://www.towermadness.com/&#34;&gt;Tower Madness&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Another fun Tower Defense game. The graphics aren&amp;rsquo;t fancy, but it&amp;rsquo;s a lot of fun, and it has a split-screen two player mode which is great for killing time when out with a friend.&lt;/p&gt;
&lt;h3 id=&#34;letterpress&#34;&gt;&lt;a href=&#34;http://www.atebits.com/letterpress/&#34;&gt;Letterpress&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Available for iPhone and iPad this is a great word game that&amp;rsquo;ll tax your vocabulary, and have lots of fun with a friend.&lt;/p&gt;
&lt;h2 id=&#34;utilities&#34;&gt;Utilities.&lt;/h2&gt;
&lt;h3 id=&#34;dropbox&#34;&gt;&lt;a href=&#34;http://www.dropbox.com&#34;&gt;Dropbox&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Duh.&lt;/p&gt;
&lt;h3 id=&#34;1password&#34;&gt;&lt;a href=&#34;https://agilebits.com/onepassword&#34;&gt;1Password&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Because 1 Password is the best password manager out there and once you start using it you&amp;rsquo;ll want it on every platform you use.&lt;/p&gt;
&lt;h2 id=&#34;art--design&#34;&gt;Art &amp;amp; Design&lt;/h2&gt;
&lt;h3 id=&#34;letter-m-press&#34;&gt;&lt;a href=&#34;http://www.lettermpress.com/&#34;&gt;Letter M Press&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Letter M Press allows you to &amp;ldquo;Experience the Art and Craft of Letterpress&amp;rdquo;. It does an exception job of recreating an old-fashioned letterpress on your iPad. It&amp;rsquo;ll take you half an hour to lay-out the simplest type design, and you&amp;rsquo;ll love every minute of it, or you will if the idea of working with a real letterpress is appealing to you.&lt;/p&gt;
&lt;h3 id=&#34;ifontmaker&#34;&gt;&lt;a href=&#34;http://2ttf.com/&#34;&gt;iFontMaker&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;iFontMaker makes it trivial to design your own custom font, and export it for use on your computer. It supports a variety of glyph sets, including Japanese, greek, Cyrillic, and more. The only downside is that the tools provided really only work for designing handwriting style fonts, and there is no way to edit the bezier curves.&lt;/p&gt;
&lt;h2 id=&#34;misc&#34;&gt;Misc&lt;/h2&gt;
&lt;h3 id=&#34;flickstackr&#34;&gt;&lt;a href=&#34;http://ipont.jubilo.ca/ip/flickstackr/&#34;&gt;FlickStackr&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Probably the best Flickr and 500px client on the iPad. It also offers good offline support.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Know Backbone.js? Want a Little Extra Work?</title>
      <link>https://weblog.masukomi.org/2012/03/03/know-backbone-js-want-a-little-extra-work/</link>
      <pubDate>Sat, 03 Mar 2012 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2012/03/03/know-backbone-js-want-a-little-extra-work/</guid>
      <description>&lt;p&gt;&lt;strong&gt;If you know Backbone.js and are interested in 5, or more, hours of freelance work every week, I want to talk to you.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve got a number of apps in the pipeline and need someone to help code them. The current one needs Backbone.js and PhoneGap (iOS) experience. There will be plenty of front-end work in the upcoming apps as well as Ruby on Rails, or Node.js tasks if you&amp;rsquo;ve got the skills for those too.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re not looking to hire someone for just this project. We&amp;rsquo;re looking for someone we can keep working with on all our future projects. Five hours is the minimum I can guarantee, but if things are going well there will definitely be weeks with more hours than that.&lt;/p&gt;
&lt;p&gt;Interested? &lt;a href=&#34;https://www.odesk.com/jobs/Backbone-developer-PhoneGap-exp-plus_~~62c988259565ed87&#34;&gt;Check out our Job Posting on oDesk&lt;/a&gt;. Got questions? Need more info? Drop me a line at &lt;a href=&#34;mailto:masukomi@masukomi.org&#34;&gt;masukomi@masukomi.org&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How to Merge Specific Files From Another Branch in Git</title>
      <link>https://weblog.masukomi.org/2012/02/27/how-to-merge-specific-files-from-another-branch-in-git/</link>
      <pubDate>Tue, 28 Feb 2012 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2012/02/27/how-to-merge-specific-files-from-another-branch-in-git/</guid>
      <description>&lt;p&gt;There are many ways to get specific files from another git branch into your current git branch (overwriting the ones in your current branch), but this is the only method I&amp;rsquo;ve been able to find to &lt;em&gt;merge&lt;/em&gt; those files into your branch en-masse. With this method you&amp;rsquo;ll be able to pull in any file, or files based on the name of the file or containing folder. If you need to merge files in multiple folders on different subdirectories you can simply rerun step two with a pattern that matches each of the different portions of your tree that you wish to merge.&lt;/p&gt;
&lt;p&gt;Please note that this was originally &lt;a href=&#34;http://stackoverflow.com/a/9473543/13973&#34;&gt;an answer on Stack Overflow&lt;/a&gt;, but I felt it could do with a reposting since it&amp;rsquo;s a commonly asked question and there are lots of poor answers out there that don&amp;rsquo;t really answer it.&lt;/p&gt;
&lt;p&gt;So, without further ado, the simple way, to actually &lt;em&gt;merge&lt;/em&gt; specific files from two branches, not just replace specific files with ones from another branch:&lt;/p&gt;
&lt;h2 id=&#34;step-one-diff-the-branches&#34;&gt;Step one: Diff the branches&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;git diff branch_b &amp;gt; my_patch_file.patch&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Creates a patch file of the difference between the current branch and branch_b&lt;/p&gt;
&lt;h2 id=&#34;step-two-apply-the-patch-on-files-matching-a-pattern&#34;&gt;Step two: Apply the patch on files matching a pattern&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;git apply -p1 --include=pattern/matching/the/path/to/file/or/folder&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&#34;useful-notes-on-the-options&#34;&gt;useful notes on the options&lt;/h3&gt;
&lt;p&gt;You can use &lt;code&gt;*&lt;/code&gt; as a wildcard in the include pattern.&lt;/p&gt;
&lt;p&gt;Slashes don&amp;rsquo;t need to be escaped.&lt;/p&gt;
&lt;p&gt;Also, you could use &amp;ndash;exclude instead and apply it to everything except the files matching the pattern, or reverse the patch with -R&lt;/p&gt;
&lt;p&gt;The -p1 option is a holdover from the *unix patch command and the fact that the patch file&amp;rsquo;s contents prepend each file name with &lt;code&gt;a/&lt;/code&gt; or &lt;code&gt;b/&lt;/code&gt; ( or more depending on how the patch file was generated) which you need to strip so that it can figure out the real file to the path to the file the patch needs to be applied to.&lt;/p&gt;
&lt;p&gt;Check out the man page for git-apply for more options.&lt;/p&gt;
&lt;h2 id=&#34;step-three-there-is-no-step-three&#34;&gt;Step three: there is no step three&lt;/h2&gt;
&lt;p&gt;Obviously you&amp;rsquo;d want to commit your changes, but who&amp;rsquo;s to say you don&amp;rsquo;t have some other related tweaks you want to do before making your commit.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you found this useful you might be interested in &lt;a href=&#34;http://localhost:4000/blog/categories/git/&#34;&gt;some of the other git posts here&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>It&#39;s Not What You Think It Is</title>
      <link>https://weblog.masukomi.org/2012/02/28/it-s-not-what-you-think-it-is/</link>
      <pubDate>Tue, 28 Feb 2012 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2012/02/28/it-s-not-what-you-think-it-is/</guid>
      <description>&lt;p&gt;There&amp;rsquo;s &lt;a href=&#34;http://www.change.org/petitions/tell-ticketmaster-stop-hijacking-fans-rights&#34;&gt;a petition&lt;/a&gt;
on Change.org right now urging people to &amp;ldquo;Tell Ticketmaster: Stop hijacking fans&amp;rsquo; rights!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The short version is that person behind the petition (Nathan Hubbard) is upset that Ticketmaster
has begun to tie the purchased ticket to the purchaser of the ticket. Nathan feels that since you
bought the ticket you should be able to resell it, and that this is just a &amp;ldquo;ploy&amp;rdquo; by
Ticketmaster to make more money by handling the resale of the tickets themselves. Ticketmaster
claims that this is an anti-fraud tool.&lt;/p&gt;
&lt;p&gt;The thing is, I&amp;rsquo;ve been privy to what goes on behind the scenes when a popular event goes on sale
at Ticketmaster. You know, those ones where four bajillion seats get sold out in eleven minutes?&lt;/p&gt;
&lt;p&gt;Well, Ticketmaster &lt;em&gt;hates&lt;/em&gt; that, because essentally no humans actually managed to purchase a ticket.
Instead, professional scalpers launch a rather brutal assault on the Ticketmaster servers, and regardless
of how many measures Ticketmaster and their competitors put in place, the bots still manage to get the vast majority of the
tickets. So, if you were wondering why you couldn&amp;rsquo;t get a ticket to that last big show, that&amp;rsquo;s why.
And, if you&amp;rsquo;re wondering why Ticketmaster&amp;rsquo;s purchasing process has so many steps it&amp;rsquo;s because
each one is part of a very complicated process that attempts to slow down the bots so that people
like you have a chance to buy tickets.&lt;/p&gt;
&lt;p&gt;Tying the ticket to the purchaser of the ticket is about the only thing Ticketmaster &lt;em&gt;can&lt;/em&gt; do to
help ensure that regular people can get tickets to the shows they want to see without having to
pay ridiculous fees to scalpers. Ticketmaster honestly wants you to be able to buy your ticket
at a reasonable price. It&amp;rsquo;s not only the right thing, it&amp;rsquo;s also what their customers (the musicians,
sports teams, etc) want. Their customers are just as unhappy about the scalpers buying up all
the seats as you are.&lt;/p&gt;
&lt;p&gt;Some of you may be thinking I&amp;rsquo;m talking about the guys standing outside of the stadium with a handful
of tickets for sale. I&amp;rsquo;m not. I&amp;rsquo;m talking about online companies that compete with each others bots
to buy thousands of tickets.&lt;/p&gt;
&lt;p&gt;Yes, Ticketmaster will probably make more money by handling the resale of unused tickets too, but
so what? The only people hurt by this policy are professional scalpers who make their living by
preventing normal people from buying tickets at reasonable prices. If your friend gets sick
and you have a spare ticket, but can&amp;rsquo;t find anyone else to go, wouldn&amp;rsquo;t you want a company with
the resourses of Ticketmaster to help you resell it? Shouldn&amp;rsquo;t they be paid for that?&lt;/p&gt;
&lt;p&gt;In short, you should be really thankful that Ticketmaster is tying the tickets you purchase to you.
Because it&amp;rsquo;s about the only way I can think of that people like you and me will have any hope
of actually buying tickets to popular shows. Next time you feel like getting pissed at Ticketmaster
remember, it&amp;rsquo;s almost always the scalpers who are to blame, and the geeks at Ticketmaster are
working their butts off to make sure that normal people like you can buy a ticket at the standard
ticket price.&lt;/p&gt;
&lt;p&gt;Oh, and those extra service fees? Lets just say that it requires an army of servers to fend off
the army of scalper bots, that are trying to get the tickets before you. Well, that and the fact
that they want to make money. ;)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>OS X Apps Worth Checking Out</title>
      <link>https://weblog.masukomi.org/2012/02/15/os-x-apps-worth-checking-out/</link>
      <pubDate>Wed, 15 Feb 2012 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2012/02/15/os-x-apps-worth-checking-out/</guid>
      <description>&lt;p&gt;There are a ton of good OS X apps out there. These are the ones that I really appreciate, and think you ought to check out too.&lt;/p&gt;
&lt;p&gt;Please note that this was written on Feb. 2nd 2012, and that software changes at a very rapid pace.&lt;/p&gt;
&lt;h3 id=&#34;writing-apps&#34;&gt;Writing Apps&lt;/h3&gt;
&lt;h4 id=&#34;scrivener&#34;&gt;&lt;a href=&#34;http://www.literatureandlatte.com/&#34;&gt;Scrivener&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;If you&amp;rsquo;re serious about writing, or writing anything significant (book, screenplay, thesis, research paper, etc.), there is only one app to consider, and Scrivener is it. Be sure to go through the tutorial though. Its features do a spectacular job of getting out of your way, which means that a lot of great functionality is hiding in plain sight. The tutorial shows you just how incredible this app is.  Also, it&amp;rsquo;ll generate ePub and Kindle formats for you, and it lets you write in Markdown,* if you want.*&lt;/p&gt;
&lt;p&gt;Scrivener is $45 and has a free trial.&lt;/p&gt;
&lt;h4 id=&#34;markdown-writing-apps&#34;&gt;Markdown Writing Apps&lt;/h4&gt;
&lt;h5 id=&#34;byword&#34;&gt;&lt;a href=&#34;http://www.bywordapp.com&#34;&gt;Byword&lt;/a&gt;&lt;/h5&gt;
&lt;p&gt;I&amp;rsquo;ve tried essentially every Markdown editor available for the Mac, and Byword is hands-down my favorite. I hope to write a post comparing them all, but Byword really is the best in my opinion. Feel free to ping me with questions if you&amp;rsquo;re considering it or one of the many alternatives.&lt;/p&gt;
&lt;p&gt;Byword is $9.99&lt;/p&gt;
&lt;h5 id=&#34;marked&#34;&gt;&lt;a href=&#34;http://www.MarkedApp.com&#34;&gt;Marked&lt;/a&gt;&lt;/h5&gt;
&lt;p&gt;Most of the good Markdown editors already have the ability to preview your work. With marked you can preview things while you write them without having to switch back and forth. It&amp;rsquo;s also great for reading Markdown documentation. Also, it can hide the crazy YAML frontmatter that Jekyll / Octopress shove into the top of your posts.&lt;/p&gt;
&lt;p&gt;Marked is $3.99&lt;/p&gt;
&lt;h5 id=&#34;multimarkdown-composer&#34;&gt;&lt;a href=&#34;http://multimarkdown.com/&#34;&gt;MultiMarkdown Composer&lt;/a&gt;&lt;/h5&gt;
&lt;p&gt;Brought to you by the man who brought us MultiMarkdown in the first place, this is a really good Markdown editor, with a really useful outline navigator. From a features standpoint it&amp;rsquo;s probably the best, but it just doesn&amp;rsquo;t &lt;em&gt;feel&lt;/em&gt; as nice as Byword to me.&lt;/p&gt;
&lt;p&gt;MultiMarkdown Composer is $9.99&lt;/p&gt;
&lt;h5 id=&#34;texts&#34;&gt;&lt;a href=&#34;http://www.textseditor.com/&#34;&gt;Texts&lt;/a&gt;&lt;/h5&gt;
&lt;p&gt;Texts deserves an honorary mention. It&amp;rsquo;s still young, and rough around the edges, but it&amp;rsquo;s a great WYSIWYM text editor that generates Markdown behind the scenes. It only supports a subset of Markdown at the moment, but it shows good promise. I&amp;rsquo;m really rooting for this app.&lt;/p&gt;
&lt;p&gt;Texts is free&lt;/p&gt;
&lt;h3 id=&#34;graphics--images&#34;&gt;Graphics / Images&lt;/h3&gt;
&lt;h4 id=&#34;pixelmator&#34;&gt;&lt;a href=&#34;www.pixelmator.com&#34;&gt;Pixelmator&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Very well made, amazingly capable, and affordable for real humans. Lots of people like &lt;a href=&#34;http://flyingmeat.com/acorn/&#34;&gt;Acorn&lt;/a&gt; but Pixelmator just feels more professional, polished, and capable to me.&lt;/p&gt;
&lt;p&gt;Pixelmator is $29.99&lt;/p&gt;
&lt;h4 id=&#34;skitch&#34;&gt;&lt;a href=&#34;http://skitch.com/&#34;&gt;Skitch&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;If you ever need to annotate screenshots to report bugs, point out items that need to be improved, or anything like that you &lt;em&gt;need&lt;/em&gt; Skitch. Lots of apps &lt;em&gt;can&lt;/em&gt; do this. Skitch is the only one that makes it both trivially easy and good looking.&lt;/p&gt;
&lt;p&gt;Skitch is free&lt;/p&gt;
&lt;h4 id=&#34;omnigraffle&#34;&gt;&lt;a href=&#34;http://www.omnigroup.com/products/omnigraffle/&#34;&gt;OmniGraffle&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;If you ever need to make flowcharts you want this app. I&amp;rsquo;ve tried every noteworthy flowchart app on OS X, Linux, and Windows. Nothing compares to OmniGraffle. It&amp;rsquo;s also great for mocking-up interfaces, and creating complicated paper forms (yeah, some people still use paper). OmniGroup&amp;rsquo;s stuff costs a bit more but is worth every penny.&lt;/p&gt;
&lt;p&gt;OmniGraffle is $99 and $199 for the Pro version, which does have some nice additional features professional designers might be interested in.&lt;/p&gt;
&lt;h3 id=&#34;geekery--coding&#34;&gt;Geekery / Coding&lt;/h3&gt;
&lt;h4 id=&#34;macvim&#34;&gt;&lt;a href=&#34;http://macvim.org/&#34;&gt;MacVim&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;True geeks know the power of Vim (and Emacs). True Mac geeks know the power of MacVim. Still don&amp;rsquo;t know why we love Vim? &lt;a href=&#34;http://www.viemu.com/a-why-vi-vim.html&#34;&gt;Read This&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;MacVim is free&lt;/p&gt;
&lt;h3 id=&#34;miscellaneous&#34;&gt;Miscellaneous&lt;/h3&gt;
&lt;h4 id=&#34;nvalt&#34;&gt;&lt;a href=&#34;http://brettterpstra.com/project/nvalt/&#34;&gt;nvAlt&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Brought to you by the same guy who brought you Marked, nvAlt is a fork of the original NotationVelocity app that just builds upon the awesome. nvAlt is the best tool out there for storing and managing collections of little notes. It also lets you write in Markdown (and grab the generated HTML), which leads a lot of people to use it for keeping and working on draft versions of blog posts.&lt;/p&gt;
&lt;p&gt;nvAlt is free&lt;/p&gt;
&lt;h4 id=&#34;1password&#34;&gt;&lt;a href=&#34;https://agilebits.com/onepassword&#34;&gt;1Password&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Nothing beats 1Password for password storage. Get the OS X version, plus a copy for your iOS or Android device and you&amp;rsquo;ve got all your passwords everywhere. Also lets you securely store credit card numbers and other sensitive information. Combine it with its easy to use browser plugins and nothing else comes close.&lt;/p&gt;
&lt;p&gt;The only downside to 1Password is that it ain&amp;rsquo;t cheap. It&amp;rsquo;s $49.99 for the mac version plus another $15 for the iPhone + iPad version. Probably the same for the Android version.&lt;/p&gt;
&lt;h4 id=&#34;transmission&#34;&gt;&lt;a href=&#34;http://www.transmissionbt.com/&#34;&gt;Transmission&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;If you&amp;rsquo;re on a OS X, and you need a Bittorrent client, this is the one to get.&lt;/p&gt;
&lt;p&gt;Transmission is donationware.&lt;/p&gt;
&lt;h4 id=&#34;chuck&#34;&gt;&lt;a href=&#34;https://github.com/msanders/Chuck&#34;&gt;Chuck&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;A simple, excellent, app launcher, that&amp;rsquo;ll stick a moustache in your menu bar. What more could you want. Type a few keystrokes and voilla, the app you need has just been launched. No more reaching for the mouse.&lt;/p&gt;
&lt;p&gt;Chuck is free.&lt;/p&gt;
&lt;h4 id=&#34;capo&#34;&gt;&lt;a href=&#34;http://supermegaultragroovy.com/products/Capo/&#34;&gt;Capo&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Capo deserves every award it has won. &amp;ldquo;Capo is a revolutionary tool that helps you learn the music in your iTunes library. By slowing your music, and presenting a detailed spectrogram, Capo lets you hear and see your music like never before. &amp;quot; More importantly to me, you can just drag over the darker bits in the spectrogram and it&amp;rsquo;ll tell you what notes are being played, and help you figure out the chord changes for that song you want to learn but can&amp;rsquo;t find any sheet-music / tablature for. There is also an iPhone version of the app which I can&amp;rsquo;t comment on but is well regarded.&lt;/p&gt;
&lt;p&gt;Capo is $50 for the Mac version and $20 for the iPhone version.&lt;/p&gt;
&lt;h4 id=&#34;reeder&#34;&gt;&lt;a href=&#34;http://reederapp.com/mac/&#34;&gt;Reeder&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;The best RSS Feed Reader for the mac. It combines with the wonderful &lt;a href=&#34;http://www.readability.com/&#34;&gt;Readability&lt;/a&gt; service to make reading everything better.&lt;/p&gt;
&lt;p&gt;Reeder is $9.99 for the Mac version, $4.99 for the iPad version and $2.99 for the iPhone version.&lt;/p&gt;
&lt;h4 id=&#34;mailmate&#34;&gt;&lt;a href=&#34;http://freron.com/&#34;&gt;MailMate&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;A really impressive e-mail client, with a slew of functionality that can&amp;rsquo;t be found anywhere else, like a little pane that will show you all the prior conversations you&amp;rsquo;ve had with the person you&amp;rsquo;re currently reading an e-mail from.&lt;/p&gt;
&lt;p&gt;One thing about it that you&amp;rsquo;ll either love, or hate, is that it intentionally only allows you to write e-mails in plain-text, but it compensates by being the only e-mail client I&amp;rsquo;ve seen on the Mac that also lets you write in Markdown, and automatically generates a nicely formatted version for your recipient to read.&lt;/p&gt;
&lt;p&gt;The author advises using it for a couple weeks before making a decision about it. I&amp;rsquo;m going to have to agree with him. It&amp;rsquo;s capabilities definitely grow on you over time. It&amp;rsquo;s only downside is that, it isn&amp;rsquo;t quite up to the typically high UI standards that we&amp;rsquo;ve come to expect from Mac apps. It&amp;rsquo;s not bad looking, but it&amp;rsquo;s not great either.&lt;/p&gt;
&lt;p&gt;MailMate is $29.99 with a free trial.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Why bootstrappers should track their time</title>
      <link>https://weblog.masukomi.org/2012/01/27/why-bootstrappers-should-track-their-time/</link>
      <pubDate>Fri, 27 Jan 2012 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2012/01/27/why-bootstrappers-should-track-their-time/</guid>
      <description>&lt;h2 id=&#34;the-problem&#34;&gt;The Problem&lt;/h2&gt;
&lt;p&gt;Most people only track their time when they are billing by the hour,
and most people aren&amp;rsquo;t billing by the hour. As a result, most people
don&amp;rsquo;t track their time.&lt;/p&gt;
&lt;p&gt;Now, you can try to bootstrap a new business or product without time
tracking, but you&amp;rsquo;re doing yourself a great disservice if you do. The
problem is that we always think we can get more done than we really
have time for, and we
inevitably think we&amp;rsquo;ll have more time to work on things than we really
do. Add to this the fact that humans are incredibly bad about judging
and estimating time, and it&amp;rsquo;s pretty much guaranteed that our
after-hours projects will take longer than we thought.&lt;/p&gt;
&lt;p&gt;One of the biggest consequences of this to someone trying to bootstrap
a new company, is an overestimation of what should be included in your
&lt;a href=&#34;http://en.wikipedia.org/wiki/Minimum_viable_product&#34;&gt;Minimum Viable
Product&lt;/a&gt;. There
are so many features that would &amp;ldquo;be easy
to add&amp;rdquo; or take &amp;ldquo;no time at all&amp;rdquo;, and even when they are easy, or
fast, most of us are lucky to even have enough time to get the truly core
functionality done. Not having a good
grasp of just how long things are taking to complete allows these
&amp;ldquo;nice-to-haves&amp;rdquo; to sneak in when they should really be held back for a
future version of the product.&lt;/p&gt;
&lt;p&gt;With no reliable information on how long it takes you to do something
you can&amp;rsquo;t create useful estimations. When you overestimate your
capabilities you underestimate the value of outsourcing, and what
things most need to be outsourced.&lt;/p&gt;
&lt;p&gt;In the end, bootstrapped projects, worked on in stolen hours between
&amp;ldquo;real work&amp;rdquo;, and life, move at an almost glacial pace. Time tracking is the
only significant tool we have to address this, and it becomes
increasingly more valuable with each successive project.&lt;/p&gt;
&lt;p&gt;##The Techniques&lt;/p&gt;
&lt;p&gt;Precision is not important. You&amp;rsquo;re not billing anyone for this. What
&lt;em&gt;is&lt;/em&gt; important is that you&amp;rsquo;re keeping good track of the time spent on
specific &lt;em&gt;types&lt;/em&gt; of tasks, and that you can easily go back and see how
much you spent on each.  The &lt;em&gt;most&lt;/em&gt; important thing you can do is to
choose a tool that makes it easy for yourself.&lt;/p&gt;
&lt;p&gt;Paper tracking &lt;em&gt;can&lt;/em&gt; work, but the ability to see a nice graph of the
time you&amp;rsquo;ve spent working over the past week should not be
underestimated either. Seeing an unbroken graph showing your constant
forward progress can really help keep you moving forward, knowing that
you will make it there. If you find yourself skipping more days than
you really ought to, that graph will help you to quantify just how
much of a slacker you&amp;rsquo;ve been, and hopefully kick your butt back into
motion.&lt;/p&gt;
&lt;p&gt;My recommendation is to go with task groupings that are relatively
high level, but detailed enough to help you assess where your time is
going in a useful manner. Using just &amp;ldquo;Design&amp;rdquo; and &amp;ldquo;Coding&amp;rdquo; isn&amp;rsquo;t going
to cut it. On the other hand, getting too detailed is going to be
annoying to set up, frustrating to choose between when entering new
time, and harder to track usefully when looking back.&lt;/p&gt;
&lt;p&gt;These are the task types I&amp;rsquo;m currently tracking for my web applications:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Coding&lt;/li&gt;
&lt;li&gt;Web Design ( HTML / CSS work )&lt;/li&gt;
&lt;li&gt;Graphics ( logo design, image creation, etc )&lt;/li&gt;
&lt;li&gt;Marketing&lt;/li&gt;
&lt;li&gt;Market research&lt;/li&gt;
&lt;li&gt;Code Research (tool research, project specific technique research, etc.)&lt;/li&gt;
&lt;li&gt;Contractor evaluation / management&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Track everything.&lt;/p&gt;
&lt;p&gt;If you have to read a book to learn something specific to your product
or it&amp;rsquo;s market then track it as research. These hours add up, and we
never realize just how much time they take. Worse, we don&amp;rsquo;t take it
into account when we&amp;rsquo;re trying to figure out how much time the next
project is going to take. Track your time on this project and you&amp;rsquo;ll
have some basis for your future estimations.&lt;/p&gt;
&lt;p&gt;When outsourcing small focused task like logo design you&amp;rsquo;ll frequently
be billed for the hours worked, but there&amp;rsquo;s no point in trying to
convince the contractor to learn and use your time tracking system for
your short task. Instead just enter the hours they spent working on it
into your system yourself. If they&amp;rsquo;ve quoted you a flat rate, then
just ask them for an estimate of how long it took when everything is
done, or at the end of weekly updates.&lt;/p&gt;
&lt;p&gt;In my case the Graphics, Marketing, and some of the Market Research is
outsourced, and I&amp;rsquo;ll typically just add in the amount of time it took
them in single shots on the given week. It makes the graphs look funny
but I don&amp;rsquo;t really care how much they worked on any given day. I just
want to be able to keep track of how much time they can and do devote
to the project so that I can better predict what&amp;rsquo;s going to happen the
next time I hire them.&lt;/p&gt;
&lt;h3 id=&#34;learn&#34;&gt;Learn&lt;/h3&gt;
&lt;p&gt;Keep an eye on your hours through the week. Working a specific number
of hours each day rarely works when you&amp;rsquo;re a bootstrapper; your day
job, personal responsibilities, and taking time to relax and stay sane
rarely leave us with much for our side projects. So, don&amp;rsquo;t berate
yourself if you only got half an hour in last Tuesday. Use it as a
tool to keep yourself moving moving forwards, and head-off slacking
before it becomes a problem.&lt;/p&gt;
&lt;p&gt;As your project goes forward patterns will start to emerge. You&amp;rsquo;ll
discover that  some types of tasks are taking you notably longer than
expected. When you see this, don&amp;rsquo;t just sit on the information. Use it
to your advantage. Outsource the parts that aren&amp;rsquo;t your core
competencies. It&amp;rsquo;s generally a good idea to do that anyway, but being
humans filled with ego, we tend to think we can do it all. Use what
your time tracking is telling you to help convince yourself to get
help. Remember, every additional day you have to spend working to get
your project out the door is another day it can&amp;rsquo;t be making you money.&lt;/p&gt;
&lt;h3 id=&#34;reassess&#34;&gt;Reassess&lt;/h3&gt;
&lt;p&gt;At the end of a project make a writeup for yourself with all the
important takeaways, including how much time each part of the project
took. Then, figure out how much it would have cost you to outsource
each ofnthe parts. Don&amp;rsquo;t calculate it at your rate, calculate it at
the average rate of the freelancers you could have hired to do it for
you. When outsourcing to people in foreign countries this can be
significantly cheaper.&lt;/p&gt;
&lt;p&gt;Once you&amp;rsquo;ve done that, figure out how fast your could have gotten the
project done if you had of oursourced and parralellized as much of the
process as possible. Some things simply have to wait for others to
finish, but some tasks, like putting together your marketing strategy
and copy can be worked on almost completely independently of other
tasks.&lt;/p&gt;
&lt;p&gt;##The Tools
As I said above, the &lt;em&gt;most&lt;/em&gt; important thing you can do is to choose a
tool that makes it easy for yourself. Some tools have incredible lists
of features; there are only two that matter.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;How easy is it to enter time? More critically, how easy is it to
enter time when you discover you forgot to hit start ontheir
handy-dandy stopwatch.&lt;/li&gt;
&lt;li&gt;How much do you &lt;em&gt;like&lt;/em&gt; the tool?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Some tools have great functionality, and designs that are so ugly as
to make you cringe every time you open it. Don&amp;rsquo;t use them. The harder,
or less pleasant a tool is to use the less likely you will be to use
it, especially when you don&amp;rsquo;t &amp;ldquo;need&amp;rdquo; to be using one.&lt;/p&gt;
&lt;p&gt;My advice is this: almost all of the tools out there offer either a
free plan or a 30 day trial. Pick the first one that looks interesting
and isn&amp;rsquo;t too expensive for you. Use it religiously for one week. If
it annoys you, or doesn&amp;rsquo;t make you happy, close your account and move
on. Don&amp;rsquo;t bother re-entering the past week&amp;rsquo;s data. Repeat until
you&amp;rsquo;ve found something that works for you. Do &lt;em&gt;not&lt;/em&gt; let yourself just
accept it as &amp;ldquo;good enough&amp;rdquo; and abandon the search. Humans are terrible
about this. We&amp;rsquo;ll almost always stay in a slightly uncomfortable
situation instead of risking a change that could make things better.
If you&amp;rsquo;re not happy with your first choice, force yourself to try
something else.&lt;/p&gt;
&lt;h3 id=&#34;what-i-look-for&#34;&gt;What I look for:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Good design&lt;/li&gt;
&lt;li&gt;Trivially easy data entry. Everyone offers some kind of easy
stopwatch tool. Few apps make it trivial to enter time without that.&lt;/li&gt;
&lt;li&gt;Support for lots of projects in a plan I can afford. I am usually
only working on one project at a time, but have an ongoing stream of
them and don&amp;rsquo;t want to have to throw out the data I&amp;rsquo;ve collected on
old projects in order to start a new one. The more historical data I
have available the better I can plan my upcoming projects.&lt;/li&gt;
&lt;li&gt;Good graphing tools that let me easily see the overall time spent as
well as the time spent on given task types.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;things-to-watch-out-for&#34;&gt;Things to watch out for&lt;/h3&gt;
&lt;p&gt;If you&amp;rsquo;re going to be outsourcing make sure that the tool has support
for enough people at a price you can afford.&lt;/p&gt;
&lt;p&gt;Many of the tools out there are very focused on freelancers, and small
businesses that bill by the hour. They have the basic assumption that
if you&amp;rsquo;re tracking your time, you must be billing for it, and if
you&amp;rsquo;re billing for it then their software has become a critical piece
of you making money. It&amp;rsquo;s a reasonable, and fair assumption and they
should be compensated accordingly, but when you&amp;rsquo;re using their
software to simply work on better managing your time, many of the
features they&amp;rsquo;re offering become irrelevant, and not worth the money.&lt;/p&gt;
&lt;p&gt;Some tools only retain your data for a limited number of years. This
may or may not be an issue, but it is something you&amp;rsquo;ll want to
consider. Personally I&amp;rsquo;d rather not have to worry about what to do to
store all my old data on a rolling basis starting 3 years from now (or
whatever their cutoff is). When I find a tool I&amp;rsquo;m happy with I want to
be able to just stick with it and not have to ever deal with tracking
down a new provider or archiving old data myself.&lt;/p&gt;
&lt;p&gt;Pie charts. Seriously. The human brain is simply incapable of
accurately judging the relative size of pie slices. Pie charts are
&lt;em&gt;only&lt;/em&gt; useful to show massive disparities. When evaluating the
graphing tools of an app pretend their pie charts don&amp;rsquo;t even exist,
because the data they provide you &lt;em&gt;will not&lt;/em&gt; be notably useful.&lt;/p&gt;
&lt;h3 id=&#34;which-tools-to-choose&#34;&gt;Which tools to choose?&lt;/h3&gt;
&lt;p&gt;I wish I had a handful of great tools to point you to. Unfortunately I
haven&amp;rsquo;t found anything that really makes me happy. I&amp;rsquo;ll let you know
when I do. The best place to start though is Wikipedia, which has a
great &lt;a href=&#34;http://en.wikipedia.org/wiki/Comparison_of_time_tracking_software&#34;&gt;Comparison of time tracking
software&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Have you found a time tracking tool that would be great for
bootstrappers? Let me know.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The thing about Mock Objects</title>
      <link>https://weblog.masukomi.org/2012/01/13/the-thing-about-mock-objects/</link>
      <pubDate>Sat, 14 Jan 2012 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2012/01/13/the-thing-about-mock-objects/</guid>
      <description>&lt;p&gt;You can tell weather or not someone really &amp;ldquo;gets&amp;rdquo; unit testing by asking them one simple question, &amp;ldquo;Do you use mock objects?&amp;rdquo; Almost invariably, they will say &amp;ldquo;no&amp;rdquo;. Even people who have totally gotten the testing religion. It&amp;rsquo;s like watching someone pray to a statue of Jesus; totally oblivious to the fact that Jesus himself is standing four feet away reading a book.&lt;/p&gt;
&lt;p&gt;This is partially due to the fact that most geeks don&amp;rsquo;t actually know &lt;a href=&#34;http://www.masukomi.org/writings/best_practices/node15.html&#34;&gt;what a unit test is&lt;/a&gt;. They think that testing the methods of a specific class constitutes a unit test, but that&amp;rsquo;s only part of the story. A unit test test is when you test the methods of a specific class &lt;em&gt;in isolation&lt;/em&gt;, and the difference is critical. You know how some people call us &amp;ldquo;computer scientists&amp;rdquo;. Yeah, well this is the science part.&lt;/p&gt;
&lt;p&gt;Imagine you were creating a new medicine, and wanted to test it out on some cells in a petri dish. The weather was so nice you decided to take your dish outside and enjoy the sunlight while you ran your test. It&amp;rsquo;s a resounding success! Or&amp;hellip; is it? How do you know it&amp;rsquo;s wasn&amp;rsquo;t just the UV rays from the sunlight? Or maybe there was something floating in from the nearby blossoms? You don&amp;rsquo;t, and you can&amp;rsquo;t. You can&amp;rsquo;t even say, with any confidence, that the medicine worked. Something worked. Maybe the medicine had a part in it, maybe it didn&amp;rsquo;t. You can&amp;rsquo;t tell.&lt;/p&gt;
&lt;p&gt;The same thing applies to unit testing. If you&amp;rsquo;re not testing in isolation there is no way to know that the thing your are testing was actually effective or if it just happened to work in the current environment, and when the test fails there&amp;rsquo;s no way to know (without digging) if your code was responsible, or if something it relies on has broken and passed on its problems. Mock objects are the best tool we have for addressing this problem.&lt;/p&gt;
&lt;h2 id=&#34;a-mock-what&#34;&gt;A Mock What?&lt;/h2&gt;
&lt;p&gt;You probably already know, but just in case, mock objects&amp;hellip;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;&amp;hellip;are simulated objects that mimic the behavior of real objects in controlled ways. A programmer typically creates a mock object to test the behavior of some other object, in much the same way that a car designer uses a crash test dummy to simulate the dynamic behavior of a human in vehicle impacts.&amp;rdquo; - &lt;a href=&#34;http://en.wikipedia.org/wiki/Mock_object&#34;&gt;Wikipedia&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In practice it is a functional guarantee that a foreign object/method/API, will behave in a specific way regardless of its implementation. You figure out exactly what a call should return and then you encode that in your mock.&lt;/p&gt;
&lt;h2 id=&#34;why&#34;&gt;Why?&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s look at an example. In a banking application a User would have one or more Accounts, and it&amp;rsquo;s not uncommon for the User and Account objects to each have methods that reference the other. Maybe, the User object has an &lt;code&gt;available_funds()&lt;/code&gt; method that adds up all the available funds in each of the Accounts. User is depending on each Account object to correctly calculate the current balance, minus any outstanding charges. Problems arise when there&amp;rsquo;s a bug in how Account is doing its calculation. Now, the test of your User&amp;rsquo;s &lt;code&gt;available_funds()&lt;/code&gt; method is failing, but you can&amp;rsquo;t tell if it&amp;rsquo;s because it was performing a bad calculation or Account was. Even worse, it could be that there&amp;rsquo;s bad data in the database, or that someone changed your test data but didn&amp;rsquo;t update the tests. All you know is that the number expected isn&amp;rsquo;t the one received.&lt;/p&gt;
&lt;p&gt;The problem with this setup is that you&amp;rsquo;re no longer testing your User object when you do this. You&amp;rsquo;re testing that the code in your User class works &lt;em&gt;if&lt;/em&gt; the code in the Account class &lt;em&gt;also&lt;/em&gt; works. The typical solution of carefully chosen test data in a database does not solve this problem in any way. The only thing it does is add in another source of potential failures and misdirections, and provides yet another thing to maintain.&lt;/p&gt;
&lt;p&gt;Using mock objects allows you to test that the User class works regardless of how broken the Account class may or may not be, with no database installed anywhere, and no separate fake data to maintain. You create a real User object and mock up the calls to Account to return mocked account objects, mocked data, whatever else is appropriate.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re not doing this, you are not unit testing. That&amp;rsquo;s not meant to deride what you&amp;rsquo;re doing. I mean that as a literal statement of fact. Anyone, for example, who is using the built in Rails &amp;ldquo;unit&amp;rdquo; testing framework with fixtures (or FactoryGirl fixtures) is guilty of this. No test that relies on a separate class, or API, or interfaces with a database in any way  is a unit test. It is an &lt;a href=&#34;http://www.masukomi.org/writings/best_practices/node17.html&#34;&gt;integration test&lt;/a&gt; (some people call them functional test), and when something goes wrong it is just a matter of time before it misleads you.&lt;/p&gt;
&lt;p&gt;Now, integration tests are great. They serve the &lt;em&gt;very&lt;/em&gt; useful function of guaranteeing that your code works within the context of the expected ecosystem, but they&amp;rsquo;re not very good about telling you &lt;em&gt;exactly&lt;/em&gt; what has broken.&lt;/p&gt;
&lt;p&gt;People &lt;em&gt;will&lt;/em&gt; disagree with me on this. They&amp;rsquo;ll argue that testing with the db and other classes isn&amp;rsquo;t bad, that they can generally tell what&amp;rsquo;s broken very quickly. And it&amp;rsquo;s true that a developer with a good knowledge of the system should be able to figure out what&amp;rsquo;s causing a test to fail pretty quickly, but until they start digging there&amp;rsquo;s no way to be 100% confident that the bug is where the unit test claims it is because of all the other things that could affect it.&lt;/p&gt;
&lt;h2 id=&#34;but-thats-not-all&#34;&gt;But that&amp;rsquo;s not all&lt;/h2&gt;
&lt;p&gt;The process of creating mocks to support your tests will &lt;em&gt;very&lt;/em&gt; frequently reveal unexpectedly tight coupling&amp;rsquo;s between classes and systems. Because you need to mock up &lt;em&gt;every&lt;/em&gt; interaction with a foreign anything, you end up creating a bunch of additional lines in your test. Each one is an expenditure of effort and each one represents a coupling. If the object you were testing wasn&amp;rsquo;t coupled to anything else you wouldn&amp;rsquo;t need to mock anything.  Adding a few lines of mocking to your test is no big deal, but when you have 20+ lines of mocking in a single test it&amp;rsquo;s a strong indication that something is wrong in your system. If you find you can&amp;rsquo;t figure out &lt;em&gt;how&lt;/em&gt; to mock something up it either means that you don&amp;rsquo;t really understand what the thing you need to mock does, &lt;em&gt;or&lt;/em&gt; that it suffers from a notably poor design.&lt;/p&gt;
&lt;p&gt;Mocking should always be easy, and quick. The only times it isn&amp;rsquo;t are when you&amp;rsquo;ve got a poor design, or an insufficient grasp of what you&amp;rsquo;re attempting to test. These are both very good things to have revealed.&lt;/p&gt;
&lt;p&gt;Sometimes, the mocks will reveal bad designs, or excessive coupling&amp;rsquo;s in an library you didn&amp;rsquo;t even write. Part of the reason I started writing this article was because of just that type of situation. I was trying to unit test a Rails controller. Typically people just &lt;em&gt;don&amp;rsquo;t&lt;/em&gt; unit test rails controllers. They do functional tests that tie in the controller methods, the database, and the view generation, which again, is useful, but doesn&amp;rsquo;t do a great job of telling you exactly what is broken when the test fails until you start digging.  Anyway, the methods I was testing required an the user viewing them to be logged in, but try as I might I could not find a way to successfully mock it so that it never touched the database.&lt;/p&gt;
&lt;p&gt;I assumed that I simply didn&amp;rsquo;t understand the library, and began looking and source code and googling around. After hours of trying, and failing, to make it work I eventually started Googling from a different angle and discovered that the problem was that it simply wasn&amp;rsquo;t possible (by any reasonably definition of the word) to test this library with mock objects, even leveraging its test helper classes.  The thing was &lt;em&gt;so&lt;/em&gt; tightly coupled to the underlying database that it demanded the presence of a test database with appropriately structured fake data to even create a test login.&lt;/p&gt;
&lt;p&gt;I had to make the choice of either giving up on any hope of decoupling my tests from the database or throwing out a working authentication system. I care about my users, and I care about being able to guarantee that my sites work for them, so I spent two evenings throwing out that system, learning and implementing a new one, figuring out how to test it without touching the database, and then making all my controller tests work again.&lt;/p&gt;
&lt;p&gt;It was worth every minute.&lt;/p&gt;
&lt;h2 id=&#34;reasons-not-to-use-mocks&#34;&gt;Reasons not to use mocks&lt;/h2&gt;
&lt;p&gt;The downside to mocking everything is the inverse of &lt;em&gt;not&lt;/em&gt; mocking anything. If you don&amp;rsquo;t do pure unit testing, and don&amp;rsquo;t mock anything you can never be 100% confident that your objects work in isolation. If you don&amp;rsquo;t do integration testing and do mock everything you can&amp;rsquo;t be 100% confident that your objects work in concert with each other.&lt;/p&gt;
&lt;p&gt;A combination of unit tests and integration tests is always best. There&amp;rsquo;s no reason not to build both. It just makes your system more robust and catches more bugs before they are released. But, if I had to choose one only one method, I would choose pure unit tests with mock objects for two reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The objects you test in unit tests constitute the foundation, the building blocks, of your system. If they have problems then &lt;em&gt;everything&lt;/em&gt; has problems. I want the maximum possible confidence that each of those building blocks is reliable and well crafted.&lt;/li&gt;
&lt;li&gt;The process of mocking up the interactions with other objects gives me a far better understanding of how my system works and frequently reveals design flaws in my code, and the libraries I&amp;rsquo;ve chosen to use. Exposing and correcting those flaws helps improve the maintainability of my code.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I realize this is not the popular choice, and many developers, would argue that if you&amp;rsquo;re going to write only one test it should be an integration test. There are good arguments for that, but there are &lt;em&gt;no&lt;/em&gt; good arguments for doing either without the other.&lt;/p&gt;
&lt;h2 id=&#34;a-moment-for-factorygirl&#34;&gt;A moment for FactoryGirl&lt;/h2&gt;
&lt;p&gt;This one is specifically for the Ruby geeks, but I&amp;rsquo;m sure there are similar tools for other languages. &lt;a href=&#34;https://github.com/thoughtbot/factory_girl&#34;&gt;FactoryGirl&lt;/a&gt; is a system that allows you to easily create named fixtures with the data you need.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;When you invoke a factory, factory_girl uses your definitions to compile a list of attributes that should be assigned to that instance, as well as any associated factories&amp;hellip; To create an instance, it calls new without any arguments, assigns each attribute (including associations), and then calls save!&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In other words, it&amp;rsquo;s a nice wrapper around what is an inherently &lt;em&gt;bad&lt;/em&gt; idea for unit tests. In fact, using it guarantees that you are &lt;em&gt;not&lt;/em&gt; writing unit tests.&lt;/p&gt;
&lt;p&gt;From what I&amp;rsquo;ve seen FactoryGirl is almost always used as a bad stand-in for mock objects. It is a good solution for your integration tests, where you actually want to test that items can be sent to and retrieved from your database from the other parts of your system, but it should &lt;em&gt;never&lt;/em&gt; be called from a unit test because that is precisely what you &lt;em&gt;don&amp;rsquo;t&lt;/em&gt; want happening in that situation.&lt;/p&gt;
&lt;p&gt;Chris Parsons has &lt;a href=&#34;http://chrismdp.github.com/2011/10/your-tests-are-lying-to-you/&#34;&gt;a good writeup with plenty of code examples about FactoryGirl vs mocking&lt;/a&gt; that you should check out.&lt;/p&gt;
&lt;h2 id=&#34;the-takeaway&#34;&gt;The Takeaway&lt;/h2&gt;
&lt;p&gt;There is immense value to testing in isolation and the process of creating mock objects to support that testing. If you&amp;rsquo;re not testing in isolation, you&amp;rsquo;re not writing unit tests.&lt;/p&gt;
&lt;p&gt;If you haven&amp;rsquo;t been using mocks, take the tiny amount of time it takes to learn how   one of the popular mock object frameworks for your language, and start updating your unit tests to be true unit tests. Make sure that every new one is a true unit test, and every time you have to touch an old one take a moment to replace the fixtures with mocks. It will be worth it in the long run.&lt;/p&gt;
&lt;h2 id=&#34;resources-for-ruby-geeks&#34;&gt;Resources for Ruby Geeks&lt;/h2&gt;
&lt;p&gt;In the Ruby world we have a good number of mock object frameworks.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://mocha.rubyforge.org/&#34;&gt;Mocha&lt;/a&gt; is probably the best known, and from what I&amp;rsquo;ve seen most widely used.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://flexmock.rubyforge.org/&#34;&gt;Flexmock&lt;/a&gt; is another option, but I have essentially zero knowledge about it.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://rspec.info/&#34;&gt;RSpec&lt;/a&gt; has a built in mocking library called RSpec-Mocks. I have spoken with a number of RSpec users who prefer to use other mock libraries like Mocha instead of RSpec-Mocks. I&amp;rsquo;ve never gotten the RSpec religion so I can&amp;rsquo;t comment one way or the other.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/btakita/rr&#34;&gt;RR (Double Ruby)&lt;/a&gt; is a lesser-known option. The syntax is very nice (not nearly as verbose) and it offers some nice features like Proxies and Spies that other frameworks don&amp;rsquo;t.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Personally I&amp;rsquo;m a fan of Mocha and RR.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>My New Favorite Interview Question</title>
      <link>https://weblog.masukomi.org/2012/01/09/my-new-favorite-interview-question/</link>
      <pubDate>Mon, 09 Jan 2012 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2012/01/09/my-new-favorite-interview-question/</guid>
      <description>&lt;p&gt;I interview a fair number of geeks every year and usually spend my
alotted time going over one programming challenge. Lately I&amp;rsquo;ve been
looking for a new one that was simple, but still big enough to give
me a glimpse into their thinking. I think I&amp;rsquo;ve found it.&lt;/p&gt;
&lt;h2 id=&#34;why-i-like-this&#34;&gt;Why I Like This&lt;/h2&gt;
&lt;p&gt;I really like this question because:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A good solution involves recursion but you could approach it in multiple ways.&lt;/li&gt;
&lt;li&gt;The seemingly simple Array throws a monkey-wrench into the whole thing.&lt;/li&gt;
&lt;li&gt;It tests their ability to follow written instructions.&lt;/li&gt;
&lt;li&gt;It should give an idea of how willing they are to ask questions.&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s small, but with 3 separate, but connected, things to handle should be enough
to give insight into how they work through things.&lt;/li&gt;
&lt;li&gt;In my experience you&amp;rsquo;ll spend ~40 minutes on this regardless of experience level. I&amp;rsquo;ve only had one person do it in 5. If folks finish a little early I try and find out what kind of job would make them happy.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;the-question&#34;&gt;The Question&lt;/h2&gt;
&lt;p&gt;You&amp;rsquo;re presented with the following &lt;a href=&#34;http://www.yaml.org&#34;&gt;YAML&lt;/a&gt; file which you need to convert to a useful data structure, but for whatever reason you don&amp;rsquo;t have a YAML library. You do however, have something that has converted it into a tree of nodes.&lt;/p&gt;
&lt;p&gt;Each node has some useful methods you can call:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;node.type&lt;/code&gt; returns Array, Hash, or String&lt;/li&gt;
&lt;li&gt;&lt;code&gt;node.name&lt;/code&gt; returns the name of the current node or null/nil if you&amp;rsquo;re looking at a node in an array.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;node.value&lt;/code&gt; returns a node, or a String&lt;/li&gt;
&lt;li&gt;&lt;code&gt;node.next&lt;/code&gt; returns the next node in the tree at the current level or null/nil (assume there are no empty nodes)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;node.children&lt;/code&gt; will return all the child nodes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;the-goal&#34;&gt;The goal&lt;/h2&gt;
&lt;p&gt;Using the following YAML as an example, create a method that will take a &amp;ldquo;node&amp;rdquo; and return a useful data structure. In the case of the example YAML, that structure would look something like this (Ruby notation)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# en-us is just the name we&#39;ve assigned to the method&#39;s return value.

en-us[&#39;date&#39;][&#39;formats&#39;][&#39;default&#39;]   #=&amp;gt; contains &amp;quot;%Y-%m-%d&amp;quot;
# en-us is a hash, with a key &#39;date&#39;, whose value is a hash, 
# ... with the key &#39;formats&#39; whose value, in turn, is a hash
# ... with the key &#39;default&#39; whose value is a string.
# So, hash-&amp;gt;hash-&amp;gt;hash-&amp;gt;string

en-us[&#39;date&#39;][&#39;day_names&#39;][1]       #=&amp;gt; contains &amp;quot;Monday&amp;quot;
# hash-&amp;gt;hash-&amp;gt;array-&amp;gt;string
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;notes&#34;&gt;Notes&lt;/h2&gt;
&lt;p&gt;Keep in mind that Arrays items can themselves be Hashes, Strings, or other Arrays, and they can be nested, or empty.&lt;/p&gt;
&lt;h3 id=&#34;notes-for-inerviewer&#34;&gt;Notes for Inerviewer&lt;/h3&gt;
&lt;p&gt;I present the interviewee with &amp;ldquo;The Question&amp;rdquo; and &amp;ldquo;The Goal&amp;rdquo; one one side, with the YAML printed on the back. I point out the YAML and tell them that I&amp;rsquo;ll go over it with them when they reach that point. You can find a PDF version of it &lt;a href=&#34;https://weblog.masukomi.org/images/2012/01/09/interview_question.pdf&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I also tell them that &amp;ldquo;If you ask questions I&amp;rsquo;ll give you helpful answers. If you don&amp;rsquo;t ask questions I won&amp;rsquo;t. Please ask questions.&amp;rdquo; and let them know that I&amp;rsquo;m not looking for perfect syntax, optomized code, or anything like that. I &lt;em&gt;only&lt;/em&gt; want to see them work through the problem. That is 100% true.&lt;/p&gt;
&lt;p&gt;It is &lt;em&gt;very&lt;/em&gt; common for people to go down the wrong route before solving this. If someone is stuck on it for a while, I&amp;rsquo;ll tell them that if they can verbalize what they&amp;rsquo;re thinking, or ask me questions I can help. Every now and then you&amp;rsquo;ll get someone who absolutely refuses the help. That&amp;rsquo;s ok. You don&amp;rsquo;t want someone who refuses to work with helpful coworkers when they&amp;rsquo;re stuck.&lt;/p&gt;
&lt;p&gt;The test is &lt;em&gt;not&lt;/em&gt; to see if they can do it entirely themselves. The test is to see how they&amp;rsquo;ll work through a problem, and how they&amp;rsquo;ll leverage the resource of someone who knows more than them.&lt;/p&gt;
&lt;p&gt;People who give up are an automatic fail for me. If you can&amp;rsquo;t work through a problem with a &lt;em&gt;helpful&lt;/em&gt; questionner at such a critical time I can&amp;rsquo;t trust you in a crunch.&lt;/p&gt;
&lt;p&gt;Help folks who ask questions. Give them honest answers and leading hints. Don&amp;rsquo;t give them the answer, obviously, but work with them like the future coworker they might. Help them to figure it out by building on the thoughts in their head.&lt;/p&gt;
&lt;p&gt;Note that Junior / Intern level people may not have encountered the concept of recursion. That&amp;rsquo;s ok. At some point you may have to ask them if they&amp;rsquo;re familiar with it. Walk them through the idea and see if they can solve it then. Some mid-level people have it in their heads that recurion is evil for &amp;ldquo;performance reasons&amp;rdquo; and should be avoided at all costs. Assure them you don&amp;rsquo;t care about performance.&lt;/p&gt;
&lt;h4 id=&#34;about-the-yaml&#34;&gt;About the YAML&lt;/h4&gt;
&lt;p&gt;When they&amp;rsquo;re ready to look at the YAML I tell them that each line is a &amp;ldquo;node&amp;rdquo;. I then tell them I&amp;rsquo;m going to ask them some really &amp;ldquo;stupid&amp;rdquo; questions just to make sure you understand everything. I assure them that it&amp;rsquo;s not a trick. And then I ask them what the expected return values would be for each node type and make sure they understand that if i give them the &lt;code&gt;- Tuesday&lt;/code&gt; node they&amp;rsquo;d give me the string &lt;code&gt;&amp;quot;Tuesday&amp;quot;&lt;/code&gt;, &lt;code&gt;day_names&lt;/code&gt; becomes an array of seven strings, and so on. I also note that there can be nested data structures and that I don&amp;rsquo;t want a solution that would work for any tree of data structures, not just &lt;em&gt;this&lt;/em&gt; tree.&lt;/p&gt;
&lt;h2 id=&#34;the-yaml&#34;&gt;The Yaml&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&amp;quot;en-US&amp;quot;:
  date:
    formats:
      default: &amp;quot;%Y-%m-%d&amp;quot;
      short: &amp;quot;%b %d&amp;quot;
      long: &amp;quot;%B %d, %Y&amp;quot;

    day_names:
      - Sunday
      - Monday
      - Tuesday
      - Wednesday
      - Thursday
      - Friday
      - Saturday
  time:
    formats:
      default: &amp;quot;%a, %d %b %Y %H:%M:%S %z&amp;quot;
      short: &amp;quot;%d %b %H:%M&amp;quot;
      long: &amp;quot;%B %d, %Y %H:%M&amp;quot;
    am: &amp;quot;am&amp;quot;
    pm: &amp;quot;pm&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
</description>
    </item>
    
    <item>
      <title>Serving Octopress From a Self-hosted Git Repository</title>
      <link>https://weblog.masukomi.org/2011/12/19/serving-octopress-from-a-self-hosted-git-repository/</link>
      <pubDate>Mon, 19 Dec 2011 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2011/12/19/serving-octopress-from-a-self-hosted-git-repository/</guid>
      <description>&lt;p&gt;There are two good reasons to serve &lt;a href=&#34;http://www.octopress.org&#34;&gt;Octopress&lt;/a&gt; from a self-hosted git repo.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It provides you with an off-site backup in case your local copies go up in flames.&lt;/li&gt;
&lt;li&gt;It gives you an environment where you can integrate secondary scripts and libraries that allow you to do things like e-mail posts to Octopress.&lt;/li&gt;
&lt;li&gt;git provides a very efficient, and atomic, means of uploading your files.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Complicating factors:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Not all ISPs have ssh access or the latest version of ruby, and may not have git or Bundlr installed.&lt;/li&gt;
&lt;li&gt;Because of the above you may not be able to regenerate html files from markdown on the server.&lt;/li&gt;
&lt;li&gt;You need to have a basic familiarity with navigating directories and editing files over ssh.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These instructions are not for people uncomfortable with using the command line in a *nix environment. Of course, if you were uncomfortable with that you probably wouldn&amp;rsquo;t be using Octopress in the first place.&lt;/p&gt;
&lt;p&gt;In order to do this you must have ssh access to your server, and have git installed on it. In order to generate new files on the server you must also have Ruby 1.9.2 (or higher) and Bundlr installed You must also have a basic understanding of how to get around on a Linux command line. This is not uncommon these days, but in order to check just ssh in and type:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;which git
which bundle
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If they both return a path to the executable you&amp;rsquo;re all set. If git is installed we
can proceed without problem. If git &lt;em&gt;and&lt;/em&gt; bundler are installed and ruby is at 1.9.2 we can generate
the html on the server. For those not already familiar, &lt;code&gt;which xxxx&lt;/code&gt; will print out the path of the executable if it is installed &lt;em&gt;and&lt;/em&gt; on your path. If it returns immediately with no output it is either not installed or not on your path.&lt;/p&gt;
&lt;p&gt;Next check the ruby version:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ruby --version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Octopress requires a recent version of Ruby to run, so if it says anything lower than 1.9.2 you will not be able to generate files on the server. Talk to your ISP about installing a more recent version of Ruby.  You will, however, still be able to use git to transfer files to and from your server, serve from its generated directory, and act as a backup.&lt;/p&gt;
&lt;p&gt;There are a couple ways to make this work. You could just host a non-bare repo on the server and set receive.denycurrentbranch to ignore so that you can push to it, but for security reasons, and safer removal of deleted posts it&amp;rsquo;s better to use a detached work tree.&lt;/p&gt;
&lt;p&gt;SSH to your server, and create a new bare git repo somewhere that will &lt;em&gt;not&lt;/em&gt; be served to the public.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#on the server
mkdir octopress_blog.git
cd octopress_blog.git
git init --bare
# core.worktree should point to a directory where 
# everything will be checked out into, but not 
# visible to the public. You must create this 
# directory. Git will not create it for you.
git config core.worktree /path/to/staging/directory
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once you&amp;rsquo;ve done that we need to set up the post-receive hooks. Create a &lt;code&gt;hooks/post-receive&lt;/code&gt; file (in your bare repo) and make it look like this.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/sh
# checkout the files after they&#39;ve been pushed here
GIT_WORK_TREE=/path/to/staging/directory git checkout -f
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Next, make it executable&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chmod 755 hooks/post-receive
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Later we&amp;rsquo;ll tweak &lt;code&gt;hooks/post-receive&lt;/code&gt; to auto-generate the site (if you&amp;rsquo;ve got the pre-requesites on your server) but for now we just want to make sure we can push to it successfully.&lt;/p&gt;
&lt;p&gt;Back on your local computer:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd my_octopress_blog
git remote add live me@example.com:/path/to/octopress_blog.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now try pushing to it:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git push live master
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It doesn&amp;rsquo;t have to be the master branch but that&amp;rsquo;s what most people use so we&amp;rsquo;re working from that assumption. It should push without problem, but pay careful attention to lines starting with &amp;ldquo;remote:&amp;rdquo;.  If it does have problems, you should be able to figure out what&amp;rsquo;s wrong from the error message. At the end of the push you should see a message from remote saying &amp;ldquo;remote: Checking out files:&amp;hellip;&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Back on your server take a look in the directory you pointed core.worktree at and see if your blog has been checked out there. From here on out we have to divide the instructions for people who can generate files on the server, and people who can&amp;rsquo;t.&lt;/p&gt;
&lt;h2 id=&#34;to-generate-server-side-or-not&#34;&gt;To generate server-side or not&amp;hellip;.&lt;/h2&gt;
&lt;h3 id=&#34;generating-html-server-side&#34;&gt;Generating HTML server-side&lt;/h3&gt;
&lt;p&gt;Generating the html files server-side is good because you can set up things like &lt;a href=&#34;https://github.com/masukomi/JekyllMail&#34;&gt;JekyllMail&lt;/a&gt; to allow you to post to your Octopress without having to have a local checkout (great for blogging from work).  Another benefit is that your &amp;ldquo;public&amp;rdquo; directory doesn&amp;rsquo;t have to be a subdirectory of your Octopress checkout. You can tweak your &lt;code&gt;_config.yml&lt;/code&gt; to generate it anywhere on the server which can make server configuration easier for some. If you do change the &lt;code&gt;destination&lt;/code&gt; attribute in your &lt;code&gt;_config.yml&lt;/code&gt; on the server to a path that differs from your local version you&amp;rsquo;ll have to be careful to not commit any local changes to it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Caveat Emptor&lt;/strong&gt;: On shared servers there is one gotcha that you&amp;rsquo;ll have to be aware of. Long-running scripts are frequently auto-killed by the server so that one user doesn&amp;rsquo;t consume an unfair amount of resources. Until such a time as Octopress is capable of regenerating only the new posts there is the possibility that large blogs with hundreds of posts may exceed this limit and the generate script may be killed before completion.&lt;/p&gt;
&lt;h3 id=&#34;generating-html-locally&#34;&gt;Generating HTML locally&lt;/h3&gt;
&lt;p&gt;The only notable advantage to generating locally and pushing to a server-side repo is it works on servers where you have git but can&amp;rsquo;t run Octopress&amp;rsquo; generate script for whatever reason.&lt;/p&gt;
&lt;h2 id=&#34;serving-from-a-self-hosted-git-repo-without-generating-html-files-server-side&#34;&gt;Serving from a self-hosted git repo &lt;em&gt;without&lt;/em&gt; generating HTML files server-side.&lt;/h2&gt;
&lt;p&gt;This is the simplest way to go, but it requires one change to the standard Octopress workflow, and the ability to point your server at a specific directory to serve your site from. In your workflow you&amp;rsquo;ll need to commit everything in your public directory each time your run &lt;code&gt;rake generate&lt;/code&gt;, then push to the server. You need to be sure to add &amp;amp; commit any files &lt;em&gt;deleted&lt;/em&gt; from your public directory after generation too, or else a deleted post will not get deleted on the server. Typically you can just say &lt;code&gt;git add public&lt;/code&gt; each time and it&amp;rsquo;ll take care of managing the deleted files too.&lt;/p&gt;
&lt;p&gt;Since the HTML files are going to be generated in a subdirectory of your Octopress repo (typically called &amp;ldquo;public&amp;rdquo;). You&amp;rsquo;ll need to point your server to the public directory under the directory that your &lt;code&gt;core.worktree&lt;/code&gt; option is pointed at. Feel free to rerun the command above that set it if you want to change it to a different place now that you know everything works.&lt;/p&gt;
&lt;p&gt;Once you&amp;rsquo;ve pointed your server to the appropriate directory all you will need to do to update your site &lt;em&gt;and&lt;/em&gt; create an offsite backup of the original markdown files (and everything else) is to locally run&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git push live master
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;serving-from-a-self-hosted-git-repo-and-generating-html-files-server-side&#34;&gt;Serving from a self-hosted git repo &lt;em&gt;and&lt;/em&gt; generating HTML files server-side.&lt;/h2&gt;
&lt;p&gt;You&amp;rsquo;re going to follow the same steps as serving &lt;em&gt;without&lt;/em&gt; generating files except you won&amp;rsquo;t be committing the &amp;ldquo;public&amp;rdquo; directory&amp;rsquo;s contents.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll also need to add the following to the end of your &lt;code&gt;hooks/post-receive&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;cd /path/to/staging/directory
bundle install
bundle exec rake generate&lt;/p&gt;
&lt;p&gt;Note, if you&amp;rsquo;re using RVM or a custom gem path you may need to add those to the start of the &lt;code&gt;hooks/post-receive&lt;/code&gt; script so that git will have it in its environment when it runs.  For example, on Dreamhost you would have to add something like this to the top (assuming you&amp;rsquo;d already installed RVM and the current version of Ruby):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[[ -s &amp;quot;$HOME/.rvm/scripts/rvm&amp;quot; ]] &amp;amp;&amp;amp; source &amp;quot;$HOME/.rvm/scripts/rvm&amp;quot; # Load RVM into a shell session *as a function*
GEM_PATH=$GEM_PATH:/home/my_username/.gems
PATH=$PATH:/home/my_username/.gems/bin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Make a commit locally, push it to the new repo, and confirm that your changes have been pushed to the staging directory and that rake generate has done its job and placed the new html files in your &amp;ldquo;public&amp;rdquo; directory (or wherever your &lt;code&gt;_config.yml&lt;/code&gt; has &lt;code&gt;destination&lt;/code&gt; pointing to).&lt;/p&gt;
&lt;p&gt;Once you&amp;rsquo;ve confirmed that that works you can (optionally) change the &lt;code&gt;/path/to/staging/directory&lt;/code&gt; to point to somewhere that isn&amp;rsquo;t just for testing in the &lt;code&gt;hooks/post-receive&lt;/code&gt; file and in the &lt;code&gt;core.worktree&lt;/code&gt; setting. All that&amp;rsquo;s left is pointing your server at whatever directory your &lt;code&gt;_config.yaml&lt;/code&gt;&amp;rsquo;s &lt;code&gt;destination&lt;/code&gt; is pointed at.&lt;/p&gt;
&lt;p&gt;From then on you just run&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git push live master
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;on your local machine to update your blog.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Open Source Wednesday</title>
      <link>https://weblog.masukomi.org/2011/12/15/open-source-wednesday/</link>
      <pubDate>Thu, 15 Dec 2011 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2011/12/15/open-source-wednesday/</guid>
      <description>&lt;p&gt;This is a simple idea for every web development company
(small or large) that owes its existence to open source software.
I&amp;rsquo;m going to use &lt;a href=&#34;http://www.RubyOnRails.org&#34;&gt;Ruby on Rails&lt;/a&gt; as an
example, but this is just as applicable to all of the
other frameworks and tools we use daily.&lt;/p&gt;
&lt;p&gt;On the first Wednesday of every month &lt;em&gt;all&lt;/em&gt; of your
developers work on bugs or needed features in one of the frameworks
or tools that your company can&amp;rsquo;t live without.&lt;/p&gt;
&lt;p&gt;The thinking is simple, and entirely self-serving:&lt;/p&gt;
&lt;p&gt;A typical SAAS (Software As A Service) shop, or web development house
is constantly depending on the quality of frameworks like
Rails, but these frameworks are riddled with bugs and lack
features that would really help.&lt;/p&gt;
&lt;p&gt;No-one worth their paycheck would allow their own products
to remain in a state like that, and yet we typically do
nothing about those things in the frameworks and tools we
are utterly dependent upon. Spending one day per month
working on tools like these is not an altruistic move. It
is a form of self defense. It makes your product stronger,
and helps to guarantee that the tools you&amp;rsquo;ve built
your company around will not fall by the wayside.&lt;/p&gt;
&lt;p&gt;Improving the quality of the tools we all use helps to
keep them popular, and popular tools get maintained and
enhanced by more developers.&lt;/p&gt;
&lt;p&gt;Contributing to the tools you work with regularly also
helps build up your company&amp;rsquo;s reputation with the developers
you most want to hire.&lt;/p&gt;
&lt;p&gt;Open Source Wednesday helps your business, your customers,
and your ability to attract the best talent.&lt;/p&gt;
&lt;h2 id=&#34;how-exactly-is-this-done&#34;&gt;How exactly is this done&lt;/h2&gt;
&lt;p&gt;Implementing Open Source Wednesday is simple, and there
are a couple ways to approach it. One way is to simply point your
developers at &lt;a href=&#34;https://github.com/rails/rails/issues&#34;&gt;the issue tracker&lt;/a&gt;
for the tool you want to contribute to and have them each
choose a bug or feature request they think they can knock
out in a day. Get together in the morning, make sure everyone&amp;rsquo;s
working on something different, or intentionally joining forces,
and set them loose.&lt;/p&gt;
&lt;p&gt;If there&amp;rsquo;s a particular bug, or missing feature, that&amp;rsquo;s been
impacting your daily work you might want to have some
of your developers specifically attack that.&lt;/p&gt;
&lt;p&gt;The thing to keep in mind here is to not take bugs that can&amp;rsquo;t be
addressed in a day if you&amp;rsquo;re only going to work on them
once a month.&lt;/p&gt;
&lt;p&gt;Open Source Wednesday also serves as a useful change of pace.
Letting your developers work on things that interest them
outside of the tasks they&amp;rsquo;re faced with every other day helps
to refresh the mind. And working in the different codebase
is likely to teach them new techniques that can be applied
to your business&amp;rsquo; code.&lt;/p&gt;
&lt;h2 id=&#34;what-else&#34;&gt;What else?&lt;/h2&gt;
&lt;p&gt;That&amp;rsquo;s it. Go. Write something cool.&lt;/p&gt;
&lt;h2 id=&#34;why-wednesday&#34;&gt;Why Wednesday?&lt;/h2&gt;
&lt;p&gt;I was looking for a day of the week that was somehow connected
to the idea of &amp;ldquo;open source&amp;rdquo; and realized that &amp;ldquo;open&amp;rdquo; sounds like
Odin who used to be known as Wōden and Wednesday is Odin&amp;rsquo;s day /
Wōden&amp;rsquo;s day / Oden Dag/. Open -&amp;gt; Odwin -&amp;gt; Odwinsday -&amp;gt; Wednesday.&lt;/p&gt;
&lt;p&gt;His name is related to ōðr, meaning &amp;ldquo;fury, excitation,&amp;rdquo;
&amp;ldquo;mind,&amp;rdquo; or &amp;ldquo;poetry.&amp;rdquo; And what is code if not mind poetry? Wednesday
seemed just about perfect.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Why There?</title>
      <link>https://weblog.masukomi.org/2011/12/14/why-there/</link>
      <pubDate>Wed, 14 Dec 2011 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2011/12/14/why-there/</guid>
      <description>&lt;p&gt;Where you spend your time developing is an important decision for an open source developer. Partly we do it for personal satisfaction, partly we do it to give us a tool we want, but there&amp;rsquo;s always a part of us that wants others to use and enjoy our work. I want to talk about that, and I want to talk about the frustrations that people who use those open source projects have, but first I need to set the stage.
&lt;a href=&#34;http://paulrouget.com/&#34;&gt;Paul Ruoget&lt;/a&gt; (&lt;a href=&#34;https://twitter.com/#!/paulrouget&#34;&gt;@paulrouget&lt;/a&gt;) has been working on &lt;a href=&#34;http://i.imgur.com/53ZI2.png&#34;&gt;a cool live CSS editor&lt;/a&gt; for Firefox which should be out in FF 11.&lt;/p&gt;
&lt;p&gt;When he proudly mentioned this on Twitter I responded in a less than helpful manner:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;That&amp;rsquo;s great, and something i&amp;rsquo;d find useful&amp;hellip;
but right now all i really care about is seeing FF be as fast as Chrome.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;m happy to say that &lt;a href=&#34;http://christianheilmann.com/&#34;&gt;Christian Heilmann&lt;/a&gt; (&lt;a href=&#34;https://twitter.com/#!/codepo8&#34;&gt;@codepo8&lt;/a&gt;) called me on it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;can you imagine how frustrating such a tweet is when you spent a few month building this great tool?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;and later&amp;hellip;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The point is that sweeping statements like that don&amp;rsquo;t help anyone. Your tweet might make people move, building good dev tools not&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I think he was trying to say that stupid statements like mine, borne out of frustration from something only tangentially related can lead developers to simply stop contributing at all. He&amp;rsquo;s totally right, and I&amp;rsquo;m sorry I said that Paul.&lt;/p&gt;
&lt;p&gt;At the same time, I am frustrated, and while it&amp;rsquo;s not even remotely Paul&amp;rsquo;s fault this frustration is shared by many many webdevs and it does affect Paul, and everyone else who wants to develop cool things for Firefox.&lt;/p&gt;
&lt;p&gt;Firefox is slow. Once upon a time it was the king of the hill. We switched to it because it was soo much faster than anything else, and then tools like Firebug came along and FF became a joy to use for developers.&lt;/p&gt;
&lt;p&gt;Somewhere along the line that changed. For reasons I can&amp;rsquo;t explain FF has become notably slower than the alternatives&amp;hellip; and that is the only comparison that matters. A slow browser is fine if there aren&amp;rsquo;t any speedy ones you could use instead, but Google has put Chrome out there and, by comparison, it feels blazingly fast. I can &lt;em&gt;feel&lt;/em&gt; the delay every time I open a new window in Firefox.&lt;/p&gt;
&lt;p&gt;I just tested it. It just took nearly five seconds for FF to open a new blank window. I regularly see delays of one to five seconds. It always takes a fraction of a second for Chrome to do it and I&amp;rsquo;ve always got way more open in Chrome. Honestly, I don&amp;rsquo;t like Chrome&amp;hellip; not when compared to FF. But every single action we perform in our browsers is affected by the underlying speed of that browser. For a web developer with 20+ tabs open with research, test, and reference pages open all day long this is a huge deal.&lt;/p&gt;
&lt;p&gt;And that&amp;rsquo;s how we end up with people like me saying stupid shit to people like Paul who are trying to make our lives better.&lt;/p&gt;
&lt;p&gt;But&amp;hellip; I &lt;em&gt;am&lt;/em&gt; a developer too. I&amp;rsquo;ve got a FF extension, a useful Greasemonkey script, and a few cool Ubiquity tools that are all sitting abandoned for the simple fact that I am unwilling to add that kind of delay that Firefox demands to thousands of actions I perform every day. No, I&amp;rsquo;m not saying that everything in FF takes 5 seconds longer, but I am saying that everything in FF &lt;em&gt;feels&lt;/em&gt; like it takes longer than the alternative.&lt;/p&gt;
&lt;p&gt;I look at what Paul is doing and think that&lt;br&gt;
A) there&amp;rsquo;s already live css editing in the Web Developer extension.&lt;br&gt;
It&amp;rsquo;s probably not as good, but it&amp;rsquo;s there) and Firebug has it to some degree too.&lt;br&gt;
B) Here&amp;rsquo;s a guy building something cool that developers like me are never going to use because the environment he&amp;rsquo;s chosen to do it in is slow, and loosing people like me to the competition at an astonishing rate.&lt;/p&gt;
&lt;p&gt;So why is he writing it at all?&lt;/p&gt;
&lt;p&gt;Firefox developers have been making progress in speeding up FF, but it&amp;rsquo;s a hard problem, it&amp;rsquo;s taken them a long time, and it still &lt;em&gt;feels&lt;/em&gt; like they&amp;rsquo;ve got a long way to go before they catch up. Now, I say &amp;ldquo;feels&amp;rdquo; here because that&amp;rsquo;s what&amp;rsquo;s important.  Numbers don&amp;rsquo;t matter to end users. It&amp;rsquo;s all about perception.&lt;/p&gt;
&lt;p&gt;Consider &lt;a href=&#34;http://www.panic.com/extras/audionstory/&#34;&gt;this little story&lt;/a&gt; from the guys at Panic regarding a metting they had with Apple.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Jeff Robbin then asked us a funny question that had obviously been percolating for a while: &amp;ldquo;Does Audion do any kind of special filtering?&amp;rdquo; You see, since the beginning of time, press reviews in magazines, websites, etc., had consistently said that Audion simply sounds &amp;ldquo;better&amp;rdquo; than SoundJam, without question. It wasn&amp;rsquo;t until that declaration showed up in a very respectable, high-end British Hi-Fi magazine that people started to take it even more seriously. Audion was always noted for being &amp;ldquo;richer&amp;rdquo; or &amp;ldquo;sweeter&amp;rdquo;, and we were tremendously proud of our incredible results in this regard.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;The only problem was: &lt;em&gt;we didn&amp;rsquo;t do anything&lt;/em&gt;. We have no idea why people heard Audion as sounding better.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I try and put myself in Paul&amp;rsquo;s shoes and have to wonder if I&amp;rsquo;d think it was worth it. Sure, he loves FF, and maybe that&amp;rsquo;s good enough reason to stick with it. But, I just &lt;em&gt;like&lt;/em&gt; Firefox, and &lt;em&gt;wish&lt;/em&gt; that it was keeping up because I &lt;em&gt;love&lt;/em&gt; the tools I used to use with it. If I wanted to build a kick-ass live CSS editor I can&amp;rsquo;t say that I would be willing to build it for FF right now.&lt;/p&gt;
&lt;p&gt;And that&amp;rsquo;s a question we all have to ask when we&amp;rsquo;re developing something that&amp;rsquo;s completely dependent on some larger project beyond our control. Is loving the platform enough? Even when thousands of the people who would benefit from your work are leaving it?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Saying &amp;ldquo;be faster&amp;rdquo; is like saying &amp;ldquo;be better&amp;rdquo; &lt;em&gt;Of course&lt;/em&gt; we are working on performance. But we can&amp;rsquo;t work &lt;em&gt;only&lt;/em&gt; on perf&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Paul&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;He&amp;rsquo;s right, and yet, at the same time I think he isn&amp;rsquo;t. Firefox has better tools, better extensions, better extensibility, better everything, but every action you take on it either &lt;em&gt;is&lt;/em&gt; slower or feels as if it is. Would Firefox really be hurt in any notable way if it actually did apply every resource at their disposal to speed improvements? I realize this isn&amp;rsquo;t realistically possible, because not every developer has the skills needed to address the problem, and no-one wants to see the other aspects stagnate, but I think it&amp;rsquo;s still a valid question.&lt;/p&gt;
&lt;p&gt;Christian is right that those of us sitting on the sidelines shouldn&amp;rsquo;t disparage those who are doing good work, even if we think they&amp;rsquo;re doing it on a sinking ship. I &lt;em&gt;really&lt;/em&gt; hope that FF can come back from setback that Chrome has presented it, but in the meantime where does a developer put their energy and what &lt;em&gt;is&lt;/em&gt; the best way to keep them from not contributing at all.&lt;/p&gt;
&lt;p&gt;I should have said something like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;That live CSS editor looks great.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;hellip; but how do I tell Paul, and people like him that as much as I appreciate what they&amp;rsquo;re doing, and as much as I really want to use it, I&amp;rsquo;m saddened to and frustrated to think that thousands of people like me may never touch it, because of something it&amp;rsquo;s tied to that he has no control over? Is there any way to do that without discouraging them? Is it better to just shut up and leave them to their dreams?&lt;/p&gt;
&lt;p&gt;Maybe&amp;hellip;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m sorry that this post, and my earlier tweets are probably disparaging to Paul. That&amp;rsquo;s a shit thing, but even if I had the polite social interaction thing down, it seems like in the end the only way to avoid future occurrences is for people like me to not ask &amp;ldquo;why?&amp;rdquo;, or at least not publicly discuss what comes out of those thoughts.&lt;/p&gt;
&lt;p&gt;The uncomfortable state of things doesn&amp;rsquo;t have to be the end of it though. People like Paul love Firefox enough to devote serious amounts of time to making it better. I think it sucks that we are in a situation where asking &amp;ldquo;Why is he bothering?&amp;rdquo; has some legitimate value. But maybe if more of us stopped taking the easy route of jumping ship to whatever competing tool is &amp;ldquo;better&amp;rdquo; at the moment we would actually take a moment to help bring the tools we &amp;ldquo;loved&amp;rdquo; back into fighting shape.&lt;/p&gt;
&lt;p&gt;I may not have the skills needed to make FF faster, but I&amp;rsquo;ve got some decent JavaScript skills that could probably be used to help improve the test JavaScript test suite. If you&amp;rsquo;re a geek like me who&amp;rsquo;s gone to the land of Chrome, but lament all the great tools you&amp;rsquo;ve left behind, consider swinging over to the &lt;a href=&#34;https://bugzilla.mozilla.org/describecomponents.cgi?product=Firefox&#34;&gt;Firefox Bug Tracker&lt;/a&gt; and see if there&amp;rsquo;s a small task or two you can help out with. If nothing else there&amp;rsquo;s probably a bunch of bugs in there needing confirmation.&lt;/p&gt;
&lt;p&gt;Maybe, if we get off our asses, we can help get Firefox back to being the most awesome browser around. I know I&amp;rsquo;d love to have my default browser be the same one with all the cool tools.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>It&#39;s Worse When the Sun Goes Down</title>
      <link>https://weblog.masukomi.org/2011/10/31/it-s-worse-when-the-sun-goes-down/</link>
      <pubDate>Mon, 31 Oct 2011 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2011/10/31/it-s-worse-when-the-sun-goes-down/</guid>
      <description>&lt;p&gt;At our house, you go to the bathroom armed, or you don&amp;rsquo;t go at all. At least, once the sun goes down. There&amp;rsquo;s a pistol wedged between couch cushions with handle raised for easy access as we watch TV. You think I&amp;rsquo;m joking, that maybe the gun is metaphorical, or that this is the start of some fictional story. It&amp;rsquo;s not. Every word is true.&lt;/p&gt;
&lt;p&gt;It all started a month or two ago. We&amp;rsquo;d hear them moving around. Little sounds. Things you could write off and not really worry about: &amp;ldquo;Probably just a mouse…&amp;rdquo; But each night the sounds got louder. The little scratches escalated until they were thumpings on the wall. And then the hole opened up, like the gaping maw of hell itself. It would almost be better if it really was an entrance to hell. At least with hell there&amp;rsquo;d be flames, or something. But this is just blackness, silent and dark. Maybe the Christians have it wrong.&lt;/p&gt;
&lt;p&gt;We take turns staring at the hole now. We stand watch… once the sun goes down, the dogs safely ensconced upstairs. They&amp;rsquo;d just be collateral damage if we let them out. Part of me wonders if there&amp;rsquo;s a point. We don&amp;rsquo;t know if our weapons will even effect them. We&amp;rsquo;ve shot at them before with no effect. They&amp;rsquo;d hear the sound, or maybe see us moving the gun into position. Maybe they simply hear the explosion as our projectiles exit their chamber and step out of the way.&lt;/p&gt;
&lt;p&gt;They haven&amp;rsquo;t touched us… yet. But they&amp;rsquo;ve come close. For the past couple days, ever since it happened, I&amp;rsquo;ve been having flashbacks. Adrenaline coursing through my system as I hurled myself backwards watching it pass inches from my face and set my heart pounding at a thousand miles an hour. I don&amp;rsquo;t think it was even trying.&lt;/p&gt;
&lt;p&gt;We tried laying out a field of glue. Some super adhesive stuff. I think they may actually use a variant of it as an organic equivalent to waxing legs. Heat it up, slather it on, add cloth, and rip… Depilation was not our goal though, nor were we so naive to think that it would actually capture them. No, we were hoping that maybe, just maybe, it would slow them down enough to get a shot off, that maybe, it would buy us a moment of distraction, just long enough to aim, and fire.&lt;/p&gt;
&lt;p&gt;All it did was annoy them, and I assure you, you do not want to annoy them.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve put in a call for bigger guns. Gods help us.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>gVim / MacVim drag command for base64 encoding images</title>
      <link>https://weblog.masukomi.org/2011/08/25/gvim-macvim-drag-command-for-base64-encoding-images/</link>
      <pubDate>Thu, 25 Aug 2011 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2011/08/25/gvim-macvim-drag-command-for-base64-encoding-images/</guid>
      <description>&lt;p&gt;The idea is that it can be very useful to base64 encode an image
directly into your css file instead of referencing a separate file, but
doing so usually involves dropping to the command line, calling openssl,
copy-pasting the output, specifying the mime-type, etc&amp;hellip; Bret&amp;rsquo;s
Terpstra &lt;a href=&#34;http://brettterpstra.com/textmate-drag-command-for-base64-encoding-images/&#34;&gt;distilled all of that into one drag-and-drop command for Textmate&lt;/a&gt;.The following is simply a generalization and
instructions for using the
drag and drop in MacVim / GVim&lt;/p&gt;
&lt;p&gt;First, take the following and make it
into an executable somewhere in your path. That way you can use it from
any app that can interact with the command line. I called the fill
css_image&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash openssl base64 -in
&amp;quot;$1&amp;quot; | awk -v ext=&amp;quot;${1\#\*.}&amp;quot; &#39;{ str1=str1 $0 }END{ print
&amp;quot;background:url(data:image/&amp;quot;ext&amp;quot;;base64,&amp;quot;str1&amp;quot;);&amp;quot; }&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It&amp;rsquo;ll generate something like this (only much longer):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;background:url(data:image/png;base64,iVBORw0KGgoA...AAAAASUVORK5CYII=);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now, to call it from MacVim and have the output inserted
into your file simply switch to command mode and type&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:r ! css_image
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;leave a trailing space
and drag the file into MacVim and hit enter. Dragging it on when in this
state will cause the path to the image to be inserted. Enter causes the
command to be executed, and the output to be inserted into your file.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>JekyllMail: Posting to Jekyll from Email</title>
      <link>https://weblog.masukomi.org/2011/08/18/jekyllmail-posting-to-jekyll-from-email/</link>
      <pubDate>Thu, 18 Aug 2011 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2011/08/18/jekyllmail-posting-to-jekyll-from-email/</guid>
      <description>&lt;p&gt;There are a few problems with
&lt;a href=&#34;https://github.com/mojombo/jekyll&#34;&gt;Jekyll&lt;/a&gt; /
&lt;a href=&#34;http://octopress.org/&#34;&gt;Octopress&lt;/a&gt; though that would, realistically,
make me less inclined to use it. First, you need to have your entire
blog checked out on whatever box you’re posting &lt;em&gt;from&lt;/em&gt;, and that is
simply not something I’m willing to do on a work computer, and not
something I necessarily &lt;em&gt;can&lt;/em&gt; do when on a borrowed computer. Secondly,
the user interface sucks. Well, there really isn’t one.&lt;/p&gt;
&lt;p&gt;Being able to send e-mail to your blog and have it posted solves both of
these problems. I can e-mail from anywhere, and there are tons of e-mail
clients with good user interfaces, and there are good Markdown apps on
the iOS that will e-mail off your Markdown formatted writings. I
wouldn’t be surprised if they handled Textile too, but I wouldn’t know.&lt;/p&gt;
&lt;p&gt;So, I did a little hunting around and found a
&lt;a href=&#34;http://tedkulp.com/2011/05/18/send-email-to-jekyll/&#34;&gt;script&lt;/a&gt; by &lt;a href=&#34;http://tedkulp.com/&#34;&gt;Ted
Kulp&lt;/a&gt; that works with procmail to post a Markdown,
Textile, or HTML formatted post to a Jekyll blog. Procmail’s not an
option for many of us, but POP3 is. So, I did a little hacking, added
POP3 support, made some configuration and anti-spam tweaks and
&lt;a href=&#34;https://github.com/masukomi/JekyllMail&#34;&gt;JekyllMail&lt;/a&gt; was born.&lt;/p&gt;
&lt;p&gt;In addation to importing your post it will also save your image attachments.
I heartily encourage folks to fork &lt;a href=&#34;https://github.com/masukomi/JekyllMail&#34;&gt;the repo on
Github&lt;/a&gt; and send in pull
requests.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>[Review] Byword for OS X</title>
      <link>https://weblog.masukomi.org/2011/08/14/review-byword-for-os-x/</link>
      <pubDate>Mon, 15 Aug 2011 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2011/08/14/review-byword-for-os-x/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;[Some perspective][]&lt;/li&gt;
&lt;li&gt;[What’s good][]&lt;/li&gt;
&lt;li&gt;[What could be better][]&lt;/li&gt;
&lt;li&gt;[Bugs][]&lt;/li&gt;
&lt;li&gt;[Would I recommend it?][]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;some-perspective&#34;&gt;Some perspective&lt;/h2&gt;
&lt;p&gt;I purchased &lt;a href=&#34;http://bywordapp.com/&#34;&gt;Byword&lt;/a&gt; because I think Markdown is
a spectacular way to write and was looking for an app that would allow
me to create new documents, easily preview them and grab either the
formatted preview text or the generated HTML.&lt;/p&gt;
&lt;p&gt;Until now, I’d been using &lt;a href=&#34;http://markedapp.com/&#34;&gt;Marked&lt;/a&gt; for previews
while I typed in Vim. Now, Vim’s great. I love coding in it, but it’s
really not the greatest when it comes to writing text, and I’m not
really a fan of any of the other apps that handle plain text well. So, I
went off in search of an app specifically designed for creating
documents with Markdown.&lt;/p&gt;
&lt;h2 id=&#34;whats-good&#34;&gt;What’s good&lt;/h2&gt;
&lt;p&gt;It does what it claims. Easy markdown editing. It also supports Rich
Text and Plain Text.&lt;/p&gt;
&lt;p&gt;It’s nice to be able to bold or italicize with Markdown using
traditional key-combos instead of having to manually type the asterisks.&lt;/p&gt;
&lt;p&gt;Full Multimarkdown support.&lt;/p&gt;
&lt;p&gt;You can use it in conjunction with Marked. No need to stop writing to
preview the formatted version. Below we have Byword on the left in edit
mode and Marked on the right reloading a preview of the changes whenever
you save.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://weblog.masukomi.org/assets/2011/08/byword_and_marked.jpg&#34;&gt;&lt;img src=&#34;https://weblog.masukomi.org/wp-content/uploads/2011/08/byword_and_marked.jpg&#34; alt=&#34;Byword and
Marked&#34; title=&#34;Byword and Marked&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It’s only $9.99. Totally worth it. It’s nearest competitor
&lt;a href=&#34;http://www.iawriter.com/mac&#34;&gt;iAWriter&lt;/a&gt; is almost twice the price at
$17.99&lt;/p&gt;
&lt;h2 id=&#34;what-could-be-better&#34;&gt;What could be better&lt;/h2&gt;
&lt;p&gt;The default file format is Rich Text. You can change it to Plain Text or
Markdown in the preferences, but I get the feeling that the creators
were making a minimalist text editor and then decided to add on Markdown
support rather than making a Markdown editor that also supports the
other formats.&lt;/p&gt;
&lt;p&gt;Preview can be a little slow sometimes.&lt;/p&gt;
&lt;p&gt;If you look at the screenshots on the site you’ll see a little popover
menu for text styling. That’s there, but only on Rich Text documents. In
their defense most of the options there aren’t supported by Markdown,
but it doesn’t mean it wouldn’t be nice to have a version of it for
Markdown.&lt;/p&gt;
&lt;p&gt;Its main competitor iAWriter has “reading time” as one of the running
counts along the bottom in addition to the standard word count. I really
wish Byword had this.&lt;/p&gt;
&lt;p&gt;Like most apps that partially format your markdown while you’re typing
it (making *foo* italic in between the asterisks, etc.) it bolds the
headings, but there is no difference between a #, ##, or ###
heading. They’re all just bolded. I really wish that apps like Byword
would make the # headings larger than the ## headings, and so on.&lt;/p&gt;
&lt;h2 id=&#34;bugs&#34;&gt;Bugs&lt;/h2&gt;
&lt;p&gt;At the time of writing (Aug, 14 2011) there are a few bugs that I’ve
encountered in my first few thousand words of writing with it:&lt;/p&gt;
&lt;p&gt;If you like to balance out your heading tags with octothorpes at the end
(e.g. # foo #) you can’t have any trailing spaces afterwards or the
final octathorpes will be treated as text not formatting.&lt;/p&gt;
&lt;p&gt;Clicking on footnotes in the preview has an odd quirk. The first time
you click the footnote number (in preview mode) it opens in the default
application associated with the document’s extension. Ditto for the
first time you click the return link at the end of the footnote itself.
The problem arises when the default application is &lt;em&gt;not&lt;/em&gt; Byword. For me
clicking the footnote opened it in Vim, but only the first time. Very
strange.&lt;/p&gt;
&lt;p&gt;Sometimes the traditional keycombos for making text bold and italic
simply stop working. For some reason they no longer work in this
document but do in others.&lt;/p&gt;
&lt;p&gt;The documentation claims that “If you drag images into the text, they
will automatically be replaced by a Markdown reference to the file.”
Like the key-combo problem this seems to not work all the time. And when
it does work it’s missing the initial exclamation point. When you drag
an image from the browser you get a link in the markdown, and I don’t
mean [foo](url here). I mean a blue underlined
&lt;a href=&#34;http://www.foo.com/img.jpg&#34;&gt;http://www.foo.com/img.jpg&lt;/a&gt; thing that you can click on in Markdown
editing mode, which should never happen. When you drag an image from the
Finder it gives you &lt;a href=&#34;file://path/to/image&#34;&gt;file name&lt;/a&gt; which ends up
being a link instead of an image (because it lacks the inital
exclamation point) &lt;em&gt;and&lt;/em&gt; it’s a link that won’t work on any computer
other than your own.&lt;/p&gt;
&lt;p&gt;Saving a file with the .mkdn extension instead of the expected .md makes
it cease to display correctly in editing mode (markup is no longer
greyed). It still previews correctly though.&lt;/p&gt;
&lt;p&gt;Searching for a word or phrase will highlight it, but hitting the delete
key will not delete it.&lt;/p&gt;
&lt;h2 id=&#34;would-i-recommend-it&#34;&gt;Would I recommend it?&lt;/h2&gt;
&lt;p&gt;Yeah. Byword is a decent app. It doesn’t wow me, and the bugs are
frustrating, but infrequent. The drag-and drop image linking that it
promotes simply doesn’t work in any useful way, and I’m annoyed by that
because it’s one of the reasons I bought it over iAWriter. With that
said though I don’t feel particularly disappointed by it either. Full
&lt;em&gt;Multi&lt;/em&gt;markdown support is nice, especially when you consider that
iAWriter doesn’t even support full Markdown, and really, at $9.99 you’re
still getting a lot of value for your money.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>It&#39;s not a &#34;blog&#34;...</title>
      <link>https://weblog.masukomi.org/2011/08/15/its-not-a-blog/</link>
      <pubDate>Mon, 15 Aug 2011 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2011/08/15/its-not-a-blog/</guid>
      <description>&lt;p&gt;Listen, you are an intelligent person, but someone has led you astray,
and it is driving me nuts.&lt;/p&gt;
&lt;p&gt;When you blog some information for the world to see, what you have
created is a &amp;ldquo;post&amp;rdquo; more specifically, it is a &amp;ldquo;blog post&amp;rdquo;. Sometimes
they&amp;rsquo;re &amp;ldquo;entries&amp;rdquo; but that&amp;rsquo;s more commonly associated with diary style
blogs. In some cases a post could be considered an &amp;ldquo;article&amp;rdquo;, but those
posts are never, ever, a &amp;ldquo;blog&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Blog, as a noun, is short for web log, as in, &amp;ldquo;there were many entries
in his log&amp;rdquo;. It is a collection of entries, and never a single entry
itself.&lt;/p&gt;
&lt;p&gt;Blog can, of course, also be used as a verb, in which case it is the act
of creating one or more posts for a blog.&lt;/p&gt;
&lt;p&gt;When you tell people that you have &amp;ldquo;a new blog&amp;rdquo; you are telling them
that you have a new log of entries separate from any existing one. This
is almost always an indication that you&amp;rsquo;ve decided to start creating a
series of posts that are topically separate from the posts on your
current blog. You are &lt;em&gt;not&lt;/em&gt; telling people that you have added a new
post to your existing log.&lt;/p&gt;
&lt;p&gt;Unfortunately the latter is almost always what you intended to convey.
So please, please, for all the people who follow you on Twitter,
Facebook, Google+, and anywhere else you give notice of new posts, stop
calling your posts blogs.&lt;/p&gt;
&lt;p&gt;P.S. Some people have countered by suggesting that language is mutable
and constantly evolving. While this is true, the word blog has &lt;em&gt;not&lt;/em&gt;
mutated to the point that it is interchangeable with the word &amp;ldquo;post&amp;rdquo;.
Using it as a replacement currently only serves to demonstrate an ignorance
of the actual meaning, and confuse your readers who know better.
You&amp;rsquo;re an intelligent person. Don&amp;rsquo;t make yourself look ignorant.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Thinking about Lo-Fi camera apps</title>
      <link>https://weblog.masukomi.org/2011/05/07/thinking-about-lo-fi-camera-apps/</link>
      <pubDate>Sat, 07 May 2011 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2011/05/07/thinking-about-lo-fi-camera-apps/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/masukomi/5673582771/&#34; title=&#34;Dachary by masukomi, on Flickr&#34;&gt;&lt;img src=&#34;http://farm6.static.flickr.com/5304/5673582771_83687631fb.jpg&#34; alt=&#34;Dachary&#34;&gt;&lt;/a&gt;
Anyone who&amp;rsquo;s been following my Twitter feed lately knows that I&amp;rsquo;ve been
having a lot of fun with the Lo-Fi camera apps on the iPhone, and I had
a post all written up about them, but then my friend Kirk tweeted:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Gotta admit I hope the whole instagram thing is kind of a fad. Makes
all [the pictures look] like those b+w &amp;ldquo;dress up like Bonnie and
Clyde&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/masukomi/5694582735/&#34; title=&#34;Wyoming stone by masukomi, on Flickr&#34;&gt;&lt;img src=&#34;http://farm3.static.flickr.com/2061/5694582735_411d03597f.jpg&#34; alt=&#34;Wyoming
stone&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I think he&amp;rsquo;s not alone in this opinion, and he&amp;rsquo;s definitely got a point.
There are a lot of cheesy pictures being uploaded by people just playing
with the effects. But I think he was missing something vastly more
important: They&amp;rsquo;re getting people to take pictures.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/masukomi/5695292267/&#34; title=&#34;Boston Harbour Tilt-shifted by masukomi, on Flickr&#34;&gt;&lt;img src=&#34;http://farm3.static.flickr.com/2717/5695292267_11ae202ef8.jpg&#34; alt=&#34;Boston Harbour
Tilt-shifted&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;They&amp;rsquo;re getting millions (literally millions) of people to look at the
world around them with different eyes. It doesn&amp;rsquo;t matter that they&amp;rsquo;re
going &amp;ldquo;oh, I wonder what that would look like with a quirky effect&amp;hellip;&amp;rdquo;
what matters is that they&amp;rsquo;re looking. We spend more and more time
wrapped up in our own little worlds. Especially those of us fortunate to
have smartphones. We tweet, we text, we play games and we loose touch
with the world we&amp;rsquo;re moving through.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/masukomi/5686637651/&#34; title=&#34;Workin&#39; The Hydrant by masukomi, on Flickr&#34;&gt;&lt;img src=&#34;http://farm6.static.flickr.com/5230/5686637651_776674bc47.jpg&#34; alt=&#34;Workin&amp;rsquo; The
Hydrant&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The boring walk to work or school has been transformed into an exercise
in observation. It doesn&amp;rsquo;t matter that people are frequently
photographing mundane &amp;ldquo;boring&amp;rdquo; objects. What matters is that they are
finding beauty and interest in the world around them.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/masukomi/5672919835/&#34; title=&#34;Rolling Rock Bottlecap by masukomi, on Flickr&#34;&gt;&lt;img src=&#34;http://farm6.static.flickr.com/5181/5672919835_cdccc46625.jpg&#34; alt=&#34;Rolling Rock
Bottlecap&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sometimes they go a bit crazy with the effects, but so what? They&amp;rsquo;re
being creative, and even the most brilliant artist takes leave of their
senses from time to time.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/masukomi/5684710179/&#34; title=&#34;Mayfair Pup by masukomi, on Flickr&#34;&gt;&lt;img src=&#34;http://farm6.static.flickr.com/5150/5684710179_7257c7baf1.jpg&#34; alt=&#34;Mayfair
Pup&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/masukomi/5672603382/&#34; title=&#34;Puffed by masukomi, on Flickr&#34;&gt;&lt;img src=&#34;http://farm6.static.flickr.com/5065/5672603382_39c11f4d2e.jpg&#34; alt=&#34;Puffed&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;People are taking the time to look up from their smartphones, and not
obsessively thumbing out Facebook updates to each other.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/masukomi/5681907635/&#34; title=&#34;Thumbin&#39; along by masukomi, on Flickr&#34;&gt;&lt;img src=&#34;http://farm6.static.flickr.com/5109/5681907635_177eb2e903.jpg&#34; alt=&#34;Thumbin&amp;rsquo;along&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And maybe some of them will realize there&amp;rsquo;s life outside of the computer
screen.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/masukomi/5677845860/&#34; title=&#34;Finding your way by masukomi, on Flickr&#34;&gt;&lt;img src=&#34;http://farm6.static.flickr.com/5184/5677845860_c9b7c5462b.jpg&#34; alt=&#34;Finding your
way&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;hellip; I&amp;rsquo;m sure we&amp;rsquo;ll get tired of the Lo-Fi effects soon enough, but I
hope that by then the apps have evolved into tools that allow for even
more expressiveness. Instagram in particular has done something I would
have said was nigh-impossible a year ago. They&amp;rsquo;ve created a whole new
social network. Sure, they snuck it in the back door when no-one was
looking but they also tricked people into actively looking for creative
things to photograph and share with their friends who are sharing
creative photographs with them. On top of that Instagram&amp;rsquo;s created a
whole ecosystem of applications by opening up their API to outside
developers, which makes it more fun to use, which makes more people use
it, which makes it more popular, which gets more people taking pictures,
and on, and on&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/masukomi/5694581867/&#34; title=&#34;Self Portrait by masukomi, on Flickr&#34;&gt;&lt;img src=&#34;http://farm6.static.flickr.com/5181/5694581867_85f80fffd8.jpg&#34; alt=&#34;Self
Portrait&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This isn&amp;rsquo;t to say that the Instagram app is the greatest. It&amp;rsquo;s certainly
the prettiest of the bunch, and has the best usability and sharing
features, but it&amp;rsquo;s only got a handful of effects and they&amp;rsquo;re not
adjustable in any way. It&amp;rsquo;s not surprising then that you see a number of
pictures in peoples Instagram feeds that have been manipulated in other
apps, but that just goes to show what an amazing thing they&amp;rsquo;ve created.
People actually go out of their way to upload their pictures to their
Instagram feeds.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/masukomi/5695156270/&#34; title=&#34;Church by masukomi, on Flickr&#34;&gt;&lt;img src=&#34;http://farm6.static.flickr.com/5223/5695156270_a6885f4a58.jpg&#34; alt=&#34;Church&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;These days I&amp;rsquo;m mostly reaching for Photoshow and Infinicam. Infinicam
feels like it lives up to its name with a huge number of potential
effects combinations, but it&amp;rsquo;s a lot of random luck (and crap) until
you&amp;rsquo;ve saved off a good swath of combinations you like as favorites that
you can then apply on demand. Its sharing capabilities suck though. If
it didn&amp;rsquo;t have so many great borders and lo-fi effects I wouldn&amp;rsquo;t
bother, but the borders are great and you can easily flip through them
once you&amp;rsquo;ve found a visual treatment you like.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/masukomi/5694014129/&#34; title=&#34;Charles #PictureShow by masukomi, on Flickr&#34;&gt;&lt;img src=&#34;http://farm4.static.flickr.com/3440/5694014129_d194a967f4.jpg&#34; alt=&#34;Charles
#PictureShow&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Typically I take pictures with the built-in camera (so that I&amp;rsquo;ve got
unaffected originals that can be loaded by most of the apps) and bring
them into Photoshow where I can crop them square (so that fit in
Instagram&amp;rsquo;s format), then fiddle with effects there or save it and
fiddle in Lo-mob or Infinicam. Sometimes they bounce around between apps
layering effects until I&amp;rsquo;m happy, and eventually get uploaded via
Instagram, unless I&amp;rsquo;ve decided I&amp;rsquo;m unwilling to stick with Instagram&amp;rsquo;s
demand for square photos.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/masukomi/5692309282/&#34; title=&#34;The Church by masukomi, on Flickr&#34;&gt;&lt;img src=&#34;http://farm6.static.flickr.com/5101/5692309282_5033809198.jpg&#34; alt=&#34;The
Church&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As for the apps themselves, well, there&amp;rsquo;s a lot of room for improvement.
Most of them seem to offer a handful of carefully selected effects to
choose from, but offer no way to combine the features of them (this
border with that tint for example). Photoshow is excellent about this.
Infinicam does offer it but not in a direct way. It&amp;rsquo;s more about finding
happy accidents and then saving the ability to recreate them. And then
there&amp;rsquo;s the constant square cropping. I don&amp;rsquo;t mind square pictures at
all, but sometimes you want a wider view of things.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/masukomi/5694584159/&#34; title=&#34;Bandido by masukomi, on Flickr&#34;&gt;&lt;img src=&#34;http://farm3.static.flickr.com/2655/5694584159_023388de57.jpg&#34; alt=&#34;Bandido&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Anyway, if you like these pics, follow me on Instagram (if you have an
iPhone&amp;hellip; coming soon to Android ;) ), or
&lt;a href=&#34;http://www.flickr.com/photos/masukomi/&#34;&gt;Flickr&lt;/a&gt;, or
&lt;a href=&#34;http://twitter.com/#!/masukomi&#34;&gt;Twitter&lt;/a&gt;. I&amp;rsquo;m masukomi on all three.
There&amp;rsquo;s also
&lt;a href=&#34;http://www.facebook.com/profile.php?id=1041015448&#34;&gt;Facebook&lt;/a&gt;. Yes,
believe it or not I&amp;rsquo;m actually doing something with Facebook (friends
will understand how shocking this is). But, even if you don&amp;rsquo;t follow me
anywhere&amp;hellip; pick up a camera and go find the beauty around you. Then
share it with people. And have fun. :)&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/masukomi/5683002209/&#34; title=&#34;Red Shoes by masukomi, on Flickr&#34;&gt;&lt;img src=&#34;http://farm6.static.flickr.com/5022/5683002209_ac0d12bd45.jpg&#34; alt=&#34;Red
Shoes&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For the iPhone there&amp;rsquo;s: &lt;a href=&#34;http://instagr.am/&#34;&gt;Instagram&lt;/a&gt;,
&lt;a href=&#34;http://www.nevercenter.com/camerabag/&#34;&gt;CameraBag&lt;/a&gt;, &lt;a href=&#34;http://artandmobile.com/toycamera/&#34;&gt;Toy
Camera&lt;/a&gt;,
&lt;a href=&#34;http://lo-mob.com/&#34;&gt;Lo-Mob&lt;/a&gt;, &lt;a href=&#34;http://www.fxphotostudioapp.com/&#34;&gt;FX Photo
Studio&lt;/a&gt;,
&lt;a href=&#34;http://bitween.co.kr/pictureshow/&#34;&gt;PictureShow&lt;/a&gt;,&lt;a href=&#34;http://www.nevercenter.com/infinicam/&#34;&gt;Infinicam&lt;/a&gt;,
and more&amp;hellip; For the iPad there&amp;rsquo;s: &lt;a href=&#34;http://www.nevercenter.com/camerabag/ipad/&#34;&gt;CameraBag for
iPad&lt;/a&gt;, &lt;a href=&#34;http://www.fxphotostudioapp.com/&#34;&gt;FX Photo Studio
HD&lt;/a&gt;, and not much else, but that it starting to change now that the iPad 2 has a camera.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Cleaning Wordpress of some Malware</title>
      <link>https://weblog.masukomi.org/2011/04/26/cleaning-wordpress-of-some-malware/</link>
      <pubDate>Tue, 26 Apr 2011 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2011/04/26/cleaning-wordpress-of-some-malware/</guid>
      <description>&lt;p&gt;The other day the Googlebot swung by to check my site for updates and
found Malware. Almost immediately, it seemed, people&amp;rsquo;s browsers were
warning them off from my sites. Malware! Bad Things (TM)! There be
Dragons here! and so on. Fortunately a friend dropped me a Tweet shortly
after it started and thus the hunt began with one clue:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Malicious software is hosted on 1 domain(s), including
globalpoweringgathering.com/.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sadly, that was ALL I had to go on, and when I told the browser I was ok
with the risk (Windows malware can&amp;rsquo;t hurt us Mac folks) I was unable to
find any calls to JavaScript to files on my blog. I couldn&amp;rsquo;t find any
that were encoded either. I was stumped. Poking around on masukomi.org,
which is just plain HTML files I did find they had all been prepended
with an evil script tag, but that was easy enough to replace as there
were only a few files. weblog.masukomi.org though&amp;hellip; I was stumped. I&amp;rsquo;m
still not sure where exactly it was coming through to the browser, but I
did find the culprit.&lt;/p&gt;
&lt;p&gt;I should note here that Securi&amp;rsquo;s
&lt;a href=&#34;https://sitecheck.sucuri.net/&#34;&gt;free malware checker&lt;/a&gt; should definitely be
commended. It helped narrow things down and confirm that the site was
clean in the end. You should definitely take a minute to plug your site
into there and double check that all is ok. Unfortunately as they make
their money by fixing malware problems for people, and monitoring for
them, they don&amp;rsquo;t actually tell you how to get rid of any of it. Anyway,
at the top of twenty-four of the core Wordpress files (wp-*, index.php,
and xmlrpc.php) was a single line 3,209 characters long that started
like this&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; &amp;lt;?php /**/ eval(base64_decode(&amp;quot;aWYoZnVuY3Rpb25fZXhpc3RzKCdvYl9zdGFydCcpJ
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For the non-geeks amongst you, that&amp;rsquo;s a piece of source code that&amp;rsquo;s been
Base64 encoded so you can&amp;rsquo;t just search for the
globalpowirenggathering.com domain, or anything else that a human would
recognize. The PHP then decodes it with base64_decode and then executes
it with eval. It decodes to a bunch of stuff that looks like it&amp;rsquo;s
targeting Internet Explorer users. Seriously people? Chrome, Firefox 4,
or Safari&amp;hellip; Anything but Internet Exploder. Geeks: just run the
following code on your server&amp;rsquo;s command line to get a list of infected
files. If it doesn&amp;rsquo;t pull up anything then replace the gibberish in
quotes with a section of the Base 64 encoded text from one of your
infected files.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;grep -rc &amp;quot;aWYoZnVuY3Rpb25fZXhpc3RzKCdvYl9zdGFydCc&amp;quot; * | grep -v &amp;quot;:0&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Non-geeks: If you don&amp;rsquo;t have a geek, or shell access to your site that
you can hand over to a geek you trust then your best bet is to simply
delete your WordPress install and reinstall it from scratch. Write down
the plugins you&amp;rsquo;re using first so that you can re-download and reinstall
them, and don&amp;rsquo;t forget that your WordPress install creates an &amp;ldquo;assets&amp;rdquo;
directory at the top level for the various files (images) you&amp;rsquo;ve
uploaded for your posts. Some viruses do infect images, but the
particular malware I&amp;rsquo;m referring to here does not. So, if you replace
the entire WordPress install (just to be safe) be sure you have a copy
of your assets folder that you can re-upload.&lt;/p&gt;
&lt;p&gt;Reinstalling it from
scratch really is the safest way to address the problem and it&amp;rsquo;s
actually pretty easy because WordPress installs are very painless these
days. As always, be sure to backup your database first.&lt;/p&gt;
&lt;p&gt;Speaking of&amp;hellip; backing up your database to a text file is actually a reaaaally good
idea in this case because some variants of it inject themselves into all
the posts in your wp-posts table. If you back up your db to a text file
you can then search it for any of the offending domains, &amp;ldquo;eval&amp;rdquo;
statements, &amp;ldquo;unencode&amp;rdquo; statements, or PHP that you didn&amp;rsquo;t put there. If
they&amp;rsquo;re in there, you&amp;rsquo;ve got your work cut out for you, but this does
emphasize just how important it is to do regular backups of your
database. If it gets infected you can just restore from a recent one.&lt;/p&gt;
&lt;p&gt;I was lucky. It was just the PHP files on my blog and a handful of html
files on the main site that were infected. Cleaning up one line from
twenty some-odd files is not so hard. In fact, once I knew what
WordPress files, I just replaced them all with the latests ones from a
fresh WordPress download. Before you do that though make sure you&amp;rsquo;ve
grabbed the settings from the wp-config.php file on your server. Don&amp;rsquo;t
worry. Reading the file with a text editor can&amp;rsquo;t infect you even with
the malicious code in it. Once you&amp;rsquo;ve replaced those files you can hop
over to &lt;a href=&#34;https://www.google.com/webmasters/tools/home?hl=en&#34;&gt;Google&amp;rsquo;s Webmaster&amp;rsquo;s
Tools&lt;/a&gt; and request a
review. The review doesn&amp;rsquo;t happen immediately, but it bumps up your
priority and apparently doesn&amp;rsquo;t count against you if you still fail, but
shows that you are taking action to eradicate the stuff.&lt;/p&gt;
&lt;p&gt;Also, change your passwords. Change the password on your account with your ISP, and
change your password in WordPress. It is possible that this password has
been compromised. If you use the same password anywhere else (bad idea)
then be sure to change the password on those sites too. Note: other
domains that might show up from this malware infection:
globalpoweringgathering.com lessthenaminutehandle.com
lessthenaseconddeal.com welcometotheglobalisnet.com&lt;/p&gt;
&lt;p&gt;Geeks: If you know git, I&amp;rsquo;d suggest creating a new git repo at the root of your blog.
Add and commit all the WP files into it. You just need to remember to update it
when you update a plugin, theme, or wp itself which is generally
infrequent. Next time the malware strikes (it will) all you&amp;rsquo;ll have to do is&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git reset --hard HEAD
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Check for any strange new files with&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git status
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and delete them.&lt;/p&gt;
&lt;p&gt;You won&amp;rsquo;t have to worry about what malware it is, or what it has or
has not infected.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Adventure means taking chances</title>
      <link>https://weblog.masukomi.org/2010/12/06/adventure-means-taking-chances/</link>
      <pubDate>Tue, 07 Dec 2010 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2010/12/06/adventure-means-taking-chances/</guid>
      <description>&lt;p&gt;Tomorrow morning Dachary and I will be climbing on our motorcycles and
setting off for an epic adventure lasting nearly four months and over
17,000 miles. The goal is to drive south from Boston MA, USA until we
reach the most southerly city on the planet: Ushuaia Tierra Del Fuego,
Argentina. I can&amp;rsquo;t wait. Usually when we tell people their first
reaction is &amp;ldquo;Be careful in Mexico.&amp;rdquo; Colombia, Nicaragua, El Salvador,
Honduras, rebels living in the jungle&amp;hellip; not a concern. But Mexico! OMG
Flee. The fact that millions of US Citizens cross into Mexico, shop, and
relax just south of the border without harm is irrelevant. Some Mexican
citizens have been kidnapped, and held for ransom. Some Mexican
businesspeople have been extorted. Some US citizens have been kidnapped
but most of them are hispanic and there have been&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;very few cases where a tourist is targeted at random,&amp;rdquo; said Eric
Drickersen, who supervises the FBI&amp;rsquo;s border liaison office in San
Diego.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;More importantly, most of this stuff seems to be happening close to the
US/Mexico border; a place we intend to spend only as long as it takes us
to get through customs and head south. We&amp;rsquo;ve got better things to see
than Gringo tourist traps. So, I appreciate the concern, really I do.
But, if you&amp;rsquo;re gonna worry, worry about bigger things. Like breaking a
bones in the middle of nowhere, being forced off a cliff-side road with
no railings, getting Malaria, being stopped by rebels is south-west
Colombia. Me, I&amp;rsquo;m not actually worried about any of that. It&amp;rsquo;s all
possible. But, worrying about it does&amp;rsquo;n&amp;rsquo;t help at all. If anything it
makes it worse by stressing you out. But, I am slightly worried about
one thing: coming back. You see, I am officially unemployed. When I
planned this thing I was under the impression I&amp;rsquo;d be able to get unpaid
leave from my employer, but that fell through in the end, and when given
the choice of continuing to sit in a cubicle and continue doing the same
tasks I&amp;rsquo;ve been doing for fifteen years, and getting on a motorcycle and
exploring the world for four months, possibly returning home completely
broke&amp;hellip; well, that&amp;rsquo;s not much of a choice at all. I mean really. A
person has to have their priorities straight. And living in fear of not
having money is not a very high priority for me.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Ooh Can I?! Can I please continue to live a mundane existence so as
to make sure I receive another paycheck that allows me to continue to
live a mundane existence? Please please?!&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Fuck that noize.&lt;/p&gt;
&lt;p&gt;My coworkers gave me a going away party, which I am
very thankful for. But, one of the most memorable parts of that was
speaking with a coworker about &lt;a href=&#34;http://www.theadventurists.com/&#34; title=&#34;The Adventurists&#34;&gt;The
Adventurists&lt;/a&gt;. The
Adventurists offer a number of great adventure packages that you should
definitely check out, and spend some time daydreaming about. One of the
most popular is the &lt;a href=&#34;http://rickshawrun.theadventurists.com/&#34;&gt;Rickshaw
Run&lt;/a&gt;. They provide you with a
&amp;ldquo;rickshaw&amp;rdquo; (basically an old vespa with 3 wheels, a windshield, and an
open body welded to it) that is not even remotely designed for thousands
of miles of driving, almost guaranteed to give you problems at some
point along the way, and an a route across India that will take you
about two weeks to complete, with essentially no support from them.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ill-advised, uncomfortable, impractical, dangerous, pointless,
furstrating, unreliable, unstable, stupid, painful, all great things
that make the rickshaw the ultimate all terrain machine. - The
Adventurists&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If it was easy it&amp;rsquo;d just be a pretty ride, but breaking down in the
middle of Inda and having to figure out how to fix it&amp;hellip; that would be
something to tell your friends about. That&amp;rsquo;s an adventure.&lt;/p&gt;
&lt;p&gt;My coworker
thought the idea was wonderful, but he had a baby about a year ago, and
simply couldn&amp;rsquo;t do something like that because he had responsibilities.
But, his stay-at-home wife is smart, and surely could take care of the
baby for two weeks without him, he&amp;rsquo;d be gone on paid vacation, and the
chances of dying are really no higher than they are here at home&amp;hellip;&lt;/p&gt;
&lt;p&gt;The point is, we build these mental cages for ourselves. &amp;ldquo;Oh I&amp;rsquo;d love to do
that but I can&amp;rsquo;t because&amp;hellip;&amp;rdquo; This seems especially true of people with
children, but the best gift you can give a child, your partner is
happiness, and happiness doesn&amp;rsquo;t come from a paycheck. We were
poverty-level poor for much of my childhood, but my mom did what made
her happy, kept us fed and clothed, and did whatever she could to make
me happy too. You think I would have cared if she&amp;rsquo;d left me with Dad for
two weeks while she went and had an adventure? Hell no. And, in the
years that followed I would have wonderful tales of far off places. When
I was a baby she took me to the Grand Canyon. Rode down into it on a
donkey. I don&amp;rsquo;t remember a second of it, but I remember the story, and
her telling me how wonderful it was.&lt;/p&gt;
&lt;p&gt;Unless you&amp;rsquo;re in prison there is
nothing keeping you from having an adventure. When you look back at your
life do you want to see a life spend primarily in a cubicle, a few hours
with your friends and family each day before going to bed, and if you&amp;rsquo;re
lucky some time on the weekend squeezed in between all the errands you
couldn&amp;rsquo;t do during the week?&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t care what anyone says. That is not
a life well spent. I don&amp;rsquo;t care if that cubicle dwelling allowed you to
put your kid through school. You barely get a chance to see them, and
you sacrificed your own happiness to do so. Lots of people enjoy their
jobs, but few of them think spending 40+ hours a week sitting in a cube
staring at a screen is a good life. I love coding, but I want to look
back at my life and feel that I lived it, that I did something
memorable, and special with it. Sitting in a cube staring at a screen is
neither memorable, nor special.&lt;/p&gt;
&lt;p&gt;The job I just quit was an excellent
one, surrounded by good people, but it did not make for a life well
spent. It did, however, provide me with the means to make a good start
on one.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll be documenting the adventure on
&lt;a href=&#34;http://www.corporaterunaways.com&#34; title=&#34;Corporate Runaways&#34;&gt;CorporateRunaways.com&lt;/a&gt;.
I invite you to follow our adventures, and start figuring out how to have
your own. Life is too short to spend it all at work. Make it memorable.
Make it fun. Make yourself happy.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Food and Cuisine (a brief history)</title>
      <link>https://weblog.masukomi.org/2010/10/07/food-and-cuisine-a-brief-history/</link>
      <pubDate>Thu, 07 Oct 2010 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2010/10/07/food-and-cuisine-a-brief-history/</guid>
      <description>&lt;h2 id=&#34;a-brief-history-of-food&#34;&gt;A brief history of food:&lt;/h2&gt;
&lt;p&gt;Early man: &amp;ldquo;So hungry&amp;hellip;. &lt;em&gt;*chomp*&lt;/em&gt;&amp;rdquo; Not-so-early man: &amp;ldquo;I wonder what
that tastes like&amp;hellip;&amp;rdquo;&lt;/p&gt;
&lt;h2 id=&#34;a-brief-history-of-cuisine&#34;&gt;A brief history of cuisine:&lt;/h2&gt;
&lt;p&gt;&amp;ldquo;What would make that taste better?&amp;rdquo;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Counting the days until Borders dies</title>
      <link>https://weblog.masukomi.org/2010/09/16/counting-the-days-until-borders-dies/</link>
      <pubDate>Thu, 16 Sep 2010 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2010/09/16/counting-the-days-until-borders-dies/</guid>
      <description>&lt;p&gt;Honestly, I kind-of like Borders (and Barnes and Noble), and they&amp;rsquo;re the
only ones with a zero BS customer loyalty signup process.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Do you have a card?&amp;rdquo;&lt;br&gt;
&amp;ldquo;No.&amp;rdquo;&lt;br&gt;
&amp;ldquo;Would you like one? I just need your e-mail address.&amp;rdquo;&lt;br&gt;
&amp;ldquo;Ok it&amp;rsquo;s _____ &amp;quot;&lt;br&gt;
&amp;ldquo;Here you go.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The end. No paperwork. No forms. Thirty
seconds. But, that&amp;rsquo;s the only thing they&amp;rsquo;ve gotten right in a long time.&lt;/p&gt;
&lt;p&gt;Today they sent me an email announcing that &amp;ldquo;You could win the new
American Girl doll&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Seriously?! There&amp;rsquo;s only one kind of book I buy at
Borders: urban fantasy. I buy everything else at Amazon.com, but when it
comes to new fiction I like to browse physical aisles to find new
authors. The only exception to this has been one or two of the Harry
Potter books. So, after years of buying Urban Fantasy books about
werewolves, vampires, zombies, and other supernatural beasts (almost all
of the stories centering around a murder that needs to be solved) they
think I&amp;rsquo;d like an American Girl doll. They&amp;rsquo;re so off the mark that I
didn&amp;rsquo;t even know what an American Girl doll was until I looked at the
email. If it wasn&amp;rsquo;t for a random work coincidence I wouldn&amp;rsquo;t have even
heard the name before. Now that I know what one is I know for a fact
that it is nothing I would ever buy, or even contemplate buying. And I&amp;rsquo;m
fairly confident i&amp;rsquo;d never buy one of the American Girl books as a gift
either as there are some truly exceptional children&amp;rsquo;s books out there
that aren&amp;rsquo;t trying to sell you dolls.&lt;/p&gt;
&lt;p&gt;Honestly, I find this insulting.
It&amp;rsquo;s even worse than the time they tried to convince me to buy a book
that I&amp;rsquo;m pretty sure I&amp;rsquo;d already bought from them. It&amp;rsquo;s really not that
hard to figure out that someone with my buying history has no effing
interest in something like that. It&amp;rsquo;d be like promoting a book about the
Pope to someone who just buys books on atheism.&lt;/p&gt;
&lt;p&gt;Contrast that with Amazon.com&amp;rsquo;s emails. &amp;ldquo;Hey, we noticed you&amp;rsquo;ve been checking out &amp;lt;item
x&amp;gt;. Here&amp;rsquo;s a bunch of popular related items you might be interested
in.&amp;rdquo; or &amp;ldquo;Hey, there&amp;rsquo;s a new book from an author you keep buying. Bet
you&amp;rsquo;d like a copy of that huh?&amp;rdquo; (paraphrasing of course).&lt;/p&gt;
&lt;p&gt;Borders meanwhile just spams the entire freaking list. &amp;ldquo;We want money! Here&amp;rsquo;s
random crap! Buy it!&amp;rdquo; Borders is going to die, and it&amp;rsquo;s their own
stupidity that&amp;rsquo;s going to do them in. Never-mind how badly they&amp;rsquo;ve been
screwing their employees lately, although that falls under the category
of &amp;ldquo;their own stupidity&amp;rdquo; as well.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>And then there was the bear...</title>
      <link>https://weblog.masukomi.org/2010/09/08/and-then-there-was-the-bear/</link>
      <pubDate>Wed, 08 Sep 2010 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2010/09/08/and-then-there-was-the-bear/</guid>
      <description>&lt;p&gt;We rode the Trans-Massachusetts-Trail yesterday. A series of dirt roads
starting at the border of Connecticut and Massachusetts and working its
way north to route 2 where it meets up with the start of the Puppy Dog
Trail, which winds its way north all the way to the Canadian border
(we&amp;rsquo;ll be doing that one shortly). Near the end of the trip we stopped
for a break in the woods to address the &amp;ldquo;call of nature&amp;rdquo; and grab a
snack.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/09/there_was_a_bear_here.jpg&#34; alt=&#34;image&#34; title=&#34;Where we pulled over and saw the bear&#34;&gt;&lt;/p&gt;
&lt;p&gt;To the right was a small hill, and the left edge of the road had a two
foot mound, that turned out to be a half buried stone wall, before
continuing down the hill. I&amp;rsquo;m not sure how far it was to the bottom,
maybe a hundred feet, but from where we&amp;rsquo;d pulled off to the right of the
road we couldn&amp;rsquo;t see down past the mound.&lt;/p&gt;
&lt;p&gt;We chatted and drank some
water, and ended up quietly enjoying the scene for a few moments until
we heard something running through the woods just past the mound. We
looked at each other, and I walked quickly, and quietly, to the look
over. It was an adult &lt;a href=&#34;http://en.wikipedia.org/wiki/American_Black_Bear&#34;&gt;Black
Bear&lt;/a&gt; trotting quickly
through the woods. I made a &amp;ldquo;be quiet&amp;rdquo; hand motion and mouthed &amp;ldquo;bear&amp;rdquo;
(Dachary&amp;rsquo;s eyes got huge) because I didn&amp;rsquo;t want to bear to come over.
Then I remembered all the episodes of &lt;a href=&#34;http://lesstroud.ca/survivorman/home.php&#34;&gt;Survivorman&lt;/a&gt;
we&amp;rsquo;d watched in which Les was walking through the woods yelling &amp;ldquo;Hey Bear!&amp;rdquo; because the LAST
thing you want to do is surprise a bear.&lt;/p&gt;
&lt;p&gt;So I promptly started shouting
out &amp;ldquo;Hey Bear!&amp;rdquo; Grabbed my keys, shoved them into the ignition, threw on
my helmet, started it up and revved the engine, which I&amp;rsquo;m happy to say
has a nice deep growl of a sound . I threw my gloves between my crotch
and the bike, checked to make sure Dachary was on her bike, and we took
off; zipped jackets and gloved hands be damned!&lt;/p&gt;
&lt;p&gt;How close were we? The
bear could have &lt;em&gt;easily&lt;/em&gt; closed the distance between us in three
seconds. How much adrenaline did we have? Just enough to cap off the day
with a smile. Although the remaining miles were pretty anticlimactic.&lt;/p&gt;
&lt;p&gt;P.S. A coworker opened her eyes wide when I related yelling &amp;ldquo;Hey Bear!&amp;rdquo;
&amp;ldquo;I thought you played dead?&amp;rdquo; she said. For those of you who don&amp;rsquo;t know:
No, you don&amp;rsquo;t play dead. You make lots of noise, hopefully stay out
sight, and the bear will probably stay away from you. If the bear comes
up to you, make yourself big, carry a big stick, and pray to your
favorite deity. Unless it&amp;rsquo;s a Grizzly Bear, which you probably won&amp;rsquo;t
know until the thing is pretty much on top of you. If it&amp;rsquo;s a grizzly I&amp;rsquo;m
pretty sure you do the same thing, except if making noise fails, you
play dead. If you play dead for a Black Bear or a Brown Bear, they&amp;rsquo;re
likely to thank you for making it easy to kill you for being in their
territory.&lt;/p&gt;
&lt;p&gt;P.P.S. On a related note. Does anyone know the appropriate
strategy for dealing with mountain lions or keeping them away from your
camp? That&amp;rsquo;s an issue we may have to deal with in Central / South
America.&lt;/p&gt;
&lt;p&gt;P.P.P.S Afterwards Dachary was all &amp;ldquo;Why were you telling me to
be quiet?!?!&amp;rdquo; because she&amp;rsquo;s smarter than me. ;)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>800&#43; lbs of flying idiocy.</title>
      <link>https://weblog.masukomi.org/2010/09/05/800-lbs-of-flying-idiocy/</link>
      <pubDate>Mon, 06 Sep 2010 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2010/09/05/800-lbs-of-flying-idiocy/</guid>
      <description>&lt;p&gt;Yesterday I watched an 800 pounds of chrome, fiberglass, metal, and
plastic spinning through the air. Sunlight reflected in movie-like
highlights off of the long chromed pipes. The Harley did things other
Harleys have only ever dreamed of&amp;hellip; in their nightmares.&lt;/p&gt;
&lt;p&gt;I saw the
whole thing, from start to finish. Dachary only saw the grand finale of
flying metal, but her brain came to the obvious conclusion: &amp;ldquo;That&amp;rsquo;s a
cruiser [spinning through the air]. He was probably wearing jeans and a
t-shirt.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s back up, a fraction of a second earlier.&lt;/p&gt;
&lt;p&gt;Two &amp;ldquo;Harley guys&amp;rdquo;, out for a ride. Each wearing a
&lt;a href=&#34;http://en.wikipedia.org/wiki/Kippah&#34;&gt;Yarmulke&lt;/a&gt; style black skull cap
(too small to deserve the title of &amp;ldquo;helmet&amp;rdquo; in my book), t-shirts and
jeans. Cruising along at maybe forty miles an hour. The rear one,
obviously not paying attention, gets too close to the front, and as his
front tire is almost in line with his friend&amp;rsquo;s rear, does something I
can&amp;rsquo;t explain. Maybe he clipped the panniers. Maybe he screwed up and
hit his wheel into his friends. I&amp;rsquo;m not quite sure. But the rest was
clear.&lt;/p&gt;
&lt;p&gt;Uncontrolled front wheel wobble, followed by a lowside (when you
&amp;ldquo;lay the bike down&amp;rdquo;). I watched as the left side of his torso approached
the ground. Some small part of his brain told him to keep his hand up,
which was good, because while his hands did have leather gloves on, I&amp;rsquo;m
pretty sure they were fingerless. It&amp;rsquo;s &amp;ldquo;cooler&amp;rdquo; that way. So, he proffered
his bare elbow to the gods of asphalt.&lt;/p&gt;
&lt;p&gt;His bike was better at keeping
its speed on its side than he was, but after an instant it decided that
it didn&amp;rsquo;t like sliding, and figured maybe flying would hurt less, so
eight hundred plus pounds of metal went from sliding on its side,
uprighted itself (sideways) and lept two feet into the air, where it
began it&amp;rsquo;s pirouette.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t see it come down. I was heading in the
other direction on the divided road, and didn&amp;rsquo;t feel like performing a
re-enactment. There was a light ahead, and I planned to turn around
there to help out, because there&amp;rsquo;s a camaraderie amongst motorcyclists,
and we watch out for each other, even when the others are idiots. Also,
I had a first aid kit in my panniers. But, just before I got to the
light, a police car passed, lights on, heading for the scene. And, as
cops are way better trained at handling bleeding idiots than I am, I let
them too it. Also, he probably had a better first aid kit than mine,
although I wonder if his had a splint too&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.GearUpProject.org&#34;&gt;Gear Up&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It is said that there are two kinds
of motorcycle riders in the world. Those who have crashed, and those who
haven&amp;rsquo;t crashed yet. It&amp;rsquo;s safe to say that he will have a serious scar
on that elbow, and he may have mobility issues with it for the rest of
his life. Depending on how the rest of him fell and if he rolled or slid
there may be much a broken shoulder and much more skin ground off by the
road. There&amp;rsquo;s probably a couple grand worth of damage to his bike, and
his friend may never ride with him again. I know I&amp;rsquo;d be hesitant to let
someone that careless ride beside me.&lt;/p&gt;
&lt;p&gt;If he was paying attention it would have never happened. If he was
wearing protective gear I honestly believe the worst he&amp;rsquo;d suffer would
be a bruise and maybe a week of aching.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>A note about camping while touring</title>
      <link>https://weblog.masukomi.org/2010/08/18/a-note-about-camping-while-touring/</link>
      <pubDate>Wed, 18 Aug 2010 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2010/08/18/a-note-about-camping-while-touring/</guid>
      <description>&lt;p&gt;On this past weekend&amp;rsquo;s test run we encountered an unexpected problem. It
took us nearly two hours to break camp each morning which left us no
time to relax, or have a nibble, between waking and hitting the road. On
my last big trip it wasn&amp;rsquo;t like this at all. Yes, it took me nearly two
hours between when I woke and when I hit the road, but that included a
shower, a nibble, and lounging around reading a book. So what went
wrong?&lt;/p&gt;
&lt;p&gt;I wasn&amp;rsquo;t sure at first, but eventually it hit me. On my last big
trip I was spending my nights in a one person tent. Because the number
of people a tent is rated for is the number of bodies you can fit in it,
barely, there was no additional space inside for much of anything.
Essentially everything had to stay in the saddlebags on the bike. At the
end of the tent I&amp;rsquo;d fit one one boot in each corner. Along my side i&amp;rsquo;d
lay my one piece suit in one bunched up line (assuming it wasn&amp;rsquo;t wet).
My camelback would go by my head for drinks in the night, and my rolled
up clothes would be my pillow. My helmet would sit on a waterproof bag
(to keep moisture from coming up from the ground and into the inner
padding) underneath the tent&amp;rsquo;s rain flap. And, that was it.&lt;/p&gt;
&lt;p&gt;What I didn&amp;rsquo;t realize was that because I didn&amp;rsquo;t have space for anything in the
tent everything I&amp;rsquo;d used the night before had to be put away as soon as
I finished with it, lest it blow away. In the mornings I&amp;rsquo;d throw on my
pants, take off the fly cover, shake it out and set it in the sun to let
it dry (there was always moisture on the inside of it from my breathing
if not dew), grab the handful of things from inside the tent and put
them by the bike, and then enjoy a leisurely read for an hour or so
before throwing on my suit and heading out. It was a great start to the
day.&lt;/p&gt;
&lt;p&gt;But on this last test ride we spent two hours picking things up and
packing them away. Part of the problem was that the soft luggage i was
using seemed to hold slightly less every day. Even though I was packing
the same items it never seemed to want to hold as many of them as the
previous day. As a result, each morning some time was spent putting
things in, and taking things out, trying to figure out how to make it
fit again. But part of it was just time spent picking up and packing
things away that didn&amp;rsquo;t need to be left unpacked the night before, and
the fact that I&amp;rsquo;m not the most efficient creature on the planet just
after waking.&lt;/p&gt;
&lt;p&gt;The morning&amp;rsquo;s weren&amp;rsquo;t enjoyable at all. They were two
hours of grabbing, packing, and reattaching the bags to the bike, so
that, we could ride off immediately, because we were already running so
late.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So, here&amp;rsquo;s my tip. Pack everything away as soon as you&amp;rsquo;re done
with it.&lt;/strong&gt; In the case of pots and bowls*, bring a small towel just for
them so you can wash, dry, and immediately pack them away as soon as
you&amp;rsquo;re done with dinner. If you&amp;rsquo;ll be using them again for breakfast
you&amp;rsquo;ll still want to immediately address them because you don&amp;rsquo;t want
them lying about to get blown around, and they take up too much space
when out and about.&lt;/p&gt;
&lt;p&gt;In the morning it&amp;rsquo;ll take you less than 10 minutes
to break camp, leaving you plenty of time to sit around and enjoy the
morning while your fly sheet dries in the sun, and another 5 at the end
to roll up the fly sheet and the rest of the tent fabric and stick it on
your bike before gearing up and taking off. * I highly recommend the
&lt;a href=&#34;http://www.rei.com/product/783287&#34;&gt;GSI Pinnacle Dualist Cookset&lt;/a&gt;.
They&amp;rsquo;ve also got &lt;a href=&#34;http://www.rei.com/product/784114&#34;&gt;a single person
version&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>It&#39;s only been three days...</title>
      <link>https://weblog.masukomi.org/2010/08/17/its-only-been-three-days/</link>
      <pubDate>Tue, 17 Aug 2010 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2010/08/17/its-only-been-three-days/</guid>
      <description>&lt;p&gt;We took a test run this weekend; seeing how the gear works for the big
trip in December. It was only three days, but now I&amp;rsquo;m back, out of the
shower, and about to start my morning routine. And, the truth is I feel
a bit overwhelmed at the prospect. So much&amp;hellip;. internet.&lt;/p&gt;
&lt;p&gt;So much data. So much news. And so little of it actually matters.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve already falling back into the mindset of being on the road. Just
ride&amp;hellip;. grab half way through the day and guess how far you can make it
before dark. See if there&amp;rsquo;s a campground nearby ride some more. Try and
find as many beautiful things to see and photograph as possible. Repeat.&lt;/p&gt;
&lt;p&gt;I learned a lot on this test run. Not just about riding with my new
partner, but about why some things worked so well on the last trip, and
failed to on this one. I&amp;rsquo;ll write that all up in another post, but right
now. I&amp;rsquo;m a little afraid to &amp;ldquo;jack in&amp;rdquo;&amp;hellip; and it&amp;rsquo;s only been three days.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Why you should never indent code with spaces</title>
      <link>https://weblog.masukomi.org/2010/07/26/why-you-should-never-indent-code-with-spaces/</link>
      <pubDate>Mon, 26 Jul 2010 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2010/07/26/why-you-should-never-indent-code-with-spaces/</guid>
      <description>&lt;h2 id=&#34;tabs-vs-spaces&#34;&gt;Tabs vs. spaces&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s a big back-and-forth between developers, with lots
of us swearing by the use of spaces, but I&amp;rsquo;m here to explain to you why
everyone who uses spaces instead of tabs for indentation is not only
wrong but seriously inconsiderate of their fellow developer.&lt;/p&gt;
&lt;p&gt;First
though, we must consider what a tab is and what a space character is. A
tab is a typographical element specifically designed for the indentation
of text to various levels. A space is a typographical element
specifically designed to separate individual characters so as to
distinguish words from each other.&lt;/p&gt;
&lt;p&gt;Next we must consider the individual
coders we work with. Each of us has a personal preference about how much
indentation looks good, and is most readable to our eyes. Many of us
like about four spaces worth per indentation level, but some prefer two
or eight. What&amp;rsquo;s important here is that what&amp;rsquo;s readable and good looking
to you is almost guaranteed to not look good to someone else working in
the same codebase.&lt;/p&gt;
&lt;p&gt;When you use spaces you are misusing a typographical
element to emulate one that already exists. Not only that but you are
enforcing your personal aesthetic on your co-contributers. However, if
you were to use a tab for each indentation level then everyone else who
works in the same codebase would see each level of indentation at a
depth that they prefer. Every code editor out there allows you to
specify how many spaces of indentation each tab should emulate. People
who like it wide can set it to eight. People who like it skinny can set
it to two. Everyone gets to see the code indented in a way that is
aesthetically pleasing and readable to them.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s only one thing
worse (in this discussion) than enforcing your indentation aesthetic on
your co-contributers, and that&amp;rsquo;s combining tabs and spaces. When you do
that it&amp;rsquo;s almost guaranteed to look screwed up in other people&amp;rsquo;s text
editors. So turn on invisible characters in your editor (or at least
have it display tabs). In summary:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tabs were invented for indentation, so stop misusing the damn space
bar for something it was never intended to do.&lt;/li&gt;
&lt;li&gt;What looks good to you doesn&amp;rsquo;t look good to everyone elese.&lt;/li&gt;
&lt;li&gt;What&amp;rsquo;s easily readable to you isn&amp;rsquo;t easily readable to everyone else.&lt;/li&gt;
&lt;li&gt;Everyone gets to have indentation at a level they want if you use
the freaking tool that was designed to indent instead of the one
that was designed to separate words.&lt;/li&gt;
&lt;li&gt;Turn on invisible characters so you know when some idiot&amp;rsquo;s mixed
tabs and spaces.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>git status-report</title>
      <link>https://weblog.masukomi.org/2010/07/16/git-status-report/</link>
      <pubDate>Fri, 16 Jul 2010 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2010/07/16/git-status-report/</guid>
      <description>&lt;p&gt;Every week I, and millions of developers like me, have to put together a
status report for our bosses, letting them know what we&amp;rsquo;ve been up to
for the previous week. Like most of the developers I&amp;rsquo;ve encountered I&amp;rsquo;m
always a little unsure of what *exactly* I was working on, and
typically I just open up git to see what commits I made, and try to
remember any non-code stuff I&amp;rsquo;ve Thinking it was silly to keep wading
through everyone&amp;rsquo;s commits for the past week to see what I worked on
I&amp;rsquo;ve put it all together in a script (in Ruby) called git status-report,
which you can &lt;a href=&#34;http://github.com/masukomi/git_accessories/blob/master/git-status-report&#34;&gt;grab from github
here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It outputs a bullet list of all your commits for the past n days, or the
commits of one of your fellow contributors. I think I&amp;rsquo;ll find the latter
a great way to keep up on what other folks on my team are working on at
the moment.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Usage: git status-report [-e &amp;lt;email&amp;gt;][-d &amp;lt;days&amp;gt;]
Generates a status report for what you worked on for the past n days.
    -a, --all                        Displays output for all contributers sorted by person
    -b, --branches &amp;lt;branch name&amp;gt;     Limit results to work found in the specified branch(es). 
                                         Multiple branches can be comma separated
    -c, --current                    Generates status report for the current repo only
    -d, --days &amp;lt;num days&amp;gt;            The number of days to generate the report for. Defaults to past 6 days (one week)
    -e, --email &amp;lt;email address&amp;gt;      The email address of the committer to generate a report for. 
                                         Defaults to your &amp;quot;git config user.email&amp;quot; address. 
                                         Multiple email addresses can be comma separated.
    -f, --files                      Display a list of files involved in the commit(s)
    -h, --help                       Displays this message
    -r, --reverse                    Displays output in reverse chronological order
    -s, --simple                     Simpler output. Doesn&#39;t include the dates
    -v, --verbose                    Verbose output includes details on each commit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Please don&amp;rsquo;t hesitate to fork the repo on github and make improvements.
I&amp;rsquo;ll happily merge them in to the main one. git-status-report supports
will check for commits in all the branches and supports multiple
repositories. Check the README for full details.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>DODOcase iPad case mod</title>
      <link>https://weblog.masukomi.org/2010/07/09/dodocase-ipad-case-mod/</link>
      <pubDate>Fri, 09 Jul 2010 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2010/07/09/dodocase-ipad-case-mod/</guid>
      <description>&lt;p&gt;I love my &lt;a href=&#34;http://www.dodocase.com/&#34; title=&#34;DODOcase&#34;&gt;DODOcase&lt;/a&gt;. Money very
well spent&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;. Throw an iPad in it and it just looks like a big Moleskine
(love that look) instead of some techy $500+ block of &amp;ldquo;steal me&amp;rdquo;. Plus,
it&amp;rsquo;s about the only case out there that I feel is actually worth the $50
they all seem to cost. But, there&amp;rsquo;s one problem: nowhere to store any
papers. I had to go to City Hall the other day and needed to bring some
papers with me. &amp;ldquo;I&amp;rsquo;ll just fold them in half and throw them in my
DODOcase.&amp;rdquo; I thought. And it worked, kind-of. The problem is, that every
time you open you have to move them to use the iPad, and you&amp;rsquo;re stuck
like that till you get home again and have somewhere real to put them.
&amp;ldquo;If only it had an accordion pocket like the Moleskine it&amp;rsquo;s emulating.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/07/closed.jpg&#34;&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/07/closed.jpg&#34; alt=&#34;image&#34; title=&#34;DODOCase closed&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The next day at work I grabbed a manila folder, a pair of scissors, and
some scotch tape and made one, and have been loving the results. I&amp;rsquo;m
posting them here so that other DODOcase owners can do the same. Maybe
the DODOcase folks will even consider adding an accordion pocket like
this in future cases (only without the scotch tape ;). If so, I totally
want a free one. ;) Just kidding, actually, no, not kidding. ;) When I
initially made this I left the flap over the opening simply because the
folder was wider than the cover, but I&amp;rsquo;ve been using it for about a week
now and have come to realize that it is essential. Frequently when I
open my DODOcase I remove the elastic and flip the cover around behind
the iPad in one swift motion. If there wasn&amp;rsquo;t a flap there any documents
held in the accordion pocked would be likely to go flying out. And yes,
before you ask, because the iPad is smaller than an 8 1/2 x 11 or A4
paper you&amp;rsquo;re going to have to fold &amp;ldquo;normal&amp;rdquo; sized papers in half to fit
them in the pocket. &lt;strong&gt;Pictures (followed by instructions):&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/07/open_case.jpg&#34;&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/07/open_case.jpg&#34; alt=&#34;image&#34; title=&#34;open_case&#34;&gt;&lt;/a&gt;
&lt;a href=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/07/open_folder.jpg&#34;&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/07/open_folder.jpg&#34; alt=&#34;image&#34; title=&#34;open_folder&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;instructions&#34;&gt;Instructions:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Take a manila folder. Turn it so that it faces left and center it
vertically on the inside of your open DODOcase&amp;rsquo;s cover.&lt;/li&gt;
&lt;li&gt;Make a mark where the red paper stops on the top and the bottom.&lt;/li&gt;
&lt;li&gt;fold the top and bottom edges of the folder inwards at those marks.&lt;/li&gt;
&lt;li&gt;Close the folder with those edges folded inwards and rub the crease
down with something hard.&lt;/li&gt;
&lt;li&gt;Put the folder on your dodocase and mark on the top and bottom edges
of your folder where left side of the red paper is.&lt;/li&gt;
&lt;li&gt;Cut off the left edge of the side of the folder that is facing you
from the top mark to the bottom. You may want to make a crease, or
draw a line between them so you have something to follow with your
scissors.&lt;/li&gt;
&lt;li&gt;Fold a vertical crease in the far side of the folder so that it
folds towards you over the edge you just made with your scissors.
Crease this fold with something hard. You need it to really want to
fold inwards as much as possible on its own.&lt;/li&gt;
&lt;li&gt;Open the folder back up. You will see the edges you previously
folded inwards poking up. Place tape on the far side of the left
half of the bottom one so that the bottom of sticky side is half
stuck to the back of the edge poking up and the top of the sticky
side is facing you and not stuck to anything.&lt;/li&gt;
&lt;li&gt;Now, mostly close the folder, and starting at the inside fold the
tape over to stick to its counterpart.&lt;/li&gt;
&lt;li&gt;Repeat for the top.&lt;/li&gt;
&lt;li&gt;Your folder now has an accordion fold.&lt;/li&gt;
&lt;li&gt;Tape the far top and bottom edges to your DODOcase. I used Scotch
tape for this but I think I&amp;rsquo;m going to switch it to Medical tape
where it&amp;rsquo;s held to the DODOcase.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Voilla. You&amp;rsquo;re done. :) Drop me a comment if you do this, or if you
think of a way to make it better.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;A while after this was written the bamboo started to
bow inwards which prevented the corners from staying where they should
and the iPad kept falling out. Eventually, I had to abandon my DODOCase.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Mind Map of Ray Mailman&#39;s I Didn&#39;t Know</title>
      <link>https://weblog.masukomi.org/2010/06/15/mind-map-of-ray-mailmans-i-didnt-know/</link>
      <pubDate>Tue, 15 Jun 2010 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2010/06/15/mind-map-of-ray-mailmans-i-didnt-know/</guid>
      <description>&lt;p&gt;I was listening to &lt;a href=&#34;http://www.raymailman.com&#34;&gt;Ray Mailman&lt;/a&gt;&amp;rsquo;s I Didn&amp;rsquo;t
Know the other day and realized it&amp;rsquo;d make a great &lt;a href=&#34;http://en.wikipedia.org/wiki/Mind_map&#34;&gt;Mind
Map&lt;/a&gt;. So, this morning I grabbed
&lt;a href=&#34;http://www.mindnode.com/&#34;&gt;MindNode&lt;/a&gt; for the iPad, put on some
headphones, and whipped this out.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/06/i_didnt_know_by_ray_mailman.png&#34;&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/06/i_didnt_know_by_ray_mailman.png&#34; alt=&#34;mind map of I Didn&amp;rsquo;t Know by Ray
Mailman&#34; title=&#34;mind map of I Didn&#39;t Know by Ray Mailman&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Future Edit:&lt;/p&gt;
&lt;p&gt;The song is from his Sideways album. It&amp;rsquo;s kind-of hard to find as he seems to have disappeared from the Internet in 2014, but &lt;a href=&#34;https://music.youtube.com/watch?v=OYzCc2I5J5c&amp;amp;feature=share&#34;&gt;here&amp;rsquo;s a link to it on YouTube Music&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Feed by Mira Grant [Book Review]</title>
      <link>https://weblog.masukomi.org/2010/06/05/feed-by-mira-grant-book-review/</link>
      <pubDate>Sat, 05 Jun 2010 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2010/06/05/feed-by-mira-grant-book-review/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/0316081051?ie=UTF8&amp;amp;tag=masukomiorg-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0316081051&#34;&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/06/feed_cover.jpg&#34; alt=&#34;image&#34; title=&#34;feed_cover&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/0316081051?ie=UTF8&amp;amp;tag=masukomiorg-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0316081051&#34;&gt;Feed&lt;/a&gt;  is not about zombies. Yes, they play a significant role in the book, but
the book is simply not about them. It is a gripping book about
journalism and journalistic integrity.&lt;/p&gt;
&lt;p&gt;It starts out with a dramatic
zombie escape sequence, as all books involving zombies must, which
honestly left me feeling&amp;hellip; &amp;ldquo;um. ok. And?&amp;rdquo; The scene was good but it
didn&amp;rsquo;t seem to have a real point beyond acting as a hook. Immediately
afterwards she sets about the task of building up the world of her main
characters, not a &amp;ldquo;zombie! zombie! fear! fear!&amp;rdquo; world; a world where two
twenty-something siblings go about their life of being professional
bloggers / journalists in a world where The Infected are an everyday
part of life that has been, to varying degrees, contained.&lt;/p&gt;
&lt;p&gt;When The
Rising happened people stopped trusting traditional media, because it
let them down so badly, and began to trust Bloggers who spoke the truth
about the dead rising and what people needed to do to save themselves.
By the time of the story Bloggers have become organized themselves into
a very real and serious form of journalists categorized by the type of
stories they produce: news, opinion, fiction, real-life action, etc.&lt;/p&gt;
&lt;p&gt;Our main characters get a gig following a presidential candidate on the
campaign trail, which sounds rather incongruous with a zombie book, and
doesn&amp;rsquo;t make you say &amp;ldquo;oh my, this will be good!&amp;rdquo; But trust me, it is,
and it gets better with every page. It&amp;rsquo;s just a matter of time before
you&amp;rsquo;re stealing extra minutes in the bathroom just to see what happens
next. It&amp;rsquo;s a little slow in the beginning, and some of the &amp;ldquo;clues&amp;rdquo; are
discovered a bit too easily, but this is the best book I have read in a
very long time.&lt;/p&gt;
&lt;p&gt;The poignancy of the climactic scene in the van will
stick with you for a long time, and you will love, and hate how it all
ends.&lt;/p&gt;
&lt;p&gt;Read this book. Read this book if you ever thought it&amp;rsquo;d be cool to
be a reporter. Read this book if it bothers you that our media outlets
are hamstrung by governments and over-litigious societies. Read this if
it bothers you that people keep giving away their freedoms every time
something scary happens. And&amp;hellip; read this book if you like a little
zombie spice in your tales.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Four out of 5 stars, only because the
intro sequence left me feeling meh and the real story took a little bit
to get going. You could *almost* delete the first two chapters and
have a better book, but the end of the second chapter sets up some
important details on how the main characters do their job.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Dear AT&amp;T: Fuck You</title>
      <link>https://weblog.masukomi.org/2010/05/20/dear-att-fuck-you/</link>
      <pubDate>Thu, 20 May 2010 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2010/05/20/dear-att-fuck-you/</guid>
      <description>&lt;p&gt;As we all know, AT&amp;amp;T has been having serious issues with their quality
of service thanks to the iPhone. What most people don&amp;rsquo;t know is that it
isn&amp;rsquo;t a problem that can be solved by simply putting up more towers&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.
But that&amp;rsquo;s not what I&amp;rsquo;m upset about. I&amp;rsquo;m upset about their handling of
the &amp;ldquo;&lt;a href=&#34;http://www.wireless.att.com/learn/why/3gmicrocell/&#34;&gt;3G
MicroCell&lt;/a&gt;&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;I live
in Cambridge MA, just across the river from Boston. There are millions
of people here (literally), and, like many AT&amp;amp;T users my calls get
dropped even when outside, on bright sunny days, with five bars of
service. In my house maybe eight feet from the windows I&amp;rsquo;m lucky if
anyone can understand what I&amp;rsquo;m saying, or can even hear me in the first
place. My girlfriend works from home, and for the most part, I don&amp;rsquo;t
attempt to call her, because it&amp;rsquo;s not worth the frustration, but then I
get my hopes up, call, can&amp;rsquo;t understand her, and eventually have the
call dropped. But she&amp;rsquo;s just screwed if she needs to call someone on her
cell. But, like I said, I&amp;rsquo;m not actually that upset about the crap
service. It&amp;rsquo;s like being mad at someone with a broken leg for not being
able to run. Of course, their leg was broken years ago and they still
seem to be hobbling around acting as if it were fresh&amp;hellip;&lt;/p&gt;
&lt;p&gt;But AT&amp;amp;Ts
handling of the &lt;a href=&#34;http://www.wireless.att.com/learn/why/3gmicrocell/&#34;&gt;3G
MicroCell&lt;/a&gt; is
absolute bullshit. In the promo video on their web site they&amp;rsquo;ve got a
guy attempting to make a phone call by holding his phone out the window,
before being told by his wife that he doesn&amp;rsquo;t have to thanks to the 3G
MicroCell. &amp;ldquo;So, no more leaning out of the window or standing on the
porch to make a call?&amp;rdquo; the man says. Ok. You&amp;rsquo;ve got service &lt;em&gt;so&lt;/em&gt; crappy
that not only do people have to&lt;em&gt;lean out their windows to use it&lt;/em&gt;,
&lt;strong&gt;but&lt;/strong&gt; you explicitly use that problem in promotional material as a
reason for getting the 3G MicroCell and then you have the gall to charge
$150 for the &lt;em&gt;privilege&lt;/em&gt; of getting the coverage iPhone users are
already paying at least $100 a month for? Even worse, you use &lt;em&gt;our&lt;/em&gt;
bandwidth to do it. Even worse than that, while users or the MicroCell
have gone out of their way to take themselves off of your overloaded
network by using the MicroCell AND giving you free bandwidth that
they&amp;rsquo;re paying someone else for you&amp;rsquo;re still going to make any minutes
used talking that way be removed from their account. On top of all that,
if we want the privilege of getting the service &lt;em&gt;we&amp;rsquo;re already paying
for&lt;/em&gt;, and give you free bandwidth, but don&amp;rsquo;t want those minutes to
count, we have to pay you another $20 a month?!&lt;/p&gt;
&lt;p&gt;Fuck you!&lt;/p&gt;
&lt;p&gt;Your proposal
is essentially that your service is such shit that your customers should
pay you &lt;em&gt;$150&lt;/em&gt; *&lt;strong&gt;and&lt;/strong&gt; give you free bandwidth?!*And let&amp;rsquo;s not forget
the option you&amp;rsquo;ve given us of paying you a recurring fee (and give you
more free bandwidth) if we find that we like talking to the people we
were paying you to let us talk to in the first place, now that they can
actually hear us.&lt;/p&gt;
&lt;p&gt;In what universe does this make &lt;em&gt;any&lt;/em&gt; sense? You
should be giving them away to anyone who wants them &lt;em&gt;and&lt;/em&gt; giving people
unlimited minutes for calls made on them. If your service actually
worked it would be reasonable to charge for it, but it doesn&amp;rsquo;t, and it&amp;rsquo;s
not reasonable for people to have to pay you to compensate for failing
to give them what they&amp;rsquo;re already paying you for. This is bad economics
and it is utterly disrespectful.&lt;/p&gt;
&lt;p&gt;If all of that wasn&amp;rsquo;t bad enough. I&amp;rsquo;m
probably going to have to buy the fucking piece of shit because &lt;em&gt;I can&amp;rsquo;t
use my fucking phone without it&lt;/em&gt;. If I didn&amp;rsquo;t think the iPhone was a
brilliant piece of technology that I loved using I would cancel my
service and pay pretty much any termination fee just to get away from
you, your blatant disrespect of your customers, and your shit service.
I&amp;rsquo;d go to tiny little T-mobile in a heartbeat, even though they&amp;rsquo;ve got
less coverage than you, because where they have coverage &lt;em&gt;it actually
works&lt;/em&gt;, and they try and do the right thing for their customers.&lt;/p&gt;
&lt;p&gt;Shit
like this gives AT&amp;amp;T an even worse name than they already have, and
makes me seriously consider ditching the iPhone. It will be a monolith
of my hatred for AT&amp;amp;T. It will glare at me saying &amp;ldquo;sucker&amp;rdquo; until the day
I finally cancel my contract with you and joyfully smash it to pieces
with the nearest hammer.&lt;/p&gt;
&lt;p&gt;Fuck you AT&amp;amp;T.&lt;/p&gt;
&lt;p&gt;Yours truly,&lt;br&gt;
- All the people
you&amp;rsquo;ve been shitting on for years now.&lt;/p&gt;
&lt;p&gt;P.S. While I have you: I already
bought an iPhone from you. You&amp;rsquo;re charging me a hundred bucks a month
for it. Stop trying to sell me an iPhone!&lt;/p&gt;
&lt;p&gt;[Update]: A lot
of people just don&amp;rsquo;t get why I&amp;rsquo;m so upset, and in explaining it to
someone I came up with this metaphor: Why should I have to pay AT&amp;amp;T
anything (for a MicroCell) to compensate for their failed service
promise that we&amp;rsquo;ve already been paying ~$100 a month for? That&amp;rsquo;s like
telling someone you&amp;rsquo;ll come cook them dinner every day (no matter where
they are in the US) if they pay you $100 a month, but then you only show
up occasionally, and sometimes you leave half-way through the cooking,
and then you ask them to pay you an additional $150 to get you to show
up, but only at their home, and only if they&amp;rsquo;ve gone out and bought all
the fixings for dinner and paid someone else to make sure they can have
access to the stove. Would ANYONE, &lt;em&gt;EVER&lt;/em&gt; find that acceptable? No.
You&amp;rsquo;d get fired and they&amp;rsquo;d hire a cook that actually did what they were
paying them for.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;With regards to
putting up more towers. Someone with a good understanding of the
technology described it to me like this: Imagine that you&amp;rsquo;re at a table
with 4 other people all talking. With a teeny bit of effort you can
listen to what any one of them is saying. You are the cell tower, and
each of the other people are cell phones. Now, imagine there are a
thousand people at the table. They&amp;rsquo;re all talking, they&amp;rsquo;re all within
hearing range, and they&amp;rsquo;re all speaking at roughly the same volume.
You&amp;rsquo;re going to have a damn hard time listening to any single one of
them. It wouldn&amp;rsquo;t matter if there were fifty &amp;ldquo;towers&amp;rdquo; in the room
attempting to listen to the people&amp;rsquo;s conversations because they&amp;rsquo;re all
going to have the same problem. It&amp;rsquo;s just too hard to listen to a single
voice in that cacophony. Other cell phone providers don&amp;rsquo;t have the same
problem because they use different technologies.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Git Rebase: why, and when, you&#39;d use it.</title>
      <link>https://weblog.masukomi.org/2010/05/08/git-rebase-why-and-when-youd-use-it/</link>
      <pubDate>Sat, 08 May 2010 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2010/05/08/git-rebase-why-and-when-youd-use-it/</guid>
      <description>&lt;p&gt;Rebase is one of the most powerful tools in Git&amp;rsquo;s arsenal, but it can
trip up people coming from centralized version control systems. This is
just a quick example of why, and when, you&amp;rsquo;d want to use it.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s say
we&amp;rsquo;ve got a team of three developers. Monday morning they all come in,
Bob makes a quick commit, and shares it with everyone. They all do a git
pull and suck it into their repos.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/05/rebasing_monday.png&#34;&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/05/rebasing_monday.png&#34; alt=&#34;image&#34; title=&#34;rebasing_monday&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Tuesday Mary does some work, but Bob and Tom are taking the day off and
don&amp;rsquo;t pull in her changes yet.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/05/rebasing_tuesday.png&#34;&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/05/rebasing_tuesday.png&#34; alt=&#34;image&#34; title=&#34;rebasing_tuesday&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Wednesday Tom makes a change and everyone pulls it into their repos.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/05/rebasing_wednesday.png&#34;&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/05/rebasing_wednesday.png&#34; alt=&#34;image&#34; title=&#34;rebasing_wednesday&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Now depending on what changes Mary has made Bob and Tom may be able to pull
them in without problem. Then again it &lt;em&gt;could&lt;/em&gt; result in a conflict. But
Mary&amp;rsquo;s a pro who thinks of her teammates, so she&amp;rsquo;s going to rebase her
repository and reorder the commits so that her change is on top of
Tom&amp;rsquo;s. Now, &lt;em&gt;if&lt;/em&gt; Mary&amp;rsquo;s changes were such that they&amp;rsquo;d cause a conflict
when Bob and Tom pulled them in then they&amp;rsquo;ll cause a conflict for Mary
when she rebases, but they&amp;rsquo;re Mary&amp;rsquo;s changes so she&amp;rsquo;s the one most
capable of resolving those quickly. Also, if Mary takes care of it in
the rebasing then no-one else is going to have to deal with the
conflict. It&amp;rsquo;s much better to have the person who wrote the change
resolve it than have everyone else on the team have to deal with it.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/05/rebasing_mary_rebase.png&#34;&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/05/rebasing_mary_rebase.png&#34; alt=&#34;image&#34; title=&#34;rebasing_mary_rebase&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So, Mary reorders her commits with git rebase, and &lt;em&gt;if&lt;/em&gt; there were any
conflicts she resolves them. When the others pull down her changes it&amp;rsquo;ll
look like she wrote them on top of the changes they already had.&lt;/p&gt;
&lt;p&gt;Another reason Mary might want to rebase is if she made a bunch of partial
commits along the way. She might do this to give herself multiple
roll-back points, or maybe she committed every time she finished working
on one of the files related to the current feature she&amp;rsquo;s implementing,
just so she wouldn&amp;rsquo;t have to worry about loosing anything. Now, she
wouldn&amp;rsquo;t want to share those partial commits because they&amp;rsquo;d probably
break something in other people&amp;rsquo;s system. So, when she finishes with her
work, she uses rebase to squash the partial commits into one nice clean
commit and then tells people to pull that, or maybe pushes it to some
common repo they all push changes to.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/05/rebasing_mary_rebase_2.png&#34;&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/05/rebasing_mary_rebase_2.png&#34; alt=&#34;image&#34; title=&#34;rebasing_mary_rebase_2&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Rebase is an incredibly powerful tool, but there&amp;rsquo;s one thing you must remember
to never do and that&amp;rsquo;s rebase commits that have already been shared with
others. For example: Git wouldn&amp;rsquo;t prevent Mary from rebasing the &amp;ldquo;Bob -
Monday&amp;rdquo; commit up after all the other commits, or merge it into the
commit she made on Tuesday, but doing so is guaranteed to cause problems
for anyone who tries to pull from her. So rebase your own work before
you set it free, but once others have it you can&amp;rsquo;t touch it.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://creativecommons.org/licenses/by-nc-sa/3.0/us/&#34;&gt;&lt;img src=&#34;http://i.creativecommons.org/l/by-nc-sa/3.0/us/88x31.png&#34; alt=&#34;Creative Commons License&#34;&gt;&lt;/a&gt;
This work is licensed under a &lt;a href=&#34;http://creativecommons.org/licenses/by-nc-sa/3.0/us/&#34;&gt;Creative Commons Attribution-Noncommercial-Share Alike 3.0 United States License&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you found this useful you might be interested in &lt;a href=&#34;http://localhost:4000/blog/categories/git/&#34;&gt;some of the other git posts here&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How to Sell... Anything</title>
      <link>https://weblog.masukomi.org/2010/05/08/how-to-sell-anything/</link>
      <pubDate>Sat, 08 May 2010 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2010/05/08/how-to-sell-anything/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/05/how_to_sell.png&#34;&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/05/how_to_sell.png&#34; alt=&#34;Flow chart of how to sell
anything&#34; title=&#34;How to sell... anything&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A flow chart of How to Sell&amp;hellip;Anything.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The $11.09 iPad typing stand</title>
      <link>https://weblog.masukomi.org/2010/05/04/the-11-09-ipad-typing-stand/</link>
      <pubDate>Wed, 05 May 2010 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2010/05/04/the-11-09-ipad-typing-stand/</guid>
      <description>&lt;h2 id=&#34;the-problem&#34;&gt;The Problem&lt;/h2&gt;
&lt;p&gt;When you check out the iPad at an Apple store they&amp;rsquo;re all lined up on
little lucite stands with a grippy top and a slight angle so that
they&amp;rsquo;re simultaneously easy to view and easy to type on. I love those
stands. I&amp;rsquo;d totally buy one, but I can&amp;rsquo;t. [Update: now you can buy
something even better. Check out the
&lt;a href=&#34;http://www.griffintechnology.com/products/loop&#34;&gt;Loop&lt;/a&gt; from Griffin and
their &lt;a href=&#34;http://www.griffintechnology.com/products/a-frame&#34;&gt;A-Frame&lt;/a&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomihttp://s3.amazonaws.com/mobtvse_masukomi/assets/2010/04/completed_stand_w_pad_small.jpg&#34; alt=&#34;image&#34; title=&#34;completed_stand_w_pad_small&#34;&gt;&lt;/p&gt;
&lt;p&gt;the goal here was to create a stand that would hold your iPad securely,
would let you easily read the screen, and type comfortably on. Also,
it had to not look like crap, so duct tape was specifically excluded,
and this is the result.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/wp-content/uploads/2010/04/completed_stand_w_pad_small.jpg&#34; alt=&#34;the result&#34; title=&#34;the result&#34;&gt;&lt;/p&gt;
&lt;p&gt;Now, some of you aren&amp;rsquo;t really the do-it-yourself type, and would like
something a bit more &amp;ldquo;professional&amp;rdquo; looking on your desk. If that sounds
like you, I&amp;rsquo;d recommend you check out this&lt;a href=&#34;http://www.griffintechnology.com/products/a-frame&#34;&gt;very slick $50 iPad stand
from Griffin Technologies&lt;/a&gt;, that
supports both typing and display positions.&lt;/p&gt;
&lt;h3 id=&#34;what-went-into-it&#34;&gt;What went into it&lt;/h3&gt;
&lt;p&gt;1 menu stand $8.99 1 package of 7 3/4&amp;quot; rubber bands $1.00 2 keyrings ( 1
3/4&amp;quot; ) $0.80 (each) 1 mousepad $0.00 (or $4.99 at Staples)&lt;/p&gt;
&lt;h3 id=&#34;image&#34;&gt;&lt;a href=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/04/materials_small.jpg&#34;&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/04/materials_small.jpg&#34; alt=&#34;image&#34; title=&#34;materials_small&#34;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&#34;putting-it-all-together&#34;&gt;Putting it all together&lt;/h3&gt;
&lt;p&gt;When you flip the stand over you&amp;rsquo;ll find it&amp;rsquo;s pretty floppy, but there&amp;rsquo;s
a second layer of plastic folded underneath that could provide
structural support, which is where the keyrings come in. The idea here
is to sandwich the two layers of plastic together into one double-thick
layer. You could use duct-tape but that&amp;rsquo;d be ugly. You could use super
glue, but lucite tends to crack when you apply super-glue, or it did the
last time I tried. I believe that duct-tape would also work quite well,
but even colored duct tape would look a lot tackier, so we decided to go
with keyrings. I suspect that large binder clips would work well too,
just be sure to make the top flat with the top of the stand and take off
the top arm of the clip after you clamp it on.&lt;/p&gt;
&lt;p&gt;When putting on the
keyrings make sure that the break in the ring faces outwards. There are
two reasons for this: you want the full squeezing strength of the
keyring to be covering as much of the plastic as possible, and the break
will scratch the plastic if you try and pull it off (if it&amp;rsquo;s not already
on the outside).&lt;/p&gt;
&lt;p&gt;Next, the top rubber-band. Choose whatever color
strikes your fancy and pull from the front to the back, then cross it in
the back and go over the front again so that the unsightly x is in the
back, then slide it up to the end near the bend.&lt;/p&gt;
&lt;p&gt;Flip your mouse-pad
over so that the fricative rubber bottom faces outwards and slide the
top edge under the rubber band. It&amp;rsquo;s important to do this before you add
the remaining rubber bands.&lt;/p&gt;
&lt;p&gt;Next, take all the remaning rubber-bands and
stretch them wide before sliding over the bottom end. Be careful!
There&amp;rsquo;s a lot of force with all the rubber-bands and you can easily
pinch your fingers against the edge of the lucite if you&amp;rsquo;re not careful.
You won&amp;rsquo;t be able to cross them over, but that&amp;rsquo;s ok because you don&amp;rsquo;t
need to. You want a nice thick pile of them to provide a lip for the
bottom edge of your iPad to rest against. Congratulations, you&amp;rsquo;ve just
completed your iPad stand.
&lt;a href=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/04/completed_stand_small.jpg&#34;&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/04/completed_stand_small.jpg&#34; alt=&#34;image&#34; title=&#34;completed_stand_small&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you want to get fancy try stenciling on some eyes and a nose to go
with those keyring ears, and rubber-band mouth.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Hi-Per Hanger [Review]</title>
      <link>https://weblog.masukomi.org/2010/04/08/hi-per-hanger-review/</link>
      <pubDate>Thu, 08 Apr 2010 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2010/04/08/hi-per-hanger-review/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.blackandgray.com/hiperMain.php%20&#34;&gt;The Hi-Per Hanger from Black And
Grey&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/Xc6saAUJmegnaKhbmaWoafHRlqxSDsWv127wI9denTjdlukcooQMIgpGdEDf/hi-per-hanger.jpg&#34; alt=&#34;image&#34;&gt;
\&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s get this out of the way right off-the-bat. This, is a seventy
dollar hanger. Technically it&amp;rsquo;s $30.95-$72.95 + shipping, and that is a
pretty hard price-tag to swallow for a hanger. But, the real question is
&amp;ldquo;is it worth it?&amp;rdquo; I&amp;rsquo;m asking from a purely practical perspective. The
answer, as far as I&amp;rsquo;m concerned, is a whole hearted YES! If mine were
stolen today I would go to the web site tomorrow and buy another one
without hesitation.&lt;/p&gt;
&lt;p&gt;For me it came down to the fact that standard plastic hangers were
either prone to breakage, or well made but were too skinny vertically to
allow me to feed my pants through with the knee armor, and hangers with
standard clamps to grab the waist on your pants simply aren&amp;rsquo;t up to the
task of holding on to heavy motorcycle pants. Also, normal hangers
aren&amp;rsquo;t wide enough to actually make the shoulders hang on them
correctly. I could put up with the latter, even though it&amp;rsquo;s not good for
the garment, but i needed somewhere to hang my pants, and after spending
a nearly a thousand dollars on a new Jacket and Pants (I like my bones
unbroken and skin attached thank you very much) I decided that I wasn&amp;rsquo;t
going to screw around with hangers that didn&amp;rsquo;t work anymore. So I
crossed my fingers and placed the order for an HP-3 which is the
heavy-duty base hanger with plastic shoulder pieces and two heavy-duty
clamps that can either be used to grab the waist of your pants or one
for each leg. You can get them with more, or fewer, clamps.&lt;/p&gt;
&lt;p&gt;As soon as I pulled it out of the box I knew I&amp;rsquo;d received one bad-ass
hanger. The aluminum hanger at the core is really heavy-duty. I could
hang my full body-weight from this thing no problem. The clamps live up
to all that is implied by the word &amp;ldquo;clamp&amp;rdquo; They hold on hard and require
a non-trivial amount of force to squeeze open. This, is a very good
thing. You won&amp;rsquo;t have to be gentle when grabbing your gear out of the
closet or carrying it across the room because they will not accidentally
let go of your pants. The width of the shoulders on the hanger is
adjustable with a couple thumb-screws, and there are 5 holes you can use to
attach the claps to via some simple thumb-screws.&lt;/p&gt;
&lt;p&gt;With jacket hung, and pants clamped I was convinced I&amp;rsquo;d gotten a good
hanger, but it wasn&amp;rsquo;t until I&amp;rsquo;d picked it up from the hook that I came
to truly appreciate how important having a bad-ass hanger was. You see,
it&amp;rsquo;s not that your gear weighs an exceptional amount (mine is roughly
fifteen pounds) it&amp;rsquo;s that all that weight is focused on one very small
point. On my body the fifteen pounds of jacket, pants, liners, and armor
isn&amp;rsquo;t a big deal, but when you lift it by the hook of the hanger you
realize just how much force your hanger has to withstand in order to do
its job, and it&amp;rsquo;s a lot.&lt;/p&gt;
&lt;p&gt;When you&amp;rsquo;ve been sweating in your jacket all day you&amp;rsquo;ll be really
thankful for how the Hi-Per Hanger&amp;rsquo;s shoulders keep your jacket open and
allow the air to flow in and dry it out. You&amp;rsquo;ll also be happy to know
that they&amp;rsquo;re not warping the shape of your shoulder pads over time.&lt;/p&gt;
&lt;p&gt;There is no question that the Hi-Per Hanger is overkill for a hanger.
But, you can&amp;rsquo;t include it in the same category as other hangers. That&amp;rsquo;s
like comparing an industrial dump-truck and a pick-up truck. Yes,
they&amp;rsquo;ll both transport your crap, but there are some tasks the Pick-up
truck simply isn&amp;rsquo;t appropriate for. Similarly, the Hi-Per hanger is
designed for a specific, task that average hangers simply can&amp;rsquo;t handle
well.&lt;/p&gt;
&lt;p&gt;If you actually care about having good gear you&amp;rsquo;ve probably spent at
least $500 on your suit. Spending another $70 to keep it in good shape
and dry your sweat from it seems like money well spent to me. And just
to be clear; I&amp;rsquo;m still not comfortable with the idea of spending that
much for a hanger, but it isn&amp;rsquo;t really just a hanger. The Hi-Per Hanger
is a specialized tool for for the support and maintenance of the gear
you spent good money on to save your life.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re still not convinced, check out the review on
&lt;a href=&#34;http://www.webbikeworld.com/Reviewed-motorcycle-products/hanger/index.htm&#34;&gt;WebBikeWorld&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://posterous.com&#34;&gt;Posted via email&lt;/a&gt; from &lt;a href=&#34;http://adventure.masukomi.org/hi-per-hanger-review&#34;&gt;masukomi&amp;rsquo;s
adventures&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Macro Micro Checklist</title>
      <link>https://weblog.masukomi.org/2010/03/04/macro-micro-checklist/</link>
      <pubDate>Thu, 04 Mar 2010 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2010/03/04/macro-micro-checklist/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/03/clip_board_task_sheet_example.jpg&#34; alt=&#34;Macro Micro Checklist
Example&#34; title=&#34;Macro Micro Checklist Example&#34;&gt;A
variation on my &lt;a href=&#34;https://weblog.masukomi.org/2010/02/05/three-useful-task-sheets&#34;&gt;Simple Checklist
Sheet&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The Macro Micro Checklist allows you to maintain a list of key
deliverables, fine grained tasks, and a quick calendar of highlights for
the upcoming month.&lt;/p&gt;
&lt;p&gt;In the top left you&amp;rsquo;ve got a list of Key
Deliverables. These are the high-level tasks / projects you&amp;rsquo;ve got on
your plate. They may be personal things like &amp;ldquo;File Taxes&amp;rdquo; or work based
things like &amp;ldquo;Deliver Example.com&amp;rsquo;s new logo&amp;rdquo;. There&amp;rsquo;s a faint dashed box
you can either ignore or make a checkbox out of, and then check off the
deliverable when you&amp;rsquo;ve completed it. If one of them needs to be brought
to someone&amp;rsquo;s attention, needs followup, or whatever, you can just fill
in the exclamation point at the end of the line.&lt;/p&gt;
&lt;p&gt;In the top right we&amp;rsquo;ve
got a circle calendar. Most people are going to be unfamiliar with
these. I&amp;rsquo;d never seen one before I made one, but I doubt I&amp;rsquo;m the first
one to come up with the idea. Each dot (or in this case half-circle) is
a day of the week. The blue triangles give you a visual indicator for
the start of each week (Monday). Saturday and Sunday&amp;rsquo;s circle&amp;rsquo;s are blue
and their sections of the inner ring are grayed out. A full-page Circle
Calendar is WAY more useful than a normal grid calendar for planning
because each day is a further step along the ring. You actually make
forward progress as you cross off days and the farther away a day is on
the circle the farther away it is in time. On a traditional grid
calendar the square for one week from now touches today&amp;rsquo;s square.
Physical proximity has no relationship to temporal proximity. Another
advantage to a Circle Calendar is that it&amp;rsquo;s got a LOT of space for you
to make notes and draw lines to the appropriate day without having your
lines or text go over any other days.&lt;/p&gt;
&lt;p&gt;A smaller Circle Calendar, like
this one, isn&amp;rsquo;t great for detailed planning, but neither is a small grid
calendar. The idea here is to mark out important dates in the upcoming
month and add any related high-level notes. As you cross out days you&amp;rsquo;ll
be able to see if there is a lot of distance (time) to the next
deliverable or not, and looking to the left you&amp;rsquo;ll see how many
high-level deliverables still need to get done in the time remaining.
Everyone&amp;rsquo;s going to use the Circle Calendar slightly differently, but
that flexibility is one of the things that makes them great. When I use
them I generally write in the date on each Monday&amp;rsquo;s node, as well as the
date of each major event (like a code release). Then, if any of the Key
Deliverables in the top left need to be completed by a particular date,
I&amp;rsquo;ll just write its number in the center of the circle and draw an arrow
to the day it&amp;rsquo;s due. As each day goes by I&amp;rsquo;ll put an X in it&amp;rsquo;s node to
cross it out. Some people might fill in the missing half of the circle.
Whatever works for you and gives you a visual indication of which days
have already gone by.&lt;/p&gt;
&lt;p&gt;The bottom of the page is just like the Simple
Checklist.&lt;/p&gt;
&lt;p&gt;See &lt;a href=&#34;https://weblog.masukomi.org/2010/02/05/three-useful-task-sheets&#34;&gt;it&amp;rsquo;s
post&lt;/a&gt;
for details on how to use that and what all the boxes and exclamation
points are for.
&lt;a href=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/03/clipboard_checklist_screenshot.jpg&#34;&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/03/clipboard_checklist_screenshot.jpg&#34; alt=&#34;image&#34; title=&#34;Macro Micro Checklist Screenshot&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;downloads&#34;&gt;Downloads&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Macro Micro Checklist:
&lt;a href=&#34;http://www.listfulthinking.com/paper_edition/macro_micro_checklist_1_0.graffle&#34;&gt;Omnigraffle&lt;/a&gt;,
&lt;a href=&#34;http://www.listfulthinking.com/paper_edition/macro_micro_checklist_1_0.png&#34;&gt;png&lt;/a&gt;,
&lt;a href=&#34;http://www.listfulthinking.com/paper_edition/macro_micro_checklist_1_0.tiff&#34;&gt;tiff&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Stand-alone Circle Calendar:
&lt;a href=&#34;http://www.listfulthinking.com/paper_edition/circle_calendar.graffle&#34;&gt;Omnigraffle&lt;/a&gt;,
&lt;a href=&#34;http://www.listfulthinking.com/paper_edition/circle_calendar.png&#34;&gt;png&lt;/a&gt;,
&lt;a href=&#34;http://www.listfulthinking.com/paper_edition/circle_calendar.tiff&#34;&gt;tiff&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Three Useful Task Sheets</title>
      <link>https://weblog.masukomi.org/2010/02/05/three-useful-task-sheets/</link>
      <pubDate>Fri, 05 Feb 2010 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2010/02/05/three-useful-task-sheets/</guid>
      <description>&lt;p&gt;Almost five years ago I wrote a self organizing todo-list application.
It was ugly, but worked really well. Unfortunately for me, I really
prefer writing my todo lists out on paper. I like the simplicity of it,
ideas just flow out through my pen. I can make notes and draw little
arrows connecting things. And, I can make really satisfying check-marks
in boxes when I&amp;rsquo;ve finished something.&lt;/p&gt;
&lt;p&gt;Paper&amp;rsquo;s just the right medium for
me, and I know I&amp;rsquo;m not the only one. So, I created a paper version of
that self organizing todo list, and every few months I find some little
thing I can do to improve it. Now I&amp;rsquo;ve got three different forms which
I&amp;rsquo;ll cover below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A Simple Checklist Sheet
(&lt;a href=&#34;http://listfulthinking.com/paper_edition/checklist_v1.2.1.graffle&#34;&gt;OmniGraffle&lt;/a&gt;,
&lt;a href=&#34;http://listfulthinking.com/paper_edition/checklist_v1_2_1.png&#34;&gt;png&lt;/a&gt;,
&lt;a href=&#34;http://listfulthinking.com/paper_edition/checklist_v1_2_1.tiff&#34;&gt;tiff&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;A Self-Prioritizing And Time-Tracking Todo list
(&lt;a href=&#34;http://listfulthinking.com/paper_edition/task_sheet_v2.4.graffle&#34;&gt;OmniGraffle&lt;/a&gt;,
&lt;a href=&#34;http://listfulthinking.com/paper_edition/task_sheet_v2_4.png&#34;&gt;png&lt;/a&gt;,
&lt;a href=&#34;http://listfulthinking.com/paper_edition/task_sheet_v2_4.tiff&#34;&gt;tiff&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;A Manager&amp;rsquo;s Planning Sheet
(&lt;a href=&#34;http://listfulthinking.com/paper_edition/task_sheet_v2.3_planning.graffle&#34;&gt;OmniGraffle&lt;/a&gt;,
&lt;a href=&#34;http://listfulthinking.com/paper_edition/task_sheet_v2_3_planning.png&#34;&gt;png&lt;/a&gt;,
&lt;a href=&#34;http://listfulthinking.com/paper_edition/task_sheet_v2_3_planning.tiff&#34;&gt;tiff&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(Why no PDF? Because the font placement is critical on some of these and
Windows screws it up.)&lt;/p&gt;
&lt;p&gt;If you find these types of forms useful be sure
to check out &lt;a href=&#34;http://davidseah.com/blog/the-printable-ceo-series/&#34;&gt;David Seah&amp;rsquo;s excellent Printable CEO
series&lt;/a&gt;, which
inspired these so many years ago. &lt;em&gt;[Update] There&amp;rsquo;s now a fourth sheet
to check out too. My&lt;/em&gt;&lt;a href=&#34;https://weblog.masukomi.org/2010/03/04/macro-micro-checklist&#34;&gt;&lt;em&gt;Macro Micro
Checklist&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;a-simple-checklist-sheet&#34;&gt;A Simple Checklist Sheet&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/02/checklist_v1_2_1_screenshot_2.jpg&#34;&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/02/checklist_v1_2_1_screenshot_2.jpg&#34; alt=&#34;Checklist
Screenshot&#34; title=&#34;Checklist Screenshot&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This sheet is simple and flexible enough to be useful to just about
everyone.&lt;/p&gt;
&lt;p&gt;The header has a place for the project name or some other context that
connects the tasks you are working on: &amp;ldquo;Project X&amp;rdquo;, &amp;ldquo;Homework&amp;rdquo;, &amp;ldquo;Enemies
of the State&amp;rdquo;&amp;hellip; stuff like that. And, if you&amp;rsquo;re the type who keeps your
tasks lists around for a while there&amp;rsquo;s a place for the beginning and
ending date of the project, or maybe just the dates you started and
finished the tasks on the page; whatever works best for you. I usually
use it to indicate what week the tasks were for. This can be useful if
you need to go back and see what you did last week for a status report.&lt;/p&gt;
&lt;p&gt;After the header, the first thing you might notice is that everything
else seems a bit faint, especially when you print it out. This is on
purpose. As you can see in the example here, the lightly dashed boxes at
the start of each line are there just to act as guides for your own
check-boxes and practically disappear once you actually start writing.
The three boxes allow for a hierarchy of tasks three levels deep, and
there&amp;rsquo;s no reason you couldn&amp;rsquo;t easily draw boxes farther in if you
really need it, but in practice I&amp;rsquo;ve never had the need.&lt;/p&gt;
&lt;p&gt;At the right
end of each line there are three more items in an equally faint gray: a
place for a due date, a box to record the total hours spent working on
it, and an exclamation point. The first two are pretty self explanatory,
but they&amp;rsquo;re in a similarly faint gray so that you can just write over
them if you need the space and don&amp;rsquo;t care about recording that info on
the current line. I do this all the time and I&amp;rsquo;m happy to report the
gray is light enough to not get in the way there either. The exclamation
point is not so obvious. It&amp;rsquo;s for calling out items that you need to
come back to later for whatever reason. In my case, I use it to mark
items that I&amp;rsquo;ll need to discuss at the postmortem meeting we&amp;rsquo;re having
the end of each release.&lt;/p&gt;
&lt;h3 id=&#34;a-self-prioritizing--time-tracking-todo-list&#34;&gt;A Self-Prioritizing &amp;amp; Time Tracking Todo List&lt;/h3&gt;
&lt;h3 id=&#34;task-sheet&#34;&gt;[![Task Sheet&lt;/h3&gt;
&lt;p&gt;Screenshot](&lt;a href=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/02/task_sheet_v2_4_screenshot.jpg&#34;&gt;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/02/task_sheet_v2_4_screenshot.jpg&lt;/a&gt; &amp;ldquo;Task Sheet Screenshot&amp;rdquo;)](&lt;a href=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/02/task_sheet_v2_4_screenshot.jpg&#34;&gt;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/02/task_sheet_v2_4_screenshot.jpg&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;This one consolidates a lot of information in every line and is going to
require some explanation. It is most useful for people who want a system
to help prioritize tasksand want/need to keep track of the time they&amp;rsquo;ve
spent working on them. The grid at the left of each row has four columns
&amp;ldquo;i&amp;rdquo;, &amp;ldquo;e&amp;rdquo;, &amp;ldquo;t&amp;rdquo;, &amp;ldquo;c&amp;rdquo; for &amp;ldquo;Internal Importance&amp;rdquo;, &amp;ldquo;External Importance&amp;rdquo;,
&amp;ldquo;Technical Feasibility&amp;rdquo; and &amp;ldquo;Creative Feasibility&amp;rdquo;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Internal Importance: how badly do you, or your group, want this task
completed. The more you want it the more you fill up the bar.&lt;/li&gt;
&lt;li&gt;External Importance: how badly does your client, or customer, want
this task completed. The more they want it the more you fill up the
bar.&lt;/li&gt;
&lt;li&gt;Technical Feasibility: how easy will it be to actually do it. The
easier it will be to do, the more you fill up the bar.&lt;/li&gt;
&lt;li&gt;Creative Feasibility: how easy will it be to figure out what you
need to do to complete this task. The easier it is to figure out the
more you fill up the bar.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;some-examples&#34;&gt;Some examples:&lt;/h3&gt;
&lt;p&gt;Creating a logo is creatively a pain in the butt (short
&amp;ldquo;c&amp;rdquo;), but technically quite easy (full &amp;ldquo;t&amp;rdquo;). If it&amp;rsquo;s for a client it&amp;rsquo;s
something externally important (full, &amp;ldquo;e&amp;rdquo;) but typically internally not
very important (empty &amp;ldquo;i&amp;rdquo;). Creating a logo for your own company would
be internally very important but externally not important at all.&lt;/p&gt;
&lt;p&gt;Getting a logo design from another department is technically trivial
(full &amp;ldquo;t&amp;rdquo;), creatively trivial (full &amp;ldquo;t&amp;rdquo;), and internally important
important to you (mostly full &amp;ldquo;i&amp;rdquo;), but unimportant externally (empty
&amp;ldquo;e&amp;rdquo;) because no-one cares that you got it from another department, they
just care that you have it.&lt;/p&gt;
&lt;p&gt;How much you put in each column is a
judgment call, just fill in however much feels right. Once you&amp;rsquo;ve got
them filled in you can just scan down the pending tasks for the one
that&amp;rsquo;s darkest. Items that are quick and easy to get out of the way will
have their right halves mostly filled in. Items that are important to
get done will have their left halves filled in. Items that are quick,
easy, and important will be almost entirely filled in. So, really you&amp;rsquo;ve
got three ways to look at it, and none of them require much thought. The
thing you &lt;em&gt;should&lt;/em&gt; do first is the one that&amp;rsquo;s got the most black. But if
you&amp;rsquo;re just looking for something you can whip out quickly when you
don&amp;rsquo;t have much time to work, you can just look for something with a
dark right side. Some people like to count up the number of squares
they&amp;rsquo;ve filled in and then do the task with the biggest number.&lt;/p&gt;
&lt;p&gt;Some tasks are related, or dependent upon other tasks. That&amp;rsquo;s where the
little circles to the left of the grid come in to play. In the example
you can see that a couple of the items have their circles drawn over and
a line drawn between them. The parent task is typically the top one and
the line between them shows you that they&amp;rsquo;re connected&amp;hellip; literally.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ve got two lines for each task, as well as a notes space to the
right for details you think up later and a big check-box you can fill in
when you&amp;rsquo;ve finished the task.&lt;/p&gt;
&lt;p&gt;Beneath the text lines there&amp;rsquo;s a blue
line filled with lots of little boxes. These are for tracking how much
time you spent working on each task and what day you worked on it.
You&amp;rsquo;ll note that there are only four boxes per day (actually three boxes
and a circle). This is for two reasons. The first being that we rarely
have more than four hours a day to devote to any one task and the second
being that if your tasks are taking more than four hours each you&amp;rsquo;ve
probably not broken them down to sufficiently fine-grained level. The
last box is a circle simply to help visually separate each day&amp;rsquo;s boxes.
There are seven days worth of boxes but you&amp;rsquo;ll note that the last two
(Saturday and Sunday) have faint edges. This is because you need some
time off. Go have a life and endeavor to never need fill these in. It&amp;rsquo;s
a little hard to see in the picture but in the example the first task
was worked on for two and a half hours on Wednesday.&lt;/p&gt;
&lt;p&gt;After the boxes
you&amp;rsquo;ll see a &amp;ldquo;due / / &amp;quot; section were you can note a due date if the task
has one.&lt;/p&gt;
&lt;h3 id=&#34;a-managers-planning-sheet&#34;&gt;A Managers Planning Sheet&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/02/task_sheet_v2_3_planning_screenshot.jpg&#34;&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/02/task_sheet_v2_3_planning_screenshot.jpg&#34; alt=&#34;image&#34; title=&#34;task_sheet_v2_3_planning_screenshot&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Next up we&amp;rsquo;ve got a planning version for of that last one for
manager-types. The idea is that managers will be assigning tasks at a
much higher level, and the people actually working on them will divide
them up into &amp;ldquo;bite-sized&amp;rdquo; pieces.&lt;/p&gt;
&lt;p&gt;The header remains the same, but the
prioritizing aspect of each task has gone away and been replaced with a
due date. The hours are no longer tied to days since many tasks, at this
level, will span days and are purely there for estimation purposes. You
can fill in the hours boxes like a big horizontal thermometer.
Alternately you can use it to estimate days. When the task is completed
you can go back and fill in the &amp;ldquo;total&amp;rdquo; at the end to see how your
estimates stood up against the time it actually took.&lt;/p&gt;
&lt;p&gt;The circles to the
side of each task are exactly the same as in the Self-Prioritizing
version, and are for connecting related tasks.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>On creating my own language</title>
      <link>https://weblog.masukomi.org/2010/01/22/on-creating-my-own-language/</link>
      <pubDate>Fri, 22 Jan 2010 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2010/01/22/on-creating-my-own-language/</guid>
      <description>&lt;p&gt;Some of you may remember that I was working on creating my own language.
I wrote a creation myth in it a little over a year ago, and with the
exception of a few months, I&amp;rsquo;ve been trying to make daily diary entries
in it as a way of not only recording my life but practicing my language.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t create this for any grandiose reason. I simply wanted a
language that would express the way I think. I wanted to play with
language itself and learn more about it. And, I wanted to learn a new
language. But I&amp;rsquo;m fairly honest with myself about what I can, and will,
realistically accomplish. I could learn a natural language no problem,
except for the lack of anyone to speak it with. More importantly,
natural languages are external things. Someone else created them. The
rules are someone else&amp;rsquo;s, and to speak it correctly you have to learn,
and abide by those rules. But, they&amp;rsquo;re all just abstract foreign things.
They&amp;rsquo;re not anything you&amp;rsquo;ve grown up with (at least not the languages
I&amp;rsquo;m interested in), or anything that conforms to your brain&amp;rsquo;s view of
the world. And without someone else to speak it with, it&amp;rsquo;s a lot like
rote memorization. You memorize their words, their rules, and just
accept them. And free writing in a natural language before you really
understand the rules can lead to some very bad habits based on
misunderstandings, and the words you have to look up seem fairly random.
It doesn&amp;rsquo;t make a lot of sense why a word sounds the way it does, or why
it means such different things&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;. Reading from books isn&amp;rsquo;t very doable
either until you&amp;rsquo;ve built up a fairly decent vocabulary.&lt;/p&gt;
&lt;p&gt;But creating
your own language&amp;hellip; that&amp;rsquo;s something else entirely. You aren&amp;rsquo;t
memorizing someone else&amp;rsquo;s arbitrary rules. You&amp;rsquo;re creating constructs
that rules flow out of. Words can sound however you want. Take &amp;ldquo;water&amp;rdquo;
for example. To me English&amp;rsquo;s &amp;ldquo;water&amp;rdquo; doesn&amp;rsquo;t sound like anything I
associate with the stuff of rain, rivers, and oceans. &amp;ldquo;Water&amp;rdquo; isn&amp;rsquo;t
flowing, or bubbly. It doesn&amp;rsquo;t ripple or wave. But, lelea (lay lay ah),
*that* sounds like water to me. So, that&amp;rsquo;s what water is. But, being
me, I didn&amp;rsquo;t just use the rule&amp;rsquo;s I&amp;rsquo;d grow up with. I&amp;rsquo;d just end up with
a cypher of English if I had, and I wanted to learn. So, I gave myself a
few small restrictions which would have a significant impact on what I
created. Sentences would have a Verb Subject Object order, there
wouldn&amp;rsquo;t be a verb &amp;ldquo;to be&amp;rdquo;, and the concepts of Yin and Yang would be an
integral part of word creation: pushing and pulling, male and female. To
me the world is all about the push and pull of energy, and I wanted to
help myself to see it in those terms. I also wanted it to sound similar
to Hawai&amp;rsquo;ian and other languages that evolved from gift cultures, with
their flowing tones. That evolved into a requirement that all consonants
be separated by a vowel and never come at the end of a word. Somehow I
ended up with a glottal stop like Hawaiian too, although that wasn&amp;rsquo;t
intentional.&lt;/p&gt;
&lt;p&gt;With those few tiny restrictions I&amp;rsquo;ve been building
something that&amp;rsquo;s seriously challenged my mind and forced me to question
so much about how English works, and what I really mean what I speak.
Getting rid of the verb &amp;ldquo;to be&amp;rdquo; has been the most challenging. It is so
ingrained into English that learning to speak without it has really
taken work. But, it&amp;rsquo;s been so worth it.&lt;/p&gt;
&lt;p&gt;In olo ( the name of the
language ) I&amp;rsquo;ve found a real sense of peace. I actively want to write in
it at the end of the day; not to keep up my practice, but because the
act of using it is so relaxing. If I go to bed without having written I
feel like I missed out on something special, like a relaxing beer or
glass of wine at the end of the day is for many.&lt;/p&gt;
&lt;p&gt;I think a part of that
may be that I keep my journals in a Moleskine, and writing on paper, in
a different orthography is so removed from anything I do during the day.
I believe that the different orthography is a huge factor. The act of
drawing those foreign characters really does seem to affect my mind. I&amp;rsquo;m
enjoying watching how those characters are evolving as my speed and
comfort level increase. It&amp;rsquo;s like watching a natural language&amp;rsquo;s
evolution in fast forward, because there&amp;rsquo;s no-one to make me stick with
the old way. One of my characters started out looking like a &amp;ldquo;u&amp;rdquo; with a
straight bar closing the top, but now the bar has remained and the &amp;ldquo;u&amp;rdquo;
part has turned into a sort of attached curlicue. Writing in not only a
different language, but a different orthography gives me an even greater
feeling that this is *mine*&amp;hellip; It&amp;rsquo;s something I can own as thoroughly
as my own thoughts.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s also nice to know that in this language I can
speak without reservation. If we spoke honestly with each other we&amp;rsquo;d
hurt a lot of feelings. And, while most people do feel comfortable
speaking honestly in their diaries, there&amp;rsquo;s always that lingering worry
about what would happen if someone else came across it. But with Olo I
don&amp;rsquo;t have that worry, at all. I do plan on eventually making my
language reference public, but even if I did it would take enough
tedious work to figure out what my diary said, that no-one would be
likely to actually bother to figure out more than a few lines.&lt;/p&gt;
&lt;p&gt;Because the vocabulary is still evolving, writing any sentence forces me to
pause and question what I really mean, because so often we say things in
our native tongue that aren&amp;rsquo;t really what we mean. We use idioms
constantly; far more than most of us realize, but I don&amp;rsquo;t have that
luxury. I&amp;rsquo;ve only three to work with in Olo (so far). We&amp;rsquo;re frequently
talking around our meaning, because there&amp;rsquo;s no way to accurately express
our true intent. But with your own language there&amp;rsquo;s always that option.
It&amp;rsquo;s *your* language, and if there isn&amp;rsquo;t a word to express a concept
you can create one, and you&amp;rsquo;re free from unintended connotations and
implications. In English, for example, I could talk about &amp;ldquo;toil&amp;rdquo; but
there are lots of negative connotations there. We don&amp;rsquo;t really have a
word for work that you do that is simply undesirable, like washing
dishes. You don&amp;rsquo;t really &amp;ldquo;toil&amp;rdquo; at washing the dishes, and it&amp;rsquo;s not
really a hardship. It&amp;rsquo;s just undesirable work. A big part of most
people&amp;rsquo;s lives is filled with undesirable work. In Olo, there&amp;rsquo;s a word
that&amp;rsquo;s similar to &amp;ldquo;unpleasant&amp;rdquo; but without the negative connotations.
It&amp;rsquo;s simply &amp;ldquo;not pleasant&amp;rdquo;. Combine that with the word for work and you
can speak about work that is undesirable but not bad: pa&amp;rsquo;u hana.&lt;/p&gt;
&lt;p&gt;If you need the ability to discuss something in a way your native tongue
doesn&amp;rsquo;t adequately allow for, you can devise a way of doing it. As time
goes on the rules your language accretes will make this a bit more
difficult, but you&amp;rsquo;re unlikely to live long enough to make a language
even a quarter as complex as English, unless you go out of your way to
add complexity. But, if you, like me, are creating a language to express
the way you see the world, or want to see the world, you&amp;rsquo;ll find things
work out quite nicely. I&amp;rsquo;m still rather slow, and as I write more I am
constantly having to coin new words which sometimes take a while to get
memorize, since many of them, like &amp;ldquo;doubt&amp;rdquo; don&amp;rsquo;t come up very often. New
affixes arise, and force me to go back and alter a few existing words to
conform to the new rules from time to time. But, the process is
wonderful, and educational in so many ways. I hope that one day I may
meet someone special and she&amp;rsquo;ll be wiling to learn it with me. I think
the intimacy of a private language shared only between you and your
lover would be an incredible thing. I may never meet someone like that.
But, even if I don&amp;rsquo;t, I&amp;rsquo;m learning so much, about language, about
myself, and about the world around me.&lt;/p&gt;
&lt;p&gt;So what&amp;rsquo;s the point? Why have I
written this? I think the point was to speak about language creation, to
give a little glimpse of what it can be, and what it is for me, to let
some people know that it&amp;rsquo;s a legitimate option, and let others know that
they are not alone in their desire to create a language. There are
thousands of language creators around the world and it&amp;rsquo;s something with
a long historical tradition. It&amp;rsquo;s certainly not for everyone, but what
is? Conlangs have been brought into the public&amp;rsquo;s eye again with Na&amp;rsquo;vi,
and learning it, like many conlangs, will provide you with a wonderful
perspective on your native language. You&amp;rsquo;re also likely to find a small
sense of community because it&amp;rsquo;s like joining an exclusive club for
speakers only. But, creating one can give you a means of self expression
you&amp;rsquo;ve probably never imagined. So many of us think with words of our
native tongue, and every language has some concepts, and views of the
world that it simply can&amp;rsquo;t express well, especially when you consider
how tightly bound our language and culture tend to be.&lt;/p&gt;
&lt;p&gt;Language creation is frequently a solitary act, but it can be a very rewarding one. Even
if no-one else learns your language, there are many of us who will enjoy
getting glimpses of it, and happily help each other with their creation.
If nothing else the Conlang mailing list has proved an incredible
resource for questioning English and learning about options that other
languages present.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/01/olo_notes.jpg&#34;&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2010/01/olo_notes.jpg&#34; alt=&#34;3 post-it notes with olo example and translation
on them&#34; title=&#34;finding joy in olo&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Hawaiian&amp;rsquo;s lāhai (just a random example) means: to poise aloft ( as
a kite ), to leap, or a short wing fence to guide cattle to a corral.
To someone who didn&amp;rsquo;t grow up with the language it seems so arbitrary,
and we&amp;rsquo;ve no way to know if it is, or we&amp;rsquo;re just missing something
because we haven&amp;rsquo;t grow up with it or its culture.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Respro Foggy [first impressions]</title>
      <link>https://weblog.masukomi.org/2010/01/13/respro-foggy-first-impressions/</link>
      <pubDate>Thu, 14 Jan 2010 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2010/01/13/respro-foggy-first-impressions/</guid>
      <description>&lt;p&gt;In &lt;a href=&#34;http://www.webbikeworld.com/r2/motorcycle-helmet/hjc/is-16/&#34;&gt;WebBikeWorld&amp;rsquo;s review of the HJC IS-16
helmet&lt;/a&gt;
they pondered why there was Velcro on the inside of the chin-bar. A
commenter suggested that maybe it was for a &lt;a href=&#34;http://www.webbikeworld.com/r2/motorcycle-helmet/hjc/is-16/&#34;&gt;Respro
Foggy&lt;/a&gt;.
Curious as to what one was I Googled their site and was amazed at the
simple brilliance of it. There is nothing fancy here. It&amp;rsquo;s just one of
those head-slappingly obvious ideas that makes you wonder why no-one
else has been making these.&lt;/p&gt;
&lt;p&gt;##Summary:&lt;/p&gt;
&lt;p&gt;Good, cheap, anti-fog device that really works.&lt;/p&gt;
&lt;p&gt;If you live in New England or anywhere else it gets chilly you&amp;rsquo;re more
than familiar with the problem of fogged visors. &lt;a href=&#34;http://www.webbikeworld.com/anti-fog-visor/&#34;&gt;A pinlock
system&lt;/a&gt; is great, but it
requires getting a fancy visor which isn&amp;rsquo;t available for most helmets,
or a do-it-yourself kit that involves drilling a couple holes into your
visor for the pins. Not fun and particularly sucky if you&amp;rsquo;re like me,
and find yourself either getting a big scratch on your visor, or having
enough bugs and dirt and dust pinging off of your visor that the
micro-scratches built up and you end up needing to replace it every
year. Your other alternatives are &lt;a href=&#34;http://www.webbikeworld.com/r2/fogtech/&#34;&gt;Fogtech anti-fog
liquid&lt;/a&gt;, &lt;a href=&#34;http://www.webbikeworld.com/r2/motorcycle-helmet-visor-anti-fog/&#34;&gt;Cat Crap anti-fog
wax&lt;/a&gt;,
pre-treated visors (which may or may not be available for your helmet),
electrically heated visors (probably not available), and now, the Foggy.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/twdLyXqet7s2fksojYj6br0FM86z8lS7Z4evOXt5wVV0xDlfADbSD148t4CH/foggy_worn.jpg&#34; alt=&#34;image&#34;&gt;&lt;/p&gt;
&lt;p&gt;Personally I think the idea of having to treat my visor with liquid, or
wax and then remembering not to touch the inside is lame, and annoying
because how much would it suck to pull up to your first stop-light and
realize that you needed to redo the coating? Electric would work but
that&amp;rsquo;s another cable to run and more power to suck from a bike that
probably wasn&amp;rsquo;t designed to have the spare juice to run all your
electric heating widgets.&lt;/p&gt;
&lt;p&gt;But the Foggy&amp;hellip; That&amp;rsquo;s an idea I can get behind. Stick it in your
helmet in the fall, take it out as summer starts rolling around. The
end. The principle is simple. All the hot moist air coming out of your
nose and mouth gets redirected away from your visor, and thus never has
a chance to fog it up. The end.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/E2DztgvfcpqhvScYULdxVcyFAdPB03Qt9dExqmW1zEe5MAj4Qiev16sm5r0u/foggy.png&#34; alt=&#34;image&#34;&gt;&lt;/p&gt;
&lt;p&gt;It comes in a variety of colors and is held in with hook-and-loop
(Velcro(TM)) that attaches to your chin-bar and your cheek pads. It also
has a plastic arch that goes over the nose to keep it fitted to your
face. There&amp;rsquo;s just one little catch. While it has 3 male hook-and-loop
pads it only comes with an matching adhesive-backed female hook-and-loop
pad for the chin. There&amp;rsquo;s a sticker on the back of that that says &amp;ldquo;the
side pieces of the Foggy(R) mask should be sandwiched between the helmet
cheek pads and the chin strap.&amp;rdquo; Sounds workable, except for the fact
that the side pads come across your face at about the same level as your
cheekbones which is slightly above where the chin straps emerge from the
padding on most full-faced motorcycle helmets. In other words, following
the instructions is essentially impossible. Fortunately I noticed the
&amp;ldquo;Approved for&amp;hellip;&amp;rdquo; list of helmets on the package and I happened to own
one of the brands listed (HJC) so, I set down my Scorpion, picked up the
HJC and said &amp;ldquo;Oh hey, there&amp;rsquo;s Velcro on the chin-bar!&amp;rdquo; The side pieces
still couldn&amp;rsquo;t fit under the chin straps &lt;em&gt;but&lt;/em&gt; it turns out that the
fabric that HJC uses is fuzzy enough that the hook-and-loop on the Foggy
can attach to it. &amp;ldquo;How cool.&amp;rdquo; It&amp;rsquo;s not an incredible attachment on the
sides, but I&amp;rsquo;m not worried about it falling out, especially with the
real hook-and-loop in the chin-bar. The Velcro on the Foggy&amp;rsquo;s side
pieces doesn&amp;rsquo;t even remotely want to stick to the lining of my Scorpion.&lt;/p&gt;
&lt;p&gt;So, I stuck it in, put on the helmet and started adjusting it to make a
good fit across my nose and cheeks. Now, before we go any farther I
should point out that I&amp;rsquo;ve got a typically skinny British nose. It&amp;rsquo;s not
teeny but it&amp;rsquo;s by no means large. A fairly average white-person nose.
But the plastic bridge on the Foggy is is skinnier than my nose. I
assume the idea is that it should gently clamp on to it to keep moist
air from escaping up beside your nose. The problem is that if I put it
up on the bony bridge of my nose it squeezes itself up and off a bit. If
I put it below the bony bridge then it&amp;rsquo;s squeezing my nostrils, but it
seems to be adjustable. So, before you insert it gently spread the arms
apart and hold them there until you have a slightly wider bridge. It
took a couple minutes but I eventually I found that It would sit
comfortably just below the bony bridge of my nose.&lt;/p&gt;
&lt;p&gt;Once I&amp;rsquo;d stuck it in the helmet and adjusted its placement to make a
good seal on my face. I stuck my helmet outside in the 16 deg. F weather
to chill for a bit. The bikes are not in riding shape this winter, but I
wanted to give it a decent test. I went out, put on the helmet, inserted
my glasses so I could actually see anything, and started breathing.
And&amp;hellip; nothing happened. So I breathed some more. Nothing happened. So,
I breathed some more&amp;hellip;. I breathed big heavy breaths out my nose. I
breathed big heavy breaths out my mouth. Eventually, I noticed that if I
looked closely the top half of my visor was &lt;em&gt;slightly&lt;/em&gt; foggy when I was
breathing out of my mouth. I started paying more attention and noticed
that I could feel some of the air from my mouth escaping up between the
foggy and my face, but only barely. And I&amp;rsquo;m sure that if I adjusted it I
could get rid of most of that.&lt;/p&gt;
&lt;p&gt;But, maybe it wasn&amp;rsquo;t the Foggy. Maybe it was a flawed test. I took off
the helmet. I took out the foggy. I put the helmet back on. I put my
glasses back on. I breathed in. I breathed out through my mouth, and was
suddenly blind. My glasses were totally opaque with fog. I lowered my
glasses, closed the visor again, and yup, it was nearly opaque with fog.
As I was standing still with no wind neither really felt like
de-fogging, but eventually they did. And yup, they fogged up when I
breathed through my nose too. Not nearly as badly, but enough to
remember why I bought the foggy in the first place, and enough to remind
me that it really sucks to have to breath exclusively through your nose
while riding.&lt;/p&gt;
&lt;h2 id=&#34;so-would-i-recommend-the-foggy&#34;&gt;So, would I recommend the Foggy?&lt;/h2&gt;
&lt;p&gt;Hell yes. But, unless you have one of the Approved Helmets listed below
you may need to go to your local sewing store and buy a little bit of
adhesive backed Velcro for the cheek pads. They&amp;rsquo;re £13.99 plus shipping
from Respro, which ends up being roughly the same price you&amp;rsquo;d pay from
KneeDraggers, except the money&amp;rsquo;s going straight to the manufacturer who
has a pretty cool line of products, and, I think, deserves to be
supported. Of course, it&amp;rsquo;ll take a wee bit longer to get to you from the
UK. On the other hand, KneeDraggers.com said &amp;ldquo;Distributor does not
provide live stock data&amp;rdquo; and &amp;ldquo;This item usually ships in 1-3 days&amp;rdquo; which
usually translates to &amp;ldquo;we think it&amp;rsquo;ll go out soon but we may not
actually have any&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Overall I give the Foggy a 4 out of 5. It&amp;rsquo;s great but not absolutely
perfect, and I was pretty irked by Respro leaving out the matching
velcro for the cheek pads. That was just cheap corner cutting that will
leave the product effectively unusable in many helmets without you
running to the store to buy more velcro.&lt;/p&gt;
&lt;p&gt;The foggy is &amp;ldquo;Approved for&amp;rdquo; Shoei, Arai, Dainese, Shark, FM, AGV, Bell,
OGK, Roof, and HJC helmets.&lt;/p&gt;
&lt;h2 id=&#34;over-20000-miles--14-countries-later&#34;&gt;Over 20,000 miles &amp;amp; 14 Countries later&lt;/h2&gt;
&lt;p&gt;Since writing this review we &lt;a href=&#34;http://www.corporaterunaways.com/about/the-trip/&#34;&gt;traveled from Boston to the Southern tip
of South America&lt;/a&gt;.
Hot, cold, humid, dry, you name it we&amp;rsquo;ve ridden through it and the Foggy
held up exceptionally well for me. Dachary regularly had trouble getting
it positioned correctly, and while I never had problems with it needing
to be re-adjusted once inserted she frequently did. I still think it&amp;rsquo;s
a fantastic device, and even though it frustrates Dachary sometimes,
we haven&amp;rsquo;t found anything better.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>On learning Na&#39;vi (or any &#34;fictional&#34; language)</title>
      <link>https://weblog.masukomi.org/2010/01/06/on-learning-navi-or-any-fictional-language/</link>
      <pubDate>Thu, 07 Jan 2010 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2010/01/06/on-learning-navi-or-any-fictional-language/</guid>
      <description>&lt;p&gt;There are a number of people out there who have expressed an interest in
learning Na&amp;rsquo;vi (the language spoken by the Omatikaya in Avatar ) and are
getting verbally shat upon by the communities they dare to mention this
in. And, I can understand the knee-jerk reaction that it&amp;rsquo;s silly to
learn a language from a semi-random piece of popular fiction. But, I can
also think beyond that.&lt;/p&gt;
&lt;p&gt;Learning a language, &lt;em&gt;any&lt;/em&gt; language, is a
remarkable thing, especially in American society, and if you think about
it, there is nothing more or less valid about a language that was
created for a movie. Does it really matter how a language came to be?
The fact is that it is a legitimate and speakable language. Koreans
write in &lt;a href=&#34;http://en.wikipedia.org/wiki/Hangul&#34;&gt;Hangul&lt;/a&gt;, a writing system
that Sejong the Great made up from scratch less than 600 years ago. They
didn&amp;rsquo;t need a writing system, they were getting by with Chinese
characters. It just so happens that the Korean people seemed to agree
they deserved their own writing system, so they switched, but it was no
more a &amp;ldquo;real&amp;rdquo; writing system than any of the ones Tolkien created for
his languages. There are two million
&lt;a href=&#34;http://en.wikipedia.org/wiki/Esperanto&#34;&gt;Esperanto&lt;/a&gt; speakers, and maybe
ten million who have studied it. It&amp;rsquo;s a conlang (constructed language)
just like Elvish and Na&amp;rsquo;vi, the only difference being that it was
created to bring world peace through improved communication instead of
just being created for the sheer love of language.&lt;/p&gt;
&lt;p&gt;So, should Korean&amp;rsquo;s
stop using Hangul because some guy made it up? Should Esperantists throw
in the towel? What about Esperantists who learned it as their first
language? Esperanto, the Hangul writing system, Na&amp;rsquo;vi, and Elvish are
all &amp;ldquo;fictional&amp;rdquo;. None of them existed until someone got it in their head
to go create it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;this wouldn&amp;rsquo;t have been such a remarkable case from the perspective
of time - as you already have entire regions of internet clogged with
Tolkienfags who struggle to master his own fictional languages despite
being unable to use english properly. - &lt;em&gt;Random Ass-Hole&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;m not even going to bother pointing out the grammatical errors in that
statement, but the sentiment is not uncommon. The logic however, is
horribly flawed. Our native tongues are things &lt;a href=&#34;http://en.wikipedia.org/wiki/Linguistic_relativity&#34;&gt;so deeply ingrained in
our thinking&lt;/a&gt; that
it isn&amp;rsquo;t possible to step outside of them and analyze them without first
learning something else. Think about it. How can you possibly analyze
the limitations of a language without bias when your tool for analysis
is the same language which is, of course, bounded by the same
limitations and biases?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Seriously? Go learn an actual language, not something from a movie. -
&lt;em&gt;Ignorant Jerk&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ignoring the fact that Na&amp;rsquo;vi is, in a very real sense, an &amp;ldquo;actual&amp;rdquo;
language. I would argue that learning Na&amp;rsquo;vi or Klingon would be much
better choices than any of the Romance Languages for someone who is
interested in leaning how language itself works. This is because both of
these languages go out of their way to be very un-English. English, for
example, is a Subject Verb Object language. Na&amp;rsquo;vi has no such
restrictions. Through the use of accusative, ergative, genetive, dative,
and topic marker suffixes speakers of Na&amp;rsquo;vi are able to construct their
sentences in whatever way flows best. Can you say that about English? Do
you with your years of practicing English even know what those are?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Verbs in Klingon take a prefix indicating the number and person of
the subject and object, plus suffixes from nine ordered classes, plus
a special suffix class called &lt;em&gt;rovers&lt;/em&gt;. Each of the four known rovers
has its own unique rule controlling its position among the suffixes in
the verb. Verbs are marked for aspect, certainty, predisposition and
volition, dynamic, causative, mood, negation, and honorific, and the
Klingon verb has two moods: indicative and imperative. The most common
word order in Klingon is Object Verb Subject, and in some cases the
word order is the exact reverse of word order in English. &amp;quot; -
&lt;a href=&#34;http://en.wikipedia.org/wiki/Klingon_language&#34;&gt;Wikipedia&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That&amp;rsquo;s not to say that there aren&amp;rsquo;t such significant variations amongst
natural languages. Pretty much every twisted idea you can conceive of to
warp a language has already been done by a natural language at some
point in history. But what better way to learn your own language than to
attempt to learn something so radically different from it that you are
forced to question everything from word construction to sentence
construction?&lt;/p&gt;
&lt;h2 id=&#34;the-naysayers&#34;&gt;The naysayers&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Avatar? No, it is your idea of learning language used by in-movie
characters that is disturbing, problematic and life wasting. NONE of
us are bashing your fave movie.&amp;rdquo; - &lt;em&gt;Random Ass-Hole&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;How about, instead, you learn one of the hundreds of &lt;em&gt;real&lt;/em&gt; languages
that are in danger of dying out, and help preserve some of the
collective heritage of humanity? You know, instead of wasting your
time learning a language made up for a film everyone&amp;rsquo;s going to forget
about?&amp;rdquo; - &lt;em&gt;Clueless Ass-Hole&lt;/em&gt; &amp;ldquo;Please learn a dying human language if
you&amp;rsquo;re going to bother learning a language at all.&amp;rdquo; - Polite, but
ignorant.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Conlangers have a different take&amp;hellip;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot; I find the &amp;ldquo;languages are dying&amp;rdquo; line the most irritating thing
someone can possibly say against the invention of a conlang. There is
a lot of diversity of viewpoints in the conlang community, but there
are certainly many of us who do care very deeply about endangered
languages. Creating a new hobby language doesn&amp;rsquo;t affect natural
languages any more than playing Monopoly affects the economy. Field
linguists can preserve a record of the language, and members of that
community can work to maintain or revive the language, but how exactly
is it supposed to help endangered languages if we all stopped this
conlanging business? I think that [conlangers] are probably more
keenly aware than most people that language is a community activity.
(This just sort of slaps you in the face when you are the only person
who knows your language.) I can learn an endangered language&amp;ndash;
probably pretty imperfectly at my age &amp;ndash; but unless I can participate
meaningfully in that language&amp;rsquo;s community or spawn a new community of
speakers, it&amp;rsquo;s nothing more than hobby, just like making up entirely
new languages. &amp;quot; - M. S. Soderquist&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;conlangers simply are not equipped to save endangered langauges.
Linguistic fieldwork requires specialized skills which most of us do
not have; while many of us may be capable of writing a fairly useful
grammar of a language, hardly anyone of us have experience in
conducting a linguistic interview and all that. And &lt;em&gt;documenting&lt;/em&gt; an
endangered language is only the &lt;em&gt;first&lt;/em&gt; step in preserving it; the
much harder part of it is to create and maintain the social
environment in which the language can flourish. That is well beyond
the possibilities of most conlangers, who are merely hobbyists in
linguistics. &amp;ldquo;While conlanging indeed does nothing to save endangered
languages, it also does nothing to endanger languages, and most &amp;hellip;
Indeed. The survival of a language requires the existence of a
&lt;em&gt;community&lt;/em&gt; that speaks it, and a consciousness of the language&amp;rsquo;s
value within that community. &amp;quot; - J. Rhiemeier&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A language is more than a collection of words and rules. It is the
repository wherein a community encodes its values and viewpoints. Very
recently we have learned to read Mayan, but no-one with half a brain
would suggest that anyone is capable of creating any new writings in
Mayan that actually capture the Mayan viewpoint. The same goes for
ancient Egyptian. Sure we can read hieroglyphs and there are definitely
people who can write in it, but again, we don&amp;rsquo;t truly grok it. We&amp;rsquo;re
like computers parroting back words in accordance with some pre-defined
rule-set. Even if you were to bring the handful of speakers together
their usage would not reflect that of the original language even if it
was syntactically correct, because we simply do not think like they did.
We are not capable of observing the world around us the way they did.&lt;/p&gt;
&lt;p&gt;The only people who can truly save a dying language are people who are
part of its community of native speakers. Yes, an outsider can become
part of that community. You, sitting there reading this, can pick some
dying language and help save it. All you have to do is travel to where
it&amp;rsquo;s spoken and truly become one with its community, assuming there are
enough speakers to even form a community. You&amp;rsquo;d have to give up your way
of life and take up theirs if you really want to save it, because
language expresses a community&amp;rsquo;s perception of the world and the
reasoning behind their actions in it. And you can not express that
accurately if you do not share it yourself.&lt;/p&gt;
&lt;p&gt;Which brings us back to
Na&amp;rsquo;vi. Na&amp;rsquo;vi is not a dying language. If anything it is a blossoming
language. Maybe it won&amp;rsquo;t survive, but there are thousands of people
waiting excitedly for enough information to truly learn to speak it, and
we will create a community around it. Some have even &lt;a href=&#34;http://www.learnnavi.org/&#34;&gt;gone to great
lengths to accurately piece together its
rules&lt;/a&gt; based on the limited information we
have at the moment. And almost anyone who attempts to learn it will
learn more about their native language in the process.&lt;/p&gt;
&lt;p&gt;Does it really matter that what is bringing us together is a &amp;ldquo;fictional&amp;rdquo; language?
Isn&amp;rsquo;t it more important that people are coming together to participate
in a creative, and educational act? Isn&amp;rsquo;t that an order of magnitude
better than just sitting at home and watching the next episode of House?
Note: some names have been changed in order to better reflect the
guilty.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Stop applying your agenda to Avatar (and everything else)</title>
      <link>https://weblog.masukomi.org/2009/12/29/stop-applying-your-agenda-to-avatar-and-everything-else/</link>
      <pubDate>Tue, 29 Dec 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/12/29/stop-applying-your-agenda-to-avatar-and-everything-else/</guid>
      <description>&lt;p&gt;Over on &lt;a href=&#34;http://contexts.org/socimages/2009/12/28/on-avatar-the-movie-spoiler-alert/?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed:+SociologicalImagesSeeingIsBelieving+(Sociological+Images:+Seeing+Is+Believing)&amp;amp;utm_content=LiveJournal&#34;&gt;Sociological Images Lisa evaluates
Avatar&lt;/a&gt;(spoiler
alert) Unfortunately, she&amp;rsquo;s got an agenda, and is seeing what she wants
to see instead of what&amp;rsquo;s actually there.&lt;/p&gt;
&lt;p&gt;First off, she says that the Na&amp;rsquo;vi &amp;ldquo;&amp;hellip; are, in short, the stereotypical “noble savage.” Which as I
stated in &lt;a href=&#34;https://weblog.masukomi.org/2009/12/19/avatar-review&#34;&gt;my review of Avatar&lt;/a&gt;, is simply
false.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Na’vi are never portrayed in the classic sense of “noble savage”.
They are noble yes, but your classic “noble savage” (at least as I’ve
seen it) is also, “savage”, “primitive”, and simply “doesn’t know
better.” You will find none of that in this film. The Na’vi are simply
an indigenous people with simpler technology than ours&amp;hellip;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Furthermore, they have spent years being taught our modern advances and
ways and have chosen to reject them. They are never portrayed as
&amp;ldquo;savages&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Lisa says that &amp;ldquo;After they win the battle, Sully assumes the
role of chief, with the highest ranking female at his side.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;This is simply not true. While this may be assumed to happen after the film ends
it does not happen in the film. During the film Jake always shows
deference to the chief and never tries to overstep his place in the
tribe (excluding trying to come back after being sent away for his
perceived betrayal of them).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;But Sully is not only a superior human being, he is also a superior
Na’vi. After being briefly ostracized for his participation in the
land grab, he tames the most violent creature in the sky, thereby
proving himself to be the highest quality warrior imaginable per the
Na’vi mythology.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;While the last sentence is true the first is arguably false. At no point
in the film does it make any claim, explicit, or implicit, that Jake
(Sully) is &amp;ldquo;superior&amp;rdquo;. He&amp;rsquo;s more courageous than most, and certainly has
a strong moral backbone, but that&amp;rsquo;s not superiority. He&amp;rsquo;s not stronger,
faster, smarter, or more educated than anyone else in the film. He&amp;rsquo;s
just a good guy with courage. And there&amp;rsquo;s nothing preventing anyone on
this planet from becoming that themselves. We can identify with Jake
specifically because he&amp;rsquo;s NOT superior. He&amp;rsquo;s an &amp;ldquo;average joe&amp;rdquo;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;He gives them hope, works out their strategy, and is their
most-valuable-weapon in the war.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is true, but not quite how she suggests. He does give them hope. If
he is the one to work out their strategy it is never shown, and if so it
proves he&amp;rsquo;s a freaking terrible strategist because he has Na&amp;rsquo;Vi on
horses ride straight into machine guns instead of hiding in trees and
sniping.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a good look at the racial politics of Avatar
&lt;a href=&#34;http://www.psychologytoday.com/blog/between-the-lines/200912/the-racial-politics-avatar&#34;&gt;here&lt;/a&gt;,
and if you doubt the words of us white folk, you might want to ask
yourself why the Native American Times seemed perfectly happy with it,
or why &lt;a href=&#34;http://nativetimes.com/index.php?option=com_content&amp;amp;view=article&amp;amp;id=2808:big-and-blue&amp;amp;catid=44&amp;amp;Itemid=20&#34;&gt;Wes Studi lent his voice to the
film&lt;/a&gt;.
If go into this determined to see it as &amp;ldquo;liberal guilt made flesh&amp;rdquo;
that&amp;rsquo;s probably what you&amp;rsquo;ll come out with, or maybe you&amp;rsquo;ll see it as
&amp;ldquo;&lt;a href=&#34;http://blogs.telegraph.co.uk/news/nilegardiner/100020721/avatar-the-most-expensive-piece-of-anti-american-propaganda-ever-made/&#34;&gt;The most expensive piece of anti-American propaganda ever
made.&lt;/a&gt;&amp;rdquo;
Or maybe, you&amp;rsquo;ll just go and enjoy it as an excellent film with the
simple message that the environment is worth protecting and that people
unlike you are still worthy of your respect. You get out of it what you
take into it.&lt;/p&gt;
&lt;p&gt;[Update] Miller says:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I think you should mention that when Jake went after the toruk, his
reasons weren&amp;rsquo;t simply to prove that he was in any way superior to
them as a warrior (as Lisa more or less says) but to win back the
Na&amp;rsquo;vi&amp;rsquo;s estimation of him since he had so indelibly lost it with his
&amp;ldquo;betrayal&amp;rdquo; the scene previous. the only thing he was proving in that
act was his sincerity in saying that he would do anything he could to
win back their trust and to help save them from being wiped out. if he
failed in his attempt at taming the last shadow, he would have surely
died. and seeing as he had lost everything else (his position with the
humans /as well as/ the Na&amp;rsquo;vi), there wasn&amp;rsquo;t anything left for him to
live for anyway.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I agree.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Why tinyurl.com and its cousins are a blight upon the internet</title>
      <link>https://weblog.masukomi.org/2009/12/27/why-tinyurl-com-and-its-cousins-are-a-blight-upon-the-internet/</link>
      <pubDate>Sun, 27 Dec 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/12/27/why-tinyurl-com-and-its-cousins-are-a-blight-upon-the-internet/</guid>
      <description>&lt;p&gt;Every web page on the internet has an URL that is a unique address
(that&amp;rsquo;s why it goes in the &amp;ldquo;address&amp;rdquo; bar), and in the beginning everyone
used that. But early e-mail clients kinda sucked, and some of the
current ones still do, and those addresses were so long they&amp;rsquo;d wrap, or
had some funky characters in them that the e-mail client wasn&amp;rsquo;t
expecting, and so it&amp;rsquo;d break the URL in such a way that you&amp;rsquo;d have to
copy and paste both parts of it into the address bar instead of just
clicking on it.&lt;/p&gt;
&lt;p&gt;This kinda sucked.&lt;/p&gt;
&lt;p&gt;Then Twitter came along and said &amp;ldquo;You
only get 140 characters because that&amp;rsquo;s all that&amp;rsquo;ll fit in an SMS&amp;rdquo;. And,
trying to write a useful little post in under 140 characters with some
big-ass url eating up a third of them really sucked.&lt;/p&gt;
&lt;p&gt;So, people turned
to tinyurl.com and it&amp;rsquo;s cousins. Because they promised short urls that
saved you characters and would always be clickable in crappy email
clients so long as you ignore the fine print. &lt;strong&gt;Fine Print? What fine
print?&lt;/strong&gt; Well, imagine, if you will, that an URL is a bridge to a
distant place. A normal URL works like a normal bridge, but tinyurls&amp;hellip;&lt;/p&gt;
&lt;p&gt;When you cross a normal bridge you know where you&amp;rsquo;re going to end up. I
never have to worry about crossing the Mississippi and finding myself in
Nigeria. With a tinyurl bridge, you just might. There&amp;rsquo;s no way to tell
where it goes before you get there. KinkyPornThatWillGetYouFired.com ?
Could be. Oh, and the bridge doesn&amp;rsquo;t go straight to the mystery land.
No, all tinyurl bridges curve through the country of tinyurl. So, if
they&amp;rsquo;re having a power outage, or an earthquake, you&amp;rsquo;re not getting
there today. If they experience an economic catastrophe and cease to be
then no tinyurl bridge that&amp;rsquo;s &lt;em&gt;ever&lt;/em&gt; been built will ever make it past
the once powerful, but now non-existant, country of tinyurl.com and you
won&amp;rsquo;t be able to get to the desired location manually because there&amp;rsquo;s no
way to know where that bridge ended up. Then, there&amp;rsquo;s the problem of
Google (and its cousins). Google watches every bridge that&amp;rsquo;s built, and
notes where it goes. The more bridges people build to a place, the more
important that place must be. But guess what? When you use a tinyurl
bridge no-one can see where that bridge goes. So that place you want to
spread the word about? You&amp;rsquo;re not helping it. If anyone is getting any
Google-juice out of the process it&amp;rsquo;s Tinyurl.com, but I suspect the
Google geeks know better than to count those urls.&lt;/p&gt;
&lt;p&gt;Then there&amp;rsquo;s the
question of longevity. Not only shouldn&amp;rsquo;t you count on tinyurl.com and
it&amp;rsquo;s cousins staying around, you should count on them going away. Almost
all of them are totally free services with no advertising that just cost
their owners money. The more you use it, the more bandwidth they
consume, and more disk space they need. No, you should definitely count
on these sites going away. It&amp;rsquo;s just a matter of time. Sure, as long as
there&amp;rsquo;s a need another one will probably pop up to take it&amp;rsquo;s place, but
all the millions of urls that used the old one will break when it goes
away.&lt;/p&gt;
&lt;p&gt;But, what about those old fashioned long urls? When I give someone
the url to this page
&lt;a href=&#34;https://weblog.masukomi.org/2009/12/27/why-tinyurl-co%E2%80%A6n-the-internet&#34;&gt;https://weblog.masukomi.org/2009/12/27/why-tinyurl-co…n-the-internet&lt;/a&gt;
It not only gets them to the post but it also gives them some additional
information. They can tell for example that it&amp;rsquo;s from my blog (
weblog.masukomi.org ) and not some porn site. In &lt;em&gt;my&lt;/em&gt; urls (and many
other blog URLs) there&amp;rsquo;s also an indication of when it was written (
2009/12/27 ). This is especially useful when you need current
information not something that was written five years ago. You can also
tell if it&amp;rsquo;s something you&amp;rsquo;ve already seen. And last, but not least, the
end of the URL ( why-tinyurl-co&amp;hellip;n-the-internet ) gives you a hint at
what the article&amp;rsquo;s about.&lt;/p&gt;
&lt;h2 id=&#34;but-what-about-twitter&#34;&gt;But what about Twitter?&lt;/h2&gt;
&lt;p&gt;Yeah, I hear you.
It&amp;rsquo;s easy enough to stop using URL shorteners in everything else,
especially since modern e-mail clients are generally pretty good about
not breaking up urls, but you need to include URLs in your tweets from
time-to-time. There are two simple simple solutions and both are really
easy to implement. The only problem is that Twitter has to do it.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s probably safe to say that Twitter&amp;rsquo;s not going to give up the 140
character limit even when all phones have gone beyond that limit for
texting. Those 140 characters have become part of Twitter&amp;rsquo;s ethos. If
the limit was extended much it would transform what what Twitter is and
how it&amp;rsquo;s used. So, what are these solutions?&lt;/p&gt;
&lt;p&gt;The best would be if
Twitter were to set up their own tinyurl clone. [Update: they have now]
There are plenty of free tinyurl implementations out there that are easy
to install. You&amp;rsquo;d still have the downside of not being able to tell where the url lead to, and
you wouldn&amp;rsquo;t be able to get there if Twitter was down, and if twitter
went out of business they&amp;rsquo;d all stop working BUT, except for not seeing
where you&amp;rsquo;re going these are all ok because if Twitter was down you
wouldn&amp;rsquo;t see the tinyurl in the first place, and if Twitter went out of
business the site would go away, and take all those now non-functional
links with it.&lt;/p&gt;
&lt;p&gt;If Twitter were to simply not count any characters
contained in an url it would solve the problem on the web, and only
require a minor code change and a simple database update. It has the
downside that older phones would have trouble with the extra length and
would need an url shortener, of course, if your phone is so old it can&amp;rsquo;t
handle more than 140 characters then odds are you&amp;rsquo;re not going to be
clicking on any links that come in a Tweet anyway.&lt;/p&gt;
&lt;p&gt;While neither of
these are hard they do both have a financial impact on a company that
seems incapable of figuring out how to make &lt;em&gt;any&lt;/em&gt; money. Storing those
few extra characters may not seem like much but I assure you that they
add up, and the servers and hard drives required to make them keep
working under a Twitter level of load (and nigh-constant hard drive
failure) would not be cheap. But, there&amp;rsquo;s a good reason for Twitter to
go through the effort of fixing these. Over time the URL shortening
sites will die out, and as they do millions of links in old tweets will
start to break, and that makes twitter look bad. How much will it suck
when most all of the links in old tweets stop working and people stop
bothering or wanting to click on links in tweets because they&amp;rsquo;re so
frequently broken?&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary:&lt;/h2&gt;
&lt;p&gt;In summary, Tinyurl.com and it&amp;rsquo;s cousins are bad because:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can&amp;rsquo;t see where the URL takes you&lt;/li&gt;
&lt;li&gt;The URL won&amp;rsquo;t work if the tinyurl is down temporarily&lt;/li&gt;
&lt;li&gt;The URL will break permanently when (not if) tinyurl ceases to be.&lt;/li&gt;
&lt;li&gt;It takes longer to get to the site because you have to first detour
through the Tinyurl servers (literally adding thousands, sometimes
tens of thousands, of miles to every request).&lt;/li&gt;
&lt;li&gt;You&amp;rsquo;re not helping promote the page you&amp;rsquo;re trying to spread the word
about because Google can&amp;rsquo;t tell what you&amp;rsquo;re linking to.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Please note that it&amp;rsquo;s not tinyurl.com that&amp;rsquo;s specifically the problem.
They&amp;rsquo;re just the most popular one. ALL of the URL shortening sites have
these same problems.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Avatar [review]</title>
      <link>https://weblog.masukomi.org/2009/12/19/avatar-review/</link>
      <pubDate>Sun, 20 Dec 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/12/19/avatar-review/</guid>
      <description>&lt;p&gt;I didn&amp;rsquo;t plan to write this.&lt;/p&gt;
&lt;p&gt;I just can&amp;rsquo;t get it out of my head.&lt;/p&gt;
&lt;p&gt;Despite the hype, despite my fear of having expectations set too high, Avatar
has blown me away.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ve probably heard people talking about how
incredible the CGI is, and it is. But that&amp;rsquo;s not important. What&amp;rsquo;s
important, is that James Cameron has created a lush and beautiful world
that is utterly believable. You will hear that the plot is fairly
simple, even predictable. But, that&amp;rsquo;s not important either. What&amp;rsquo;s
important is that you enjoy every moment of it. What&amp;rsquo;s important, is
that you care about characters, and when over one hundred and fifty
minutes have gone by, you just want to see it all over again. It simply
does not matter that the core story arc has been used time and again.
Storytellers keep using it because it&amp;rsquo;s a works, and works well.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve seen some of the few negative reviews of this talk about how it&amp;rsquo;s a tale
of modern people versus the &amp;ldquo;noble savage&amp;rdquo;. But the Na&amp;rsquo;vi are never
portrayed in the classic sense of &amp;ldquo;noble savage&amp;rdquo;. They are noble yes,
but your classic &amp;ldquo;noble savage&amp;rdquo; (at least as I&amp;rsquo;ve seen it) is also,
&amp;ldquo;savage&amp;rdquo;, &amp;ldquo;primitive&amp;rdquo;, and simply &amp;ldquo;doesn&amp;rsquo;t know better.&amp;rdquo; You will find
none of that in this film. The Na&amp;rsquo;vi are simply an indigenous people
with simpler technology than ours, end of story. They have traditions
unlike yours and mine, but the movie doesn&amp;rsquo;t tell your they&amp;rsquo;re better or
worse, merely asks you to accept them for what they are and believe that
they are worth protecting. The only thing they really suggest is better
about the Na&amp;rsquo;vi is that they live in tune with their world while the
humans have managed to wipe out all the natural beauty on theirs.&lt;/p&gt;
&lt;p&gt;James Cameron and crew have created something that will walk away with a mound
of Oscars, and deserve every one.&lt;/p&gt;
&lt;p&gt;The editing is absolutely brilliant,
astounding even. The pacing is perfect. Everything you want from a film
with regards to those, it has. It is as long as it is because there was
that much to show, but it never drags, and you never come across a part
that, looking back, you wish they&amp;rsquo;d cut. The graphics will obviously get
an Oscar, but there is no doubt in my mind that the editing deserves one
too.&lt;/p&gt;
&lt;p&gt;The CGI: the world, the creatures, the Na&amp;rsquo;vi&amp;hellip; Incredible. You
can&amp;rsquo;t tell the Na&amp;rsquo;vi don&amp;rsquo;t exist in the real world. They have pushed
motion capture, especially the capture of facial movments, to a level
that is indiscernable from a physical actor. I&amp;rsquo;m a geek, and as such
there was always a tiny piece of me watching from that perspective, and
I can remember one moment when Zoe Saldaña&amp;rsquo;s character Neytiri was
speaking to Jake and the facial motions were so complex, so complete,
and so perfectly rendered down to the creases of the skin, that the geek
part of my brain just locked up for a minute. Some of the flora and
fauna is so unlike anything on earth that it had to be CGI, but some
things, like rocks&amp;hellip; you simply couldn&amp;rsquo;t tell if it was CGI or not.&lt;/p&gt;
&lt;p&gt;In a way it&amp;rsquo;s sad. It&amp;rsquo;s sad that the technical advances in this film are so
significant, because you can&amp;rsquo;t talk about it without speaking of them,
and that takes away from the film itself. Maybe when Avatar is as far
behind us as the original Star Wars is, when the tech simply isn&amp;rsquo;t
noteworthy by the current day&amp;rsquo;s standards. Maybe then we can have a real
discussion about this film. What I can say now, is that it is absolutely
worth seeing. It&amp;rsquo;s not flawless. But it does exactly what a sci-fi movie
should do. It takes you to a new place, or time, it makes you feel for
its characters, and leaves you wanting more.&lt;/p&gt;
&lt;p&gt;[Update] I made &lt;a href=&#34;https://weblog.masukomi.org/2009/12/29/stop-applying-your-agenda-to-avatar-and-everything-else&#34;&gt;a second post about some BS commentary about Avatar&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>I saw a beautiful thing today.</title>
      <link>https://weblog.masukomi.org/2009/12/13/i-saw-a-beautiful-thing-today/</link>
      <pubDate>Sun, 13 Dec 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/12/13/i-saw-a-beautiful-thing-today/</guid>
      <description>&lt;p&gt;There was a young girl, at that age when puberty hasn&amp;rsquo;t quite reached
her, and everything hasn&amp;rsquo;t changed. I watched her through the window of
the subway train as she buried her face into her fathers chest and hid
from the cold. He was talking with another man his age and gesturing
with his arms. After a moment she turned around, reached up, and put her
hands around his forearms. Not to interfere. Just, to be let them hang,
to touch him as he continued talking and gesturing.&lt;/p&gt;
&lt;p&gt;I saw a beautiful thing today&amp;hellip; a little girl, who loved her father.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Robert A Heinlein Changed My Life</title>
      <link>https://weblog.masukomi.org/2009/12/09/robert-a-heinlein-changed-my-life/</link>
      <pubDate>Wed, 09 Dec 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/12/09/robert-a-heinlein-changed-my-life/</guid>
      <description>&lt;p&gt;Somewhere around the time I was in High School my mother introduced me
to &lt;a href=&#34;http://en.wikipedia.org/wiki/Robert_A._Heinlein&#34;&gt;Heinlein&lt;/a&gt;, and one
of the first things I read was A Stranger In A Strange Land. And, I
think it impacted me even more than I realized at the time. I&amp;rsquo;m almost
finishing rereading it now, and reflecting on some interesting paralels
between the characters and myself. While I could never prove it, it
seems that as I changed from a &amp;ldquo;nestling&amp;rdquo; into an adult I took on the
morals of &lt;a href=&#34;http://en.wikipedia.org/wiki/Stranger_in_a_Strange_Land&#34;&gt;Valentine Michael
Smith&lt;/a&gt; and
combined them with &lt;a href=&#34;http://en.wikipedia.org/wiki/Jubal_Harshaw&#34;&gt;Jubal
Harshaw&lt;/a&gt;&amp;rsquo;s way of thinking.&lt;/p&gt;
&lt;p&gt;Michael&amp;rsquo;s morals aren&amp;rsquo;t too far from the norm, with some notable
exceptions, so it&amp;rsquo;s not something you&amp;rsquo;d particularly notice in me, but I
do share them, for the most part, even in the exceptions. Jubal, on the
other hand, had an ability that is exceedingly rare. He could think
about things separately from the morals of the society he lived in. He
was able to contemplate them for what they were inherently. For example,
our society says that orgies are bad, but when the topic was discussed
Jubal spoke of them for what they were; a group of people making each
other feel good, and noted that some societies had no problem with them.
Just because the morals of &lt;em&gt;our&lt;/em&gt; society deem something &amp;ldquo;bad&amp;rdquo; doesn&amp;rsquo;t
mean it actually is.&lt;/p&gt;
&lt;p&gt;I think I learned that lesson most strongly from
Jubal. He, more than anyone else, taught me to judge things for their
own worth, and to not accept what &amp;ldquo;everyone knows&amp;rdquo; without question. And
my ideas on religion and family have come, in no small part, from
Michael&amp;rsquo;s views on the same.&lt;/p&gt;
&lt;p&gt;The more of his novels I think about, the
more influence I can see on decisions I have made in my life, and how
his teachings influenced the way I think. So thank you Robert Heinlein,
Valentine, Michael Smith, Jubal Harshaw, and all the other fine
characters who helped to shape my life. Many authors have entertained
me, and made me think, but I can only think of one that has &lt;em&gt;really&lt;/em&gt;
changed my life.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>A Behaviorally Targeted Secret Santa</title>
      <link>https://weblog.masukomi.org/2009/12/07/a-behaviorally-targeted-secret-santa/</link>
      <pubDate>Mon, 07 Dec 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/12/07/a-behaviorally-targeted-secret-santa/</guid>
      <description>&lt;p&gt;We&amp;rsquo;re doing an interesting variation on Secret Santa in our group this
year, that you might enjoy too.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Background: we do behavioral targeting
in my group. We get anonymous data about web surfers and try and try and
make sure that those people are shown banner ads that are actually
applicable to them, but we never know WHO, and thus&amp;hellip;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A behaviorally targeted Secret Santa.
Each participant submits a list of 3-5 items
they&amp;rsquo;ve recently purchased (online or off) and are comfortable sharing
to the coordinator. Then, instead of drawing names from a hat, each
participant draws a an anonymous list of recent purchase with a
participant number and has to try and buy a gift they think appropriate
based on that for under $20.&lt;/p&gt;
&lt;p&gt;When it&amp;rsquo;s time to exchange gifts, everyone
gets together and the participant numbers on the lists are matched up
with the humans and gifts are exchanged. I&amp;rsquo;m sure we&amp;rsquo;ll probably read
off the items on the list we got and everyone will try and guess who&amp;rsquo;s
list it was before the reveal and exchange.&lt;/p&gt;
&lt;p&gt;I like it. I speak with a
bunch of my coworkers but I&amp;rsquo;d be totally stumped as to what to get some
of them. Give me a list of things they&amp;rsquo;ve recently purchased and I think
I&amp;rsquo;d be able to do a pretty fair job though.&lt;/p&gt;
&lt;p&gt;I think it&amp;rsquo;s a good idea
that would work well in just about any group, and will probably result
in presents that are going to be enjoyed even more by the recipients. If
you try it in your group drop me a note and let me know how it went.&lt;/p&gt;
&lt;p&gt;P.S. I&amp;rsquo;m thinking it would help if when you made your list you included
links to descriptions of the items online, even if you didn&amp;rsquo;t purchase
them online.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>A present for my Twitter followers.</title>
      <link>https://weblog.masukomi.org/2009/12/04/a-present-for-my-twitter-followers/</link>
      <pubDate>Fri, 04 Dec 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/12/04/a-present-for-my-twitter-followers/</guid>
      <description>&lt;p&gt;A little bit ago I got a 1&amp;quot; button maker and have been having lots of
fun with it. So, I thought I&amp;rsquo;d make you a present. :) In order to get
one all you have to do is send me a Direct Message on Twitter. If, by
some chance you&amp;rsquo;re following me (@masukomi), but I&amp;rsquo;m not following you
(and thus you can&amp;rsquo;t DM me) send me an e-mail at &lt;a href=&#34;mailto:masukomi@masukomi.org&#34;&gt;masukomi@masukomi.org&lt;/a&gt;.
Your DM, or e-mail, must contain 2 things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A name and street address where you want the button sent. If you
want it sent to someone else let me know who to tell them it&amp;rsquo;s from.&lt;/li&gt;
&lt;li&gt;An emotional / human adjective. E.g.: happy, angry, serene, silly,
cute, erotic etc.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;rules-and-notes&#34;&gt;Rules and notes:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;This offer is available to anyone who was following me on Twitter
prior to 12:00 PM (noon) Eastern time on December 4th 2009.
Otherwise it might spread and I&amp;rsquo;d go broke from the postage.
[UPDATE: Due to &lt;em&gt;under&lt;/em&gt;whelming demand (six!) I am opening this up
to anyone who is following me regardless of when they started, or
even if they started just to get a button. I&amp;rsquo;ll cap it at the first
100 requests (assuming it ever gets that far). Also WTF is with all
you people not wanting a free mystery button?! Sheesh. ]&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A special exception will be made for readers of my blog who&amp;rsquo;ve
contacted me via e-mail or comments in the past.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;You don&amp;rsquo;t get to pick what&amp;rsquo;s on your button. It might be a photo. It
might be a drawing. It might be a word, or an icon, or even a
letter. The adjective you choose will influence it though.&lt;/li&gt;
&lt;li&gt;Please note that if you choose an emotion like &amp;ldquo;angry&amp;rdquo; or
&amp;ldquo;frustrated&amp;rdquo; your button might have a swear word on it. If you
choose something like &amp;ldquo;erotic&amp;rdquo; it&amp;rsquo;ll probably be NSFW and I won&amp;rsquo;t
guarantee what gender (or even species) will be represented. :P&lt;/li&gt;
&lt;li&gt;I don&amp;rsquo;t guarantee delivery by Xmas (or even the next millennium) but
I&amp;rsquo;ll try.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>An evolutionary leap</title>
      <link>https://weblog.masukomi.org/2009/11/12/an-evolutionary-leap/</link>
      <pubDate>Thu, 12 Nov 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/11/12/an-evolutionary-leap/</guid>
      <description>&lt;p&gt;It was, so strange&amp;hellip; No, unbelievable.&lt;/p&gt;
&lt;p&gt;I was sitting at my desk, typing
away, when the phone rang. Hmm, I don&amp;rsquo;t recognize that number&amp;hellip; &amp;ldquo;Kay
speaking&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Hi, I&amp;rsquo;m Random Headhunter X with Random Company Y, and I was
hoping I could talk to you about a position. I know you&amp;rsquo;re not looking,
but I was hoping you might know someone&amp;hellip;&amp;rdquo;&lt;/p&gt;
&lt;p&gt;My brain froze for a minute. I know more words followed but&amp;hellip; did he just say what I think he just
said? I rewound the conversation &amp;ldquo;&amp;hellip;I know you&amp;rsquo;re not looking&amp;hellip;&amp;rdquo; Yes!
Yes he did! Oh&amp;hellip; my&amp;hellip; god! He can read! There&amp;rsquo;s a note on my home page
next to the resume link. It says &amp;ldquo;NO. I am not looking for a new job.
Don&amp;rsquo;t offer.&amp;rdquo; And &amp;hellip; he read it! He read it, and &lt;em&gt;understood&lt;/em&gt; what the
words meant.&lt;/p&gt;
&lt;p&gt;I know. I know. Some of you are thinking &amp;ldquo;so what&amp;rdquo;, but
trust me, this is an incredible event. You see, until now, all
observations have indicated that headhunters work on a simple form of
pattern recognition. Like bees and flowers. They see the pretty color,
and they zoom in to it, even if it&amp;rsquo;s just a piece of plastic. They see
&amp;ldquo;Java&amp;rdquo; and their dialing finger starts an uncontrollable sequence of
motions. &amp;ldquo;Rails&amp;rdquo;! *dialdialdial* In some species, the fingers are
attached to e-mailing devices, but the actions are, in essence, the
same.&lt;/p&gt;
&lt;p&gt;But this one&amp;hellip; &lt;em&gt;this one&lt;/em&gt; seems to have made an evolutionary leap
beyond simply recognizing patterns of letters, beyond words even. This
one was able to grasp that words have meaning and can be placed in a
specific order to generate further meaning that goes beyond that of the
individual words that have been arranged.&lt;/p&gt;
&lt;p&gt;I feel out of my depth. I feel
like a child in the back yard who just witnessed a raccoon giving birth
to a kitten. Who do you call about these things? Will anyone believe me?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>A realization ~ Why hadn&#39;t I noticed this ~ Never a long day</title>
      <link>https://weblog.masukomi.org/2009/09/26/a-realization-why-hadnt-i-noticed-this-never-a-long-day/</link>
      <pubDate>Sun, 27 Sep 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/09/26/a-realization-why-hadnt-i-noticed-this-never-a-long-day/</guid>
      <description>&lt;p&gt;I was thinking about my trip and had one of those awesome, yet so
simple, realizations.&lt;/p&gt;
&lt;p&gt;I never had a &amp;ldquo;long day&amp;rdquo; on the bike. Like many of you, I sit in my cube
day in and day out, and by three o&amp;rsquo;clock on most of those days it&amp;rsquo;s
already feeling long, and my brain just starts thinking about going
home. But that never happened on the bike. Even when I was ridding ten
hours a day I can&amp;rsquo;t remember a single day that felt &amp;ldquo;long&amp;rdquo;. Sure, on
some of them my shoulder muscles were really hurting badly for hours on
end, but mentally it never felt like a long day. There were boring
times, and frustrating times, but never times when you were just
desperate for it to end. And what an *amazing* thing that is.&lt;/p&gt;
&lt;p&gt;Ten years ago I&amp;rsquo;d loose myself in programming; disappear for the better
part of a day into code. But it&amp;rsquo;s hard for me to find projects like that
any more. And I realize that even if I don&amp;rsquo;t find what I&amp;rsquo;m looking for
on my next trip, I&amp;rsquo;ll have had a couple months of days that were never
&amp;ldquo;too long&amp;rdquo;. Maybe more if I don&amp;rsquo;t stop riding. ;)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Looking for something</title>
      <link>https://weblog.masukomi.org/2009/09/26/looking-for-something/</link>
      <pubDate>Sun, 27 Sep 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/09/26/looking-for-something/</guid>
      <description>&lt;p&gt;Ever since the trip was done, I&amp;rsquo;ve wanted more.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not that the trip was so wonderful that I want to recapture it. It&amp;rsquo;s that in nearly six
thousand miles of riding I never found what I was looking for.&lt;/p&gt;
&lt;p&gt;I keep
thinking that it was too easy. That through all of that, there was no
real challenge. The roads are all pretty much perfect. There&amp;rsquo;s no real
risk of running out of gas in the United States. Breaking down? So what?
Grab your cell and a tow truck will be along in a couple hours at the
most. Fell down and broke your leg? No worries, even if you&amp;rsquo;re out of
cell phone range a car drives by every ten minutes or so. Even driving
down a dirt road through the badlands that doesn&amp;rsquo;t exist on the gps, has
no towns, or any good reason for being traveled I kept encountering more
cars&amp;hellip;&lt;/p&gt;
&lt;p&gt;So, I&amp;rsquo;ve set my sights on Africa. I&amp;rsquo;m thinking of participating
in the Africa Rally put on by The Adventurists. Take a totally
inappropriate motorcycle from London to Cameroon. But half of that
distance is across the equally unchallenging roads of Europe, so I&amp;rsquo;m
thinking that when I hit the end, I&amp;rsquo;ll just continue on down until I hit
South Africa. That, surely, would be a &amp;ldquo;real adventure&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;But, I wonder if, even in traveling the length of Africa, I would discover what I was
looking for. I think I would love the experience, surely, and I would
find a real challenge, if nothing else, but where will I be at the end
of it?&lt;/p&gt;
&lt;p&gt;Will it be enough?&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m worried. I&amp;rsquo;m looking for something within
myself, but I don&amp;rsquo;t know what.&lt;/p&gt;
&lt;p&gt;I think I&amp;rsquo;m looking for what&amp;rsquo;s next. The
next stage of my life. Will I find that on the road? Will I find someone
to share it with?&lt;/p&gt;
&lt;p&gt;[Update] I did find it on the road, and I did find someone to share it with.
See &lt;a href=&#34;http://www.CorporateRunaways.com&#34;&gt;Corporate Runaways&lt;/a&gt; for details.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Microlight Solo ~ Two weeks and change on the ground ~ Final Impressions</title>
      <link>https://weblog.masukomi.org/2009/09/20/microlight-solo-two-weeks-and-change-on-the-ground-final-impressions/</link>
      <pubDate>Sun, 20 Sep 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/09/20/microlight-solo-two-weeks-and-change-on-the-ground-final-impressions/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/masukomi/3861135704/&#34;&gt;&lt;img src=&#34;http://farm4.static.flickr.com/3450/3861135704_7e1907ba01.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;quick-summary&#34;&gt;Quick summary&lt;/h2&gt;
&lt;p&gt;I set this tent up and took it down every day for over two weeks and
thought it was excellent.&lt;/p&gt;
&lt;h2 id=&#34;the-details&#34;&gt;The details&lt;/h2&gt;
&lt;p&gt;I figured that camping was &amp;ldquo;the way to do it&amp;rdquo;. I&amp;rsquo;d save money, and
remain a bit more in contact with the world than if i&amp;rsquo;d of stayed in
motels on my trip, so I need a tent.&lt;/p&gt;
&lt;p&gt;I hoped on my bike and drove about a hundred and fifty miles up to the
L.L. Bean store in Maine. Sure I could have hopped on the subway and
gone to the local R.E.I., but hey L.L. Bean&amp;rsquo;s been at this a lot longer,
has a much cooler place to visit, and&amp;hellip; road trip! And, to be fully up
front. I&amp;rsquo;d read some good reviews of the L.L. Bean Microlight Solo on
their site and just wanted to see one in person.&lt;/p&gt;
&lt;p&gt;When I finally made my way to the tent section I encountered an
incredibly helpful salesman, whose name I&amp;rsquo;ve totally forgotten (sorry),
who confirmed my thoughts on it discussed a few of other tent options,
and suggested that I get the $15 &amp;ldquo;Footprint&amp;rdquo; to go with it, but made it
clear that it wasn&amp;rsquo;t a requirement, but that I&amp;rsquo;d probably want to put
down a plastic bag or something under the tent if I didn&amp;rsquo;t have it to
keep it from being damaged by the scratchy rocks and sticks and such I&amp;rsquo;d
be compressing under myself, and to act as a moisture barrier. I think
it was worth every penny. But first, the tent itself.&lt;/p&gt;
&lt;p&gt;This is, unquestionably, a one-man tent. As in, one person who&amp;rsquo;s in
shape. If you&amp;rsquo;re&amp;hellip; &amp;ldquo;generously padded&amp;rdquo; this is NOT the tent for you.
Two thin people could probably fit if they were willing to lay on their
sides and spoon each other. Also, because of the shape you can only sit
up just inside the doorway. I&amp;rsquo;m 5&#39;9&amp;quot; and I didn&amp;rsquo;t have any problems with
this, although I did occasionally brush my head when placing or removing
anything from down by my feet, or if I sat up in my sleeping bag I&amp;rsquo;d
have to scoot back towards the entrance.&lt;/p&gt;
&lt;p&gt;This small size is actually one of the reasons I chose the tent. Small
size means less material, a smaller bag, and less weight; all things
which are critical on a motorcycle trip. When I first got it home I
attempted to set it up in my living room just to get a feel for it, but
having not set up a tent in well over fifteen years I was rather
surprised at how dramatically tent-tech has changed. First off, it&amp;rsquo;s not
a free-standing tent. It simply won&amp;rsquo;t stay erected if you don&amp;rsquo;t pound in
the tent-pegs. This isn&amp;rsquo;t a bad thing for most of North America, it just
means no living room test-runs, sand and snow would probably be quite
difficult without specialized tent pegs, and &lt;em&gt;you definitely can&amp;rsquo;t set
it up on a large flat rock&lt;/em&gt;. You&amp;rsquo;ll need soil. There are two poles,
which are made from tubes of aluminum with an elastic cord run through
them to keep them together, and help them snap easily into place as
you&amp;rsquo;re combining them into one long tube; an act that takes about five
seconds. Unlike the tents of yesteryear you don&amp;rsquo;t bend them slightly to
fit through some straps on the tent. No, you stick one end through a
grommet in the tent, then bend it far beyond anything that seems
sensible, until the other end finally approaches the grommet on the
opposite side of the tent. Then, you do the same thing for the other
pole. It&amp;rsquo;s not hard, it&amp;rsquo;s just a bit disturbing to someone who isn&amp;rsquo;t
used to this new world order.&lt;/p&gt;
&lt;p&gt;Then, you lift up one of the poles, pull a series of plastic hooks over
it, pound in a peg or two, and repeat at the other end. I found the
easiest way to do it was to erect one pole, push in one tent peg, then
step on, or press far side of the tent down while you grab and lift the
other pole. Once you&amp;rsquo;ve got the far one lifted pound in the diagonally
opposite tent peg. Congratulations you&amp;rsquo;ve just done the bare minimum
required to raise this tent. I wouldn&amp;rsquo;t recommend stopping there but
it&amp;rsquo;s pretty impressive that with two tent pegs you&amp;rsquo;ve got your tent up.
A little floppy at the unpegged corners but hey&amp;hellip;. Then just move
around the tent putting in the rest of the pegs. The footprint matches
the base of the tent exactly, has its own grommets that the poles also
go through, and some loops for the tent pegs to pass through directly
under the ones for the tent.&lt;/p&gt;
&lt;p&gt;Once you&amp;rsquo;ve done that you now have a mosquito netting tent up with a
waterproof base and a full view of the world. If you&amp;rsquo;d like some
privacy, or expect rain, throw the rain fly over it and shove in a
couple pegs. The rain fly also creates a little alcove in front of the
door under which you can set things you want out of sight, or protected
from the rain, but don&amp;rsquo;t want in the main body of the tent. There is a
gap between the netting and the rain fly and this is a very important
feature. Your body heat is going to cause condensation to form on the
inside of any tent (assuming there&amp;rsquo;s water in the air to condense) but
in a tent like this it forms on the rain fly which won&amp;rsquo;t end up getting
you or your gear wet because of the gap. It simply forms on and runs
down the inside of the fly to the ground without ever touching you.
Unfortunately the fly tended to sag slightly between the two poles so
there was about eight square inches of space in the middle of the tent
where they did make contact. This was never a problem even on the most
dewey of mornings but it shouldn&amp;rsquo;t have been happening. Casually putting
up the tent, while pausing to listen to the insects and look at pretty
views still took less than 8 minutes from start to finish, including
putting all my stuff in it after it was up.&lt;/p&gt;
&lt;p&gt;The slight sag of the rain fly was most likely because of the one badly
designed element of the tent. At the foot end of the rain fly are two
pieces of webbing. Each has a loop at the end for a tent peg to go
through and runs through a plastic length adjuster thing. The problem is
that no matter how much you shortened the adjuster never held it. I
ended up looping the webbing around the adjuster and that was almost the
right length. While certain parts of the fly get their own tent pegs
there were no pegs for these so you had to put the end loop over one of
the pegs used for the base. This would have worked perfectly if the
adjusters worked, but they didn&amp;rsquo;t so it didn&amp;rsquo;t pull with quite enough
tension on the top and you end up with that little sag in the middle.
So, if you do get this tent my recommendation would be to purchase two
more of the thin aluminum tent pegs that this tent uses. Then you can
just put them at the end of the webbing and pull it as taught as you
need to.&lt;/p&gt;
&lt;h2 id=&#34;space-and-comfort&#34;&gt;Space and Comfort&lt;/h2&gt;
&lt;p&gt;I am 5&#39;9&amp;quot; tall and about 145 lbs. I had enough space for me, my one
piece riding suit down along my side, my Camelbak M.U.L.E NV on one side
of my head, my walking shoes and assorted other small junk by the other
side (flashlight, iPhone, a small tupperware of food, etc), a pillow
(actually my pants and high-vis vest rolled up), my full-face motorcycle
helmet to the left of my feet and my riding boots to the right of my
feet. My glasses went in one of the two mesh pockets that are right by
your hands when you lay down and seem designed for just such a usage.
Those pockets were a perfect little touch. After taking my sleeping bag
out of the dry-sack I&amp;rsquo;d stick it in the alcove (it had a book,
notebooks, and an emergency set of dry clothes still in it) and have
space on the other side of the alcove that I pretty much never used.&lt;/p&gt;
&lt;p&gt;The comfort was fine. It was wide enough that you could curl into a
fetal position without trouble and laying there in the morning watching
the silhouettes of leaf shadows on the rain fly was nice. You didn&amp;rsquo;t
feel cramped in there. However, I would note that owing to the fact you
can only sit up by the doorway you really wouldn&amp;rsquo;t want to be stuck in
there hiding from the rain all day. That wasn&amp;rsquo;t a concern for me since I
ride rain or shine. Also, obviously, this tent is not for anyone who is
claustrophobic.&lt;/p&gt;
&lt;h2 id=&#34;tear-down-tip&#34;&gt;Tear-Down tip&lt;/h2&gt;
&lt;p&gt;The rain fly is made of some incredibly slippery parachute fabric. When
you roll it up it&amp;rsquo;s really difficult to get it to stay rolled up nicely
as you&amp;rsquo;re trying to get it in the bag. It just wants to slide out of
itself. The solution I found was to roll up the tent (mosquito netting
and base) so that you have a rectangle slightly shorter than the bag and
about half again as wide with the base out. do the same for the rain
fly, then fold that in half again and stick it on top of the base. Then
roll the base around the rain fly so that when you&amp;rsquo;re holding it with
one hand there is only the base material exposed to your hand to grip.&lt;/p&gt;
&lt;p&gt;For the Footprint: fold it into a rectangle as tall as the bag and
whatever width, then roll.&lt;/p&gt;
&lt;h2 id=&#34;main-points&#34;&gt;Main points:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Extremely light-weight and compact when packed up. I could easily
roll it up smaller than the bag it lived in and there was plenty of
space in there for the pegs, poles, and the footprint.&lt;/li&gt;
&lt;li&gt;So easy to put up you can do it in the dark. If you&amp;rsquo;re familiar with
how all the pieces go together. I did it once in the pitch black
since dealing with the flashlight too was distracting, and a couple
times as I raced the last rays of sunlight.&lt;/li&gt;
&lt;li&gt;Enough space for you, some gear around your head, and some by your
feet.&lt;/li&gt;
&lt;li&gt;Get the Footprint. It&amp;rsquo;s worth the $15 for the convenience of all its
perfectly placed connectors, folds up very small and can fit in the
tent bag.&lt;/li&gt;
&lt;li&gt;Buy two additional thin tent pegs to compensate for the bad
adjusters on the rear of the rain fly.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;assorted-notes&#34;&gt;Assorted notes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;I&amp;rsquo;ve taken the tent down in a strong wind. I was very surprised to
find that it wasn&amp;rsquo;t a hassle at all. There&amp;rsquo;s simply not enough
fabric for it to be a big deal.&lt;/li&gt;
&lt;li&gt;Owing to extenuating circumstances I never actually used it in the
rain, but according to the reviews on the site it performs
excellently. I would not doubt this in the least.&lt;/li&gt;
&lt;li&gt;There&amp;rsquo;s some velcro on the outside of the rain-fly along the zipper.
I am not sold on this. I&amp;rsquo;m sure they put it there because of some
wind issue but whatever their decision was it never became apparent
to me and occasionally gave me a trivial amount of annoyance when
dealing with the zipper. This is totally nit-picking I admit.&lt;/li&gt;
&lt;li&gt;The elastic cord through the tent pole sections really made them
trivial to put together. You could &lt;em&gt;almost&lt;/em&gt;grab one end, wave it in
the air and listen to the pieces snap snap snap into place&amp;hellip;
&lt;em&gt;almost&lt;/em&gt;. In reality you can do it with your eyes closed, or better
yet, while paying attention to the beautiful scenery you&amp;rsquo;ve found
yourself in. Taking them apart is just as easy.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>I almost Forgot ~ Buffs make everything better ~ Great comfort item</title>
      <link>https://weblog.masukomi.org/2009/09/17/i-almost-forgot-buffs-make-everything-better-great-comfort-item-bufflife/</link>
      <pubDate>Thu, 17 Sep 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/09/17/i-almost-forgot-buffs-make-everything-better-great-comfort-item-bufflife/</guid>
      <description>&lt;p&gt;So, In my list of items in my kit (
&lt;a href=&#34;http://masukomi.posterous.com/write-up-on-my-kit-the-things-that-worked-and&#34;&gt;http://masukomi.posterous.com/write-up-on-my-kit-the-things-that-worked-and&lt;/a&gt;
) I totally forgot to mention my Buffs. This is most likely due to the
fact that I wear them every day anyway so I don&amp;rsquo;t really think about
them much.&lt;/p&gt;
&lt;p&gt;One around the neck. Kept it from getting to chilly and I &lt;em&gt;hate&lt;/em&gt; the
feeling of those tiny bugs that seem to manage to ping off your throat
from time to time. 70 mph mosquito impact on an exposed throat is not a
pleasant feeling. On the cold wet day when I was driving through a cloud
I swapped it for a polar buff. As expected, it was perfect.&lt;/p&gt;
&lt;p&gt;One over my hair, well, most of my hair. It kept stray strands from
sneaking out and annoying my eyes when I put the helmet on, or while
driving down the road. Also, made it possible to move in the tiny
one-skinny-person tent, because without one my nearly waist-length hair
would have been totally obscuring my vision and getting under my hands,
and generally being a pain in the ass. When I road the bottom of my hair
was shoved down into my suit because if I leave it out in the wind it
instantly turns into a mass of knots, and I forgot to pack my brush.&lt;/p&gt;
&lt;p&gt;Yes, it&amp;rsquo;s one of those inventions that seems &amp;ldquo;duh&amp;rdquo;, but so is the nail,
and yet somehow they&amp;rsquo;re both still awesome.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.buffwear.com/&#34;&gt;http://www.buffwear.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://twitter.com/BuffLife&#34;&gt;http://twitter.com/BuffLife&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I think I might get a Typhoon Buff for the next adventure&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://posterous.com&#34;&gt;Posted via email&lt;/a&gt; from &lt;a href=&#34;http://masukomi.posterous.com/i-almost-forgot-buffs-make-everything-better&#34;&gt;masukomi&amp;rsquo;s
posterous&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Write-up on my kit ~ The things that worked and didn&#39;t. ~ What I&#39;ll change next time.</title>
      <link>https://weblog.masukomi.org/2009/09/16/write-up-on-my-kit-the-things-that-worked-and-didnt-what-ill-change-next-time/</link>
      <pubDate>Thu, 17 Sep 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/09/16/write-up-on-my-kit-the-things-that-worked-and-didnt-what-ill-change-next-time/</guid>
      <description>&lt;p&gt;Some of you, mostly the motorcycle geeks reading this, will be curious
about the kit I used on the trip, what worked, and what didn&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;I laid out the initial batch of it with detailed notes on flickr (click
the image to go to flickr and see the notes) There were a number of
items added afterwards.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/masukomi/3732079769/&#34;&gt;&lt;img src=&#34;http://farm3.static.flickr.com/2547/3732079769_54f97a7afe.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;what-worked&#34;&gt;What worked:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The iPhone&lt;/strong&gt; was wicked useful but I had no service, or no data
service for so much of the time that the built in map app was
useless and I ended up buying the TomTom app since it keeps all its
maps locally. The battery life was fairly sucky though, and the
video capture is totally useless when mounted to a bike. The
vibrations make the picture look like it was shot from within a
running front-load washing machine. Listening to audio-books on it
rocked, especially when driving through mile after mile of corn and
in those hours when the sun has set, so you can&amp;rsquo;t see anything, but
you&amp;rsquo;re not tired yet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The L.L. Bean Microlight Solo tent&lt;/strong&gt; was superb. So well designed
that I was able to put it together in the dark the first time out in
the wild. I didn&amp;rsquo;t end up using it in the rain, but i think setting
up, or tearing down, any tent in the rain must suck. At least
tearing this one down can be done pretty quickly, and I did do that
in strong winds hoping to beat an approaching storm.&lt;/li&gt;
&lt;li&gt;The $2 net from bikebandit.com held everything down but would have
been mediocre at best if not for the Carabiners.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The 5 Carabiners&lt;/strong&gt; were an excellent addition to the kit. 1 at
each of the front corners of the net, plus one one each side to give
it a redundant attachment to the saddlebags and to go through the
loops at the end of the tent bag and the dry bag, so that even if
the net came loose somehow (it didn&amp;rsquo;t) the things it held down
wouldn&amp;rsquo;t go flying. For a while I put one through the handle of the
gas can to attach it to the net but I came up with a different
solution later. They also acted as a simple thing to hang my helmet
from when I went into some place to eat. I used the locking one for
that to make it a bit more difficult for a would-be thief.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The wind-up flashlight&lt;/strong&gt; was awesome and surprisingly bright.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sea To Summit Evac Dry Sac&lt;/strong&gt; (
&lt;a href=&#34;http://www.seatosummit.com/products/display/64&#34;&gt;http://www.seatosummit.com/products/display/64&lt;/a&gt;
) I got the 35 liter one and kept my sleeping bag in it. As the trip
went on more things started living there too. The clipped loop at
the top went through a carabiner to be sure it couldn&amp;rsquo;t fly off even
if I lost my net.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spork!&lt;/strong&gt; I got it because it was neat. It turned out to be totally
useful. It&amp;rsquo;s not obvious from the pics but one of the fork end&amp;rsquo;s
tines has a serrated edge to use as a knife.
&lt;a href=&#34;http://lightmyfireusa.com/spork.html&#34;&gt;http://lightmyfireusa.com/spork.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Swiss Army Knife&lt;/strong&gt;. One of those nice fat ones.&lt;/li&gt;
&lt;li&gt;Reusable ear plugs were great. Far better than the foam ones since
you don&amp;rsquo;t have to stand around waiting for them to expand in your
ears and then re-attempt if there&amp;rsquo;s still a gap. I knew this before
but using them that frequently really convinces you of the
advantage.&lt;/li&gt;
&lt;li&gt;Odwala Bars were great. I wish I could have found more when I
finally ran out. Cheap, not overly sweet, and I liked most of the
flavors.&lt;/li&gt;
&lt;li&gt;Medium bicycle hand-pump was excellent. About 20 pumps per pound of
air pressure. I rarely had to put in more than a few pounds per
tire. Don&amp;rsquo;t forget that air expands as you go up in altitude. Was
letting air out as I approached Colorado, then putting it back in as
I made my way from it.&lt;/li&gt;
&lt;li&gt;Fieldsheer Highland II suit. I thought I&amp;rsquo;d boil in it. Most of the
time though, even in 80+ degree weather, I had it zipped up all the
way with just the air vents open. In Wyoming i even put in the
winter liner. It was about 53 degrees and I was riding through the
bowels of a cloud at 70+Mph. Only real complaint was that the left
knee pad on mine is positioned too far to the right so it wouldn&amp;rsquo;t
really help me in a crash.
&lt;a href=&#34;https://weblog.masukomi.org/2008/05/03/fieldsheer-highland-ii-review&#34;&gt;https://weblog.masukomi.org/2008/05/03/fieldsheer-highland-ii-review&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The CamelBak Mule NV was excellent. The built in rain-cover worked
perfectly and having the water on my back available whenever I felt
like it made an amazing difference. It was also really nice to be
able to reach over and grab the tube to get a drink of water from it
in the middle of the night. I did have some complaints related to it
on the trip but they weren&amp;rsquo;t really failings of the Camelback. The
discomfort was more due to bike ergonomics, personal muscle
weirdness, and the weight of the water but there&amp;rsquo;s nothing you can
do about water weighing what it weighs. A camelback tank-bag would
be awesome. I&amp;rsquo;ve only seen one (knock-off brand) and it didn&amp;rsquo;t look
good.&lt;/li&gt;
&lt;li&gt;Zip-lock disposable tupperware thing (sandwich sized). I&amp;rsquo;d stick my
leftovers in this, and throw them in my CamelBak. Don&amp;rsquo;t think I
bought dinner once the entire trip thanks to this.&lt;/li&gt;
&lt;li&gt;Scala Rider Q2. It took a lot of fiddling over many days before I
finally got the speakers exactly against my ears but once I finally
did it was excellent. You&amp;rsquo;d have that problem with any set though. I
played mp3s through it with the bluetooth paired to my phone and in
standby for 3 full days (8-10 hours each) of riding on one charge
and it still had juice. People seem to be able to understand me just
fine on it when they call, although they seem oddly reluctant to
call me if they know I&amp;rsquo;m on the bike, which is sad. I would have
liked to hear from them.&lt;/li&gt;
&lt;li&gt;Pamprin. Nothing kills headaches better. Although staying hydrated
meant headaches really weren&amp;rsquo;t a problem. Pretty much only needed it
when suffering from altitude sickness as I came in to Colorado.&lt;/li&gt;
&lt;li&gt;REI sleeping bag. it was rated for 35 degrees Fahrenheit but,
sleeping naked in it, I got chilly, but not cold, in the mid forties
and low fifties. I wish there was some standard way sleeping-bag
temperatures were rated. I wouldn&amp;rsquo;t have been chilly if i was
wearing anything though. On warm nights it was a bit too much and I
ended up oscillating between too hot and too cool, trying to figure
out just how much of your body to leave exposed to balance out the
heat from the covered bits, which was complicated by not having a
pad under it which limited the number of comfortable positions.&lt;/li&gt;
&lt;li&gt;The Tour Master boot covers worked great, but I lost one, bought a
replacement pair, and then found the one I thought I&amp;rsquo;d lost.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;things-i-never-used-but-was-glad-to-have&#34;&gt;Things I never used but was glad to have:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Tire repair kit.&lt;/li&gt;
&lt;li&gt;Small roll of Duct Tape&lt;/li&gt;
&lt;li&gt;First Aid kit. I&amp;rsquo;ll be replacing it with a soft bag next time
though. The hard plastic was obnoxiously inflexible when I needed to
shove it in or pull it out of my bags to get to other things.&lt;/li&gt;
&lt;li&gt;Jumper cables&lt;/li&gt;
&lt;li&gt;Siphon&lt;/li&gt;
&lt;li&gt;Umbrella&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;things-im-unsure-about-the-value-of&#34;&gt;Things I&amp;rsquo;m unsure about the value of:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Tie Downs.
&lt;a href=&#34;http://www.bikebandit.com/bikebandit-com-premium-tie-downs-with-soft-tie-loop-pair&#34;&gt;http://www.bikebandit.com/bikebandit-com-premium-tie-downs-with-soft-tie-loop-pair&lt;/a&gt;
Theoretically these would have been useful if I&amp;rsquo;d needed to throw it
into someone&amp;rsquo;s truck bed, or maybe if it fell down a big ditch or
got stuck somehow I could have attached them to the bike and a tree
and used the little ratchet to help pull it up. Theoretically&amp;hellip;&lt;/li&gt;
&lt;li&gt;The moleskines got soaked. New rule: all paper products must live in
a dry bag. Even so, I tended to not stop riding until sunset so I
didn&amp;rsquo;t really have any time to use them before it was dark.&lt;/li&gt;
&lt;li&gt;More than 2 changes of clothes. The extra socks were great, but I
think I enjoy fresh socks more than most. Really though I only wore
2 shirts the whole time because I was smelly anyway and it&amp;rsquo;s not
like anyone saw i&amp;rsquo;d been wearing the same shirt for a week. If I got
a chance to shower at night I&amp;rsquo;d just wear the one i had on and soap
it up and rinse it out before taking it off and cleaning me. Leave
it to dry for morning. The drying by morning didn&amp;rsquo;t always pan out.&lt;/li&gt;
&lt;li&gt;iPhone RAM mount. I got it thinking i&amp;rsquo;d take video while driving. As
mentioned the vibrations made that unworkable (not the mount&amp;rsquo;s
fault). It&amp;rsquo;s decent if you&amp;rsquo;re going to use your iphone as a GPS but
if you do that you better have somewhere to plug in the phone. Plus
you can&amp;rsquo;t work an iPhone with gloves on, and you don&amp;rsquo;t want to leave
it there if it&amp;rsquo;s raining. Mostly, I didn&amp;rsquo;t use the mount and just
kept the phone in my pocket so there wasn&amp;rsquo;t a cord going out between
me and the bike. The mount was well made but ultimately kind-of
useless for an iPhone. Maybe I&amp;rsquo;ll get a camera base for it instead.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;meh&#34;&gt;Meh&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Winter Gloves. I thought I might need them in the rockies. I never
used them. I guess it depends where you&amp;rsquo;re going and when.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;things-i-wish-id-had&#34;&gt;Things I wish I&amp;rsquo;d had:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;One of those helmets with a clear visor but a slide-up tinted layer.
A couple times I ended up riding past sunset and it just wasn&amp;rsquo;t
worth digging out the clear visor and swapping it so I just rode
with the tinted visor opened up. Or, maybe a dual-sport helmet with
one of those over-hanging sun-visors that dirt-bike helmets all
have.&lt;/li&gt;
&lt;li&gt;Somewhere on the bike to plug in the phone.&lt;/li&gt;
&lt;li&gt;A real GPS system. TomTom Rider or, better yet, Garmin Zumo.&lt;/li&gt;
&lt;li&gt;Somewhere on the bike to plug in a gps.&lt;/li&gt;
&lt;li&gt;V.O.I. POV Helmet Camera.
&lt;a href=&#34;http://www.vio-pov.com/&#34;&gt;http://www.vio-pov.com/&lt;/a&gt; I am &lt;em&gt;definitely&lt;/em&gt;
getting one for my next adventure. I think it&amp;rsquo;s the only good camera
like it with an audio-in so you can have a real mic instead of just
recording wind-noise like most of them do.&lt;/li&gt;
&lt;li&gt;One of those rolls of foam padding for under your sleeping bag. Or,
better yet, one of those ones that folds into a 3D rectangle and has
an egg-carton like texture. Definitely getting one of those for next
time too. Sometimes the ground is freaking uncomfortable. I don&amp;rsquo;t
trust air mattress and you&amp;rsquo;d waste time filling and emptying them
every day&lt;/li&gt;
&lt;li&gt;zip-ties. I didn&amp;rsquo;t end up needing them but I think they&amp;rsquo;d be a
really good thing to have.&lt;/li&gt;
&lt;li&gt;A companion.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;things-that-didnt-work&#34;&gt;Things that didn&amp;rsquo;t work:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Fieldsheer Expander Saddlebags. There weren&amp;rsquo;t many options that
would work on my bike. These sagged a little farther every day and
let everything in them get damp. The rain covers are a joke. They
will try and fly off at the first opportunity. The stitching along
the main zipper started to come undone on one of them after a few
days, and that was the side with less stuff in it. The way the
zipper opens is really annoying because it well&amp;hellip; doesn&amp;rsquo;t really. I
mean, the zipper works, and there&amp;rsquo;s an opening, but it&amp;rsquo;s like trying
to pack a suitcase through the end of a manilla envelope. Also, it&amp;rsquo;s
not at all obvious what they expect you to do with some of the
pieces it comes with, they don&amp;rsquo;t provide a manual, and when I
e-mailed them the pdf manual they sent me was only semi-helpful.
Also, it was missing one rain-cover when it came from the factory,
which turned out to be not much of a loss since they don&amp;rsquo;t want to
stay on anyway. Fieldsheer did end up sending me a replacement for
the missing one though. So, yay customer service. Also, while it was
easy to lock them to my bike via a bicycle cable-lock, and I rarely
needed to take them off, I never felt my belongings were really safe
from prying hands (not that there were any). Next time I&amp;rsquo;m going
with aluminum panniers. It just wasn&amp;rsquo;t an option on this bike
though. To be honest, the saddlebags didn&amp;rsquo;t suck. They were
mediocre. If I had to use them again I&amp;rsquo;d put down a piece of hard
plastic across the bottom to keep them from sagging in the middle.&lt;/li&gt;
&lt;li&gt;Trailer Life Directory RV Road Atlas. The map indicates what towns
have campgrounds / rv parks near them, but then you have to go to
the index in the back to see what&amp;rsquo;s there, and there&amp;rsquo;s no phone
number, address or anything else for any of them. So, you know
they&amp;rsquo;re around there somewhere but that&amp;rsquo;s about it. Without the
iPhone to look them up i&amp;rsquo;d have been screwed. Also, pages started
falling out the second time I opened it, in the end I decided that
was a good thing because I just started ripping out the page(s) for
the current day&amp;rsquo;s state(s) in the morning. And it is unexpectedly
huge. God what a piece of crap.&lt;/li&gt;
&lt;li&gt;Energizer Energi to go iPod charger. Totally useless piece of crap.
Maybe it works better on iPods, but it&amp;rsquo;s crap with an iPhone 3Gs. It
would charge for a minute, then the voltage seemed to fluctuate and
the phone would claim it was incompatible, then it would charge,
then it wouldn&amp;rsquo;t. Each time it switched to wouldn&amp;rsquo;t it would wake
the phone and waste it&amp;rsquo;s battery. It drained more power than it
gave. Only worked well once.&lt;/li&gt;
&lt;li&gt;The Aerostar GP Plus gloves stayed at home, and I&amp;rsquo;m about to put
them on Craigslist. I thought they&amp;rsquo;d become more comfortable once I
broke them in, and while they did slightly, they were never
comfortable enough for a long ride. Instead I went with my no-name
&amp;ldquo;Backup Gloves&amp;rdquo; which are just leather, some foam padding across the
knuckles and kevlar across the palm. They&amp;rsquo;re no good at dampening
vibration, and after riding through the pouring rain I was able to
clench my fists and watch a stream of water squeeze forth from each
one.&lt;/li&gt;
&lt;li&gt;Unable to find some overgloves I got a pair of Joe Rocket Ballistic
6.0 waterproof gloves which I ended up hating. They had an inner
glove that was essentially free floating and would bunch up at the
finger tips, and make it hard to get your fingers to slide into the
right holes when putting it on, and a nightmare if your hands were
already damp. To make matters worse, they only kept me mostly dry.
My hands still ended up feeling slightly damp.&lt;/li&gt;
&lt;li&gt;Aerostar GP Plus gloves. Too uncomfortable. Left them at home&lt;/li&gt;
&lt;li&gt;Knox Gilete Air back protector. Too bulky. Would have been a pain in
the butt, hot, and unpackable. Went with the CE back armor built
into my suit instead.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;things-ill-do-differently-next-time&#34;&gt;Things I&amp;rsquo;ll do differently next time:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Two Piece suit instead of a one piece. I&amp;rsquo;m thinking about the
Aerostitch Darien.&lt;/li&gt;
&lt;li&gt;Metal Panniers instead of textile.&lt;/li&gt;
&lt;li&gt;More waterproofing (dry sacks inside the panniers probably).&lt;/li&gt;
&lt;li&gt;Take the time to wire in some sort of power outlet if the bike
doesn&amp;rsquo;t have one.&lt;/li&gt;
&lt;li&gt;Get a Garmin GPS.&lt;/li&gt;
&lt;li&gt;Get a different bike.&lt;/li&gt;
&lt;li&gt;Get a better map.&lt;/li&gt;
&lt;li&gt;Get better gloves (and some waterproof overgloves).&lt;/li&gt;
&lt;li&gt;Find a bigger challenge. Africa&amp;rsquo;s looking better by the day.&lt;/li&gt;
&lt;li&gt;Find a companion&amp;hellip; I hope.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Curious about what worked and what didn&amp;rsquo;t in my trip from
Boston to the southern tip of South America? We put together
&lt;a href=&#34;http://www.corporaterunaways.com/2011/04/07/what-worked-and-what-didnt-a-gear-review/&#34;&gt;a huge gear review&lt;/a&gt;
after that trip too.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The unexpected: ~ Sometimes it is a grand thing ~ Sometimes it&#39;s simple</title>
      <link>https://weblog.masukomi.org/2009/09/14/the-unexpected-sometimes-it-is-a-grand-thing-sometimes-its-simple/</link>
      <pubDate>Tue, 15 Sep 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/09/14/the-unexpected-sometimes-it-is-a-grand-thing-sometimes-its-simple/</guid>
      <description>&lt;p&gt;I thought it would be a Grand Adventure. Something I would return from
with tales of interesting events and intriguing sights. But it wasn&amp;rsquo;t
like that at all. In fact, there wasn&amp;rsquo;t a whole lot to report on, on a
day to day basis. I&amp;rsquo;d kind-of bemoaned that about Lois Price&amp;rsquo;s books. I
enjoyed them, but it felt a bit like she&amp;rsquo;d left out so much. She&amp;rsquo;d cross
entire countries only mentioning their existence in passing. &amp;ldquo;How could
she leave out so much?!&amp;rdquo; I thought. It just doesn&amp;rsquo;t make any sense until
you have a long adventure of your own that you understand. It&amp;rsquo;s the
simple fact, that for the most part, not much happens on a motorcycle
adventure, at least, not while things are going according to plan.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not that they&amp;rsquo;re boring, or uninteresting. It&amp;rsquo;s just that, unless
something goes wrong, the vast majority of the time you spend on one is
spent sitting in a saddle watching the landscape go by. I rode over
mountains, through canyons, and clouds, and buffalo. And while I took
lots of pictures of many the many interesting things, in the end,
they&amp;rsquo;re essentially a collection of landscapes.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/masukomi/3894569234/&#34;&gt;&lt;img src=&#34;http://farm4.static.flickr.com/3518/3894569234_068301ac42.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For a while now I&amp;rsquo;ve been intrigued by the adventures put on by The
Adventurists (
&lt;a href=&#34;http://www.theadventurists.com&#34;&gt;http://www.theadventurists.com&lt;/a&gt; ). One
thing they emphasize on all of them is using vehicles that are wholly
inappropriate for the task, and providing absolutely no support should
your vehicle break down. On the page for their Rickshaw Run they write,
&amp;ldquo;Support? Of course we don&amp;rsquo;t provide any support. The Rickshaw Run is
supposed to be an adventure. What sort of adventure would you have if we
were following you in a truck with spare parts and a comfy bed. No, no
we must get out there into the world and get stuck in. When you&amp;rsquo;re
stuck, lost, and up a certain creek without a rowing implement is when
you start to have fun - and the last thing we want to do is stop you
having fun! If you want a full support crew there&amp;rsquo;s a very nice place
called Butlins based in Bognor Regis.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;What I&amp;rsquo;ve learned now, is that they are 100% correct. I look back at my
journey and realize that the most &amp;ldquo;interesting&amp;rdquo; parts of it, when I was
actually faced with serious choices and events, were when things went
wrong, or when things were anything but smooth. I loved taking my
absurdly laden street bike up a dirt road through the rockies at
elevations far above my carburetor&amp;rsquo;s tuning, with the very serious
possibility, and near instance, of being crushed between truck and stone
as they came flying around a blind canyon curves with no room to spare,
or falling over the side of the cliff to my doom, but that just proves
their point.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/masukomi/3893786107/&#34;&gt;&lt;img src=&#34;http://farm3.static.flickr.com/2438/3893786107_652aa81815.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;http://www.flickr.com/photos/masukomi/3894572658/&#34;&gt;&lt;img src=&#34;http://farm3.static.flickr.com/2637/3894572658_4f085e1464.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I loved going through the Black Hills National Park. I was astounded by
the beauty of it, but I&amp;rsquo;ll never forget riding through the middle of
three buffalo herds on a motorcycle that always put them on edge, or
seeing one running in a direction that seemed to be very much towards
me. I loved the Badlands, but it was made forty times better by the fact
that I could barely keep my bike upright at times on the very gravely
road, that I had to ride most of it in the wrong lane, and when a car
came towards me I had to slow to a near stop to cross over the eight
inch mounds of loose gravel that my street tires were woefully
unequipped to handle.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/masukomi/3893780159/&#34;&gt;&lt;img src=&#34;http://farm4.static.flickr.com/3294/3893780159_066b8be67f.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;http://www.flickr.com/photos/masukomi/3894569456/&#34;&gt;&lt;img src=&#34;http://farm3.static.flickr.com/2632/3894569456_51b6e6ebcc.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;http://www.flickr.com/photos/masukomi/3894569378/&#34;&gt;&lt;img src=&#34;http://farm4.static.flickr.com/3442/3894569378_ccfa1ed759.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;http://www.flickr.com/photos/masukomi/3894569234/&#34;&gt;&lt;img src=&#34;http://farm4.static.flickr.com/3518/3894569234_068301ac42.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I loved driving a hundred and fifty miles through empty lands and towns
so small that the idea of anything as useful as a gas station was
absolutely laughable, wondering if it would see a gas station before I
ran out, thinking gratefully about that spare gallon and a half strapped
to the rear seat.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/masukomi/3900989466/&#34;&gt;&lt;img src=&#34;http://farm4.static.flickr.com/3420/3900989466_b8c9e58806.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I look back at Lois&amp;rsquo;s books now and understand why they&amp;rsquo;re the way they
are, because while I may have ridden through nearly four thousand miles
of farmland there&amp;rsquo;s not a lot to tell you about it. How much does anyone
want to hear about four thousand miles of corn, sunflowers, and random
green things I can&amp;rsquo;t identify? Kansas was great, but the most noteworthy
moment was when I pulled off the road to eat lunch near some grain
silos, and watched two men come out from them to watch me eating a few
hundred yards away.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/masukomi/3894042240/&#34;&gt;&lt;img src=&#34;http://farm3.static.flickr.com/2514/3894042240_bde0f646ce.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;http://www.flickr.com/photos/masukomi/3894112546/&#34;&gt;&lt;img src=&#34;http://farm3.static.flickr.com/2593/3894112546_e6e0145d3d.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;But, you can&amp;rsquo;t leave it at that. To do so would imply that more mundane
bits spent riding between the complications are somehow unimportant, or
not worth the time. But it is. I wrote before about how your motorcycle
becomes home (
&lt;a href=&#34;http://masukomi.posterous.com/today-was-the-last-it-started-off-in-a-cloud&#34;&gt;http://masukomi.posterous.com/today-was-the-last-it-started-off-in-a-cloud&lt;/a&gt;
) in a very real sense, not just because you have nowhere else to go.
There&amp;rsquo;s something incredible about climbing onto a saddle that&amp;rsquo;s also
your home and setting off on unknown roads. Especially on a motorcycle.&lt;/p&gt;
&lt;p&gt;Ted Simon, who wrote Jupiter&amp;rsquo;s Travels, said &amp;ldquo;I think the motorcycle is
best because it puts you so much more in contact with everything. You
experience much more closely the nature of the terrain and can almost
taste the cultures that you&amp;rsquo;re riding through. Because it exposes you to
the climate and to the wind and rain it&amp;rsquo;s a much more complete
experience.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve quoted that before, but it&amp;rsquo;s just so true. I think my trip through
Wyoming&amp;rsquo;s plains might have been pretty boring in a car. But, there&amp;rsquo;s
just such a huge difference between passing a curious windmill and
passing a curious windmill after having felt that same wind pushing
against you for hours. Racing towards the silhouetted edge of the cloud
that is itself racing along the road is neat, but doing it after riding
through the heart of its brother with water condensing and dripping from
every exposed surface, after feeling the chill wind that&amp;rsquo;s blowing
thirty five miles an hour against you, the windmill, and the cloud
you&amp;rsquo;re racing, and knowing that when you reach that edge you&amp;rsquo;ll feel the
sunlight again. Laughing with joy when you finally do&amp;hellip; Laughing
because it&amp;rsquo;s so suddenly warm, laughing because you raced a cloud,
laughing because a tumbleweed suddenly blew across your path, something
you&amp;rsquo;d only ever seen in Road-Runner cartoons and Western movies.
&amp;ldquo;Tumbleweeds don&amp;rsquo;t really go rolling across the road in front of you.&amp;rdquo;,
you thought.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;
&lt;a href=&#34;http://www.flickr.com/photos/masukomi/3893788913/&#34;&gt;&lt;img src=&#34;http://farm3.static.flickr.com/2499/3893788913_01f6fd91f8.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;http://www.flickr.com/photos/masukomi/3894575860/&#34;&gt;&lt;img src=&#34;http://farm3.static.flickr.com/2473/3894575860_f1eea6ea07.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;http://www.flickr.com/photos/masukomi/3894578388/&#34;&gt;&lt;img src=&#34;http://farm4.static.flickr.com/3507/3894578388_a76fd49a5d.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I loved sleeping in a tent, listening to the cicadas as I set it up, and
noticing they&amp;rsquo;d all gone quiet, but that the chorus of insects was
picked up by others and still going strong as I went to sleep wondering
if any of the ants that had scampered around as I pounded in tent pegs
would find a way in. Doing so wasn&amp;rsquo;t just the cheap option. It was the
*right* option. To have used a motel every night would have left me so
cut off from the world; as if the adventure were some safe video game
that you could turn off at the end of the day. Even the sterilized
campgrounds with their precisely laid out RV spots and electric hook ups
felt wrong. I kept thinking of Wan, (
&lt;a href=&#34;http://totalruckus.com/phpBB2/viewtopic.php?t=12143&#34;&gt;http://totalruckus.com/phpBB2/viewtopic.php?t=12143&lt;/a&gt;
) a Korean guy who came to the US, bought a little 50cc scooter and
circumnavigated the lower 48 states, finding places to hide his tent,
when he wasn&amp;rsquo;t shacking up with strangers from a message board. I kept
thinking that if my bike wasn&amp;rsquo;t neon green and was either light enough
to be carried when stuck, like his, or capable of real off-roading, I
would have totally done some sneak-camping too.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/masukomi/3861135704/&#34;&gt;&lt;img src=&#34;http://farm4.static.flickr.com/3450/3861135704_7e1907ba01.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I loved going three days with no electricity, every night trying to
figure out how to keep my iPhone going one more day so that I&amp;rsquo;d be able
to check the GPS if I needed to, something which would drain the battery
in an hour and a half, or record my nearly daily audio posts for you.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/masukomi/3893794165/&#34;&gt;&lt;img src=&#34;http://farm3.static.flickr.com/2440/3893794165_d3e2102cbd.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And there was something liberating about loosing my map in Iowa, and
awesome about not knowing what day it was, and later finding you were
two days off, and not knowing what state you&amp;rsquo;re in, checking the map
later and discovering you&amp;rsquo;d passed through three states in a day. I
loved how, at the end of almost every day, I&amp;rsquo;d find myself checking the
sun to see how far it was from the horizon, learning just how low it
could get before I&amp;rsquo;d be setting up camp in the dark again. &amp;ldquo;Come on&amp;hellip;
Come on&amp;hellip;. I&amp;rsquo;m not going to make it&amp;hellip;. shit I&amp;rsquo;m not going to make it.
Oh look, a campground sign! Turn! Turn!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;
I learned a lot this trip. It wasn&amp;rsquo;t the life changing experience I&amp;rsquo;d
dreamed of, but It ended up being the practice adventure I&amp;rsquo;d hoped for.
Incredibly informative, but relatively easy. Too easy to stand on it&amp;rsquo;s
own maybe. Like a bike with training wheels. It gets you from point A to
B and you&amp;rsquo;re excited to be going, but you&amp;rsquo;re not *really* riding until
you take those training wheels off. Now I know that The Adventurists are
right. &amp;ldquo;When you&amp;rsquo;re stuck, lost, and up a certain creek without a rowing
implement is when you start to have fun&amp;rdquo;. The United States are,
honestly, a bit too safe. You have to work at it to worry about gas, and
I can&amp;rsquo;t remember a road I didn&amp;rsquo;t encounter someone on fairly regularly.
To make it exciting here you have to work at it: take the Trans-America
Trail ( &lt;a href=&#34;http://www.transamtrail.com/&#34;&gt;http://www.transamtrail.com/&lt;/a&gt; ),
or make it a real challenge and take a tiny little 50cc bike like Wan.
It&amp;rsquo;s not at all surprising that when you watch Long Way &amp;lsquo;Round America,
while over 3,000 miles from Alaska to New York is one of the shortest
and least interesting pieces of the show.&lt;/p&gt;
&lt;p&gt;If that sounds anti-climactic it is, but don&amp;rsquo;t take that to mean I
didn&amp;rsquo;t have fun, that I didn&amp;rsquo;t shout a hearty &amp;ldquo;Hello Cow!&amp;rdquo; as I passed
our four footed cousins who raised their heads to watch me, that I
didn&amp;rsquo;t grin from ear to ear when I saw the Prairie Dog warning, and
remember them scampering ten feet from my wheels as I drove past a
family of them two states ago.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/masukomi/3894483014/&#34;&gt;&lt;img src=&#34;http://farm3.static.flickr.com/2552/3894483014_a594bdfd83.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Or that I even the simplest moments of beauty didn&amp;rsquo;t make me think about
higher powers.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/masukomi/3894482506/&#34;&gt;&lt;img src=&#34;http://farm3.static.flickr.com/2676/3894482506_a721009781.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;http://www.flickr.com/photos/masukomi/3891910148/&#34;&gt;&lt;img src=&#34;http://farm3.static.flickr.com/2513/3891910148_e4b22bcb2b.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t think for a moment that I would trade a moment of it for the
comforts and safety of my home, if anything I regret not going all the
way to California. And know that if this has had any impact on my life
it has been to show me that the things I want so desperately in my life
are just waiting for me to come and join them.&lt;/p&gt;
&lt;p&gt;So, who feels like riding to Mongolia with me? Cameroon?&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://posterous.com&#34;&gt;Posted via email&lt;/a&gt; from &lt;a href=&#34;http://masukomi.posterous.com/the-unexpected-sometimes-it-is-a-grand-thing&#34;&gt;masukomi&amp;rsquo;s
posterous&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>First there was the pic ~ with mention of a story ~ Now you have the words.</title>
      <link>https://weblog.masukomi.org/2009/09/14/first-there-was-the-pic-with-mention-of-a-story-now-you-have-the-words/</link>
      <pubDate>Mon, 14 Sep 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/09/14/first-there-was-the-pic-with-mention-of-a-story-now-you-have-the-words/</guid>
      <description>&lt;p&gt;It started with a thwapping on my left foot.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Thwap&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Like a thick cloth being whipped heavily across my boot.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Thwap&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;But, There&amp;rsquo;s no cloth in front of my foot&amp;hellip;&amp;rdquo; I think.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Thwap&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m imagining some impossible piece of canvas beating in the wind,
occasionally swinging around to slap across my laces.&lt;/p&gt;
&lt;p&gt;I look down. There&amp;rsquo;s a grasshopper IN my shoelaces, its whole body
wedged under them against the tongue of my boot.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;I have GOT to take a picture of THAT.&amp;rdquo; I think. &amp;ldquo;It&amp;rsquo;s not going
anywhere. I&amp;rsquo;ll do it when I pull over.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Thwap&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This time it&amp;rsquo;s the right foot.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Thwap&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Thwap&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Thwap&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I lost count eventually. A hundred? A hundred-fifty?&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Thwap&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I never saw them. I just felt them. Thwapping against my feet. It became
a sad running joke. Invisible grasshoppers jumping to their doom.&lt;/p&gt;
&lt;p&gt;I thought that would be the worst of it. Them, the few hundred small
flying things that converted themselves into little piles of winged meat
on my visor, and the occasional large flying thing which bounced off or
exploded into a large yellow stain across my eyes. I wondered why bug
guts were always yellow, until I finally hit a mosquito on its way home
from a meal. It left a small red splotch that looked remarkably like a
Scottish Terrier. I had at least a hundred miles to ponder its shape
before walking over to the gas station squeegie and attacking my
helmeted head for the third time that day.&lt;/p&gt;
&lt;p&gt;Unfortunately that wasn&amp;rsquo;t the worst of it. I killed a lot of things in
South Dakota, but I feel especially bad about the long necked water-fowl
that was sitting on the center-line. It seemed confused, as if it
couldn&amp;rsquo;t decide if it should stay there, or attempt to leave. A the last
moment it took flight, cutting directly across my path, but far enough
ahead that all would have been fine, had it not decided to change its
mind directly in front of my wheel, and attempt to turn around. A tenth
of a second? A hundredth? Just enough time for my mind to fear that the
impact, and following loss of traction as I rode up and over its body
would cause me to drop the bike, not enough to prevent the Thumping
impact followed, without noticeable delay, by a jolt to the shocks, and
then nothing until eventually&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Thwap&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I thought it was just dirt, but then I realized it was the remains of
countless South Dakotan grasshoppers.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2009/09/14/bug_guts_on_boot.jpg&#34; alt=&#34;bug guts on boot&#34;&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>I think it&#39;s dead now. ~ There&#39;s no way it&#39;s still healthy ~ It&#39;s not my fault though</title>
      <link>https://weblog.masukomi.org/2009/09/05/i-think-its-dead-now-theres-no-way-its-still-healthy-its-not-my-fault-though/</link>
      <pubDate>Sun, 06 Sep 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/09/05/i-think-its-dead-now-theres-no-way-its-still-healthy-its-not-my-fault-though/</guid>
      <description>&lt;p&gt;I forget what state I was in. Ohio maybe? I&amp;rsquo;m not sure.&lt;/p&gt;
&lt;p&gt;I was driving along, through the edges of some town when I see, for an
instant, a Monarch Butterfly.&lt;/p&gt;
&lt;p&gt;And then it hit me.&lt;br&gt;
In the chest.&lt;/p&gt;
&lt;p&gt;*whap*&lt;/p&gt;
&lt;p&gt;Then, as they weigh so very little, the force of the wind colliding with
my chest and rushing upwards pulled it along.&lt;br&gt;
Right&lt;br&gt;
up&lt;br&gt;
into&lt;br&gt;
my&lt;br&gt;
HELMET&lt;/p&gt;
&lt;p&gt;*flappityFlappityFlappity*&lt;/p&gt;
&lt;p&gt;&amp;ldquo;AAAAAAAHHH!!!!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a flapping papery thing stuck between my jaw and my helmet. IT&amp;rsquo;S
ALIVE!&lt;/p&gt;
&lt;p&gt;*flappityflappity*&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Ahhhh! Get it out! Get it out!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I start jamming my left index finger up by my chin to try and pull it
down but it&amp;rsquo;s flapping, and the wind is pushing, and it&amp;rsquo;s flapping and
it&amp;rsquo;s just going up my cheek!&lt;/p&gt;
&lt;p&gt;&amp;ldquo;AHHHHH!!!!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I pull my finger out and try to grab the edge of my visor to open it,
and it&amp;rsquo;s flapping, and it&amp;rsquo;s moving, and the wind is beating it and
there&amp;rsquo;s a truck coming and IT&amp;rsquo;S APPROACHING MY EYE!&lt;/p&gt;
&lt;p&gt;The visor is open now but it&amp;rsquo;s not helping. It&amp;rsquo;s not coming out! I start
shaking my head violently, like a Tourette&amp;rsquo;s sufferer having a bad day
at forty miles an hour until eventually, finally, I manage to fling it
out without flattening myself into the grill of the approaching pickup
truck.&lt;/p&gt;
&lt;p&gt;That was the only monarch I saw on the whole trip, and I&amp;rsquo;m pretty sure I
killed it.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Pictures from across the states</title>
      <link>https://weblog.masukomi.org/2009/09/05/pictures-from-across-the-states/</link>
      <pubDate>Sun, 06 Sep 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/09/05/pictures-from-across-the-states/</guid>
      <description>&lt;p&gt;Somewhere unknown&lt;br&gt;
&lt;a href=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/2cXECCJtpJ8elmqN0nd5LVkI2xi9cRDhr3QURmgbgk4Hpk52XCi5jdwqKQXK/photo.jpg&#34;&gt;&lt;img src=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/3vKVuM0XAq4NKURpQqrDSn9KdiSqUQI4EAtWXDzKFjMUef73a1TAtTFCJ3PT/photo.jpg.scaled.500.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Camping in Carlyle IL&lt;br&gt;
&lt;a href=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/vewJN5JWtEPRfisM3FoV3OdXSRTVQNKA0WXz8P5E1e1OaZPF7wp280iRGaxH/photo.jpg&#34;&gt;&lt;img src=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/zYTQFdSLpvmiOgwsT88i7ZXAUHTTtQ4n7fxWKemdqt1PiITe60k4bofzIbPV/photo.jpg.scaled.500.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Pics from the Sky Meadow Campground&lt;br&gt;
&lt;a href=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/ROdKBa0dBO17XF6p6XDDO6gnudDXivOZusO3fBZ6lXtTyYMBsp9MWhBDhaZ7/IMG_0999.jpg.scaled.1000.jpg&#34;&gt;&lt;img src=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/NnBqE8146vKLWgWObszCqrLXateAs0HA6ABSnUD7ZSZD0Qcsm9B3HeuINWGf/IMG_0999.jpg.scaled.500.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/2mVTHmPTDvlKDWHCD9gKk0utqri6D9AUEaKGJtpG0UC5kjSFPfLdasV9We3f/IMG_1000.jpg.scaled.1000.jpg&#34;&gt;&lt;img src=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/vxjmWu1bVpMlVmJR79Mq5Z1Os9LCVIjTds0Af9gQt6sKNSd7H9GguzxvH78l/IMG_1000.jpg.scaled.500.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/6dUHOdWVaRslk0lMQuMpWgzt2ycuVCrhlSYr9ybZt6VbVDmlh0bWiI8vn2YQ/IMG_1001.jpg.scaled.1000.jpg&#34;&gt;&lt;img src=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/eDbLECWpxDj4zJeHN4WyJNgigoA8LcskNbDNUO2erUMRQUAUnfXSykwFU3Kh/IMG_1001.jpg.scaled.500.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/FZiyzQ8HhTEPd5s11gq1Kc90v7r8K9krwDbLJIwDMjYvRwAspkhfPH4CZE1i/IMG_1002.jpg.scaled.1000.jpg&#34;&gt;&lt;img src=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/u9EVOvx5z1Jf5VmkMERryy9ZVfHbxHIbRSvF5mPZuDUQwQz0PyYswYrf3vQL/IMG_1002.jpg.scaled.500.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/YUroXzrwWFEiBNgGApjE2uYvHVQAtrWZEU7jlDdN3HJnGbpzvHqmMLRaorJd/IMG_1003.jpg.scaled.1000.jpg&#34;&gt;&lt;img src=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/DogP0PeCd2Xj4D5nllCU8pt8mlzKhmDdooNCeDYElPqDCB1o9TKcR6v2UCw9/IMG_1003.jpg.scaled.500.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Wind Turbine Blades&lt;br&gt;
&lt;a href=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/tiCtjITcZR78Etx9SAlQLbPTYd12G9TcdvcX4h5oFb8qN8XSsdAYFHd2LQPD/photo.jpg&#34;&gt;&lt;img src=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/AGoDkuelyANCvNRWuCYDjdgeCeiWr7B7Nm516T8EDx6S4FkTZmbo09xnLNt9/photo.jpg.scaled.500.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/bSGUoR7hjYCvXiSy6Irzlk1MDTcwGr4Tumoq4MTFSjYkkHWZJ3je9HDsXZPK/IMG_0155.jpg.scaled.1000.jpg&#34;&gt;&lt;img src=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/0nsD7xaodEDE7OUK8oN2mGjqa1WIobVlxN6pAuwl8uBzv7LV09IKPOwI2G1i/IMG_0155.jpg.scaled.500.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Grain Storage&lt;br&gt;
&lt;a href=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/wAKrBaInArE2nSfNbS2LJrsTmR57QhAyFEBxC6PQuVRrEQIWcmUnN60MFEEd/photo.jpg&#34;&gt;&lt;img src=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/j1enaXkRCg5IdQfY0p41CpSaBl7HYBtB3oGFNWC0AR0xQmoHqQqaEy3oDrBM/photo.jpg.scaled.500.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Murals by E. Rhodes&lt;br&gt;
&lt;a href=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/XbBSLdPbX0hmA1xfc3qNzR76rxMZULkjyYgLwsCm5WepyeVAhbbx04CQzEGi/photo.jpg&#34;&gt;&lt;img src=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/AOvV4guvKMwDDV7UCO2xd43O4MkTZFdDtbG0KJbSyxzIWVtKQ0YzQoMRCx20/photo.jpg.scaled.500.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Wyoming Plains&lt;br&gt;
&lt;a href=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/VVIzrQ2t2gDbnfBsNZiIBrrTYMzz8noU4j73XeuvEYZGoLuThmCitzxpAqNq/photo.jpg&#34;&gt;&lt;img src=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/1xRtIicRuJZOdPDM7oiAj3eSDKG63OQFwLBMF1rmKUTVg6jqBz9Zh68Nvzt9/photo.jpg.scaled.500.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Indian Springs&lt;br&gt;
&lt;a href=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/acegnaEiivwHiranPdZ1FVOb1PZwWGHLpGMuSFZXKqS7RtSqD7wuKWu60PI7/IMG_0176.jpg.scaled.1000.jpg&#34;&gt;&lt;img src=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/LZhTFSYXfxCMWkv16G4KfzUr5lZ87JfUC9PQEr3tAHDLbuE2f2e5nTl69Zlh/IMG_0176.jpg.scaled.500.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Phantom Canyon Road&amp;rsquo;s southern end&lt;br&gt;
&lt;a href=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/1kaMzLWSclVZQgPp0OnjemiV9GBFthzoUKjIDbVO55gwjMlR3hdmbG6TptTz/photo.jpg&#34;&gt;&lt;img src=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/zRSaBT29VNWP7QzVGZCnfa75SQGQCll7pxNuwTKjJEQ0UKCklpy7V0SH4YiQ/photo.jpg.scaled.500.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bug Spatter&lt;br&gt;
&lt;a href=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/n0XBTgp6gtkTAPZi5PRCgDsTG2yqTeZ8Iue4lBexFzjl4z387rFLQu7dyAy2/photo.jpg&#34;&gt;&lt;img src=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/gqhxiyYqAlzyS3jLxsqZPbyXeJnaL8E5iZm5XYCYYscDEwqUXDvqIHMwzzjF/photo.jpg.scaled.500.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Iowa Standard&lt;br&gt;
&lt;a href=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/ovJtZGMk5YNifumTEFc0zNdp2vTsUbExKhZgQFMGuaCczB2Yo3WalSdFFvpv/photo.jpg&#34;&gt;&lt;img src=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/GmvDwcBfcsEdZN6gXKpxiR8C8bQ5gZataR0C6OHY8gjKQiYKnPckfBLo8Fqp/photo.jpg.scaled.500.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;My bike in The Badlands&lt;br&gt;
&lt;a href=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/ovJtZGMk5YNifumTEFc0zNdp2vTsUbExKhZgQFMGuaCczB2Yo3WalSdFFvpv/photo.jpg&#34;&gt;&lt;img src=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/GmvDwcBfcsEdZN6gXKpxiR8C8bQ5gZataR0C6OHY8gjKQiYKnPckfBLo8Fqp/photo.jpg.scaled.500.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The final morning&lt;br&gt;
&lt;a href=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/gwFDFHnQ1URcVQt1DOCATL7WkHPuCklsKN8lQMOeJuMeHWqjsnBGlTZnMS6H/misty_road.jpg.scaled.1000.jpg&#34;&gt;&lt;img src=&#34;http://posterous.com/getfile/files.posterous.com/masukomi/Anj2P77nXhrslUXd0Lq0LpSU2pS4s4rWZVA7D42ZTIxwAZT28p4uGwO8yUZU/misty_road.jpg.scaled.500.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Today was the last ~ It started off in a cloud ~ Ended with regrets</title>
      <link>https://weblog.masukomi.org/2009/09/05/today-was-the-last-it-started-off-in-a-cloud-ended-with-regrets/</link>
      <pubDate>Sun, 06 Sep 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/09/05/today-was-the-last-it-started-off-in-a-cloud-ended-with-regrets/</guid>
      <description>&lt;p&gt;Today, my last day, started off about a third of the way across New York
in Arkport and found me riding through another cloud. This one was just
enough to shorten visibility and mist up your visor. Not like the one in
Wyoming which left everything dripping. After a while I made my way past
the hills that bounded it and found bright blue skies with sunlight
streaming down.&lt;/p&gt;
&lt;p&gt;I was excited. &amp;ldquo;I&amp;rsquo;m going home!&amp;rdquo; I thought, but the closer I got to
home, the more I didn&amp;rsquo;t want to arrive. Even taking the Mohawk Trail on
the way back through Massachusetts didn&amp;rsquo;t lift my spirits. In the end,
it just didn&amp;rsquo;t feel like a homecoming. I love seeing Boston&amp;rsquo;s skyline
come up over the horizon after being away. It&amp;rsquo;s always made me think
&amp;ldquo;ahh, home&amp;rdquo; before. Today though, I just thought&amp;hellip; &amp;ldquo;Maybe I should have
kept going to California&amp;hellip;&amp;rdquo;, and &amp;ldquo;I don&amp;rsquo;t want this to end.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I found a new home out on the road. You hear adventure riders talk about
wanting to get back &amp;ldquo;home&amp;rdquo; to their bike after they&amp;rsquo;ve been off it for a
day or two. I&amp;rsquo;d always thought that to be a sort of joke, in that, you
don&amp;rsquo;t have anywhere else to go but your bike, so it is &amp;ldquo;home&amp;rdquo; by
default. But on this ride I learned the truth of it. Your bike really
does become your home. Everywhere else is unknown and a little shaky,
but your saddle&amp;hellip; Your saddle is the place you go to feel safe and
comforted in the way that any good home does. I&amp;rsquo;d find myself looking
out at it from some random restaurant windows, just wanting to be done
with my meal so I could climb back on.&lt;/p&gt;
&lt;p&gt;A motorcycle is so much more than a &amp;ldquo;home&amp;rdquo; though. It is part of the
adventure, with a personality all its own, and calling it a &amp;ldquo;steel
horse&amp;rdquo; isn&amp;rsquo;t just poetic license. It is a metaphor that lies very close
to truth. It eats, it breathes, it has things it likes and doesn&amp;rsquo;t like
that aren&amp;rsquo;t necessarily shared by others of its breed. I really think
that a motorcycle adventure isn&amp;rsquo;t that different from a horse adventure,
except that a motorcycle is so much better at devouring the miles.&lt;/p&gt;
&lt;p&gt;I imagine that once upon a time there were men who set out west on their
horses, not so much for the promise of gold or new land to call their
own, but because they could. Because there were new things to be seen,
new places to go.&lt;/p&gt;
&lt;p&gt;For a while I was like them: seeing new things, exploring new places,
sleeping on ground that wasn&amp;rsquo;t always soft, starting each day by packing
your saddlebags and throwing your sleeping gear over your horses back.
Now I&amp;rsquo;m back at my house with it&amp;rsquo;s big plasma TV screen and soft
cushions, and I&amp;rsquo;m not convinced it&amp;rsquo;s an improvement. I look at shelves
of books, video games, electronic boxes and wonder &amp;ldquo;why do I need all
this?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I was riding through clouds in Wyoming, and New York. I saw tumbleweeds
crossing before me, and windmills bringing water for cows. I watched the
lush beauty of the Black Hills turn to the bleak death of the Badlands
in a matter of hours. I drove past two miles of abandoned boxcars, and
made my bed to the sound of cicadas instead of Chevrolets. I watched my
black gloves bleach a yellow-grey in the sun. And I am not at all
convinced that this soft couch is an improvement&amp;hellip;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>An evil bathroom ~ Did The Joker design it? ~ I&#39;m greatly displeased</title>
      <link>https://weblog.masukomi.org/2009/09/02/an-evil-bathroom-did-the-joker-design-it-im-greatly-displeased/</link>
      <pubDate>Thu, 03 Sep 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/09/02/an-evil-bathroom-did-the-joker-design-it-im-greatly-displeased/</guid>
      <description>&lt;p&gt;I walk in and the light snaps on. The stalls resemble small concrete
torture rooms where you can easily wash down the blood. I&amp;rsquo;m about to sit
when the light snaps off. &amp;ldquo;WTF?! Was there a switch I missed?&amp;rdquo; I start
to move and they snap back on. No switch by the door. &amp;ldquo;This does not
bode well.&amp;rdquo; The lights are on a timer. It is set to approximately 15
seconds after movement stops. It doesn&amp;rsquo;t notice you on the toilet. Every
fifteen seconds the lights snap off and you have to wave your arms in
the air to make them come back on.&lt;/p&gt;
&lt;p&gt;On the up side: most interesting poo I&amp;rsquo;ve had in years. :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>A compromise reached ~ Colorado will be it ~ Barring surprises</title>
      <link>https://weblog.masukomi.org/2009/08/26/a-compromise-reached-colorado-will-be-it-barring-surprises/</link>
      <pubDate>Thu, 27 Aug 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/08/26/a-compromise-reached-colorado-will-be-it-barring-surprises/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve reached a compromise with myself.&lt;/p&gt;
&lt;p&gt;Turning around at the first sign of trouble really isn&amp;rsquo;t me. And,
while really annoying and unsettling, the starter issue isn&amp;rsquo;t a
killer. If it happens again I&amp;rsquo;ll stop at the next Kawasaki dealer I
pass. I&amp;rsquo;m still not happy about driving with an iffy bike though. And,
I&amp;rsquo;m still not sure that this trip is really giving me what I want for
the reasons I gave yesterday. But stopping here in the middle of a
non-destination, that would suck. &amp;ldquo;Yes, I drove to nowhere special and
turned around.&amp;rdquo; That just doesn&amp;rsquo;t work for me.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s an interesting road that I&amp;rsquo;ve been looking forward to checking
out in Colorado that&amp;rsquo;s about a day and a half&amp;rsquo;s drive away. It&amp;rsquo;s in
the middle of the Rockies and I think it will be a great experience,
even if my bike isn&amp;rsquo;t really suited for dirt roads. it&amp;rsquo;s also involves
heading north off of 50 for a little ways. So, why not make *that* the
turning point?&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m actually happy that I&amp;rsquo;ve had this problem. It reminds me of the
comment we&amp;rsquo;ve probably all heard a hundred times, that the interesting
stuff always happens at the edges. That adventure isn&amp;rsquo;t what happens
when things all go smoothly, but when the unexpected rears its head,
when we are tested. And while it sucked at the time, breaking down,
getting soaked and sitting here with damp clothes spread around the
room as I take the motel&amp;rsquo;s hair dryer to them every hour or so is the
most interesting thing since West Virginia. :)&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a campground in the middle of that interesting Colorado road
where I think I&amp;rsquo;ll stay in 2 nights, before making my way back:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://maps.google.com/maps?f=q&amp;amp;source=s_q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=3257+CO-67+Penrose,+CO+81240&amp;amp;sll=38.514594,-105.103626&amp;amp;sspn=0.034519,0.076904&amp;amp;ie=UTF8&amp;amp;ll=38.53635,-105.078392&amp;amp;spn=0.138035,0.307617&amp;amp;lci=com.panoramio.all&amp;amp;source=embed&#34;&gt;View Larger
Map&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Everything I have ~ All spread out around the room ~ Trying to dry out</title>
      <link>https://weblog.masukomi.org/2009/08/26/everything-i-have-all-spread-out-around-the-room-trying-to-dry-out/</link>
      <pubDate>Wed, 26 Aug 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/08/26/everything-i-have-all-spread-out-around-the-room-trying-to-dry-out/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;Pants - wet&lt;/li&gt;
&lt;li&gt;Spare pants - wet&lt;/li&gt;
&lt;li&gt;Boots - wet&lt;/li&gt;
&lt;li&gt;Sneakers - wet&lt;/li&gt;
&lt;li&gt;Socks - wet&lt;/li&gt;
&lt;li&gt;Spare socks - wet&lt;/li&gt;
&lt;li&gt;Shirt - wet&lt;/li&gt;
&lt;li&gt;Spare Shirts - wet&lt;/li&gt;
&lt;li&gt;Atlas - wet&lt;/li&gt;
&lt;li&gt;Moleskines - wet&lt;/li&gt;
&lt;li&gt;Waterproof pocket - wet&lt;/li&gt;
&lt;li&gt;Towel - wet&lt;/li&gt;
&lt;li&gt;Waterproof motorcycle suit -wet&lt;/li&gt;
&lt;li&gt;Tent - wet, but was expecting that&lt;/li&gt;
&lt;li&gt;Sleeping bag - DRY&lt;/li&gt;
&lt;li&gt;Electronics - oddly DRY&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Partially this is my fault:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I didn&amp;rsquo;t close the air vents on my suit, so water got in, although
that doesn&amp;rsquo;t explain why my legs were 100% soaked.&lt;/li&gt;
&lt;li&gt;I didn&amp;rsquo;t remember the rain cover on the Camelback until it was wet&lt;/li&gt;
&lt;li&gt;I didn&amp;rsquo;t think about putting on my rain booties to keep my feet dry.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Everything in the saddlebags is some degree of wet because the
waterproofing on them is crap and the &amp;ldquo;Rain Cover&amp;rdquo; attempted to commit
suicide the first time I tried to use it, and would have succeeded if
I hadn&amp;rsquo;t thrown its drawstring through a carabiner &amp;ldquo;just in case&amp;rdquo;
before setting off. The gas can tried the same thing once but failed
because I put it&amp;rsquo;s handle through a carabener too.&lt;/p&gt;
&lt;p&gt;The sleeping bag is dry because it&amp;rsquo;s in a dry-sack. Can you imagine
how hard it would be to dry out a soaked sleeping bag?&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve holed up in a Days Inn. Pasta WILL be ordered from Pizza Hut this
time. I haven&amp;rsquo;t eaten since the leftover breakfast I ate at 2:00 PM
yesterday and a couple protein bars last night. After getting soaked
on the way to the motorcycle shop I decided, &amp;ldquo;fuck it. I can&amp;rsquo;t get any
wetter. Let&amp;rsquo;s keep going.&amp;rdquo; That lasted about 40 miles before I my
stressing about if I should continue west or not with this whack
starter combined with the chilly wetness and feeling a semi blow me
four feet to the right when it passed because the water was so thick
the tires were&amp;rsquo;n&amp;rsquo;t gripping well.&lt;/p&gt;
&lt;p&gt;I have the rest of today and tonight to decide which direction to head
tomorrow. It&amp;rsquo;s not just the whack starter, although i really don&amp;rsquo;t
want to continue if it starts up again and I can&amp;rsquo;t fix it. It&amp;rsquo;s that
I&amp;rsquo;m starting to question if what I&amp;rsquo;m getting from this trip is really
what I was hoping for. If it were all like West Virginia I&amp;rsquo;d say yes.
But, it&amp;rsquo;s not. There&amp;rsquo;s a lot of straight flat through the middle of
this country, and I was expecting that. It&amp;rsquo;s just that I spend all day
driving, get in with *maybe* an hour to spare before dark, have to set&lt;/p&gt;
&lt;p&gt;up camp, have a mediocre sleep in my tent, tear down camp, and start
again.&lt;/p&gt;
&lt;p&gt;Without someone to share this with it&amp;rsquo;s a bit too much like work,
especially through states like Missouri. There&amp;rsquo;s no time at the end of
the day to stop and enjoy before going to bed. And, I miss having
someone to talk to. I&amp;rsquo;m not a very social person in Day to Day life,
but this trip has made me realize that I actually do talk to my
friends a fair bit online, and while I don&amp;rsquo;t have human physical
contact, I do have Bandido, and while it&amp;rsquo;s not the same, it is still
contact with another living creature I love, who loves me in return. I
really miss him. I miss weekend afternoons when we curl up on the
couch together and take a nap.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s also the fact that I&amp;rsquo;m doing this in the US. There&amp;rsquo;s not much
that&amp;rsquo;s different here. It&amp;rsquo;s just, more of the same. I&amp;rsquo;m sure the
Rockies will be great but when I pass a town it&amp;rsquo;s just another town
that&amp;rsquo;s roughly analgous to all the other towns I&amp;rsquo;ve passed through in
my life. Very few of them are actually interesting to look at. Many of
them are just depressing in their vinyl sided sameness. The
Trans-American Trail (
&lt;a href=&#34;http://www.transamtrail.com/&#34;&gt;http://www.transamtrail.com/&lt;/a&gt; ) would
probably
be very interesting, but again I think I need company. The Scooter
Cannonball Run (
&lt;a href=&#34;http://www.scootercannonball.com/&#34;&gt;http://www.scootercannonball.com/&lt;/a&gt; )
would also be
interesting, because even though you&amp;rsquo;re going through more of the same
US places, you&amp;rsquo;re doing it with others in a friendly competition where
every day ends with a big social meal and banter ( hopefully witty ).&lt;/p&gt;
&lt;p&gt;So yeah, I&amp;rsquo;m seriously thinking about coming back. Next time I&amp;rsquo;m
either going somewhere very different from here (India, Vietnam, etc.)
with a friend, or doing a rally like the Scooter Cannonball Run, or
maybe hijacking a friend for one of the great adventures offered by
The Adventurists (
&lt;a href=&#34;http://www.theadventurists.com/&#34;&gt;http://www.theadventurists.com/&lt;/a&gt; ).&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Some complications ~ Starter is on the fritz now ~ Need a mechanic</title>
      <link>https://weblog.masukomi.org/2009/08/25/some-complications-starter-is-on-the-fritz-now-need-a-mechanic/</link>
      <pubDate>Wed, 26 Aug 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/08/25/some-complications-starter-is-on-the-fritz-now-need-a-mechanic/</guid>
      <description>&lt;p&gt;I hate Missouri. Unfortunately, it hates me back.&lt;/p&gt;
&lt;p&gt;It was getting late but I just wanted to get the fuck out of Missouri.
I could have stopped for gas but I was all &amp;ldquo;No, I&amp;rsquo;ve got another 20
miles before i need to look. Let&amp;rsquo;s get out of this state!&amp;rdquo;
Unfortunately I&amp;rsquo;d forgotten that Missouri has notably higher speed
limits than all the previous states, which means I&amp;rsquo;d been going
notably faster and, it turns out it shortened my range by about 40
miles. My bike doesn&amp;rsquo;t have a fuel gauge, or even a fuel light. So,
when it first ran out a few miles before escaping Missouri&amp;rsquo;s grasp, I
didn&amp;rsquo;t think &amp;ldquo;oh, switch to reserve, find a gas station&amp;rdquo; I thought
&amp;ldquo;WTF?!&amp;rdquo; but after a minute on the side of the road I figured it out,
and threw the gas from my gas can into the tank. &amp;ldquo;Problem solved.&amp;rdquo; I
thought.&lt;/p&gt;
&lt;p&gt;But no. It wouldn&amp;rsquo;t start.&lt;/p&gt;
&lt;p&gt;You see, my bike has this weirdness that&amp;rsquo;s somehow related to the many
newb &amp;ldquo;safety features&amp;rdquo; that are currently driving me nuts. One of them
is, if you have it in gear, or put it in gear, and the kickstand is
down, it&amp;rsquo;ll stall the engine, so that you don&amp;rsquo;t drive with your
kickstand. Unfortunately, I tend to pull to a stop, hold the clutch
while still in first, then put down the kickstand&amp;hellip; and stall the
engine. This wouldn&amp;rsquo;t be a big deal, except it never starts after I
do this. Push the starter button and nothing happens. So, you have to
push start it. Essentially you push 400+ pounds of bike, gear, and
fuel to a run, or at least a trot, throw it in gear, and hit the
starter. Except I couldn&amp;rsquo;t get it to go.&lt;/p&gt;
&lt;p&gt;Eventually this nice Army guy (Chris) I think, pulls over and gives me
a hand. Long story short. We get it going, but end up doing it via a
jump instead of a push (more newb safety features made us miserable).
Chris says, everyone&amp;rsquo;s closed now, but I know this guy who&amp;rsquo;s probably
still at his shop. We look it up on the phone, and off I go to see if
he can do something about this bullshit. I miss it twice, but
eventually get there.&lt;/p&gt;
&lt;p&gt;He says, it&amp;rsquo;s this, this, or this, but I don&amp;rsquo;t have the parts and
we&amp;rsquo;re about to go home, but this button on the kick stand sensor tends
to get out of adjustment so let me twiddle it and see if that helps.
So he does, and it doesn&amp;rsquo;t. The bike won&amp;rsquo;t start even though I didn&amp;rsquo;t
fuck it up. Then, 5 minutes later on of his helpers tries starting it
for the hell of it and it does. We decide I should just go to the next
Kawasaki dealer tomorrow, tell him what the guy told me, and get them
to fix it because they&amp;rsquo;ll have the parts, probably. So, I set off,
except, it won&amp;rsquo;t start. But I manage to push start it.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve turned it off twice since then, being very careful not to fuck up
the kick stand thing, and neither time has it started. The second time
was at the &amp;ldquo;American Motel&amp;rdquo; $44.95 (and up) per night, except tonight
when it&amp;rsquo;s $49.95 (and up) + $5 that you&amp;rsquo;ll get back at checkout. Grr.
I decided, that fuck a campground, I need internet, so I can more
easily find the nearest Kawasaki dealer and download TomTom for the
phone (can&amp;rsquo;t do it over edge or 3G) because AT&amp;amp;T sucks and sometimes
it simply can&amp;rsquo;t get maps even though it has edge connection, and I
rarely ever see 3G connections. I&amp;rsquo;m getting TomTom because it has the
maps locally so that solves that problem, and I have had like 3
occasions now where I&amp;rsquo;m really close to something but need directions
to get there and not miss it.&lt;/p&gt;
&lt;p&gt;So, bike on the fritz, I&amp;rsquo;ll try and unadjust whatever he adjusted
yesterday. Maybe that&amp;rsquo;ll get it back to its previous state, or maybe
something is just dying. If I can&amp;rsquo;t get it started in the morning
(should be able to there&amp;rsquo;s a nice little slope in the driveway here) I
may just say fuck it, and have it towed to the nearest dealer.&lt;/p&gt;
&lt;p&gt;In summary:
Fucking Newb Protection Systems.
Next time I&amp;rsquo;m doing this on an effing BMW if I can.
Army dudes rock.
Missouri sucks.
Don&amp;rsquo;t let non-Kawasaki motorcycle dudes fuck with your Kawasaki.&lt;/p&gt;
&lt;p&gt;Also, I&amp;rsquo;m hungry. I could order Pizza Hut to my room but I really
don&amp;rsquo;t want it for some reason. I&amp;rsquo;ll have to make do with Odwalla Bars
&amp;rsquo;till morning&amp;hellip;.maybe&amp;hellip; i may give in and get Pizza Hut.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://posterous.com&#34;&gt;Posted via email&lt;/a&gt; from &lt;a href=&#34;http://masukomi.posterous.com/some-complications-starter-is-on-the-fritz-no&#34;&gt;masukomi&amp;rsquo;s
posterous&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>A map of the ride ~ Twisties, beauty, and some slab. ~ It had all of it.</title>
      <link>https://weblog.masukomi.org/2009/08/10/a-map-of-the-ride-twisties-beauty-and-some-slab-it-had-all-of-it/</link>
      <pubDate>Mon, 10 Aug 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/08/10/a-map-of-the-ride-twisties-beauty-and-some-slab-it-had-all-of-it/</guid>
      <description>&lt;p&gt;A map, for those of you who are curious where I went. The bottom left corner of the triangle, in Massachusetts. That&amp;rsquo;s the place you want to go. Effing gorgeous, at least this time of the year and lots of great winding roads as you approach Florida MA.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://maps.google.com/maps?f=d&amp;amp;source=s_d&amp;amp;saddr=Unknown+road&amp;amp;daddr=MA-2/Mohawk+Trail+to:US-4/US+Route+4+to:42.409263,-71.100769&amp;amp;geocode=Fb3xhgIdAXbC-w;FXCUigId4han-w;FRhGmgId-Meo-w;&amp;amp;hl=en&amp;amp;gl=us&amp;amp;mra=dme&amp;amp;mrcr=1&amp;amp;mrsp=3&amp;amp;sz=9&amp;amp;via=1&amp;amp;sll=42.542963,-71.213379&amp;amp;sspn=1.141308,2.70813&amp;amp;ie=UTF8&amp;amp;ll=42.88804,-71.938477&amp;amp;spn=2.269944,5.41626&amp;amp;source=embed&#34;&gt;View Larger
Map&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>For those of you who don&#39;t &#34;get&#34; Twitter</title>
      <link>https://weblog.masukomi.org/2009/07/15/for-those-of-you-who-dont-get-twitter/</link>
      <pubDate>Wed, 15 Jul 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/07/15/for-those-of-you-who-dont-get-twitter/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s the little things that bind friendships closer. That quirky look on
his face as he tells you about the bug that landed on his finger. The
fact that in the middle of your phone call he suddenly stopped and
calmly said, &amp;ldquo;the cat just horked on my foot.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t love you because
of the valuable information you tell me. I love you because of all the
other things you tell me.&lt;/p&gt;
&lt;p&gt;When we call each other on the phone we ask
what&amp;rsquo;s been going on and we don&amp;rsquo;t just want to know about meetings or
&amp;ldquo;important&amp;rdquo; things, we want to hear you excitedly talk about that new
band you just discovered, or how your girlfriend dyed her hair green
&amp;ldquo;because she likes hippos&amp;rdquo; and how you still don&amp;rsquo;t have a clue what that
means.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t care what you had for breakfast, but I love to hear that
you &amp;ldquo;&amp;hellip;just had the most awesome waffles EVAR&amp;rdquo;&lt;/p&gt;
&lt;p&gt;There are so many little
moments like this that fill up our lives. Moments that are odd to relate
later. Imagine you&amp;rsquo;re on the phone with that friend, &amp;ldquo;A bug landed on my
finger yesterday&amp;rdquo;&amp;hellip;. what do you say to that? When it happened it would
have been a curious oddity. The next day it&amp;rsquo;s&amp;hellip; just &amp;ldquo;um&amp;hellip; ok&amp;hellip;.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;These are the reasons you should care about Twitter. To share those
little thoughts that make you you, and make your friends enjoy hanging
with you. The little things that bind friendships together. You don&amp;rsquo;t
necessarily expect anyone to respond to your comment about awesome
waffles either, and it doesn&amp;rsquo;t matter if anyone does, because you&amp;rsquo;ve
shared with the people who care about you, or find you interesting, and
they&amp;rsquo;ll do the same.&lt;/p&gt;
&lt;p&gt;Twitter lets us share these little things with each
other without making our friends stop and respond to us immediately in
IM. But, there&amp;rsquo;s a flaw&amp;hellip; initially Twitter is this website where you
go occasionally and see all those little thoughts too late&amp;hellip; If you
load the web page daily the curious bug landing has already turned into
&amp;ldquo;um&amp;hellip; ok&amp;hellip;&amp;rdquo; But, using one of the many excellent apps for your desktop
or phone changes everything.&lt;/p&gt;
&lt;p&gt;Now when your friend mentions that their
cat horked on their foot you know about it immediately just like it was
an IM and can shake your head at their continued bad luck, or comment
that your cat did the same thing last week&amp;hellip; Now it&amp;rsquo;s not a collection
of odd comments with no real value. Now, it&amp;rsquo;s a real-time window into
the lives of your friends and the people who interest you.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Relative Positioning Imagery for Linguists #2</title>
      <link>https://weblog.masukomi.org/2009/06/22/relative-positioning-imagery-for-linguists-2/</link>
      <pubDate>Tue, 23 Jun 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/06/22/relative-positioning-imagery-for-linguists-2/</guid>
      <description>&lt;p&gt;The second in a series of graphics for linguists and conlang makers to use as visual aids
in describing relative positioning and prepositions. The first is
&lt;a href=&#34;https://weblog.masukomi.org/2009/06/21/relative-positioning-imagery-for-linguists&#34;&gt;here&lt;/a&gt;.
This work by &lt;a href=&#34;http://www.masukomi.org&#34;&gt;http://www.masukomi.org&lt;/a&gt; is
licensed under a &lt;a href=&#34;http://creativecommons.org/licenses/by-nc-sa/3.0/us/&#34;&gt;Creative Commons Attribution-Noncommercial-Share Alike
3.0 United States
License&lt;/a&gt;. PDF
version: &lt;a href=&#34;http://www.masukomi.org/language_graphics/language_2_with_text.pdf&#34;&gt;with
text&lt;/a&gt;,
and &lt;a href=&#34;http://www.masukomi.org/language_graphics/language_2.pdf&#34;&gt;without
text&lt;/a&gt;. &lt;a href=&#34;http://www.masukomi.org/language_graphics/language_2.svg&#34;&gt;SVG
Version&lt;/a&gt; &lt;a href=&#34;http://www.masukomi.org/language_graphics/language_2.png&#34;&gt;PNG
Version&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/assets/2009/06/language_2.png&#34; alt=&#34;language_2&#34; title=&#34;language_2&#34;&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Relative positioning imagery for linguists</title>
      <link>https://weblog.masukomi.org/2009/06/21/relative-positioning-imagery-for-linguists/</link>
      <pubDate>Sun, 21 Jun 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/06/21/relative-positioning-imagery-for-linguists/</guid>
      <description>&lt;p&gt;Conveying the words for relative positioning in a new language is
difficult without visual aids. And finding visual aids you have
permission to use can be particularly difficult for
&lt;a href=&#34;http://en.wikipedia.org/wiki/Constructed_language&#34;&gt;conlangers&lt;/a&gt;. This is
the first of four such pages. I&amp;rsquo;m releasing them into the public domain,
so feel free to do whatever you want with them. In PDF format &lt;a href=&#34;http://www.masukomi.org/language_graphics/language_1_with_words.pdf&#34;&gt;with
text&lt;/a&gt;
and &lt;a href=&#34;http://www.masukomi.org/language_graphics/language_1.pdf&#34;&gt;without
text&lt;/a&gt;. In &lt;a href=&#34;http://www.masukomi.org/language_graphics/language_1.svg&#34;&gt;SVG
format without
text&lt;/a&gt;. In &lt;a href=&#34;http://www.masukomi.org/language_graphics/language_1.png&#34;&gt;PNG
format without
text&lt;/a&gt;. If you
do use it, &lt;a href=&#34;https://weblog.masukomi.org/about&#34;&gt;I&amp;rsquo;d love to hear about
it&lt;/a&gt;. [Update: &lt;a href=&#34;https://weblog.masukomi.org/2009/06/22/relative-positioning-imagery-for-linguists-2&#34;&gt;second page of these is
here&lt;/a&gt;.]
Preview:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/assets/2009/06/language_1.png&#34; alt=&#34;relative
positions&#34; title=&#34;relative positions&#34;&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Things I wish they&#39;d told me before I got my motorcycle.</title>
      <link>https://weblog.masukomi.org/2009/04/05/things-i-wish-theyd-told-me-before-i-got-my-motorcycle/</link>
      <pubDate>Mon, 06 Apr 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/04/05/things-i-wish-theyd-told-me-before-i-got-my-motorcycle/</guid>
      <description>&lt;h2 id=&#34;the-thing-to-keep-in-mind&#34;&gt;The thing to keep in mind:&lt;/h2&gt;
&lt;p&gt;Motorcycling is a lot like boating. You
can get yourself a dingy that&amp;rsquo;ll get you around the bay for pretty
cheap, but it doesn&amp;rsquo;t have much in the way of features, and if a big
wave comes along you&amp;rsquo;re going to drown because you don&amp;rsquo;t have a life
preserver. As with boats, the price range (for bikes and gear) goes from
cheap and affordable to mind-bogglingly expensive.&lt;/p&gt;
&lt;h2 id=&#34;things-i-wish&#34;&gt;Things I wish&lt;/h2&gt;
&lt;p&gt;they&amp;rsquo;d told me about the bikes:** 250cc is plenty in the beginning. You
don&amp;rsquo;t need more power, and the weight &amp;amp; size that comes along with more
is going to make the bike harder to maneuver, harder to pick up, and
more likely to fly out from under you when you accidentally gun it too
hard at a green light. Whatever you choose for your first bike try and
get something as light as possible. 350 lbs should be your target. A
250cc bike won&amp;rsquo;t have as much torque at the high end but you&amp;rsquo;ll be able
to get up to highway speeds without issue.&lt;/p&gt;
&lt;p&gt;Chokes are really annoying.
If you can afford it, get something fuel injected.&lt;/p&gt;
&lt;p&gt;They will happily
overheat on you in stop and go traffic.&lt;/p&gt;
&lt;p&gt;Dealing with a manual
transmission in stop and go city traffic is annoying, tiring, and starts
to hurt after a while.&lt;/p&gt;
&lt;p&gt;Some bikes have controls that were simply built
for bigger hands. You should be able to hold the clutch in, and still
easily manipulate the turn signals. If you can&amp;rsquo;t, or it requires awkward
maneuvering, then find a different bike where you can. There &lt;em&gt;are&lt;/em&gt; bikes
out there that will fit your hand.&lt;/p&gt;
&lt;p&gt;Whatever you start out on, no matter
how much you love it, you&amp;rsquo;re going to want something else in a couple
years. Maybe you&amp;rsquo;ll keep your first bike too, but it&amp;rsquo;ll take a while of
riding before you find what really matters, as opposed to what you think
matters. So, find a gear-head to come with you and buy something cheap,
used, and reliable.&lt;/p&gt;
&lt;p&gt;Each type of bike, and manufacturer, has it&amp;rsquo;s own
community of users, and the way each of they all have dramatically
different attitudes with varying levels of tolerance for newbs and
people who aren&amp;rsquo;t just like them. The rule of thumb is that the
personality of the users tends to closely resemble the visual
personality and marketing style of the bikes they ride. Just like the
adage about dog owners resembling their dogs. If being able to find
others online, or off, who can help you with your questions is
important, make sure you can stand the people who ride the bike you&amp;rsquo;re
considering.&lt;/p&gt;
&lt;h2 id=&#34;things-i-wish-theyd-told-me-about-the-helmets&#34;&gt;Things I wish they&amp;rsquo;d told me about the helmets:&lt;/h2&gt;
&lt;p&gt;When it comes to helmets money just buys you bells and whistles. A $75 helmet is
DOT approved helmet is going to keep your roughly as safe as a $700 DOT
approved helmet. However, the more you spend the more nice features you
get, like lighter weight, better air flow, easily swappable visors,
retractable inner sunglasses, build in rear view mirrors, etc., etc.&lt;/p&gt;
&lt;p&gt;Riding into the rising or setting sun is a massive pain in the ass with
street helmets, even with tinted visors. Off-road / adventure helmets
have visors but street helmets typically don&amp;rsquo;t. I suspect this is
because of the wind resistance that they&amp;rsquo;d incur at highway speeds.&lt;/p&gt;
&lt;p&gt;38 percent of the time a head impacts the ground it will do so along one of
the jaws. A full face helmet is non-optional.&lt;/p&gt;
&lt;p&gt;You know all the jokes about women and shoes? Well apparently you can replace women with
motorcyclists, and shoes with helmets, and be roughly as accurate. I
have no clue why. All helmets fog up but some
helmets are dramatically better at it than others, and it&amp;rsquo;s not
necessarily a matter of price.&lt;/p&gt;
&lt;h2 id=&#34;things-i-wish-theyd-told-me-about-the-gear&#34;&gt;Things I wish they&amp;rsquo;d told me about the gear:&lt;/h2&gt;
&lt;p&gt;There&amp;rsquo;s a gigantic difference between the high-end gear and the cheap gear.&lt;/p&gt;
&lt;p&gt;It is unbelievable how much water can pour into a non-waterproof lace-up boot
in one second during a downpour on a motorcycle.&lt;/p&gt;
&lt;p&gt;Denim, even &amp;ldquo;heavy-duty&amp;rdquo; denim, offers you zero real protection.&lt;/p&gt;
&lt;p&gt;If the armor isn&amp;rsquo;t CE rated it doesn&amp;rsquo;t count.&lt;/p&gt;
&lt;p&gt;Never buy a jacket without CE rated spine protection, or pants without CE rated knee armor.&lt;/p&gt;
&lt;p&gt;The higher the denier
the more tear resistance the fabric offers as you&amp;rsquo;re sliding down the
road. You really want Kevlar or Superfabric but you probably can&amp;rsquo;t
afford either.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re a really careful shopper, and willing to
sacrifice some looks in the name of saving money, and only buying the
minimum to keep your covered you will still need to spend, roughly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$100 on a helmet&lt;/li&gt;
&lt;li&gt;$100 on pants&lt;/li&gt;
&lt;li&gt;$100 on a jacket&lt;/li&gt;
&lt;li&gt;$100 on boots&lt;/li&gt;
&lt;li&gt;$35 on gloves&lt;/li&gt;
&lt;li&gt;&amp;hellip; the same again for winter versions of all of these.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You absolutely need to buy, and use, earplugs.&lt;/p&gt;
&lt;p&gt;GPS units designed to
withstand the vibrations of a motorcycle, and be exposed to the
elements, are crazy expensive.&lt;/p&gt;
&lt;p&gt;Like your first bike, whatever gear you start with you&amp;rsquo;re going to want to replace with something else.
Fortunately, you can probably sell the old stuff for a little money on
Craigslist. Try lots of stuff on in stores, and start with something
well armored and affordable that seems to your liking. Next year you&amp;rsquo;ll
know what you really need in gear.&lt;/p&gt;
&lt;h2 id=&#34;things-i-wish-theyd-told-me-about-riding-in-the-cold&#34;&gt;Things I wish they&amp;rsquo;d told me about riding in the cold:&lt;/h2&gt;
&lt;p&gt;No matter how well covered your torso and legs
are, the cold wind on an exposed neck is brutally painful.&lt;/p&gt;
&lt;p&gt;Heated grips
are one of the best, easiest, and cheapest, possible modifications
you can make to your bike. A plug for a heated vest will offer you
massive benefits too.&lt;/p&gt;
&lt;h2 id=&#34;things-i-wish-theyd-told-me-about-the-roads&#34;&gt;Things I wish they&amp;rsquo;d told me about the roads:&lt;/h2&gt;
&lt;p&gt;Bridges where you drive on square metal gratings may as well be ice.&lt;/p&gt;
&lt;h2 id=&#34;things-i-wish-theyd-told-me-about-motorcycling&#34;&gt;Things I wish they&amp;rsquo;d told me about motorcycling:&lt;/h2&gt;
&lt;p&gt;It is one of the
most glorious activities you can do: exhilarating, meditative,
beautiful. It is totally addictive.&lt;/p&gt;
&lt;h2 id=&#34;what-do-you-wish-theyd-told-you-before-you-started-riding&#34;&gt;What do &lt;em&gt;you&lt;/em&gt; wish they&amp;rsquo;d told you before you started riding?&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;I&amp;rsquo;ll add to this list as I think
of things, but in the meantime, you may be interested in reading these
other posts of mine: &lt;a href=&#34;https://weblog.masukomi.org/2008/04/05/so-you-want-to-ride-a-motorcycle-and-not-die&#34;&gt;So you want to ride a motorcycle&amp;hellip; and not
die&lt;/a&gt; &amp;amp;
&lt;a href=&#34;https://weblog.masukomi.org/2008/05/17/the-financial-cost-of-motorcycle-safety&#34;&gt;The financial cost of motorcycle
safety&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Honda Metropolitan Scooter [Review]</title>
      <link>https://weblog.masukomi.org/2009/04/04/honda-metropolitan-scooter-review/</link>
      <pubDate>Sun, 05 Apr 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/04/04/honda-metropolitan-scooter-review/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2009/04/metro.jpg&#34; alt=&#34;metro&#34; title=&#34;metro&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary:&lt;/h2&gt;
&lt;p&gt;The Metropolitan is a stylish, well made, scoot for getting around town,
that is a blast to drive, but could do with some better brakes.&lt;/p&gt;
&lt;p&gt;NOTE: This post was written &lt;em&gt;in 2009&lt;/em&gt;, and I haven&amp;rsquo;t ridden more recent models. A quick look at the most recent models (2024) suggests that not much has changed and that this post is still pretty relevant.&lt;/p&gt;
&lt;h2 id=&#34;introduction&#34;&gt;Introduction:&lt;/h2&gt;
&lt;p&gt;The Honda Metropolitan ( CHF50 ) was introduced in
2002 with a visual style that emulates that of the classic Vespas of
yesteryear. I&amp;rsquo;m typing now and waiting It&amp;rsquo;s 4-stroke 50cc engine will get you around town at a
little over 30mph and gets 80-100mpg along the way. Since its
introduction in 2002 the only thing Honda has changed is the color,
although there was a Metropolitan II&lt;/p&gt;
&lt;p&gt;soon something will happen.&lt;/p&gt;
&lt;p&gt;soon there will be a change.&lt;/p&gt;
&lt;p&gt;but no. No change. Why gods why?
which is essentially the same
vehicle but with a speed limiter to make it go even slower, and satisfy
politicians.
&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2009/04/two_metros.jpg&#34; alt=&#34;two_metros&#34; title=&#34;two_metros&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;styling&#34;&gt;Styling:&lt;/h2&gt;
&lt;p&gt;There&amp;rsquo;s no question that one of the main reasons to choose a Metro over its
competition is the styling. Honda has embraced and refined the classic
look that Vespa has abandoned. If you&amp;rsquo;re willing to buy used there is a
wide variety of colors and patterns to choose from (&lt;a href=&#34;http://en.wikipedia.org/wiki/Honda_CHF50&#34;&gt;full listing on
Wikipedia&lt;/a&gt;). The Vino Classic,
it&amp;rsquo;s closest name-brand competitor, has also tried to embrace this
old-school look but with &lt;a href=&#34;http://www.flickr.com/photos/brucewood/47428270/&#34;&gt;very different
results&lt;/a&gt;. Personally,
I think the Metro. is a beautiful looking scooter, and, from a purely
aesthetic perspective, wouldn&amp;rsquo;t change a thing.&lt;/p&gt;
&lt;h2 id=&#34;construction&#34;&gt;Construction:&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m really happy with the construction of this scooter. The Metro simply feels
like a well made, sturdy, lightweight scooter. The mirrors are decently sized
and placed high enough that they don&amp;rsquo;t just show you your elbows, like many
street bikes. The brake lines don&amp;rsquo;t flop around, and everything feels well
attached.&lt;/p&gt;
&lt;p&gt;The entire body is plastic and feels about as sturdy as one
could hope for. As far as I know, the only companies still making
scooters with metal bodies are Genuine Scooter Co. and Vespa. The leg
shields do a good job of blocking the wind and water from hitting your
lower legs, and are far enough forward that your can angle your legs
forward comfortably.&lt;/p&gt;
&lt;p&gt;I question the seat position though, and wonder if
they only measured East Asian people and women when designing it. I stand 5&#39;
9&amp;quot; and am averagely proportioned, owing to the length of my arms, I
really want to sit back farther than the seat is designed for. which
leaves me either sitting on the back edge, or sitting very upright in
the middle of it, and both of these positions put extra pressure on my
coccyx which I&amp;rsquo;m not thrilled about. I think it&amp;rsquo;ll be just fine for
shorter folk, but I now understand why so many people have modded their
Metro. by extending the wheelbase a few inches.
&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2009/04/metro_day_dials.jpg&#34; alt=&#34;metro_day_dials&#34; title=&#34;metro_day_dials&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;controls&#34;&gt;Controls:&lt;/h2&gt;
&lt;p&gt;The dash is simple, and to the point. The turn indicator could stand to
be tilted back towards the rider a bit, but that&amp;rsquo;s nitpicking,
especially since it has one of the loudest clicks I&amp;rsquo;ve ever heard on a
turn indicator, which is wonderful. I&amp;rsquo;ve ridden for miles on my
motorcycle with my turn signal on simply because I didn&amp;rsquo;t notice I
hadn&amp;rsquo;t turned it off. I would note however that after you turn it off it
still clicks two more times, which, until you accept that it won&amp;rsquo;t stop
immediately, make you move it out of the off position in an attempt to
turn it off.&lt;/p&gt;
&lt;p&gt;The high beam indicator is difficult to see in daylight.
Unfortunately the coolant temperature indicator appears to use a similar
LED that I fear would also be difficult to see in daylight, but I
haven&amp;rsquo;t ever seen it go off so I can&amp;rsquo;t be sure. All I know is that it&amp;rsquo;ll
be red when it does.&lt;/p&gt;
&lt;p&gt;The grips are comfortable and well positioned, so
that even after forty minutes of riding your throttle hand won&amp;rsquo;t be
tired in the least. Brake levers are similarly well positioned. Starting
the Metro is incredibly easy; just hold the brake and push the button,
and should your battery be hurting, the kick-start works like a charm.&lt;/p&gt;
&lt;h2 id=&#34;going-and-stopping&#34;&gt;Going and Stopping:&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s be honest with ourselves, it&amp;rsquo;s a 50cc engine. It should not be expected to
rocket off the line or zoom down the road whipping your hair behind you.
However, the metro is also one of the slowest 50cc scooters off the line.  What
little accelleration there is is smooth and steady, and when driving  around the
city, which is precisely what it was designed for, it is feels  zippy, and fun
to ride. On steep hills you might find your speed dropping to 25mph or so, but
on the other side you&amp;rsquo;ll hit 40. However, it should be noted that, with such a
small engine, top speed is greatly impacted by the weight of the rider.  As you
ride though, you&amp;rsquo;ll be surprised at just how quiet the Metro is at all speeds.
It&amp;rsquo;s 4-stroke engine is a major part of this, and I&amp;rsquo;m happy to say that you&amp;rsquo;re
not going to have to worry about it sounding like an over-amped lawn-mower.&lt;/p&gt;
&lt;p&gt;Wind resistance would be an issue if it
moved faster, but as it doesn&amp;rsquo;t, it isn&amp;rsquo;t. You can feel it over the
handlebars when the wind is in your face, but at those speeds it&amp;rsquo;s not
enough to do anything beyond cool you off.&lt;/p&gt;
&lt;p&gt;The brakes however&amp;hellip; Your
impression of the breaks will be greatly dependent upon where you&amp;rsquo;re
coming from. If your only two wheeled transportation before this is a
bicycle you&amp;rsquo;ll think the brakes acceptable. If you&amp;rsquo;ve ridden a
motorcycle before you&amp;rsquo;ll think they&amp;rsquo;re crap, because, unfortunately, the
Metro uses drum brakes, which aren&amp;rsquo;t radically dissimilar to bicycle
brakes in function. Instead of a fricative surface pushing in against
the rim they have a fricative surface pushing out against a drum. I
think the stopping distance could probably be halved had they used disk
brakes. Some would argue that you&amp;rsquo;re not going so fast that this is a
major issue. Then again, it could also be argued that you really don&amp;rsquo;t
want to hit that car that just slammed on it&amp;rsquo;s brakes in front of you.
The choice of drum brakes is obviously one of cost. In general, the
scooters with disk brakes are in the next bracket of price and features,
and frequently have more power.  [EDIT: the 2024 version still uses drum brakes]&lt;/p&gt;
&lt;p&gt;The suspension is also poor.
When riding over badly patched pavement (something not too uncommon in
various parts of all cities), you will really feel it with hard little
jolts, and want to raise your butt off the seat. This is partially the
fact that it has such small, and thin, wheels, and partially the fact
that it&amp;rsquo;s shocks aren&amp;rsquo;t that big. Overall it&amp;rsquo;s better than a bicycle and
notably worse than a motorcycle.&lt;/p&gt;
&lt;p&gt;On a motorcycle one technique for
dealing with potholes is to give the engine a little more gas just
before you hit it, to raise the front wheel a little and not hit it as
hard, unfortunately, you&amp;rsquo;re going to be traveling at top speed most of
the time on a Metro and the engine won&amp;rsquo;t have any extra oomph to give
you so you&amp;rsquo;re just going to hit it with tiny wheels and tiny shocks,
because unless you&amp;rsquo;re a gorilla, you won&amp;rsquo;t be able to pop a wheelie just
by lifting on the handlebars.&lt;/p&gt;
&lt;h2 id=&#34;storage-space&#34;&gt;Storage space:&lt;/h2&gt;
&lt;p&gt;The Metro has under-seat storage which can hold a 3/4 helmet with a little space left
over for a small bag. Think of it as a grocery bag plus a couple cans of
soda. It&amp;rsquo;s really sad that Honda would design a storage space that
encourages users to wear helmets that don&amp;rsquo;t protect them from 38% of
head impacts, but those of us who like our jaws and use full-face
helmets can use the helmet hook on the front of the storage area that is
locked when you close the seat.&lt;/p&gt;
&lt;p&gt;On the inside of the leg shields you&amp;rsquo;ll
find a hook where you can hang a plastic shopping bag, although I&amp;rsquo;ve
never felt comfortable with an unsecured bag dangling between my legs as
I ride.&lt;/p&gt;
&lt;p&gt;For those looking for additional carrying capacity you can get a
&lt;em&gt;small&lt;/em&gt; basket that fits along the inside of the leg shield and a
carrying rack for the back, which can be enhanced with a top-case that
can easily hold a full-face helmet. Unfortunately the Honda brand top
case isn&amp;rsquo;t very good looking, but there are other manufacturers whose
cases have been used by many Metro. owners.&lt;/p&gt;
&lt;h2 id=&#34;modding&#34;&gt;Modding:&lt;/h2&gt;
&lt;p&gt;One surprising
thing about the Metro. is just how modifiable it is and how much it&amp;rsquo;s
riders like to tweak it. Want fatter tires? Swap in a swing arm from the
&lt;a href=&#34;http://powersports.honda.com/2009/ruckus.aspx&#34;&gt;Ruckus&lt;/a&gt;. Want a cool
sound? Give it a new muffler. Want longer reach? Extend the wheelbase.
Disk brakes? Better shocks? It&amp;rsquo;s not only all possible, but all been
done by a community of riders who are more than willing to share their
knowledge with you. The Ruckus people are probably even more into
modding their scoots, but given the look of the Ruckus this isn&amp;rsquo;t too
surprising.&lt;/p&gt;
&lt;h2 id=&#34;more-info&#34;&gt;More info:&lt;/h2&gt;
&lt;h3 id=&#34;safety&#34;&gt;Safety&lt;/h3&gt;
&lt;p&gt;If you want to stay safe please check out the infographics on
&lt;a href=&#34;http://www.gearupproject.org&#34;&gt;Gear Up Project&lt;/a&gt; and read
&lt;a href=&#34;https://weblog.masukomi.org/2008/04/05/so-you-want-to-ride-a-motorcycle-and-not-die&#34;&gt;So you want to ride a motorcycle&amp;hellip; and not die&lt;/a&gt;.
Scooter riders seem almost alergic to good gear but 75% of
all powered two-wheel vehicle accidents happen at speeds of
31Mph or less and most of them at
intersections. In other words, in cities at scooter speeds.&lt;/p&gt;
&lt;h3 id=&#34;resources&#34;&gt;Resources&lt;/h3&gt;
&lt;p&gt;If you&amp;rsquo;re considering a Honda Metro. you
should probably check out
&lt;a href=&#34;http://www.urbanscootin.com/&#34;&gt;UrbanScootin.com&lt;/a&gt;, a forum for Metro.
owners with helpful folks and lots of examples of mods, and tales of
owner&amp;rsquo;s experiences.&lt;/p&gt;
&lt;p&gt;In most of the U.S. 50cc scooters require a drivers
license to operate, but check with local laws before purchasing.&lt;/p&gt;
&lt;h3 id=&#34;credits--caveats&#34;&gt;Credits &amp;amp; Caveats&lt;/h3&gt;
&lt;p&gt;The daytime speedometer picture is &lt;a href=&#34;http://www.flickr.com/photos/powderkeg/2396405631/&#34;&gt;CC
byscooter&lt;/a&gt;, the
picture of the red Metro is &lt;a href=&#34;http://www.flickr.com/photos/littleboats/352941632/&#34;&gt;CC
keveemonterey&lt;/a&gt;, and
the picture of the orange and red metros is &lt;a href=&#34;http://www.flickr.com/photos/frenchieb/244955146/&#34;&gt;CC Francesca
Tronchin&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The scooter this review was based on was a 2005 with &amp;lt; 1000 miles on it that
had just recently had a tune-up. Considering that Honda hasn&amp;rsquo;t changed
anything but the color since then it should be a relatively accurate
representation of what a new one would be like.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Mass-transit within Boston isn&#39;t worth it.</title>
      <link>https://weblog.masukomi.org/2009/04/01/mass-transit-within-boston-isnt-worth-it/</link>
      <pubDate>Wed, 01 Apr 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/04/01/mass-transit-within-boston-isnt-worth-it/</guid>
      <description>&lt;p&gt;A huge number of people use the subway to get from one part of the city
to the other twice a day, five days a week. If they&amp;rsquo;re smart, they buy a
monthly pass which costs $59 and gives you unlimited rides within the
central city zone.&lt;/p&gt;
&lt;p&gt;For the same $59 you could buy 29.5 gallons of gas at
today&amp;rsquo;s prices ($2 per gallon). Burn that gas in a 50cc scooter at a
conservative 80 miles per gallon (you can get more) and you can go 2,360
miles. I would estimate that the average distance traveled between home
and work is less than five miles, but, to be conservative and keep the
math easy we&amp;rsquo;ll say 5. That means you could make 236 round trips to work
with it. &lt;em&gt;That&amp;rsquo;s just under one year&amp;rsquo;s worth of work commuting for the
cost of one month&amp;rsquo;s T-pass&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;You can get a Honda or Yamaha scooter used
for about $1500. You can get a cheap chinese knock-off for new for about
half that, although you&amp;rsquo;d probably need to buy a second one when the
first one dies or needs a part no-one carries, so we&amp;rsquo;ll call it the same
price. That&amp;rsquo;s just over the cost of two years worth of T passes (no
insurance required, and registration is cheap). So, if you plan on
living within the city for at least two years a scooter will easily pay
for itself. In addition to the trivially cheap cost of getting to and
from work, it also gives you the ability to get around after the buses
and trains stop running (midnight&amp;hellip; because they&amp;rsquo;re stupid), not deal
with the hour wait on many bus routes (assuming they bother to show up
at all), easily get to all the many places in between the bus routes,
and legally park &lt;em&gt;anywhere&lt;/em&gt; a bicycle can park.&lt;/p&gt;
&lt;p&gt;So tell me, how does
paying for a T pass every month make economical sense?&lt;/p&gt;
&lt;p&gt;What&amp;rsquo;s worse is
that the T is much better for the environment than thousands and
thousands of scooters running around. While I admit I&amp;rsquo;m a huge scooter
and motorcycle fan, I really do wish that mass transit came out better
in this equation.&lt;/p&gt;
&lt;p&gt;Obviously, this isn&amp;rsquo;t a realistic option for people
who live outside the city, although a motorcycle could be, as mine gets
60mpg. But, the number of people who ride mass-transit every day just
within the city is decidedly non-trivial.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Additional costs I hadn&amp;rsquo;t
thought of when I initially wrote this, because I&amp;rsquo;m used to having them
on hand: Helmet $100, good armored jacket $100+. There&amp;rsquo;s &lt;a href=&#34;https://weblog.masukomi.org/2008/05/17/the-financial-cost-of-motorcycle-safety?preview=true&amp;amp;preview_id=195&amp;amp;preview_nonce=b847f9d05a&#34;&gt;plenty more
stuff you can get for
protection&lt;/a&gt;,
but those are the bare minimum requirements in my book. Related post:
&lt;a href=&#34;https://weblog.masukomi.org/2008/04/05/so-you-want-to-ride-a-motorcycle-and-not-die&#34;&gt;So you want to ride a motorcycle&amp;hellip; and not
die&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Localization for Struts Freemarker users</title>
      <link>https://weblog.masukomi.org/2009/03/12/localization-for-struts-freemarker-users/</link>
      <pubDate>Thu, 12 Mar 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/03/12/localization-for-struts-freemarker-users/</guid>
      <description>&lt;p&gt;Because it took me freaking forever to find instructions on how to do
this&amp;hellip;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;You do NOT need a message-resource tag in your struts configuration
files. Those are outdated instructions for old versions of
Struts.You do not need to edit ANY xml at all.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Your Action needs to implement Freemarker&amp;rsquo;s TemplateMethodModel
interface&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You need a package.properties file (the default locale) and a then
another one for each other locale / language you want to support
(ex. package_en_US.properties). These should be located in the
same package as the Struts action that will be needing them. You can
also do ClassName.properties if you want to tie some to a particular
class.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add the code snippet below to your Action. There&amp;rsquo;s a &lt;a href=&#34;http://gist.github.com/78303&#34;&gt;backup
here&lt;/a&gt; if it&amp;rsquo;s borked below.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Insert localized text into the page with a call like this
${text(&amp;ldquo;property.name&amp;rdquo;)} Struts will take care of figuring out the
default language from the user&amp;rsquo;s browser. If you have a better way
of determining this there is documentation out there on how to
programatically specify the locale you want to be used&lt;/p&gt;
&lt;p&gt;public class MyAction extends ActionSupport implements TemplateMethodModel {
/*Your functionality here */&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; /**
 * when you need to display a localized piece of text in
 * the ftl just use  ${text(&amp;quot;some.property.name&amp;quot;)}
 * there should be a package.properties or ClassName.properties
 * file in the same source package directory as the Action that
 * will be using them. There *is* a way to set a global properties file
 * but I don&#39;t know the details.
 * Obviously the text for other languages would be specified in files like
 * package_en_US.properties
 * @return an implementation of TemplateMethodModel which takes a
 * one parameter method, the parameter is the name of the localized property
 * you want to access.
 */
public TemplateMethodModel getText(){
    return this;
}
public TemplateModel exec(List args) throws TemplateModelException {
    if (args.size() != 1) {
        throw new TemplateModelException(&amp;quot;Wrong arguments&amp;quot;);
    }
    return new SimpleScalar(getText((String)args.get(0)));
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ecgn adds the following notes about actions:&lt;br&gt;
There has to be an action class involved in the Struts/Freemarker action.&lt;/p&gt;
&lt;p&gt;Example – the following simple page view &lt;em&gt;won’t work&lt;/em&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;action name=”ShowLogin”&amp;gt;
   &amp;lt;result type=”freemarker”&amp;gt;Login.ftl&amp;lt;/result&amp;gt;
&amp;lt;/action&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To get it to work, I have to insert a “dummy” action into the process:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;action name=”ShowLogin” class=”actions.DummyAction”&amp;gt;
&amp;lt;result type=”freemarker”&amp;gt;Login.ftl&amp;lt;/result&amp;gt;
&amp;lt;/action&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Keywords / Google Food: localization, internationalization, i18n,
freemarker, struts&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Why your tiered password scheme is flawed, and what to do about it.</title>
      <link>https://weblog.masukomi.org/2009/02/26/why-your-tiered-password-scheme-is-flawed-and-what-to-do-about-it/</link>
      <pubDate>Fri, 27 Feb 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/02/26/why-your-tiered-password-scheme-is-flawed-and-what-to-do-about-it/</guid>
      <description>&lt;p&gt;First, let me explain what I mean by &amp;ldquo;tiered password scheme&amp;rdquo;. Many
perfectly smart people I know have one strong password they use for one
or two online banking type sites. They&amp;rsquo;ll then have a &amp;ldquo;medium security&amp;rdquo;
password they use on sites that kind of important to them (maybe those
sites have their credit card info stored), but not critical to day to
day stuff. Then they&amp;rsquo;ll have one or two passwords they use on &lt;em&gt;all&lt;/em&gt; the
other sites like Twitter, Yahoo!, Facebook, GMail, etc.&lt;/p&gt;
&lt;p&gt;Obviously
they&amp;rsquo;re being relatively careful about the important stuff and that&amp;rsquo;s
good, but the flaw in this system is in the perception of pain. People
think &amp;ldquo;wow, it would massively suck if my bank account password got out,
but it&amp;rsquo;s not such a big deal if my Twitter password gets compromised. I
can always make another Twitter account.&amp;rdquo; Or, they&amp;rsquo;ll say &amp;ldquo;Why would
anyone care about hacking &lt;em&gt;my&lt;/em&gt; account? There&amp;rsquo;s nothing special about
it.&amp;rdquo; And while there&amp;rsquo;s nothing inaccurate about those thoughts, they&amp;rsquo;re
also totally missing the point.&lt;/p&gt;
&lt;p&gt;The thing is that many of those low
value sites aren&amp;rsquo;t even remotely careful with your data. They&amp;rsquo;ll store
your passwords unencrypted on their servers. And while people are
unlikely to try and go after your account in particular, it&amp;rsquo;s not
unthinkable that someone might try to hack Twitter (just an example), or
even better, one of the myriad tools that you have to enter your Twitter
username and password into and are much more likely to be insecure.&lt;/p&gt;
&lt;p&gt;Now, they&amp;rsquo;ve got a list of thousands, or maybe millions, of usernames and
passwords and because so many people use a tiered password scheme (or
worse, only one password) those passwords are going to work all over the
place. Now, most people I talk to say &amp;ldquo;I can just make another Twitter
account.&amp;rdquo; but It&amp;rsquo;s not just *that* account. How many hundreds of sites
have you used that low value password at? Do you really want to go and
change it on all of them? And how would you even know you &lt;em&gt;need&lt;/em&gt; to
change it on all of them. Considering how many you&amp;rsquo;ve probably used it
at, it&amp;rsquo;s a safe bet that someone could be using your name and spamming
people, or linking to virus ridden sites, or whatever from your account
and you might not find out about it for months, if ever. Not because
it&amp;rsquo;s &lt;em&gt;your&lt;/em&gt; account, but because your username and password just
&lt;em&gt;happened&lt;/em&gt; to be in the list of thousands they stole from some site. It
is simply not realistic to claim that, if you somehow knew the password
had, or might have been compromised, you are going to change it on all
the sites you&amp;rsquo;ve used it at. And worse, if any of your accounts that got
compromised, and probably killed by administrators, were ones where
you&amp;rsquo;d made friends, built up lists of contacts, etc., then you&amp;rsquo;re going
to be experiencing some serious pain and frustration when it comes to
figuring out how to contact all those people, telling them that no, that
wasn&amp;rsquo;t really you trying to sell them male enhancement pills, and that
you&amp;rsquo;ve got a new account now&amp;hellip;. Gods forbid this happens to your e-mail
account.&lt;/p&gt;
&lt;p&gt;So, what are you supposed to do? Well, the &amp;ldquo;simple&amp;rdquo; answer is
that you&amp;rsquo;re going to have to start using a different password on every
site, and, because you&amp;rsquo;re human, you&amp;rsquo;re going to have to use a password
manager to keep track of them all. There are a ton of password managers
out there and while they&amp;rsquo;ll all get the job done securely, the usability
of these apps varies wildly. Typically the process is: load a web page
that needs a password, launch your password manager (if it isn&amp;rsquo;t running
already), find the entry for this site in a list, copy the password to
your clipboard, switch back to the browser, select the password field,
and paste in the password. That&amp;rsquo;s six steps, two applications, and
possible wait time while one of them launches, just to enter a password!&lt;/p&gt;
&lt;p&gt;&amp;ldquo;But Kay,&amp;rdquo; you say, &amp;ldquo;my browser remembers my passwords.&amp;rdquo; And that&amp;rsquo;s
great. It&amp;rsquo;s going to save you from having to do this all the time,
&lt;em&gt;&lt;strong&gt;but&lt;/strong&gt;&lt;/em&gt; sooner or later your browser&amp;rsquo;s cache is going to get emptied,
and you&amp;rsquo;re going to have to go through the process again. Even worse,
what if you&amp;rsquo;re at someone else&amp;rsquo;s computer?� The latter is a strong
argument for having a password manager on your smartphone, but the
usability is even worse when you&amp;rsquo;re talking about an entirely different
device that you can&amp;rsquo;t copy the password from to paste into your browser.&lt;/p&gt;
&lt;p&gt;So, again, what are you supposed to do? Well, first off, you need a
password manager that&amp;rsquo;s not going to make you leave your browser. This
means we&amp;rsquo;re talking about browser extensions, or maybe a web based
password manager. And while there are a ton of choices, some of them are
wildly complicated and most of them fail when it comes to usability. If
you&amp;rsquo;re going to stick with this, and protect your identity and passwords
the way you should it is absolutely imperative that you use a tool that
makes it easy, easy, easy, to get your passwords in there. The act of
retrieving your password and entering it into the site you want &lt;em&gt;can&amp;rsquo;t&lt;/em&gt;
be frustrating or annoying to you. [Update: A number of people have felt
that I&amp;rsquo;m trying to promote Passpack below. Passpack just happens to be
one of the few services that meets all of my personal criteria, but
there are other services out there and I encourage you to explore them.
Furthermore, web based services aren&amp;rsquo;t right for everyone. Some of us
prefer Firefox Extensions, or apps that live on our phones.� Really, I
just want you to go find a tool that will help you to practice good
password hygene, and am offering up what I&amp;rsquo;ve discovered whilst
searching for tools for me.]&lt;/p&gt;
&lt;p&gt;So far I&amp;rsquo;ve only found one that I&amp;rsquo;m really
willing to recommend: &lt;a href=&#34;http://www.passpack.com/&#34;&gt;Passpack&lt;/a&gt;. Unlike most
web-based password managers it can work offline, if you have Google
Gears installed. It&amp;rsquo;s got a ton of features (probably far more than you
need), and while it&amp;rsquo;s interface can be a bit overwhelming with all it&amp;rsquo;s
options and it&amp;rsquo;s big grid of icons, it appears relatively easy to use,
and most of the time you&amp;rsquo;re just going to click its bookmarklet when you
want to log in to some site you&amp;rsquo;ve stored the password for. Once you&amp;rsquo;ve
saved a password for a site it&amp;rsquo;s two clicks the next time you need to
retrieve your password and log in. I definitely recommend checking out
their &lt;a href=&#34;http://www.passpack.com/en/tour/&#34;&gt;video tour&lt;/a&gt;. [Update: the icon
grid, can be turned off, and will be off by default in the next
version.]&lt;/p&gt;
&lt;p&gt;When it comes to browser extensions I simply haven&amp;rsquo;t seen any
that get the usability right. Some have daunting management screens, or
just bad tools for initiating the action of getting the password and
almost all of them finish by copying the password to the clipboard and
making you paste it in to the form, which is just brain-dead considering
that extensions have access to essentially every feature of the browser.
Many (most?) of them are going to leave you screwed if you need to
access a site from someone else&amp;rsquo;s computer. The same can be said for
desktop apps. The things the extensions do typically do right is
generate good passwords for you, store them securely, and save you from
having to open another app. But, all of the ones I&amp;rsquo;ve seen simply aren&amp;rsquo;t
painless enough when it comes to usability, or management, or both.
Actually, there was &lt;em&gt;one&lt;/em&gt; exception that got the usability right, but
ultimately encouraged users to go with something resembling a tiered
password scheme.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Is that even running?</title>
      <link>https://weblog.masukomi.org/2009/02/20/is-that-even-running/</link>
      <pubDate>Fri, 20 Feb 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/02/20/is-that-even-running/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s not uncommon for me to wonder if some app is running on my linux
or OS X box, and while I could pipe together ps and a couple greps it felt silly
to keep doing it after a while. So, I applied my admittedly limited bash
skills and came up with the following script which I throw that in an
executable called &amp;ldquo;got&amp;rdquo;. Now I can just type &amp;ldquo;got tomcat?&amp;rdquo; (the
question-mark is optional). If anything is running with &amp;ldquo;tomcat&amp;rdquo; in it&amp;rsquo;s
command it&amp;rsquo;ll give me the skinny on it. Otherwise it&amp;rsquo;ll let me know it
wasn&amp;rsquo;t found.&lt;/p&gt;
&lt;p&gt;Then I threw it up on github and others helped improve it.&lt;/p&gt;
&lt;p&gt;So, if the idea of being able to ask your system if it&amp;rsquo;s &amp;ldquo;got tomcat?&amp;rdquo;
(or anything else) sounds good to then &lt;a href=&#34;https://github.com/masukomi/got&#34;&gt;Check out the code on github&lt;/a&gt;
and fork it if you think of a way to improve it.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Get any URL onto your phone with a QR Code Bookmarklet</title>
      <link>https://weblog.masukomi.org/2009/02/13/get-any-url-onto-your-phone-with-a-qr-code-bookmarklet/</link>
      <pubDate>Fri, 13 Feb 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/02/13/get-any-url-onto-your-phone-with-a-qr-code-bookmarklet/</guid>
      <description>&lt;p&gt;If you&amp;rsquo;re like me you find yourself sitting at your computer and need to
go away, but there&amp;rsquo;s some page you&amp;rsquo;d like to read, or continue reading,
on your phone. Well, if you&amp;rsquo;ve got an Android Phone or essentially &lt;em&gt;any&lt;/em&gt;
phone in Japan you can just use your phone to scan in a QR Barcode from
your computer screen and then open the url on your phone. I know for a
fact that there are other phones in the US that can read QR Code, but
you&amp;rsquo;ll have to Google around to see if your phone is one of them. Sound
good? Then &lt;a href=&#34;http://www.masukomi.org/projects/qr_bookmarklet/&#34;&gt;go here,&lt;/a&gt;
see the screenshots, grab the bookmarklet, and let me know what you
think. P.S. If you&amp;rsquo;re interested in seeing what&amp;rsquo;s going on with 2D
barcodes as we start to catch up to Japan you might be interested in
checking out the &lt;a href=&#34;http://2d-code.co.uk/&#34;&gt;2d code&lt;/a&gt; news site.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Why I moved my domains to GoDaddy.com</title>
      <link>https://weblog.masukomi.org/2009/02/03/why-i-moved-my-domains-to-godaddycom/</link>
      <pubDate>Tue, 03 Feb 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/02/03/why-i-moved-my-domains-to-godaddycom/</guid>
      <description>&lt;p&gt;Or, how to treat your customers right.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve had a number of domains with
Register.com for years now. They&amp;rsquo;re not the cheapest, but they&amp;rsquo;ve got
good tools for managing your domains and back when I used to be a
freelance web designer/developer I had to call them a number of times to
help address setup issues for clueless customers. They were always nice
and helpful.&lt;/p&gt;
&lt;p&gt;But, I had about seven domain names with them. Roughly
three months before every domain expired I&amp;rsquo;d get an e-mail from them
that essentially said &amp;ldquo;OMFG Yer gonna expirez! Renew Now!!!!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;But, nowhere on the e-mail does it actually mention that you&amp;rsquo;ve still got 3
months left before it does. It&amp;rsquo;s all about the scare tactic and trying
to convince you to sign up for multiple years. &amp;ldquo;Renew &amp;lt;your domain
here&amp;gt; early and save up to $129.&amp;rdquo; Seven year renewal that&amp;hellip; and better
yet they&amp;rsquo;re all &amp;ldquo;this promotion expires on xxx&amp;rdquo; except, it&amp;rsquo;s always
effing available.&lt;/p&gt;
&lt;p&gt;Then, about a month before your domain expires they&amp;rsquo;ll
call you and be all &amp;ldquo;OMFG EXPIreS!!&amp;rdquo; And, to be honest, the people who
called were always friendly, but my last conversation went something
like this (I&amp;rsquo;m paraphasing):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Example.com is about to expire. If you renew for two years we&amp;rsquo;ll give
you x% off.&amp;rdquo; &amp;ldquo;Don&amp;rsquo;t I have that on autorenew?&amp;rdquo; &amp;ldquo;Yes.&amp;rdquo; &amp;ldquo;So, it&amp;rsquo;ll just
renew itself when it expires right?&amp;rdquo; &amp;ldquo;Yes, but we can take care of
that right now over the phone.&amp;rdquo; &amp;hellip;.why would I dig out my credit
card, read the numbers to you in the middle of my office, wait for you
to type it in and repeat it to me when I can just do nothing and let
the automated systems take care of it for me?! &amp;ldquo;Um, no. That&amp;rsquo;s ok&amp;hellip;&amp;rdquo;
&amp;ldquo;Ok. Anything else I can help you with?&amp;rdquo; &amp;ldquo;No thanks.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It actually went on for a bit longer than that, but you get the gist.
This happened to me about seven times a year. &amp;ldquo;OMFG reneW!&amp;rdquo; email 3
months early, followed by an &amp;ldquo;OMFG reNew!&amp;rdquo; call. There was probably
another last minute OMFG renew email too that I&amp;rsquo;m just blotting out.&lt;/p&gt;
&lt;p&gt;Now, somewhere along the way I registered a silly domain that I didn&amp;rsquo;t
care much about. So, I just went with a cheap vendor that I knew
wouldn&amp;rsquo;t disappear tomorrow, in this case I tried &lt;a href=&#34;http://www.godaddy.com&#34;&gt;GoDaddy.com&lt;/a&gt;. I have to admit that I was a
little curious as to what their setup was like too.&lt;/p&gt;
&lt;p&gt;GoDaddy&amp;rsquo;s tools for
managing your domain are not slick. They get the job done but they could
really be simplified and made much more user friendly. But, I only have
to touch them when I set up the domain the first time, and if I ever
change who is hosting it. So, essentially never. I, of course, turned
on the autorenew on that domain and promptly forgot about it.&lt;/p&gt;
&lt;p&gt;A year later GoDaddy sends me an e-mail that essentially says &amp;ldquo;Hey, your domain
is going to autorenew in five days. Here&amp;rsquo;s how much it&amp;rsquo;ll cost. Just
wanted to give you a heads up.&amp;rdquo; then, a smidge later &amp;ldquo;Hey, it
autorenewed. Here&amp;rsquo;s your receipt.&amp;rdquo; And then, the bit that blew me away.
�Maybe a week later I get a phone call (again, paraphrasing).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Hey, this is GoDaddy.com your domain just autorenewed and we wanted
to check that everything is ok, and see if you had any questions or
wanted help with anything.&amp;rdquo; &amp;ldquo;No, I&amp;rsquo;m good. Thanks.&amp;rdquo; &amp;ldquo;Great. Well, have
a nice day.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I was stunned. Practically staring at the phone after they hung up. They
never try to sell me &lt;em&gt;anything&lt;/em&gt;. They never try and get me to renew it
for an extra year, or six, at some discount, although there is one
available. They never try and sell me hosting or mail or anything. They
just call to make sure I&amp;rsquo;m a happy customer. Holy, fucking, shit.&lt;/p&gt;
&lt;p&gt;End result? 13 domains all at GoDaddy.com and price never entered the
decision to transfer.&lt;/p&gt;
&lt;p&gt;P.S. It&amp;rsquo;s funny how many companies don&amp;rsquo;t
understand the simple fact that customers appreciate it when you treat
them the way you&amp;rsquo;d like to be treated. GoDaddy.com apparently does, and
that is why I&amp;rsquo;ve taken the time to relate my tale to you.&lt;/p&gt;
&lt;p&gt;P.P.S GoDaddy.com is a lot like Microsoft in that they engender strong
opinions. And, a bunch of you are going to say &amp;ldquo;OMFG Kay! GoDaddy is teh
suxz0rz!&amp;rdquo; But, I&amp;rsquo;m not hosting my domains with them, I&amp;rsquo;m just using them
as a registrar. And yes, I&amp;rsquo;ve heard some bad tales about what they&amp;rsquo;ll do
to your domain if they think you&amp;rsquo;re a spammer, or doing other bad stuff
which I&amp;rsquo;m not thrilled with, but, for now, let&amp;rsquo;s just keep this focused
on how they handle their customers.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Are you missing the point entirely?</title>
      <link>https://weblog.masukomi.org/2009/02/02/are-you-missing-the-point-entirely/</link>
      <pubDate>Mon, 02 Feb 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/02/02/are-you-missing-the-point-entirely/</guid>
      <description>&lt;p&gt;This keeps happening to me. I follow a link from one interesting blogger
to another, read some post that sparks a question in my mind. Maybe it&amp;rsquo;s
related to the post, maybe it&amp;rsquo;s an unrelated question for the poster.
Sometimes I&amp;rsquo;ve tracked down their site because I found a bug in some
open source software they wrote&amp;hellip; either way, I&amp;rsquo;m on their site and I&amp;rsquo;m
trying to contact them. But guess what? There&amp;rsquo;s no freaking e-mail link
anywhere, not even on the &amp;ldquo;About&amp;rdquo; page. In fact there&amp;rsquo;s no way to
contact them directly at all. Sometimes I&amp;rsquo;ll find a link to Flickr,
which I happen to know lets members send little messages to each other,
but *seriously?!&amp;quot;*What is the fucking point of writing posts on your
blog if you&amp;rsquo;re not going to give anyone a way to respond?&amp;quot;&lt;/p&gt;
&lt;p&gt;If I&amp;rsquo;m &amp;ldquo;lucky&amp;rdquo; they have comments enabled on their blog so if I wanted to be an
ass I could leave a &amp;ldquo;I know this has nothing to do with this post and
this really isn&amp;rsquo;t the place for this question, but you&amp;rsquo;ve left me no
alternative&amp;hellip;.&amp;rdquo; comment on some random post.&amp;quot;&lt;/p&gt;
&lt;p&gt;Usually, these are geek&amp;rsquo;s
blogs, probably sick of getting comment and e-mail spam, which I can
totally empathize with, but, if you&amp;rsquo;re a programmer you are arguably
smart enough to figure out one of the many many ways to stick your
e-mail address on a site without the bots getting it. You can obfuscate
it, you can encode it, or, safest of all, you can just stick it in an
image. I should not have to do a freaking whois lookup on your domain
name to find a way to contact you!&lt;/p&gt;
&lt;p&gt;Blogging is a form of communication. Just spouting off words with no
hope of anyone responding is roughly equivalent to wearing a
&lt;a href=&#34;http://en.wikipedia.org/wiki/Sandwich_board&#34;&gt;sandwich-board&lt;/a&gt; with
&amp;ldquo;Repent! The end is nigh!&amp;rdquo; in one foot high letters and yelling about
how God is coming for us *nowwww!!!*You&amp;rsquo;re both spouting off about
something you care about and neither of you have any real chance of
actually communicating with anyone. The only difference is that you&amp;rsquo;re
not a nutter.&lt;/p&gt;
&lt;p&gt;So please, put a fucking way to contact you on your god
damn blog or stop writing interesting shit. One or the other. I don&amp;rsquo;t
care which.&lt;/p&gt;
&lt;p&gt;Arrgh!&lt;/p&gt;
&lt;p&gt;P.S. If you want to &lt;a href=&#34;https://weblog.masukomi.org/about&#34;&gt;contact me&lt;/a&gt;. Feel free.
I&amp;rsquo;ve got seven different ways listed on that page, and my phone number&amp;rsquo;s on my resume,
which I&amp;rsquo;m not linking to because I&amp;rsquo;m not looking for a new job and
because I don&amp;rsquo;t really want to talk to people on the phone. So :P P.P.S
I&amp;rsquo;ve always made it a point to make it easy for people to contact me on
the blogs I&amp;rsquo;ve had over the past ten plus years and I&amp;rsquo;ve never had a
problem with it. I use good spam filters on my e-mail and my comments
(because I&amp;rsquo;m not an idiot), and am not afraid of blocking someone on IM,
although that only ever seemed to be a problem on ICQ. When someone
wants to ask a question, or share a comment about something I&amp;rsquo;ve written
they can, and I treasure the knowledge that I&amp;rsquo;ve written something
interesting enough to spark a thought in someone&amp;rsquo;s brain worth writing
down.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Shopping: musical geek style</title>
      <link>https://weblog.masukomi.org/2009/01/29/shopping-musical-geek-style/</link>
      <pubDate>Fri, 30 Jan 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/01/29/shopping-musical-geek-style/</guid>
      <description>&lt;p&gt;**Background:**I&amp;rsquo;m a musician, or, I was. I used to want to be a studio
bassist. When I&amp;rsquo;m in the house I&amp;rsquo;m frequently singing about whatever I&amp;rsquo;m
doing. When I&amp;rsquo;m walking down the street I&amp;rsquo;m not just striding across
pavement, I&amp;rsquo;m beating out quarter notes with my feet. Sometimes I add in
syncopated�rhythms with my hands slapping my thighs. So, when it comes
to remembering what to buy at the store there&amp;rsquo;s a song for that too.
Here&amp;rsquo;s how it&amp;rsquo;s made. Maybe it&amp;rsquo;ll help you remember what to pick up too.
**Step one:**list, out loud, everything you need to buy. Everything has
to have an even number of syllables. If it doesn&amp;rsquo;t call it something
else, or just draw out the last syllable as you sing it. Generally you
just want two syllables per item. Today&amp;rsquo;s list was:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pasta (tortellini)&lt;/li&gt;
&lt;li&gt;butter&lt;/li&gt;
&lt;li&gt;hair goo (conditioner)&lt;/li&gt;
&lt;li&gt;cat shit (kitty litter)&lt;/li&gt;
&lt;li&gt;waffles&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Step two&lt;/strong&gt;: order it in the reverse order you&amp;rsquo;ll be picking it up in
the store. I typically go around my store counter clockwise grabbing
things at the ends of the aisles closest to the side of the circle I&amp;rsquo;m
on. The first item in your song is the last item you&amp;rsquo;ll pick up. This
reverse ordering is critical, and I&amp;rsquo;ll get to why in a moment. If you
don&amp;rsquo;t know the store you&amp;rsquo;ll be shopping in you&amp;rsquo;re screwed. Just accept
that you&amp;rsquo;ll forget something and do your best. Or, write it down. That
works too, but it&amp;rsquo;s just no fun. **Step three:**start walking. If you
drive to the store then maybe you should park at the far end of the
parking lot. You could probably use the exercise anyway. &lt;strong&gt;Step four:&lt;/strong&gt;
start singing. Each step is a quarter note. One item per step. One
eighth note per syllable. I sing out loud until I get to the store to
really cement it in my brain, and to myself when I get there so that
people don&amp;rsquo;t look at me like an idiot for singing a repetitive tune
about &amp;ldquo;hair goo&amp;rdquo; and &amp;ldquo;cat shit&amp;rdquo;. &lt;strong&gt;Step five:&lt;/strong&gt; remove the item from the
list as you pick it up. This is where it becomes critical to have your
items in reverse order of acquisition. You don&amp;rsquo;t have to think which one
it is because it&amp;rsquo;s always the last, and it juts makes your song shorter.
By the end of my list of was singing &amp;ldquo;pas-ta but-ter *step* *step*
*step* pas-ta but-ter *step* *step*&amp;rdquo; and then &amp;ldquo;pas-ta *step*
*step* pas-ta *step* *step*&amp;rdquo; If, however my list wasn&amp;rsquo;t in reverse
order I&amp;rsquo;d have to go through the whole thing each time in order to get
to the item i needed to buy. This sucks with a long list, and if you
stop singing when you get to the item that&amp;rsquo;s closest to you you&amp;rsquo;re
likely to forget the end of the song. With a reverse ordered list the
more you pick up the easier it gets because it gets a little shorter
each time. Otherwise it just becomes &amp;ldquo;&amp;lt;item&amp;gt; &amp;hellip;did I get that? yeah..
&amp;lt;item&amp;gt; still need that&amp;hellip; &amp;lt;item&amp;gt; oh that&amp;rsquo;s two rows down but other
thing is closer.&amp;rdquo; I didn&amp;rsquo;t think of reversing the order for a while and
I assure you the songs were much less effective. &lt;strong&gt;Notes:&lt;/strong&gt; I find it
much more fun if I use nicknames for some things. I haven&amp;rsquo;t bought &amp;ldquo;cat
food&amp;rdquo; ever since I saw that Far Side cartoon where the dog wrote &amp;ldquo;Cat
Fud&amp;rdquo; with an arrow on the inside of the dryer door. Now I always buy
&amp;ldquo;cat fud&amp;rdquo;, along with the &amp;ldquo;cat shit&amp;rdquo; (because the cat shits in the kitty
litter), &amp;ldquo;hair goo&amp;rdquo; (why bother specifying the brand?), and so on. Being
silly just makes it even better.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>I don&#39;t know how it got this late...</title>
      <link>https://weblog.masukomi.org/2009/01/23/i-dont-know-how-it-got-this-late/</link>
      <pubDate>Sat, 24 Jan 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/01/23/i-dont-know-how-it-got-this-late/</guid>
      <description>&lt;p&gt;&amp;ldquo;I don&amp;rsquo;t know how it got this late.&amp;rdquo; I said to my dog. &amp;ldquo;Well,&amp;rdquo; I
continued, &amp;ldquo;I do know. I worked late, and I&amp;rsquo;ve been reading&amp;hellip;&amp;rdquo; But then
I stopped. I stopped because I realized that neither of those, or any of
the other excuses we give for &amp;ldquo;how time flies&amp;rdquo; have anything to do with
&amp;ldquo;how it got this late&amp;rdquo;. They&amp;rsquo;re merely how we came to not notice the
passage of time to this point. But we have absolutely no idea &lt;em&gt;how&lt;/em&gt; it
passed. Some scientists have theories that describe its passage but not
the real &lt;em&gt;how&lt;/em&gt; or &lt;em&gt;why&lt;/em&gt; of it. The energy of the Big Bang must be
nothing in comparison to the energy required to move everything in all
the universes forward through time. And yet, we sit here, not just
ignorant, but not even noticing this force that is exerting an obscene
amount of influence on our lives. It&amp;rsquo;s like someone has launched us from
a cannon strapped to the back of a rocket while we continue to discuss
the movie we saw last weekend as if we were calmly sitting on a park
bench. And even that&amp;hellip; even that metaphorical park bench is on a planet
rotating at 465.1 m/s at its equator, 18 1/2 m/s around a sun, that is
itself hurtling away from the center of our universe, and somehow we
delude ourselves into thinking we&amp;rsquo;re stationary upon it. And all of this
is nothing, &lt;em&gt;nothing&lt;/em&gt;, to the force that moves us through time. I see
two possibilities, although I&amp;rsquo;m sure there are more: 1) time is an
incredible pushing force, and maybe the reason we can&amp;rsquo;t travel back in
time is because we can&amp;rsquo;t overcome its inertia. I read a theory once,
that went something like this: if you had a rod that was infinitely long
and infinitely dense, that you could get spinning sufficiently fast, and
then spiraled a space ship around it, the ship would be able to travel
back in time. Now, I am woefully ignorant of physics, and quantum
mechanics, but that sounds a lot like expending energy to overcome an
opposing force. 2) all time exists in one instant so infinitesimally
fine we don&amp;rsquo;t have words, concepts, or even brains capable of
encompassing it. To me a two dimensional plane, with no thickness at
all, is still infinitely thicker than the size of an instant with all
time. If all time exists in an instant, then maybe we are just creatures
whose way of processing it is to have created a linear perception of it.
Maybe those days that seem to fly by in a blink really do. We know that
if you travel fast enough time flows more slowly for you, like
astronauts coming back to earth only to find that the time they spent
away from us was seconds shorter than the time we spent waiting for them
to come back. Maybe, those days, where so much happens so fast, that go
by in a blink, go by in a blink &lt;em&gt;because&lt;/em&gt; so much happened so fast. If
all time exists at once, and it is merely a perception that we&amp;rsquo;re
traveling through it one slice at at time, then who is to say ones
perception doesn&amp;rsquo;t actually move them through it faster? I mean, when
the astronauts land it&amp;rsquo;s not like someone went in and cut out seconds of
their life. Somehow they end up with us at the same place in time, and
yet they got there sooner than the rest of us. I think the physicists
can prove me wrong on that theory, but isn&amp;rsquo;t it a wonderful one to try
and wrap your head around? Regardless of how time works, or why time
works, it concerns me that we are so utterly oblivious to a force that
affects us so completely, and with such disregard. We give it lip
service, we speak as if it&amp;rsquo;s this obvious thing we all understand, but
we haven&amp;rsquo;t a clue, and I, like you, have no idea how it got this late&amp;hellip;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How Borders lost my sale</title>
      <link>https://weblog.masukomi.org/2009/01/18/how-borders-lost-my-sale/</link>
      <pubDate>Mon, 19 Jan 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/01/18/how-borders-lost-my-sale/</guid>
      <description>&lt;p&gt;(And why they&amp;rsquo;re going to loose a lot more if they don&amp;rsquo;t catch up with
the times.) I love Amazon. I&amp;rsquo;ve signed up for &lt;a href=&#34;http://www.amazon.com/gp/subs/primeclub/signup/main.html&#34;&gt;Amazon
Prime&lt;/a&gt; and
definitely get my money&amp;rsquo;s worth out of it. But, Amazon&amp;rsquo;s simply can&amp;rsquo;t
replicate the experience of browsing physical bookshelves and picking up
random books by author&amp;rsquo;s you&amp;rsquo;d never heard of, simply because they
caught your eye. So, I regularly go to physical bookstores, just to see
what I find. It just so happens that the closest bookstore to me is a
Borders, and I&amp;rsquo;m a Border&amp;rsquo;s Rewards member so I regularly have coupons
for a discount on whatever book I want, which is why I found myself
perusing the shelves of Borders yesterday. I found &lt;a href=&#34;http://www.amazon.com/gp/product/0979663660?ie=UTF8&amp;amp;tag=masukomiorg-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0979663660&#34;&gt;Lonely Werewolf
Girl&lt;/a&gt;,
which sounded intriguing, but odd enough that it could have been crap.
So, I pulled out my phone and looked up the reviews on Amazon, which
suggested that it was worth checking out, but, I also noticed the price
was five dollars less. Five dollars is almost the cost of another mass
market paperback. Now, I&amp;rsquo;m totally willing to pay a little more for any
book in a store, because they&amp;rsquo;re the ones who led me to it on their
shelves, and because I get to read it immediately. But I&amp;rsquo;m not going to
give up the cost of almost another book. Next up was &lt;a href=&#34;http://www.amazon.com/gp/product/1591841992?ie=UTF8&amp;amp;tag=masukomiorg-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1591841992&#34;&gt;The Back of the
Napkin: Solving Problems and Selling Ideas With
Pictures&lt;/a&gt;.
From flipping through it in the store I was confident I wanted it, and I
almost didn&amp;rsquo;t bother looking it up on Amazon, but, having almost spent
five dollars extra on the other one&amp;hellip; I sat back down and pulled my
phone back out. Ten dollars this time! It was $24.95 (plus tax) at
Borders and $15.64 at Amazon. There&amp;rsquo;s no way I was going to pay 90% more
for the same book. Yeah, I really wanted to read it right away&amp;hellip; but
90%?! But this story doesn&amp;rsquo;t have to be an indicator of the fall of
brick and mortar bookstores. There&amp;rsquo;s no reason Border&amp;rsquo;s can&amp;rsquo;t
compensate. Borders.com is already hosted by Amazon (for some bizarre
reason) so why not make the kiosks at all the Borders show me not only
if the book is in stock, but bring up the reviews so I don&amp;rsquo;t have to
deal with my phone. And, keep an eye on the prices online, especially
Amazon&amp;rsquo;s. Apps like &lt;a href=&#34;http://www.androidapps.com/t/shopsavvy&#34;&gt;ShopSavvy&lt;/a&gt;
just make it incredibly easy to compare prices, and they&amp;rsquo;re only going
to become more ubiquitous. Just pick up the book, scan the barcode with
your phone, and voilla comparison shopping, and reviews in seconds. Now,
most people don&amp;rsquo;t have Amazon Prime (free 2 day shipping on essentially
everything at Amazon), which means that Borders, and other brick and
mortars have a pricing advantage because of shipping costs, but most
people don&amp;rsquo;t think about shipping costs, and even if I was affected by
shipping costs, they still wouldn&amp;rsquo;t have compensated for the fifteen
dollar price difference. Traditional bookstores can survive, but they&amp;rsquo;ve
got to be at least &lt;em&gt;close&lt;/em&gt; on price, and they&amp;rsquo;ve got to overcome the
fact that Amazon offers me piles of reviews on everything I&amp;rsquo;m unsure
about. No matter how good your staff is, there&amp;rsquo;s no way they can have
read everything. I want the traditional stores to survive. And while I
am willing to pay a small premium to them for the services they offer
me, there&amp;rsquo;s only so far I, or anyone else, is willing to go in that
area, and it&amp;rsquo;s getting far too easy to find out when the prices are
non-competitive. [Update] according to MKB Borders finally recovered
their brain and split from Amazon.com. I never did understand their
connection. Not only did Borders.com go to Amazon.com, after one click
there was no more Borders branding and none of the purchases counted
towards Borders Rewards, and they would obviously be making less than if
they sold the books themselves. [Update] related post: &lt;a href=&#34;https://weblog.masukomi.org/2007/08/11/how-borders-made-me-into-a-regular-customer&#34;&gt;How Borders made
me into a regular
customer&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Hyundai is Brilliant</title>
      <link>https://weblog.masukomi.org/2009/01/17/hyundai-is-brilliant/</link>
      <pubDate>Sun, 18 Jan 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/01/17/hyundai-is-brilliant/</guid>
      <description>&lt;p&gt;(and why you should support them) Right now, most people are a little
concerned about their jobs. Right now, the economy is going to shit
because people are buying less. Part of this is the banks not giving out
many loans. Part of it is that people have less income, or fear a sudden
loss of it. But, Hyundai has just done something absolutely brilliant.
They&amp;rsquo;ve made an offer: buy one of their cars, and if you loose your job
within a year, you can give it back. On the surface this seems
incredibly generous, and in a way, it is. But, the risk to them is
probably quite small. You see, car manufacturers let people return cars
all the time. It&amp;rsquo;s called a lease. But normally they get cars back with
two years of wear and tear. With this deal, whatever cars they get back,
come back with only one year of wear. Sales are down for all car
manufacturers. Dramatic measures are going to be required for them to
make it through this. And this, is awesome, because everybody wins. And,
as far as the cars go? Once upon a time I spent $2,000 on a used
Hyundai. I drove it for years, and if it hadn&amp;rsquo;t left town with my ex,
I&amp;rsquo;d still be driving it now. It wasn&amp;rsquo;t perfect. But, it was one of the
best, and most affordable, cars I&amp;rsquo;ve ever owned. As far as I&amp;rsquo;m concerned
, it was totally undervalued. I wouldn&amp;rsquo;t hesitate to buy one again. And,
if you need a new car? I think you should give Hyundai some real
consideration, if for no other reason than the fact that they have the
courage, and intelligence, to make you an offer like this. &lt;strong&gt;P.S. While
the company may be brilliant, their web designers are beyond retarded&lt;/strong&gt;.
&lt;a href=&#34;http://www.hyundai-motor.com/&#34;&gt;The main site&lt;/a&gt; is completely blank in
Safari, and &lt;a href=&#34;http://www.hyundaiusa.com/&#34;&gt;their USA site
actually&lt;/a&gt;&lt;em&gt;&lt;a href=&#34;http://www.hyundaiusa.com/&#34;&gt;closes the
window&lt;/a&gt;&lt;/em&gt;&lt;a href=&#34;http://www.hyundaiusa.com/&#34;&gt;when you try and go there in
Safari.&lt;/a&gt; I&amp;rsquo;m not kidding. It&amp;rsquo;s all &amp;ldquo;No! I&amp;rsquo;m
not decent!&amp;rdquo; *slams the door in your face*. Actually, maybe it&amp;rsquo;s just
having an affair and wants you to think it&amp;rsquo;s indecent. Because, when you
show up in Firefox it&amp;rsquo;s all &amp;ldquo;Hellooo sexy. Wanna come in and&amp;hellip;view my
&amp;lsquo;curves&amp;rsquo;?&amp;rdquo;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Magic to the Bone [Book Review]</title>
      <link>https://weblog.masukomi.org/2009/01/16/magic-to-the-bone-book-review/</link>
      <pubDate>Sat, 17 Jan 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/01/16/magic-to-the-bone-book-review/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/0451462408?ie=UTF8&amp;amp;tag=masukomiorg-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0451462408&#34;&gt;Magic to the
Bone&lt;/a&gt;
is the best Urban Fantasy I&amp;rsquo;ve read in ages. Buy it &lt;em&gt;now&lt;/em&gt;. This as
another one of my impulse buys. If it weren&amp;rsquo;t for the quote on the cover
from &lt;a href=&#34;http://www.amazon.com/gp/product/0441013813?ie=UTF8&amp;amp;tag=masukomiorg-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0441013813&#34;&gt;Patricia
Briggs&lt;/a&gt;
I wouldn&amp;rsquo;t have bothered, but I really respect Patricia&amp;rsquo;s writing and,
of this book, she said &amp;ldquo;Loved It. Fiendishly Original.&amp;rdquo; I couldn&amp;rsquo;t agree
more. The book is set in an alternate world where magic has been
discovered, harnessed, and commoditized just like electricity. According
to the jacket,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Everything has a cost. And every act of magic exacts a price from its
user maybe a two-day migraine&amp;hellip;But some people want to use magic
without paying, and they Offload the cost onto innocents. When that
happens, it falls to a Hound to identify the spell&amp;rsquo;s caster - and
Allison Beckstrom&amp;rsquo;s the best there is.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Just to add a little twist, Devon Monk (the author) has added the minor
problem that when our heroine casts she sometimes looses a piece of her
memory. The bigger the spell the bigger the chance of a bigger memory
loss. Initially it serves as a mechanism to help give the character a
little depth by way of watching her handle the fact that she&amp;rsquo;s missing
random pieces of her life, and many times you&amp;rsquo;re not sure if her claims
of having not done things, like meeting her most recent step-mother, are
true, or if she&amp;rsquo;s just lost the memory of it. And in the end her memory
loss serves to as the basis of a wonderful epilogue, and a new
beginning. Devon&amp;rsquo;s made Allison a strong woman who&amp;rsquo;s very believable and
filled with very human failings like self doubt, claustrophobia, and a
tendency to jump into bed too quickly with guys she knows too little
about. And I like that things like her claustrophobia aren&amp;rsquo;t used as
plot devices. They&amp;rsquo;re simply pieces of her character. The wonderful
thing about the characters in this books is their believability. In many
books, especially in this genre, you can easily figure out the overdone
stereotyped personality driving each character and know exactly how
they&amp;rsquo;re going to react to everything long before they do. But, in
Devon&amp;rsquo;s world the people are more like the random people in each of our
lives. People who rarely fit into any obvious stereotype. Now, I won&amp;rsquo;t
claim that the book is totally unpredictable, but I must admit, that
while I knew &lt;em&gt;what&lt;/em&gt; was going to happen, it wasn&amp;rsquo;t clear until the end
&lt;em&gt;why&lt;/em&gt; it was going to happen or how everyone tied together. When I buy
an urban fantasy I&amp;rsquo;m paying for an enjoyable escape into a world that&amp;rsquo;s
filled with interesting people, and a bit of excitement, and Devon
delivers. How good is this? This is, without a doubt, one of the best
urban fantasy books I own. I&amp;rsquo;ve just pre-ordered the second one, and if
I lost the first I would buy it all over again without hesitation.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Developershare [definition]</title>
      <link>https://weblog.masukomi.org/2009/01/13/developershare-definition/</link>
      <pubDate>Tue, 13 Jan 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/01/13/developershare-definition/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Developershare&lt;/strong&gt;: adj.  The percentage or proportion of the total available
pool of developers that is coding for a particular product or platform.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;: Regardless of how good the Palm Pre is, Palm will be
hard-pressed to steal any of iPhone&amp;rsquo;s developershare.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Aspirin Is Moving</title>
      <link>https://weblog.masukomi.org/2009/01/11/aspirin-is-moving/</link>
      <pubDate>Sun, 11 Jan 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/01/11/aspirin-is-moving/</guid>
      <description>&lt;p&gt;[EDIT] Aspirin was a great idea, but spam has ruined email sending.
These days, there are very few situations where an email sent via a
home computer will ever reach its destination. It will be considered spam,
because of its source.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://github.com/masukomi/aspirin&#34;&gt;Aspirin&lt;/a&gt; is an embeddable Java SMTP
server, that&amp;rsquo;s been fairly well received. This is just an announcement
of its new home and a notable change to the codebase.* There&amp;rsquo;s been a
lingering threading bug with it which resulted in the only way to kill
it being to use a &lt;code&gt;System.exit()&lt;/code&gt; call.&lt;/p&gt;
&lt;p&gt;In an attempt to clean up the
codebase, and make it easier for developers like you to work on it, and
pass back any interesting patches you&amp;rsquo;ve made, I&amp;rsquo;ve taken two notable
steps:&lt;/p&gt;
&lt;p&gt;The first is that I&amp;rsquo;ve converted Aspirin into a single threaded
beast. Throw what you want in it&amp;rsquo;s queue and it&amp;rsquo;ll churn its way through
it in a background thread which will go away when it&amp;rsquo;s done. No more
thread pool. So far I&amp;rsquo;ve just made an initial pass at it. While it
should be functional it definitely needs more testing and should be
considered alpha.&lt;/p&gt;
&lt;p&gt;Secondly, I&amp;rsquo;ve moved all development over to GitHub.
This is where you&amp;rsquo;ll find the new single-threaded version. I&amp;rsquo;ve done
this because git allows you to make as many changes to it as you want
with all the benefits of version control, and without me having to allow
any random Joe to commit to the master repo. However, I would be more
than happy to accept essentially any patch you feel like pushing back
(incredibly easy on GitHub).&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve got no real agenda for Aspirin. I want
it to be small, easy to use, and trustworthy. If you have a one line
fix, or tweak send it in. If you have a new feature you&amp;rsquo;ve added to your
copy (big or small) send it in. If you reorganized the code in your copy
to be more readable, send it in. Almost anything you send it will be
accepted into the main repo, I just want to give it a once-over to make
sure it&amp;rsquo;s not going to harm anthing, and that it actually benefits
something.&lt;/p&gt;
&lt;p&gt;The url for Aspirin on GitHub is here
&lt;a href=&#34;http://github.com/masukomi/aspirin&#34;&gt;http://github.com/masukomi/aspirin&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;On a related note, I&amp;rsquo;m planning on making a fork of Aspirin that&amp;rsquo;s
tailored to working on Android. Because there really needs to be a way
to send e-mail without having to display an editable e-mail message to
the user.&lt;/p&gt;
&lt;p&gt;The plan is to hook into the same sending mechanisms that the
Gmail app uses, and have e-mails send out silently but be visible in the
users sent-mail folder. If you&amp;rsquo;re interested in such a beast, &lt;a href=&#34;https://weblog.masukomi.org/about&#34;&gt;drop me a
note&lt;/a&gt; and I&amp;rsquo;ll make sure to keep you
in the loop. * Unfortunately dev.java.net gives me no good tools for
contacting the &amp;ldquo;observers&amp;rdquo; on the project. WTF is the point of letting
people sign up as observers (or developers, or anything else) if you
can&amp;rsquo;t communicate with them except via a mailing list they may not be
on?! I &lt;em&gt;so&lt;/em&gt; regret putting aspirin on that site.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>4 1/2 Killer Mac Apps</title>
      <link>https://weblog.masukomi.org/2009/01/08/killer-mac-apps/</link>
      <pubDate>Thu, 08 Jan 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/01/08/killer-mac-apps/</guid>
      <description>&lt;p&gt;Yesterday I was discussing the fact that I need a new laptop and how
much I wanted to get an &lt;a href=&#34;http://www.shopping.hp.com/mini/&#34;&gt;HP Mini 1000&lt;/a&gt;
(cheap, ultra light, good manufacturer), but couldn&amp;rsquo;t because of those
damn independent Mac developers. They keep making incredible apps I
simply won&amp;rsquo;t give up. Unsurprisingly, he asked me what my killer apps
were for the Mac, and I thought you might be interested too. But, before
I start the list, I just have to give a major shout-out to the indie
developers for OS X. You guys make the most creative, useful, and
beautiful software on any platform. If it weren&amp;rsquo;t for you I would have
given up my Mac years ago.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;http://www.literatureandlatte.com/scrivener.html&#34;&gt;Scrivener&lt;/a&gt;
Scrivener is a writer&amp;rsquo;s Swiss Army Knife from the future. I say
&amp;ldquo;from the future&amp;rdquo; because unlike a modern Swiss Army Knife, and MS
Word, it does&amp;rsquo;n&amp;rsquo;t throw every possible option in front of you. No,
it keeps them subtly out of view, waiting until you need them.
Unfortunately, this means that unless you actually walk through the
tutorial it comes with, you&amp;rsquo;ll only notice the superficial goodness,
and not the myriad Pieces Of Awesome that are hidden in plain
sight.It&amp;rsquo;s filled with tools to help you organize your writing,
reference material, thoughts, etc. Honestly, I can&amp;rsquo;t even begin to
encompass how amazing this tool is for writers. The only thing I
wish it had was bibliography support.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.omnigroup.com/applications/OmniGraffle/&#34;&gt;OmniGraffle&lt;/a&gt; I
admit it. I like making flow charts, and nothing makes flow-charting
as fun, easy, or beautiful as OmniGraffle. I constantly get comments
on the look of my OmniGraffle flow charts. It&amp;rsquo;s also great for web
mock-ups (just grab some of the free stencils). Yeah, I&amp;rsquo;m sure Visio
has more features, but Visio is ugly, no fun to use, and I really
don&amp;rsquo;t give a damn if my flow charting software can&amp;rsquo;t map my LAN.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.delicious-monster.com/&#34;&gt;DeliciousLibrary&lt;/a&gt; Nothing makes
cataloging your media easier or more beautiful than
DeliciousLibrary. There are lots of competing apps on every
platform, but nothing is even remotely as nice to look at, or as
easy to use, which is sad, because the company behind DL sucks when
it comes to adding new features**, and it leaves out some obvious
ones, like you can lend out books, but not borrow them. &lt;a href=&#34;http://www.masukomi.org/library/&#34;&gt;The HTML
export is beautiful&lt;/a&gt;, (there is
another prettier, but less functional output too) but gives you very
little control over the end result. But, even with all its little
annoyances it&amp;rsquo;s still twice as good as anything else out there. And,
they&amp;rsquo;ve just released an iPhone app that syncs with your desktop,
which is probably cool, but does me no good because I have an
&lt;a href=&#34;http://www.android.com&#34;&gt;Android&lt;/a&gt; phone.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.freeverse.com/apps/app/?id=6020&#34;&gt;LineForm&lt;/a&gt;&lt;br&gt;
[Update] Lineform is no-longer updated and prone to crashing in the
current versions of OS X. I don&amp;rsquo;t have a recommended replacement..&lt;br&gt;
For the average person I wouldn&amp;rsquo;t normally classify LineForm as a
killer app. It&amp;rsquo;s a good vector art package, but it&amp;rsquo;s simple. On the
other hand, it&amp;rsquo;s $80 not $600 like Illustrator*. In spite of it&amp;rsquo;s
simplicity I&amp;rsquo;ve come to really enjoy this app, and because I use it
five days a week to create things &lt;a href=&#34;http://comic.masukomi.org/tag/favorites&#34;&gt;like
this&lt;/a&gt;, switching to
anything else that could produce the same quality of results would
be painful, or ridiculously overpriced. So, for me it&amp;rsquo;s a de-facto
killer app. I did a write-up before about why I chose
&lt;a href=&#34;https://weblog.masukomi.org/2008/03/17/finding-a-decent-vector-graphics-app-for-os-x&#34;&gt;LineForm&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.flyingmeat.com/voodoopad/&#34;&gt;VoodooPad&lt;/a&gt; Ok, technically,
VoodooPad isn&amp;rsquo;t a &amp;ldquo;killer app&amp;rdquo; for me. It alone wouldn&amp;rsquo;t keep me
from leaving the Mac, but it is freaking awesome! Like many of these
apps, the thing that makes it awesome is it&amp;rsquo;s subtle power. On the
surface it&amp;rsquo;s just a personal wiki. But, it is so well implemented
that it just makes you want to use it more and more. In my opinion
none of the competiton comes anywhere close to VoodooPad. It&amp;rsquo;s great
for personal knowedge bases, building up research, and 42,001 other
uses.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;All of these apps have free trials. If any of them sound interesting to
you, please download them and give them a try. They are each worth every
penny. * Yes, I could pirate Illustrator, but as a software developer
it&amp;rsquo;s important to me to only use software that&amp;rsquo;s free or has been
legitimately paid for. I wouldn&amp;rsquo;t want anyone pirating software I wrote
so I won&amp;rsquo;t do it to them. And yes, &lt;a href=&#34;http://www.inkscape.org/&#34;&gt;Inkscape&lt;/a&gt;
is arguably more powerful than Lineform, and I like it, but I can&amp;rsquo;t use
Inkscape on a Mac because OS X&amp;rsquo;s X server doesn&amp;rsquo;t support pressure
sensitivity, and it tends to slow everything down, which screws up long
flowing lines. ** They have updated Delicious Library with new
features since it was originally released, and they are quite good, but
it took years to actually get them the last time around. And it still
can&amp;rsquo;t @$#% let me borrow a book! Also, there was lots of frustration on
their forums and very little interaction from the company when the last
version was months late in coming out. So, the app rocks but I&amp;rsquo;m not
thrilled with the support or the co.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Petitioning the god</title>
      <link>https://weblog.masukomi.org/2009/01/05/petitioning-the-god/</link>
      <pubDate>Mon, 05 Jan 2009 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2009/01/05/petitioning-the-god/</guid>
      <description>&lt;p&gt;With purpose, and a focused mind, I prepare to petition the god. Up from
my desk I rise, and walk forth. Down the hall, into the room where his
idol waits.&lt;/p&gt;
&lt;p&gt;I pull my offering from my pocket: a small piece of paper
covered with symbols, and the face of a past leader, all done in green.&lt;/p&gt;
&lt;p&gt;Carefully, I prepare it, making sure it is flat, and smooth. The god
will accept nothing less. With two hands, and head bowed, I hold my
offering to his mouth, my breath holds for a second. Is it good enough?
Will he accept it?&lt;/p&gt;
&lt;p&gt;It starts to pull from my fingers, but this is no
guarantee. He will consider it&amp;rsquo;s worth, and quality. If it&amp;rsquo;s not good
enough he will spit it out. He is not a mean god, but he is a strict
one.&lt;/p&gt;
&lt;p&gt;He would let me try again, but today, there is no need. He accepts
my offering. I can touch his colorful side, adorned with symbols, and
raised areas for the hands of supplicants.&lt;/p&gt;
&lt;p&gt;I choose one, head still bowed, and wait.&lt;/p&gt;
&lt;p&gt;It is rare for a supplicant to be rejected at this
point, but it has happened; sometimes they choose wrong, and sometimes
it seems the god changes his mind, to teach them a lesson maybe&amp;hellip; Who
can know how the mind of a god works.&lt;/p&gt;
&lt;p&gt;An instant later a sound emerges from deep within the idol. And a bright
cylinder appears in his pocket.  A cylinder for me! It is a Coke! The god has
accepted my offering! With shaky hands I pull the tab, and feel the sweet
caffeinated rush of his glory.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Practical Magic [Review]</title>
      <link>https://weblog.masukomi.org/2008/12/31/practical-magic-review/</link>
      <pubDate>Wed, 31 Dec 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/12/31/practical-magic-review/</guid>
      <description>&lt;p&gt;A while ago I stumbled across the movie &lt;a href=&#34;http://www.amazon.com/gp/product/0790740060?ie=UTF8&amp;amp;tag=masukomiorg-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0790740060&#34;&gt;Practical
Magic&lt;/a&gt;,
and loved it. It&amp;rsquo;s this wonderful, playful, tale about finding love and
accepting the magic that lives within yourself. And then, a few weeks
ago, I discovered that it was based on &lt;a href=&#34;http://www.amazon.com/gp/product/0425190374?ie=UTF8&amp;amp;tag=masukomiorg-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0425190374&#34;&gt;a book by the same
name&lt;/a&gt;,
which I immediately purchased. What I read though, wasn&amp;rsquo;t a better
version of the movie, as is typically the case. It was something else
entirely. A slightly sad tale of finding women finding love even though
they believed they either didn&amp;rsquo;t deserve it, or didn&amp;rsquo;t want it. And
somehow, along the way, Sally&amp;rsquo;s children found maturity within
themselves. It was wonderfully written, but sadly mundane. &amp;ldquo;The Aunts&amp;rdquo;
still practice magic, and practically embody the witch stereotype. But
they&amp;rsquo;re not much more than that. Just, witchy sisters who dress in
black, &amp;ldquo;cast spells&amp;rdquo;, shun society, and happen to raise the main
characters. In the movie they&amp;rsquo;re happy, playful, sneaky, strong women
who happen to be witches ostracized by superstition. It was as if the
screenwriter took the main themes, and characters, of the book and
reworked them into an entirely new tale. But, the movie does remain true
to the spirit of the book. They definitely count as a chick-flick, and
chick-lit respectively, but which one is for you depends a lot on how
you see the world. Is it a place filled with magic that you&amp;rsquo;ve mostly
been ignoring since childhood? Or, is the world nothing more than the
mundaneness that surrounds you? If the former, watch the movie. If the
latter, go read the book. They&amp;rsquo;re both quite good, but, despite its
title, and skillfull writing, the book really doesn&amp;rsquo;t feel very magical,
and even though it has a happy ending it&amp;rsquo;ll leave you feeling a little
melancholy.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Why you think the Caps Lock key is useless</title>
      <link>https://weblog.masukomi.org/2008/12/31/why-you-think-the-caps-lock-key-is-useless/</link>
      <pubDate>Wed, 31 Dec 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/12/31/why-you-think-the-caps-lock-key-is-useless/</guid>
      <description>&lt;p&gt;Years ago I thought like many of you do; that the caps lock key is a waste of space. I never really got any benefit from it. It was just as easy, if not easier, to just keep a pinky on shift while I typed. There was even an article in Wired: &lt;a href=&#34;http://www.wired.com/science/discoveries/news/2006/08/71606&#34;&gt;Death to Caps Lock&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But then my eyes were opened, and I learned that the only reason I didn&amp;rsquo;t &amp;ldquo;get&amp;rdquo; the caps lock key was because I was a shitty typist. Sure, I could type over 100 words per minute, but my typing still sucked. It was some awkward crap that was bad for my wrists and that I&amp;rsquo;d just organically taught myself.&lt;/p&gt;
&lt;p&gt;Then I learned to type correctly.&lt;/p&gt;
&lt;p&gt;For me it was a side-effect of switching to Dvorak (because I care about my wrists). I decided that if I was going to do it I was going to do it right, so I made sure I kept my fingers in home position, and typed the way you&amp;rsquo;re supposed to, with a minimum of movement. And along the way something magical happened: my pinkies became truly useful participants in my work. I didn&amp;rsquo;t consciously notice this until a few days ago, when I came across yet another article decrying the caps lock key, and thought, &amp;ldquo;But, I use caps lock regularly&amp;hellip;&amp;rdquo; I realized that that wasn&amp;rsquo;t always the case. I started using it, when I learned to type correctly, because my pinkies were busy doing real work and couldn&amp;rsquo;t be wasted holding down some shift key for entire words.&lt;/p&gt;
&lt;p&gt;If you think the caps lock is an essentially useless key, odds are, it&amp;rsquo;s because you&amp;rsquo;re simply a crappy typist.&lt;/p&gt;
&lt;p&gt;I think Jeff Attwood said put it well. &lt;a href=&#34;http://www.codinghorror.com/blog/archives/001188.html&#34;&gt;We are Typists First, Programers Second&lt;/a&gt;. If you haven&amp;rsquo;t read that yet, I strongly suggest you do.&lt;/p&gt;
&lt;p&gt;On the off chance that some of you will actually get off your ass and learn to type correctly you should be prepared for a major obstacle, namely, your own bad habits. The thing is you &amp;ldquo;need to get stuff done&amp;rdquo; and it&amp;rsquo;s far easier to do that using your old crappy typing method than it is while having to focus on correct finger position. But, trust me, it&amp;rsquo;s far too easy to slide back into your old lazy habits. Your brain is going to fight you on this. It has millions of past keystrokes telling it the &amp;ldquo;right&amp;rdquo; way to do things. You need to make a clean break. Go cold turkey. No more crap typing for you. You will type correctly or not at all!&lt;/p&gt;
&lt;p&gt;Now, the following is not for the faint of heart. It&amp;rsquo;s hard medicine. &lt;strong&gt;In fact, you should probably just stop reading right here, because you simply don&amp;rsquo;t have the willpower to do what&amp;rsquo;s best for you.&lt;/strong&gt; Forcing yourself to type correctly will be mentally painful enough. Actually learning to type in such a way as minimize your chances of carpal tunnel and have a long and productive career at the keyboard&amp;hellip; That&amp;rsquo;s too much for you. Going down that road is like quitting smoking. Sure it&amp;rsquo;s going to fuck you up in the end, but let&amp;rsquo;s face it, you&amp;rsquo;re just too lazy to do anything about it, and anyway that&amp;rsquo;s &amp;ldquo;in the future&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Or, maybe you&amp;rsquo;re not. Maybe, just maybe, you are smart enough, and have the chutzpah, to recognize that going through a little pain in the short run is worth it to help avoid carpal tunnel.&lt;/p&gt;
&lt;p&gt;What medicine am I talking about? Dvorak. If you&amp;rsquo;re going to rewire your brain to learn a new way of typing why not go all the way and learn a new keyboard layout that will make typing even easier. The Dvorak keyboard layout was designed to minimize finger movement, and to increase the alternation of hands between keystrokes. While the minimized movement is huge, the alternation of hands makes it much easier to go faster. And I swear on everything I hold holy, Dvorak really &lt;em&gt;feels&lt;/em&gt; better. You know that feeling you get, when you&amp;rsquo;re all tense, and you stop and force yourself to relax your shoulders, and realize you&amp;rsquo;d been scrunching them up for hours without noticing? That feeling when you release the tension you didn&amp;rsquo;t know you were carrying around? That&amp;rsquo;s what typing in Dvorak is like.&lt;/p&gt;
&lt;p&gt;Rewiring your brain to learn how to type once is painful enough, doing it twice&amp;hellip; even I don&amp;rsquo;t really want to go there, so learning to type right, and learning to type on a healthier, and faster, layout are things that should really be combined. Plus, switching to Dvorak will actually make learning to type correctly easier for two reasons. 1) It&amp;rsquo;s harder to type incorrectly in Dvorak than it is to type correctly. 2) It will force you to learn to touch type by virtue of the fact that you don&amp;rsquo;t have a Dvorak keyboard. All those habitual glances down to your keyboard that you don&amp;rsquo;t realize you&amp;rsquo;re making. Suddenly they become totally useless. Actually, they become &lt;em&gt;worse&lt;/em&gt; than useless, because they give you wrong information.  You look down, see the &amp;ldquo;Y&amp;rdquo; key you were looking for and then stop and say &amp;ldquo;shit, that&amp;rsquo;s not &amp;lsquo;y&amp;rsquo; anymore&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;For me, switching to Dvorak, and learning to type correctly was two weeks of pain. I strongly recommend starting after work on Friday. Go home, print out a copy of the layout and stick it by your monitor. Get used to keeping those little dimples on the &amp;ldquo;f&amp;rdquo; and &amp;ldquo;j&amp;rdquo; keys under your index fingers, and type stuff &lt;em&gt;all weekend&lt;/em&gt;, but only do it in Dvorak. It will be frustrating as all get-out. You&amp;rsquo;ll feel like an idiot when it takes you a minute to respond one sentence to an instant message, or ten minutes to send a short email, but by the end of the weekend you&amp;rsquo;ll be doing at least 30 words per minute (which is, sadly, in the neighborhood that most people live).&lt;/p&gt;
&lt;p&gt;By the end of two weeks of consistently using Dvorak you should be back up to 80wpm or more. How much more, is up to you.&lt;/p&gt;
&lt;p&gt;Now, there &lt;em&gt;is&lt;/em&gt; a catch: login screens. Unless you know the magic incantations for your OS, your computer&amp;rsquo;s login screen is still going to be in QWERTY. And, if you&amp;rsquo;re on a work computer you don&amp;rsquo;t want to change that because then the sysadmins will never be able to log in when they have to sit down at your desk and poke something. But, it&amp;rsquo;s not a big deal for you, because there&amp;rsquo;s still a handy reference on the keyboard. You know, that thing you used to have to look at back when you sucked at typing and thought the caps lock key was useless?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>A simple way to encourage API adoption</title>
      <link>https://weblog.masukomi.org/2008/12/14/a-simple-way-to-encourage-api-adoption/</link>
      <pubDate>Sun, 14 Dec 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/12/14/a-simple-way-to-encourage-api-adoption/</guid>
      <description>&lt;p&gt;Let&amp;rsquo;s assume for a minute you have a web site with an API people may
actually want to use. Let&amp;rsquo;s use Flickr as an example. You can do as they
did ( &lt;a href=&#34;http://www.flickr.com/services/api/&#34;&gt;document it thoroughly&lt;/a&gt; and
hope people use it ), or, and this is especially useful if you&amp;rsquo;re
someone competing with an 800 lb. gorilla like Flickr, you can do
something like this: First, figure out who&amp;rsquo;s a developer. If someone&amp;rsquo;s
into your site enough to code for it&amp;rsquo;s API it&amp;rsquo;s generally a safe bet
that they&amp;rsquo;ve got an account on it. When they sign up add a checkbox to
the form: &amp;ldquo;Check here if you write software&amp;rdquo; Add it to their profile
page to so they can check, or uncheck, it later on. Then, whenever a
developer goes to a page, add a small note to the bottom &amp;ldquo;Developers:
you can get the data on this page [link]with these&amp;rsquo;s APIs[/link].&amp;rdquo; and
have that link to a page that indicates exactly which APIs can be used
to get everything on that page, and link to the documentation. This has
two benefits: 1) It&amp;rsquo;s a tease. It says &amp;ldquo;You could do something cool with
this. Look how easy it is&amp;hellip;&amp;rdquo; 2) when someone&amp;rsquo;s still getting up to
speed with your API it makes it much easier to figure out what calls you
should be making to get the information they want.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>On coding for fun</title>
      <link>https://weblog.masukomi.org/2008/12/14/on-coding-for-fun/</link>
      <pubDate>Sun, 14 Dec 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/12/14/on-coding-for-fun/</guid>
      <description>&lt;p&gt;I love programming. I really do. It&amp;rsquo;s one of the few things that really
gets my brain buzzing. In my twenties I&amp;rsquo;d go to work, program my ass
off, then come home and repeat. Or, when I worked for myself, I&amp;rsquo;d just
not stop. But, as I make my way through my thirties I&amp;rsquo;ve found that most
days I come home and simply don&amp;rsquo;t want to look at code anymore.&lt;/p&gt;
&lt;p&gt;I code the back ends to web sites you see, and I&amp;rsquo;ve been working on web dev.
for over twelve years now, and honestly, there&amp;rsquo;s not a lot of innovation
going on in that area. Every now and then someone comes out with a sweet
new framework like Rails, but after the initial fun of learning it, and
trying to convince everyone you know to use it too, you realize that
you&amp;rsquo;re almost always doing the same damn thing: taking form data and
shoving it into a database, then taking crap in a database and shoving
it to the screen. The only difference is which crap you&amp;rsquo;re shoving
around, and where it happens to be stored.&lt;/p&gt;
&lt;p&gt;It seems that the mid-life
crisis comes a bit early to coders, as a number of the ones I&amp;rsquo;ve talked
to have found themselves feeling a bit ground down as they start in on
their thirties, wondering if maybe they shouldn&amp;rsquo;t open a greenhouse or
do something else equally removed from the world of code. I don&amp;rsquo;t blame
them. I&amp;rsquo;ve felt the same way, but every now and then the universe
reminds me that coding can be an absolute blast. That no matter how much
I might enjoy some other simpler profession, there&amp;rsquo;s nothing that&amp;rsquo;d get
my brain buzzing like this.&lt;/p&gt;
&lt;p&gt;John Bender has come up with &lt;a href=&#34;http://nickelcode.com/2008/12/08/developing-for-fun-some-observations/&#34;&gt;five simple rules to keep programming fun&lt;/a&gt;.
And while they&amp;rsquo;re all good, I, like you, look at it a bit differently.
So here are my rules for keeping programming fun.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Remember that
nothing is more important than living a full life.&lt;/strong&gt;&lt;br&gt;
When I worked at iPhrase there was this one guy who worked on the back end. He probably averaged 16+ hour days because he was really into his piece of the project. It really got his brain going. But, eventually, he, like everyone else, got laid off. And I always remember him, because when he looks back on those years of his life, there&amp;rsquo;s nothing there. There was not time for a social life, and IBM now owns (and has probably mothballed) all of the code he wrote. Code is guaranteed to become obsolete. Pretty much anything you work on will be abandoned sooner or later. Don&amp;rsquo;t get so wrapped up in your code that you forget to spend time with the people who matter to you. There will always be more code to write. That weekend getaway with your friends is a little once-in-a-lifetime experience you can&amp;rsquo;t replicate. Sometimes, it&amp;rsquo;s even simpler than that. When you&amp;rsquo;re sitting there coding away and your child, wife, or even pet comes up and asks you to play, or spend time with them, do it. Finish that function, hit save, and walk away from the computer. Do not make them wait more than a few minutes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2) Small, self-useful, projects.&lt;/strong&gt;&lt;br&gt;
John talks about small triumphs, and while those are very important, I&amp;rsquo;d take it even further. I get the most joy out of small projects. Writing some cool little app for my phone that I&amp;rsquo;ll use every day, or some helpful little tool. While John&amp;rsquo;s right that &amp;ldquo;You’re rarely going to write the next big thing, or anything really
meaningful in a single day’s work.&amp;rdquo; To me it&amp;rsquo;s so self evident as to be
a non issue. Not only that, if you attempt to write the &amp;ldquo;next big thing&amp;rdquo;
or anything &amp;ldquo;really meaningful&amp;rdquo; it&amp;rsquo;s going to be work, not play. And I
want to look back and think that ,while I may have been spending some of
my free time coding, I was coding something fun that put a smile on my
face. As such I try and work on very small projects, or very focused
features of someone else&amp;rsquo;s project. Making each feature it&amp;rsquo;s own little
one day project.&lt;/p&gt;
&lt;p&gt;Let me give you an example. I&amp;rsquo;ve been hacking on a fork
of &lt;a href=&#34;http://phandroid.com/2008/09/04/photostream-application-for-android/&#34;&gt;Photostream&lt;/a&gt; because I thought it was a great proof of concept, but one that could
use a lot of improvements. For example, it doesn&amp;rsquo;t support Flickr
contacts. So, while I can add people in manually, I can&amp;rsquo;t say &amp;ldquo;load in
all the people I&amp;rsquo;m following on Flickr.&amp;rdquo; So, one night&amp;rsquo;s project was to
make it support adding a person, their contacts, or them and their
contacts. A small accomplishment, like John says. But, I like to,
whenever possible, make it so that I could walk away, after a nights
work, and have something that would be useful as is, without ever
touching it again.&lt;/p&gt;
&lt;p&gt;If I wasn&amp;rsquo;t forking the whole project I would have
just submitted that change and felt I&amp;rsquo;d accomplished something useful,
that others could benefit from. But, as I make my way through the day at
work I think &amp;ldquo;I wish it would&amp;hellip;&amp;rdquo; and every couple nights I&amp;rsquo;ll boot up
Eclipse and hack in another feature. But, if my dog decides I&amp;rsquo;ve been
spending too much time at the computer, and too little time with him, I
remember rule number one, finish the current thought, or leave myself
enough comments to pick it up tomorrow, and go play with him. But, I&amp;rsquo;ve
found that it&amp;rsquo;s not just about making small goals.&lt;/p&gt;
&lt;p&gt;Time and again I&amp;rsquo;ve found myself getting the most enjoyment out of the smallest projects. A tiny Flickr app, an app that hollers if your servers go down, something that graphs the lines of code per package in a Java project, a distributed bug tracking system, or a library that&amp;rsquo;ll save me tons of frustration on other projects.&lt;/p&gt;
&lt;p&gt;These won&amp;rsquo;t change the world. They aren&amp;rsquo;t &amp;ldquo;really meaningful&amp;rdquo; but they&amp;rsquo;ve all been useful to me, and because they&amp;rsquo;re never so large as to have any chance of becoming work, they&amp;rsquo;re always lots of fun. Instead of hacking the next great foo, consider adding that feature you always wished that app you use every day had. It doesn&amp;rsquo;t matter if you never contribute another thing to that project. It doesn&amp;rsquo;t even matter if you release your code. What matters is that it&amp;rsquo;s
a fun little challenge that you&amp;rsquo;ll appreciate the results of afterwards, and hopefully learn something interesting along the way.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3) It&amp;rsquo;s all about you baby.&lt;/strong&gt;&lt;br&gt;
Never code for anyone else in your free time. If you
do, it&amp;rsquo;s work. &lt;a href=&#34;http://home.earthlink.net/~rdmiller3/&#34;&gt;Rick Miller&lt;/a&gt; left
&lt;a href=&#34;http://comic.masukomi.org/2008/11/18/me-again&#34;&gt;a great example of this in the comments on my
art-blog&lt;/a&gt;. He said,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;I know from experience that something you love doing can become a
pain in the ass when you feel like you have to do it. For a while, I
was making flutes out of any kind of pipe, hose or hollow plant stalks
that I could get my hands on. I used to carry them with me and play
them when I had a few spare moments. Sometimes when someone would make
a positive comment or if a child was curious about the flute I would
hand it to them and say, “It’s yours.” Sometimes I’d give them away
just on a whim. Once I even gave one out through my car window to a
girl in another car on the freeway at 60MPH. Then I agreed to make a
flute for a Spanish fellow for $20. My flutemaking stopped. When I
finally forced myself to make the damned flute, it was nothing to be
proud of. I was glad that my bank couldn’t figure out how to draw on a
check from the boonies of Galacia because I’d have felt bad if the guy
had actually paid for such a piece of crap.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You&amp;rsquo;ve never hear of a child &amp;ldquo;playing for someone else&amp;rdquo;. Why? Because
it&amp;rsquo;s simply not possible to play &lt;em&gt;for&lt;/em&gt; someone else. You can play by
yourself, or &lt;em&gt;with&lt;/em&gt; others, but never &lt;em&gt;for&lt;/em&gt; others.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4) Prioritization.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;John says&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Write whatever you need to put a useful piece of software out, then
add on the frills later. This will let you release earlier, possibly
get feedback and, if anyone is interested in your project, maybe even
get help.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And while that&amp;rsquo;s a good plan, it&amp;rsquo;s a bit too close to work for me. I
prioritize my personal coding like this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2008/12/hacking_for_fun_flow.png&#34; alt=&#34;hacking for fun flow chart&#34;&gt;&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s only when I&amp;rsquo;m about to release a new project that I even begin to
consider what anyone else wants, and even then it&amp;rsquo;s pretty minimal.
Because it doesn&amp;rsquo;t matter to me if you use my code or not. I had fun
writing it and that&amp;rsquo;s the only thing that&amp;rsquo;s important. However, I&amp;rsquo;d feel
bad if my code caused you misery or frustration, so, before the release
of a new project I make sure that I&amp;rsquo;ve got all the basics covered.&lt;/p&gt;
&lt;p&gt;For example, my Photostream fork isn&amp;rsquo;t released yet because if you tried to
load &lt;a href=&#34;http://www.flickr.com/photos/junku/&#34;&gt;junku&lt;/a&gt;&amp;rsquo;s &lt;a href=&#34;http://www.flickr.com/people/junku/contacts/&#34;&gt;3,700+
contacts&lt;/a&gt;, you&amp;rsquo;d almost
assuredly run out of ram. So, I need to add some paging to the list of
your buddies. And, it just wouldn&amp;rsquo;t be right to use the same icon, so I
need to change that too, but, both of these things are things I want to
do for me anyway, and thus they&amp;rsquo;ll be fun, but even if they weren&amp;rsquo;t fun,
the knowledge that it would make others unhappy would make me unhappy.
So I&amp;rsquo;ll do a little work to avoid sadness, and increase everyone&amp;rsquo;s
happiness.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5) Share freely.&lt;/strong&gt;&lt;br&gt;
Talking about &amp;ldquo;advice&amp;rdquo; John says:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;I find myself afraid of asking questions for fear that someone else
will steal my idea or think I’m an idiot, and this keeps me from
heading to the an irc channel when I need help. The bottom line is, 99
percent of the people who come up with really cool ideas never finish
them and most never even start, so if you need to divulge a little in
the interest of getting the thing done, do it.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I say, screw that. You&amp;rsquo;re doing this for fun right? If you&amp;rsquo;re playing it
so close to the vest that you don&amp;rsquo;t want anyone finding out what exactly
you&amp;rsquo;re doing, then you&amp;rsquo;re working not playing. I remember reading a post
by a novelist who talked about how there were all these people with
great ideas for a novel who were afraid to mention them for fear some
author would steal them. But professional authors don&amp;rsquo;t hesitate to
share their ideas because they know that cool ideas are a dime a dozen,
and, like John says, executing on one of them is something hardly anyone
ever bothers to do.&lt;/p&gt;
&lt;p&gt;Even if someone took your idea and ran with it, what they&amp;rsquo;d end up with would be radically different from what you would end up with. Plus, there&amp;rsquo;s the fact that all the stories have pretty much been written already. New novels are just old stories processed through different people&amp;rsquo;s imaginings. As with writing, there are very few new software ideas. Mostly, we&amp;rsquo;re just making iterative improvements to existing ideas.&lt;/p&gt;
&lt;p&gt;Personally, I&amp;rsquo;ve got notebooks filled with ideas for projects, and about half of them would be profitable businesses, but I&amp;rsquo;m not going to implement 99% of them (and if any of my geek friends was in need of a business idea they&amp;rsquo;re there for the taking).&lt;/p&gt;
&lt;p&gt;&lt;em&gt;So ask your questions. Discuss your ideas.&lt;/em&gt; &amp;ldquo;Worst&amp;rdquo; case scenario someone else does most, or all, of the work for you, and you get that fun app you wanted without having to lift a finger, which leaves you more time to work on that &lt;em&gt;other&lt;/em&gt; fun app. Or maybe they point out that you really &lt;em&gt;are&lt;/em&gt; an idiot, but, wouldn&amp;rsquo;t it be better to discover that you&amp;rsquo;re doing something stupid *before* you spend weeks coding on it?  Best case scenario, you get free suggestions on how to make your thing better, and if you release it open source then &lt;em&gt;maybe&lt;/em&gt; someone will send in a patch with a nifty new feature, or fix that bug you never got around to addressing.&lt;/p&gt;
&lt;p&gt;Remember, as soon as you start charging for it, you have responsibilities to the users, and those can very quickly turn into work. And if you&amp;rsquo;re not charging for it there&amp;rsquo;s no good reason not to release it as open source. Plus, every time you get a patch or a bug fix sent in it&amp;rsquo;s like a mini-christmas. Some surprise present, and we all like presents.&lt;/p&gt;
&lt;p&gt;In summary, for me, the key to having fun with coding is to focus on the fun, the little bits of joy, and always keep sight of the life that&amp;rsquo;s going on around you. Be part of it, and make sure that when you look back on any part of your life, you&amp;rsquo;ve got something to show for it beyond some code that&amp;rsquo;ll probably be replaced or abandoned in 5 years.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>I give up. You and your ads can piss off.</title>
      <link>https://weblog.masukomi.org/2008/12/11/i-give-up-you-and-your-ads-can-piss-off/</link>
      <pubDate>Thu, 11 Dec 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/12/11/i-give-up-you-and-your-ads-can-piss-off/</guid>
      <description>&lt;p&gt;A month ago I lamented that &lt;a href=&#34;https://weblog.masukomi.org/2008/11/10/your-ads-are-really-starting-to-piss-me-off&#34;&gt;the excessive use of
ads&lt;/a&gt;
on sites was getting to be too much for me. Well, after a week where it
seemed that every other article I went to read had a full page ad (or
&amp;ldquo;welcome page&amp;rdquo; as Forbes called it) that I had to wait or click through
to get to the article, which was still totally overrun with ads, I have
given up and installed an ad blocker. To all the sites who haven&amp;rsquo;t been
abusing their priveleges I&amp;rsquo;m sorry. I really &lt;em&gt;do&lt;/em&gt; want you to profit
from my visitation. I really don&amp;rsquo;t want to have to pay for your
services, and I realize you&amp;rsquo;d probably loose money if you switched to a
subscription model, but I just can&amp;rsquo;t take this shit anymore. I&amp;rsquo;d say
that if the offending sites cleaned up their acts I&amp;rsquo;d turn the ad
blocker back off, but honestly, now that they&amp;rsquo;re gone, I won&amp;rsquo;t notice if
they do. With Google talking about including ad blocking software as a
default plugin in upcoming Chrome releases, you should seriously rethink
your strategy. When we reach the point when all browsers have ad block
software build in with no download required, you better pray to all your
respective deities that you haven&amp;rsquo;t been abusing your visitors. Alas,
you&amp;rsquo;ve already lost any income from me, and the 30+ MILLION other
browsers that have installed &lt;a href=&#34;https://addons.mozilla.org/en-US/firefox/addon/1865&#34;&gt;Adblock
Plus&lt;/a&gt;. If you think
your excessive ads won&amp;rsquo;t hurt your bottom line, you are sorely mistaken.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>A review of Android and the T-Mobile G1</title>
      <link>https://weblog.masukomi.org/2008/12/09/a-review-of-android-and-the-t-mobile-g1/</link>
      <pubDate>Tue, 09 Dec 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/12/09/a-review-of-android-and-the-t-mobile-g1/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve had the G1 for about two weeks now, and have been coding for it
pretty much since the day I got it, and I have to say I love it, and
regret only one thing: buying the Bronze one. So, lets start with that,
and the other shortcomings, before moving on to the coolness. You&amp;rsquo;ve got
three choices for the G1 Black, Bronze, and White. I&amp;rsquo;m always partial to
earth tones, and I think the white one looks like a cheap plastic toy,
so Bronze it was. I really should have fiddled with one first. The black
and the white are pretty much what you&amp;rsquo;d expect, the bronze though, they
tried to go a little fancy on the keyboard. Instead of making it the
same color as the body, like the other two, they made it silver, which
does look good, BUT the letters, are a dark-ish grey on a silver
background. Now, once you start typing the actual letters are backlit,
except, you can only notice that if you&amp;rsquo;re not in a room with light.
Like say, your house, or your office, or outside during the day&amp;hellip; You
get the picture. What&amp;rsquo;s worse is the alternate characters (slashes,
semicolons, etc). These are in a nice rust color, that is totally
invisible unless you&amp;rsquo;re in a strong light. So, don&amp;rsquo;t buy the Bronze&amp;hellip;
As for the UI, it&amp;rsquo;s pretty much what you&amp;rsquo;d expect from the ads. Nice,
but a little &amp;ldquo;ten years ago&amp;rdquo; feeling, and interactions aren&amp;rsquo;t as
polished as they feel on the iPhone. Once you&amp;rsquo;re actually *in* an app
it&amp;rsquo;s as slick as the developer felt like making it. Some of them are
*very* slick. ShopSavvy is a good example of a really nicely done UI.
Some of them are crap. But, I suspect it&amp;rsquo;s the same on the iPhone. The
only non-obvious thing about the UI is that, unlike the iPhone it
doesn&amp;rsquo;t swap from landscape to portrait mode, and back, as you turn the
device. The G1 *knows* that it&amp;rsquo;s on it&amp;rsquo;s side, it just doesn&amp;rsquo;t bother
to do anything with that information. Now, some creative geeks have
figured out how to implement it but it&amp;rsquo;s not there for general
consumption yet. Currently, it goes into landscape mode when you slide
open the keyboard, and back to portrait when you close it. A couple
apps, like the browser, allow you to set them permanently into landscape
mode even if the keyboard is closed. But honestly, it feels like the
kludge it is. You get used to this limitation pretty quickly, but it&amp;rsquo;s
still leaves you feeling a little annoyed that it can&amp;rsquo;t switch itself.
The construction is suprisingly nice. One of my requirements for any
phone is that I be able to shove it in my back pocket and sit down. Yes,
I am exceedingly careful about making sure the glass is pointed inwards.
But, I would never feel comfortable doing that with one of those first
gen iPod nanos for example. Those always felt like I&amp;rsquo;d snap them. And,
even if that&amp;rsquo;s just perception, it&amp;rsquo;s an important one. You don&amp;rsquo;t want to
feel like your phone is a piece of glass that needs to be wrapped and
coddled. It needs to feel like a tool you can pull out, set down, sit
on, and generally use without worry. The G1 totally succeeds on this
front. The camera is&amp;hellip; annoying. Don&amp;rsquo;t even attempt to take a picture
of a non-sleeping cat with this. Click, wait, wait, wait, wait, get
coffee, wait, go pee, wait, *snap*. Oh look, you got the blurry tip of
the tail as it walked slowly out of the frame. It&amp;rsquo;s nice that during
that time it&amp;rsquo;s doing some physical moving of the lens to auto-focus on
whatever you&amp;rsquo;re pointing at, but still. Also the button. The button is
awkwardly placed when the keyboard is closed, and downright difficult
when the keyboard is open. The lens is right under your left hand as you
hold it. You will, sooner or later, sit there wondering why the screen
is dark when you open the camera. It&amp;rsquo;s because your finger is over the
lens. And last, but not least, is the plug. I hate that plug. So, it&amp;rsquo;s
powered by a mini-usb, which is convenient. Charging, and mounting as a
USB device all in one. BUT, that&amp;rsquo;s the only &amp;ldquo;orifice&amp;rdquo; on the device.
Like most of the smart phones it&amp;rsquo;s got crap battery life (about 24
hours), so I frequently find myself wanting to charge it AND listen to
music, but I can&amp;rsquo;t. I can do one or the other but not both, unless I
want to listen on the little speakers, which no-one does. The
headphones, you see, plug in to a dongle on a cord, which plugs in to
the mini-usb port. Now, it&amp;rsquo;s a good idea, because the dongle has the
microphone on it, which means you can use any headphones with it, and
still be able to hear, and speak with people on the phone. The problem
is, that the microphone, is on the dongle near the device and not up
high on the headphone cord near your head. If you want to talk to
someone you&amp;rsquo;ll have to clip the mic up by your face. By default, if I
stick the phone in my back pocket, and use the headphones that come with
it, the microphone is right at crotch level. And, while you *can* use
any headphones with it, you won&amp;rsquo;t want to because they&amp;rsquo;re the length you
need them to be, but the cable / dongle thing that comes out of the
phone is almost 3 feet long, which means your &amp;ldquo;nice and long&amp;rdquo; headphone
cords are now about one mile too long. And, if that wasn&amp;rsquo;t bad enough.
You simply can&amp;rsquo;t use the keyboard in the standard thumb-keyboard
position while it&amp;rsquo;s plugged in (or has headphones attached). The plug
prevents your right hand from gripping it. However, I find that If, I
hold it so that my hands are coming down from above, instead of holding
it from the edge like you&amp;rsquo;d hold out a plate, and let the cord go
between my second and third fingers, it works fine. This is, of course,
totally bullshit. The headphones that come with it are ok. Decent mids
and highs, crap bass, and quite possibly the most tangley earbud
headphones I&amp;rsquo;ve ever owned. Also, they keep wanting to fall out of my
ears. I&amp;rsquo;ve never had a real problem with earbud headphones, but these
just don&amp;rsquo;t work well with my ears when I&amp;rsquo;m walking. The built in apps
all work really well. I have some weird issue with the browser where,
after a search I occasionally find myself on a Google page with no
search field and no results. Also, there&amp;rsquo;s sometimes a bit of a pause,
which is especially noticeable when pulling down the menu-bar. If you&amp;rsquo;re
not aware, many apps will give you notifications that show up in the
menu-bar across the top. You pull this down with your finger to get the
details, and/or to switch directly to one of the apps that left you a
notification. It&amp;rsquo;s a nice feature once you get used to a menu-bar being
something you can interact with, but frequently I&amp;rsquo;ll pull it down and
have to wait 2 seconds for it to give me any indication it recognized my
action. So far, you&amp;rsquo;re probably wondering how I could posssibly love
this phone. And if the annoying bits, which every device has some of,
was all there was to it, I wouldn&amp;rsquo;t be so thrilled. I mean, overall,
using it is a lot like using the iPhone only not *quite* so polished.
Which is pretty much what I expected going in to it. Actually, going in
to it I thought it would be less polished than it is. Then I got to play
with a friend&amp;rsquo;s, and realized that once you get past the lack of sexy
makeup on its interface, it&amp;rsquo;s actually quite nice. And that, brings me
to this mornings realization, which is what made be get off my butt and
write this review. There is something incredibly powerful about
*touching* your e-mail. *Touching* your photos. Email stops being
&amp;ldquo;those messages on the computer&amp;rdquo; and becomes *my* e-mail. It&amp;rsquo;s
*mine*. It&amp;rsquo;s right here. I can touch it. I can stick it in my pocket
and take it with me. It doesn&amp;rsquo;t live in a box that&amp;rsquo;s so unquestionably
separate from me. Now, I had a Sidekick before this, so I had my email
in my pocket, but I didn&amp;rsquo;t care. It was nice to have access to it
wherever I was, but I never had this visceral feeling of *mine*. Also,
i never *wanted* to read e-mail on it. I just did when I had to, or
was very bored and stuck on the subway. On Android, and I suspect the
iPhone. You *want* to touch *your* stuff. You want to slide things
around. The kinesthetic interactions that we&amp;rsquo;ve been largely ignoring in
computing for years have incredibly powerfully subconscious
ramifications. Speaking of my photos, once you take some, or download
some, or get some onto it in any other way, they&amp;rsquo;re very well
integrated. Take a pic of someone, go to set it as their icon, which
shows up on the screen when they call you, and Android will pre-select
all the faces in the image for you. Then give you nice cropping tools if
you want to tweak its selections, or use some other part of the image.
Everything shoves images in the same place so everything that consumes
images knows just where to look. The interaction between apps is really
nice. Really, really nice. It&amp;rsquo;s trivial for one app to hand tasks off to
some other one. A simplistic example is the camera app. It *just*
takes pictures. If you want to look at pictures it seamlessly hands you
off to the Pictures app, without you even realizing you&amp;rsquo;ve moved to a
different app. And, dealing with pics, for example, is so nice that I
want to go around taking pics of everyone I know, not so that I&amp;rsquo;ll have
their pics, although that would be nice, but so that I can see their
face when they call AND so that I can go through the fun little process
of taking the pic, choosing a contact to add it to, and cropping it to
just their face. It seamlessly takes me through three apps and is kinda
fun. And that brings me to developing for Android. Developing for
android is *awesome*. There are tons of open source examples to get
you started, including the code to all the built in apps. Want to know
how the mail app does something, go look. I&amp;rsquo;ve learend so much reading
the code of the example apps, and the built in ones. The APIs seem, so
far, very sensible. Unlike the iPhone it&amp;rsquo;s multithreaded, so your app
can be happily doing some background tasks while the user is fiddling
with something in the foreground. The emulator is really nice, and best
of all, you do not need anyone&amp;rsquo;s permission to put whatever app you want
on your phone. And I assure you, it&amp;rsquo;s freaking awesome to have *your*
app running on *your* phone. Especially when you had so much fun
making it. Working on Android apps has been a total shot of adrenaline
to my coding brain. I can&amp;rsquo;t wait to get home and work on my apps some
more. It&amp;rsquo;s fun. And, I know that when I&amp;rsquo;m done other people will be
tapping and pushing on my icons in my apps. And if I&amp;rsquo;m really good, I&amp;rsquo;ll
be able to look at someone with an Android phone and say &amp;ldquo;You&amp;rsquo;ve
probably got some of my stuff on there right now.&amp;rdquo; and that would just
rock. Unlike iPhone. It doesn&amp;rsquo;t matter if Google doesn&amp;rsquo;t like your app,
or it competes with some app they wrote. You don&amp;rsquo;t need your app to be
in the built-in marketplace in order for someone to download and install
it, although it&amp;rsquo;d be nice. You can stick it on a web site with a
download link just like any other file. You could probably even e-mail
it to someone. Yes, the user has to manually click it, approve the
access it&amp;rsquo;s requestiong (contacts, internet, etc) and install it, as
they should. If you weren&amp;rsquo;t aware, every developer writing an iPhone app
runs the risk that after pouring months of development into their baby,
Apple with say refuse to put it on their marketplace, and they&amp;rsquo;ll be
left with nothing. With android you can either pay $25 for the ability
to upload apps to the marketplace, or your can say screw it, and
distribute it through whatever method you prefer. The killer development
environment, in a language that millions of developers know, and use in
their day-to-day work (as opposed to some obscure C variant that
essentially only gets used on Apple products), combined with an
unrestricted marketplace, means there is absolutely no question that we
can expect to see some truly extraordinary apps coming out for Android.
In the end it&amp;rsquo;s a great product, but, from an end user perspective, it
does still feel a little version 1.0. From a developers perspective,
there&amp;rsquo;s no question. You *want* to be developing for Android.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The hyprocisy of Amazon</title>
      <link>https://weblog.masukomi.org/2008/12/09/the-hyprocisy-of-amazon/</link>
      <pubDate>Tue, 09 Dec 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/12/09/the-hyprocisy-of-amazon/</guid>
      <description>&lt;p&gt;Don&amp;rsquo;t get me wrong, as a customer I love Amazon. But their recent policy
towards mobile devices is BS. In 2003 &lt;a href=&#34;http://www.amazon.com/b?ie=UTF8&amp;amp;node=193158011&#34;&gt;Amazon
said&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;&amp;hellip;wireless users find themselves living in an increasingly mobile
world. Mobile phones are a commodity. Users have grown accustomed to
staying connected while on-the-go. As smart mobile device penetration
grows, more and more users are expecting their devices to provide
anytime, anywhere connections to data services and information.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And then went on to extol the virtues of a company that used their web
services to make mobile phone apps. And yet, in 2008 when this has never
been more true. Amazon &lt;a href=&#34;http://emptyfactory.com/mazo&#34;&gt;refuses any developer the ability to use their
web services from a mobile device&lt;/a&gt; while
&lt;a href=&#34;http://www.amazon.com/gp/feature.html?ie=UTF8&amp;amp;docId=1000291661&#34;&gt;they simultaneously make one of their
own&lt;/a&gt;.
The associates program has been a huge success, and in a time when they
are more than happy to have desktop and web apps using their service,
and have more infrastructure to support requests than they&amp;rsquo;ve ever had,
they won&amp;rsquo;t let anyone but themselves do it from a phone. That&amp;rsquo;s just
hypocritical BS amazon. If you&amp;rsquo;ve got a good reason for refusing us
access to your API from mobile devices then please, make it known.
Otherwise, I, and my fellow developers are Calling Bullshit on your
actions.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Switching to the G1</title>
      <link>https://weblog.masukomi.org/2008/11/28/switching-to-the-g1/</link>
      <pubDate>Fri, 28 Nov 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/11/28/switching-to-the-g1/</guid>
      <description>&lt;p&gt;There&amp;rsquo;s something inherently wrong with cell phone companies these days.
Case in point: my switching from a Sidekick to a G1 today, or, more
specifically, my attempt to. Since I had a Sidekick I already had an
account with T-Mobile, so switching to a different phone should be a
non-issue. Just pay the money, update the account, and voilla. Or&amp;hellip;
not. It seems that killing my Sidekick&amp;rsquo;s service was almost
instantaneous. Of course, in the process I lost all the data that was in
it, but I knew that was going to happen, even if it is stupid. I&amp;rsquo;d
already paid the $10 to get the Intellisync app to sync it with Outlook
(first time i booted into windows in probably 2 years), and then
exported that and imported it into GMail so that it would be ready for
me when the new phone got activated, and that brings me to what&amp;rsquo;s wrong
with cell phone companies. Switching my account to G1 data services from
Sidekick wasn&amp;rsquo;t an issue. But then the real problem arose. Even though I
took the sim card out of the Sidekick and put it in the G1 I couldn&amp;rsquo;t do
anything with it. It just says:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There is a problem communicating with the Google servers. This could
be a temporary problem or your SIM card may not be provisioned for
data services. If it continues, call Customer Care.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now, I&amp;rsquo;ve talked to T-mobile customer support, and, as always, they were
excellent. But the problem is that it can take &amp;ldquo;up to 24 hours&amp;rdquo; for it
to actually take effect. My old phone does work for calls if I stick my
sim card in it, but it&amp;rsquo;s lost all of the numbers stored in it. The G1&amp;rsquo;s
setup screens were written with the assumption that when you got the
phone, the phone company would be ready for you to use it. As a result,
I&amp;rsquo;m sitting here hitting &amp;ldquo;try again&amp;rdquo; every 10 minutes hoping that it may
have actually gotten activated. This is freaking crazy. Electrons move
at nearly the speed of light. Computer configurations don&amp;rsquo;t get stuck in
someone&amp;rsquo;s in box waiting for them to get back from break. Once you save
your changes they&amp;rsquo;re saved. That should be the end of it. They turn on
G1 data plan and I should be ready to go, but no&amp;hellip;. &amp;ldquo;up to 24 hours&amp;rdquo;.
I&amp;rsquo;m sure there&amp;rsquo;s some issue of data propagating through caches but
seriously, it shouldn&amp;rsquo;t be that hard to configure the caches so that
they can get updates of new users almost immediately. Because they
haven&amp;rsquo;t been, you end up with customers all psyched to use their new
phone sitting around getting pissed off that they can&amp;rsquo;t actually do
anything with their $400 lump of metal and plastic. And don&amp;rsquo;t even get
me started on the BS situation where you can only get an iPhone with AT
&amp;amp; T, or G1 or Sidekick with T-Mobile. Yes, I realize special servers are
required to enable the data syncing and such but I&amp;rsquo;m sure each of the
companies would happily install them if that was the only thing
preventing them from selling the other phone too. Or, the fact that it
takes up to 24 hours to switch your phone number from one provider to
another. We have moved into a world were people&amp;rsquo;s cell phones are their
only phone, and that means not having it for 24 hours can be a real
bitch.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Bio Zombie [Movie Review]</title>
      <link>https://weblog.masukomi.org/2008/11/15/bio-zombie-movie-review/</link>
      <pubDate>Sat, 15 Nov 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/11/15/bio-zombie-movie-review/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/B000059HA9?ie=UTF8&amp;amp;tag=masukomiorg-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B000059HA9&#34;&gt;&lt;img src=&#34;https://images-na.ssl-images-amazon.com/images/I/51YD2H0JPBL._SL110_.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;
Wonderfully Terrible! This is not a movie that&amp;rsquo;s so bad it&amp;rsquo;s funny. No,
every moment of camp and comedy is intentional and successful. Without a
doubt this is the best campy zombie comedy I&amp;rsquo;ve ever seen, and, unlike
many films, the trailer gives you a very good idea of what to expect.
The dialogue is simultaneously well written, and intentionally terrible.
The makeup is bad, and it doesn&amp;rsquo;t matter in the least, actually it may
add to the humor. With protagonists named Woody Invincible, and Crazy
Bee, and the Sushi Boy in love transformed into a zombie in love, you
can&amp;rsquo;t go wrong, well&amp;hellip; you could, but they didn&amp;rsquo;t. &amp;ldquo;What about Shaun of
the Dead?&amp;rdquo; you ask. Shaun&amp;rsquo;s a favorite of mine, but it&amp;rsquo;s not a cheesy
campy film. Plus, with Bio Zombie you get &amp;ldquo;Engrish&amp;rdquo; subtitles and bad
dubbing. Actually it&amp;rsquo;s dubbed well, but there&amp;rsquo;s been no attempt to match
it to the lips and the intentionally bad dialogue makes it like watching
an old kung-fu flick. We thoroughly enjoyed watching it with the dubbing
AND the Engrish subtitles for added humor. If you&amp;rsquo;re looking for a campy
zombie film to laugh at with your friends, this is an excellent choice.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>World Trade Center [Movie Review]</title>
      <link>https://weblog.masukomi.org/2008/11/12/world-trade-center-movie-review/</link>
      <pubDate>Wed, 12 Nov 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/11/12/world-trade-center-movie-review/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/B000JLTRKE?ie=UTF8&amp;amp;tag=masukomiorg-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B000JLTRKE&#34;&gt;World Trade
Center&lt;/a&gt;&lt;img src=&#34;http://www.assoc-amazon.com/e/ir?t=masukomiorg-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=B000JLTRKE&#34; alt=&#34;image&#34;&gt;:
directed by Oliver Stone and Starring Nicolas Cage Summary: The movie
was essentially: We&amp;rsquo;re cops. Oh @#$% we&amp;rsquo;re trapped! Hooray, a marine!
And, the occasional &amp;ldquo;Where&amp;rsquo;s my husband?&amp;rdquo; Details: I was in the mood for
some pathos, but from a source that wouldn&amp;rsquo;t leave me depressed for
days. I figured World Trade Center would follow Nicolas Cage, who plays
a Port Authority Police officer, as the WTC was hit, he would encounter
some unexpected difficulty in his attempts to rescue people, and
ultimately prevail over it. And while technically that&amp;rsquo;s exactly what
happens, I was also expecting something of a typical story arc along the
way. Instead, we have a few minutes of establishing shots in which we
learn that he gets up early, has a lot of kids, and is generally looked
up to at work. The WTC is hit, he grabs some men and starts foraging for
the air tanks they&amp;rsquo;ll need, and then the building falls down on him.
From that point until about two minutes from the end we can only see his
face poking out of the rubble. He&amp;rsquo;s twenty feet below the debris, and
two of his fellow officers have survived, although one dies pretty
quickly. The other one, who we can actually see a whole head and arms on
keeps him company, when not hallucinating jesus with a water bottle.
They chat about nothing in particular just to keep each other from
falling asleep, and we have flashbacks of totally mundane life events
interspersed with shots of their wives and families being generally
upset that no-one knows what happened to their men. Somewhere along the
way an ex-marine is watching on TV in his office, says something to the
effect of &amp;ldquo;You may not know it, but we&amp;rsquo;re at war now&amp;rdquo; goes off, gets a
military haircut, and spends the night looking through the rubble for
survivors even though they&amp;rsquo;ve called it off until morning. Our survivors
are found, dug out, wives cry, the movie ends. Nobody overcomes
anything, beyond not dying for over 24 hrs with internal bleeding.
&amp;lt;sarcasm&amp;gt;Obviously, I was terribly moved by this. &amp;lt;/sarcasm&amp;gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Your ads are really starting to piss me off</title>
      <link>https://weblog.masukomi.org/2008/11/10/your-ads-are-really-starting-to-piss-me-off/</link>
      <pubDate>Mon, 10 Nov 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/11/10/your-ads-are-really-starting-to-piss-me-off/</guid>
      <description>&lt;p&gt;Listen, I appreciate that you want to monetize your web site. I appreciate that advertising is the economic engine that drives the web, and that without it I’d have far fewer high quality sites to peruse, and all the good ones would probably have subscription fees. So, I’m actually quite comfortable with ads being on your site.&lt;/p&gt;
&lt;p&gt;But seriously? There is a limit to what I will accept, and if you continue to exceed it one of two things will happen: either I will stop coming to your site, or worse (for you) I will continue to consume your sites resources (bandwidth and CPU) but use an ad blocker to prevent my from ever seeing your $@$#% ads.&lt;/p&gt;
&lt;p&gt;In case you, as a web site owner, are unsure as to where this limit is, here is an example of a site well past it, but, unfortunately, not unusual. Please, take a hint from Google.com folks. They’ve figured out how to put a whole pile of ads on the page without making it difficult to read the page you actually came there for.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2008/11/gah_ads_small.png&#34; alt=&#34;gah_ads&#34;&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>And yet...</title>
      <link>https://weblog.masukomi.org/2008/11/05/and-yet/</link>
      <pubDate>Wed, 05 Nov 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/11/05/and-yet/</guid>
      <description>&lt;p&gt;And yet, as if to prove that we still have a long way to go, proposition
8, which creates a constitutional amendment that bans gay marriage, has
passed in California, the state that had the guts to open up gay
marriage. I think we became complacent. None of us believed that, in
California of all states, such bigotry could prevail. As monumental as
Obama&amp;rsquo;s accomplishment is today, bigotry, is far from dead in this
country.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>We have awoken to a new world...</title>
      <link>https://weblog.masukomi.org/2008/11/05/we-have-awoken-to-a-new-world/</link>
      <pubDate>Wed, 05 Nov 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/11/05/we-have-awoken-to-a-new-world/</guid>
      <description>&lt;p&gt;There are children in America today who will have only ever known a world where a black man has been president, where there truly is nothing that any of us can’t accomplish.&lt;/p&gt;
&lt;p&gt;The world at large has breathed a collective sigh of relief, that we have chosen a president who will try and restore the good  name that our country once had, a president who will no longer allow the U.S. to be the world’s bully. This is a president who, throughout his campaign, has pushed for things like paying teachers what they’re worth. Issues that won’t ever win a U.S. election, that we, as a people, don’t seem particularly motivated to do anything about, yet still have a dramatic effect on our economy, and world standing. This is a president who admits, that yes, humans are responsible for global warming, and yes, we can not afford to keep pretending it is something we don’t have to address right now.&lt;/p&gt;
&lt;p&gt;Last night I dreamed I had a chance to talk with Michelle Obama, and I thanked her for what she and her husband have accomplished, thanked her for changing the world for our children. Because, there is no doubt in my mind, that he or anyone like him, could have accomplished what he has, without the support and love of an incredible partner.&lt;/p&gt;
&lt;p&gt;Growing up I never believed that a black man would be elected before a white woman. I have never been so happy to be so wrong.&lt;/p&gt;
&lt;p&gt;Thank you President Obama, for helping to restore my faith in the United States of America.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Yes We Can</title>
      <link>https://weblog.masukomi.org/2008/11/04/yes-we-can/</link>
      <pubDate>Tue, 04 Nov 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/11/04/yes-we-can/</guid>
      <description>&lt;p&gt;If you have any doubt, consider this. Don’t you want a president with fire in his heart? A president who is deeply frustrated by the current state of things? A president who will fight for real change? Climatologists tell us we have ten years, or less, to address climate change or the tipping point will have passed us, and there will be nothing we can do. The United States is responsible for using 25% of the fossil fuel on the planet. If we do not address this problem in THIS PRESIDENTIAL TERM we will be screwed. McCain isn’t convinced that we’re really responsible for global warming, despite the overwhelming scientific evidence that we are. Palin is convinced that humans and dinosaurs walked the planet at the same time…&lt;/p&gt;
&lt;p&gt;Don’t you want a president who, in these final days, is campaigning about issues, instead of trying to convince the American people that his opponent is a terrorist?&lt;/p&gt;
&lt;p&gt;I have never been convinced of a candidate as truly representing real change, as being truly different until this campaign. I have never been truly scared of the potential for one of the candidates getting into office, until this campaign.&lt;/p&gt;
&lt;p&gt;I want this man, this fire:&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Buzzbuling [Definition]</title>
      <link>https://weblog.masukomi.org/2008/10/14/buzzbbuling-definition/</link>
      <pubDate>Tue, 14 Oct 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/10/14/buzzbbuling-definition/</guid>
      <description>&lt;p&gt;Buzzbuling (v.) What a really good, but not fully-formed idea does in your head. A good idea buzzes. An idea that isn&amp;rsquo;t fully formed bubbles up. A really
good ideas that isn&amp;rsquo;t fully formed buzzes around your brain with
potential whilst bubbling up. Thus, buzzbuling. The added U is a result
of needing to distinguish it from the truly scary concept of buzzing
&amp;ldquo;bling&amp;rdquo;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>One Year At Akamai</title>
      <link>https://weblog.masukomi.org/2008/09/07/one-year-at-akamai/</link>
      <pubDate>Sun, 07 Sep 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/09/07/one-year-at-akamai/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://weblog.masukomi.org/2007/08/25/working-for-akamai&#34;&gt;A little over a year ago I came to work for
Akamai&lt;/a&gt; filled
with hope and optimism for my new job. Today I am even more hopeful and
jazzed to be going to work every day. It is, without question, the best
job, and working environment, I have ever had.&lt;/p&gt;
&lt;p&gt;A lot of this is due to
the team I&amp;rsquo;m on. I am surrounded by smart people who work well together,
and are damn good at what they do. The product we&amp;rsquo;re working on is
filled with interesting problems, and possibilities (both financial and
technical), and I have to say that I absolutely love being a part of it.&lt;/p&gt;
&lt;p&gt;What I like about this team, and this job, and it seems this company
overall, is that they allow you to find, or build, your niche, and
thrive in it. When I started here I was doing standard web development
stuff, but we needed a way to easily configure and automatically update
our back end systems. So, seeing an interesting task that needed someone
to tackle it, I did. And now it&amp;rsquo;s pretty much mine. They&amp;rsquo;ve let me build
up this component from scratch because I wanted to, and they supported
my ideas for doing it. But what&amp;rsquo;s even cooler is how pervasive that
attitude is&amp;hellip;&lt;/p&gt;
&lt;p&gt;We have two guys on our team who are fresh out of school.
Interns, who have graduated, and come on full time within the past six
months or so. They&amp;rsquo;re smart, but, like all young programmers lacking in
experience. But, no-one here treats them like newbs. The other day the
CTO, who happenes to also be the head of our team, stopped by the cube
of our newest intern and was asking him to bring up some stuff he&amp;rsquo;s been
working on, asking him questions, and treating the responses in the same
way he would any developer who&amp;rsquo;d been here for years. He&amp;rsquo;s not a newb,
he&amp;rsquo;s just another team member who we expect to have a few more
questions. And the project he&amp;rsquo;s working on is, not only almost entirely
his now, but is also a critical piece of our infrastructure. Both of our
ex-interns proved they had good heads on their shoulders when they
started here and we treat them as such.&lt;/p&gt;
&lt;p&gt;Shortly after I started
September 11th came around again, and as one of our founders died in it,
there was a memorial ceremony outside of our main office. Tears were
shed, and stories were shared. I may have mentioned it before, but I
overheard a story one of our salespeople told, of how she was in the
middle east when it happened. No-one was quite sure what, if anything,
was going to happen immediately afterwards. Someone at HQ called her up
and told her to get on the next plane out of there. They didn&amp;rsquo;t care
where she flew to, just as long as she got out, and got somewhere safe.
That speaks a lot about Akamai. They care about their people.&lt;/p&gt;
&lt;p&gt;Similarly,
they care about the world around them. People are strongly encouraged to
spend some time doing volunteer work every Sept 11th; turning a day of
sadness into something constructive and good. They organize with a few
local charities like the Food Bank, the Boys and Girls Club, and others,
and will be bussing groups of us over to their facilities to help out.
But, we&amp;rsquo;re also encouraged to spend some time volunteering at any time
through the year. They&amp;rsquo;ve set up the &lt;a href=&#34;http://www.akamai.com/html/about/foundation.html&#34;&gt;Akamai
Foundation&lt;/a&gt; which
gives out grants to help with math education, and has given out millions
of dollars, all from employees. It&amp;rsquo;s not some corporate &amp;ldquo;see how we are
a charitable company&amp;rdquo; deal. It&amp;rsquo;s people at Akamai who wanted to make a
difference, and the company stepping up to help organize it and make it
a reality.&lt;/p&gt;
&lt;p&gt;I think our project&amp;rsquo;s a bit like that too. Someone had a cool
insight. They realized that we could offer something that no other
company in the world could offer. I&amp;rsquo;m not sure who this was, but a
talented developer was pulled in to put those theories to the test, and
then another, and another. When I joined the team there were, I think,
three other full time developers, an intern, an engineering manager, and
a product manager. I had no idea just how big this project was going to
be. Now we&amp;rsquo;re our own business unit with about 30 people and very real
dreams that end with lots of zeroes. Of course, our products wouldn&amp;rsquo;t
exist without the work, and support of many other teams, and the very
real financial backing and support of the company itself . My point is,
that Akamai is a place where ideas are honestly respected wherever they
come from. I&amp;rsquo;ve yet to see any fiefdoms with little power plays between
teams. Everyone seems to honestly seems to be trying to make whatever
they make as good as they can and work with other teams whenever they
can.&lt;/p&gt;
&lt;p&gt;I know I sound like some cult member, but I do so because the
people at Akamai have really earned my respect. There&amp;rsquo;s no &amp;ldquo;Three cheers
for us!&amp;rdquo; b.s. here. Akamai doesn&amp;rsquo;t try and convince it&amp;rsquo;s employees it&amp;rsquo;s
a good place to be. It simply goes about being that place. It sets high
standards for itself and its employees, and quietly expects everyone to
meet them. The people in charge seem to treat us as if they were
parents; proud of their children, and trusting them to be the best they
can be. If a person or group is singled out it&amp;rsquo;s because they&amp;rsquo;ve done
something above and beyond that deserves recognition.&lt;/p&gt;
&lt;p&gt;And that&amp;rsquo;s partly
why I&amp;rsquo;m writing this. Akamai, and it&amp;rsquo;s people, have earned my respect&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;,
and deserve recognition for what they have built. That, and I&amp;rsquo;m damn
proud to be here.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Fat pachecks, free meals, and other perks
only go so far. You&amp;rsquo;ll never work your ass of for people you don&amp;rsquo;t
respect, or who don&amp;rsquo;t respect you. Although, I have to admit, free
breakfast would get me into the office notably earlier&amp;hellip; ;)&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Handling and Avoiding Conflicts in Git</title>
      <link>https://weblog.masukomi.org/2008/07/12/handling-and-avoiding-conflicts-in-git/</link>
      <pubDate>Sat, 12 Jul 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/07/12/handling-and-avoiding-conflicts-in-git/</guid>
      <description>&lt;p&gt;John Kelvie said:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[To] me the fundamental challenge with existing version control
systems is the difficulty of merging change sets from multiple
developers across the same set of code. To me, this issue comes down
to the diffing/merging functionality provided by the software, and I
haven&amp;rsquo;t seen or heard of anything that really improves the state of
the art. How does GIT address this? How does it make it easier to do?
Are there specific branching and merging tools it provides? Is through
the use of more atomic commits (which I could see helping to an
extent, but only so far as it allows for changes to be small enough
that there is no overlap, thus sidestepping the problem).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There are two concepts that you must understand to really take advantage
of git. The first is the index / staging area. A full description would
require its own post but for this discussion you can think of it as a
temporary branch where you put everything before committing it. You can
diff between it and the last commit, between it and the working
directory, etc. The second is that a git repo can have (and usually
does) have multiple branches in the same location on disk.&lt;/p&gt;
&lt;p&gt;The idea of
multiple branches in the same folder, is critical to understand when
trying to address conflicts. In most version control systems you have
one checkout for every branch, each in a different location on your
disk, and while this is an option in git, you can also have multiple
branches in the same folder, just like the server side of most version
control systems.&lt;/p&gt;
&lt;p&gt;So, we&amp;rsquo;re going to need an example. Let&amp;rsquo;s assume I&amp;rsquo;ve
got a git repo with foo.rb. &lt;strong&gt;In the master branch&lt;/strong&gt; foo.rb looks like
this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if (value == &amp;quot;test&amp;quot;) puts &amp;quot;I&#39;m in!&amp;quot;
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On &lt;strong&gt;branch_one&lt;/strong&gt; we&amp;rsquo;ll change that test to&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if (value == TEST\_CONSTANT) 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and on &lt;strong&gt;branch_two&lt;/strong&gt; we&amp;rsquo;ll make it&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if (value ==&amp;quot;test&amp;quot; || value == &amp;quot;test2&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now, if master, branch_one,
and branch_two are all in the same repo we could stay in the same
directory and &amp;ldquo;checkout&amp;rdquo; whichever branch we wanted to be working on.
All the would change in place without you ever leaving the directory.
So, if you checkout master and cat foo.rb you&amp;rsquo;ll get the first example.
Checkout branch_two and cat foo.rb (without changing directories) and
you&amp;rsquo;ll see the last example. I&amp;rsquo;m sorry if that was obvious, but it&amp;rsquo;s
critical that you understand that, and some newbs just aren&amp;rsquo;t aware of
it yet.&lt;/p&gt;
&lt;p&gt;So, back to John&amp;rsquo;s questions. How does git make branching and
merging easier to do, and does it provide any specific tools for
managing it? Well, first off the commands are freaking simple:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;to create a branch in the same repo git branch branch_name or, more
commonly git checkout -b branch_name The latter creates the branch
then checks it out so you can immediately start working on it.&lt;/li&gt;
&lt;li&gt;to merge in a branch in the same repo git merge branch_name&lt;/li&gt;
&lt;li&gt;to merge in a branch from a remote repo you&amp;rsquo;ve got git fetch and git
pull More on these two in a minute, because they do dramatically
change how you manage conflicts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As for specific tools for managing it. Yes and no. &amp;ldquo;&amp;hellip;if you rather use
GUI tools to merge files instead of editing file with conflict markers
(like shown in example), you can use git-mergetool, which would call GUI
tool of your choice; currently supported out of the box are: kdiff3,
tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, and opendiff.&amp;rdquo;
BUT, regardless of GUI tools, the ability to have multiple branches in
the same local repo changes everything.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s an example. Same files as
above, except I&amp;rsquo;m using a different repo for each instead of different
branches in the same repo, because that&amp;rsquo;s the way it would be when
pulling from other people, and since we&amp;rsquo;re dealing with people, we&amp;rsquo;ll
say branch_one is Mary&amp;rsquo;s branch and branch_two is Bob&amp;rsquo;s (pretend that
the. The first thing you&amp;rsquo;d do if you were pulling from these guys
regularly is to add them to your repos list of remote directories&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git remote add marys\_branch ../branch\_one/
$ git remote add bobs\_branch ../branch\_two/ 
$ git remote show bobs\_branch marys\_branch
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And here&amp;rsquo;s where the difference
between pull and fetch come in to play. fetch tells git &amp;ldquo;hey, go get
this remote data, and shove it into a &amp;ldquo;remote&amp;rdquo; branch &lt;em&gt;in my repo&lt;/em&gt;. pull
says, &amp;ldquo;fetch it, and &lt;em&gt;also&lt;/em&gt; merge it with my current branch.&amp;rdquo; Using
fetch we can suck in data from two sources, knowing full well it would
conflict if we tried to merge it, but still have no problems.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git remote update
Updating marys_branch
remote: Counting objects: 5, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From ../branch_one
* [new branch] master -&amp;gt; marys_branch/master
Updating bobs_branch
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), remote: reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From ../branch_two
* [new branch] master -&amp;gt; bobs_branch/master

$ cat foo.rb
if (value == &amp;quot;test&amp;quot;)
puts &amp;quot;I&#39;m in!&amp;quot;
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So, now, we&amp;rsquo;ve pulled in two people&amp;rsquo;s
conflicting changes, but not applied either. So, lets assume I don&amp;rsquo;t
suspect a conflict (hopefully they&amp;rsquo;re not normal occourrances for you).&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git merge marys_branch/master
Updating 7d6f564..5713885
Fast forward
foo.rb | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

$ git merge bobs_branch/master
Auto-merged foo.rb
CONFLICT (content): Merge conflict in foo.rb
Automatic merge failed; fix conflicts and then commit the result.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Damn, a conflict! Who would have guessed? Now, I do
what git suggests, fix the problem and commit it, but I&amp;rsquo;m neither the
one who broke it nor the one who knows most about it. So, I&amp;rsquo;m going to
kick this back to Bob or Mary, but, I may want to see what&amp;rsquo;s going on,
to help choose who to kick this to.&lt;/p&gt;
&lt;p&gt;One thing I can do is see
specifically which commits are conflicting:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git log --merge
commit f068f89e88e9174b50a0bc5622875dd4d8e21bc8
Author: Kay Rhodes
Date: Sat Jul 12 09:26:44 2008 -0400

switched to testing for test or test2 in branch_two

commit 5713885c9adc5689b6d8222b2650d4b3ad0dbc42
Author: Kay Rhodes
Date: Sat Jul 12 09:25:52 2008 -0400

switch test to TEST_CONSTANT on branch_one
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If the commit messages aren&amp;rsquo;t enough info I can
actually diff the two branches that conflicted totally separately from
anything in MY branch.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git diff marys_branch/master bobs_branch/master
diff --git a/foo.rb b/foo.rb
index dac3b0f..220011b 100644
--- a/foo.rb
+++ b/foo.rb
@@ -1,3 +1,3 @@
-if (value == TEST_CONSTANT)
+if (value == &amp;quot;test&amp;quot; || value == &amp;quot;test2&amp;quot;)
puts &amp;quot;I&#39;m in!&amp;quot;
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I could have also diffed the specific
commits in conflict if I&amp;rsquo;d wanted, instead of the entire branches. In
this case it would give the same result. But, not knowing what
TEST_CONSTANT is (maybe it&amp;rsquo;s a closure, maybe it&amp;rsquo;s a predefined
variable) I can either make an educated guess that whatever
TEST_CONSTANT is it&amp;rsquo;s probably a better choice from a maintenance
perspective and tell Bob to go fix his stuff. Or, I could just send an
e-mail to both of them and let them figure it out.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s also important
to point out that the &amp;ldquo;index in git contains on conflict *all*
versions of a file: &amp;lsquo;ours&amp;rsquo; i.e. the version in the branch you merge
into, &amp;rsquo;theirs&amp;rsquo; i.e. the version in the branch you are merging, and
&amp;lsquo;base&amp;rsquo; i.e. the version in the common ancestor ot the branches, and also
version with conflict markers.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Another option is to just fix it myself.
The conflicting file currently looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; HEAD:foo.rb

if (value == TEST_CONSTANT)
=======
if (value == &amp;quot;test&amp;quot; || value == &amp;quot;test2&amp;quot;)
&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; bobs_branch/master:foo.rb
puts &amp;quot;I&#39;m in!&amp;quot;
end 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;HEAD is git
slang for &amp;ldquo;the branch you&amp;rsquo;re currently working on&amp;rdquo; which, in this case,
has Mary&amp;rsquo;s changes successfully merged in (actually, by default it&amp;rsquo;s
pointing to the last commit on the current branch). So, I decide that
all three tests need to be there and make the edit, and then update the
index. You need to update the index because git has already added Bob&amp;rsquo;s
changes to the index but knows that there was a conflict that needs
resolving.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git status
foo.rb: needs merge
# On branch master
# Changed but not updated:
# (use &amp;quot;git add ...&amp;quot; to update what will be committed)
#
# unmerged: foo.rb
#
no changes added to commit (use &amp;quot;git add&amp;quot; and/or &amp;quot;git commit -a&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Updating the index is simply a matter of getting the file how you want
it and saying:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; $ git add foo.rb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;at which point committing would get you a commit message template that
started like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; Merge commit &#39;bobs\_branch/master&#39; Conflicts: foo.rb \# \# It looks
&amp;gt; like you may be committing a MERGE. \# If this is not correct, please
&amp;gt; remove the file \# /Users/krhodes/temp/trunk/.git/MERGE\_HEAD \# and
&amp;gt; try again. \#
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The basic take-away from all this fetch / pull stuff is that it&amp;rsquo;s
generally a good idea to fetch first when dealing with other people&amp;rsquo;s
work, because having a local copy of their branch in your repo gives you
a number of additional options if things go wrong.&lt;/p&gt;
&lt;p&gt;And yes, atomic
commits go a huge way towards avoiding the problem of conflicts, and
handling them when they crop up. Obviously this applies to centralized
systems too. They avoid them by keeping your commits on topic. If one
commit is for bug X you generally don&amp;rsquo;t have to worry about it
conflicting with a commit for bug Y. And, when you discover that two
people you&amp;rsquo;re pulling from both have patches for bug X that conflict you
have many more options.&lt;/p&gt;
&lt;p&gt;Another key technique for avoiding conflicts is
to merge constantly. Every single day you should be pulling any work
that&amp;rsquo;s been committed upstream. That way, when things do conflict, you
only have to resolve a little tiny thing (if the commits are atomic then
it&amp;rsquo;s even tinier), and, if you choose to kick the issue back to someone
else it&amp;rsquo;s still fresh in their heads. This, of course, applies to
centralized systems to.&lt;/p&gt;
&lt;p&gt;Another way that git (and every other
distributed system) helps to avoid conflicts is a social change that
comes out of the distributed nature of the repos. Because you&amp;rsquo;re
constantly pulling in from multiple sources, having atomic commits
becomes a requirement to participation. If Bob is a twit and only makes
massive sprawling commits you&amp;rsquo;re simply not going to pull from him. It&amp;rsquo;s
not like a centralized system where you&amp;rsquo;re forced to take all the
changes out there. Whoever is in charge of the main trunk would be
stupid to accept Bob&amp;rsquo;s changes because if there was a problem in one of
them it&amp;rsquo;d be a pain in the butt to extract the bits that fixed bug A
from the bits that didn&amp;rsquo;t really fix bug B. No, they&amp;rsquo;d kick it back to
Bob, telling him to clean up his stuff and make two separate patches.&lt;/p&gt;
&lt;p&gt;This becomes even more important when you&amp;rsquo;re working on a project that
manages patches via e-mail. Just check out the git mailing list.
People&amp;rsquo;s patches are incredibly focused, enabling other git developers
to take just the bits and pieces they choose. Because the patches are
uniquely identifiable in git, it doesn&amp;rsquo;t matter if some people take a
change and some don&amp;rsquo;t and you, as the maintainer, pull from all of them.
Git won&amp;rsquo;t think they&amp;rsquo;re two different but identical changes. It&amp;rsquo;ll know,
&amp;ldquo;Oh, that&amp;rsquo;s change x. I&amp;rsquo;ve got that already.&amp;rdquo; Git also doesn&amp;rsquo;t care how
a patch got there. It could be from a commit you pulled over the lan, or
something someone e-mailed. Because it&amp;rsquo;s guaranteed cryptographically
unique, it&amp;rsquo;s the same thing.&lt;/p&gt;
&lt;p&gt;[Update 2] Some additional tips from Jakub
Narebski&lt;/p&gt;
&lt;p&gt;If you want to see what some file looks like on other branch
(or for example at specified point of time, for example at tagged
revision, marking some released version), you don’t need to use “git
checkout ‘branch’ &amp;amp;&amp;amp; cat ‘file’”; you can use “git show ‘branch’:&amp;lsquo;file’”
(see “Examples” section in git-show(1) manpage, and “Specifying
revisions” section in git-rev-parse(1) manpage).&lt;/p&gt;
&lt;p&gt;Below there is example
how index looks like during conflicted merge. The example uses yet
another way of specifying object names, i.e. “:’stage’:&amp;lsquo;file’” (we could
alternatively use SHA-1 or shortened SHA-1 of object shown in
git-ls-files output, e.g. “git show 2f096cc”).&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git ls-files –abbrev –unmerged
100644 2f096cc 1 foo.rb
100644 89f36fe 2 foo.rb
100644 d3ea75d 3 foo.rb
$ git show :1:foo.rb
if (value == “test”)
puts “I’m in!”
end
$ git show :2:foo.rb
if (value == TEST_CONSTANT)
puts “I’m in!”
end
$ git show :3:foo.rb
if (value == “test” || value == “test2″)
puts “I’m in!”
end 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Try it yourself!&lt;/strong&gt;&lt;br&gt;
I find that reading how to do things like this is much enhanced by actually
having something to test it on, especially when there are so many
variables. So, I&amp;rsquo;ve uploaded &lt;a href=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2008/07/temp.tgz&#34; title=&#34;a temp dir with the three repos&#34;&gt;the temp dir with the three
repos&lt;/a&gt;
I used in writing this. If you go into the trunk repo you&amp;rsquo;ll see that
the other ones have already been configured as remote repos. And, if you
go into branch_one or branch_two you&amp;rsquo;ll see that they&amp;rsquo;re clones of
trunk and thus both already know that their upstream is trunk and how to
fetch from it without having to configure anything. You can also see
what the difference would be in pulling and fetching from one of them.&lt;/p&gt;
&lt;p&gt;Please let me know if there&amp;rsquo;s still something that&amp;rsquo;s a little unclear
about dealing with conflicts in git and I&amp;rsquo;ll add it in.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you found this useful you might be interested in &lt;a href=&#34;http://localhost:4000/blog/categories/git/&#34;&gt;some of the other git posts here&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Olympia Nova High-viz Vest [Review]</title>
      <link>https://weblog.masukomi.org/2008/06/30/olympia-nova-high-viz-vest-review/</link>
      <pubDate>Tue, 01 Jul 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/06/30/olympia-nova-high-viz-vest-review/</guid>
      <description>&lt;p&gt;There are a few contenders when it comes to High-Viz motorcycle vests,
Olympia, Icon, and FieldSheer are the main ones, and all meet military
specs for on-base riding. Of those only the &lt;a href=&#34;http://www.olympiamotosports.com/nova/nova.htm&#34;&gt;Olympia
Nova&lt;/a&gt; and the &lt;a href=&#34;http://www.rideicon.com/product_details.jsp?category=1339&amp;amp;id=5837&#34;&gt;Icon Mil
Spec&lt;/a&gt;
are available in bright yellow. If you haven&amp;rsquo;t seen the yellow in person
I have to tell you that photos don&amp;rsquo;t do it justice. This stuff is so
bright it makes you wonder if you&amp;rsquo;d still be able to see if you turned
out the lights. The orange is, well&amp;hellip; orange.&lt;/p&gt;
&lt;p&gt;Regardless of what brand
you choose, &lt;em&gt;get the yellow&lt;/em&gt;. Personally I was a bit torn between the
Olympia and the Icon. The Icon has more area covered by high-viz
material. Unfortunately none of that is mesh so it will stop a lot of
that precious cool air from getting to your core.&lt;/p&gt;
&lt;p&gt;The Olympia has large
areas of black on the front (which will be obscured by your windshield
and headlight anyway), but they&amp;rsquo;re all mesh so that a fair amount of
that air is still going to get to you. Additionally it has more
retroreflective tape, which is going to do far more good in the night
than the color of the fabric.&lt;/p&gt;
&lt;p&gt;I find that the storage pockets are all
useful, and it has a large pouch on the back where you could probably
stick a Camelbak. Construction is great, nothing feels cheap or flimsy
and it doesn&amp;rsquo;t even think about flapping around when you ride it. I&amp;rsquo;ve
seen other people with the Icon and it seems well made and also doesn&amp;rsquo;t
flap around. I prefer the Olympia&amp;rsquo;s cinches on the sides to slim it down
to your size over Icon&amp;rsquo;s lace up sides. Much easier to adjust and no
worry about knots coming undone. Also,
&lt;a href=&#34;http://www.urbandictionary.com/define.php?term=imnsho&#34;&gt;IMNSHO&lt;/a&gt;, while
that black pocket on the Icon OK in photos, it looks really stupid in
person. The Olympia Nova is a great vest and I wouldn&amp;rsquo;t hesitate to buy
it again.&lt;/p&gt;
&lt;p&gt;An aside: &lt;em&gt;Why pay almost $60 for a vest when you could pick up
something a construction worker might wear for $15?&lt;/em&gt; Because
construction workers don&amp;rsquo;t work in 70+ mph winds. The straps on those
cheap things aren&amp;rsquo;t designed to withstand that kind of constant pulling
and tugging, and neither is the material. Do you really want one of
those coming loose and flapping around you wile you ride? All of the
vests mentioned above are going to hold up, and they are made out of
some seriously heavy duty material that will provide you with additional
abrasion resistance if you take a spill.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Using E-Z Pass  / FastLane transponders on your motorcycle or scooter</title>
      <link>https://weblog.masukomi.org/2008/06/29/using-e-z-pass-fastlane-transponders-on-your-motorcycle-or-scooter/</link>
      <pubDate>Sun, 29 Jun 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/06/29/using-e-z-pass-fastlane-transponders-on-your-motorcycle-or-scooter/</guid>
      <description>&lt;p&gt;You&amp;rsquo;d think it&amp;rsquo;d be a non-issue, but it is. In fact, it can be a real
pain in the ass. Sometimes they simply don&amp;rsquo;t register. You&amp;rsquo;d think
they&amp;rsquo;d just wave you through since it&amp;rsquo;s not your fault, but frequently
they&amp;rsquo;ll make you pay, and digging your money out of a riding suit can be
a major hassle, especially if you thought you weren&amp;rsquo;t going to need it.
So, if you&amp;rsquo;re riding a motorcycle and have an &lt;a href=&#34;http://www.ezpass.com/&#34;&gt;E-Z
Pass&lt;/a&gt; / FastLane transponder. Here&amp;rsquo;s how to use
it without headaches.&lt;/p&gt;
&lt;h3 id=&#34;step-1&#34;&gt;Step 1&lt;/h3&gt;
&lt;p&gt;Make sure your motorcyle&amp;rsquo;s plate is
associated with your transponder. This is &lt;em&gt;critical&lt;/em&gt; as you&amp;rsquo;ll see in a
second.&lt;/p&gt;
&lt;h3 id=&#34;step-2&#34;&gt;Step 2&lt;/h3&gt;
&lt;p&gt;Whenever it is an option, &lt;em&gt;avoid lanes that let you
pay cash&lt;/em&gt;. If you&amp;rsquo;re riding with a group just go through the pass-only
lane and pull over to wait for everyone else.&lt;/p&gt;
&lt;h3 id=&#34;step-3&#34;&gt;Step 3&lt;/h3&gt;
&lt;p&gt;Never, ever,
stick it in the breast pocket of your jacket. I realize this is the
obvious place for it, but for some reason this almost guarantees it
won&amp;rsquo;t register. My recommendation is to either put it in the map pocket
of your tank bag (so that there&amp;rsquo;s only the thin piece of plastic between
it and the receiver), or &lt;em&gt;attach&lt;/em&gt; it to the inside of your windshield. I
emphasize &amp;ldquo;attach&amp;rdquo; because I had mine wedged in tightly between the
windshield and the plastic behind the gauge console, and after a while
the vibrations, combined with the pressure it was wedged between the
plastics, and a small bump made it shoot out, flip in the air, and,
thank the gods, get caught on a small shelf inside my fairing.
Thankfully I was approaching a red light where I could reach in and grab
it before it fell to the road. You can get spare / replacement fasteners
from the state you purchased it from.&lt;/p&gt;
&lt;p&gt;Now, the reason Step 1 is so
critical, is that sooner or later the little piece of crap isn&amp;rsquo;t going
to work. By that I mean you&amp;rsquo;ll go through a booth and it won&amp;rsquo;t register
at all (I&amp;rsquo;ve had a booth attendant stand there waving it about in there
air with no response, or maybe it&amp;rsquo;ll register red even though at the
last toll booth it was green). If your plate is already on your account
then when you go through, and it doesn&amp;rsquo;t register, the cameras will take
a pic of your plate, they&amp;rsquo;ll look it up, see that you have an account
and just bill it normally. Combine this with Step 2 and you can go
through without worry of a ticket, or of ever being asked to take off
your gloves to dig through pockets (especially evil when your money&amp;rsquo;s in
your pants and you&amp;rsquo;re wearing a one piece).&lt;/p&gt;
&lt;p&gt;On a related note: I have
heard many people say &amp;ldquo;make sure it&amp;rsquo;s right side up&amp;rdquo;. It makes no
difference if it is right side up or not. First off, they&amp;rsquo;re back-side
up when properly attached to a windshield. Second is the physics of how
they work. Transponders work by creating a magnetic field at the reader.
There is a coil of metal wires inside of the transponder. When you move
a coil of wire through a magnetic field you get electricity, which
powers the rfid tag. The little bugger is going to get powered up
regardless of what direction it&amp;rsquo;s facing in. What&amp;rsquo;s important is that
there is nothing between it and the reader, because while it does have
power, it still generates a pretty weak signal. *&lt;/p&gt;
&lt;p&gt;*If anyone knows more details, or has evidence that I&amp;rsquo;ve made a mistake
about these transponders please comment below.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Why you should use a distributed version control system</title>
      <link>https://weblog.masukomi.org/2008/06/27/why-you-should-use-a-distributed-version-control-system/</link>
      <pubDate>Sat, 28 Jun 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/06/27/why-you-should-use-a-distributed-version-control-system/</guid>
      <description>&lt;p&gt;If you&amp;rsquo;ve ever:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;made a commit and then realized you forgot &amp;ldquo;one little change&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;made a commit and regretted it.&lt;/li&gt;
&lt;li&gt;wished you could combine some the past couple days worth of commits
into one nice combined commit in the main branch.&lt;/li&gt;
&lt;li&gt;wished you could commit just part of a file.&lt;/li&gt;
&lt;li&gt;needed to drop work on one task and switch tracks to another one
without having to make commits with unfinished changes, or commits
with changes for one issue and a little of another.&lt;/li&gt;
&lt;li&gt;wanted to make a test spike with version control and without
polluting the public repo.&lt;/li&gt;
&lt;li&gt;managed an open source project.&lt;/li&gt;
&lt;li&gt;wanted the security of knowing that there was a valid backup of your
revisions on many other peoples boxes, or even just your own.&lt;/li&gt;
&lt;li&gt;been frustrated with branch namespacing issues&lt;/li&gt;
&lt;li&gt;been frustrated with how difficult branching and merging is in most
centralized version control systems.&lt;/li&gt;
&lt;li&gt;wished you could just create branches to work on a feature or a bug
without worrying about the consequences to the main repo.&lt;/li&gt;
&lt;li&gt;wondered which branch a bug applied to.&lt;/li&gt;
&lt;li&gt;wanted to use version control when you were offline.&lt;/li&gt;
&lt;li&gt;wished you could quickly compare versions of entire trees.&lt;/li&gt;
&lt;li&gt;wished you could easily release everything in the current branch
&amp;ldquo;except that&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;been concerned about how to scale a system to support hundreds, or
thousands, of users.&lt;/li&gt;
&lt;li&gt;been concerned about what would happen if your main repo box died.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;hellip;then distributed version control is worth your consideration.&lt;/p&gt;
&lt;p&gt;Now, there are a variety of DVCS to choose from, Git and Mercurial (Hg) are main
contenders, and both are really good. My experience is primarily with
Git so I&amp;rsquo;ll be speaking as a Git user, but Mercurial can do most
everything Git can, and a lot of this is general to all Distributed
Version Control systems.&lt;/p&gt;
&lt;p&gt;Quite possibly the most powerful, world
altering thing about DVCSs is how they handle branches. Because of their
distributed nature branching and merging absolutely must be simple
effective, and avoid conflicts whenever possible. As a result people
who&amp;rsquo;ve gotten the DVCS religion tend to make a branch for practically
every bug or feature. We call these &amp;ldquo;&lt;a href=&#34;https://weblog.masukomi.org/2007/09/10/branching-for-atomic-patches-and-cherry-picking&#34;&gt;topic
branches&lt;/a&gt;&amp;rdquo;.
If you&amp;rsquo;ve been working on one task for a while and a bug comes in that
has to be address NOW it&amp;rsquo;s not an issue. Commit your changes in the
current branch (or &amp;ldquo;stash&amp;rdquo; them away) and make a new branch for the bug
that just came in. I doesn&amp;rsquo;t matter if you commit unfinished work in one
of these branches, or if the work totally breaks the build, because it&amp;rsquo;s
&lt;em&gt;your&lt;/em&gt; branch. When you&amp;rsquo;ve finished working on a feature or bug you can
&amp;ldquo;rebase&amp;rdquo; all your interim commits on that task into one nice clean one,
or maybe generate a patch to apply to the main branch.&lt;/p&gt;
&lt;p&gt;The fact that you
can as many of &lt;em&gt;your&lt;/em&gt; branches as you want solves a huge number of
problems. Combine that with the ability to &amp;ldquo;rebase&amp;rdquo; you changes, by
bringing up a list of past commits to merge, reorder, or exclude, as you
see fit, and &amp;hellip;well it&amp;rsquo;s like heaven. The only caveat is that you can&amp;rsquo;t
rebase commits that others have already pulled. But that&amp;rsquo;s not a big
deal if you simply do your work in personal branches that others aren&amp;rsquo;t
going to be pulling from.&lt;/p&gt;
&lt;p&gt;Because most DVCSs allow you to cherry-pick
exactly which commits you want to be in a branch you can easily build a
release branch with just the parts that you want. There&amp;rsquo;s one caveat to
cherry-picking in most distributed and centralized systems : to do it
well you must have commits that are a self contained and atomic as
possible. If you make a commit with multiple features/fixes in it and
later on you decide not to include one of them there&amp;rsquo;s no simple way to
exclude just the bit you don&amp;rsquo;t want, because it&amp;rsquo;s mixed in with all the
others. And this, brings us back to the idea of &amp;ldquo;topic branches.&amp;rdquo; If
you&amp;rsquo;re already working with topic branches then you can easily merge the
changes in one topic branch into the main branch as one atomic commit
that can be excluded or included individually. However, as
&lt;a href=&#34;http://plasmasturm.org/&#34;&gt;Aristotle&lt;/a&gt; pointed out in the comments&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;the power of [Git&amp;rsquo;s] rebasing allows you to go back, split the commit
sensibly into several, and then transplant the rest of your history on
top of that. I guess whether this is simple depends on your definition
of simplicity, but git has enough tooling to support this procedure
directly. In other DVCSs you have to painstakingly monkey around with
far less powerful tools, and in centralised VCSs it is for all intents
and purposes impossible to do it at all.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yes, there will always be some changes that are dependent upon some
prior commit, but by having nice little atomic commits you can limit the
tree of dependencies to a bare minimum.&lt;/p&gt;
&lt;p&gt;One of the best features of
DVCSs is speed, but unfortunately it&amp;rsquo;s a lot like the Matrix. No-one can
be told how much of a difference it makes. You have to experience it for
yourself. I never complained about the speed of the centralized systems
I worked with until I switched to Distributed Version Control. I found
it hard to believe that &amp;ldquo;instant&amp;rdquo; commits would make a difference. Or
that the time it took to diff against past versions was an issue. But I
swear to you that the effect on how you work is almost as radical as the
improved branching, and it flows over into the branching too. Now
branching and merging is not only painless, it&amp;rsquo;s instant. I create,
merge, and destroy branches throughout the day without hesitation
because no matter what operation I do it comes back so fast that I
frequently am incapable of telling that any time passed. That&amp;rsquo;s means
that many (most?) of my operations are happening in the sub 100ms range.
Imagine being able to diff versions of entire trees in tenths of
seconds.&lt;/p&gt;
&lt;p&gt;Scaling to thousands of users is not an issue with Distributed
Version Control Systems because one box doesn&amp;rsquo;t have to support all the
simultaneous operations that would normally be going on. Commits,
checkouts, reverts, branches, diffs&amp;hellip;. all of it happens on peoples
local machines. They rarely need interact with &lt;a href=&#34;https://weblog.masukomi.org/2008/03/11/wheres-the-main-repo-when-using-git&#34;&gt;the canonical / central
repo&lt;/a&gt;.
This means that large companies like Google wouldn&amp;rsquo;t need to invest in
massive boxes with huge processors and piles of ram just to keep their
version control system usable.&lt;/p&gt;
&lt;p&gt;Speaking of the canonical repo&amp;hellip;
workflow doesn&amp;rsquo;t have to change at all. If you&amp;rsquo;ve got an established
workflow with a centralized system there&amp;rsquo;s absolutely no reason it can&amp;rsquo;t
continue on after a switch to Distributed Version Control. But, it does
open up some &lt;a href=&#34;http://bazaar-vcs.org/Workflows&#34;&gt;other ways of working&lt;/a&gt;
that you may want to explore.&lt;/p&gt;
&lt;p&gt;In a centralized system if the box your
main repo lives on goes down you&amp;rsquo;re pretty much screwed. If your IT
people are &lt;em&gt;really&lt;/em&gt; on the ball you&amp;rsquo;ve got it syncing to another box
every few minutes (or more) and everything will fail over&amp;hellip; bringing
the primary box back up and resycing it may cause them to pull out their
hair but at least no-one would be affected. Unfortunately it is a very
rare company that&amp;rsquo;s that well prepared. And if you&amp;rsquo;re hosting an open
source project you just have to hope that the people you&amp;rsquo;re hosting with
have good backups and don&amp;rsquo;t go down.&lt;/p&gt;
&lt;p&gt;Most software companies, and open
source projects, simply grind to a halt when the version control system
goes down. Changes can&amp;rsquo;t be shared, branches can&amp;rsquo;t be made, bugs can&amp;rsquo;t
be patched, releases can&amp;rsquo;t be made, developers start building up a
backlog of changes that will end up mooshed together into one commit
when things do come back up, etc., etc., etc. But teams using DVCSs
simply don&amp;rsquo;t care. It&amp;rsquo;s a non issue. &amp;ldquo;The heads crashed on the drives of
the main repo, and a fuel truck plowed into our offsite backups&amp;rdquo;. It
simply doesn&amp;rsquo;t matter. Sure your IT guys are going to have to deal with
fixing that, but the impact to development is essentially zero. Someone
stands up, or sends out an e-mail, and says &amp;ldquo;the main repo is down, just
use my box instead&amp;rdquo;, and people do, and that&amp;rsquo;s the end of it. When the
main box is repaired IT simply pulls from the box everyone&amp;rsquo;s been using
in the interim and once again stands up, or sends out an email saying
&amp;ldquo;the main box is back up&amp;rdquo;. Automatically syncing a remote box for
fail-over becomes trivially simple with DVCS. Just set up a cron job to
pull from the main box every minute and you&amp;rsquo;re done.&lt;/p&gt;
&lt;p&gt;When it comes to
open source projects there is one factor that absolutely sucks and
that&amp;rsquo;s giving out write permissions. You don&amp;rsquo;t want to give them out to
just anyone, but if you don&amp;rsquo;t then people who you don&amp;rsquo;t trust yet either
have to work on your code without any revision control, or as is
frequently the case, they just fork it into a version control repo they
&lt;em&gt;do&lt;/em&gt; have control over and loose the ability to easily merge their
changes back into the main repo. You could just give them out to anyone
but that&amp;rsquo;s not a choice that many project managers are comfortable with.
With DVCSs it simply isn&amp;rsquo;t an issue. Everyone&amp;rsquo;s got their own repo(s)
everyone can commit, branch, etc.. And when they&amp;rsquo;ve got something
worthwhile they can ask you to pull from them, or send you a patch that
they know will work with your repo because that&amp;rsquo;s where their repo
originated and they&amp;rsquo;ve been pulling down your changes and merging it in
to their work.&lt;/p&gt;
&lt;p&gt;One problem that&amp;rsquo;s been an annoyance for me for years is
that most bug trackers have no concept of branches. When you go into
your bug tracker it shows you all your bugs but there&amp;rsquo;s no way to tell
what branches they exist in, and what happens when you fix a bug, and
get QA to sign off on it, in one branch but it hasn&amp;rsquo;t been patched in
another one? Is the bug fixed or isn&amp;rsquo;t it? And what about the people who
don&amp;rsquo;t have an intimate knowledge of that bug? How are they supposed to
know where it does and doesn&amp;rsquo;t exist?&lt;/p&gt;
&lt;p&gt;Distributed Issue Trackers solve
this problem. You file a ticket in the branch the bug exists in. Then
that ticket follows along with and branches of that branch until someone
closes the ticket. As they merge the fixes back into parent branches the
closed ticket merges in too. As a result you can always tell if a bug is
or isn&amp;rsquo;t fixed in the current branch. If you commit your closed ticket
with your patch then even more possibilities open up. If, for example,
it was decided that your cure was worse than the cause and excluded that
commit from a release then the ticket would re-open itself in the
release too (because you got rid of the fix).&lt;/p&gt;
&lt;p&gt;To date the best Distributed Issue Tracker, without question is
&lt;a href=&#34;http://ditz.rubyforge.org/&#34;&gt;Ditz&lt;/a&gt;, but the field is still very young.
I&amp;rsquo;ve personally been working on a fork of Ditz that makes some dramatic
changes and tightly integrates itself with Git, and I&amp;rsquo;ll update this
page and make an announcement as soon as it&amp;rsquo;s released (a week or two).
Personally I wouldn&amp;rsquo;t recommend anything other that Ditz right now. The
projects are either too immature or abandoned and buggy. Ditz doesn&amp;rsquo;t
have a lot of features yet but it&amp;rsquo;s reliable and gets the job done.&lt;/p&gt;
&lt;p&gt;Another cool thing about Distributed Version Control Systems is that you
don&amp;rsquo;t need anyone&amp;rsquo;s permission, or cooperation, to start using them. I
work at a company that uses Perforce, and I think that &lt;a href=&#34;https://weblog.masukomi.org/2007/08/31/dear-perforce-fuck-you&#34;&gt;Perforce is the
devil&lt;/a&gt;,
but it doesn&amp;rsquo;t matter, because I have Git. I do all my work in Git;
constantly branching and merging and mooshing commits, and when I&amp;rsquo;m
ready I just submit the completed changes back to Perforce. And this is
actually better for everyone. Sysadmins don&amp;rsquo;t have to deal with the
consequences of me making topic branches all over the place, the commits
I make for coworkers are generally cleaner, and I can commit as often as
I want, even break the build, without having to worry about the impact
on others. Now, it happens that Git has a number of tools for working
with the major centralized version control systems (it&amp;rsquo;s even got a CVS
proxy so that CVS people too resistant to change can keep working the
way they&amp;rsquo;re used to). But, if your DVCS of choice doesn&amp;rsquo;t have a tool to
bridge the gap to whatever centralized system you&amp;rsquo;re forced to deal
with, you can always use &lt;a href=&#34;http://progetti.arstecnica.it/tailor&#34;&gt;Tailor&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It sounds &lt;em&gt;too&lt;/em&gt; good&amp;hellip;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Some of you are probably thinking this
sounds too good to be true, or maybe that I&amp;rsquo;m DVCS zealot. But really,
it isn&amp;rsquo;t, and I&amp;rsquo;m not. I&amp;rsquo;m a huge fan of DVCS, it&amp;rsquo;s true, but I&amp;rsquo;m not
about to claim that they will solve all your problems. To really get the
full benefits of them you&amp;rsquo;ve got to start making atomic commits. This is
actually true of centralized systems too, but since centralized systems
tend to be such a pain to use, and frequently can&amp;rsquo;t do cool things like
cherry-picking, people don&amp;rsquo;t even bother to do anything advanced with
them. With a distributed system the advanced stuff becomes trivial
every-day stuff, and it becomes more annoying to have to deal with those
developers who won&amp;rsquo;t stop making ginormous commits with changes to
multiple bugs as well as a new feature or twelve. Fortunately, you don&amp;rsquo;t
have to accept their patches of you don&amp;rsquo;t want to. ;)&lt;/p&gt;
&lt;p&gt;Guis have come a long way since this was first posted, especially for
Git and Mercurial with quality that rivals the best tools for centralized
systems.&lt;/p&gt;
&lt;p&gt;On the command line some DVCSs like Darcs shine with totally intuitive commands, others
have a bit more of a learning curve. Git definitely does because of how
it stages things before commits. It &lt;em&gt;appears&lt;/em&gt; similar enough to the way
centralized systems work that many newbs expect it to work the same, and
get frustrated when their expectations collide with its significantly
different paradigm. Not only does Git stage things before commits but it
doesn&amp;rsquo;t even think in terms of files, although, unless you&amp;rsquo;re paying
attention, it may seem that it does.&lt;/p&gt;
&lt;p&gt;Scaling to handle extremely large
repos with years of history is something that Git handles very well
(Mercurial probably does too), but some systems, like Darcs, have
serious problems with.&lt;/p&gt;
&lt;p&gt;In short, Distributed Version Control systems are
totally bad-ass, and can really help with a lot of common development
problems, but they&amp;rsquo;re still fairly new, and while the big ones are good,
and reliable, they may not have all the polish and GUI widgets that
you&amp;rsquo;re used to with your centralized system. My advice is to go get Git,
unless the majority of your developers are on Windows, in which case
Mercurial may be a better choice&amp;hellip; for the moment.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Boston Night Rides I</title>
      <link>https://weblog.masukomi.org/2008/06/15/boston-night-rides-i/</link>
      <pubDate>Mon, 16 Jun 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/06/15/boston-night-rides-i/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2008/06/night_ride_i.jpg&#34; alt=&#34;View from Fort Independence at
night&#34;&gt;I
love this city and I thought it would be interesting to see what I could
see when the roads weren&amp;rsquo;t clogged with cars&amp;hellip; &lt;strong&gt;Overall rating:&lt;/strong&gt; 2
1/2 stars (out of 5). It&amp;rsquo;s interesting but not very relaxing. Don&amp;rsquo;t get
any ideas about attempting this during the day either. The traffic would
be evil. &lt;a href=&#34;http://maps.google.com/maps?f=d&amp;amp;hl=en&amp;amp;geocode=16863818240331589240,42.364050,-71.051070;15611129248936053445,42.349110,-71.039590;3720463227594358870,42.346090,-71.041792;15634529522718357329,42.335840,-71.023800;6946028291863879682,42.338942,-71.015438;16925997750923389765,42.322361,-71.053831;5900922453017317637,42.351200,-71.103482;17355618166615704908,42.358620,-71.088000;2337566034364990785,42.366780,-71.068490&amp;amp;saddr=42.366788,-71.068239&amp;amp;daddr=Atlantic+Ave/Commercial+St+@42.364050,+-71.051070+to:Northern+Ave/Seaport+Blvd+@42.349110,+-71.039590+to:Summer+St+@42.346090,+-71.041792+to:E+Broadway+@42.335840,+-71.023800+to:William+J+Day+Blvd+@42.338942,+-71.015438+to:Unknown+road+@42.322361,+-71.053831+to:Storrow+Dr+@42.351200,+-71.103482+to:Memorial+Dr/RT-3+S+@42.358620,+-71.088000+to:Monsignor+Obrien+Hwy/RT-28+S+@42.366780,+-71.068490&amp;amp;mra=dme&amp;amp;mrcr=0&amp;amp;mrsp=0&amp;amp;sz=14&amp;amp;via=1,2,3,4,5,6,7,8&amp;amp;sll=42.361969,-71.058025&amp;amp;sspn=0.028539,0.069609&amp;amp;ie=UTF8&amp;amp;ll=42.347253,-71.067123&amp;amp;spn=0.053286,0.139217&amp;amp;z=13&#34;&gt;The
Route&lt;/a&gt;
Note: I&amp;rsquo;d actually recommend going to the end of Storrow Drive and
following the curve around as it becomes the start of Memorial Drive but
I couldn&amp;rsquo;t convince Google Maps to do that. All said, it&amp;rsquo;s about 20
miles, and a little over an hour of driving. &lt;strong&gt;What you&amp;rsquo;ll encounter:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://en.wikipedia.org/wiki/Boston_Garden&#34;&gt;Boston Garden&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.uscg.mil/D1/&#34;&gt;U.S. Coast Guard First District&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Glowing pillars (they were green this time)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.jameshooklobster.com/&#34;&gt;James Hook+Co Lobster&lt;/a&gt; This
eyesore of a building has been here so long it has ingrained itself
into Boston&amp;rsquo;s subconscious.&lt;/li&gt;
&lt;li&gt;Boston&amp;rsquo;s World Trade Center&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.livenation.com/venue/getVenue/venueId/496&#34;&gt;The Bank of America
Pavilion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A working sea-port (they never close)&lt;/li&gt;
&lt;li&gt;The sweet view from &lt;a href=&#34;http://www.mass.gov/dcr/parks/metroboston/castle.htm&#34;&gt;Fort
Independence,&lt;/a&gt;
but not Fort Independence itself, because the trees hide it in the
dark.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://en.wikipedia.org/wiki/Big_Dig_(Boston,_Massachusetts)&#34;&gt;The Big
Dig&lt;/a&gt;
(you&amp;rsquo;ll ride above, and within the tunnel)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.mos.org/&#34;&gt;Boston Museum Of Science&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Two State Police stations Not that State Police stations are
particularly notable. I just found it interesting because of the low
probability of directly past two of them on such a short ride.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;What you&amp;rsquo;ll need:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The ability to memorize the route. This shouldn&amp;rsquo;t be hard. A lot of
the roads you just follow until they force you to turn, or it&amp;rsquo;s
simple to know you should turn. Consulting a map en-route is simply
not safe without pulling over.&lt;/li&gt;
&lt;li&gt;To consult Google&amp;rsquo;s Street View images so that you know what the
turns look like in advance.&lt;/li&gt;
&lt;li&gt;A good sense of direction in case you miss a turn, or they&amp;rsquo;ve
blocked one off.&lt;/li&gt;
&lt;li&gt;No fear of rotaries (roundabouts). I think there are 3 and one is
busy and not slow.&lt;/li&gt;
&lt;li&gt;To make sure there isn&amp;rsquo;t a big event at the Garden when you go by
it. It&amp;rsquo;ll slow you down to a crawl for about 4 blocks if there is.&lt;/li&gt;
&lt;li&gt;To pray they&amp;rsquo;re not randomly blocking off three lanes of the tunnel
for no apparent reason&amp;hellip; again.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;When to go:&lt;/strong&gt; Late. No, later than that. Midweek nights are probably
best because there&amp;rsquo;ll be less people out partying. The route goes
directly in front of approximately four bars, so keep your eyes open
around them (not hard to spot) and remember that the MBTA stops running
at midnight and the bars close at two. I&amp;rsquo;d say this encouraged drunk
driving except for the fact that no-one can park anywhere in Boston&amp;hellip;
&lt;strong&gt;Highlights:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Driving &lt;a href=&#34;http://en.wikipedia.org/wiki/Storrow_Drive&#34;&gt;Storrow Drive&lt;/a&gt;
at night with no traffic ( although I prefer it in the other
direction).&lt;/li&gt;
&lt;li&gt;Getting off your bike and listening to the sound of the sea lapping
against the rocks at Fort Independence.&lt;/li&gt;
&lt;li&gt;Finally getting to open your throttle when you get onto I 93 north.&lt;/li&gt;
&lt;li&gt;Entering Boston from the south on I 93. I&amp;rsquo;ve always loved that, but
I love this city so maybe it&amp;rsquo;s just me. I actually liked it better
before the Big Dig.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Would I do it again?&lt;/strong&gt; Meh, probably not. But it was interesting once,
and now I&amp;rsquo;m curious to see what Fort Independence is like during the
day.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>typelation [Definition]</title>
      <link>https://weblog.masukomi.org/2008/06/12/typelation-definition/</link>
      <pubDate>Thu, 12 Jun 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/06/12/typelation-definition/</guid>
      <description>&lt;p&gt;typelation: n. The act of converting speech, or thoughts, into text for
a text-based conversation (e-mail, instant messages, etc.). Example: The
joke lost something in the typelation.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Undelicious - a Delicious Library 2.0 review</title>
      <link>https://weblog.masukomi.org/2008/06/12/undelicious-a-delicious-library-20-review/</link>
      <pubDate>Thu, 12 Jun 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/06/12/undelicious-a-delicious-library-20-review/</guid>
      <description>&lt;p&gt;So, &lt;a href=&#34;http://www.delicious-monster.com/&#34;&gt;Delicious Library 2.0 was finally
released&lt;/a&gt;. I was seriously wondering
if it was just going to be vaporware for years. The people behind it
would pop up their heads every two to four months and say &amp;ldquo;real soon
now&amp;rdquo;. Back in November / December of 07 they were encouraging people to
buy 1.x so that they would get the free upgrade, hopefully in time for
xmas but if not very soon thereafter. It&amp;rsquo;s now June. They had a forum to
discuss it where people basically said &amp;ldquo;yo wtf?&amp;rdquo; and the devs said &amp;ldquo;&amp;hellip;&amp;rdquo;
and occasionally &amp;ldquo;real soon now&amp;rdquo; with no indication as to wtf the
hold-up was or why it&amp;rsquo;d been in private beta for months, and months, and
months.&lt;/p&gt;
&lt;p&gt;The 2.0 version has taken about four years to happen (1.0 came
out in 2004). All the 1.x versions were just bug fixes not feature
upgrades. If I sound a little bitter, it&amp;rsquo;s because I am. I can&amp;rsquo;t begin
to tell you how excited I&amp;rsquo;ve been, and how long I&amp;rsquo;ve been waiting for,
DL 2.0 without sounding like an idiot. This is, of course, due to the
fact that it&amp;rsquo;s a library app, and anyone sounds like an idiot when they
start talking excitedly about one. But they actually made it fun and
really useful with 1.x and I couldn&amp;rsquo;t wait for new hotness.&lt;/p&gt;
&lt;p&gt;Being a
registered user I figured I might get an e-mail about the release, but
no. I just stumbled across it when doing my monthly check of their blog
(to see if there&amp;rsquo;d be any progress). So, I downloaded the demo, to try
out it&amp;rsquo;s new hotness.&lt;/p&gt;
&lt;h3 id=&#34;adding-new-items&#34;&gt;Adding new items&lt;/h3&gt;
&lt;p&gt;I was so jazzed to try this
out as it was always one of the best parts. When I tried to add one of
my recently purchased books it told me I could only add 25 items in the
demo. It&amp;rsquo;s a reasonable limitation for a demo, but *I hadn&amp;rsquo;t added a
single item.*It had imported my library from the 1.x install. Maybe
they&amp;rsquo;ve radically improved the adding of items. Maybe they didn&amp;rsquo;t change
it. Maybe it&amp;rsquo;s as broken as FTP upload&amp;hellip;. I couldn&amp;rsquo;t tell ya. They
spent &amp;ldquo;four or so months to rewrite iSight scanning for internal
iSights&amp;rdquo;, because apparently working perfectly in 1.x under Tiger and
Leopard simply wasn&amp;rsquo;t good enough. And you deserve 4 months worth of
work users will never see the benefits of. I can&amp;rsquo;t confirm that they
didn&amp;rsquo;t break it because it won&amp;rsquo;t let me try to add anything.&lt;/p&gt;
&lt;h3 id=&#34;ability-to-borrow-a-book-from-friends&#34;&gt;Ability to borrow a book from friends?&lt;/h3&gt;
&lt;p&gt;Hah! Silly user. People don&amp;rsquo;t &lt;em&gt;borrow&lt;/em&gt;
books. They only &lt;em&gt;lend&lt;/em&gt; books. I can browse the libraries of anyone else
on the network who has it and is sharing (just like iTunes). I can only
mark things as being lent to others, but I can&amp;rsquo;t borrow anything.&lt;/p&gt;
&lt;h3 id=&#34;speed&#34;&gt;Speed&lt;/h3&gt;
&lt;p&gt;meh. It&amp;rsquo;s no speed demon. It&amp;rsquo;s usable, but some things
seem&amp;hellip; laggy. Icon&amp;rsquo;s taking half a second to swap states when you check
in something a friend borrowed. It&amp;rsquo;s not that it&amp;rsquo;s annoyingly slow. It&amp;rsquo;s
that we&amp;rsquo;ve become accustomed to things being far snappier.&lt;/p&gt;
&lt;h3 id=&#34;ftp-uploading&#34;&gt;FTP Uploading&lt;/h3&gt;
&lt;p&gt;I get an &amp;ldquo;Operation not permitted&amp;rdquo; error, or it &lt;em&gt;appears&lt;/em&gt;
to silently fail, based on my settings. I&amp;rsquo;m not sure if it &amp;ldquo;Operation
not permitted&amp;rdquo; means the FTP server won&amp;rsquo;t permit some operation, or DL
won&amp;rsquo;t permit some operation (probably the former), and I have zero idea
what operation wasn&amp;rsquo;t permitted. After fiddling more I discovered that
it wasn&amp;rsquo;t &lt;em&gt;really&lt;/em&gt; silently failing. The was a subtle solid circle next
to the Publish button. This circle doesn&amp;rsquo;t move, blink, fade, or do
anything other than sit there.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://comic.masukomi.org/assets/2008/06/shh_publishing.png&#34; title=&#34;Shhh. I’m publishing&#34;&gt;&lt;img src=&#34;http://comic.masukomi.org/assets/2008/06/shh_publishing.png&#34; alt=&#34;Shhh. I’m
publishing&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;When you choose Window &amp;gt; Activity you see an empty black window that&amp;rsquo;s
titled &amp;ldquo;lookup activity&amp;rdquo;, and the only way I discovered that it actually
was publishing was that when I moused over the circle it says
&amp;ldquo;Publishing in background&amp;rdquo;. It&amp;rsquo;s been &amp;ldquo;Publishing in background&amp;rdquo; for up
to 20 minutes on multiple occasions now and each time it creates one
folder, and twenty html files (out of the 160 the progress bars (1-75
and then another one for 1-85??) claimed it had created, but no images.
It has put these files in a &amp;ldquo;deliciouslibrary&amp;rdquo; folder &lt;em&gt;inside&lt;/em&gt; the
folder i told it i wanted the files in, because apparently just sticking
them directly in the folder I told it to use it too complicated.&lt;/p&gt;
&lt;p&gt;This is because it has stalled (silently failed for real this time). It turns
out if you try and restart it from the File menu it says &amp;ldquo;Publishing to
FTP Site (0%)&amp;rdquo; where it used to have a &amp;ldquo;Publish to FTP&amp;rdquo; menu item. This
is even more frustrating due to the fact that it &lt;em&gt;has&lt;/em&gt; published
&lt;em&gt;something&lt;/em&gt; so it can&amp;rsquo;t possibly be &lt;em&gt;zero&lt;/em&gt; percent. When you go to quit
it (because it&amp;rsquo;s not working) it doesn&amp;rsquo;t bother to warn you that it&amp;rsquo;s in
the middle of publishing. It just quits.&lt;/p&gt;
&lt;h3 id=&#34;exporting-html-to-a-local-folder&#34;&gt;Exporting HTML to a local folder&lt;/h3&gt;
&lt;p&gt;works just fine (except for the 22Mb DeliciousLibrary2Dump.deliciousShare file it shoved in there for no
apparent reason), and then you can upload that manually to your web
server, although my export is just under 50Mb.&lt;/p&gt;
&lt;h3 id=&#34;html-export-any-method&#34;&gt;HTML Export (any method)&lt;/h3&gt;
&lt;p&gt;Items seem to be sorted by meth-addled crack-whores reaching
for the &amp;ldquo;rock&amp;rdquo; they just dropped, whilst fellating a John with
electrodes attached to his willie. It&amp;rsquo;s not sorted by author. It&amp;rsquo;s not
sorted by title. It&amp;rsquo;s not sorted by rating. It&amp;rsquo;s not sorted by genre.
It&amp;rsquo;s not even sorted by the order I added them to Delicious Library. In
fact, as far as I can tell, it&amp;rsquo;s &lt;em&gt;totally fucking randomized&lt;/em&gt;. What DL
has given me is a very nice looking collection of 378 books (and other
media) in which you can&amp;rsquo;t find a damn thing you&amp;rsquo;re looking for, and
can&amp;rsquo;t browse in any useful way.&lt;/p&gt;
&lt;p&gt;Oh, and those star ratings next to each
item? &lt;em&gt;Those aren&amp;rsquo;t mine&lt;/em&gt;. I assume they&amp;rsquo;re from Amazon, but I have no
idea if they&amp;rsquo;re the &lt;em&gt;average&lt;/em&gt; rating or what Amazon thinks &lt;em&gt;I&amp;rsquo;ll&lt;/em&gt; think
of them. I can&amp;rsquo;t turn them off, and honestly, I don&amp;rsquo;t feel like
contemplating the relative quality, on a one to five scale, of each of
four hundred freaking books, and then all my movies and video games. So,
I&amp;rsquo;m not going to set them.&lt;/p&gt;
&lt;p&gt;There are 27 pages of books in my export, of
which you can see links to 5 at a time. there&amp;rsquo;s no good way to jump
ahead so you end up clicking and clicking and clicking &amp;hellip; or you would,
if there was some order, and thus hope of getting to something you&amp;rsquo;re
looking for.&lt;/p&gt;
&lt;p&gt;** I won&amp;rsquo;t link you to the html it made because it&amp;rsquo;s a)
useless b) annoying c) a fucking insult to our intelligence.**&lt;/p&gt;
&lt;h3 id=&#34;sharing&#34;&gt;Sharing&lt;/h3&gt;
&lt;p&gt;sharing is pretty useless. the only way to interactively
share is with other people running delicious library on your local LAN,
which is to say, no-one. While I know that 1.x has sold gang-busters I
have yet to meet a user of it in person. I suspect the same will remain
true for 2.x. The odds of meeting them AND them being in the same
building at my company&amp;hellip;. even closer to zero. The usefulness of
sharing from someone in the lan on my house is absolutely zero.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m betting that printing works. I could &amp;ldquo;share&amp;rdquo; the list that way. But
seriously, who wants to read through pages and pages of hundreds of my
book, game, and movie listings. No-one, that&amp;rsquo;s who. I have friends who
would like to know if I have a particular book, but like they say &amp;ldquo;you
can&amp;rsquo;t grep dead trees.&amp;rdquo;&lt;/p&gt;
&lt;h3 id=&#34;misc&#34;&gt;Misc&lt;/h3&gt;
&lt;p&gt;After all this freaking time
delicious-library.com (which they do own) still doesn&amp;rsquo;t work. No, you
have to go to delicious-monster.com which I simply don&amp;rsquo;t have enough
energy left to bitch about the stupidity of.&lt;/p&gt;
&lt;h3 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;HTML export is beyond useless. UI isn&amp;rsquo;t different enough that I care. &amp;ldquo;Sharing&amp;rdquo; is a
feature I&amp;rsquo;ll never get a chance to use, and you probably won&amp;rsquo;t either.
On the other hand, it now supports many languages I don&amp;rsquo;t speak. And
lets me loan (but not borrow) tools, because apparently the lead dev.
couldn&amp;rsquo;t remember who he loaned a $200 drill to&amp;hellip; Sounds like a
must-buy app to me. Er, wait&amp;hellip; no it doesn&amp;rsquo;t.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Angle-bracket Operator [Definition]</title>
      <link>https://weblog.masukomi.org/2008/06/09/angle-bracket-operator-definition/</link>
      <pubDate>Mon, 09 Jun 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/06/09/angle-bracket-operator-definition/</guid>
      <description>&lt;p&gt;Angle-bracket Operator: n. A person who manipulates HTML professionally.
Also see Web-designer.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Knox Gilet Air Review</title>
      <link>https://weblog.masukomi.org/2008/06/08/knox-gilet-air-review/</link>
      <pubDate>Sun, 08 Jun 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/06/08/knox-gilet-air-review/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2008/06/giletair400.jpg&#34; title=&#34;Gilet Air&#34;&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2008/06/giletair400.jpg&#34; alt=&#34;Knox Gilet
Air&#34;&gt;&lt;/a&gt;
Most motorcycle gear has little-to-no spine protection. Even suits with
decent spine armor rarely have anything that comes close to what Knox
offers, and essentially no-one else offers CE rated chest protection for
street-riders. Being a safety conscious chick who values her spine and
internal organs I ponied up the money for this. The results are mixed.&lt;/p&gt;
&lt;h3 id=&#34;looks&#34;&gt;Looks&lt;/h3&gt;
&lt;p&gt;If you check out Knox&amp;rsquo;s home page you&amp;rsquo;ll see that they&amp;rsquo;ve
updated the styling of this for 2008, but the one pictured here is
essentially the same, and what I happen to own, so that&amp;rsquo;s what I&amp;rsquo;m
showing. The only positive thing I can think to say about the looks of
this is that it&amp;rsquo;s not bad from the back. The front however&amp;hellip;&lt;/p&gt;
&lt;h3 id=&#34;fit&#34;&gt;Fit&lt;/h3&gt;
&lt;p&gt;First off, this is really designed for men. The chest plate simply
doesn&amp;rsquo;t accommodate any woman with a bust. Also, if you&amp;rsquo;re pudgy, like
so many Harley riders, I suspect this just won&amp;rsquo;t fit well no matter what
size you order. However, if you&amp;rsquo;re in shape, and relatively flat
chested, or male, you&amp;rsquo;ll have no problem. Their sizing chart worked for
me and I&amp;rsquo;m &lt;em&gt;very glad&lt;/em&gt; I consulted it, because I would have never chosen
an extra-small otherwise as I normally wear medium or large tops.&lt;/p&gt;
&lt;p&gt;You can easily remove the chest piece, but there&amp;rsquo;s not a lot of point in
buying the Gilet if you do that. If you just wanted the back protection
they have a variety of back-only options.&lt;/p&gt;
&lt;h3 id=&#34;comfort-the-back-plate-is&#34;&gt;Comfort The back plate is&lt;/h3&gt;
&lt;p&gt;actually quite comfortable and gives me a reassuring feeling while
riding down the road. The chest piece is so-so on comfort. It&amp;rsquo;s not
uncomfortable, but it&amp;rsquo;s not comfortable either. The real problem though,
is the closure at the top. I find that when I wear this under my
&lt;a href=&#34;https://weblog.masukomi.org/2008/05/03/fieldsheer-highland-ii-review&#34; title=&#34;Fieldsheer Highland II Review&#34;&gt;Highland
II&lt;/a&gt;
(after removing the Highland&amp;rsquo;s back armor) the neck closure on the
Highland (and probably any other jacket) presses against the neck
closure on the Knox and pushes it against my breast-bone. After about
half an hour it really starts to hurt and leaves a sore red mark. The
only solution I&amp;rsquo;ve found is to not do up the top closure of the Knox.&lt;/p&gt;
&lt;p&gt;Similarly the zipper that holds the mesh snugly around the chest armor
is by the top and points directly back at your chest. I haven&amp;rsquo;t actually
had an issue with this but I suspect it might be a problem for some, and
I thought that it was what was hurting me for a while before I moved
things around and still had the pain. I really think this zipper should
be moved to the front or replaced with velcro.&lt;/p&gt;
&lt;p&gt;The wide velcro belly
band that supports the back-piece and holds everything in place has a
tendency to ride up, and doesn&amp;rsquo;t breathe at all, which brings me to&amp;hellip;&lt;/p&gt;
&lt;h3 id=&#34;temperature&#34;&gt;Temperature&lt;/h3&gt;
&lt;p&gt;Let&amp;rsquo;s be honest here. We&amp;rsquo;re talking about strapping
large form-fitting pieces of foam to your torso. There&amp;rsquo;s no way this
won&amp;rsquo;t increase the temperature. As I mentioned above the back piece is
comfortable and gives me a reassuring feeling, but I do sweat somewhat
under it, always. Surprisingly though, it doesn&amp;rsquo;t end up bothering me at
all.&lt;/p&gt;
&lt;p&gt;The chest piece though&amp;hellip; I tried so hard to like this chest piece.
I want some chest protection, and that&amp;rsquo;s the main reason I got this (the
Highland II already has CE rated back armor, although not as good), but
I&amp;rsquo;ve pretty much given up on using it in the summer. I overheat to the
point that I worry about heat stroke on long warm rides when I have the
chest piece in. Not only do you overheat with it, but the sweat just
kind-of stays there, feels uncomfortable, and can&amp;rsquo;t help cool you. It
blocks air from getting to your chest, which is exactly what you &lt;em&gt;don&amp;rsquo;t&lt;/em&gt;
want to have happen on a hot day.&lt;/p&gt;
&lt;p&gt;And then there&amp;rsquo;s the belly band. Not
only does it ride up but you can&amp;rsquo;t help but sweat under it.&lt;/p&gt;
&lt;p&gt;Ugh. Knox
really needs to rethink the design of this chest piece. Dirt-bike riders
have had chest protection for years and it always has air vents in it.
I&amp;rsquo;m tempted to go to Home-depot, buy a half-inch drill bit, and go all
Psycho on this thing, but it&amp;rsquo;s so small to begin with that I&amp;rsquo;m not
convinced that what would be left would be worth wearing. There&amp;rsquo;s no
reason the belly-band can&amp;rsquo;t be redesigned to be more breathable.&lt;/p&gt;
&lt;h3 id=&#34;misc&#34;&gt;Misc&lt;/h3&gt;
&lt;p&gt;I find that the back piece is large enough that it prevents
the Gilet from fitting into most bags. As a result you&amp;rsquo;re stuck wearing
it, and looking like a dork, or carrying it around, and looking like a
dork, if you go into a store or restaurant. I&amp;rsquo;m hesitant to leave it in
a bike bag (not that I have one it would fit in) because the thing costs
$300.&lt;/p&gt;
&lt;h3 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;I would love to wave a flag and say &amp;ldquo;Buy This!&amp;rdquo;,
because I think most people wear way to little armor, and this is a nice
simple way to add some to your current gear, &lt;em&gt;but I simply can&amp;rsquo;t&lt;/em&gt;. I
think racer&amp;rsquo;s would do better with the Knox Contour and chest piece, and
I just don&amp;rsquo;t see anyone who isn&amp;rsquo;t fanatical about wearing armor using
this all the time. In the summer the chest piece is too hot, probably
for anyone, and I&amp;rsquo;m sure there will be some people out there who are
bothered by the extra sweating under the back-piece. Most women simply
won&amp;rsquo;t be able to wear this comfortably at all.&lt;/p&gt;
&lt;p&gt;Knox needs to find a way
to seriously improve the ventilation of this before I can recommend it.
If you&amp;rsquo;re concerned about your spine, look into one of their other
stand-alone spine protectors, but I&amp;rsquo;d pass on this unless you happen to
find a really good deal on it. I&amp;rsquo;ll keep mine for winter use and when I
have a ride-along who wants to feel safer, but for the summer I think
I&amp;rsquo;ll switch to the &lt;a href=&#34;http://www.planet-knox.com/detail2.aspx?ID=31&#34; title=&#34;Knox Kompakt back protector&#34;&gt;Knox
Kompakt&lt;/a&gt;
(revamped version of the Stowaway) or just use the back armor that came
with the Highland II.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Night Life by Caitlin Kittredge - Review</title>
      <link>https://weblog.masukomi.org/2008/05/24/night-life-by-caitlin-kittredge-review/</link>
      <pubDate>Sun, 25 May 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/05/24/night-life-by-caitlin-kittredge-review/</guid>
      <description>&lt;p&gt;Laurell K Hamilton is the undeniable queen of this genre, but it took
her about eight Anita Blake books to approach the quality of writing
that Caitlin has given us in her first outing. Eventually Laurell
improved her skills but morphed her books into soft-core porn with
vampires. Ugh.If you&amp;rsquo;re like me and enjoy a bad ass heroine in a gritty
urban fantasy setting then &lt;a href=&#34;http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;amp;location=http://www.amazon.com/Night-Life-Nocturne-City-Book/dp/0312948298?ie=UTF8&amp;amp;s=books&amp;amp;qid=1211687934&amp;amp;sr=1-1&amp;amp;tag=masukomiorg-20&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=9325&#34;&gt;Night
Life&lt;/a&gt;
is something you should pick up.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s only one problem: the cover. If
you pay attention to the cover you will think this another cheesy
romance novel with werewolves. The only redeeming thing about the cover
is that Caitlin probably had little control over it, and, if you didn&amp;rsquo;t
know already, the author rarely writes the descriptive text on the book
cover. The perceived cheese is slightly due to Caitlin&amp;rsquo;s way of naming
things: our werewolf heroine is named &amp;ldquo;Luna&amp;rdquo;, and the story takes place
in &amp;ldquo;Nocturne City&amp;rdquo;. Normally, I&amp;rsquo;m totally fine with a little
tongue-in-cheek naming, but when combined with the descriptive text
which describes Luna as a &amp;ldquo;tough-as-nails police officer&amp;rdquo; and notes that
&amp;ldquo;&amp;hellip;when she investigates prime suspect Dmitri Sandovsky, she can&amp;rsquo;t
resist his wolfish charms.&amp;rdquo; it just screams cheesy crap to me. The final
red flag is the girl on the cover who looks like a seventeen year old
goth wannabe.&lt;/p&gt;
&lt;p&gt;Getting back to the book itself: the first few pages are a
bit rough, especially &amp;ldquo;I could smell her blood because I&amp;rsquo;m a werewolf.&amp;rdquo;
I feel for Caitlin, because trying to convey that your protagonist is
anything other than normal human within the first couple pages is an
unenviable task, but still&amp;hellip; Fortunately the writing improves quickly,
and while it didn&amp;rsquo;t immediately suck me in, it wasn&amp;rsquo;t bad, and it showed
enough promise to keep me reading, and reading, and reading until 2 AM
Monday morning when I forced myself to put it down and get some sleep
before work.&lt;/p&gt;
&lt;p&gt;The book was so enjoyable, and I was so thoroughly caught
up in it, that when &lt;a href=&#34;http://comic.masukomi.org/2008/05/23/night-life&#34;&gt;I was unable to find it the next morning, or after
days of searching&lt;/a&gt;, I
was prepared to go out and re-buy it just to finish it. Luna is a well
written, and multifaceted character you enjoy reading about. Her
shortcomings are, thankfully, not the emotional equivalent of the movie
women who can&amp;rsquo;t run twelve feet without tripping over nothing, but
realistic and believable human complexities. The relationship that
builds between her Dmitri is very quick, but Caitlin manages to make it
not feel like an excuse to write multiple sex scenes (there&amp;rsquo;s only one),
or one of those totally contrived &amp;ldquo;I hate you. Take me now.&amp;rdquo;
relationships. While there&amp;rsquo;s nothing terribly surprising about it, it&amp;rsquo;s
relatively realistic, layered, and well done. Just like all the other
denizens of Luna&amp;rsquo;s life, which leaves Caitlin with a great foundation
for future books to build on.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not perfect, and you&amp;rsquo;ll probably find
a few nits to pick but nothing notably bad. I do prefer the way werewolf
packs, and the transmission of werwolfism were handled by authors like
&lt;a href=&#34;http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;amp;location=http://www.amazon.com/Moon-Called-Mercy-Thompson-Book/dp/0441013813?ie=UTF8&amp;amp;s=books&amp;amp;qid=1211687602&amp;amp;sr=1-2&amp;amp;tag=masukomiorg-20&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=9325&#34;&gt;Patricia
Briggs&lt;/a&gt;,
&lt;a href=&#34;http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;amp;location=http://www.amazon.com/Bitten-Women-Otherworld-Book-1/dp/0452286034?ie=UTF8&amp;amp;s=books&amp;amp;qid=1211687670&amp;amp;sr=8-1&amp;amp;tag=masukomiorg-20&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=9325&#34;&gt;Kelly
Armstrong&lt;/a&gt;,
or even &lt;a href=&#34;http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;amp;location=http://www.amazon.com/Blue-Anita-Blake-Vampire-Hunter/dp/0515134457?ie=UTF8&amp;amp;s=books&amp;amp;qid=1211687735&amp;amp;sr=1-1&amp;amp;tag=masukomiorg-20&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=9325&#34; title=&#34;Blue Moon (best of the series I think)&#34;&gt;Ms.
Hamilton&lt;/a&gt;.
I&amp;rsquo;m not thrilled with what eventually happens to the members of Dmitri&amp;rsquo;s
pack, or how easily it seems to have transpired. And, there are a few
things just after the final fight that leave me going &amp;ldquo;wait, what
exactly&amp;hellip;.&amp;rdquo;, but I&amp;rsquo;m still putting it down knowing I&amp;rsquo;ll buy her next
book without hesitation (or looking at the cover).&lt;/p&gt;
&lt;p&gt;I hope that her
publisher pulls their heads out of their asses and tries to market her
next book based on what&amp;rsquo;s inside of it instead of what they hope their
target market wants to hear. Caitlin is a talented writer, whose work I
happily put alongside that of authors like &lt;a href=&#34;http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;amp;location=http://www.amazon.com/Moon-Called-Mercy-Thompson-Book/dp/0441013813?ie=UTF8&amp;amp;s=books&amp;amp;qid=1211687602&amp;amp;sr=1-2&amp;amp;tag=masukomiorg-20&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=9325&#34;&gt;Patricia
Briggs&lt;/a&gt;,
&lt;a href=&#34;http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;amp;location=http://www.amazon.com/Bitten-Women-Otherworld-Book-1/dp/0452286034?ie=UTF8&amp;amp;s=books&amp;amp;qid=1211687670&amp;amp;sr=8-1&amp;amp;tag=masukomiorg-20&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=9325&#34;&gt;Kelly
Armstrong&lt;/a&gt;,
&lt;a href=&#34;http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;amp;location=http://www.amazon.com/Greywalker-Book-1-Kat-Richardson/dp/B00164GEXG?ie=UTF8&amp;amp;s=books&amp;amp;qid=1211688420&amp;amp;sr=1-3&amp;amp;tag=masukomiorg-20&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=9325&#34;&gt;Kat
Richardson&lt;/a&gt;,
and &lt;a href=&#34;http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;amp;location=http://www.amazon.com/Dead-Witch-Walking-Rachel-Morgan/dp/0060572965?ie=UTF8&amp;amp;s=books&amp;amp;qid=1211688246&amp;amp;sr=1-1&amp;amp;tag=masukomiorg-20&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=9325&#34;&gt;Kim
Harrison&lt;/a&gt;.
Hopefully these women will be able to convince publishers that Urban
Fantasy readers don&amp;rsquo;t just want trashy romance novels with magical
beings thrown in.&lt;/p&gt;
&lt;p&gt;P.S. Thank you Caitlin for having the balls to use the
word &amp;ldquo;cock&amp;rdquo; in the sex scene. I am so sick of members and throbbing
hardnesses. Can you imagine anyone using those in real life? &amp;ldquo;Oh baby,
show me your throbbing hardness.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;P.P.S Check out &lt;a href=&#34;http://www.writersarereaders.com/richardsonkittredgenightlife.html&#34;&gt;Kat Richardson&amp;rsquo;s review of Night Life&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Some observations about Buell motorcycles</title>
      <link>https://weblog.masukomi.org/2008/05/25/some-observations-about-buell-motorcycles/</link>
      <pubDate>Sun, 25 May 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/05/25/some-observations-about-buell-motorcycles/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been following Buell since they appeared on the scene. Initially
people were having all sorts of maintenance issues, similar to old
Harley Davidsons (their parent co.), but they seem to have come a long
way in that dept, although I hear tale that the Japanese bikes are still
better in that dept.. Something that wouldn&amp;rsquo;t surprise me in the least.&lt;/p&gt;
&lt;p&gt;Poking around the Buell site today I ended up watching the videos Eric
Buell made a couple years ago about Buell&amp;rsquo;s &amp;ldquo;&lt;a href=&#34;http://www.buell.com/en_us/buell_way/buell_on_buell/radicalprinciples.asp&#34;&gt;Radical
Principles&lt;/a&gt;&amp;rdquo;,
and that&amp;rsquo;s where I discovered what I think really sets Buell apart from
many manufacturers. They&amp;rsquo;re making bikes for real world road riding
&lt;em&gt;not&lt;/em&gt; track racing. Given, what&amp;rsquo;s good for one is frequently good for
the other. But, I think this approach has a much better chance of
resulting in a bike that&amp;rsquo;s suited to the riding you&amp;rsquo;re really going to
do on it, as opposed to the riding you wish you&amp;rsquo;d do on it.&lt;/p&gt;
&lt;p&gt;Later on I
came across this quote where he was talking about Buell owners:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We tend to be more individualistic than other motorcyclists and less
likely to follow the crowd. We tend to be nice people and - this will
sound corny - but I&amp;rsquo;ve also seen that we&amp;rsquo;re extremely appreciative of
other people. What I also like is that we seem to have an
extraordinary level of tolerance - you just don&amp;rsquo;t see any rude
attitudes, which is really cool. We have a lot of really successful
people riding Buell Motorcycles who could be arrogant and stuffy, but
they&amp;rsquo;re not. And that&amp;rsquo;s because we&amp;rsquo;re true to who we are. We&amp;rsquo;re not
riding a Buell to prove to other people that we&amp;rsquo;re cool. We know who
we are. Let me give you a perfect example of what I mean by this.
Buell tends to not attract the kind of people who want to pretend
they&amp;rsquo;re someone they&amp;rsquo;re not. Buell owners think, &amp;ldquo;I know I can buy a
bike that will go 200 mph, but c&amp;rsquo;mon, when am I ever going to do
that?&amp;rdquo; We just have a different mindset. Maybe we&amp;rsquo;re purists, rather
than poseurs. We just want to have fun, and we want a great motorcycle
to help do that. Maybe we&amp;rsquo;re born that way, huh?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Those are the kind of people that I want to associate with. I don&amp;rsquo;t ride
to look cool. I ride because I love riding. I&amp;rsquo;ve never gone over 80mph
on a bike because I don&amp;rsquo;t need to, and I want to stay safe. This
combination of design philosophy and attitude have made me seriously
reconsider Buell as an option.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We&amp;rsquo;re not interested in a spec war with other bike makers and our
customers aren&amp;rsquo;t either. We&amp;rsquo;re trying to build the best sport bike,
not the best race bike, so our riders can have more fun in their
lives.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I like that&amp;hellip;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>If Patton was a coder...</title>
      <link>https://weblog.masukomi.org/2008/05/19/if-patton-was-a-coder/</link>
      <pubDate>Mon, 19 May 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/05/19/if-patton-was-a-coder/</guid>
      <description>&lt;p&gt;General Patton said that &amp;ldquo;A good plan violently executed now is better
than a perfect plan executed next week.&amp;rdquo; If he was a coder he might have
said &amp;ldquo;An automated test violently executed now is better than a perfect
test next week.&amp;rdquo;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The financial cost of motorcycle safety</title>
      <link>https://weblog.masukomi.org/2008/05/17/the-financial-cost-of-motorcycle-safety/</link>
      <pubDate>Sat, 17 May 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/05/17/the-financial-cost-of-motorcycle-safety/</guid>
      <description>&lt;p&gt;New motorcyclists tend to spend most, or all, of their pennies on their
new bike without considering, or perhaps realizing, just how much it&amp;rsquo;s
going to cost to protect themselves on the bike. Of course, having just
bought the bike, there&amp;rsquo;s no way they&amp;rsquo;re not going to ride it&amp;hellip;. While I
covered the items you&amp;rsquo;ll want to keep you safe in &amp;ldquo;&lt;a href=&#34;https://weblog.masukomi.org/2008/04/05/so-you-want-to-ride-a-motorcycle-and-not-die&#34;&gt;So you want to ride
a motorcycle&amp;hellip; and not
die&amp;rdquo;&lt;/a&gt;
I didn&amp;rsquo;t cover what it would cost. Afterwards I figured it would be
useful to put together a list of your basic safety items, and what you
can expect to pay for them, so that new riders can plan accordingly. I&amp;rsquo;m
mostly just going to be using low end prices, the cheapest you can get
away with and still be safe. You can easily pay many times more for most
of these items from different manufacturers.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Helmet: $100+&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can easily spend $700 on a helmet but, in general, price has
no impact on safety. Make sure it&amp;rsquo;s snug and comfortable and
full face (you do want to keep your nose and chin right?). More
money tends to buy you nice-to-have features, like inner
slide-down sun-shields, or integrated rear-view mirrors.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Riding suit: $250+&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One piece, two piece, it really doesn&amp;rsquo;t matter. Just make sure
it&amp;rsquo;s good material and has CE rated armor. If you shop around
you can find a pants and a jacket for about $150 each. But these
will rarely have hip or back armor at that price. The most
affordable solution I&amp;rsquo;ve found is the &lt;a href=&#34;https://weblog.masukomi.org/2008/05/03/fieldsheer-highland-ii-review&#34;&gt;Fieldsheer Highland
II&lt;/a&gt;
, but it should be combined with&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;High Visibility Vest: ~$70&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If your riding gear doesn&amp;rsquo;t have a high-viz top you should add
in a high vis vest. This is also required if you&amp;rsquo;re riding on a
US military base.&lt;/li&gt;
&lt;li&gt;Yes, a normal lightweight mesh construction worker&amp;rsquo;s visibility
vest will increase your visibility, but they don&amp;rsquo;t generally
hold up well under highway speed winds.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Back / Chest armor: $60-$300&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If your jacket / suit is lacking and you want to improve your
protection in this dept. you want to go with something by Knox.&lt;/li&gt;
&lt;li&gt;If your jacket / suit has back armor you can get away with just
the chest piece which will cost you about $60. Large busted
women are out of luck when it comes to chest armor. However, the
back armor that comes in most jackets / one-pieces is rarely as
good as a full back pieces from Knox.&lt;/li&gt;
&lt;li&gt;If you just want back armor Knox has a couple solutions ranging
in price from $160-$240&lt;/li&gt;
&lt;li&gt;If you want back and chest armor you&amp;rsquo;re looking at $250-$300 for
one of their &lt;a href=&#34;https://weblog.masukomi.org/2008/06/08/knox-gilet-air-review&#34;&gt;Gilets
(vests)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;They&amp;rsquo;ve also got shirts that would go under your current jacket
and have shoulder, elbow, chest, and back armor for about $270&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Gloves: $30+&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It&amp;rsquo;s not uncommon to find closeout sales on good gloves. What&amp;rsquo;s
tricky is finding a closeout that&amp;rsquo;s in your size. As with most
things you can pay much, much more. If you&amp;rsquo;re planning on riding
in cold weather too you&amp;rsquo;ll probably need two pairs and it&amp;rsquo;s
likely that one of them is going to cost you at least $80.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Boots: $100+&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can sometimes find good closeouts on these but in general
expect to pay $150-$200. These really aren&amp;rsquo;t optional. A friend
of mine, who is a good driver, struck a motorcyclist who ran a
stop-sign and totally tore up the riders foot (which was
unprotected). Unless you get boots that are specifically
designed to be waterproof you&amp;rsquo;ll need some waterproof booties
for them. It&amp;rsquo;s amazing just how fast your feet can get soaked in
a downpour.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tires: $400+ (if you need them)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Good tires tend to cost roughly $150 each. But, getting that
rear wheel off the bike to change it is going to add in an hour
or more worth of labor. So call it $400. If you&amp;rsquo;ve just gotten a
brand new bike you&amp;rsquo;re probably fine sticking with what it came
with.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Grand total (minus tires) is roughly $850 + shipping or sales tax. If
you&amp;rsquo;re buying a used bike you&amp;rsquo;ll probably need to add new tires to the
mix. Since you&amp;rsquo;re probably going to buy from a bunch of online retailers
we&amp;rsquo;re talking over $1k with shipping and without the tires. There are,
of course, many more things that you can add but these are, IMNSHO, the
basics we all should have.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a saying that boats are just holes in
the water that you throw money in to. I find that if you&amp;rsquo;re really into
motorcycles they can be too because everything is about 5x more
expensive than it is for an average car. What&amp;rsquo;s worse is that while most of the
mods you&amp;rsquo;d make to a car make no practical day-to-day difference, there
are a ton of mods you can make to a bike that do make a huge difference
in performance, handling, safety, or all of the above.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Fieldsheer Highland II Review</title>
      <link>https://weblog.masukomi.org/2008/05/03/fieldsheer-highland-ii-review/</link>
      <pubDate>Sat, 03 May 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/05/03/fieldsheer-highland-ii-review/</guid>
      <description>&lt;p&gt;The &lt;a href=&#34;http://www.fieldsheer.com/2008site/ff/productspage/highlandsuit.htm&#34;&gt;Fieldsheer Highland
II&lt;/a&gt;
is a surprisingly affordable and thoroughly armored one-piece motorcycle
suit. At $230 from &lt;a href=&#34;http://www.motorcyclecloseouts.com/&#34;&gt;Motorcycle
Closeouts&lt;/a&gt; it&amp;rsquo;s quite possibly the
most inexpensive way to get a full compliment of CE rated armor
including hip and back. Its nearest competitor is the $450 Olympia
Phantom (scroll for more).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2008/05/hlghlandsuit.png&#34; alt=&#34;Highland
II&#34;&gt;
&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2008/05/highland_exploded.png&#34; alt=&#34;Highland II
exploded&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;sizing-it-is-critical-with-a-one-piece-that-you-really-read-the&#34;&gt;Sizing It is critical, with a one piece, that you really read the&lt;/h2&gt;
&lt;p&gt;sizing chart. Don&amp;rsquo;t just go with whatever size you &amp;ldquo;normally&amp;rdquo; are. The
problem is, of course, that there&amp;rsquo;s no adjusting the distance between
the crotch and the shoulders of a one-piece. If you&amp;rsquo;re too tall in a two
piece the coat simply overlaps the pants less. In a one piece your have
heavy duty fabric being yanked into your groin. I&amp;rsquo;m 5&#39;9 1/2&amp;quot;, 140lbs,
and according to the size chart I was a medium, so that&amp;rsquo;s what I
ordered, and it fits perfectly.&lt;/p&gt;
&lt;p&gt;The waist is very roomy but easily, and comfortably, tightened via a strap on each side with velcro on it&amp;rsquo;s end.&lt;/p&gt;
&lt;h3 id=&#34;temperature--rain&#34;&gt;Temperature &amp;amp; Rain&lt;/h3&gt;
&lt;p&gt;An example of typical cool &amp;amp; wet weather riding is when I took it out on the highway in 47 degree weather with an average intensity rain storm for about forty minutes. Prior to going out I was concerned by the reports I&amp;rsquo;d read of people complaining that riding in heavy rain left them with a wet crotch. I took special care to do up the inner flap that covers the zipper and is designed to keep the weather out and had no wetness whatsoever. When I took it off at my destination I found pretty much what you&amp;rsquo;d expect. The outer shell was slightly damp, but the plastic coating on the inside of the fabric had done its job and kept any of that from getting to me. There&amp;rsquo;s a nice breathable mesh to keep the plastic from touching your skin. The marketing claims that the coating has holes large enough to let water vapor from your skin pass out, but is still small enough that drops of water won&amp;rsquo;t make it in. I can tell you from experience with a dog bed that I didn&amp;rsquo;t realize was similarly coated that putting this in the dryer will most likely destroy the waterproofing.&lt;/p&gt;
&lt;p&gt;As for temperature, I have to preface this by saying that I&amp;rsquo;m the type of person who keeps their house at 71 degrees. If it&amp;rsquo;s cooler than that I feel chilly and will typically put on a lightweight zip-up hoodie type thing. Wearing jeans, and a t-shirt under the Highland II with its insulated liner in, everything that was covered felt quite comfortable, whilst, for comparison, my exposed chin (still need to get the insert for my helmet) was not &lt;em&gt;quite&lt;/em&gt; cold enough to be painful (to give you an idea of how cold I&amp;rsquo;d be without the Highland&amp;rsquo;s protection). On the return trip at about 11 pm, with the exterior of the suit not 100% dried out, the rain had stopped and the roads had dried enough that I raised my top speed about 10-15mph and ended up feeling slightly cool on my upper arms, like maybe I should have worn a long sleeved t-shirt. See the note below about the silver mesh material.&lt;/p&gt;
&lt;p&gt;Inside, &lt;em&gt;with the insulated liner in&lt;/em&gt;, this thing is a sauna. Once I put it on I couldn&amp;rsquo;t wait to get outside in the rain I was so hot. The liner is thin, but surprisingly effective. When the temperature starts to hover around freezing you&amp;rsquo;re going to
want to add another layer underneath. I typically add a sweatshirt and something to keep my neck warm. If I was going on a ride for more than 30 minutes I&amp;rsquo;d probably add something thicker, or maybe some wool. You will, of course, need hand-warmers of some sort at that temperature. Heated grips are the most awesome things ever. But really, how many of you are actually going to ride your bikes in sub-freezing weather?&lt;/p&gt;
&lt;p&gt;The wettest I&amp;rsquo;ve had this is was an absolute downpour. Not &lt;em&gt;quite&lt;/em&gt; as bad as they get down in SC where all traffic stops because even cars can&amp;rsquo;t see past their front bumper, but within a couple minutes there was half an inch of water or more over everything but the crown of the road. By this point doing up the zipper flaps before starting my ride had become habit
and the only things that got wet were my feet, the bottom edge of my jeans (over my boots), and the cuffs. It felt a lot like when you put on a latex glove and stick it in water. Your senses tell you you&amp;rsquo;re getting wet, but you really aren&amp;rsquo;t.&lt;/p&gt;
&lt;h3 id=&#34;hot-weather&#34;&gt;Hot weather&lt;/h3&gt;
&lt;p&gt;I&amp;rsquo;ve seen a number of people posting on message boards that this suit was too hot in the summer, but I&amp;rsquo;ve ridden in 90+ degrees (officially it was 91 but the thermometer dangling on my zipper said 98) with 48% humidity, wearing jeans and a t-shirt underneath (without the insulated liner, obviously), and the results were better than expected. I need to preface this by saying that I wear an &lt;a href=&#34;http://www.olympiamotosports.com/nova/nova.htm&#34;&gt;Olympia Nova high-viz vest&lt;/a&gt; over it which, unfortunately, blocks wind from pushing directly into the chest vents (see below) on the Highland II. By keeping the Highland&amp;rsquo;s zipper open about 6 inches while on the highway I found myself warm but not uncomfortably so. My back did sweat under the armor but I didn&amp;rsquo;t sweat anywhere else. At one point I actually had it open farther but zipped it up more to keep wind from puffing up my sleeves and didn&amp;rsquo;t have any worries about being too hot when I did. I&amp;rsquo;ve got to think that while the Olympia vest was keeping air from getting directly to the vents it was also reflecting a lot of the heat that would have otherwise been absorbed by the black of the suit.&lt;/p&gt;
&lt;p&gt;However, while I&amp;rsquo;ll take highway trips in the summer in it, if you&amp;rsquo;re going to be in stop and go traffic on a hot day this suit will have you boiling.&lt;/p&gt;
&lt;p&gt;Knowing that up front, my only real complaint, as far as temperature is concerned, is the porous silver material on the upper arms. The problem is that there is so little of it that it provides no noticeable cooling on hot days and it&amp;rsquo;s so porous that on cool days your biceps end up getting chilled, while the rest of you is perfect. I&amp;rsquo;d hate to have to put in the lining just
to warm my biceps because then I&amp;rsquo;d probably overheat. I&amp;rsquo;ve seen a
FirstGear jacket made entirely from something similar and I think it
would probably be great when used all over to keep you cooler, but I
think the Highland II would be better off without it. It&amp;rsquo;s not effective
in the heat and &lt;em&gt;too&lt;/em&gt; effective in the cold.&lt;/p&gt;
&lt;h3 id=&#34;ventilation&#34;&gt;Ventilation&lt;/h3&gt;
&lt;p&gt;The chest
vents are essentially as wide as they could possibly be. They are
horizontal zippers that go all the way from the center zipper out across
the chest and down the arm a few inches. They&amp;rsquo;ve got big long fabric
tabs with a thin foam insert to keep them out straight, and make them
easy to pull open or closed with gloves. I would like to see a hard
plastic insert in, or as, the tab because I just can&amp;rsquo;t feel them with
gloves and have to look to find them, but they&amp;rsquo;re high enough up, as
they should be, that it can be awkward to see while wearing a helmet.
Also, there&amp;rsquo;s no cinch or velcro or anything to hold them open wide like
the Olympia Phantom.&lt;/p&gt;
&lt;p&gt;The insulating liner, unsurprisingly, blocks the
openings. And I think this is acceptable. If you&amp;rsquo;re wearing a thermal
liner you probably want to stay warm. I opened them up even though I had
the liner in, just too see if they&amp;rsquo;d have an effect and it did help cool
things slightly. I would prefer it if there was maybe a slit in the
liner to let &lt;em&gt;some&lt;/em&gt; of the air in to make this more useful on days that
straddle the line between cool and warm. But, this is a really tricky
thing for anyone to get right, and I&amp;rsquo;m not entirely sure how it&amp;rsquo;s
addressed by other manufacturers.&lt;/p&gt;
&lt;p&gt;Unfortunately the chest vents are the
only vents on the front of this. There is one wide vent across the
shoulder blades that&amp;rsquo;s so well hidden I didn&amp;rsquo;t even know I had it until
another person with the suit pointed it out. One problem, that most
jackets and suits have, is that high-viz vests will block much, but not
all, of your only source of ventilation. Another, is that, without any
arm vents, if you open the main zipper too far down your chest, and have
the wrists done up around your gloves, the arms will puff up and provide
a good amount of wind resistance which tires out your arms. If I could
add one thing it would be some sort of vent across the back. If it came
in a high-viz color I wouldn&amp;rsquo;t need the vest and wouldn&amp;rsquo;t worry about
flocked air.&lt;/p&gt;
&lt;p&gt;In 90+ sunny weather my legs (with jeans) were warm, like
putting on jeans straight out of the dryer, which makes me think some
leg vents might be beneficial, but I can&amp;rsquo;t think of a one-piece that
I&amp;rsquo;ve seen that has any, so I don&amp;rsquo;t count this as a failing of the
Highland II at all.&lt;/p&gt;
&lt;h3 id=&#34;armor&#34;&gt;Armor&lt;/h3&gt;
&lt;p&gt;The armor is what convinced me to buy
this. I didn&amp;rsquo;t find anything else in this price range (one piece or
buying top and bottom separately) that had CE rated hip and back armor.
I have seen a couple comments about the hip armor being uncomfortable
but&lt;/p&gt;
&lt;p&gt;I had absolutely no problems with that. It&amp;rsquo;s a bit weird feeling at
first, but after a few minutes I just forgot it was there. I would note
that you have to be careful to make sure the hip armor doesn&amp;rsquo;t get
folded over when you put the suit on. The velcro holding it on only goes
down the center and there isn&amp;rsquo;t any at the front or back of the hip
armor which I think is a mistake. I had to go to the Registry of Motor
Vehicles, and while there I didn&amp;rsquo;t feel like taking the thing completely
off because carrying it around would have been a pain, so I just slipped
out of the top half so that I wouldn&amp;rsquo;t melt (I had the insulated lining
in). That&amp;rsquo;s when I discovered that the back piece is tall enough that
you actually have to fold the suit down at the waist or the armor will
make the top of the suit poke out from your back. This is actually a
good thing. It means there&amp;rsquo;s enough in there to make a difference (41
cm). And folding it down is a non-issue once you realize you have to.
It&amp;rsquo;s not like wearing a Knox Contour back protector but it&amp;rsquo;s far better
than most tops seem to offer. It does not have any chest armor but
Motoport is the only company I&amp;rsquo;ve come across that has suits with built
in chest armor and I could buy four of this suit for one of theirs.&lt;/p&gt;
&lt;p&gt;[Update] After more experience with better suits I&amp;rsquo;ve come to the
conclusion that suit does a poor job of holding the elbow and knee
armor in place, and I would not be surprised if they were to shift out
of the way during a crash.&lt;/p&gt;
&lt;h3 id=&#34;pockets&#34;&gt;Pockets&lt;/h3&gt;
&lt;p&gt;The thigh pockets are nice and deep and are done so that
each one is actually two pockets in the same location. One is accessed
from the top via velcro and one from the side via a zipper. The pocket
was deep enough, and the velcro strong enough, that I think I&amp;rsquo;d have
trouble getting anything out of it while moving (toll money maybe).
There&amp;rsquo;s a tiny pocket just above the left wrist that makes no sense to
me. Maybe it&amp;rsquo;s for change, but it would be really difficult to access at
a toll booth. I think it might be useful to keep quarters in for meters.
There are two internal breast pockets. The one on the left is
surprisingly deep. The right one is smaller but still big enough for a
cell phone and wallet with room to spare . The external pocket on the
right breast has a vertical zipper and could hold a cell phone or camera
or something like that. The left breast has another dual pocket setup
about six inches square. There&amp;rsquo;s also a zipper at pants-pocket level
that would allow access to your pants pockets from the outside but the
hip armor gets in the way. All of the outer pockets that open at the top
are designed so that when you velcro them closed the top of the pocket
actually folds over like a brown paper lunch bag, so as to keep out the
rain.&lt;/p&gt;
&lt;p&gt;Overall I like the pockets but wish there was one I felt I could
access more easily, with gloves, for toll booths.&lt;/p&gt;
&lt;p&gt;As an aside, I realize
it&amp;rsquo;s nit-picky but I&amp;rsquo;d like to see a zipper in front of the hip armor so
that I could at least access the front pockets in my jeans and maybe
squirm my hand back to the back pocket. I tend to throw my keys in a
back pocket when I&amp;rsquo;m getting things together, and if I forget to take
them out before I put on the suit I have to undo velcro and zipper and
squirm an arm out of the top then reach back in to get them, then
reverse the process. Also, I&amp;rsquo;d love it if it had a back pocket like the
Olympia Phantom to shove a CamelBak into.&lt;/p&gt;
&lt;h3 id=&#34;velcro--zippers&#34;&gt;Velcro &amp;amp; Zippers&lt;/h3&gt;
&lt;p&gt;One of the biggest complaints I&amp;rsquo;ve seen about the Olympia Phantom is that
there&amp;rsquo;s so much velcro on it that it constantly gets stuck to itself
when you take it off and you have to un-stick it all when you want to
use the suit again. I haven&amp;rsquo;t had that problem at all on the Highland
II. They&amp;rsquo;ve made judicious use of velcro everywhere. There are two
horizontal velcro closures that go around the top of each boot and
undoing them makes it really easy to get your boots on and off, or lace
them up, or whatever. However, the positioning of the boot velcro leaves
something to be desired. The horizontal closures point directly inward,
and, if you tend to lift your leg straight up from the ground, has a
tendency to catch on the footpegs. I had to train myself to swing my
legs forwards and up so as to avoid this. These, I feel, should be moved
to the back of the leg.&lt;/p&gt;
&lt;p&gt;The zippers all feel well made and are nice and
fat. the main zipper goes down the chest and down the inseam of the left
leg. There&amp;rsquo;s a matching zipper from the bottom of the right leg up the
inseam to about the crotch. Pocket zippers are easy to use.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve got no
complaints about its closure system at all.&lt;/p&gt;
&lt;h3 id=&#34;getting-it-on-and-taking-it-off&#34;&gt;Getting it on and taking it off&lt;/h3&gt;
&lt;p&gt;I find that it&amp;rsquo;s really easy to get on and off as long as
you&amp;rsquo;re not wearing your boots. The problem with this is that it takes an
annoyingly long time to undo your shoes, take them off and then put them
on again and do them up afterwards. Yes, we&amp;rsquo;re talking maybe a minute
tops (for dealing with the shoes), but when all your fellow just threw
their coats back on and headed back out it kind-of sucks. Actually
donning the garment takes about 30 seconds.&lt;/p&gt;
&lt;p&gt;You &lt;em&gt;could&lt;/em&gt; unzip the legs
from the heel to the crotch and then put your booted feet through but I
find that the lining catches on my soles and I end up looking like an
idiot standing on one foot while gently wiggling the other one in the
air because the inner mesh isn&amp;rsquo;t designed to withstand much force. Even
if I didn&amp;rsquo;t (look like an idiot, or have trouble with the lining
catching), I wouldn&amp;rsquo;t want to do this if my shoes were anything but
perfectly dry for fear of wiping whatever might be on them on the inside
of the suit. The Olympia Phantom, on the other hand, &lt;a href=&#34;http://www.youtube.com/watch?v=jXYOxz1Vrrs&#34;&gt;seems to be
trivial to put boots
through&lt;/a&gt;, of course it has
the downside of dealing with the velcro that constantly sticks to
itself.&lt;/p&gt;
&lt;h3 id=&#34;visibility&#34;&gt;Visibility&lt;/h3&gt;
&lt;p&gt;The thing that left me going back and forth
between this suit and the Olypmia Phantom was that while this suit had
more armor in case of a crash, the Olypmia had an incredible neon green
that would help prevent the need for armor in the first place by making
riders more visible. The Highland II has a thin
&lt;a href=&#34;http://en.wikipedia.org/wiki/Retroreflective&#34;&gt;retroreflective&lt;/a&gt; strip
across the back and the top of the chest vents, a wide vertical
retroreflective strip that comes up about six inches from the leg
bottom, and retroreflective piping around the edge of the elbow and
shoulder armor. The silver accents on the arms and left breast pocket
looks quite reflective in person, but isn&amp;rsquo;t notably more reflective at
night than your average gray shirt.&lt;/p&gt;
&lt;p&gt;I understand that the market demands
cool looking things not visible things, and that the Olympia Phantom in
neon green is not particularly stylish looking. But, the point of buying
safety gear is to &lt;em&gt;stay safe&lt;/em&gt; not win a fashion pageant and I would much
rather look dorky on my bike and be seen, and avoided, by everyone than
be &amp;ldquo;cool&amp;rdquo; and unnoticed by cagers.&lt;/p&gt;
&lt;p&gt;I think Fieldsheer has done a really
poor job of making the Highland II visible at night. Yes, it could be
worse, but only barely. &lt;a href=&#34;http://www.revitusa.com/&#34;&gt;Rev&amp;rsquo;It&lt;/a&gt; has show that
you can make stylish looking technical garments from lighter, more
visible colors (check out the Cayenne Pro jacket), and the Olympia
phantom is blazingly visible, if not stylish. If we are to assume, that
for economic reasons, they&amp;rsquo;re only going to put it out in one color, and
feel that black would sell best there are still a number of things I
would improve: The retroreflective strip on the back needs to be at
least twice as tall. I&amp;rsquo;d add retroreflective strips down the outside of
each leg and arm to make it visible from the side. While I&amp;rsquo;m thankful
that there&amp;rsquo;s anything on the leg at all, you want the reflective stuff
to be up high, directly in a drivers line of sight. Down by my feet
misses the point somewhat. The retroreflective piping around the
shoulder and elbow armor looks neat, and I&amp;rsquo;m glad it&amp;rsquo;s there, but I am
totally unconvinced that it would help add to my safety in any
measurable way.&lt;/p&gt;
&lt;p&gt;Comfort / fit&lt;/p&gt;
&lt;p&gt;No complaints at all. The sizing
chart worked for me. There&amp;rsquo;s no pulling at the crotch or neck, the armor
seems to fall in just about the right place. The neck closure is
adjustable and fits comfortably. The hip armor wasn&amp;rsquo;t uncomfortable at
all, and quickly forgotten about (as it should be). People who are a
little plump in the midriff should be fine and those who are closer to
their target weight should be able to cinch the belt around the middle
to get it just right.&lt;/p&gt;
&lt;h3 id=&#34;maintenance&#34;&gt;Maintenance&lt;/h3&gt;
&lt;p&gt;The top half of the liner is held
in with one long zipper, like most coats. The lower half is velcroed in.
The top is, unsurprisingly easy to remove. The bottom is surprisingly
easy. The zippers running all the way down each leg make it very easy to
open up and get to.&lt;/p&gt;
&lt;p&gt;The booklet that comes with it only says how to
clean the armor inserts (wet cloth) but doesn&amp;rsquo;t mention how to clean the
suit itself, which is just stupid. My guess is that this is a hand wash
only, or maybe
&lt;a href=&#34;http://www.nikwax.com/en-gb/products/productdetail.php?productid=4&#34;&gt;Nikwax&lt;/a&gt;
in the gentle cycle. Avoid the dryer at all costs. I believe that
sticking it in a dryer will ruin your waterproofing.&lt;/p&gt;
&lt;h3 id=&#34;materials&#34;&gt;Materials&lt;/h3&gt;
&lt;p&gt;The majority of the Highland II is 600 denier Carbolex which is a polyester
material with an abrasion resistance roughly double that of 500 denier
Cordura (nylon based). If you want great abrasion resistance / tear
strength that won&amp;rsquo;t melt, you get Kevlar, and that costs the
manufacturer something like $50 a yard, so it&amp;rsquo;s going to cost you a very
pretty penny. Fortunately the shoulders, elbows, knees, and shins are
also protected with a &amp;ldquo;ballistic overlay&amp;rdquo;. Ballistic Nylon is 1050
denier nylon and was originally designed to stop flying shrapnel from
nearby bullet or artillery hits, but not the bullet itself. These days
it seems to mostly mean that it&amp;rsquo;s really heavy duty. What Fieldsheer
doesn&amp;rsquo;t mention in the marketing is that the ass is also covered. Seeing
as they took the time to put a special butt covering, I think it would
be great if they&amp;rsquo;d have added a piece of 1/8&amp;quot; dense foam underneath it
for extra cushioning.&lt;/p&gt;
&lt;p&gt;As tear resistance and abrasion resistance &lt;em&gt;seem&lt;/em&gt;
to go hand in hand I would &lt;em&gt;guess&lt;/em&gt; that the tear strength of 500 denier
Carbolex is roughly 45 lbs. Jeans are 4.5, 620 denier Cordura is 35,
competition grade leather is 80-110, and Kevlar is about 1260. My
personal belief, based on what I&amp;rsquo;ve read, is that the abrasion
resistance of Carbolex and Cordura is high enough to withstand the vast
majority of crashes and that most of your high impact places are also
covered by armor and the &amp;ldquo;ballistic overlay&amp;rdquo; so, until I can afford a
thousand dollars or more for kevlar one piece, I&amp;rsquo;m ok with these
materials.&lt;/p&gt;
&lt;h3 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Overall I feel this is an excellent value for
the money, but I&amp;rsquo;m not thrilled with the idea of using this without a
nice high visibility vest over it, and mid-summer it&amp;rsquo;ll be toasty in
stop and go traffic. I am thrilled with the fact that someone is
offering a suit that also has CE rated hip and back armor at such an
affordable price. Fieldsheer deserves massive kudos for this, because it
removes any excuse for people not wearing proper armor. If money is
tight but you&amp;rsquo;re concerned about getting some real protection then I
would highly recommend the Fieldsheer Highland II. If you can spend $450
you might want to go with the Olypmia Phantom because the Phantom has
excellent reviews when it comes to waterproofing and better reviews for
warm weather (but worse for cold), although the phantom appears to be
more of a pain to get in to.&lt;/p&gt;
&lt;p&gt;Since I live in new england, and ride year
round (as long as the roads are clear) the majority of the time I&amp;rsquo;m on
my bike is not &amp;ldquo;warm weather&amp;rdquo;, I&amp;rsquo;m not too worried if it is a little
toasty. My everyday wear is now the Highland II, a &lt;a href=&#34;https://weblog.masukomi.org/2008/06/08/knox-gilet-air-review&#34; title=&#34;A review&#34;&gt;Knox Gilet
Air&lt;/a&gt;
underneath it (in the winter) for the improved back protection, and an
Olympia Nova High-viz ves.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How to create a Test Suite in Perl&#39;s Test::Unit v0.25</title>
      <link>https://weblog.masukomi.org/2008/04/09/how-to-create-a-test-suite-in-perls-testunit-v025/</link>
      <pubDate>Wed, 09 Apr 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/04/09/how-to-create-a-test-suite-in-perls-testunit-v025/</guid>
      <description>&lt;p&gt;If your Test Case is a package whose goal is to test all aspects of a
particular class then a Test Suite is something which kicks off a
collection of related Test Cases. As with most things in Perl&amp;rsquo;s Test::Unit it&amp;rsquo;s
really easy to do and also terribly documented. So, without further
ado&amp;hellip; You need something to kick off all your tests:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-perl&#34; data-lang=&#34;perl&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;Test::Unit::HarnessUnit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;My::Test::Suite::Package&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;my&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$testrunner&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;Test::Unit::HarnessUnit&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;$testrunner&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;start&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;My::Test::Suite::Package&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next you need the test suite it&amp;rsquo;s going to kick off:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-perl&#34; data-lang=&#34;perl&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;package&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;My::Test::Suite::Package&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;base&lt;/span&gt; &lt;span class=&#34;sx&#34;&gt;qw/Test::Unit::TestSuite/&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# returns an array of the fully qualified names of the TestCase&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# based classes you wish to run.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;sub&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;include_tests&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#39;Some::Test::Case&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;s&#34;&gt;&amp;#39;Some::Test::Case2&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;err&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;Some::Test::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Case3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That&amp;rsquo;s it. Happy testing.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>So you want to ride a motorcycle... and not die</title>
      <link>https://weblog.masukomi.org/2008/04/05/so-you-want-to-ride-a-motorcycle-and-not-die/</link>
      <pubDate>Sat, 05 Apr 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/04/05/so-you-want-to-ride-a-motorcycle-and-not-die/</guid>
      <description>&lt;p&gt;Lets be totally clear here. The statistics say that your are roughly as
likely to get in an accident while driving a motorcycle as you are while
driving a car. The obvious difference being that a car has a safety
cage, and a motorcycle has, well&amp;hellip; nothing. So, if you have a brain,
you&amp;rsquo;re going to want to take steps to compensate for that missing safety
cage. There&amp;rsquo;s no guarantee any of this will keep you from dying but
it&amp;rsquo;ll seriously increase your chances of survival. For some quick &amp;amp; easy to digest stats on motorcycle safety check out the &lt;a href=&#34;http://www.gearupproject.org&#34;&gt;Gear Up!  Project&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;DISCLAIMER: I&amp;rsquo;m not a racer. I&amp;rsquo;m not a manufacturer or a scientist. I am someone who&amp;rsquo;s ridden tens of thousands of miles over a variety of terrains in 14 (and counting) countries. Everything here is purely my opinion based on the research I&amp;rsquo;ve done. I&amp;rsquo;m compiling it here in hopes that it&amp;rsquo;ll save you from having to do quite as much digging as I&amp;rsquo;ve had to do. Before we get started I&amp;rsquo;d like to point you to &lt;a href=&#34;http://www.webbikeworld.com/&#34;&gt;WebBikeWorld.com&lt;/a&gt; It&amp;rsquo;s filled with tons
of useful information and reviews and something you should definitely bookmark.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#visibility&#34;&gt;Visibility&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#armor&#34;&gt;Armor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#materials&#34;&gt;Garment Materials&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#helmets&#34;&gt;Helmets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#boots&#34;&gt;Boots&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#gloves&#34;&gt;Gloves&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#tires&#34;&gt;Tires&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#modulators&#34;&gt;Headlight Modulators&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#ears&#34;&gt;Speakers / Earplugs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#unexpected&#34;&gt;Things you wouldn&#39;t expect&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#conclusion&#34;&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name=&#34;visibility&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;visibility&#34;&gt;Visibility&lt;/h3&gt;
&lt;p&gt;The majority of this article is devoted to things that will keep you safer in a crash. But, wouldn&amp;rsquo;t it be better to avoid the crash in the first place? &lt;a href=&#34;http://bmj.bmjjournals.com/cgi/content/abstract/328/7444/857&#34;&gt;In 2004 a study was published that compared rider conspicuity and crash related injuries&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;After adjustment for potential confounders, &lt;em&gt;&lt;strong&gt;drivers wearing any
reflective or fluorescent clothing had a 37% lower risk &amp;hellip; than other
drivers&lt;/strong&gt;&lt;/em&gt;. Compared with wearing a black helmet, &lt;em&gt;&lt;strong&gt;use of a white
helmet was associated with a 24% lower risk&lt;/strong&gt;&lt;/em&gt;&amp;hellip; Self reported light
coloured helmet versus dark coloured helmet was associated with a 19%
lower risk.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I don&amp;rsquo;t know about other countries but in the U.S. riding motorcycles is so consistently associated with looking cool that riders not only &lt;em&gt;prefer&lt;/em&gt; dark colors (primarily black) in their gear, they practically demand it of manufacturers. And yet, one of the most consistent &lt;a href=&#34;http://www.bestbeginnermotorcycles.com/8-great-beginner-riding-habits&#34;&gt;pieces of advice&lt;/a&gt;
you hear is to &amp;ldquo;&lt;em&gt;&lt;strong&gt;assume you are invisible&lt;/strong&gt;&lt;/em&gt;.&amp;rdquo; With just a little bit
of searching you&amp;rsquo;ll find tons of posts in blogs and message boards of
motorcyclists who have made unquestionable eye contact with the driver
of a car only to have that driver continue to head straight for them as
if they didn&amp;rsquo;t exist, or riders who have been clipped by mirrors of cars
passing too close.&lt;/p&gt;
&lt;p&gt;We need to take every measure possible to stand out. To not only be seen, but to snap people out of their no-think patterns. While I heartily agree that most of that black gear does look cool, you have to ask your self which looks cooler: &lt;a href=&#34;http://www.revzilla.com/product/olympia-phantom-one-piece-suit&#34; title=&#34;Can&#39;t be missed one-piece&#34;&gt;high&lt;/a&gt; &lt;a href=&#34;http://www.olympiamotosports.com/nova/nova.htm&#34; title=&#34;Olympia High-vis vest&#34;&gt;visibility&lt;/a&gt; &lt;a href=&#34;http://www.rideicon.com/product_details.jsp?category=1339&amp;amp;id=5837&#34; title=&#34;Icon High-viz vest&#34;&gt;gear&lt;/a&gt;, or &lt;a href=&#34;http://www.speedfreakinc.com/safety/extreme_roadrash_cause_effect_and_lesson_learned.html&#34;&gt;skin grafts over 55% of your
body&lt;/a&gt;.
For me the choice is obvious. Get the high-viz gear, a light colored
bike, add some &lt;a href=&#34;http://www.reflectivedecals.com/moto.htm&#34;&gt;retro-reflective stickers&lt;/a&gt; to your helmet (look for 3M Scotchlite stickers at any auto parts store), ignore the advice of &lt;a href=&#34;http://www.urbandictionary.com/define.php?term=squid&#34; title=&#34;definition link&#34;&gt;squids&lt;/a&gt;, and ride like you&amp;rsquo;re invisible.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re mumbling something to yourself about there being no way you&amp;rsquo;ll go out looking like a dork, don&amp;rsquo;t worry, there are manufacturer&amp;rsquo;s like &lt;a href=&#34;http://www.revit.eu/&#34;&gt;Rev-It&lt;/a&gt; who make some light colored gear that looks damn good. But, you&amp;rsquo;re going to pay.&lt;/p&gt;
&lt;p&gt;In addition to visibility there&amp;rsquo;s &lt;a href=&#34;http://motoblag.com/blag/?p=104&#34;&gt;a good post at Motoblag&lt;/a&gt; about the other &amp;ldquo;layers of protection&amp;rdquo; that help keep you from ever getting into an accident.&lt;/p&gt;
&lt;p&gt;&lt;a name=&#34;armor&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;armor&#34;&gt;Armor&lt;/h3&gt;
&lt;p&gt;Armor is, of course, critical. If the armor is worth buying
it&amp;rsquo;s CE rated. There&amp;rsquo;s CE level 1, 2, and 3. Most things are Level one
rated which is a hell of a lot better than nothing but you really want
to shoot for two because it transmits one half as much energy to you
upon impact. Level three is for racing and I have yet to encounter any
consumer level stuff that&amp;rsquo;s rated level 3. As with most things
&lt;a href=&#34;http://en.wikipedia.org/wiki/Motorcycle_armor&#34;&gt;Wikepedia has a nice article that covers the basics&lt;/a&gt;. Ratings refer to kilonewtons, and in case you don&amp;rsquo;t know, &amp;ldquo;A kiloNewton (kN) is a measure of force, rather than a measure of static weight or mass. Force is calculated by multiplying mass by acceleration. One kiloNewton equals approximately 100kg when the accelerating force of gravity is acting on it.&amp;rdquo;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Armor can be placed into one of three categories with level 1 armor
being the least protective and level 3 being the most protective.
Level 1 armor is rated at 50
&lt;a href=&#34;http://en.wikipedia.org/wiki/Joule&#34; title=&#34;Joule&#34;&gt;joules&lt;/a&gt;, level 2 at 75
joules, and level 3 at 100 joules. In order to achieve a rating armor
must be able to absorb that amount of energy in an impact and transmit
less than 35 &lt;a href=&#34;http://en.wikipedia.org/wiki/Newton&#34; title=&#34;Newton&#34;&gt;kN&lt;/a&gt; of
force. &amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Padding is not armor. There are a lot of motorcycle jackets out there
with a little foam padding down over your spine. This is totally
useless. It doesn&amp;rsquo;t hurt to have, but it doesn&amp;rsquo;t help either.&lt;/p&gt;
&lt;p&gt;The next question is &amp;ldquo;what to armor?&amp;rdquo; The answer is, absolutely everything you
can. Jackets will typically have shoulder, elbow, and fore-arm armor.
Which leaves your spine and chest unprotected&amp;hellip; pfft, who needs a spine
or internal organs! So, you&amp;rsquo;re going to need to compensate. There are
some companies that make form fitting, comfortable spine and chest
protectors that won&amp;rsquo;t leave you looking like a football player.&lt;/p&gt;
&lt;p&gt;Knox is the brand you&amp;rsquo;ll see pretty much everywhere. Here&amp;rsquo;s &lt;a href=&#34;http://www.youtube.com/watch?v=uEoxCMPOOEs&#34;&gt;a video showing
some Knox back and chest armor&lt;/a&gt;. Pants will typically have knee and shin protection but no hip. The only separate hip armor I&amp;rsquo;ve seen has been, essentially, armor shoved into pockets on bicycle shorts (Knox makes this too), and while I can envision putting on such a garment when suiting up for a motorcycle race, it&amp;rsquo;s unrealistic to expect anyone to don such a thing for their daily commute to work, or regular weekend rides. You can get neck braces, and they&amp;rsquo;re a great idea, but I&amp;rsquo;ve honestly never seen anyone use one who wasn&amp;rsquo;t in the middle of a race.&lt;/p&gt;
&lt;p&gt;One thing to note about back armor is that most motorcycle related spinal injuries are a result of twisting the spine. Back armor will not help in this situation, However, people have been throw off and landed flat on their back, and having some nice impact absorbing armor along your spinal column is definitely going to help in falls like that.&lt;/p&gt;
&lt;p&gt;&lt;a name=&#34;materials&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;garment-materials&#34;&gt;Garment Materials&lt;/h3&gt;
&lt;p&gt;Here it&amp;rsquo;s pretty simple. Your three best choices are Cordura/Dynatech, Kevlar, and &lt;a href=&#34;http://www.superfabric.com/&#34;&gt;SuperFabric&lt;/a&gt;. Cordura (like all cloth)
comes in various Deniers which has a variety of related definitions
which essentially mean how dense the fabric is. The higher the number
the better. I&amp;rsquo;ve seen garments with denier&amp;rsquo;s of 2000. Denim Jeans and 70
denier nylon require 4.5 pounds of force to tear. That&amp;rsquo;s it. That&amp;rsquo;s
nothing. 620 denier takes 35 pounds which still doesn&amp;rsquo;t sound like a lot
to me when you crash at highway speed. 1000 denier is 110 pounds which
is getting better and is about the same as really good, new leather, but
it&amp;rsquo;s still not much when you compare it to good kevlar which requires
&lt;em&gt;over 1,200 pounds to tear&lt;/em&gt; and SuperFabric which claims to have 14
times the abrasion resistance of kevlar.&lt;/p&gt;
&lt;p&gt;There aren&amp;rsquo;t many manufacturers that offer Kevlar, and right now &lt;a href=&#34;http://www.revit.eu/&#34;&gt;RevIt&lt;/a&gt; is the only company I&amp;rsquo;ve heard of that&amp;rsquo;s using SuperFabric. It should be noted that SuperFabric doesn&amp;rsquo;t appear to be a fabric so much as it is a means of welding microscopic pieces of ceramic onto other fabrics to imbue them with the the incredible heat resistance and abrasion properties of ceramics.&lt;/p&gt;
&lt;p&gt;What&amp;rsquo;s important about this is that the harder it is for your suit to tear the less likely the road (or whatever else you&amp;rsquo;re rolling over) will have a chance to scrape away flesh.&lt;/p&gt;
&lt;p&gt;There is, however, a subtle issue that doesn&amp;rsquo;t get nearly enough talk-time. Melting. The friction of your weight being shoved across asphalt at 60+ mph is severe and  uickly converts into a lot of heat. What&amp;rsquo;s worse than road rash? Road rash with plastic melted into it. So, do your research and avoid suits that are made from polyester. On a related note I&amp;rsquo;ve read anecdotal evidence that if you&amp;rsquo;ve got something like good Kevlar, that won&amp;rsquo;t melt, the heat will still be there and possibly melt any polyester clothing you&amp;rsquo;re wearing &lt;em&gt;under&lt;/em&gt; it.&lt;/p&gt;
&lt;p&gt;Leather is, always a popular choice, and has really good abrasion resistance (not Kevlar good but&amp;hellip;), and obviously won&amp;rsquo;t melt, but not all leathers are created equal. Some leather is supple and soft and feels oh so comfy, and as a result does a crappy job of protecting you. Also, leather alone only provides abrasion resistance. It won&amp;rsquo;t keep you from breaking bones.&lt;/p&gt;
&lt;p&gt;Racing leather is good (or they wouldn&amp;rsquo;t race in it) but the more you use it and break it it becomes softer and more flexible which decreases its ability to protect you. But who wants to put on a skin tight leather one-piece to go to the store? No-one I can think of. There is some good gear out there made from leather, that
can be easily thrown on over normal pants, and has good armor. Don&amp;rsquo;t
forget the fact that most leather is just plain hot in the summer. Also,
leather absorbs water, which makes it heavier, and more uncomfortable.
No, opening your jacket is not a viable solution to the heat problem.
This exposes your chest and means that the coat could get pulled down
your arm and off the shoulder, which would, in turn, move the armor away
from your elbow and forearm and spine (if it had spine protection to
begin with).&lt;/p&gt;
&lt;p&gt;Chaps will help with abrasion on your legs but personally, if I had to choose between having my butt scraped off or my legs I&amp;rsquo;d choose my legs. I appreciate the ability to sit down. Anecdotally I have heard comments from doctors about having treated a number of riders with missing butt skin as a result of chaps.&lt;/p&gt;
&lt;p&gt;Denim&amp;hellip; If it wasn&amp;rsquo;t obvious from the numbers above denim, anywhere on you body, is brain-dead stupid and offers you no real protection whatsoever. You may as well be naked. Yes some manufacturers make denim jackets with good armor, but what&amp;rsquo;s the point if the material holding the armor is so easy to tear that the armor could be ripped out of it in an instant? While this may be unlikely (I doubt anyone&amp;rsquo;s tested it), I&amp;rsquo;m not willing to risk it.&lt;/p&gt;
&lt;p&gt;I haven&amp;rsquo;t been able to track down any specs on the tear resistance of &amp;ldquo;waxed cotton&amp;rdquo;. But, here are some things to consider. The friction that arises during a crash is instantly converted into a lot of heat. Wax melts very easily, and at temperatures that can instantly melt 500 denier cordura it&amp;rsquo;s relatively safe to assume that the wax is going to melt away and leave you wearing what is essentially thick jeans material. However, it&amp;rsquo;s still cotton and cotton was never designed for high tear resistance. I&amp;rsquo;d expect the tear resistance to be slightly higher than jeans, but not enough to make any realistic difference when dealing with the forces at play.&lt;/p&gt;
&lt;p&gt;Regardless of what material you choose it&amp;rsquo;s important that you get something that has lots of good venting so that you won&amp;rsquo;t be tempted to leave it at home on those hot days. Color also plays a factor here. Dark colors are not only harder to see but also absorb heat more and make you hotter. If you live in a colder part of the world you may want to consider getting separate winter and summer gear, or gear with a separate rain liner and thermal liner.  See [Thermal Regulation][] for additional details.&lt;/p&gt;
&lt;p&gt;&lt;a name=&#34;helmets&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;helmets&#34;&gt;Helmets&lt;/h3&gt;
&lt;p&gt;When it comes to helmets there are three certifications: DOT (required
to use in the US), Snell (independent standards body), and the ECE
22-05. There&amp;rsquo;s a great deal of controversy over the validity of Snell
certification for motorcycle. &lt;a href=&#34;http://www.motorcyclistonline.com/gearbox/motorcycle_helmet_review/index.html&#34;&gt;Motorcyclist Online does a good job of
explaining the problem&lt;/a&gt; with a series of recent tests they did.&lt;/p&gt;
&lt;p&gt;The end result is that if you&amp;rsquo;re concerned about the number of Gs that will be passed on to your brain during a crash you anything DOT approved is decent, anything ECE 22-05 is better. Making helmets that meet the unrealistic Snell tests results in harder helmets that tend to pass on more Gs to you, BUT they still
pass DOT so they&amp;rsquo;re still decent. In the end, when all the helmets are
whacked with hard things, &lt;em&gt;the cost of a helmet has no bearing on how
safe it&amp;rsquo;ll keep you&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The price difference between helmets pretty much determines which bells and whistles you get. Like lighter materials, fancy paint jobs, LED lights on the back, easy to remove washable clean liners, or visors designed to not fog in the dead of winter.&lt;/p&gt;
&lt;p&gt;It should be obvious, but if safety is your concern your only choice is a full
face helmet with chin guard. The two non-obvious things that I may have conceptually grasped when I was a new rider but never truly appreciated then was just how much of a pain in the ass the sun and fogged visors can be.&lt;/p&gt;
&lt;h4 id=&#34;sun&#34;&gt;Sun:&lt;/h4&gt;
&lt;p&gt;You can&amp;rsquo;t flip down a shade to keep the direct sun out of your eyes like you can in a car. With most helmets you&amp;rsquo;re stuck with whatever vizor you happen to have on at the moment the sun appears. If your helmet is form fitting (as it should be) you may find that (sun)glasses don&amp;rsquo;t work as well as you&amp;rsquo;d wish because they get moved up or down a little by the padding. My recommendation is to invest in a
tinted visor. But, if you ride at night too you&amp;rsquo;re going to want a
helmet that lets you switch it for a clear one really easily. This is
where something like Scorpion&amp;rsquo;s SpeedShift comes in handy. It makes it
very easy to pop off the current visor and replace it. Scorpion and HJC
(and others?) make helmets with retractable inner sun-visors, which is
extremely cool. I&amp;rsquo;d love to get my hands on one of those for this
summer. If you know of another manufacturer with a similar feature,
please let me know.&lt;/p&gt;
&lt;h4 id=&#34;fogged-visors&#34;&gt;Fogged visors:&lt;/h4&gt;
&lt;p&gt;It&amp;rsquo;s not as much of an issue in the summer but if you find yourself riding in cool weather this is a massive pain in the ass. With my old helmet I&amp;rsquo;d have to lift the visor at every stop-light or it would totally fog over and then put it down again when I started moving lest I freeze. Scorpion is also well known for helmets that don&amp;rsquo;t fog easily. It&amp;rsquo;s partly the coating on their visors, and partly the way they direct air over, or away from, them. They also make a snow helmet with a two paned visor with built in electric heating element.&lt;/p&gt;
&lt;h4 id=&#34;rear-view-mirrors&#34;&gt;Rear view mirrors:&lt;/h4&gt;
&lt;p&gt;Side mirrors are notorious, on street bikes, for giving you a great view of your elbows. What you really want, is a rear-view mirror. Currently only &lt;a href=&#34;http://www.reevu.com/&#34; title=&#34;Helmets with rear-view mirrors&#34;&gt;Reevu&lt;/a&gt; makes a helmet with a built in rear-view mirror. It&amp;rsquo;s very cool, but it&amp;rsquo;s also pricey and hard to get in the U.S.. *&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.webbikeworld.com/motorcycle-helmets/motorcycle-helmet-faq.htm&#34;&gt;WebBikeWorld has a good helmet FAQ&lt;/a&gt;
that you should definitely read.*&lt;/p&gt;
&lt;p&gt;&lt;a name=&#34;boots&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;boots&#34;&gt;Boots&lt;/h3&gt;
&lt;p&gt;Motorcycle boots are a lot like ski boots. You want to keep your ankle from twisting, prevent the heel or ankle bones from damage upon impact, and have a material that will survive being dragged across the road. The things you want that a ski-boot doesn&amp;rsquo;t offer are the ability to  more-easily bend your ankle vertically (for shifting), nice grippy bottoms,  the ability to walk like a human. Most tall boots will also provide you with good shin protection, coming up to just below the bottom edge of your knee armor. Everything else is style, and there are a lot of styles to choose from. Most of the armor in boots isn&amp;rsquo;t CE rated, and manufacturers aren&amp;rsquo;t consistent in what armor to include. I would advise looking for boots with malleolus (ankle bone) armor, as it can save your ankle bone from being seriously hurt and is a strong indicator of a boot made with your protection in mind. I&amp;rsquo;d have broken my ankle if not for the malleolus armor in my boots.&lt;/p&gt;
&lt;p&gt;When choosing a boot don&amp;rsquo;t forget about waterproofing. Boots can become very waterlogged very quickly and riding in them is a surprisingly unpleasant sensation. However, waterproof boots don&amp;rsquo;t ventilate well, so if your feet tend to sweat profusely, you may want to just deal with the sloshing pools of water around your feet when you inevitably ride in the rain.&lt;/p&gt;
&lt;p&gt;Tall boots, obviously, provide more protection, but there are few manufacturers that make boots specifically for women, and women tend to have wider calves than men with the same sized foot. As a result, many women will find that they have to go with a short boot simply to accomodate their calves.&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t forget your laces! Racing boots don&amp;rsquo;t have laces. There&amp;rsquo;s a really good reason for this. Your laces can get caught on a peg, or go flapping around in the wind, get caught in the chain, make you crash, and tie your foot to the falling bike so you can&amp;rsquo;t get off. Oxtar makes a bunch of shoes you could walk around town in but have built in protection AND something to cover the laces, but unless it goes up your leg a bit it won&amp;rsquo;t help prevent twisted ankles well. If your boots have laces, always tuck them under.&lt;/p&gt;
&lt;p&gt;&lt;a name=&#34;gloves&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;gloves&#34;&gt;Gloves&lt;/h3&gt;
&lt;p&gt;The main thing to consider about gloves is
the temperature you&amp;rsquo;re going to use them in. You&amp;rsquo;ll probably want a
summer and winter pair because, speaking from experience, riding in the
cold, with the wrong gloves, is a painful experience, and it slows down
your hand&amp;rsquo;s reaction times. I&amp;rsquo;ve never seen gloves with CE rated armor,
as it&amp;rsquo;s probably nigh-impossible to create ones that anyone would wear.
Some have hard carbon fiber and / or Kevlar protection on the knuckles
and back of the hand, but I haven&amp;rsquo;t seen any winter gloves like this.
You&amp;rsquo;re going to want to keep your eyes open for gloves that protect your
wrist (Gauntlets) and offer some protection for the end of your ulna
(the outside bone in your forearm).&lt;/p&gt;
&lt;p&gt;As a programmer I would be screwed without the use of my hands, so I always wear full leather gloves with some sort of extra padding or armor across the back and fingers (mine have Kevlar too) to keep them as safe as I can. Waterproofing is even more important in gloves than it is in boots because they&amp;rsquo;re right out there in the front getting pounded with water, but it&amp;rsquo;s pretty hard to get right, and if a glove is waterproof it means it&amp;rsquo;s not going to breathe well, so you&amp;rsquo;re &amp;ldquo;damned if you do, damned if you don&amp;rsquo;t&amp;rdquo;. My advice is to invest in some waterproofing spray, and maybe consider different gloves for rain vs. dry if your hands tend to get sweaty. Boots at least get a little rain protection from the angle you hold them
at (or from the front of a scooter).&lt;/p&gt;
&lt;p&gt;&lt;a name=&#34;tires&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;tires&#34;&gt;Tires&lt;/h3&gt;
&lt;p&gt;Tires make a huge difference. Just like a car there are different tires for different
conditions. What&amp;rsquo;s more notable is how little tire a motorcycle has
touching the road. The less you have touching the ground the more
critical it is that those few inches of rubber are in top condition.
Most car drivers can&amp;rsquo;t really tell the difference between various tires,
except maybe when the roads are wet. Not so with motorcycles. Check out
this &lt;a href=&#34;http://www.canyonchasers.net/reviews/tires/road-attack.php&#34;&gt;review of the Continental Road Attacks&lt;/a&gt; from an experienced rider to get an idea of just how dramatic the change can be with a different tire. When choosing a tire be sure to get one that&amp;rsquo;s appropriate for how you ride. Some tires are much better suited for wet weather(you can&amp;rsquo;t tell just by looking at the treads) but some riders never ride in the rain. Some are better if you go off road, but don&amp;rsquo;t offer a huge benefit to riders who stay on the asphalt. Seek advice and read up before you buy.&lt;/p&gt;
&lt;p&gt;One thing that&amp;rsquo;s frequently overlooked is tire pressure. Tire pressure affects how well you stick and how long your tire lasts. Under-inflated tires can lead to cracks in the grooves that simply can&amp;rsquo;t be repaired. &lt;a href=&#34;http://www.motorcyclecruiser.com/tech/tire_facts/index.html&#34;&gt;Motorcycle Cruiser has a good post about what makes a motorcycle tire and 10 tire tips&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a name=&#34;modulators&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;headlight-modulators&#34;&gt;Headlight Modulators&lt;/h3&gt;
&lt;p&gt;I don&amp;rsquo;t have any personal experience with headlight modulators but there are many people who swear by them and are convinced they&amp;rsquo;ve saved their lives. If you&amp;rsquo;re not familiar with them they&amp;rsquo;re devices that &amp;ldquo;rapidly [vary] the intensity of a motorcycle headlight from between 20% and 100% of normal steady-burning power.&amp;rdquo; They also have them for brake lights, blinkers, etc. There is no question that this grabs the attention of humans.&lt;/p&gt;
&lt;p&gt;While some (all?) states do have laws prohibiting non-emergency vehicles from having flashing lights FMVSS 108 (Federal Motor Vehicle Safety Standards) (49 CFR Part 571.108 S7.9.4) allows motorcycle headlight modulation systems in all 50 states so long as they conform to the standard. Title 49 USC 30103(b1) (US Codes) prohibits any state from forbidding a system that conforms to FMVSS 108. I don&amp;rsquo;t know how this plays out in other countries. Unfortunately, some local police officers aren&amp;rsquo;t well
informed about this, see someone using &amp;ldquo;flashing lights&amp;rdquo; and write a
ticket anyway.&lt;/p&gt;
&lt;p&gt;&lt;a name=&#34;ears&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;speakers--earplugs&#34;&gt;Speakers / Earplugs&lt;/h3&gt;
&lt;p&gt;In some states it&amp;rsquo;s illegal to use a helmet with speakers (or headphones under a helmet). In MA it&amp;rsquo;s illegal to even &lt;em&gt;posses&lt;/em&gt; a helmet with speakers. Talking on the phone give you worse reaction times than being drunk (no joke). Music is going to make it harder to notice the sounds of bad things happening.&lt;/p&gt;
&lt;p&gt;However, there&amp;rsquo;s definitely something to be said for having a GPS speak directions to you over a Bluetooth headset, especially when you&amp;rsquo;re going through a series of close turns. I&amp;rsquo;d much rather pay attention to the road and hear the directions than have to navigate unfamiliar intersections &lt;em&gt;and&lt;/em&gt; look down at a moving map.&lt;/p&gt;
&lt;p&gt;Earplugs are interesting. When most people think about earplugs they have little to no real experience with them and think that they just make it harder to hear things. But that&amp;rsquo;s not really the case. Most disposable earplugs primarily cut out excessive high frequencies. Yes, they&amp;rsquo;re going to reduce your ability to hear quiet things too, but you probably wouldn&amp;rsquo;t hear that over your exhaust system anyway. You definitely wouldn&amp;rsquo;t hear it over your exhaust system with music playing loud enough be heard over your that. They&amp;rsquo;ll also help prevent permanent damage from long term exposure to loud noises (your muffler). If you&amp;rsquo;ve ever gotten off your
bike and realized you couldn&amp;rsquo;t hear your friends as well as you could when you got on then you&amp;rsquo;ve actually incurred hearing damage. Generally this isn&amp;rsquo;t permanent but enough repeated exposures and it will be.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Hearing damage can be cumulative and permanent, especially at levels
above 85dB, a level at which most motorcycle riding takes place.&amp;rdquo; -
WebBikeWorld&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;WebBikeWorld has &lt;a href=&#34;http://www.webbikeworld.com/Earplugs/earplugs.htm&#34;&gt;a good page on earplugs and hearing protection&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you don&amp;rsquo;t believe me about being able to hear well with earplugs try this: Next time you go to watch a rock band play live, stop off at your local drug store and pick up some cheap foam earplugs. Try listening to the concert with and without them. You&amp;rsquo;ll never go to a concert without them again. Everything sounds clearer and better.&lt;/p&gt;
&lt;p&gt;In my experience the custom earplugs created by injecting a quick-setting silicone, or pressing silicone putty into the ears are worth every penny. They are very comfortable, form an excellent seal, and eliminate a huge amount of fatigue from the high volume of road and exhaust noise. They typically cost $50- $60 though, and require tracking down someone who can make them for you (frequently at motorcycle shows) so don&amp;rsquo;t feel you need to grab some before getting on the bike. Disposable foam earplugs work great for many people.&lt;/p&gt;
&lt;p&gt;&lt;a name=&#34;unexpected&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;things-you-wouldnt-expect&#34;&gt;Things you wouldn&amp;rsquo;t expect&lt;/h3&gt;
&lt;h4 id=&#34;water&#34;&gt;Water:&lt;/h4&gt;
&lt;p&gt;When you&amp;rsquo;re on long summer rides staying hydrated is,
without question, and indispensable safety measure. Getting heat stroke
on a bike is deadly. When you&amp;rsquo;re not hydrated enough your body can&amp;rsquo;t
sweat and rapidly begins to overheat. Your body &lt;a href=&#34;http://www.howstuffworks.com/question699.htm&#34;&gt;can produce half a
gallon of sweat an hour.&lt;/a&gt;
If you&amp;rsquo;re not consuming as much as you&amp;rsquo;re sweating you will overheat. If
you think you&amp;rsquo;ll be sweating at all, get a
&lt;a href=&#34;http://www.camelbak.com/&#34;&gt;CamelBak&lt;/a&gt; or pull over for regular drink
breaks.&lt;/p&gt;
&lt;h4 id=&#34;tire-gauge&#34;&gt;Tire Gauge:&lt;/h4&gt;
&lt;p&gt;I covered tires briefly above, and I highly recommend you read the article I linked to. But, the short short version is to always have a tire gauge and use it before every ride. Know what pressure your tires should be at for wet and dry conditions. Have your own electric pump at home (they&amp;rsquo;re only like $25) and know which gas stations in your home area have pumps you can use.&lt;/p&gt;
&lt;h4 id=&#34;thermal-regulation&#34;&gt;Thermal Regulation:&lt;/h4&gt;
&lt;h5 id=&#34;the-hot&#34;&gt;The hot:&lt;/h5&gt;
&lt;p&gt;Most people just think about staying cool. And that&amp;rsquo;s
definitely important. As I mentioned above it&amp;rsquo;s important to have gear
that isn&amp;rsquo;t so hot you&amp;rsquo;ll be tempted to leave it at home. Go for light
colors with lots of good ventilation. Make sure your garments have
removable liners and wicking material against your skin.&lt;/p&gt;
&lt;p&gt;In my experience the size of the vents is not nearly as important as their placement, and the back vents will provide you with a dramatic amount of cooling when opened. I&amp;rsquo;ve worn full gear through the middle of the desert in summer and I can assure you that good gear keeps you cool, cooler than a t-shirt because your skin isn&amp;rsquo;t being cooked by the sun. You&amp;rsquo;ll still be able to sweat and the ventilation will help it to cool you off. Just make sure you&amp;rsquo;re not squeezed into your jacket like a sausage so that the air can actually flow over you.&lt;/p&gt;
&lt;p&gt;Another option is a cooling vest. This is essentially just a vest filled with a water absorbing gel that you soak. You are then cooled via the evaporative cooling. It doesn&amp;rsquo;t work very well (or at all) in humid areas, and requires a pretty decent air-flow.&lt;/p&gt;
&lt;h5 id=&#34;the-cold&#34;&gt;The cold:&lt;/h5&gt;
&lt;p&gt;You&amp;rsquo;d think that just adding layers would help, and it does, to some
degree, but the wind is a killer. It can be surprisingly painful when it
finds holes in your coverings. The problem is that as your body
temperature drops so do your reaction times. Hands are one part of your
body you want to keep nice and toasty because delayed reaction times
when grabbing that break lever is not something you want. Get some
winter gloves. And if you&amp;rsquo;re going to be doing any riding in sub 50 deg.
(Fahrenheit) weather you should seriously consider getting some &lt;a href=&#34;http://www.webbikeworld.com/t2/motorcycle-heated-grips/&#34;&gt;heated
grips&lt;/a&gt; and a heated vest / jacket. These make a huge difference, but before you plug in you have to make sure your bike produces enough extra electricity to power them, otherwise you&amp;rsquo;ll drain the battery and strand yourself.&lt;/p&gt;
&lt;p&gt;Also, get some neck covering. You have a major artery on either side of your throat, not only is the wind &lt;em&gt;painfully&lt;/em&gt; cold on your neck in the winter the
fact that those arteries cary so much blood and are being exposed to it
means the blood they&amp;rsquo;re pumping to and from your brain is getting
cooled.  I&amp;rsquo;d recommend buying a &lt;a href=&#34;http://www.buffwear.com/&#34;&gt;Cyclone Buff&lt;/a&gt; for the cold days. A normal thin buff isn&amp;rsquo;t bad for the rest of the season either because it&amp;rsquo;ll keep bugs from pinging off your throat, which is never pleasant.&lt;/p&gt;
&lt;p&gt;Overall, if you&amp;rsquo;re going to ride in cooler weather you need gear that is specifically designed to keep your warm and cover you without any holes. You&amp;rsquo;ll want winter gloves. Many helmet manufacturers offer some sort of plastic chin insert that you can use to keep the air from pouring in and freezing your chin. They also cut down on the road noise. Waterproofing is also important because while highway wind-chill can be incredibly uncomfortable without the right gear you really don&amp;rsquo;t
want to discover what it feels like when you add being wet to the mix. Be sure to look for reviews online before buying. Some gear isn&amp;rsquo;t all it&amp;rsquo;s marketed to be.&lt;/p&gt;
&lt;p&gt;&lt;a name=&#34;conclusion&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Looking cool is not a good enough reason to not wear armor, especially not when there&amp;rsquo;s some excellent protection out there that looks good too, but as with most things in life, you get what you pay for. Stay safe, and either spend what it takes to do so or don&amp;rsquo;t ride. Your life and livelihood are not worth one more ride. Related: I&amp;rsquo;ve put together a basic overview of what you can expect to pay (at the low end) for the main items here in &lt;a href=&#34;https://weblog.masukomi.org/2008/05/17/the-financial-cost-of-motorcycle-safety&#34;&gt;The Financial Cost of Motorcycle Safety&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you spot any errors in this post, or things you think could be
improved, please let me know so that I can correct them.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Kay&#39;s incredibly simple Catfish recipe</title>
      <link>https://weblog.masukomi.org/2008/03/30/kays-incredibly-simple-catfish-recipe/</link>
      <pubDate>Mon, 31 Mar 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/03/30/kays-incredibly-simple-catfish-recipe/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m a big fan of dishes that are easy and fast. One night I was at the
store, saw some catfish and decided to buy mysef a fillet. When I got it
home I had to find some way to make it interesting with my limited
spices. The result has a flavor that very much resembles the physical
texture you want to shoot for: lightly seared on the outside that, once
breached, reveals a nice soft middle. This will take less than 10
minutes to prepare and cook. &lt;a href=&#34;http://www.neareast.com/&#34;&gt;Near East&lt;/a&gt; makes
a sun-dried tomato and rice box that, like everything of theirs, is
trivial to make and goes well with this*. We had it with a nice red
wine this time but, in retrospect, the flavor is a bit too powerful for
wine. Knudsen&amp;rsquo;s spritzers worked well but I think that the perfect drink
for this would be mango juice, although you might want to swap the
sun-dried tomato rice with a simpler rice-pilaf if you went that way. If
you live near an Indian restaurant you may want to snag some Mango
Lassis because this&amp;rsquo;ll be a little hot. But, neither Miller, nor I, are
fans of hot foods and we both like this dish. Ingredients:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;catfish filet&lt;/li&gt;
&lt;li&gt;crushed red pepper (preferably freshly ground)&lt;/li&gt;
&lt;li&gt;black pepper (also freshly ground)&lt;/li&gt;
&lt;li&gt;oregano&lt;/li&gt;
&lt;li&gt;olive oil&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You&amp;rsquo;ll want 1/2 - 3/4 of a fillet per person. Your pan should be medium
high: hot enough to sear the outside of the fish but but not so hot that
it won&amp;rsquo;t have time to cook all the way through. Coat the bottom of the
pan in a thin layer of olive oil, and when it&amp;rsquo;s hot throw it the whole
fillets. Quickly grind on a healthy amount of black pepper (imagine
you&amp;rsquo;re having sunny side up eggs and you reallllly like black pepper).
Grind on the red pepper. Grind on more red pepper. Hmm, no I don&amp;rsquo;t think
you understand. You see how much black pepper you put on? Yeah, you want
about 125-150% of that amount. Throw on the oregano and quickly flip the
filet. Don&amp;rsquo;t try and do it slow and gentle. Catfish gets really flaky as
it cooks and once it starts to break apart it&amp;rsquo;ll just disintegrate. So,
get your spatula under there, and lift and flip in one quick motion (but
don&amp;rsquo;t slap it down, and watch out for hot oil spatter). Coat the seconds
side just like you did the first. Cover and let sit for a few minutes.
Once the bottom has started to sear flip it, leave the cover off for a
minute to let the moisture escape that had built up before, make sure
it&amp;rsquo;s still got enough olive oil left, then cover for a few more minutes.
Take the cover off and after a minute or so, turn off the heat. You want
to be careful at this point because the fish will flake really easily.
What to expect: This will have a strong initial hit that will clear out
your sinuses followed up with the gentle flavor of the fish. I think the
peppers actually make the catfish flavor a seem lot milder than i
remember from my childhood. The searing is really critical to pulling
this dish off. If after that first spice side is flipped back it doesn&amp;rsquo;t
have a nice red-gold sear going on turn it right back over. It&amp;rsquo;s a lot
harder to redo it after the other side is done because it&amp;rsquo;ll fall apart
easily. Notes: Miller suggests dill instead of the oregano. I say
experiment with almost any dried green leafy bits you have laying
around. I&amp;rsquo;m going to try dried parsley next time. The oregano isn&amp;rsquo;t
quite flavorful enough. I recommend starting to grind after it&amp;rsquo;s already
in the pan so that the spices that miss the fish fall into the oil and
thus get cooked into it as you go. I don&amp;rsquo;t cook this with lemon juice,
or personally think that it adds much to the flavor when added
afterwards but it doesn&amp;rsquo;t taste bad at all and pouring some on after
does tend to calm down the heat if it&amp;rsquo;s a bit much for you. *I have no
idea how long the rice takes to cook. I just stuck it in my &lt;a href=&#34;http://www.zojirushi.com/ourproducts/ricecookers/ns_lac.html&#34;&gt;kick-ass
rice-cooker&lt;/a&gt;
and told it when I wanted it to finish. I can&amp;rsquo;t tell you how how awesome
this rice-cooker is. Yes, I realize it&amp;rsquo;s &amp;ldquo;just a rice cooker&amp;rdquo; but it is
really well made, wonderfully designed, and does a kick-ass job of
making sure different rices, and rice and veggie combinations come out
right, and compensating for when I put in too much water (easy to do
when you&amp;rsquo;ve got moist veggies in there too).&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>LazyWeb Idea:  Gravatar &#43; Network of sites = Gravanetric</title>
      <link>https://weblog.masukomi.org/2008/03/20/lazyweb-idea-gravata-network-of-sites-gravanetric/</link>
      <pubDate>Thu, 20 Mar 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/03/20/lazyweb-idea-gravata-network-of-sites-gravanetric/</guid>
      <description>&lt;p&gt;Pretty much everyone agrees that &lt;a href=&#34;http://www.gravatar.com&#34;&gt;Gravatar&lt;/a&gt;
rocks. A global avatar that shows up wherever you make a comment on a
blog (sometimes even &lt;a href=&#34;http://github.com/Caged/gitnub/wikis/home&#34;&gt;in your desktop apps&lt;/a&gt;). And I don&amp;rsquo;t think anyone other than naive VC guys wants another &amp;ldquo;social networking&amp;rdquo; site, so I&amp;rsquo;m not going there. But, imagine what would happen if every time you made a comment on a blog that used Gravatars a ping was sent off to the &amp;ldquo;Gravanetric&amp;rdquo; servers with two bits of information the hash of your
e-mail and the root url of the site you posted too.&lt;/p&gt;
&lt;p&gt;Then you could start
to graph shared interests. Imagine a simple force-directed graph with
the Gravatars of people who posted to them arrayed around a central site
node, or vice-versa, or a graph of the sites with lines of different
thickness between them to denote how much of their community is shared.
Then you could look up a site you liked and see what other sites people
thought were interesting enough to comment on, which would mean it more
likely that you&amp;rsquo;d want to read, and maybe comment on, what&amp;rsquo;s at that
site too. Or, you could enter in your e-mail address and it could show
you other people like you, or maybe graph the network of sites you&amp;rsquo;ve
visited. If you added in the ability for a person to associate an URL
with their Gravatar then you could go find out more about the people
similar to you.&lt;/p&gt;
&lt;p&gt;Visualizing this would be trivial with something like
&lt;a href=&#34;http://www.jsviz.org/&#34;&gt;JsViz&lt;/a&gt;. The only trick would be deciding how
&lt;em&gt;much&lt;/em&gt; to visualize. There&amp;rsquo;s really not a lot to the app itself either,
although you&amp;rsquo;d have to plan for some pretty huge database tables.&lt;/p&gt;
&lt;p&gt;Throw in an API for people to query x degrees of separation of sites, or
people or anything else interesting and you&amp;rsquo;ve got a giant ball of
coolness. The API could allow them to overlay it with links to the
people who were signed up to their TrueLoveForever.com type site and
you&amp;rsquo;ve got some interesting possibilities. Maybe make use of the API
free for &amp;lt; 100 requests a day like Google, and other sites do, but
charge if anyone wants to make some significant number of queries&amp;hellip;.
Plus you can always throw banner ads on the site. Heck, you might even
make some money off of this.&lt;/p&gt;
&lt;p&gt;Obviously this would be easiest for the Guys over at &lt;a href=&#34;http://www.automattic.com&#34; title=&#34;Makers of WordPress and Askimet&#34;&gt;Automattic&lt;/a&gt;
since they&amp;rsquo;ve &lt;a href=&#34;http://blog.gravatar.com/2007/10/18/automattic-gravatar/&#34; title=&#34;They bought Gravatar&#34;&gt;already got the Gravatar infrastructure&lt;/a&gt; in place and know exactly what kind of load they&amp;rsquo;d need to handle before going into it.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Getting just the tip of a Git repo</title>
      <link>https://weblog.masukomi.org/2008/03/13/getting-just-the-tip-of-a-git-repo/</link>
      <pubDate>Thu, 13 Mar 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/03/13/getting-just-the-tip-of-a-git-repo/</guid>
      <description>&lt;p&gt;Sometimes you just want to distribute the source code without its history, and that&amp;rsquo;s where git-archive comes in. git-archive will create an archive of the files at any point in the history and wrap them all up for you in a tar or zip (defaults to tar). You can even make an archive from a remote repo by using the&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;—remote=&amp;lt;repo&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;option in the administrator has enabled it.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll typically use git-archive like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git archive &amp;lt;tree-ish&amp;gt; &amp;gt; my_new_archive.tar
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And that will create an archive of everything in your repo. If you just want an archive of some specific files you can simply pass in the path(s) to the
file(s) you want in the archive after your tree-ish. If you wanted to create a zip file instead of a tar you&amp;rsquo;d simply pass it the &amp;ldquo;—format=zip&amp;rdquo; option.&lt;/p&gt;
&lt;p&gt;Many people wonder if there is a way to check out just the tip of the repo so that they don&amp;rsquo;t have to download the entire revision history. This is called a &amp;ldquo;shallow&amp;rdquo; clone and is possible by passing the &amp;ldquo;&lt;code&gt;--depth &amp;lt;some\_number\&amp;gt;&lt;/code&gt;&amp;rdquo; but it has a number of limitations: you can&amp;rsquo;t clone, or fetch from it and you can&amp;rsquo;t push from or into it, but it&amp;rsquo;s useful if you only want to look at, or near, the tip of a large project with a long revision history and would want to send in your fixes or features as patches.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Squeak By Example (first impressions)</title>
      <link>https://weblog.masukomi.org/2008/03/13/squeak-by-example-first-impressions/</link>
      <pubDate>Thu, 13 Mar 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/03/13/squeak-by-example-first-impressions/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m reading through &lt;a href=&#34;http://www.squeakbyexample.org/&#34;&gt;Squeak By Example&lt;/a&gt;
because I&amp;rsquo;ve got some ideas rumbling around in my head that might be
nice to do in Smalltalk. Having an integrated visual environment where
everything is an object opens a lot of data visualization possibilities.
Anyway, it has been probably two years since I&amp;rsquo;ve touched Smalltalk, and
even then it was pretty brief. So I needed a refresher course.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been flipping through it looking for random bits of information I was
interested in and found them all. Then, I went back and started from the
beginning, following all the instructions, doing all the examples&amp;hellip;.
They&amp;rsquo;ve done a great job explaining things, it&amp;rsquo;s really easy to follow,
and gives you an excellent step-by-step introduction to
&lt;a href=&#34;http://www.squeak.org/&#34;&gt;Squeak&lt;/a&gt;&amp;rsquo;s IDE, and that&amp;rsquo;s a very good thing if
you&amp;rsquo;re not familiar with Smalltalk.&lt;/p&gt;
&lt;p&gt;And then I hit section 1.10 and my jaw dropped. Test Driven Development&amp;hellip;right there, at the start of things too. Many of my friends know how annoyed I am by the fact that books don&amp;rsquo;t teach about writing unit tests as part of the language. Most language books teach you how to program in some new language and then,
if you&amp;rsquo;re lucky, at the end go &amp;ldquo;oh yeah, and you should write unit tests.&amp;rdquo; Which, I feel, results in a very similar attitude amongst the developers who use the language. Code code code, &amp;ldquo;oh yeah, unit tests are &amp;lsquo;good&amp;rsquo; but, whatever&amp;hellip;&amp;rdquo; code code code.&lt;/p&gt;
&lt;p&gt;But, here I am (in a book from the land where unit tests were invented (sUnit)) and for the first time in my life I&amp;rsquo;m seeing unit tests being treated as first class citizens in a language. And they&amp;rsquo;ve already mentioned version control in passing.&lt;/p&gt;
&lt;p&gt;Holy, fucking, shit.&lt;/p&gt;
&lt;p&gt;So, 22 pages in (plus however many random pages I read while skipping around over the past couple days) and I have to say I am really impressed. Well written, easy to follow, good example graphics. It&amp;rsquo;s still pretty preliminary of course but&amp;hellip; If you&amp;rsquo;re interested in learning Smalltalk I recommend checking out &lt;a href=&#34;http://www.squeakbyexample.org/&#34; title=&#34;Squeak By Example book&#34;&gt;Squeak By Example&lt;/a&gt;. I&amp;rsquo;ll
be grabbing the soft-cover version shortly but you can download the PDF
version for free and check it out.&lt;/p&gt;
&lt;p&gt;And, please, don&amp;rsquo;t be turned off by the cutesey iconography Squeak uses. A lot of the development that&amp;rsquo;s gone into Squeak has been to make it approachable and easy to use by children, but that doesn&amp;rsquo;t mean it isn&amp;rsquo;t still a powerful development
platform. If you&amp;rsquo;re not convinced just check out &lt;a href=&#34;http://www.dabbledb.com/&#34;&gt;DabbleDB&lt;/a&gt;. It&amp;rsquo;s written in Smalltalk with the very cool &lt;a href=&#34;http://www.seaside.st/&#34;&gt;Seaside web framework&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;P.S. Many have heard me say there&amp;rsquo;s no joy in Java, but there&amp;rsquo;s much joy to be found in Perl, Ruby, and Python. Well, there is in Smalltalk too. In all my Smalltalk excursions so far I&amp;rsquo;d say that Smalltalk is &amp;ldquo;nice&amp;rdquo;. I don&amp;rsquo;t know if I&amp;rsquo;ll personally come to find it joyous (I certainly don&amp;rsquo;t find Python joyous but I understand how others can), but it is, at the very least, nice. :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Synergy is the Bee&#39;s-Knees</title>
      <link>https://weblog.masukomi.org/2008/03/13/synergy-is-the-bees-knees/</link>
      <pubDate>Thu, 13 Mar 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/03/13/synergy-is-the-bees-knees/</guid>
      <description>&lt;p&gt;Many of us &amp;ldquo;power users&amp;rdquo;, especially web developers, have multiple
computers on our desks. I have the mac, the linux box, and the windows
box. There are good reasons for each, not the least of which is testing
browser compatibility. But,
&lt;a href=&#34;http://synergy-foss.org/&#34; title=&#34;Download it now kids&#34;&gt;Synergy&lt;/a&gt; is
what makes it not only not-annoying, but freaking cool.&lt;/p&gt;
&lt;p&gt;You see my single sweet Kinesis keyboard and funky ergo mouse (neither of which anyone else can successfully use) controls everything. It starts out on
the Linux box (on my right, and as i move it left swings over onto the
Mac laptop (in the middle, on a pedestal of cool geek books), and as it
continues left ends up on the Windows box. The clipboard follows the
mouse too (at least it does if you&amp;rsquo;ve copied text onto it), so I can
copy an URL (or whatever) on Windows, mouse right and paste it on the
Mac, mouse a little farther and paste it on the Linux box.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d happily pay $50 for this app, but it&amp;rsquo;s totally open source and free (although, I
actually did just donate $50 to them). It&amp;rsquo;s trivial to install on
windows and on mac and linux it only requires editing a simple
configuration file.&lt;/p&gt;
&lt;p&gt;Caveat emptor: if you&amp;rsquo;ve got heavy network traffic
on one of the boxes it may slow down it&amp;rsquo;s ability to receive mouse and
keyboard input from the master computer, similar problem for heavy CPU
usage. Also holding down arrow keys when the information is being piped
to computers other than the master isn&amp;rsquo;t the greatest. The keyboard, in
that edge case, is talking to the main comp faster than it can send the
commands over the network.&lt;/p&gt;
&lt;p&gt;Bonus: when I take my mac laptop home at
night (disconnecting from work network, obviously) I don&amp;rsquo;t have to do
anything, and when I reconnect to the work network the next day, I still
don&amp;rsquo;t have to do anything. It just automatically detects the main
synergy box again and reconnects.&lt;/p&gt;
&lt;p&gt;P.S. It should be noted that synergy doesn&amp;rsquo;t encrypt your keystrokes between computers but it&amp;rsquo;s easy to do with ssh and you shouldn&amp;rsquo;t be running it over untrusted networks anyway. I mean, all the computers are going to be on the same LAN and you&amp;rsquo;d rarely want to set this up for something you&amp;rsquo;re not going to be using day after day.&lt;/p&gt;
&lt;p&gt;[Update] Just discovered a particular coolness. If, my mac (in the
middle) isn&amp;rsquo;t connected, the mouse will travel from the linux (right) to
the windows (left) without issue even though my config files only talk
about the windows monitor&amp;rsquo;s positioning relative to the mac&amp;rsquo;s. A very
nice little touch guys.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Sharing a public Darcs repo over HTTP [flow chart]</title>
      <link>https://weblog.masukomi.org/2008/03/11/sharing-a-public-darcs-repo-over-http-flow-chart/</link>
      <pubDate>Tue, 11 Mar 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/03/11/sharing-a-public-darcs-repo-over-http-flow-chart/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2008/03/config_remote_darcs_repo.jpg&#34; alt=&#34;sharing a public Darcs repo over
http&#34;&gt;
The same friend who wondered about &lt;a href=&#34;https://weblog.masukomi.org/2008/03/11/sharing-a-public-git-repo-over-http-flow-chart&#34;&gt;how to share a Git repo over
HTTP&lt;/a&gt; dared to suggest that &amp;ldquo;It&amp;rsquo;s so easy with Hg&amp;hellip;&amp;rdquo;. While I happen to
disagree that it&amp;rsquo;s easier in &lt;a href=&#34;http://www.selenic.com/mercurial/&#34;&gt;Hg&lt;/a&gt;
than &lt;a href=&#34;http://git.or.cz&#34;&gt;Git&lt;/a&gt;, I think this flow chart successfully
demonstrates that, on this front, Hg and Git both suck ass when compared
to &lt;a href=&#34;http://darcs.net/&#34;&gt;Darcs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;P.S. Yes, while 100% factual, the graph is also intentionally silly.&lt;/p&gt;
&lt;p&gt;[Update] After considering it more I think think it probably is easier
to share a repo with Hg than Git, but I dislike the fact that it
involves mucking about with things outside of the repo. You have to set
up a CGI. You have to alter a config file that tells it what repos to
share and where&amp;hellip;. Yes, there&amp;rsquo;s a built in server you could use but
that&amp;rsquo;s really an edge case. Most of the time you&amp;rsquo;ll want to leverage an
existing web server.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Sharing a public Git repo over HTTP [flow chart]</title>
      <link>https://weblog.masukomi.org/2008/03/11/sharing-a-public-git-repo-over-http-flow-chart/</link>
      <pubDate>Tue, 11 Mar 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/03/11/sharing-a-public-git-repo-over-http-flow-chart/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2008/03/config_remote_repo.jpg&#34; alt=&#34;Configuring a public HTTP Git
repository&#34;&gt;&lt;/p&gt;
&lt;p&gt;There is also &lt;a href=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2008/03/config_remote_repo.svg&#34;&gt;an SVG version of this flow&lt;/a&gt;, which is more readable (but poor IE folks will have issues). Notes: This is a simplest possible configuration. Be sure to check out the docs for git-remote to see how to, optionally, designate specific local or remote branches. Many of the initial commands could be performed locally and then just uploaded to the server. This particular sequence guarantees that all the connection pieces are in place and working correctly.&lt;/p&gt;
&lt;p&gt;Much thanks to Tim Toolman for getting this info into two easy to follow posts: &lt;a href=&#34;http://toolmantim.com/article/2007/12/5/sharing_git_repositories_via_os_xs_built_in_web_sharing&#34;&gt;Sharing git repositories via OS X&amp;rsquo;s built-in web sharing&lt;/a&gt;
and &lt;a href=&#34;http://toolmantim.com/article/2007/12/5/setting_up_a_new_remote_git_repository&#34;&gt;Setting up a new remote git repository&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;However, this doesn&amp;rsquo;t feel elegant to me. If anyone can come up with a
simpler / more elegant way to do this please add a comment.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Where&#39;s the &#34;main&#34; repo when using Git?</title>
      <link>https://weblog.masukomi.org/2008/03/11/wheres-the-main-repo-when-using-git/</link>
      <pubDate>Tue, 11 Mar 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/03/11/wheres-the-main-repo-when-using-git/</guid>
      <description>&lt;p&gt;Sivaram said: &amp;ldquo;I have been using CVS on and off for a long time; so
using git is a bit confusing.&lt;/p&gt;
&lt;p&gt;If all the repo clones are equivalent, how does one know one is the &amp;lsquo;clean&amp;rsquo; repo? On CVS, there is a centralized repo lying somewhere. I can&amp;rsquo;t seem to wrap my head around the decentralized model.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;This question trips up a lot of people when they&amp;rsquo;re introduced to the concept of distributed version control systems. But the answer is exactly the same as in the centralized world. &lt;em&gt;It is wherever the project maintainers tell you it is&lt;/em&gt;. Let me give you an example:&lt;/p&gt;
&lt;p&gt;If you were joining a new company or project that used SVN (or any centralized system) you&amp;rsquo;d come in and say &amp;ldquo;Hey, I&amp;rsquo;m new. Where&amp;rsquo;s the repo? &amp;quot; and they&amp;rsquo;d respond, &amp;ldquo;We use SVN. The repo&amp;rsquo;s over there. Here&amp;rsquo;s the url.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;If you were joining a new company or project that used Git (or any other distributed system) you&amp;rsquo;d come in and say &amp;ldquo;Hey, I&amp;rsquo;m new. Where&amp;rsquo;s the repo?&amp;rdquo; and they&amp;rsquo;d respond, &amp;ldquo;We use Git. The repo&amp;rsquo;s over there. Here&amp;rsquo;s the url.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;See the difference? Neither do I. But in case you&amp;rsquo;re not convinced, consider the fact that at any point in time your sysadmin could move your SVN repo to another machine with a different URL. Everyone would change the URLs they connected to and that would be the end of it. The same thing applies in the distributed world.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Where your canonical repo lives, in any version control system, is nothing more than the place people happened to have agreed to keep it.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The only real difference is that in the distributed world you also have
the option of pulling from non-cannonical repositories.&lt;/p&gt;
&lt;p&gt;For a real world example we can look to Git itself. Where&amp;rsquo;s the main git repo? It&amp;rsquo;s where the Git homepage says it is. Compare this with Apache, which uses Subversion; their main repo is where their homepage says it is too. In both cases it might change tomorrow, but everyone would be really annoyed if it did so the people in charge are going to do their best to avoid it.&lt;/p&gt;
&lt;p&gt;Sometimes people contributing to Git will send an e-mail to the list asking others to pull some feature from their personal repo (instead of just sending a patch). Some people pull, some people don&amp;rsquo;t. It really doesn&amp;rsquo;t matter. All that really matters is what changes get pushed to the main repo, just like in the centralized world.&lt;/p&gt;
&lt;p&gt;Deciding what gets pushed to the main repo, or who gets to push to it is a project management decision that has very little, if anything, to do with what version control software you happen to use. Some systems enforce those business rules with software. Some don&amp;rsquo;t.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Importing an existing codebase into Git (a flowchart)</title>
      <link>https://weblog.masukomi.org/2008/03/08/importing-an-existing-codebase-into-git-a-flowchart/</link>
      <pubDate>Sat, 08 Mar 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/03/08/importing-an-existing-codebase-into-git-a-flowchart/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2008/3/8/git_import_flow_no_hist.jpg&#34; alt=&#34;importing a codebase into Git flow
chart&#34; title=&#34;importing an existing codebase into git&#34;&gt;&lt;/p&gt;
&lt;p&gt;A simple flow chart showing the steps you should take to add an
existing codebase to Git. This assumes you don&amp;rsquo;t have revision history
that you wish to migrate from another version control system. Some notes
about the flow:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When adding file paths you can use wildcards like &amp;ldquo;git add
/path/to/images/*.jpg&amp;rdquo;&lt;/li&gt;
&lt;li&gt;This is one of the few times when you&amp;rsquo;d want to use &amp;ldquo;git rm &amp;ndash;cached
&amp;quot; to un-add a changes in the index. After the first commit the
recommended way to un-add changes to the index (staging area) is to
&amp;ldquo;git reset HEAD &amp;ldquo;.&lt;/li&gt;
&lt;li&gt;Note that the only file that is edited during this process is
.gitignore When you call &amp;ldquo;git add&amp;rdquo; you are adding the &lt;em&gt;current
content&lt;/em&gt; of a file to Git to the index. If you change a file after
you add it Git won&amp;rsquo;t commit the additional changes (unless you add
them too). So, it&amp;rsquo;s a good idea to run &amp;ldquo;git add .gitignore&amp;rdquo; just
before you commit in order to make sure Git has the most recent
version of it.&lt;/li&gt;
&lt;li&gt;You&amp;rsquo;d only, obviously, &amp;ldquo;add&amp;rdquo; files you wanted. &amp;ldquo;git add .&amp;rdquo; (note the
dot) tells Git to add everything in, and below, the current
directory.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This image is copyright 2008 Very Useful Books, Inc. and distributed
under the &lt;a href=&#34;http://www.opensource.org/licenses/gpl-2.0.php&#34; title=&#34;GPL v2&#34;&gt;GPL v2&lt;/a&gt;. It was created With OmniGraffle 4. If anyone wants the original, just holler.&lt;/p&gt;
&lt;p&gt;[Update] P.S. It&amp;rsquo;s just a matter of time before someone tries to use this as evidence that Git is complex or hard to use, but before you do, please do an equivalent flow chart for your version control system that includes ignore files, adding selected files, adding all files, removing accidental adds, and everything else. You&amp;rsquo;ll find your chart is just as &amp;ldquo;complex&amp;rdquo;. The shortest path here is only 4 commands and that includes setting up the new repository to check the code into, and an optional sanity check of what&amp;rsquo;s going to be committed.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Review of Edward Tufte&#39;s Presenting Data and Information course</title>
      <link>https://weblog.masukomi.org/2008/03/07/review-of-edward-tuftes-presenting-data-and-information-course/</link>
      <pubDate>Fri, 07 Mar 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/03/07/review-of-edward-tuftes-presenting-data-and-information-course/</guid>
      <description>&lt;p&gt;First, let me set the stage. I&amp;rsquo;ve been reading stumbling across
interesting data information articles by &lt;a href=&#34;http://www.edwardtufte.com/&#34; title=&#34;Edward Tufte&#34;&gt;Edward Tufte&lt;/a&gt; for years now, have
been interested in getting &lt;a href=&#34;http://www.amazon.com/gp/search?ie=UTF8&amp;amp;keywords=Edward%20Tufte&amp;amp;tag=masukomiorg-20&amp;amp;index=books&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=9325&#34;&gt;his books&lt;/a&gt;&lt;img src=&#34;http://www.assoc-amazon.com/e/ir?t=masukomiorg-20&amp;amp;l=ur2&amp;amp;o=1&#34; alt=&#34;image&#34;&gt;
for a while now, and was excited when my manager offered to send me to
his one day course, and am quite grateful to have had the opportunity to
go. So, I definitely went into this with good expectations.&lt;/p&gt;
&lt;h3 id=&#34;30-second-summary&#34;&gt;30 Second Summary:&lt;/h3&gt;
&lt;p&gt;The first two thirds were not bad. The second two thirds sucked. The
type of people who would appreciate this course the most are ones akin
to the woman in front of me who wore red velvet pants, a scarf that
probably cost $60 and from the Museum of Fine arts, dangly earrings of
semi-precious stones, and, were you to talk to her, would be sure to let
you know that she&amp;rsquo;s &amp;ldquo;an artist.&amp;rdquo; She loved it. You, on the other hand,
should buy his books and skip the course.&lt;/p&gt;
&lt;p&gt;[Update] Actually, skip buying his books, unless you really want them.
Everything you &lt;em&gt;wish&lt;/em&gt; was in his course can be found in &lt;a href=&#34;http://www.amazon.com/gp/product/1591841992?ie=UTF8&amp;amp;tag=masukomiorg-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1591841992&#34;&gt;The Back of the Napkin: Solving Problems and Selling Ideas with Pictures&lt;/a&gt;.
I simply can not recommend that book highly enough to people wanting a
practical guide to the visual presentation of data.&lt;/p&gt;
&lt;h3 id=&#34;details&#34;&gt;Details:&lt;/h3&gt;
&lt;p&gt;The first two hours were pretty informative, and essentially all of my
notes that didn&amp;rsquo;t involve expletives came from that portion of the talk.
But, there were two quotes (taken completely out of context here) that
pretty much summed up his course&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;&amp;hellip;I prefer text.&amp;rdquo; and &amp;ldquo;Well this is all very interesting but&amp;hellip;&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;After the first intermission Edward made sure to let everyone know about
his wonderful four hundred year old books by by Euclid and Gallileo
which he held aloft, and flipped the pages of with his oily ungloved
hands, thus guaranteeing they will not survive the &lt;em&gt;next&lt;/em&gt; four hundred
years as they have the last. He even made sure to carry it down a couple
of aisles and show it to the people on the end, whilst frustrating and /
or boring the other 95% of the audience.&lt;/p&gt;
&lt;p&gt;After lunch he talked about visual interfaces which was comprised almost
entirely of him telling you how cool his iPhone was. According to Mr.
Tufte the only major thing that Apple got wrong with the iPhone was
using icons on the main interface instead of text. Just imagine how many
more items you could fit on that screen if it used text instead of
icons! Oh the joy of having to read through text lists to find the
fucking calendar app instead of just poking a fingertip sized picture of
a calendar. &lt;em&gt;Gallileo was so cool. Did you see this section of my book by
Gallileo?&lt;/em&gt; To be fair he pointed out some valid ways they could improve
the weather and stock apps.&lt;/p&gt;
&lt;p&gt;Much time was spent making fun of PowerPoint, &amp;ldquo;bullet grunts&amp;rdquo;, and
&amp;ldquo;chartoonists&amp;rdquo;. A grand total of zero minutes were spent discussing the
pros or cons of any standard graphing technique: bar graphs, line
graphs, area graphs, pie charts, scatter plots, etc.. Zero minutes were
spent discussing what graphing techniques were best suited for what
kinds of data (unless you count the 3 minutes spent on vertical scaling
of graphs). &lt;em&gt;Did you see the picture of Gallileo? There aren&amp;rsquo;t many
pictures of him but I have an etching of him in my 400 year old book
right here.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In between jabs at PowerPoint he discussed his technique for speeding up
time in meetings, which is to start out with a &amp;ldquo;massive data dump&amp;rdquo;
(giving the participants stuff to read before you talk), and then to ask
if there are any questions. He guarantees this will make your meetings
at least 30% faster. I guarantee that if you ever try that with a
potential customer you won&amp;rsquo;t make the sale. He repeatedly used this
technique on the audience by saying &amp;ldquo;now turn to page x in my book
titled y&amp;rdquo; and waiting silently until everyone in the audience had read
the whole page. Oh have you seen my book by Euclid?&lt;/p&gt;
&lt;p&gt;He repeatedly advised people to clarify confusing data by adding more
detail. While there are a handful of situations where this may actually
be good advice it&amp;rsquo;s incredibly bad advice to give to an audience without
clarifying when, why, and how to do so, which, of course, he never did.
I will note that I found at least one good example of this technique
while flipping through his books. &lt;em&gt;The iPhone is so cool, but AT&amp;amp;T&amp;rsquo;s Edge
network is the reason it isn&amp;rsquo;t cooler.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Edward also seems to be laboring under the mistaken impression that
people actually want to understand &lt;em&gt;all&lt;/em&gt; of the details of all the data
you&amp;rsquo;re presenting to them. It is my experience, and many concur with me,
that most people want to be shown the high-level &amp;ldquo;bullet grunts&amp;rdquo; of
whatever data you have so that they can have a clue what the hell
they&amp;rsquo;re looking at. Only then do they actually want nitty-gritty
details, and usually they want the details on just a subset of the
information. &lt;em&gt;Aren&amp;rsquo;t Gallileo&amp;rsquo;s etchings of these sun-spots wonderfully
detailed?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Documentation. All(?) graphs need documentation. The names of everyone
who contributed to them should be present in big bold letters just like
Gallileo did in this really old book. He even put his picture in it.
&lt;em&gt;Isn&amp;rsquo;t Gallileo cool?&lt;/em&gt; Also, descriptions: lots of descriptions, and
annotations, and annotated descriptions, It&amp;rsquo;s fine if it the text
required to describe the graph requires the same, or more, space than
the graph itself. One of the techniques that he mentioned multiple times
for making data more approachable was using annotations, which is great
if your data isn&amp;rsquo;t going to change the next time the person looks at it
(any stats on constantly changing things), but doesn&amp;rsquo;t seem to grasp how
incredibly difficult it is to write software that can intelligently find
a point to annotate that is either interesting or indicates some
causality, never-mind trying to write software that will generate useful
text about it. As an example, check out &lt;a href=&#34;http://www.google.com/trends?q=git&#34; title=&#34;the Google Trends for &#34;&gt;the Google Trends for
&amp;ldquo;git&amp;rdquo;&lt;/a&gt;.
When this was written only one of the annotated points had any causal effect on the data that&amp;rsquo;s being graphed (the one about Git software being released).&lt;/p&gt;
&lt;p&gt;Resolution. He makes a really big deal about resolution. He applies it
to media (screens, paper, etc.), as well as the resolution of
information in a graph. He makes a lot of valid points about resolution,
then talks about how some typographers designed their fonts at a
resolution of two thousand grid lines per inch, and how his &amp;ldquo;Sparklines&amp;rdquo;
have &amp;ldquo;two significant digits of resolution&amp;rdquo;. But he utterly fails to
grasp that there is a point at which adding resolution is useless. In
print his Sparklines may very well be precise to within a hundredth of
an inch, but no fucking reader can tell the difference.&lt;/p&gt;
&lt;p&gt;Imagine a typical ruler with precision down to a sixteenth of an inch. Now put ten
times as many tick marks in each inch and you&amp;rsquo;re roughly at &lt;em&gt;one half&lt;/em&gt;
the resolution of print on good paper. Even at half the resolution of
print you&amp;rsquo;re still going to have a really hard time telling the
difference between 23/160ths of an inch and 21/160ths. But, after
telling you how amazingly high the data resolution is in his Sparklines
he proceeds to tell you it&amp;rsquo;s not enough and that he&amp;rsquo;s started work on
displaying information in &amp;ldquo;High-def&amp;rdquo; Which bewilders the mind when you
consider that you&amp;rsquo;re very lucky if your &amp;ldquo;High Def&amp;rdquo; screen is one third
of the resolution of paper. &lt;em&gt;Have you seen the resolution in this etching
of Gallileo&amp;rsquo;s sun-spots?&lt;/em&gt; By giving the iPhone a higher resolution screen
they more than doubled the amount of information they could fit on it
relative to a normal phone! &lt;em&gt;If only Gallileo had of had an iPhone&amp;hellip;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Throughout the presentation I arrived at the following conclusions
(potentially wrong) about Edward Tufte.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;He has great distain for software developers.&lt;/li&gt;
&lt;li&gt;He has no clue about the problems involved in displaying dynamic
data.&lt;/li&gt;
&lt;li&gt;He has no clue about how to run a presentation.&lt;/li&gt;
&lt;li&gt;He has no clue why software works the way it does and berates it for
not working the way he thinks it should.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;BUT It didn&amp;rsquo;t all suck. As I said there were a number of good points in
the first two hours, and all attendees got a box with all four of his
books in it. You will need these if you attend the course because a
third of the time he&amp;rsquo;s referring to pages in them like a typical college
professor, and the other two thirds of the time you&amp;rsquo;ll need them to
entertain yourself while he tells you about his four hundred year old
books and his iPhone. I&amp;rsquo;ve read a few articles that went into one of
them and I&amp;rsquo;ve skimmed through the rest and I do think they&amp;rsquo;re actually
worth the cover price. He makes a lot of good points in the books and
has a lot of good examples, although I don&amp;rsquo;t think that all of his
suggestions actually play out in the real world.&lt;/p&gt;
&lt;h3 id=&#34;notes-from-the-course-in-case-anyone-cares&#34;&gt;Notes from the course (in case anyone cares):&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Focus on causality when presenting information.&lt;/li&gt;
&lt;li&gt;Data visualizations should be content driven not method driven.&lt;/li&gt;
&lt;li&gt;Strive to invoke content responses / questions in your users.&lt;/li&gt;
&lt;li&gt;Data should tell a story&lt;/li&gt;
&lt;li&gt;Provide a context for the data.&lt;/li&gt;
&lt;li&gt;Annotations: choose a point, explain it, then tie tangentially
related facts to that explanation (not sure I agree with that last
part)&lt;/li&gt;
&lt;li&gt;Try and make the &amp;ldquo;smallest effective difference&amp;rdquo; when trying to
emphasize some point.&lt;/li&gt;
&lt;li&gt;Order data by the most important aspect, not alphabetically.&lt;/li&gt;
&lt;li&gt;Find a way to connect your data to your users on a personal level
(for example when dealing with data on neighborhood fires plot it on
a satellite image of the town so that your users can find their
house and thus connect to it personally).&lt;/li&gt;
&lt;li&gt;Try to eliminate legends. You don&amp;rsquo;t want your users to have to look
up details of your graph. It should all be integrated. For example
if you&amp;rsquo;ve got a line graphing Bananna sales put &amp;ldquo;Bananna&amp;rdquo; on the
line.&lt;/li&gt;
&lt;li&gt;Keep related items adjacent in space.&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s easiest to see variations in a slope when it is roughly at a 45
degree angle.&lt;/li&gt;
&lt;li&gt;Make comparisons.&lt;/li&gt;
&lt;li&gt;Attempt to overcome recency bias.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Also, some paraphrased questions to ask when consuming presentations:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;What&amp;rsquo;s their story?&lt;/li&gt;
&lt;li&gt;Can I believe them?&lt;/li&gt;
&lt;li&gt;What is the &amp;ldquo;domain specification&amp;rdquo; of this presentation.&lt;/li&gt;
&lt;li&gt;What do I want to see? Is that what I was shown?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Some questions to answer when presenting information:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;What is the problem I&amp;rsquo;m addressing?&lt;/li&gt;
&lt;li&gt;Who is it relevant to, and why?&lt;/li&gt;
&lt;li&gt;What is the solution I am presenting?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Mr. Tufte, if you&amp;rsquo;re reading this, I appreciate and respect the work you
have done, but you need some &lt;em&gt;serious&lt;/em&gt; lessons on how to give a course.
I&amp;rsquo;d recommend spending some of the millions people have given you for
these courses on some private lessons with &lt;a href=&#34;http://www.tonyrobbins.com/&#34; title=&#34;Tony Robbins&#34;&gt;Tony Robbins&lt;/a&gt;. Whether or not you
agree with what he has to say it&amp;rsquo;s hard to deny that that man knows how
to convey lots of useful techniques to his audience in a way that is
both memorable and entertaining.&lt;/p&gt;
&lt;p&gt;P.S. Gallileo did, in fact, rock. However, if I wanted to see a
historically significant book I&amp;rsquo;d go to the museum or the library
(Boston happens to have a &lt;a href=&#34;http://www.bpl.org/&#34; title=&#34;kick-ass library&#34;&gt;kick-ass library&lt;/a&gt; with regular, and free, exhibitions). The iPhone also rocks, and is a triumph of interface design, but if I wanted to see a video of someone using it I would go to &lt;a href=&#34;http://www.apple.com&#34; title=&#34;Apple.com&#34;&gt;Apple.com&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Xbox 360 Wireless Racing Wheel</title>
      <link>https://weblog.masukomi.org/2008/02/28/xbox-360-wireless-racing-wheel/</link>
      <pubDate>Thu, 28 Feb 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/02/28/xbox-360-wireless-racing-wheel/</guid>
      <description>&lt;p&gt;The Logitech DriveFX had to go. Piece of crap. I plunked down an extra
$50 ($100 total) when I returned it to get the &lt;a href=&#34;http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;amp;location=http://www.amazon.com/Xbox-360-Wireless-Racing-Wheel/dp/B000VBIGK4?ie=UTF8&amp;amp;s=videogames&amp;amp;qid=1204165078&amp;amp;sr=8-1&amp;amp;tag=masukomiorg-20&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=9325&#34;&gt;Microsoft Xbox 360 Wireless Racing Wheel&lt;/a&gt;&lt;img src=&#34;http://www.assoc-amazon.com/e/ir?t=masukomiorg-20&amp;amp;l=ur2&amp;amp;o=1&#34; alt=&#34;image&#34;&gt;.
The difference is incredible.&lt;/p&gt;
&lt;h3 id=&#34;the-good&#34;&gt;The Good:&lt;/h3&gt;
&lt;p&gt;This product is very well designed, and very well put together. It feels
sturdy and solid. The rumble is very strong. The force feedback is also
very strong. The buttons aren&amp;rsquo;t cheap. The pedals have an empty area
that your heel goes in. At first it just looks like it&amp;rsquo;s there to save
plastic, or to look cool, but it actually serves a purpose. Because it
goes behind your foot it&amp;rsquo;s not possible for it to slide away from you
because it would always catch on your heel. When you get slammed off in
one direction you have to fight the wheel to turn back the other way.&lt;/p&gt;
&lt;h3 id=&#34;the-mediocre&#34;&gt;The Mediocre:&lt;/h3&gt;
&lt;p&gt;The X,Y,A,B Buttons are reachable without difficulty, but they could be
better. It&amp;rsquo;s a hard problem to solve though because when you go into a
hard turn you still need to be able to reach them.&lt;/p&gt;
&lt;h3 id=&#34;the-bad&#34;&gt;The Bad:&lt;/h3&gt;
&lt;p&gt;It doesn&amp;rsquo;t have equivalents for all the buttons. There&amp;rsquo;s no analog
sticks and no trigger buttons. They advertise that you can remap some of
the functionality, and that&amp;rsquo;s true, but the ability to remap is
supported at the game level not in the OS.&lt;/p&gt;
&lt;h3 id=&#34;the-burnout&#34;&gt;The Burnout:&lt;/h3&gt;
&lt;p&gt;I got this because I freaking love &lt;a href=&#34;http://www.amazon.com/gp/search?ie=UTF8&amp;amp;keywords=Burnout%20Paradise&amp;amp;tag=masukomiorg-20&amp;amp;index=videogames&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=9325&#34;&gt;Burnout
Paradise&lt;/a&gt;&lt;img src=&#34;http://www.assoc-amazon.com/e/ir?t=masukomiorg-20&amp;amp;l=ur2&amp;amp;o=1&#34; alt=&#34;image&#34;&gt;. Unfortunately EA Games doesn&amp;rsquo;t support any controllers on the 360 other than the default. Since there aren&amp;rsquo;t any analog sticks you can&amp;rsquo;t navigate the map, and some maneuvering (controlling rolls for example)
is harder than it would otherwise be. It does make your driving much smoother, but on the other hand sometimes when you bounce off of something (another car, a side-rail, etc.) the force feedback will drive you hard to one side and you&amp;rsquo;ll have to fight it to get it back to the other direction, then over-compensate, and reverse the process in decreasing sine-wave like pattern. Maybe this is realistic (I wouldn&amp;rsquo;t
know), but it is trickier.&lt;/p&gt;
&lt;h3 id=&#34;in-conclusion&#34;&gt;In Conclusion:&lt;/h3&gt;
&lt;p&gt;If you like racing games this is a really great product. If you only
want to use it on racing games made by EA Games you&amp;rsquo;ll not be getting
the full potential of it, but you may still find it worth it. I do.&lt;/p&gt;
&lt;p&gt;P.S. If you set a new record on each of the roads you get the Carbon
Ikusa GT which has 8 speed 7 boost and 5 strength along with the Speed
King achievement. Unfortunately there&amp;rsquo;s no achievement for holding the
fastest time on all the roads simultaneously, which yours truly happens
to have at the time of this writing.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://profile.mygamercard.net/masukomi&#34;&gt;&lt;img src=&#34;http://card.mygamercard.net/sig/masukomi.png&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Logitech DriveFX == teh suck</title>
      <link>https://weblog.masukomi.org/2008/02/26/logitech-drivefx-teh-suck/</link>
      <pubDate>Tue, 26 Feb 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/02/26/logitech-drivefx-teh-suck/</guid>
      <description>&lt;p&gt;So, I really like Burnout Paradise. I love just driving around the city
setting new speed records for others to try and beat. I enjoy it so much
I decided to pony up the $100 to get the &lt;a href=&#34;http://www.xbox.com/en-US/hardware/x/xbox360wirelessracingwheel/default.htm&#34; title=&#34;Microsoft Wireless Racing Wheel&#34;&gt;Microsoft Wireless Racing
Wheel&lt;/a&gt; but when I got to GameStop there was another option: the &lt;a href=&#34;http://www.logitech.com/index.cfm/gaming/xbox_360/devices/299&amp;amp;cl=us,en&#34; title=&#34;Logitech DriveFX&#34;&gt;Logitech DriveFX&lt;/a&gt;,
and it was $50 cheaper. &amp;ldquo;What&amp;rsquo;s the difference?&amp;rdquo; I asked. &amp;ldquo;The Logitech
one isn&amp;rsquo;t wireless.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I looked at the box and thought&amp;hellip; &amp;ldquo;For $50 I don&amp;rsquo;t care about
wireless.&amp;rdquo; And, Logitech tends to make good hardware. Then I got it home
and found its fatal flaw. You can&amp;rsquo;t hold it in your lap. It&amp;rsquo;s got these
two clamps that allow you to easily clamp it to a table. The only
problem is that everyone I know only has a coffee table, about
knee-high, in their living room. This means you&amp;rsquo;d have to lean over it
like an adult crammed into a kids go-kart. Then there&amp;rsquo;s the pedals.
Where are you supposed to put the pedals? You can&amp;rsquo;t sit on a couch, pull
a coffee table close enough to use a steering wheel clamped to it, and
then somehow put your legs out under it. You&amp;rsquo;d need to add a backwards
knee half way down your shin.&lt;/p&gt;
&lt;p&gt;The clamps don&amp;rsquo;t come off, and stick out uncomfortably from the bottom.
Even if i was willing to dismantle the thing to get them off it&amp;rsquo;s not
wide enough to really sit on your lap so you&amp;rsquo;d have to clamp it between
your thighs which would get really uncomfortable really fast. If you try
and set it on your legs, instead of between them, there&amp;rsquo;s nothing in the
design to hold it steady so it&amp;rsquo;ll just keep shifting around.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s going back tomorrow and I&amp;rsquo;m shelling out the extra $50 for the
Microsoft one, which can optionally clamp to a table but is designed to
sit on your lap. Thus putting the steering wheel where you need it and
the pedals out at the end of your extended legs, just like oh, I
dunno&amp;hellip; a &lt;em&gt;car&lt;/em&gt; maybe?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Zombies!!! Player Turn Flow chart</title>
      <link>https://weblog.masukomi.org/2008/02/22/zombies-player-turn-flow-chart/</link>
      <pubDate>Fri, 22 Feb 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/02/22/zombies-player-turn-flow-chart/</guid>
      <description>&lt;p&gt;I decided to make a flow chart to help new players in an upcoming attack
of &lt;a href=&#34;http://www.boardgamegeek.com/game/2471&#34;&gt;Zombies!!!&lt;/a&gt;. I think I may
have gone a little overboard with the details, but it&amp;rsquo;s done now. This
represents standard rules plus the &lt;a href=&#34;http://www.boardgamegeek.com/game/28734&#34;&gt;Zombies!!! 6 (Six Feet Under)&lt;/a&gt; expansion, but you can just skip the subway and sewer bits if you don&amp;rsquo;t have that.&lt;/p&gt;
&lt;p&gt;For those of you who aren&amp;rsquo;t familiar with Zombies!!! there&amp;rsquo;s &lt;a href=&#34;http://www.boardgamegeek.com/thread/211751&#34;&gt;a good
review / overview of Zombies!!! here&lt;/a&gt;. The biggest complaint people have about it is that it can run long. A nice atypical aspect of this game is that you absolutely will / must screw over your opponents repeatedly as opposed to most games where people tend to get annoyed
with you if you do that. I liked it enough to go buy 2 expansions (3.5
and 6) and a bag of extra zombies (you&amp;rsquo;ll need &amp;rsquo;em when you have lots of
people or expansion sets with tiles). You probably have to enjoy poking
fun at the shambling zombie movie genre to enjoy this game.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2008/2/22/ZombiesFlow.pdf&#34;&gt;A PDF of the flow chart.&lt;/a&gt; &lt;a href=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2008/2/22/ZombiesFlow.png&#34;&gt;A PNG of the flow chart&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2008/2/22/ZombieFlow.graffle&#34;&gt;The OmniGraffle file&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>A rebuttal to &#34;Use Mercurial You Git&#34;</title>
      <link>https://weblog.masukomi.org/2008/02/07/a-rebuttal-to-use-mercurial-you-git/</link>
      <pubDate>Thu, 07 Feb 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/02/07/a-rebuttal-to-use-mercurial-you-git/</guid>
      <description>&lt;p&gt;There&amp;rsquo;s a good deal of confusion about Git, Ian&amp;rsquo;s &lt;a href=&#34;http://texagon.blogspot.com/2008/02/use-mercurial-you-git.html&#34;&gt;Use Mercurial You Git&lt;/a&gt; article is a good example of it which I&amp;rsquo;d like to address point by point. But first, I&amp;rsquo;d like to say that I&amp;rsquo;m giving Ian the benefit of the doubt. I don&amp;rsquo;t think he&amp;rsquo;s intentionally trying to mislead people I think he simply doesn&amp;rsquo;t understand &lt;a href=&#34;http://git.or.cz&#34; title=&#34;Git&#34;&gt;Git&lt;/a&gt; very well, and that&amp;rsquo;s not his fault.&lt;/p&gt;
&lt;p&gt;Git has two problems that face new users. It suffers from the &lt;a href=&#34;http://en.wikipedia.org/wiki/Blub&#34;&gt;Blub Paradox&lt;/a&gt; and the documentation tends to assume that you already &amp;ldquo;get&amp;rdquo; how radically different Git is. So people end up applying the assumptions of how other version control systems to how Git and end up becoming confused and frustrated like Ian, because while some of the commands look similar, what Git is doing and how it does it are dramatically different from other systems, but that&amp;rsquo;s a good thing. It&amp;rsquo;s what makes Git so much better than the competition. It&amp;rsquo;s kind of like how Struts (Java web framework) and Ruby On Rails (Ruby web framework) are both doing essentially the same thing and processing the same parameters from a web server, but if you try and program a Rails app like you program a Struts app you&amp;rsquo;re in for a world of hurt.&lt;/p&gt;
&lt;p&gt;The basic version control concepts are the same in Git, but at the same
time, they&amp;rsquo;re not. Most version control systems are concerned with
managing files, or metadata about files. Git doesn&amp;rsquo;t even care about
files. Yes, it &lt;em&gt;seems&lt;/em&gt; like it does, and you can even use it &lt;em&gt;as if&lt;/em&gt; it
does but it really doesn&amp;rsquo;t. The key for me to really buying this
statement was when I realized that, if I really wanted to, Git would let
me pick and choose between the various hunks of a file and only add the
ones I wanted to the next commit.&lt;/p&gt;
&lt;p&gt;My advice to new users is simple. To get started, act as if it&amp;rsquo;s like
the version control system you&amp;rsquo;re familiar with, &lt;em&gt;but&lt;/em&gt; as soon as
something doesn&amp;rsquo;t work the way you&amp;rsquo;d expect take the time to learn what
is really happening and why Git is doing it. Every single time this has
happened for me I have obtained another &amp;ldquo;aha!&amp;rdquo; moment which gave me a
significantly better understand of Git as a whole and showed me how
truly awesome git really is.&lt;/p&gt;
&lt;p&gt;So, with that said, let&amp;rsquo;s look at Ian&amp;rsquo;s complaints:&lt;/p&gt;
&lt;h3 id=&#34;installed-files&#34;&gt;Installed Files&lt;/h3&gt;
&lt;p&gt;When talking about Git&amp;rsquo;s usability Ian complains that Git installs
&amp;ldquo;nearly 150 distinct binaries&amp;rdquo; and claims that &amp;ldquo;Mercurial has one.&amp;rdquo; What
Ian doesn&amp;rsquo;t mention is that while Git may install nearly 150 files you
only have to reference one of them directly &lt;em&gt;just like Mercurial&lt;/em&gt; which
installs over 150 files (a number which roughly doubles as each .py file
begets a binary .pyc file after it gets executed).&lt;/p&gt;
&lt;p&gt;But, this is a straw-man argument because it doesn&amp;rsquo;t matter how many files an
application installs, and it doesn&amp;rsquo;t matter if they&amp;rsquo;re binary or not.
What&amp;rsquo;s a much more important measure is how many you have to interact
with &lt;em&gt;directly&lt;/em&gt; and in both cases the answer is one.&lt;/p&gt;
&lt;p&gt;The confusion is probably a result of the fact that Git actually allows you to call its
component parts directly &lt;em&gt;if you really want to&lt;/em&gt;, whereas Hg does not.
Another good example of this is Dreamweaver, which installs a metric
fuckload of files, including a little JavaScript file for almost every
one of the cool pieces of functionality. But you never hear newbish web
developers complaining about it because they never have to interact with
them directly. However, power users love the fact that they &lt;em&gt;can&lt;/em&gt; work
with them directly (and change how Dreamweaver works).&lt;/p&gt;
&lt;h3 id=&#34;usability&#34;&gt;Usability&lt;/h3&gt;
&lt;p&gt;Ian uses Git&amp;rsquo;s rebase command as an example of why Git&amp;rsquo;s usability is
bad. Rebase is one of the most dramatically powerful tools in the Git
arsenal, it&amp;rsquo;s also something you &lt;em&gt;never&lt;/em&gt; have to use if you don&amp;rsquo;t want
to. It allows you to reorder, merge, and exclude any / all of the
commits in your history.&lt;/p&gt;
&lt;p&gt;But guess what? Ian doesn&amp;rsquo;t mention the fact that Mercurial has a similar functionality called Transplant which is roughly as easy to get confused about using as Git&amp;rsquo;s rebase functionality. Of course you don&amp;rsquo;t have to ever use it in Mercurial either, as evidenced by his not knowing about it. I&amp;rsquo;m assuming he wasn&amp;rsquo;t intentionally trying to make Git look bad by ignoring Transplant. The fact that the Rubinius project he was looking at requests that committers use it for it&amp;rsquo;s valuable housekeeping aspects is irrelevant to the discussion of Git&amp;rsquo;s usability.&lt;/p&gt;
&lt;p&gt;He then goes on to say that &amp;ldquo;For day-to-day use of Mercurial, you only need hg fetch to get code, and hg commit to give code.&amp;rdquo; except commit only works on a local repo and doesn&amp;rsquo;t &amp;ldquo;give&amp;rdquo; code to anyone, and my fairly recent copy of Hg only has a &amp;ldquo;pull&amp;rdquo; command but I do see mention in Google that fetch is &amp;ldquo;&amp;hellip;only available when you enable hgext.fetch extension&amp;hellip;&amp;rdquo;. So, what he should have said (unless we want to include non-default commands) is that for day-to-day use of Mercurial, you only need hg pull &amp;amp;&amp;amp; hg up &amp;amp;&amp;amp; hg merge &amp;amp;&amp;amp; hg commit to get code and hg push to give code.&amp;quot; If we cut him some slack and replace all that garbage with hg fetch and compare it to Git where you need git pull to get code and git push to give code you&amp;rsquo;ll see that the two are almost identical. In fact, for a surprising number of operations Git and Hg use exactly the same name for the same command.&lt;/p&gt;
&lt;h3 id=&#34;overloaded-commands&#34;&gt;Overloaded Commands&lt;/h3&gt;
&lt;p&gt;Ian complains about the fact that git checkout can do three &amp;ldquo;massively
different tasks&amp;rdquo;: change to a new head, revert changes to a small number
of files, and create a branch. And from a the perspective of someone who
doesn&amp;rsquo;t understand Git &lt;em&gt;or&lt;/em&gt; version control systems I can see why they
might look &amp;ldquo;massively different&amp;rdquo;. But, lets look at them from the
perspective of someone who &lt;em&gt;does&lt;/em&gt; understand Git &lt;em&gt;and&lt;/em&gt; version control a
little better.&lt;/p&gt;
&lt;p&gt;First off, if you don&amp;rsquo;t know, &amp;ldquo;change to a new HEAD&amp;rdquo; is an odd way of
saying switch to a different branch (HEAD is just a convenient pointer
to the current branch). When you grab a branch from most version control
systems repositories the operation is referred to as &amp;ldquo;checking out&amp;rdquo; the
code/branch so when you replace the tree in your current directory with
that of another branch you are literally &amp;ldquo;checking out&amp;rdquo; the code from
the repository which is what every system does when you request the
files from a branch. But, if &amp;ldquo;checking out&amp;rdquo; a branch was confusing for
him, he could simply keep each branch in a separate folder like most
revision control systems do and just change directories.&lt;/p&gt;
&lt;p&gt;To cut him some more slack git &lt;em&gt;allows&lt;/em&gt; you to manage multiple branches
within the same repo which entails managing multiple branches in the
same &lt;em&gt;folder&lt;/em&gt;. And yes, the power to manage totally different branches
in the same place, does require some new learning, and has some
potential gotchas if you don&amp;rsquo;t understand how it works, but note that I
said &amp;ldquo;allows you to manage&amp;rdquo; not &lt;em&gt;requires&lt;/em&gt;. You can live in the simpler
one branch per root folder world if you want and there&amp;rsquo;s no real penalty
to doing so. Actually, I encourage new users to work that way. It&amp;rsquo;s a
simpler way to get started. And yes, to be clear, each folder would be a
different repo, but Git&amp;rsquo;s smart and hardlinks the common objects (unless
you tell it not to) to save space and merging branches in across repos
is just a matter of git pull instead of git merge.&lt;/p&gt;
&lt;p&gt;When you &amp;ldquo;revert changes to a small number of files&amp;rdquo; Git, like any
other version control system, gets a copy from the repository, and what
do you call the action of getting files from a repository? That&amp;rsquo;s right
kids, &amp;ldquo;checking out&amp;rdquo;. The fact that git calls it what it is instead of
giving it some misleading name like CVS&amp;rsquo;s &amp;ldquo;update&amp;rdquo; command, which
doesn&amp;rsquo;t &amp;ldquo;update&amp;rdquo; shit but instead checks out a version from the repo,
should be a point in Git&amp;rsquo;s favor not a point against it.Hg calls this
operation &amp;ldquo;update&amp;rdquo; too but &amp;ldquo;checkout&amp;rdquo; is an alias for it*, so I guess
they get to make it work the way the CVS / SVN people &lt;em&gt;and&lt;/em&gt; Git people
expect.&lt;/p&gt;
&lt;p&gt;His argument about checkout enabling you to create a branch is a fair
one, but isn&amp;rsquo;t it nicer to be able to create the branch and check it out
in one command instead of two? If Ian was really confused by this he
could simply create it with &amp;ldquo;git branch &amp;quot; and then check it out with
&amp;ldquo;git checkout &amp;ldquo;. Personally I prefer the combined form since I&amp;rsquo;m
creating them &lt;em&gt;all the time&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;In writing this book on Git I have repeatedly come across situations
where a command took options that made it seem to do &amp;ldquo;massively
different tasks&amp;rdquo; but when I spent the time to investigate what it was
&lt;em&gt;really&lt;/em&gt; doing I almost always found that the problem was simply that I
had been applying behavioral expectations from other version control
systems to Git without understanding the fundamentals of how things work
in Git. Now, helping people to understand the its fundamentals is
something that Git&amp;rsquo;s docs are not particularly good at. They tend to
tell you how to execute a command and assume you understand what&amp;rsquo;s
happening (at a conceptual level) behind the scenes. This is one of the
things I&amp;rsquo;m trying to address with the book. &amp;ldquo;git add&amp;rdquo; is a great example
of this. If you don&amp;rsquo;t really understand how Git leverages its index
you&amp;rsquo;ll be bewildered as to all those &amp;ldquo;massively different tasks&amp;rdquo; you can
do with it, but once you understand the index they all make sense and
you realize that &amp;ldquo;add&amp;rdquo; is exactly where they should be.&lt;/p&gt;
&lt;h3 id=&#34;simplicity&#34;&gt;Simplicity&lt;/h3&gt;
&lt;p&gt;He says that Git has lost the &amp;ldquo;simplicity argument&amp;rdquo;. But the basics of
Git are, in fact, very simple to use. If you wanted to you could use it
in almost exactly the same way you use CVS with commands of essentially
similar complexity, and CVS is a very simple system. But, Git also
offers you the power to do very complex things. And that&amp;rsquo;s exactly how I
wish every piece of software I used was.&lt;/p&gt;
&lt;p&gt;Let me give you an example of how simple things can be:&lt;/p&gt;
&lt;table style=&#34;text-align: left;&#34; border=&#34;1&#34; cellpadding=&#34;2&#34; cellspacing=&#34;2&#34;&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Operation&lt;/td&gt;
      &lt;td&gt;CVS&lt;/td&gt;
      &lt;td&gt;Git&lt;/td&gt;
      &lt;td&gt;Hg&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;checkout a repo&lt;/td&gt;
      &lt;td&gt;cvs co &lt;some_url&gt;&lt;/td&gt;
      &lt;td&gt;git clone &lt;some_url&gt;&lt;/td&gt;
      &lt;td&gt;hg clone &lt;some_url&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;add a file&lt;/td&gt;
      &lt;td&gt;cvs add &lt;some_file&gt;&lt;/td&gt;
      &lt;td&gt;git add &lt;some_file&gt;&lt;/td&gt;
      &lt;td&gt;hg add &lt;some_file&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;replace a file with the version last checked in&lt;/td&gt;
      &lt;td&gt;cvs update &lt;some_file&gt;&lt;/td&gt;
      &lt;td&gt;git checkout &lt;some_file&gt;&lt;/td&gt;
      &lt;td&gt;hg revert &lt;some_file&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;commit changes to the repo&lt;/td&gt;
      &lt;td&gt;cvs commit&lt;/td&gt;
      &lt;td&gt;git commit&lt;/td&gt;
      &lt;td&gt;hg commit&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;I could continue but you get the point. For all your basic commands
these systems are all equally simple. Yes there are complex commands
too, but there are in all version control systems.&lt;/p&gt;
&lt;p&gt;Ian quotes a bit of Git knowledge:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The core Git filesystem can be explained as four types of objects:
Blobs (files), Trees (directories), Commits and Tags.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And then says &amp;ldquo;Unfortunately, no, it can&amp;rsquo;t. The core of Git may well be
&lt;em&gt;implemented&lt;/em&gt; as four kinds of things. But to get even the most basic
tasks done, you need to know repositories, working trees, branches,
remotes, masters, origins, index caches, and a bunch of other
unexplained concepts.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;With the exception of the index (or &amp;ldquo;index cache&amp;rdquo; as he calls it) all
of these things exist in Mercurial and you also need to understand the
same ones in both. Although maybe Mercurial does have something similar
to the index for staging commits, I don&amp;rsquo;t know.&lt;/p&gt;
&lt;p&gt;You could argue that &amp;ldquo;masters&amp;rdquo; don&amp;rsquo;t exist in Hg but master is just the default name for the initial branch in a repo. They had to call it something and they picked &amp;ldquo;master&amp;rdquo;. Every version control system has at least one branch whether
or not they happen to mention it, and if you only use one branch per
repo you never have to even think about &amp;ldquo;master&amp;rdquo;. If you don&amp;rsquo;t want
to name it &amp;ldquo;master&amp;rdquo; you don&amp;rsquo;t have to.&lt;/p&gt;
&lt;p&gt;SVN has the idea of remote repositories just like Hg and Git and you don&amp;rsquo;t need to use remote repositories in &lt;em&gt;any&lt;/em&gt; of them. It&amp;rsquo;s certainly helpful if you understand
the concept but it&amp;rsquo;s not as if this is some obscure thing that Git came up with and no-one else has. To do basic CVS style operations you can be blissfully ignorant of the index in Git. All you need to know is to use the &amp;ldquo;-a&amp;rdquo; option when you commit to commit all your changes.&lt;/p&gt;
&lt;h3 id=&#34;finding-documentation&#34;&gt;Finding Documentation&lt;/h3&gt;
&lt;p&gt;He&amp;rsquo;s totally right about not being able to look up the appropriate
command in Git&amp;rsquo;s man pages without knowing what it&amp;rsquo;s called. It is
sometimes hard to find instructions for what you&amp;rsquo;re trying to do in Git.
This is another thing I&amp;rsquo;m trying to address in the book but that&amp;rsquo;s no
help to people who don&amp;rsquo;t have the book, and no excuse for it not being
better handled by the docs, but since the book will be GPL I fully
expect some of what I write to make it onto the web (I may even put it
there myself), and maybe into the docs.&lt;/p&gt;
&lt;h3 id=&#34;windows&#34;&gt;Windows&lt;/h3&gt;
&lt;p&gt;He&amp;rsquo;s also right about Git sucking on Windows, although he doesn&amp;rsquo;t put it
that way, and this is the biggest reason &lt;em&gt;not&lt;/em&gt; to use Git. If you need
to share your codebase with Windows users Git is, IMNSHO, simply not
ready. It can be done with Cygwin but Mercurial is much less of a hassle
on Windows. There is work being done to address this, but for now Git is
primarily for Linux, Unix, and OS X.&lt;/p&gt;
&lt;p&gt;[Update] Since this was written the Git tooling has improved dramatically on Windows and there are a number different, and good, ways to interact with it.&lt;/p&gt;
&lt;h3 id=&#34;unreliability&#34;&gt;Unreliability&lt;/h3&gt;
&lt;p&gt;He also complains about Git being unreliable but doesn&amp;rsquo;t back it up in
this post. I&amp;rsquo;ve seen no evidence to this effect or mention of any on the
web, but I&amp;rsquo;m betting that his problems with Git&amp;rsquo;s &amp;ldquo;reliability&amp;rdquo; will be
based in similar misunderstandings of how Git works. Which would mean
that Git needed to work on it&amp;rsquo;s documentation to help improve people&amp;rsquo;s
understanding.&lt;/p&gt;
&lt;h3 id=&#34;closing-thoughts&#34;&gt;Closing Thoughts&lt;/h3&gt;
&lt;p&gt;Ian makes a lot of complaints about how much worse Git is than Hg, but
in almost all cases if you examine the truth behind what he says you end
up with Git and Hg coming out almost exactly the same. The places where
Mercurial wins are Windows support and, probably, documentation. Both of
these are very important, but neither of them make the tool more
functional. For everyday simple usage Hg and Git are roughly equivalent
tools, from a usage standpoint (assuming you understand how to use
them), but I believe that Git is simply a more powerful tool that lets
you go much farther beyond the &amp;ldquo;everyday simple usage&amp;rdquo;. Yes, it requires
thinking differently about version control. Is that really so bad? Most
of the programming tools that can dramatically enhance your
productivity, or capabilities require getting your head around new
concepts. Git really isn&amp;rsquo;t hard, it&amp;rsquo;s just different. Think of it like a
harp. It&amp;rsquo;s simple to understand how to play and it looks like plucking
it would be the same as plucking any other stringed instrument, but it
really isn&amp;rsquo;t and you&amp;rsquo;re going to have to get used to it because your
fingers interact with it like nothing else, and you&amp;rsquo;re not going to be
able to take it everywhere either.&lt;/p&gt;
&lt;p&gt;On a related note: Ian&amp;rsquo;s gripes are primarily founded in issues about
usability the failure of Git&amp;rsquo;s documentation to help him understand it,
but based on those criteria &lt;a href=&#34;http://www.darcs.net&#34;&gt;Darcs&lt;/a&gt; kicks
everyone&amp;rsquo;s ass. I don&amp;rsquo;t recommend Darcs anymore for a number of reasons,
but, with a couple exceptions, Darcs is &lt;em&gt;damn easy&lt;/em&gt; to use and it&amp;rsquo;s not
a bad system at all.&lt;/p&gt;
&lt;p&gt;P.S. Thanks for the correction on Mercurial Lurker and thanks SJS for your
notes about CVS.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The rules of Presidential Bitching</title>
      <link>https://weblog.masukomi.org/2008/02/06/the-rules-of-presidential-bitching/</link>
      <pubDate>Wed, 06 Feb 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/02/06/the-rules-of-presidential-bitching/</guid>
      <description>&lt;p&gt;The rules of Presidential Bitching are quite simple:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Everyone gets to bitch about all things presidential until the
primaries.&lt;/li&gt;
&lt;li&gt;After the primaries only the people who voted (or honestly intended
to but were thwarted) can bitch about the candidates and party
nominations. Everyone can bitch about general presidential issues.&lt;/li&gt;
&lt;li&gt;After the election only the people who voted (or honestly intended
to but were thwarted) can bitch about anything our president does or
how much better off we&amp;rsquo;d be if someone else had of won.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Reserve your right to bitch. Vote!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Remember: you can vote on a provisional ballot if you neglected to
register to vote.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Some thoughts about Git</title>
      <link>https://weblog.masukomi.org/2008/02/04/some-thoughts-about-git/</link>
      <pubDate>Tue, 05 Feb 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/02/04/some-thoughts-about-git/</guid>
      <description>&lt;p&gt;Not too long ago I decided to start writing a book about distributed
version control. I was originally going to focus on
&lt;a href=&#34;http://www.selenic.com/mercurial/wiki/&#34; title=&#34;Mercurial&#34;&gt;Mercurial&lt;/a&gt; (Hg)
because it&amp;rsquo;s quite good and of the two leading systems it was the only
one that ran on every OS (because it was written in Python). The fact
that it could also run under Windows meant that I could help spread the
word about distributed version control to more people, and it slightly
increased the chance that I might actually make some money in the
process.&lt;/p&gt;
&lt;p&gt;There was just one problem: Linus was right.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Hg is pretty good, but &lt;a href=&#34;http://git.or.cz/&#34; title=&#34;Git&#34;&gt;Git&lt;/a&gt; is better.&amp;rdquo; -
Linus Torvalds&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When I heard him utter those words in his talk to the folks at Google I
took them with a grain of salt. Almost every project owner believes that
their software is &amp;ldquo;better&amp;rdquo; than the competition, especially when they&amp;rsquo;re
so similar, but it turns out that it wasn&amp;rsquo;t hubris on his part. When you
sit down and compare the functionality Git simply lets you do more.&lt;/p&gt;
&lt;p&gt;I had actually started writing the book about Hg but time and again I
found myself confronted with something that was either easier to do in
Git, or simply not possible in Hg. It happened enough that I decided
that I didn&amp;rsquo;t want to keep writing about, and arguably helping, out a
product that I not only wouldn&amp;rsquo;t choose to use myself but also felt was
dramatically inferior from a usage standpoint.&lt;/p&gt;
&lt;p&gt;And then I joined the Git mailing list. Linus mentioned that it had a
high signal to noise ratio but&amp;hellip; holy shit. I have been on a lot of
mailing lists for open source projects over the years and I have never
seen anything like this. Almost every e-mail is a patch, or a good
discussion of a patch, or a good discussion of some new feature and how
to go about implementing it. Currently, one of the topics they&amp;rsquo;re
discussing is how to allow people to push to a Git repo based on GPG
keys stored in, or accessible by, Git. What&amp;rsquo;s amazing is that it isn&amp;rsquo;t
just one or two people going back and forth or someone trying to
proclaim the &amp;ldquo;one true way&amp;rdquo; to do things. It&amp;rsquo;s exactly what you would
expect if you took a bunch of smart geeks, stuck them in a room, and
watched them all work together to solve some common problem. That alone
is impressive, but when you combine that with the fact that it&amp;rsquo;s a
pretty high traffic list and you&amp;rsquo;ve got a lot of really smart people
pushing a tool forwards at an incredible pace.&lt;/p&gt;
&lt;p&gt;Now, all is not sunshine and roses in Git land:&lt;/p&gt;
&lt;p&gt;The documentation is actually pretty good, but when you want to do a
specific task and don&amp;rsquo;t know the Git specific terminology for it it can
be a little difficult to find what you need, and sometimes the commands
take a dizzying array of options and could really do with more examples.
That works out well for me, because it&amp;rsquo;ll be all the more reason for
people to buy my book, but it&amp;rsquo;s obviously not great for attracting new
users. I still think that, for most use cases, Darcs does a better job
than anyone at making it easy to ferret out what command you need to
accomplish a task.&lt;/p&gt;
&lt;p&gt;Git is a lot like C. It&amp;rsquo;s incredibly flexible and powerful but it is
also incredible flexible and powerful. If you want to shoot yourself in
the foot Git will point you to the gun rack and show you how to load the
bullets.&lt;/p&gt;
&lt;p&gt;Under the covers Git is a collection of small C apps surrounded by
shell scripts, Perl scripts, Python scripts&amp;hellip;. whatever the author
chose to get the job done. From a usability standpoint this is
irrelevant. Calling &amp;ldquo;git foo&amp;rdquo; is going to work just as well regardless
of what foo was written in and will have no impact on the user, but I&amp;rsquo;d
personally prefer to hack on a project that was all written in one
language.&lt;/p&gt;
&lt;p&gt;It also means that the &lt;a href=&#34;http://code.google.com/p/msysgit/&#34;&gt;msysgit&lt;/a&gt; team has a lot of work
ahead of them in trying make it install easily under Windows. If you&amp;rsquo;d
like to see git working under Windows, and are familiar with coding for
Windows please check these guys out and see if there&amp;rsquo;s anywhere you can
help out. Even just taking on a little task here and there is something
that would be greatly appreciated. Part of me wonders if it wouldn&amp;rsquo;t be
better to just port everything in Git to C.&lt;/p&gt;
&lt;p&gt;I think that if the Git book goes over well I may go back and retool it
for Mercurial, but in the meantime I have to agree with &lt;a href=&#34;http://tytso.livejournal.com/294672.html&#34;&gt;Ted Tso&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;&amp;hellip;the main reason why I&amp;rsquo;ve come out in favor if Git is that I see
its potential as being greater than [that of] Hg, and&amp;hellip; in the long
run I think it has &amp;lsquo;more legs&amp;rsquo; than Hg&amp;hellip;&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Just to be totally up front. Ted did have some complaints about ease
of use and documentation, but I think that since his post came out Git
has made some really significant improvements in those areas.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Bullitt with Steve McQueen [Review]</title>
      <link>https://weblog.masukomi.org/2008/01/25/bullitt-with-steve-mcqueen-a-review/</link>
      <pubDate>Fri, 25 Jan 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/01/25/bullitt-with-steve-mcqueen-a-review/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m convinced that there must be two &amp;ldquo;Bullitt&amp;rdquo; movies with Steve
McQueen. Because all the reviews seem to talk about one of the best
action movies ever, the best car chase ever, a great story. They use
words like &amp;ldquo;thriller&amp;rdquo;, &amp;ldquo;epic&amp;rdquo;, and &amp;ldquo;gritty&amp;rdquo;, but none of these things
apply to the film I saw.&lt;/p&gt;
&lt;p&gt;The director made sure that whenever the audience came within view of a
potentially tense moment to quickly salve their nerves with &lt;em&gt;at least&lt;/em&gt;
ten minutes of sleep inducing banter, bored toothpick chewing, newspaper
and frozen diner purchasing, car washing, clicky machine watching, plane
embarkment and disembarkment, and, of course, coffee house music.
Nothing is resolved in the end. And the plot is essentially: witness
gets shot, cops slowly work their way from one clue to the next, as they
learn more about why the man was killed. Eventually more people get
shot, and no-one cares. I&amp;rsquo;m not kidding. No-one cares. The guy who was
impatient to get the witness&amp;rsquo;s testimony starts reading his newspaper,
Steve goes home and washes his hands in the bathroom sink, and the
credits roll. The end.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m convinced that it would be possible to induce a heart attack in the
director simply by going back in time and showing him a modern action
flick like The Bourne Identity. And the infamous 100 Mph car chase
through San Francisco? It was quite possibly the most boring car chase
I&amp;rsquo;ve ever seen. It&amp;rsquo;s entirely possible that this was a great action
flick by the standards of it&amp;rsquo;s day, but it&amp;rsquo;s not by today&amp;rsquo;s.&lt;/p&gt;
&lt;p&gt;On the up side, they did a great job with the transfer to HD so you can
watch the boredom in all its glory.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>What if I were to write my personal?</title>
      <link>https://weblog.masukomi.org/2008/01/22/what-if-i-were-to-write-my-personal/</link>
      <pubDate>Tue, 22 Jan 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/01/22/what-if-i-were-to-write-my-personal/</guid>
      <description>&lt;p&gt;What if I were to write my personal?&lt;br&gt;
What if it were true?&lt;br&gt;
What if it spelled out in black and white the things I want in you?&lt;br&gt;
What if it held nothing back: my faults, my hopes, my geek&amp;hellip;&lt;/p&gt;
&lt;p&gt;There are things I want&lt;br&gt;
you&amp;rsquo;ll never be.&lt;br&gt;
There are things you want&lt;br&gt;
I&amp;rsquo;ll never have.&lt;br&gt;
But maybe&amp;hellip; just maybe&amp;hellip;&lt;br&gt;
that&amp;rsquo;s the way it&amp;rsquo;s meant to be.&lt;/p&gt;
&lt;p&gt;Perfect little imperfections,&lt;br&gt;
that together make up me.&lt;br&gt;
Perfect little imperfections,&lt;br&gt;
that define who we could be.&lt;/p&gt;
&lt;p&gt;Thoughts, feelings,&lt;br&gt;
wishes, dreams&amp;hellip;&lt;br&gt;
Secrets.&lt;/p&gt;
&lt;p&gt;Imperfections.&lt;br&gt;
Misconceptions.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d love to write my personal&lt;br&gt;
and show it here to you,&lt;br&gt;
but I know it won&amp;rsquo;t be seen&lt;br&gt;
by only you and me.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s too dangerous to be open&lt;br&gt;
so we put on little shows,&lt;br&gt;
that make a pretty face&lt;br&gt;
to bring you to your toes.&lt;/p&gt;
&lt;p&gt;Single white geeky guy seeks&amp;hellip;.
what? Love Family. The kiss&lt;br&gt;
of a beautiful woman?&lt;br&gt;
Yeah, &lt;em&gt;that&amp;rsquo;s it&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Joy&lt;/strong&gt;: closeness, comfort, laughter, surprises, tenderness, patience, support,
desire, ambition, strength, confidence&amp;hellip;&lt;/p&gt;
&lt;p&gt;Further adjectives, adverbs, nouns and more available upon receipt of same.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Pidgins Aren&#39;t DSLs</title>
      <link>https://weblog.masukomi.org/2008/01/19/pidgins-arent-dsls/</link>
      <pubDate>Sat, 19 Jan 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/01/19/pidgins-arent-dsls/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.bofh.org.uk/articles/2008/01/18/martin-fowlers-big-mouthful&#34; title=&#34;Piers Cawley just posted&#34;&gt;Piers Cawley just posted&lt;/a&gt;
about Martin Fowler&amp;rsquo;s attempt to write a book about DSL&amp;rsquo;s actually,
&amp;ldquo;internal DSLs&amp;rdquo;. Piers calls these &amp;ldquo;Pidgins&amp;rdquo; and I think it&amp;rsquo;s a pretty
good term for them.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;These are the sorts of languages where you don’t write a lexer or
parser but instead build a family of objects, methods, functions or
whatever other bits and pieces your host language provides in order to
create a part of your program that, while it is directly interpreted
by the host language, feels like it’s written in some new dialect. -
Piers Cawley&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Unfortunately ever since Ruby on Rails came out everybody (except Piers)
seems to have forgotten what a real DSL is and it&amp;rsquo;s been driving me
batty. Rails is not a DSL it&amp;rsquo;s a Pidgin. And it seems as if every post
about writing DSLs since RoR has actually been a post about writing
Pidgins. Which sucked because I was actually
interested in writing DSLs but the only references I could find
essentially said &amp;ldquo;you need to write a lexer and a parser, maybe generate
an &lt;a href=&#34;http://en.wikipedia.org/wiki/Abstract_syntax_tree&#34; title=&#34;Abstract Syntax Tree&#34;&gt;AST&lt;/a&gt;.
Go use YACC or Bison&amp;rdquo;. Which didn&amp;rsquo;t help me one bit because while I knew what a lexer and a parser were I certainly didn&amp;rsquo;t want to reinvent the
wheel about how to generate them and even now I&amp;rsquo;m still a little unclear
on what an AST is under the covers.&lt;/p&gt;
&lt;p&gt;I know what they let you do but not
how they&amp;rsquo;re stored or accessed. Also, using YACC always seemed like it
would involve journeys into unix obscurity and uber-geekdom. It may
actually be trivial to use, I have no idea. And then, &lt;a href=&#34;http://www.warneronstine.com/&#34; title=&#34;Warner Onstine&#34;&gt;thanks to a
friend&lt;/a&gt;, I was
introduced to ANTLR.&lt;/p&gt;
&lt;p&gt;OMFGWTFBBQ. ANTLR is the bees knees. It&amp;rsquo;s got a
very nice IDE (ANTLRWorks) in which you write out your grammar using an
EBNF-like notation. It will show you the Syntax Diagram of the rule
you&amp;rsquo;re currently working on, and has an interpreter and debugger. Then,
for most simple DSLs, you just hook a little code to be executed or
returned at various parts of your grammar, click &amp;ldquo;Generate Code&amp;rdquo;, and
you&amp;rsquo;re done. I&amp;rsquo;m not kidding. It&amp;rsquo;s that freaking simple.&lt;/p&gt;
&lt;p&gt;ANTLR builds you a lexer and a parser from your grammar, inserts the native method
calls you specified and outputs classes for you to stick in the app
that&amp;rsquo;s going to be reading in the DSL. Now by default ANTLR&amp;rsquo;s focused on
Java, but according to the docs you can also generate Python, C#, C++,
and more. AND, if you&amp;rsquo;re writing a language that&amp;rsquo;s going to do some
pretty heavy duty work (like Python for example) then you can also have
ANTLR generate an AST for its parser to use which will speed up
processing dramatically. I haven&amp;rsquo;t explored this part of ANTLR yet so I
can&amp;rsquo;t comment on it. If you&amp;rsquo;re interested in writing your own DSL (a
real DSL not a fucking Pidgin) I highly recommend that you grab &lt;a href=&#34;http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;amp;location=http://www.amazon.com/Definitive-ANTLR-Reference-Domain-Specific-Programmers/dp/0978739256?ie=UTF8&amp;amp;s=books&amp;amp;qid=1200631708&amp;amp;sr=8-1&amp;amp;tag=masukomiorg-20&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=9325&#34;&gt;the
ANTLR
book&lt;/a&gt;
(it&amp;rsquo;s very well done) and start playing with ANTLR. If you&amp;rsquo;re not going
to be leveraging your DSL from Java you may need to grab the latest
version of ANTLR from SVN and you&amp;rsquo;ll definitely have to read some more
of the docs on the site about making it output code in your language of
choice.&lt;/p&gt;
&lt;p&gt;I was able to get my head around ANTLR, write a grammar for my
small language, and then hook in the code to generate a parser that
actually did something in roughly one work day. Next week we&amp;rsquo;re having a
brainstorming session at work to see just how far we can take this
language and what systems we&amp;rsquo;d like to retool to take advantage of it.
So please people, stop confusing DSLs with Pidgins and stop writing
about Pidgin&amp;rsquo;s as if they were DSLs. There are so many good reasons to
write real DSLs to help in whatever problem domain your applications are
addressing, and no good reason to limit yourself to a Pidgin. Real DSLs, like SQL for example, can be leveraged from code in any language and be incredibly useful in their domain.&lt;/p&gt;
&lt;p&gt;P.S. You should really go read Piers&amp;rsquo; article. It makes some really good points and is covering a different,
although related, topic to this one.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Convert textual RSS feeds into podcasts</title>
      <link>https://weblog.masukomi.org/2008/01/08/convert-textual-rss-feeds-into-podcasts/</link>
      <pubDate>Tue, 08 Jan 2008 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2008/01/08/convert-textual-rss-feeds-into-podcasts/</guid>
      <description>&lt;p&gt;[EDIT] Odiogo is now some sort of Japanese Car site. As such, this page
has been obsoleted by yet another cool proprietary product disappearing.&lt;/p&gt;
&lt;p&gt;Odiogo will take your blog&amp;rsquo;s rss feed and run
it through a text-to-speech converter so that people can subscribe to it
as a podcast. It&amp;rsquo;ll, obviously, have the same quirks as any other
text-to-speech converter and is, probably, limited to English but it&amp;rsquo;s a
pretty nifty idea, even if their name is a total rip-off (Odiogo makes
rss into podcasts Odeo manages rss feeds of podcasts). Also, they seem
to have done a really good job with the intonation of the computer
voice.&lt;/p&gt;
&lt;p&gt;Ironically I found out about this from &lt;a href=&#34;http://www.stonedeafpilots.com/&#34;&gt;a deaf blog&lt;/a&gt;. Creating a podcast via normal
means would be tricky for a deaf person (you&amp;rsquo;d have to edit exclusively
by sound wave patterns), and, with no disrespect meant, people born deaf
tend to sound a little off when speaking, and I would assume that most
of them would lack confidence in their speech. I&amp;rsquo;m know I would. So,
this is a great way for deaf bloggers to offer podcasts. Plus, the idea
of &lt;em&gt;listening&lt;/em&gt; to a deaf blog is just so wonderfully contradictory.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>A New Year&#39;s Eve Tradition</title>
      <link>https://weblog.masukomi.org/2007/12/30/a-new-years-eve-tradition/</link>
      <pubDate>Sun, 30 Dec 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/12/30/a-new-years-eve-tradition/</guid>
      <description>&lt;p&gt;I learned this many years ago from my first love, and she, I suspect,
from her mother. It&amp;rsquo;s a simple and fun thing that&amp;rsquo;s always better with
friends and family. In the end everyone will have a collage to help them
to not loose sight of their dreams through the coming year.&lt;/p&gt;
&lt;p&gt;**Step one:**Gather up all the magazines in your house. If you don&amp;rsquo;t
have many / any get everyone who will be participating down to your
local news-stand and have them all grab some magazine that reflect their
interests in life.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step two:&lt;/strong&gt; You&amp;rsquo;ll need scissors, glue (preferably glue sticks), and
something to mount your collages on. You can cut up cardboard boxes, or
go to your local crafts store for some paperboard, or foam-core if you
want to get fancy. I think paperboard is probably best because it&amp;rsquo;s thin
enough to stick a push-pin through to mount it to your wall when you&amp;rsquo;re
done.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step three:&lt;/strong&gt; About half an hour before midnight stick all the
magazines in a communal pile, and make sure everyone has scissors. Start
thinking about all the things you want to bring into your life next
year. They can be mundane, spiritual, health, anything. Now find
pictures in the magazines than represent these ideas to you and cut them
out. When you&amp;rsquo;re ready start sticking them to your board. I seem to
remember it taking about an hour and a half, maybe a little more, but
it&amp;rsquo;s a wonderful way to usher in the new year, with hopes and dreams in
your heart. Making your collages always ends up being a great social
activity. Everyone&amp;rsquo;s talking about what each other wants in the new
year, and how to get there, or why they didn&amp;rsquo;t get there this year, and
those discussions engender lots of interesting tangential ones. It&amp;rsquo;s a
blast.&lt;/p&gt;
&lt;p&gt;Everyone gets to see everyone else&amp;rsquo;s collage, but no-one has to explain
what each item on their collage means if they don&amp;rsquo;t want to. Sometimes
the images have very personal meanings.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step four:&lt;/strong&gt; Take your collage and hang/place it somewhere where
you&amp;rsquo;ll look at it every day for the coming year: bedroom, bathroom,
desk, wherever. Your collage will help keep you on track towards what
you really want in your life, and help keep some of those things from
falling by the wayside. This is just as important as the making of it.&lt;/p&gt;
&lt;p&gt;Let me know how it goes if you try it out this New Year&amp;rsquo;s Eve.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Follow your bliss, then write your tests</title>
      <link>https://weblog.masukomi.org/2007/12/27/follow-your-bliss-then-write-your-tests/</link>
      <pubDate>Thu, 27 Dec 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/12/27/follow-your-bliss-then-write-your-tests/</guid>
      <description>&lt;p&gt;_why suggested that&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;chaos is an essential component of writing code. The system is too
big for you to fathom. So you are always finding yourself in
unfamiliar territory. And once you fathom the system, it becomes too
boring and tedious to pay attention to details&amp;hellip;&lt;/p&gt;
&lt;p&gt;&amp;hellip;Unit testing, in particular, is designed to reel in spontaneous
hacking. It is like framing a picture before it has been painted.
Hacking, at heart, will continue to be something of spontaneous order,
something of anarchy, and the landscape of hacking is something which
comes from human action but is not of human design.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I, as you already know, am a huge advocate of unit testing, constantly
poking my coworkers to get off their asses and cover all of ours by
writing the tests I believe our code so desperately needs&amp;hellip;&lt;/p&gt;
&lt;p&gt;But unit testing doesn&amp;rsquo;t have to be an either or proposition, and I am
in full agreement with the essence of _why&amp;rsquo;s message. Some of the
greatest hacks, like some of the greatest stories, have come from
simply opening yourself up to possibilities and seeing where they take
you. There are many good arguments to be made for Test Driven
Development, but when I&amp;rsquo;m writing the really cool code, I frequently
haven&amp;rsquo;t a clue where the methods will take me. But that&amp;rsquo;s not a valid
excuse for blowing off tests. Sure, follow your bliss. See where it
takes you, but, when you get there you will have time to look back upon
your creation while it&amp;rsquo;s still fresh in your mind and decide if it&amp;rsquo;s
something worth keeping. If it is, then it&amp;rsquo;s probably worth making sure
it works correctly, especially if it was written in the midst of an
endorphin high.&lt;/p&gt;
&lt;p&gt;And&amp;hellip; if, when looking back upon your creation, you think it&amp;rsquo;s good
enough to share, is it not ever more worth testing, so that your
entirely human errors don&amp;rsquo;t trip others up too? So that you can be sure
that things really work for others the way you claimed they did? How
inconsiderate of your fellow men would it be to foist untested and
potentially buggy code upon them?&lt;/p&gt;
&lt;p&gt;There is no binary in this world; not in code or computers. Beauty and
motion lie not within the ones or zeros but the infinite layers of
transition between them.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Don&#39;t be afraid to look like an idiot</title>
      <link>https://weblog.masukomi.org/2007/12/15/dont-be-afraid-to-look-like-an-idiot/</link>
      <pubDate>Sat, 15 Dec 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/12/15/dont-be-afraid-to-look-like-an-idiot/</guid>
      <description>&lt;p&gt;The other day I posted a rant about &amp;ldquo;&lt;a href=&#34;https://weblog.masukomi.org/2007/12/10/alphabetical-asciibetical&#34;&gt;Alphabetical != ASCIIbetical&lt;/a&gt;&amp;rdquo;,
which, much to my surprise, got picked up in a couple places and brought
thousands of readers. As with any post that gets thousands of readers,
some of them are going to call you an idiot.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;…I don’t know what you call this sorting order, but it most definitely
is not alphabetical. Maybe you should make sure you aren’t being a
dumbass before you climb atop your own soapbox of delusional
self-importance. - Dave G.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And Dave’s right, about that part. It wasn’t &amp;ldquo;Alphabetical&amp;rdquo; sorting that
I was after. I’ve heard it called &amp;ldquo;Alphanumeric&amp;rdquo;, &amp;ldquo;Natural&amp;rdquo;, and
&amp;ldquo;Lexicographical&amp;rdquo; sorting. I haven’t a clue what the correct term is, or
if there really is one for what I’m looking
for&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;. I knew going into that post that it
wasn’t really &amp;ldquo;Alphabetical&amp;rdquo; because numbers aren’t in the English
&amp;ldquo;alphabet&amp;rdquo;, but I also knew that most people would know what I meant if
I called it &amp;ldquo;Alphabetical&amp;rdquo;. But does my ignorance of the correct word
mean I should have not said anything? Or that I should have written some
meek apologetic post saying &amp;ldquo;I’m terribly sorry I don’t know what the
word for this is but you should probably be aware that…&amp;rdquo; Fuck no! Nobody
would have read it, or if they did they wouldn’t really think about it.
The fact that that post made it is far as it did was because I was
willing to stand up on my soap box and call people on what I believe to
be a pervasive problem.&lt;/p&gt;
&lt;p&gt;But you know what? I could have been totally effing wrong. Someone could
have commented &amp;ldquo;Masukomi, you idiot, it’s the &lt;code&gt;Foo.alphanumSort()&lt;/code&gt; method
and it’s been there for six years. All major languages have something
similar.&amp;rdquo; or more succinctly &amp;ldquo;RTFM!&amp;rdquo; I would have looked like a complete
ass for telling people they should &amp;ldquo;be ashamed&amp;rdquo; of themselves.&lt;/p&gt;
&lt;p&gt;But even if that happened it would have been worth it because my
ignorance on how to address this problem would have been removed AND I
would have a nice trusted library to work with. Plus, because I have
absolutely no problem with apologizing when my ignorance leads me to say
wrong-headed things.&lt;/p&gt;
&lt;p&gt;We are all ignorant of far more than 99.999% of the things that go on in
this world. There are just too many of them. So don’t be ashamed of your
ignorance. Embrace it. Try and recognize what you do and don’t know, and
don’t be afraid to say &amp;ldquo;Hey, I don’t know wtf this is but I know it’s
fucked up.&amp;rdquo; Maybe you’re right, maybe you’re not. If you’re right,
improvements may result. If you’re wrong you’ll learn how it works. And
don’t be afraid to say &amp;ldquo;I am such a freaking idiot sometimes.&amp;rdquo; because
you are. We all are. It is only a matter of time before each of us says
something that’s based in ignorance and makes us look like an ass. But
so what? As long as you’re willing to say &amp;ldquo;Oh my God. You’re right.
Thank you! I was an ass. I’m sorry.&amp;rdquo; It’s no big deal, or it shouldn’t
be. If the person you’re talking to can’t respect you for owing up to
your mistakes then they’re not someone you want to associate with
anyway.&lt;/p&gt;
&lt;p&gt;I should also note that I didn’t write that post, or any other, with
the goal of getting lots of people to read it, but I do recognize that
calling people out frequently results in more people paying attention,
and engenders discussion. I posted it because
I believed there was an issue that needed addressing. And I know there
are a handful of people who read this who might want a heads-up, and /
or be able to empathize with my frustration. I know that I find it
comforting to read other developer’s blogs and see them struggling, or
being annoyed with, the same things I am.&lt;/p&gt;
&lt;p&gt;This is my soap-box. Sometimes my leaflets are wrong, but I’d rather
risk being wrong than never say anything.&lt;/p&gt;
&lt;hr&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Looking for: a sorting algorithm that treats numbers in strings as the numbers they represent and not the digits that happen to be used to represent them. 1000 is not four digits that need to be sorted. It’s a representation of the number one-thousand which needs to be sorted correctly relative to other digit based number representations that get mixed in with letters of the English alphabet.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Alphabetical != ASCIIbetical</title>
      <link>https://weblog.masukomi.org/2007/12/10/alphabetical-asciibetical/</link>
      <pubDate>Tue, 11 Dec 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/12/10/alphabetical-asciibetical/</guid>
      <description>&lt;p&gt;[BEGIN RANT]&lt;/p&gt;
&lt;p&gt;Partially this is a case of Java community being populated
by idiots, but people seem to be wholly ignorant on this issue in other
languages too. &lt;a href=&#34;http://www.google.com/search?hl=en&amp;amp;client=firefox-a&amp;amp;rls=com.ubuntu:en-US:official&amp;amp;q=java+alphabetical+sorting+capitalization&amp;amp;btnG=Search&#34;&gt;Google for java alphabetical sorting
capitalization&lt;/a&gt;
or any combination of words you can think of that might get you an
algorithm that sorts a collection alphabetically. You will find hundreds
of wrong responses and no correct ones. Most of them say to use the
Arrays.sort(..) or Collections.sort(..) methods. But both of those use
natural order (or ASCIIbetical as I like to call it) not alphabetical
order so 1 is followed by 10 not 2 and things starting with a capital
letter aren&amp;rsquo;t beside things with the lowercase version of the same
letter.&lt;/p&gt;
&lt;p&gt;Some people think of calling .toLowerCase() on everything first
so that at least they eliminate the latter issue but I have yet to see a
single example of an actual alphabetical sort in Java (or any other
language I&amp;rsquo;ve checked).&lt;/p&gt;
&lt;p&gt;Silly me, I just figured that alphabetical
sorting was such a common need (judging by the number of people asking
how to do it I&amp;rsquo;m not wrong either) that I wouldn&amp;rsquo;t have to write the
damn thing. But I didn&amp;rsquo;t count on the stupid factor. Jesus Christ
people. You&amp;rsquo;re programmers. You&amp;rsquo;re almost all college graduates and none
of you know what the fuck &amp;ldquo;Alphabetical&amp;rdquo; means. You should all be
ashamed.&lt;/p&gt;
&lt;p&gt;If any of you are using your language&amp;rsquo;s default sort algorithm,
which is almost guaranteed to be ASCIIbetical (for good reason) to get
alphabetical sorting you should proceed to the nearest mirror and slap
yourself repeatedly before returning to your desks and fixing your unit
tests that didn&amp;rsquo;t catch this problem.&lt;/p&gt;
&lt;p&gt;[END RANT]&lt;/p&gt;
&lt;p&gt;[Update] There is apparently &lt;a href=&#34;http://www.davekoelle.com/alphanum.html&#34;&gt;one person who knows the freaking
difference&lt;/a&gt;. Someone get that
man a cookie!&lt;/p&gt;
&lt;p&gt;[Update 2] Alphabetization/Alphanum/whatever you want to
call it is entirely language dependent. Obviously an algorithm that
works for English is unlikely to work for other languages. Attempting to
create a generic purpose one that handles special characters of multiple
languages is brain-dead because there may be other rules that affect
alphabetization in them.&lt;/p&gt;
&lt;p&gt;[Update 3] &lt;a href=&#34;http://www.codinghorror.com/blog/archives/001018.html&#34;&gt;Jeff Attwood points out&lt;/a&gt; that this is called &amp;ldquo;Natural sorting&amp;rdquo; not &amp;ldquo;Alphabetical&amp;rdquo; sorting. Unfortunately the Javadocs for Collections.sort(&amp;hellip;) talk about sorting things according to their &amp;ldquo;Natural ordering&amp;rdquo; which may be technically true but just adds to the confusion.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The Word Game</title>
      <link>https://weblog.masukomi.org/2007/12/09/the-word-game/</link>
      <pubDate>Mon, 10 Dec 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/12/09/the-word-game/</guid>
      <description>&lt;p&gt;The Word Game&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t remember the exact origins of The Word Game. I just remember
that &lt;a href=&#34;https://johnksawers.com&#34;&gt;John&lt;/a&gt; was involved. The word
game is great for passing time on long road trips, seeing how your
friends brains work, and enhancing a child&amp;rsquo;s vocabulary. You can also
play it by yourself. It&amp;rsquo;s an association game, but the rules are subtle.&lt;/p&gt;
&lt;p&gt;The rules I can tell you:
Phrases and short sentences are allowed, but words and names are
preferred.
All words are legal, especially interesting ones.
You continue until you either can&amp;rsquo;t come up with an &amp;ldquo;acceptable&amp;rdquo;
response.
Then you start over.
Any response that no-one complains about is &amp;ldquo;acceptable&amp;rdquo;. It should be
fairly obvious when a response isn&amp;rsquo;t satisfactory.
Associations can be based on the sound of the word, the meaning of the
word, things associated with the word.
Cooler words are better.&lt;/p&gt;
&lt;p&gt;Since the best way to explain the game is by example I just played a
very short round with myself and wrote it down for you. If I wasn&amp;rsquo;t
playing solo each line would be a different participant&amp;rsquo;s response as we
went around the group.&lt;/p&gt;
&lt;p&gt;Gary Shandling&lt;br&gt;
Gary Gygax&lt;br&gt;
triple thorax&lt;br&gt;
triple goddess&lt;br&gt;
phases of the moon [this would only work if you hung out with pagans]&lt;br&gt;
&lt;a href=&#34;http://www.amazon.com/Moonstruck-Deluxe-Cher/dp/B000EHRVOW&#34; title=&#34;Moonstruck&#34;&gt;Moonstruck&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;starstruck&lt;br&gt;
pile of muck&lt;br&gt;
pig pile&lt;br&gt;
puppy pile&lt;br&gt;
3 mile&lt;br&gt;
3 mile island&lt;br&gt;
nuclear winter&lt;br&gt;
nuclear radiation&lt;br&gt;
plutonium&lt;br&gt;
I love my mum.&lt;br&gt;
chrysanthemum&lt;br&gt;
Christianity&lt;br&gt;
Christmas&lt;br&gt;
&lt;a href=&#34;http://en.wikipedia.org/wiki/Michaelmas&#34; title=&#34;Michaelmas&#34;&gt;Michaelmas&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not uncommon when playing to spend a while throwing out different
words that all rhyme (imagine all the &amp;ldquo;&amp;hellip;ing&amp;rdquo; words you could iterate
over), but I tried to avoid that here so as to give you a better example
of the different types of &amp;ldquo;acceptable&amp;rdquo; associations.&lt;/p&gt;
&lt;p&gt;I know, it looks kinda silly, but it&amp;rsquo;s actually a lot of fun, especially
in the car. I find that the faster you play the more fun it gets. Also,
it&amp;rsquo;s not just a matter of finding words and phrases that happen to be
associated somehow. You want to use the coolest words you can think of.
Even though there are lots of &amp;ldquo;&amp;hellip;ing&amp;rdquo; words, as mentioned above, if you
can think of one, but it&amp;rsquo;s not particularly cool, it&amp;rsquo;s better to take
the game off on some other more interesting association.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>SSCM 0.4 Released</title>
      <link>https://weblog.masukomi.org/2007/12/09/sscm-04-released/</link>
      <pubDate>Sun, 09 Dec 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/12/09/sscm-04-released/</guid>
      <description>&lt;p&gt;Some of you may be interested to know that &lt;a href=&#34;http://sscm.masukomi.org&#34;&gt;SSCM v
0.4&lt;/a&gt; has been released. Notable changes:
supports move operations, fixed a bug with perforce support, allows you
to live dangerously and just accept all detected changes into the repo
without asking.&lt;/p&gt;
&lt;p&gt;The two things I&amp;rsquo;d like to get in there now are branching and merging
all the known repos with one command each. Should be relatively trivial
for the distributed clients, but the centralized ones will be a little
work. Anyone feel like pitching in?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Disovery coding through tests</title>
      <link>https://weblog.masukomi.org/2007/12/08/disovery-coding-through-tests/</link>
      <pubDate>Sat, 08 Dec 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/12/08/disovery-coding-through-tests/</guid>
      <description>&lt;p&gt;Testing as a process of discovery&lt;/p&gt;
&lt;p&gt;The other day a coworker said,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Some times you get situations where the specification for the unit or
module you are writing just are not available. The code writing is a
discovery process as much as anything else. Moreover, some of the
packages and methods being called don&amp;rsquo;t have predictable or documented
behavior. That&amp;rsquo;s ugly and horrible, and I don&amp;rsquo;t know how that&amp;rsquo;s
allowed, but nonetheless, from the perspective of someone who wants to
do unit testing in such an environment, can you give any tips? I mean,
do you mock up approximations to what you &lt;em&gt;think&lt;/em&gt; these external
things &lt;em&gt;should&lt;/em&gt; be doing if you really don&amp;rsquo;t &lt;em&gt;know&lt;/em&gt; what they are
doing? Do you do your best, updating mocks and tests, &amp;ldquo;in the face of
adversity&amp;rdquo;?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Really we&amp;rsquo;ve got two questions here:
&lt;a href=&#34;#how-do-you-write-tests-for-something-when-you-dont-know-what&#34;&gt;How do you address the desire to write tests when you don&amp;rsquo;t know what
exactly you need / want
yet?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;#how-do-you-handle-external-libraries-where-youre-just-not-confident&#34;&gt;How do you handle external libraries where you&amp;rsquo;re just not confident in
what the expected behavior
is?&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;how-do-you-write-tests-for-something-when-you-dont-know-what&#34;&gt;How do you write tests for something when you don&amp;rsquo;t know what&lt;/h3&gt;
&lt;p&gt;exactly that something is yet?&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s look at coding a simple User Story and Acceptance Test and tackle
them in a way that allows for maximum flexibility and exploration while
coding.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The User Story (for a cash register):
Keep a running receipt with a short description of each item and its
price.&lt;/p&gt;
&lt;p&gt;Its Acceptance Test:
Setup: The cashier has a new customer.
Operation: The cashier scans a toothbrush for $2.25.
Verify: The receipt has a description of the toothbrush and its
price.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Let&amp;rsquo;s assume we&amp;rsquo;ve written absolutely no code. But we want to take a
test driven approach and we don&amp;rsquo;t want to write tests for the bits we
haven&amp;rsquo;t really figured out yet, because, well&amp;hellip; we haven&amp;rsquo;t figured them
out and we want to keep the possibilities open. So let&amp;rsquo;s write the bare
minimum required to test this. From the user story and acceptance test
above we can tell exactly what classes and methods we&amp;rsquo;ll need to write
and test. So we&amp;rsquo;ll need:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;ICashier&lt;/code&gt; (cashier interface)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ICustomer&lt;/code&gt; (customer interface)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;IRegister&lt;/code&gt; (register interface)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;IToothbrush&lt;/code&gt; (toothbrush interface)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;IReceipt&lt;/code&gt; (receipt interface)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;As for methods we&amp;rsquo;re going to need:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;IToothbrush

-   getPrice()
-   getShortDescription()

IRegister

-   scanItem()

IReceipt

-   addItem()
-   print()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now, there are three approaches we could take here:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Write a full interface and tests for all of these with all the other
methods we expect them to need (like a &lt;code&gt;getUPC()&lt;/code&gt; method on
&lt;code&gt;IToothbrush&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Write an interface and tests for all the methods we know we&amp;rsquo;ll need
(the ones listed above)&lt;/li&gt;
&lt;li&gt;Write an interface and tests just for the items we are using RIGHT
NOW.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I&amp;rsquo;d been doing the latter for a little while and was pleased as punch to
find out, when listening to a podcast interview with Martin Fowler, that
this is exactly what he&amp;rsquo;s been doing lately too. I think that this is
the best possible approach because it keeps you focused on what you
actually need, it gives you much smaller and more quickly obtainable
goals, and it gets things working faster. If you took this approach you
might proceed something like this (again, assuming no code has been
written at this point):&lt;/p&gt;
&lt;p&gt;Write the IToothbrush interface.&lt;/p&gt;
&lt;p&gt;Add the method you want to address first (get price)&lt;/p&gt;
&lt;p&gt;Write a unit test for that method.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;check that a toothbrush never has a null price&lt;/li&gt;
&lt;li&gt;assert that the price is going to be a decimal number&lt;/li&gt;
&lt;li&gt;check that the price is never less than zero.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now that you&amp;rsquo;ve got a properly failing test you write a Toothbrush
implementation with just a &lt;code&gt;getPrice()&lt;/code&gt; method.&lt;/p&gt;
&lt;p&gt;In your Toothbrush implementation you&amp;rsquo;d probably have a no parameter
constructor that set up a default price of $0.00, or your getPrice()
method would be smart enough to guarantee a non-null price was returned,
either way, your test would pass.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d say just repeat for each item in the list but it&amp;rsquo;s not quite that
simple. When you get to the &lt;code&gt;getShortDescription()&lt;/code&gt; you&amp;rsquo;ll probably have a
test that it&amp;rsquo;s not null, but we&amp;rsquo;ve got no method in our spec for
actually setting a description so we can&amp;rsquo;t make an implementation where
that test passes unless we create a method to set the description or
allow it to be set in the constructor. XP people advocate doing the
simplest possible thing that will work, which in this case makes sense
and would be to set it in a constructor. So, now we&amp;rsquo;ve got to add a unit
test for the constructor, and it&amp;rsquo;s reasonable to think that we should
set the price in the constructor too. So, in order to really test the
&lt;code&gt;getShortDescription()&lt;/code&gt; method we also need to write a test for the
Toothbrush constructor. So, testing &lt;code&gt;getShortDescription()&lt;/code&gt; leads us on to
the next bits we need RIGHT NOW.&lt;/p&gt;
&lt;p&gt;Add the &lt;code&gt;getShortDescription()&lt;/code&gt; method to the IToothbrush interface&lt;/p&gt;
&lt;p&gt;Add the &lt;code&gt;testGetShortDescription()&lt;/code&gt; unit test&lt;/p&gt;
&lt;p&gt;check that the description isn&amp;rsquo;t null&lt;/p&gt;
&lt;p&gt;check that the description isn&amp;rsquo;t empty&lt;/p&gt;
&lt;p&gt;check that it&amp;rsquo;s actually &amp;ldquo;short&amp;rdquo;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;this could, conceivably lead you to want create a generic Item
interface that has a &lt;code&gt;validateShortDescription(...)&lt;/code&gt; and / or
&lt;code&gt;truncateDescription(...)&lt;/code&gt; method, but I&amp;rsquo;d recommend holding off until
you finish with the items required for this acceptance test. While a
good idea, and something to plan on, it&amp;rsquo;ll be nicer to actually get
through this initial acceptance test before diving down the rabbit
hole of nice-to-haves.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Add &lt;code&gt;testConstructor()&lt;/code&gt; method to your &lt;code&gt;ToothbrushTest&lt;/code&gt; test case&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;test that we can instantiate an object with a valid price and short
description&lt;/li&gt;
&lt;li&gt;test that we can&amp;rsquo;t instantiate an object with an invalid price and
valid short description&lt;/li&gt;
&lt;li&gt;test that we can&amp;rsquo;t instantiate an object with a valid price and
invalid short description&lt;/li&gt;
&lt;li&gt;test that we can&amp;rsquo;t instantiate an object with an invalid price and
short description&lt;/li&gt;
&lt;li&gt;test that the price and short description come out through the two
getters we have in our interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Add a constructor that takes a price and a short description to
&lt;code&gt;Toothbrush&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Add &lt;code&gt;getShortDescription()`` to &lt;/code&gt;toothbrush``.&lt;/p&gt;
&lt;p&gt;By taking such a focused approach we haven&amp;rsquo;t constrained what could
happen with any of the other functionality in toothbrush. Let the
emerging specification define if you need a &lt;code&gt;getColor()&lt;/code&gt; method on your
toothbrush. If it&amp;rsquo;s not there now and none of the methods you&amp;rsquo;ve worked
on so far have implied the need don&amp;rsquo;t go there at all&amp;hellip; otherwise when
you finally do get there you&amp;rsquo;re likely to find that &amp;ldquo;blue&amp;rdquo; wasn&amp;rsquo;t an
acceptable thing to for it to return at all what it really needed to
return was an array of RGB values: &lt;code&gt;[0,0,255]&lt;/code&gt;. My advice would be to add
a comment to the interface noting that you think a &lt;code&gt;getColor()&lt;/code&gt; method
might be useful and what you think it should return, that way as you
keep coming back and updating IToothbrush you&amp;rsquo;ll keep that in mind and
won&amp;rsquo;t forget or accidentally code yourself into a situation where it&amp;rsquo;s
difficult to derive the color.&lt;/p&gt;
&lt;h3 id=&#34;how-do-you-handle-external-libraries-where-youre-just-not-confident&#34;&gt;How do you handle external libraries where you&amp;rsquo;re just not confident&lt;/h3&gt;
&lt;p&gt;in what the expected behavior is?&lt;/p&gt;
&lt;p&gt;The same approach we just discussed for writing the unit test should
guide what we mock up of untrusted external libraries AND how we proceed
in working with them. Normally I try and work under the assumption that
the libraries I depend on are dependable and never write unit tests for
them, but sometimes you need to find out what you can depend on or what
exactly some methods do because they&amp;rsquo;ve got no docs. So first you look
at the library and ask yourself what methods, based on your limited
understanding, do you absolutely need to use? Then you write unit tests
that test that confirm that when using it the way you plan on using it
it does what you think it would do. You don&amp;rsquo;t have time to test their
entire library or all the possible edge cases for their code so you just
test that the bits you will be using work the way you think they do when
called in the way you&amp;rsquo;ll be calling them. For example if your code can&amp;rsquo;t
possibly pass in a negative number then you don&amp;rsquo;t need to worry if their
classes correctly handle negative numbers or not. You just need to make
sure that the class handles the full range of numbers you could be
passing it correctly and nothing else. Now you know that it does (or
doesn&amp;rsquo;t do) what you expected and you know some things that you can
safely pass it.&lt;/p&gt;
&lt;p&gt;Depending on how untrusted the library is you may also want to make sure
that everyone in your group knew to not use anything in that library
that they didn&amp;rsquo;t have a minimal test case for.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://clarkware.com/cgi/blosxom/2005/03/18#RLT1&#34; title=&#34;How he learned Ruby through Unit Testing&#34;&gt;Mike Clark wrote an
article&lt;/a&gt;
wherein he describes a similar approach but for a language instead of a
library. His idea was that when you start learning a new programming
language you just don&amp;rsquo;t know how exactly things work. You assume things
may work one way but that&amp;rsquo;s not always the case. He set out to write
test cases for all the things he learned how to do in the language. This
had a few good side effects: it got him familiar with the testing
framework of the language, it got him to actually use all the language
constructs (doing is far better for memory retention than just reading)
and he now has a test suite of his mental beliefs of how the language
works. If a new version of the language comes out he&amp;rsquo;ll know right away
if his mental model of how things works needs to change because his
tests will fail.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Pretty graphs you can&#39;t show customers</title>
      <link>https://weblog.masukomi.org/2007/12/05/pretty-graphs-you-cant-show-customers/</link>
      <pubDate>Wed, 05 Dec 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/12/05/pretty-graphs-you-cant-show-customers/</guid>
      <description>&lt;p&gt;This projects has been rolling around in my brain for a while but I
haven&amp;rsquo;t tackled it yet because I have too damn many other projects in
process. So I&amp;rsquo;m putting it here in the hopes that maybe someone will
pick it up and run with it.&lt;/p&gt;
&lt;p&gt;I want to put together a collection of javascript based graphing tools
that generate pretty SVG graphs of your data in a way that&amp;rsquo;s fun to look
at for people who have to work with it every day but not necessarily
something you&amp;rsquo;d ever want to try and explain to a customer. I want to do
this because we deal with a crapload of really interesting data at work,
but a lot of it is just internal and only of interest to geeks. Also I&amp;rsquo;d
like a visually interesting way to keep an eye on the status of our
systems and the data flowing through them. Stacked bar charts and line
graphs get old fast.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s my first idea:&lt;br&gt;
Imagine you have a wooden beam. Hanging down from that beam are strands
of ivy. Each strand of ivy represents a thing you&amp;rsquo;re watching (customer
actions, a product&amp;rsquo;s sales, a website, whatever). The length of the
strand represents the number of hits to / quantity of that thing. Now,
imaging that that thing has some quality goodness/badness,
happyness/saddness, good profit margin / bad profit margin, etc.. As
each item is added to the end of the ivy the ivy curves to the right or
the left based on how much goodness/badness (or whatever) this item
contains. If every item you added had some goodness the line would angle
off to the right. Bad items would, similarly, curve it off to the left.
If you have a relatively even distribution your lines will simply curve
back and forth in a wavy line like a real piece of dangling ivy.&lt;/p&gt;
&lt;p&gt;Originally the ivy was just a metaphor to help people visualize it but
brainstorming with John brought up the idea that when an item&amp;rsquo;s
goodness/badness crosses a threshold a leaf is added to the line. Maybe
the leaf could have an onClick event to take you to a page with details.
Maybe the leaves could be different colors or sizes to emphasize how
important the event is (relative to how far over the threshold it is).&lt;/p&gt;
&lt;p&gt;Imagine how cool it would be to have a whole collection of fun little
graphs like this to keep an eye on your data! The beauty of it is this
is actually really easy to implement. I just won&amp;rsquo;t let myself do it
until I release the next version of &lt;a href=&#34;http://sscm.masukomi.org&#34;&gt;SSCM&lt;/a&gt; out
the door (with merging and all that goodness), and release the source
code to &lt;a href=&#34;http://www.ticketeverything.com&#34;&gt;TicketEverything!&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a good &lt;a href=&#34;http://apike.ca/prog_svg.html&#34;&gt;tutorial on creating svg
objects&lt;/a&gt; and you could pre-generate
complex items, like the leaves, with
&lt;a href=&#34;http://www.inkscape.org/&#34;&gt;Inkscape&lt;/a&gt;, or any other vector based
illustration app that can export svg.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>At least she knows exactly what she&#39;s doing</title>
      <link>https://weblog.masukomi.org/2007/12/04/at-least-she-knows-exactly-what-shes-doing/</link>
      <pubDate>Tue, 04 Dec 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/12/04/at-least-she-knows-exactly-what-shes-doing/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m a big fan of Laurell K Hamilton. My only complaint is that, as of
late, both of her two major series have devolved into soft-core porn.
&lt;a href=&#34;http://www.amazon.com/Guilty-Pleasures-Anita-Vampire-Hunter/dp/0425197549/&#34; title=&#34;The Anita Blake series&#34;&gt;The Anita Blake
series&lt;/a&gt;
started out fairly standard vampire hunter with love interest and became
soft-core. Her Meredith Gentry series started out as soft-core. I just
watcher her &lt;a href=&#34;http://www.youtube.com/user/jondgreen&#34; title=&#34;doing some Q &amp;amp; A at a book store&#34;&gt;doing some Q &amp;amp; A at a book
store&lt;/a&gt;
and am happy to say that at least she has no misconceptions about this.
When asked about having been approached with movie deals for her books
she quipped: \&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;I wondered about the people who approached us for
&lt;a href=&#34;http://www.amazon.com/Kiss-Shadows-Meredith-Gentry-Novels/dp/0345423402/&#34; title=&#34;Mery&#34;&gt;Merry&lt;/a&gt;.
Have you read these books? I mean short of literally doing
pornography, how could you do these books? I don&amp;rsquo;t know. I guess if
you cut the sex out, and then, what&amp;rsquo;s the point?&amp;rdquo;\&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;For anyone curious about her books, The Anita Blake series does get
pretty good, but at the start of the series you can tell she hasn&amp;rsquo;t had
much writing experience, and now fifteen books into it the writing is
good but you&amp;rsquo;re wishing she&amp;rsquo;d leave the excessive sex in the Meredeth
Gentry series. &lt;br&gt;
\&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Szechuan Shredded Vegetables with Pressed Tofu</title>
      <link>https://weblog.masukomi.org/2007/12/02/szechuan-shredded-vegetables-with-pressed-tofu/</link>
      <pubDate>Mon, 03 Dec 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/12/02/szechuan-shredded-vegetables-with-pressed-tofu/</guid>
      <description>&lt;p&gt;Last night I got off my butt and cooked something interesting for movie
night. The recipe was generally well received although I learned that
most people don&amp;rsquo;t share my affection for ginger. Anyway, I&amp;rsquo;m posting
this recipe here for three reasons: Jess was considering making it,
comments need to be added to the instructions, and I need suggestions
for improving it. &lt;br&gt;
&lt;br&gt;
First the (vegan) recipe: &lt;br&gt;
Szechuan Shredded Vegetables with Pressed Tofu &lt;br&gt;
from &lt;a href=&#34;http://www.amazon.com/000-Vegetarian-Recipes-Carol-Gelles/dp/0025429655/&#34; title=&#34;1,000 Vegetarian Recipes&#34;&gt;1,000 Vegetarian
Recipes&lt;/a&gt;
&lt;br&gt;
&lt;br&gt;
Makes: 5 1/2 cups; serves: 4 to 6 [Kay: 4 to 6 very, very, tiny people]&lt;br&gt;
&lt;br&gt;
1/3 cup vegetable broth&lt;br&gt;
1 tablespoon soy sauce&lt;br&gt;
1 tablespoon mirin or sherry&lt;br&gt;
1 tablespoon corn starch&lt;br&gt;
2 tablespoons vegetable oil&lt;br&gt;
1 tablespoon minced fresh ginger&lt;br&gt;
3 cloves garlic, minced&lt;br&gt;
1/4 teaspoon red pepper flakes&lt;br&gt;
3 cups
&lt;a href=&#34;http://www.google.com/search?q=define+julienne&amp;amp;ie=utf-8&amp;amp;oe=utf-8&amp;amp;aq=t&amp;amp;rls=org.mozilla:en-US:official&#34; title=&#34;julienned&#34;&gt;julienned&lt;/a&gt;
carrots&lt;br&gt;
2 cups julienned celery&lt;br&gt;
1 cup julienned snow peas&lt;br&gt;
1/2 cup julienned scallions (white and green parts) &lt;br&gt;
2 cups julienned, pressed tofu&lt;br&gt;
1 teaspoon sesame oil.&lt;br&gt;
&lt;br&gt;
Instructions: \&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In a small bowl stir together the broth, soy sauce, mirin, and
cornstarch; set aside.\&lt;/li&gt;
&lt;li&gt;In a wok or large skillet, heat the oil over high heat. Add the
ginger, garlic, and red pepper flakes; cook, stirring, 10 seconds.\&lt;/li&gt;
&lt;li&gt;Add the carrots celery, snow peas, and scallions; cook, stirring
until softened, about 4 minutes. Add the tofu; cook, stirring, until
heated through, about 2 minutes.\&lt;/li&gt;
&lt;li&gt;Add the soy mixture to the wok; cook, stirring, until sauce is
thickened, about 1 minute longer. Stir the sesame oil.&lt;br&gt;
&lt;br&gt;
Variation: Use julienned red or green bell peppers instead of - or in
addition to - the snow peas.&lt;br&gt;
&lt;br&gt;
Post Creation Thoughts:&lt;br&gt;
First off this is an entree. The specified directions make 5 1/2 cups.
There is no way in hell you can feed 4-6 people on 5 1/2 cups of
anything. I doubled the recipe, served it with rice, and just had enough
for 7. This is really easy to make but if you double the recipe, you
pretty much have to, you should know that 6 cups of julienned carrots is
a lot. You&amp;rsquo;re going to be julienning veggies for a while, and unless
you&amp;rsquo;re going to get your guests to help, buy shredded carrots, and
julienne everything else in advance.&lt;br&gt;
&lt;br&gt;
Don&amp;rsquo;t bother julienning the tofu. Slice it, press it, throw it it.
Whatever shape you cut it into is going to get broken apart with all the
stirring. If you do the tofu in advance and let it sit in even more
moisture will seep out to the bottom thus saving you from having to
spend lots of time&lt;br&gt;
&lt;br&gt;
The fourth instruction suggests stirring until the sauce is thickened.
This means when you actually make the sauce your veggie broth has to be
cold. Otherwise as soon as you add the corn-starch it starts to thicken
immediately. Also, I think she&amp;rsquo;s smoking crack. There wasn&amp;rsquo;t nearly
enough sauce for anything more than a thin coating so you&amp;rsquo;d never be
able to tell if it was thickening or not. I doubled everything, but I&amp;rsquo;m
thinking I should have quadrupled the sauce. It smells nice but it needs
something. I&amp;rsquo;m thinking add sesame oil to this too.&lt;br&gt;
&lt;br&gt;
Screw the celery. The celery adds nothing to except a little crunch. The
only noteworthy comment about the celery was from someone who doesn&amp;rsquo;t
normally like celery saying that he had no problem with it in this dish.
I added julienned red bell pepper, next time I think I&amp;rsquo;ll forego the
celery and just use the red bell pepper. Also, julienning scallions is
not worth the effort; just cut them up normally, also you&amp;rsquo;ll get more
surface area on your cuts which should bring out the flavor a little
more.&lt;br&gt;
&lt;br&gt;
The ginger: I added about 2 3/4 tablespoons of ginger for the doubled
recipe (an extra 3/4). It was a bit much for people who weren&amp;rsquo;t ginger
fans. I thought it was perfect and left your lips just barely tingly. &lt;br&gt;
&lt;br&gt;
If you follow the official instructions you&amp;rsquo;ll end up with a bland
thing-o-veggies that people don&amp;rsquo;t mind eating but aren&amp;rsquo;t going to be
thrilled with. I like bland foods but with all the chopping I had to do
it annoyed me, so I called in Miller to help spice it up. We added
garlic powder, soy sauce, sesame oil. The latter two helped, I&amp;rsquo;m not
sold on the garlic powder for this dish but it was a step in the right
direction. My thoughts: more &amp;ldquo;soy mixture&amp;rdquo;, more sesame oil in that
mixture, sesame seeds might be nice too. More red pepper flakes. I don&amp;rsquo;t
like hot foods but there just weren&amp;rsquo;t enough in there to be worth
bothering. Maybe a little bit more real garlic (not powder) the default
amount doesn&amp;rsquo;t really stand out much I don&amp;rsquo;t think, and I actually added
a little extra. &lt;br&gt;
&lt;br&gt;
Mirin vs Sherry: I used mirin (should be wherever they hide the Asian
foods in your supermarket), but couldn&amp;rsquo;t taste it. This was probably due
to the fact that there just isn&amp;rsquo;t enough sauce in the default recipe
&lt;a href=&#34;http://www.urbandictionary.com/define.php?term=IMNSHO&#34; title=&#34;IMNSHO&#34;&gt;IMNSHO&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;
The tofu had little to no flavor. Maybe let it sit in the soy mixture
for a while before cooking, and/or throw it in for a minute after step
2&lt;br&gt;
&lt;br&gt;
Wok, wok, wok. Don&amp;rsquo;t even attempt this without a wok. It&amp;rsquo;s a matter of
sheer volume. If you don&amp;rsquo;t have a wok go get one. I don&amp;rsquo;t understand how
people cook without them.\&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>Why the Serial comma should be considered non-optional</title>
      <link>https://weblog.masukomi.org/2007/11/24/why-the-serial-comma-should-be-considered-non-optional/</link>
      <pubDate>Sat, 24 Nov 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/11/24/why-the-serial-comma-should-be-considered-non-optional/</guid>
      <description>&lt;p&gt;Why the Serial comma should be considered non-optional&lt;br&gt;
&lt;br&gt;
While my grasp of proper grammar may be somewhat limited, one thing I do
understand well is logic. Unfortunately, the fact that people tend to
have a surprisingly poor grasp of basic logic may undermine the
following argument, but here goes anyway. &lt;br&gt;
&lt;br&gt;
Many of you have been taught that using a comma before the last item in
a series (the &amp;ldquo;Serial&amp;rdquo; or &amp;ldquo;Oxford&amp;rdquo; comma) is optional, while this is
technically true the single keystroke, or swipe of a pen, that it saves
you is guaranteed to cause problems down the road. &lt;br&gt;
&lt;br&gt;
Don&amp;rsquo;t believe me? I have &lt;a href=&#34;http://www.amazon.com/Back-Basics-TEM500-Muffin-2-Slice/dp/B000B18P96/&#34; title=&#34;a pretty cool toaster&#34;&gt;a pretty cool
toaster&lt;/a&gt;.
It will toast your bread, and poach, or hard boil, your eggs at the same
time. Whilst standing over it this morning I happened to read one of the
little instructional stickers that told me I could &amp;ldquo;Use cancel button to
end all functions (toast, egg and egg and toast).&amp;rdquo;&lt;br&gt;
&lt;br&gt;
Now, while technically correct there are a number of problems with this
sentence. The first, and most obvious, being that it&amp;rsquo;s not at all clear
where the second comma is supposed to go. Yes, I can here many of you
complaining now that it&amp;rsquo;s not hard to figure out, but sometimes it is,
as I&amp;rsquo;ll demonstrate in a moment, and even if it isn&amp;rsquo;t you shouldn&amp;rsquo;t
force your readers to &amp;ldquo;figure out&amp;rdquo; what you were trying to say. You
should say it in a way that doesn&amp;rsquo;t require deciphering. Is it toast,
egg and egg, and toast? You generally have to assume the comma before
the last &amp;ldquo;and.&amp;rdquo; And what about the fact that this can actually hard-boil
(hard steam?) up to four eggs at a time? &amp;ldquo;Egg and egg&amp;rdquo; is a logical
possibility, as is &amp;ldquo;egg and egg and egg and egg&amp;rdquo;. &lt;br&gt;
&lt;br&gt;
The second problem is that the usage of the comma is a bit overloaded
here. We&amp;rsquo;re not just it to indicate a pause, we&amp;rsquo;re also using it to
&lt;a href=&#34;http://www.hyperdictionary.com/search.aspx?define=delimit&#34; title=&#34;delimit&#34;&gt;delimit&lt;/a&gt;
the items in a list. Verbally we do this with pauses, so it the comma is
a sensible choice to use, but many people leave out commas when writing
that they would normally include in their speech. So, the first comma in
any three item list with only one comma could just be interpreted as a
pause and not a list delimiter. &lt;br&gt;
&lt;br&gt;
As promised, here&amp;rsquo;s a real world example where you can&amp;rsquo;t &amp;ldquo;figure out&amp;rdquo;
the correct meaning: &amp;ldquo;Go to the store and buy milk, eggs, broccoli,
macaroni and cheese.&amp;rdquo;&lt;br&gt;
&lt;br&gt;
How many items do I expect you to return with? Is macaroni and cheese
one item or two?&lt;br&gt;
&lt;br&gt;
The Serial comma should never be considered optional. Plus, you&amp;rsquo;d use it
if you were speaking so you should use it when writing if you want to
convey the same thing.&lt;br&gt;
&lt;br&gt;
P.P. Check out &lt;a href=&#34;http://www.amazon.com/Back-Basics-TEM500-Muffin-2-Slice/dp/B000B18P96/&#34; title=&#34;the toaster&#34;&gt;the
toaster&lt;/a&gt;,
but if you do get one, you must keep a can of PAM nearby. The little
egg-poachey cup-thing isn&amp;rsquo;t nearly as non-stick as it looks. I&amp;rsquo;d also
recommend inserting a nice slice of medium to sharp cheddar in between
the bread and eggs. Mmmm &lt;a href=&#34;http://icanhascheezburger.com/2007/02/12/i-has-a-corm/&#34; title=&#34;Nom nom nom&#34;&gt;nom nom
nom&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;
P.P.S. &lt;a href=&#34;http://grammar.ccc.commnet.edu/grammar/commas.htm&#34; title=&#34;Lots of instructional comma goodness here&#34;&gt;Lots of instructional comma goodness
here&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;
P.P.P.S Yes, I realize the statements here put me at odds with rule #9
on the page linked above. Fuck them. ;) I believe that the final
sentence of rule #9 proves that the comma is appropriate there. &lt;br&gt;
&lt;br&gt;
&lt;br&gt;
\&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Through a writer&#39;s eyes.</title>
      <link>https://weblog.masukomi.org/2007/11/19/through-a-writers-eyes/</link>
      <pubDate>Mon, 19 Nov 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/11/19/through-a-writers-eyes/</guid>
      <description>&lt;p&gt;Through a writer&amp;rsquo;s eyes. I&amp;rsquo;ve spent most of my evenings, and weekends,
this month working on my book for
&lt;a href=&#34;http://www.nanowrimo.org/&#34; title=&#34;NaNoWriMo&#34;&gt;NaNoWriMo&lt;/a&gt;, which is why I
haven&amp;rsquo;t been posting. I have to say that regardless of if I &amp;ldquo;win&amp;rdquo; or not
it&amp;rsquo;s been an awesome experience. This afternoon just added to it. You
see, I went to one of the regular meet-ups for the Boston participants.
Unfortunately, due to technical difficulties, I wasn&amp;rsquo;t really sure what
time it was supposed to be at, and ended up guessing incorrectly. But
that didn&amp;rsquo;t matter, because I&amp;rsquo;ve learned that writers see the world
through different eyes. My story is about a young girl (thirteen) who
dies and joins the ranks of the Grim Reapers. So, I didn&amp;rsquo;t ride the T. I
scanned the crowd for interesting people and pondered the various ways
they might meet their demise. I contemplated the wonderful curve of a
curvy black woman&amp;rsquo;s equally curvy upper lip. Oh, to kiss lips such as
those&amp;hellip; When I arrived I had an agenda. You see, my story is set in
Boston. It&amp;rsquo;s the only city I know well enough to incorporate, and the
Reapers spend entirely too much time hanging out at IHOP, because it&amp;rsquo;s
affordable and open later than anywhere else. So, they spend their time
at the Harvard Square IHOP, which I&amp;rsquo;d never been to, but knew existed.
As a result, I&amp;rsquo;ve avoided actually describing it. So today&amp;rsquo;s agenda was
reconnaissance. To check out the IHOP, and the Goodwill in Central,
because that showed up in the book too. But what I found by watching the
world through writer&amp;rsquo;s eyes was so much better than I&amp;rsquo;d hoped for. As I
sat at my table, typing my story, and contemplating when the meet-up
really was because it definitely wasn&amp;rsquo;t then, a family with a young deaf
girl sat down perfectly positioned for me to watch them, which is
notable, not only because of the relatively small number of deaf people
in the world, but because one of the characters in my book is deaf, and
the main character has found herself living with her. So I watched the
young girl signing to her mom while her dad gazed out the window
people-watching. A freshmen girl with attitude to spare gave me a
decidedly unpleasant look and said something that made me wish I knew
how to read lips. A trio of college students sat outside in the cold and
started filming one of them looking through a newspaper with eye-holes
cut out of it and holding a dress shoe up beside it. One of them wore a
shirt that proclaimed that he was &amp;ldquo;Not a Ninja&amp;rdquo; despite his Asian
appearance, the laptop bag he had handcuffed to his wrist, or the two
guitar cases they&amp;rsquo;d leaned up against a concrete column, but never
opened. And then there was the man who walked amongst the tables with
people dropping off business cards with the American Sign Language
alphabet on the back and a message on the front that asked if you were
interested in having an experience with &amp;ldquo;the deaf&amp;rdquo; and that &amp;ldquo;Any
Donation&amp;rdquo; would be accepted if you wanted to &amp;ldquo;Buy this card&amp;rdquo;.
Unfortunately for the man with the cards being deaf is no excuse for not
grasping the distinction between buying something and making a donation
or giving the people he wanted money from absolutely no hint as to what
they would be donating to (was it just him or some deaf community
project) or why they would want to buy the card, unless they were so
desperately in need of an ASL alphabet guide that they would put up with
the almost indecipherable printing quality of this one. I would have
asked him about it but my ASL skills have been degrading (although
writing this book is helping) and even when I had more signs still
trapped in my brain I know from experience that my trying to sign with
deaf people rarely goes over well. They get all excited that you have
actually taken the time to learn their language and then proceed to sign
at a speed that risks breaking the sound barrier, which, to me, is
totally incomprehensible, and then they get frustrated, and I feel like
an idiot, and &amp;hellip;. yeah. I think I&amp;rsquo;m going to take classes over at &lt;a href=&#34;http://www.deafinconline.org/education/asl.html&#34; title=&#34;Deaf Inc.&#34;&gt;Deaf
Inc.&lt;/a&gt; when
they start up again, although they&amp;rsquo;re in risk of being challenged by my
desire to take Japanese classes, which the deaf character is also
(although I don&amp;rsquo;t know yet if she&amp;rsquo;s actually from Japan or just of
Japanese descent). But that, is another discussion entirely&amp;hellip; Of
course, this being my life, and working in the fantabulous way that it
does, there was a Japanese family sitting where I could watch and hear
them too. Then there were the chess players, playing the pick-up games
of speed chess that that the Harvard Square Au Bon Pain has become so
well known for. They&amp;rsquo;d play contemplatively by themselves until a
stranger walked up and, through some ritual too quick to follow, joined
the table. They&amp;rsquo;d sit, focusing so intently: Move, tap. Move, take, tap.
Move take tap. Move tap. Move tap. The digital timer flipping and
resetting the countdown from one opponent to the next with a tap from
each side. The IHOP sandwiched in between a comic store, a hair salon,
and an Indian restaurant, under a Thai restaurant and possibly above a
Japanese restaurant was no less inspiring. Who could consistently make
up a scene that cool? My mother was an artist. Always seeing, and
creating, beautiful things. But writers&amp;hellip; they&amp;rsquo;re not limited to frozen
frames of light, and the world seems to offer up such a wonderful bounty
of characters. I don&amp;rsquo;t know if fiction is my forte. I know I can write
well on topics I am passionate about, but I&amp;rsquo;m still learning how to
translate that passion into tales that don&amp;rsquo;t yet exist, with people who
don&amp;rsquo;t either. What I do know is that I&amp;rsquo;m loving the experience, and am
very grateful for this totally crazy challenge. You should totally join
me next year. I&amp;rsquo;ve got this comfy couch, with plenty of nearby
electrical outlets, and a ready supply of junk food just around the
corner.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Spiritual reinvigoration</title>
      <link>https://weblog.masukomi.org/2007/11/10/spiritual-reinvigoration/</link>
      <pubDate>Sat, 10 Nov 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/11/10/spiritual-reinvigoration/</guid>
      <description>&lt;p&gt;Tonight I was awed by &lt;a href=&#34;http://www.buddywakefield.com/&#34; title=&#34;who knew poetry could rock so hard.&#34;&gt;a student of the spoken
word&lt;/a&gt;.&lt;br&gt;
I watch a girl named &lt;a href=&#34;http://www.allisonmiller.com/&#34; title=&#34;she didn&#39;t just &#39;play&#39; the drums. she danced and swayed on her drum-kit throne&#34;&gt;Allison Miller dance the drums&lt;/a&gt;.&lt;br&gt;
I watched a man rock the vibraphone.&lt;br&gt;
And I watched &lt;a href=&#34;http://www.righteousbabe.com/ani/&#34; title=&#34;a minor deity of spirit and belief&#34;&gt;a minor deity of spirit and belief&lt;/a&gt; move thousands of souls.&lt;/p&gt;
&lt;p&gt;In other words, I saw an Ani Difranco concert.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Is it testable?</title>
      <link>https://weblog.masukomi.org/2007/11/05/is-it-testable/</link>
      <pubDate>Tue, 06 Nov 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/11/05/is-it-testable/</guid>
      <description>&lt;p&gt;Is it testable?&lt;/p&gt;
&lt;p&gt;Apparently some people are having trouble with determining if the code
they&amp;rsquo;ve written is testable. So I&amp;rsquo;ve put together this flow chart to
help you navigate through this complex decision making process. The
image is distributed under the
&lt;a href=&#34;http://en.wikipedia.org/wiki/WTFPL&#34; title=&#34;(Do What The Fuck You Want To Public License)&#34;&gt;WTFPL&lt;/a&gt;
license so please feel free to use wherever and however you want.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/2007/11/05/is_it_testable.png&#34; alt=&#34;is it testable flow chart&#34; title=&#34;is it testable flow chart&#34;&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Should I test it now?</title>
      <link>https://weblog.masukomi.org/2007/11/06/should-i-test-it-now/</link>
      <pubDate>Tue, 06 Nov 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/11/06/should-i-test-it-now/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://weblog.masukomi.org/2007/11/05/is-it-testable&#34;&gt;Yesterday&amp;rsquo;s flow
chart&lt;/a&gt; was designed
to help with the complex issue of determining if a particular piece of
code is testable. Today&amp;rsquo;s flow chart helps with the equally complex
problem of determining &lt;em&gt;when&lt;/em&gt; to write, or run, your tests. Like the
last one it is distributed under the
&lt;a href=&#34;http://en.wikipedia.org/wiki/WTFPL&#34; title=&#34;(Do What The Fuck You Want To Public License)&#34;&gt;WTFPL&lt;/a&gt;
license so please feel free to use wherever and however you want.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2007/11/06/when_to_test.png&#34; alt=&#34;Shoud I test it now? flow
chart&#34; title=&#34;is it testable flow chart&#34;&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Unit Testing 101 Presentation v2</title>
      <link>https://weblog.masukomi.org/2007/10/24/unit-testing-101-presentation-v2/</link>
      <pubDate>Wed, 24 Oct 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/10/24/unit-testing-101-presentation-v2/</guid>
      <description>&lt;p&gt;I just put together a new unit testing presentation for the folks at
work and you. Although it may need to be edited here and there for your
coworkers&amp;hellip; maybe mine too&amp;hellip;.&lt;/p&gt;
&lt;p&gt;Anyway, &lt;a href=&#34;http://www.masukomi.org/talks/unit_testing_talk_2/index.xul&#34; title=&#34;Unit Testing 101&#34;&gt;Unit Testing 101&lt;/a&gt; (v2) requires &lt;a href=&#34;http://www.getfirefox.com&#34; title=&#34;Firefox&#34;&gt;Firefox&lt;/a&gt; and I recommend you move your mouse up to the top edge and click on the icon to the left of the slider where you&amp;rsquo;ll get a menu of all the chapters
and slides. Yes, there are a lot of slides, but it&amp;rsquo;s Takahashi method so
they go &lt;em&gt;really&lt;/em&gt; fast.&lt;/p&gt;
&lt;p&gt;As always feedback is not only welcomed, but encouraged..&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>On Being Jewish</title>
      <link>https://weblog.masukomi.org/2007/10/22/on-being-jewish/</link>
      <pubDate>Mon, 22 Oct 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/10/22/on-being-jewish/</guid>
      <description>&lt;p&gt;I recently met a couple of pretty cool people who, as it turns out, are
Jewish. After hanging with them last night something struck me. When
speaking with someone who is truly Jewish, not just Jewish if they have
to think about it, you&amp;rsquo;ll hear them say &amp;ldquo;because I&amp;rsquo;m a Jew&amp;rdquo;, &amp;ldquo;and there I
am, a Jew&amp;rdquo;, or similar phrases to describe some situation they found
themselves in. I thought back to all the times I&amp;rsquo;ve heard these
utterances from all the Jews I&amp;rsquo;ve know, including my father, and I
realized that there&amp;rsquo;s a weight to it that goes far beyond what deity
they happen to believe in. Saying &amp;ldquo;I&amp;rsquo;m a Jew&amp;rdquo; and meaning it down to
your bones comes with the unspoken weight of thousands of years of being
shat upon by every other race, triumphing over it, and surviving
through it. It reminds me of that quote from The Matrix when Morpheus
was giving his speech in the temple:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I stand before you unafraid. Because I believe something you do not?
No. But because I remember. I remember that I am here not because of
the path that lies before me, but because of the path that lies behind
me.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;What&amp;rsquo;s even more amazing is how this seems to be woven into the core of
being Jewish. When they mention it they&amp;rsquo;re not trying to say &amp;ldquo;so there!&amp;rdquo;
or point out how hard they&amp;rsquo;ve had it, but there&amp;rsquo;s a different quality to
the phrase that comes from that. When a Christian says it it feels
either totally superficial or that they&amp;rsquo;re trying to point out how
you&amp;rsquo;re going to go to hell, or how much better they are than you because
of how often they pray. Almost none of the Christians I&amp;rsquo;ve met have any
sense of that quiet strength when they mention their faith in passing.
It makes me wish I was brought up knowing more about my fathers faith.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Kay&#39;s Incredibly Easy Pasta w / Tofu Recipe</title>
      <link>https://weblog.masukomi.org/2007/10/21/kay-s-incredibly-easy-pasta-w-tofu-recipe/</link>
      <pubDate>Sun, 21 Oct 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/10/21/kay-s-incredibly-easy-pasta-w-tofu-recipe/</guid>
      <description>&lt;p&gt;When most people encounter the idea of combining pasta with tofu they
generally respond with &amp;ldquo;why?&amp;rdquo; or &amp;ldquo;eww!&amp;rdquo; I&amp;rsquo;m a huge fan of tofu and if I
hadn&amp;rsquo;t actually tried this I would be raising one eyebrow at it. But
it&amp;rsquo;s good. It&amp;rsquo;s so good that people who never buy tofu go back for extra
tofu bits for their pasta with every helping. I&amp;rsquo;m not kidding. It&amp;rsquo;s not
mind-blowing or anything but it&amp;rsquo;s a tasty change and great when you have
vegetarian guests. The idea is pretty simple. We&amp;rsquo;re going to make your
traditional pasta withred-sauce and meatballs except we&amp;rsquo;re replacing the
meatballs with crisp tofu slices. &lt;strong&gt;Ingredients:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Spaghetti, Ziti, Linguine, etc. I recommend avoiding fine pasta&amp;rsquo;s
likeangel-hair.&lt;/li&gt;
&lt;li&gt;Vegetable / Safflower / anything but Olive oil to fry it in.&lt;/li&gt;
&lt;li&gt;Oregano. &lt;em&gt;Lots&lt;/em&gt; of oregano. This is non-optional.&lt;/li&gt;
&lt;li&gt;One block of &lt;em&gt;extra firm&lt;/em&gt; tofu. NOT SILKEN.&lt;/li&gt;
&lt;li&gt;As many of the following as you can get your hands on.
&lt;ul&gt;
&lt;li&gt;garlic powder (highly recommended)&lt;/li&gt;
&lt;li&gt;brewer&amp;rsquo;s yeast flakes (health food section / store usually but
still hard to find)&lt;/li&gt;
&lt;li&gt;onion powder&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;instructions&#34;&gt;Instructions:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Pour off the water in the tofu container. With the tofu still in its
container take a sharp knife and slice it across the smaller
dimension into1/8th to 3/16th inch slices. It&amp;rsquo;s important to keep
them thin. Much thinner and theytear and have no body. Much thicker
and the crisp to soft ratio is broken. Then make one slice down the
middle lengthwise. This will leave you with tworows of tofu squares
approximately 1 1/2&amp;quot; x 1 1/2&amp;quot; x 1/8&amp;quot;.&lt;/li&gt;
&lt;li&gt;Heat up your fry pan somewhere between medium high and high.&lt;/li&gt;
&lt;li&gt;Lay down a thin layer of vegetable oil. Just enough to cover the
bottom.&lt;/li&gt;
&lt;li&gt;Sprinkle the oregano, brewer&amp;rsquo;s yeast, garlic powder, and onion
powder over the oil.&lt;/li&gt;
&lt;li&gt;Cover the pan with a single layer of tofu. Use the spatula because
the water in / on the tofu will spatter.&lt;/li&gt;
&lt;li&gt;Sprinkle the oregano, brewer&amp;rsquo;s yeast, garlic powder, and onion
powder over the tofu. Now both sides have it.&lt;/li&gt;
&lt;li&gt;Let the tofu cook until it&amp;rsquo;s golden. I&amp;rsquo;m talking a little lighter
than a McDonalds chicken nugget golden.&lt;/li&gt;
&lt;li&gt;If you need to pour a little more oil into the pan between the
slices and tilt it around.&lt;/li&gt;
&lt;li&gt;Flip your tofu over. If it&amp;rsquo;s not golden yet flip it back. It&amp;rsquo;s
really important that each side gets a little crisp. Sometimes
you&amp;rsquo;ll find that the edges get nicely done but the center of the
sides are only slightly golden. This is ok. The edges will
compensate for the middle when you&amp;rsquo;re eating it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One block of tofu will probably end up covering 2 1/2 fry pans. So, grab
some friends and hang out in the kitchen while you fry it up and they
look at you like a crazy person for suggesting they eat tofu on their
pasta. I&amp;rsquo;d guess maybe 5 minutes per pan, but I&amp;rsquo;ve never timed it. You
want to keep it warm but remember that it&amp;rsquo;s freaking hot when if first
comes off of the fry pan. Top your pasta with it in exactly the same way
you&amp;rsquo;d use meatballs. I&amp;rsquo;d recommend a good vodka sauce. There are three
brands I&amp;rsquo;ve seen in the supermarket lately and so far &lt;a href=&#34;http://www.barillaus.com/home/Pages/Restaurant_Creations.aspx&#34; title=&#34;the Barilla that comes with two bottles&#34;&gt;the Barilla that
comes with two bottles&lt;/a&gt;
is the best, although they don&amp;rsquo;t label it as a vodka sauce. [Update: this product doesn&amp;rsquo;t appear to be for sale anymore] You have to
read the ingredients and look for vodka but I think it&amp;rsquo;s the most normal
looking one of the three they offer. I wouldn&amp;rsquo;t recommend this with
white sauce.&lt;/p&gt;
&lt;h3 id=&#34;tips&#34;&gt;Tips:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;It&amp;rsquo;s in your best interest to gently push your tofu around in the
pan while it cooks so that it doesn&amp;rsquo;t stick. Sticking is bad because
it will tear when you pick it up.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Because we want clean-up to be easy we want to use barely enough oil
at all times. Just keep enough so that there is some between each
piece of tofu and the pan.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you cut the tofu too thin it&amp;rsquo;ll just crisp like a potato-chip and
that&amp;rsquo;s no fun.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We&amp;rsquo;re shooting for something that feels a lot like a chicken nugget
in your mouth. It should be a little crisp on the outside and soft
on the inside. If you cut them as thick as a nugget though you get
too much of the bland uncooked tofu flavor which doesn&amp;rsquo;t really help
pasta in any way.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Because you&amp;rsquo;ve got the heat up high and you&amp;rsquo;re throwing little dried
leaves and powdered things in the pan and you&amp;rsquo;ll probably have to do
three batches to finish the whole block there may be a &lt;em&gt;little&lt;/em&gt;
smoke. Don&amp;rsquo;t worry,just turn on the fan and keep an eye on things.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;While I haven&amp;rsquo;t tried tofu and meatballs on the same pasta I think
it would be too much.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you&amp;rsquo;re wondering what else you can do with your brewer&amp;rsquo;s yeast
you can always sprinkle it on your dog&amp;rsquo;s food. It&amp;rsquo;s great for dogs
but you might want to avoid it if you have a breed that is prone to
bloat.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Brewer&amp;rsquo;s yeast contains essential B vitamins including biotin,
minerals including zinc, and high quality proteins. These assist
in the control of shedding and promote a healthy skin and hair
coat. Brewer&amp;rsquo;s yeast has been fed to pets to control fleas as it
seems to create an odor from the inside out that is unpleasant to
fleas. This has not been confirmed through research. It has also
been said the brewer&amp;rsquo;s yeast will stimulate the immune system.
-&lt;a href=&#34;http://www.peteducation.com/article.cfm?cls=0&amp;amp;cat=1448&amp;amp;articleid=1340&#34; title=&#34;PetEducation.com&#34;&gt;PetEducation.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;credits&#34;&gt;Credits:&lt;/h3&gt;
&lt;p&gt;I honestly haven&amp;rsquo;t a clue where I got the idea for this. I&amp;rsquo;m
not sure if I thought this up, or if it was Miller, or maybe I read it
somewhere&amp;hellip;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>A night with Bug Labs</title>
      <link>https://weblog.masukomi.org/2007/10/10/a-night-with-bug-labs/</link>
      <pubDate>Wed, 10 Oct 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/10/10/a-night-with-bug-labs/</guid>
      <description>&lt;p&gt;(written back in 2007)&lt;/p&gt;
&lt;p&gt;This morning I received a rather unexpected invite to a Meetup over at
the &lt;a href=&#34;http://middlesexlounge.com/&#34; title=&#34;Middlesex Lounge&#34;&gt;Middlesex Lounge&lt;/a&gt;
from the people at &lt;a href=&#34;http://www.buglabs.net/&#34; title=&#34;Bug Labs&#34;&gt;Bug Labs&lt;/a&gt;. They
were getting people together to discuss their new product, a modular and
open source hardware platform. I figure since they were nice enough to
buy us drinks I could return the favor by giving them my thoughts.&lt;/p&gt;
&lt;p&gt;For me the idea keeps coming back to Gumstix. Gumstix has been making
these tiny tiny computers that are essentially stripped down
motherboards that you could run really stripped down versions of linux
on. They&amp;rsquo;re pretty cool, but you really have to be willing to code with
minimal support from existing &amp;hellip;. anything, which makes them way too
much of a time investment for me to want to bother with. So, while the
idea of a mini computer that I could hack to do whatever I wanted is
tempting, I&amp;rsquo;ve got too many other projects to screw around with a
Gumstix.&lt;/p&gt;
&lt;p&gt;Bug Labs is taking a different approach. They&amp;rsquo;ve built a hardware base
that you can, literally, snap things like a camera, gps, touch sensitive
screen, etc., given it an OS, thrown on Java (standard edition, not
hobble me moble edition), built an eclipse plugin that gives you a
development environment that heavily leverages OSGI, built a &amp;ldquo;Virtual
Bug&amp;rdquo; so that you can test out your code without having to shuttle it to
the hardware every time you make a change. The example the kept using is
that, when released, you should be able to snap in the video camera, and
screen, and code up a working &amp;ldquo;security system&amp;rdquo; within a few minutes.
Basically just take the API that comes with the camera, write something
that detects changes and snaps a pic, and then displays those pics on
the screen. I&amp;rsquo;m not sure if they&amp;rsquo;ll actually have code that detects
changes in the video stream or if you&amp;rsquo;d have to hack that yourself but
the point is that you could, and the framework will be robust enough,
and each hardware module will come with a decent enough API, that you
won&amp;rsquo;t have to muck about with all the low level stuff, you&amp;rsquo;ll be able to
just have fun thinking up, and quickly implementing, new ways to use
it.&lt;/p&gt;
&lt;p&gt;They&amp;rsquo;re strategy isn&amp;rsquo;t just limited to the hardware though. They&amp;rsquo;re
putting together a site, and enough built in code on the hardware base,
that you&amp;rsquo;ll be able to plug it in to your computer, and drag apps that
other people have written, onto the hardware you plugged in and have it
install and be ready to go. It sounds like they&amp;rsquo;re going to try and
really focus on the community and have new hardware modules, and
probably core software come from the community instead of the company,
which I think is probably the best approach they could take. Another
nifty thing is that if someone requests some new hardware module, and
enough other people (probably around 200ish) are willing to commit their
credit cards to buying the new module, Bug Labs will go off and build
it. I would absolutely be willing to plunk down money for an effing bar
code scanner, but Delicious Monster has already shown us that you can
hack a passable one via a video camera (that&amp;rsquo;s what Delicious Library
uses if you don&amp;rsquo;t have a bar code scanner).&lt;/p&gt;
&lt;p&gt;I think it&amp;rsquo;s a great idea. I&amp;rsquo;m probably exactly the target market
they&amp;rsquo;re looking for. I&amp;rsquo;d be willing to plunk down $200+ dollars for a
cool platform with a nice dev environment that&amp;rsquo;ll let me make cool
things. I doubt I&amp;rsquo;d be willing to part with more than $300 though (for
the base unit), not when i can get a whole laptop for $500.&lt;/p&gt;
&lt;p&gt;The problem I think they may have, judging by some of the questions
asked, is that people will give it bad reviews because it doesn&amp;rsquo;t have
support for their favorite language built in, and doesn&amp;rsquo;t come with a
web browser. These type of suggestions / questions really bug me (no pun
intended). It&amp;rsquo;s like, listen people&amp;hellip; this is NOT a consumer device.
This is, unquestionably, a device for geeks. And when I say geeks I mean
programmers. And when I say programmers I mean people who know that AJAX
isn&amp;rsquo;t a language. You want to write webapps for / with this device?
Great, stick a web server on it and query it from your desktop. It&amp;rsquo;s not
a PDA.&lt;/p&gt;
&lt;p&gt;Maybe someone will come up with an idea that leverages the hardware to
address some vertical market, maybe inventory management tools in
warehouses, who knows. I know Bug Labs is hoping someone will but they
don&amp;rsquo;t seem to be betting the company on that.&lt;/p&gt;
&lt;p&gt;So, Bug == potential coolness. But don&amp;rsquo;t hold your breath as it&amp;rsquo;s going
to be end of this year, beginning of next before you can buy one, which
makes me wonder why they&amp;rsquo;re doing these meet-ups now&amp;hellip; I think whatever
buzz they generate will be long gone by the time it can actually be
converted into sales.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>What makes you so special?</title>
      <link>https://weblog.masukomi.org/2007/09/17/what-makes-you-so-special/</link>
      <pubDate>Mon, 17 Sep 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/09/17/what-makes-you-so-special/</guid>
      <description>&lt;p&gt;Seriously. What makes you so special? It&amp;rsquo;s not that you&amp;rsquo;re brilliant,
because, statistically speaking, you&amp;rsquo;re not. Sure there may be one or&amp;hellip;
maaaybe two brilliant people reading this. But, the odds are that you
aren&amp;rsquo;t them. So what makes you so special? The way I see it there are
three types of people:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The people who are brilliant.&lt;/li&gt;
&lt;li&gt;The people you look up to.&lt;/li&gt;
&lt;li&gt;Everyone else.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And, since it&amp;rsquo;s safe to say that you&amp;rsquo;re not brilliant, you&amp;rsquo;re either
someone people look up to or&amp;hellip; someone else. So, what makes you so
special? Are you actively pursuing your dream? Are you fighting for a
cause you believe in? Are you actively trying to be the best you could
be at whatever it is you do? Or, are you like everyone else?&lt;/p&gt;
&lt;p&gt;I work with coders, and I am happy to say that most of the people I work with are
really smart, and really good at what they do, but there are very few
whose work I would want to emulate. They&amp;rsquo;re like &amp;ldquo;everyone else.&amp;rdquo; And
that&amp;rsquo;s not bad. That is, in fact, quite normal. But, do you really want
to be normal? Maybe the &amp;ldquo;normal&amp;rdquo; people around you lead passionate and
powerful lives when they leave the office. I wish they did,
but I think most of them don&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;The sad fact of life in the USA is that
you are defined by your job. Your job takes up the vast majority of your
waking hours. When people meet you they ask what it is that you &amp;ldquo;do&amp;rdquo;
and, if you&amp;rsquo;re like most, you answer with your job, because it&amp;rsquo;s not
just others that define us by our jobs. Artists are one of the few
exceptions to this. When you ask an artist what they &amp;ldquo;do&amp;rdquo; they&amp;rsquo;ll say
&amp;ldquo;I&amp;rsquo;m an artist.&amp;rdquo;, or &amp;ldquo;I&amp;rsquo;m a painter.&amp;rdquo;, or something like that, even
though art is rarely what pays their rent or puts food on their table.&lt;/p&gt;
&lt;p&gt;I say this is a &amp;ldquo;sad fact of life&amp;rdquo; because, in the USA at least, people
generally don&amp;rsquo;t love their jobs. They generally do something they happen
to have skills for, or work in a position they happened to fall into. If
you&amp;rsquo;re like most people your job is something you do to get money to pay
the bills. Are you really happy about the idea of spending the rest of
your foreseeable future doing what you&amp;rsquo;re doing?&lt;/p&gt;
&lt;p&gt;There are a lot of talented people I
work with but, I think, for the most part, they aren&amp;rsquo;t passionate about
what they do. And if you&amp;rsquo;re not passionate about what you don&amp;rsquo;t have a
personal investment in the product of your labor. Sure you want it to be
good enough to not get fired but beyond that I wonder how many of you
really care. And, I&amp;rsquo;m not talking about my current job, I&amp;rsquo;m talking
about everyone I&amp;rsquo;ve encountered. I think my office would be a very empty
place if all the people who were just &amp;ldquo;going to work&amp;rdquo; suddenly
disappeared.&lt;/p&gt;
&lt;p&gt;But, I&amp;rsquo;ve realized something. I realized that it is not enough to &lt;em&gt;want&lt;/em&gt; to be someone worth looking up to. It is not enough to want to do or be better. You have to act. You
have to &lt;em&gt;actively&lt;/em&gt; work towards these things and that&amp;rsquo;s where most
people fail. They think that doing is harder than saying. But it isn&amp;rsquo;t.
It really isn&amp;rsquo;t. The key is to get your ass out of bed and do it. Every
day. That&amp;rsquo;s it.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not a hard thing. Build the best damn house you
can. Be the best damn parent you can. Be the best damn coder you can.
And every time you see yourself slacking you need to go back and fix it,
make it the best thing you can. Maybe you&amp;rsquo;re not great at what you do,
but you are the only thing preventing you from being the best you
possibly can be at what you do, and if you keep being the best you can
be, you&amp;rsquo;re just going to keep getting better. All you have to do is hold
yourself to your own standards, accept nothing less than the best from
yourself. How hard is that really?&lt;/p&gt;
&lt;p&gt;If you look at something you&amp;rsquo;ve just
done and think, &amp;ldquo;I really should have done x&amp;rdquo;, then go do x. Don&amp;rsquo;t just
move on and accept something you know isn&amp;rsquo;t right, and don&amp;rsquo;t allow
yourself to keep making the same mistakes. Learn from your actions, so
that next time you can be better. Make a promise to yourself that you
won&amp;rsquo;t accept anything less than the best you can do. When you find
yourself slacking go back and fix it. Repeat.&lt;/p&gt;
&lt;p&gt;I want to be someone worth looking up to, not because I want your admiration, or even your respect (although that would be nice), but because I have to live with myself and I am not OK with being another schlemiel, and neither should you.&lt;/p&gt;
&lt;p&gt;So, what makes you so special?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Kinesis Contoured Keyboard: first impressions</title>
      <link>https://weblog.masukomi.org/2007/09/15/kinesis-contoured-keyboard-first-impressions/</link>
      <pubDate>Sat, 15 Sep 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/09/15/kinesis-contoured-keyboard-first-impressions/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.kinesis-ergo.com/&#34;&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2007/9/15/kinesis_classic.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I just received my Kinesis Contoured keyboard and thought that those of
you who actually care about the ergonomics of your work environment
might appreciate my first impressions of it. I also needed an excuse to
type something so as to get used to it. ;)&lt;/p&gt;
&lt;p&gt;Now, before I get started I should mention, as many of you already know,
that I take my ergonomics seriously. I endured two weeks of painfully
slow typing while I retrained myself to use the Dvorak keyboard layout
because doing so involves provably less contorting and reaching, and is
thus less wear on your hands. Being a programmer, and wanting to
continue to be a programmer for the foreseeable future, and having the
tendency to come home and either write or code after a long day of
writing or coding I believe it to be in my best interest to take
preventative measures to not end up in wrist braces unable to type for
more than a few hours at a time. I use a trackball that involves minimal
thumb movement, and nothing else, and now I, finally, have a keyboard
that&amp;rsquo;s actually ergonomically designed. Let me explain&amp;hellip;&lt;/p&gt;
&lt;p&gt;&amp;lt;sarcasm&amp;gt;Unlike most &amp;ldquo;ergo&amp;rdquo; keyboard the Kinesis Contoured is, and I realize this
may sound a bit crazy at first, &lt;em&gt;contoured to fit your fingers&lt;/em&gt;. I know, I
know, you&amp;rsquo;re thinking &amp;ldquo;But masukomi! Fingers should be contoured to
match the shape of the keyboard not the other way around!&amp;rdquo; But, bear
with me. I think these Kinesis people may actually be on to something.
Instead of just splitting a keyboard so that your arms weren&amp;rsquo;t bent
anymore they actually discovered the amazing fact that finger-tips don&amp;rsquo;t
form a straight line! I know, who would have guessed?! So they went and
designed a keyboard where the keys that fell under your &amp;ldquo;longer&amp;rdquo; fingers
were farther away so that when you rest your fingers on the keyboard
they, get this, &amp;ldquo;rest&amp;rdquo; lightly against the keys without having the
longer fingers being arched back more than the shorter ones.&amp;lt;/sarcasm&amp;gt;&lt;/p&gt;
&lt;p&gt;Traditional keyboards which were designed with diagonal rows because
otherwise connecting the levers that moved the strikers would have been
much more difficult. Oddly most keyboard manufacturers don&amp;rsquo;t seem to
have noticed that we don&amp;rsquo;t have levers and strikers and paper rolled
around a drum any more. Kinesis, bright folks that they are, did notice
this. So they decided to lay the keys out in straight rows that aligned
with the way you curve your fingers back and out so no more shifting to
the side a little to get the key &amp;ldquo;below&amp;rdquo; the one your finger is
currently on. This is a decidedly weird feeling at first. You don&amp;rsquo;t
realize how many weird contortions you&amp;rsquo;ve been doing until you suddenly
have to train yourself to not do them any more.&lt;/p&gt;
&lt;p&gt;The arrow keys are no longer over in an inverted T that you have to move
your fingers away from the letters to use anymore. Instead they&amp;rsquo;re 2
rows below the home keys, which would absolutely suck on a traditional
keyboard but on this keyboard makes you go &amp;ldquo;Oh my god! I didn&amp;rsquo;t realize
reaching for arrow keys was just as bad as reaching for the mouse!&amp;rdquo; Of
course now they&amp;rsquo;re in a completely different place so that&amp;rsquo;s going to
take some getting used to but they feel so, &lt;em&gt;so&lt;/em&gt; much better in the new
place that I can&amp;rsquo;t wait to get used to them here.&lt;/p&gt;
&lt;p&gt;They&amp;rsquo;ve moved a few other non-letter keys around and for the most part I
agree with the choices, although I&amp;rsquo;m not sure what the thinking was
behind moving the = - and ~ keys around was. Getting used to the new
location of the control keys is also going to take some getting used to
but the space, backspace, and delete keys rock in their new homes: very
comfortable, very natural, although the space bar is only accessible
from the right hand so the default location might be an issue for
lefties, fortunately you can remap keys. As a lefty I&amp;rsquo;d probably swap
the sides of the four large thumb keys. You can take a gander at the
&lt;a href=&#34;http://www.kinesis-ergo.com/images/layout_contour-qd-usb.gif&#34; title=&#34;keyboard layout of the Contoured here&#34;&gt;keyboard layout of the Contoured
here&lt;/a&gt;.
So far the only keys that look as if they&amp;rsquo;re going to take any real time
to get used to are the arrow keys and the control other than that it&amp;rsquo;s
very nice. The number keys are now so easy to reach that I don&amp;rsquo;t think
I&amp;rsquo;m going to want to take advantage of the keypad option (like the one
on your laptop except it&amp;rsquo;s useful because the keys are in straight rows
not screwed up diagonals).&lt;/p&gt;
&lt;p&gt;The keyboard makes a small click when each key is activated which, if i
had of heard about beforehand would have turned me off, but it&amp;rsquo;s so
subtle that I wasn&amp;rsquo;t even sure it was happening, and while you can turn
it off I&amp;rsquo;ve come to the conclusion that it&amp;rsquo;s an excellent feature that&amp;rsquo;s
sorely lacking in other keyboards. The reason I like it is because I
actually tend to use real passwords with like thirteen characters,
numbers, and various capitalisation&amp;rsquo;s. The problem I have is that
sometimes in the middle of typing in a password I won&amp;rsquo;t know if I
actually pressed that key enough of if I just think I pressed the key
enough and if I press it again will I end up that character typed twice
or just once. I also type quickly (80-120wpm) and without looking at the
keyboard so I either have the option of stopping and counting how many
black dots are in the field or just wiping them all out and starting
over. Now I *know* when I&amp;rsquo;ve fully depressed a key enough to activate
it or not by if I&amp;rsquo;ve heard that subtle click or not. It&amp;rsquo;s not even
remotely annoying because the click of the actual keys being struck is
louder (no louder than most keyboards). So, it&amp;rsquo;s a nice subtle touch (no
pun intended).&lt;/p&gt;
&lt;p&gt;The one thing I really wish they had done differently was given it some
weight. When I spend $250+ dollars on a keyboard I want it to feel 6
times more expensive than a $40 keyboard. I want metal and impressive
thuds, but the overall construction feels no better or worse than any
standard $40 keyboard I&amp;rsquo;ve tried.&lt;/p&gt;
&lt;p&gt;Final verdict? This thing rocks and I&amp;rsquo;m pretty sure that I need to get
one for home now too because going back to that half-assed Microsoft
&amp;ldquo;Ergonomic&amp;rdquo; is going to suck after using something as nice as this all
day. I don&amp;rsquo;t even want to think about what typing on the horrid laptop
keyboards is going to feel like after this.&lt;/p&gt;
&lt;p&gt;And all of you people who keep saying &amp;ldquo;I can only type on a straight
keyboard&amp;rdquo; or &amp;ldquo;I like straight keyboards&amp;rdquo; should really stop for a minute
and ask yourself if whatever it is that keeps you from switching to
something that actually resembles the way your hands and arms are shaped
is really worth the increased risk of carpal tunnel? I don&amp;rsquo;t think it
really matters much for casual typists but if you spend your day
clicking away at a keyboard like I do then I think you should seriously
re-evaluate what you&amp;rsquo;re putting your hands, wrists, and arms through.
Sure those ergo keyboards may feel &amp;ldquo;weird&amp;rdquo; and make you type like a dork
at first but you get used to them really quickly (usually within an hour
or two) and you tend to find that the movements that are hardest to get
used to on the new keyboards are the ones that you really shouldn&amp;rsquo;t have
been doing in the first place. Maybe you&amp;rsquo;re not convinced enough to
plunk down� $250 dollars on a keyboard like this one. But maybe you
should consider something that&amp;rsquo;s at least a &lt;em&gt;little&lt;/em&gt; better than that
crap straight keyboard. And, at the very least, stop putting up those
little feet at the back of your keyboard. They force your wrists to bend
upwards more when they should really be straight like a concert
pianists. The only reason those feet exist is because typewriters used
to have to have rising rows of keys so that the levers didn&amp;rsquo;t collide.
Do you really think you should be compensating for non-existent levers?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>This morning at Akamai</title>
      <link>https://weblog.masukomi.org/2007/09/12/this-morning-at-akamai/</link>
      <pubDate>Wed, 12 Sep 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/09/12/this-morning-at-akamai/</guid>
      <description>&lt;p&gt;Six years ago Akamai lost&lt;a href=&#34;http://www.akamai.com/html/about/management_dl.html&#34; title=&#34;one of it&#39;s founders&#34;&gt;one of it&amp;rsquo;s
founders&lt;/a&gt;
in 9/11. It&amp;rsquo;s still quite evident what a blow it was to the people here
as he was apparently a man who lived life to the fullest and really
touched a lot of lives. How Akamai has chosen to deal with this loss has
really impressed me. The made a little park next to the office building
(at least i don&amp;rsquo;t think it was here before then) and planted a tree for
him. Instead of making some disconnected financial contribution to some
random charity they encourage employees to go help out at the food bank
or spend time at a children&amp;rsquo;s center. They give an award every year in
his name to employees who show the same kind of drive and passion that
Danny had. This morning there was a small service in the
park.&lt;a href=&#34;http://www.akamai.com/html/about/management_ps.html&#34; title=&#34;Paul&#34;&gt;Paul&lt;/a&gt;
and &lt;a href=&#34;http://www.akamai.com/html/about/management_tl.html&#34; title=&#34;Tom&#34;&gt;Tom&lt;/a&gt;
said a few words about Danny why trying not to cry. Then we had a moment
of silence and those who were close to him each laid a rose next to his
tree. Danny is never mentioned in the abstract here. He&amp;rsquo;s not some
random guy who a bad thing happened to. His spirit very much lives on in
Akamai, and that&amp;rsquo;s quite possibly the greatest tribute they could give
him. This morning emphasized one thing to me. That Akamai is one of the
few companies that really is a family. I may be on the outside edge of
that but I feel proud to be included at all.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Branching for atomic patches and cherry-picking</title>
      <link>https://weblog.masukomi.org/2007/09/10/branching-for-atomic-patches-and-cherry-picking/</link>
      <pubDate>Mon, 10 Sep 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/09/10/branching-for-atomic-patches-and-cherry-picking/</guid>
      <description>&lt;p&gt;The best thing about Distributed Source Control Managers (
&lt;a href=&#34;http://www.urbandictionary.com/define.php?term=imnsho&#34; title=&#34;In My Not So Humble Opinion&#34;&gt;IMNSHO&lt;/a&gt;
) is how quick and easy it is to branch and merge. The problem is that
most of us cut our teeth on centralized systems that couldn&amp;rsquo;t even hope to
take advantage of cherry picking, which is, in short the ability to take
a single patch out of the middle of a sequence of patches, or every
patch but one from a sequence. Just imagine knowing that there was a bug
introduced in a specific patch and being able to prune it from your
repository but not any of the patches around it. Or, plucking one little
feature out of a mass of others that should wait until the next release.
You can, but if you don&amp;rsquo;t make the effort to keep your patches as atomic
as possible you&amp;rsquo;ll find that that patch you want to remove or extract is
dependant upon another one, or more, that you may not want to involve.&lt;/p&gt;
&lt;p&gt;Which brings me to my hierarchy of branches. Now, I&amp;rsquo;m still working
with this concept so if you can improve upon it please let me know.
The idea is that most of the time you&amp;rsquo;re not
adding one little atomic feature, you&amp;rsquo;re adding a number of features
that can be conceptually clustered. So, you make a branch for the
cluster, but do no actual development directly in it. Then you branch
from there for each atomic feature (be sure to scroll down to the graph
below the fold here).&lt;/p&gt;
&lt;p&gt;While you are working on a feature feel free to commit as often as you
want. Check in broken or unfinished code. Pollute that branch&amp;rsquo;s revision
history with as much crap as you want. Do whatever it takes in there to
make sure you can roll back to any point you want, and never loose work.
Have a cron job check in any uncommitted changes to this micro-branch
every night in case you forget to. It doesn&amp;rsquo;t matter because you&amp;rsquo;re not
going to push the revision history back up to the branch for the feature
cluster. Instead you diff from the branch point and patch the cluster
branch and commit it. This way you&amp;rsquo;ve got one atomic revision with the
combined changes for that one small feature and if you need to prune it
for any reason (maybe it&amp;rsquo;s broken, or decided you should wait on adding
it) you can easily do so without worry of dependencies. Your micro
branch has all the details of the feature evolution if you really feel
you need it, but most of the time you&amp;rsquo;ll just delete it after creating
the patch and applying it to the cluster. Eventually the cluster will
have all the related features completed and checked in and it&amp;rsquo;s revision
history will consist of a series of atomic commits. The cluster&amp;rsquo;s
revision history is then pushed upstream to your personal development
branch. Occasionally you&amp;rsquo;ll have a small feature to work on with no
related ones to cluster. Just branch from your personal development
trunk and then patch back into it as you would have into a feature
cluster.&lt;/p&gt;
&lt;p&gt;Bugs should be treated in exactly the same way as features, although
you&amp;rsquo;ll find yourself with many more small bugs that don&amp;rsquo;t need a parent
cluster and can just be worked on in their branch and then used to patch
your personal development branch.&lt;/p&gt;
&lt;p&gt;People working farther upstream now have the option of cherry picking
features, feature clusters, bugs, and bug clusters, and will be able to
do so with much less worry of getting caught up with patches that depend
on other patches.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2007/9/10/heirarchy_of_branches.png&#34; alt=&#34;a heirarchy of
branches&#34;&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Dear Perforce: fuck you.</title>
      <link>https://weblog.masukomi.org/2007/08/31/dear-perforce-fuck-you/</link>
      <pubDate>Sat, 01 Sep 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/08/31/dear-perforce-fuck-you/</guid>
      <description>&lt;p&gt;Dear Perforce:&lt;/p&gt;
&lt;p&gt;Fuck you.&lt;br&gt;
Fuck you, you miserable, untrustworthy, misleading, overpriced bastard. I hope your office goes up in flames along with all your off-site backups. I pray that some open source product that actually works is embraced by all the major companies and drives you out of business. I hope that no other company is duped by your salespeople into thinking you have something even remotely close in quality to the ancient and craptastic product known as CVS. Never before have I experienced so much pain in the most simplistic of version control tasks as I have since starting to work at a company that made the mistake of considering you.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.masukomi.org/writings/best_practices/node11.html&#34;&gt;I am&lt;/a&gt; in total agreement with &lt;a href=&#34;http://www.youtube.com/watch?v=4XpnKHJAok8&#34;&gt;Linus&lt;/a&gt; that CVS is evil and that anyone who chooses to use it knowing the alternatives is both &amp;ldquo;stupid and ugly&amp;rdquo;, but I would switch from Perforce to CVS in a heartbeat. I would bow down an kiss CVS&amp;rsquo;s authors feet if I could avoid ever using your self flagellation &amp;ldquo;tool&amp;rdquo; again. I am currently the only one working in my codebase:&lt;/p&gt;
&lt;p&gt;Four times now I have come into work, started coding, and opened up a file that I edited, and submitted the day before only to find it&amp;rsquo;s at some prior version. Telling perforce to sync it just results in it telling me it *is* in sync. The end result is that i have to do a sync -f (which tells it to forcibly overwrite everything every morning or else risk screwing over my repo by editing and checking in a file that was rolled back without it telling me). No, unit tests don&amp;rsquo;t catch this problem because it will roll them back like anything else, and since I never intentionally check in failing code the test from before the mysterious rollback gives me a green bar just like the one after the rollback and it&amp;rsquo;s not like I memorize the number of tests I have in each project at the end of every day. Today it forced me to merge in &amp;ldquo;their&amp;rdquo; changes. Except I&amp;rsquo;m the only one working in the damn branch, and I&amp;rsquo;ve only got one &amp;ldquo;client&amp;rdquo; that refers to it.&lt;/p&gt;
&lt;p&gt;When you try and &amp;ldquo;integrate&amp;rdquo; (otherwise known as &amp;ldquo;merge&amp;rdquo;) files from folder A (where you&amp;rsquo;ve been working) into folder B it will tell you that &amp;ldquo;their&amp;rdquo; stuff has changes but &amp;ldquo;your&amp;rdquo; stuff is fine and would you like to accept &amp;ldquo;their&amp;rdquo; changes? You see &amp;ldquo;their&amp;rdquo; changes are the ones that YOU made in folder A and &amp;ldquo;your&amp;rdquo; changes are the ones (if any) from folder B that you weren&amp;rsquo;t screwing with and are trying to merge into.&lt;/p&gt;
&lt;p&gt;It changes the file permissions. It changes line endings. Yes there are preferences for both of these but there shouldn&amp;rsquo;t be. A version control system should never alter the files you put into it in any way. The command line tools are pure crap. If you want to do anything that isn&amp;rsquo;t trivial you essentially just have to use the GUI.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not smart enough to understand that a file that you&amp;rsquo;ve changed&amp;hellip; wait for it&amp;hellip;. is a file that you&amp;rsquo;ve changed!!! oh sure you can say &amp;ldquo;Please Mr. Perforce, I&amp;rsquo;d like to edit that file there please&amp;rdquo; and then it will know, but you can&amp;rsquo;t just edit a file. That&amp;rsquo;s crazy-talk in perforce land. If you try successive rollbacks of changesets it will start bitching about not wanting to clobber files that it just made writable when you did the last rollback even though you haven&amp;rsquo;t done anything but tell it to roll back a few times.&lt;/p&gt;
&lt;p&gt;It can&amp;rsquo;t scale. You want to put terabytes worth of data in it? It&amp;rsquo;ll let you, but if you dare try and request it you&amp;rsquo;ll either take down the box or prevent anyone else from being able to do anything on it.&lt;/p&gt;
&lt;p&gt;It alters file permissions in some 17th century attempt at &amp;ldquo;locking&amp;rdquo;. This is probably due to the fact that it can&amp;rsquo;t just tell that you&amp;rsquo;ve worked on a file. By making the files read only it forces you to tell it that you want to edit it, and thus enables it to know you&amp;rsquo;ve edited it. It will get confused and bitch about needing to submit files so you&amp;rsquo;ll tell it to submit but then there aren&amp;rsquo;t actually any files that need submitting so it creates a changeset with no files in it and then refuses to submit the changeset with no files in it. This changeset will then sit around mocking you until the sun explodes or you go and delete it&amp;hellip; delete the file that it told you you had to create and then refused to accept.&lt;/p&gt;
&lt;p&gt;It makes me waste hours every week fighting with it.&lt;/p&gt;
&lt;p&gt;Pitchforks and vile thoughts, -masukomi&lt;/p&gt;
&lt;p&gt;Update: Please note that I&amp;rsquo;m not just bitching about Perforce. No, I don&amp;rsquo;t like it, but I&amp;rsquo;ve done something about it. I went and wrote a tool to sync perforce with various Distributed Version Control Systems, but then I came to the conclusion that Git was just too damn cool to bother with the other ones, and switched to using Git with it&amp;rsquo;s git-p4 tool to sync to Satan, er, perforce. If you&amp;rsquo;re interested in that it can be found in the contrib directory of the git source. Just copy it to somewhere in your path and you&amp;rsquo;re good to go (requires Python).&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;followup&#34;&gt;Followup:&lt;/h2&gt;
&lt;p&gt;There have been quite a few comments and criticisms of this article, bot on this blog and on Reddit, and what follows is a rebuttal to those so &lt;em&gt;please feel free to skip it&lt;/em&gt;. The comments could basically be broken into three categories, but before I go into any of them I must point you to &lt;a href=&#34;http://programming.reddit.com/info/2n4qo/comments/c2n79x&#34;&gt;the best damn response anyone had to that post&lt;/a&gt;. Thanks keithb.&lt;/p&gt;
&lt;h3 id=&#34;ive-used-it-for-n-years-and-its-never-screwed-up-a-file--been-unstable-gone-down-comments&#34;&gt;I&amp;rsquo;ve used it for n years and it&amp;rsquo;s never screwed up a file / been unstable /gone down comments:&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;I&amp;rsquo;ve been using it for 4 years on my own project, never once running into any of the problems you talk about. -Michael G&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I only ranted about one thing that was broken (my weird rollback issue) everything else was an issue I had with something intentionally coded by Perforce&amp;rsquo;s developers.&lt;/p&gt;
&lt;p&gt;Perforce is not breaking for me. It&amp;rsquo;s behaving as designed, and that&amp;rsquo;s
almost as bad.&lt;/p&gt;
&lt;p&gt;To be totally clear: Perforce has recorded everything correctly, except for the fact that it will change line-endings on you, and yes I realize there is something you can config to control this, however I&amp;rsquo;m of the opinion that your version control system should never be second-guessing what you meant to stick in it. No files were corrupted or lost, and I don&amp;rsquo;t expect that it will do so at any point in the future.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I&amp;rsquo;d have to say that whatever its faults, it&amp;rsquo;s stable and reliable and does what it says on the box. -Jeremy O&amp;rsquo;Donoghue&lt;/p&gt;
&lt;p&gt;Perforce has been rock-solid for our group of ~10 developers and a codebase of 10,000+ files (text and binary), used from Linux and Windows and OS X. -Mike McNally&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I can&amp;rsquo;t argue with these statements even a little bit. I believe that the Perforce server is exactly as Jeremy describes it. I give the Perforce server every benefit of the doubt, because to-date, I have seen nothing to make me believe that it isn&amp;rsquo;t a solid, and reliable, repository for your code. My complaints lie entirely with its end user tools.&lt;/p&gt;
&lt;h3 id=&#34;you-just-dont-know-how-to-use-it--havent-given-it-a-chance--are-forcing-it-comments&#34;&gt;You just don&amp;rsquo;t know how to use it / haven&amp;rsquo;t given it a chance / are forcing it comments:&lt;/h3&gt;
&lt;p&gt;I have been able to get up and running with no notable difficulty with Bazaar, CVS, Darcs, Git, Mercurial (Hg), and Subversion, each in under an hour using only things I could google. I have given Perforce over two months. I have talked with a number of developers around me who have been using it for years.&lt;/p&gt;
&lt;p&gt;When I talk with experienced people the responses are either that they have no clue how to do some operation from the command line but they can in the gui, or they have a clue how to do it on the command line or gui but have absolutely no explanation for why the whack results we see. &lt;strong&gt;You are entirely correct when you suggest that I don&amp;rsquo;t know how to use it , but my point is that it shouldn&amp;rsquo;t take 2 months to figure out how to do basic Source Control Management operations (including branching and merging)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;There is no excuse for the fact that after using it for years the people around me still can&amp;rsquo;t explain why it does some of the whack crap it does and / or don&amp;rsquo;t know how to do some of the similar operations. I would suggest to you that Perforce&amp;rsquo;s user interaction is fundamentally flawed when using it is so unintuitive that after years of using it daily many people still don&amp;rsquo;t really understand how it works or the best way to use it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The only people who ever have any problems with it are the ones who don&amp;rsquo;t understand it and randomly try things to get it to work instead of asking for help. &amp;ndash; Bill Napier&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I don&amp;rsquo;t doubt this statement in the least. But instead of taking this as an indication of failure on the user&amp;rsquo;s part couldn&amp;rsquo;t it just as easily be considered a failure on the part of Perforce to provide its users with an intuitive interface? Perforce does not employ a paradigm that is significantly different from any other centralized Source Control Manager. As such, shouldn&amp;rsquo;t it&amp;rsquo;s &lt;em&gt;general&lt;/em&gt; usage be fairly similar and fairly intuitive to anyone who is familiar with using them?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It sounds to me like you&amp;rsquo;re trying to use Perforce as if it were a distributed system, when it&amp;rsquo;s the opposite. I suspect many of the problems you&amp;rsquo;re having with it are a result of your attempt to use it like svn, git, or darcs. You should use a system the way it was designed to be used, and if its architecture doesn&amp;rsquo;t benefit you or help your process in any way, then you shouldn&amp;rsquo;t be using it at all. -MCS&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Well, first off SVN isn&amp;rsquo;t a distributed system. With that noted, I consider Distributed Source Control Managers to be a very very recent blink in the history of computing. My first version control experiences were with CVS years ago, and later with SVN. I&amp;rsquo;m not coming to this from the perspective of some kid whose first experience with version control was with a distributed system and trying to shoehorn those ideas into a centralized system. I am very aware of the differences between them and while I was never thrilled with CVS or SVN I have no problem in using either of them. If anything Perforce should be &lt;em&gt;easier&lt;/em&gt; for me to get my head around than any of these new-fangled distributed doodads.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I think you&amp;rsquo;re being completely unfair on Perforce. The reliability &lt;em&gt;must&lt;/em&gt; be a configuration issue. The model is highly centralized, which sounds like it&amp;rsquo;s not what you want. -Jeremy O&amp;rsquo;Donoghue&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Actually, I really don&amp;rsquo;t mind centralized systems. I just don&amp;rsquo;t prefer
them. Also, reliability should &lt;em&gt;never&lt;/em&gt; be a configuration issue. I should never be able to misconfigure a version control system in such a way as to make it unreliable. Break it sure, but if it works at all it should work reliably. If you can&amp;rsquo;t rely on your version control system then there is something horribly wrong with the system.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I find the command-line tools to be very powerful and useful. -Mark Adams&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;They are. I can&amp;rsquo;t deny that the command line tools are both powerful and useful. Heck, it seems as if the GUI is just running those same command-line commands under the covers for almost every operation. I also believe that the &lt;a href=&#34;http://en.wikipedia.org/wiki/F-16_Fighting_Falcon&#34; title=&#34;F-16 Fighter&#34;&gt;F-16 Fighter&lt;/a&gt; plane is a very powerful and useful but that doesn&amp;rsquo;t mean that it even remotely approaches something that is actually usable without some serious training. Unfortunately, I think the same can be said about Perforce&amp;rsquo;s command line tools (although not as much training&amp;hellip; I hope)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;So Perforce takes a different approach - try getting the hang of it before ranting so aggressively. I found it awkward too when we started using it. -i_soar\&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Why do I feel like I&amp;rsquo;m the only one who sees the inherent problem with &amp;ldquo;I found it awkward too when we started using it&amp;rdquo;&amp;hellip; No. NO NO NO. This should NEVER be uttered. Perforce has been around for over a decade, and people have been getting familiar with Source Control Managers for even longer. There is absolutely no excuse for the basic version control operations being anything other than easy at this point. Perforce has had plenty of time to refine their interface, to do crazy things like add an effing &amp;ldquo;move&amp;rdquo; command (Yes I know about the integrate command. It&amp;rsquo;s not the same thing). It&amp;rsquo;s fine to say some new, fresh out of beta tool is awkward. It&amp;rsquo;s fine to say that some tool that uses an entirely different paradigm than you&amp;rsquo;re used to is awkward. It is unacceptable for an app as old as Perforce in a paradigm as old as centralized source control management.&lt;/p&gt;
&lt;h3 id=&#34;i-agree-with-perforce-suckage-comments&#34;&gt;I agree with Perforce suckage comments:&lt;/h3&gt;
&lt;p&gt;Thanks. It&amp;rsquo;s nice to know that I&amp;rsquo;m not the only one.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Code Underwriters</title>
      <link>https://weblog.masukomi.org/2007/08/31/code-underwriters/</link>
      <pubDate>Fri, 31 Aug 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/08/31/code-underwriters/</guid>
      <description>&lt;h2 id=&#34;code-underwriters&#34;&gt;Code Underwriters&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;http://www.lloyds.com/&#34; title=&#34;They&#39;ll insure anything.&#34;&gt;Lloyds of London&lt;/a&gt;
is able to do what they do thanks to the concept of
&lt;a href=&#34;http://en.wikipedia.org/wiki/Underwriting&#34; title=&#34;underwriters&#34;&gt;underwriters&lt;/a&gt;.
The simplistic version is that a risk is spread amongst a group of
underwriters. If nothing goes wrong they get a cut of the profits
relative the the percentage of the risk they took on. If things go wrong
they take pay for whatever portion of the risk they agreed to take on.&lt;/p&gt;
&lt;p&gt;It occurred to me that being a software developer is in many ways like
being an underwriter, except, in most cases, without the big payoff. You
see, each developer on a project tends to take responsibility for a
portion of the code-base. We talk about spreading this responsibility
around by increasing &lt;a href=&#34;https://en.wikipedia.org/wiki/Bus_factor&#34;&gt;the bus count&lt;/a&gt;
but the fact of the matter is that this rarely ever happens.&lt;/p&gt;
&lt;p&gt;Most code-bases tend to be divided into sections each with a bus count of one
or two. When something goes wrong the developer(s) responsible for the
responsible piece of code are generally expected to do whatever it takes
to make it work now. In some cases this means being woken at 3AM,
hauling your butt into work, and remaining there until the bug is
squashed. Just like an underwriter at Lloyds, the more risk you take
responsibility for the more screwed you&amp;rsquo;ll be when things eventually go
wrong. Unlike a Lloyds underwriter we don&amp;rsquo;t get a cut of the profits
relative to the amount of responsibility we take on.&lt;/p&gt;
&lt;p&gt;It is, obviously, quite debatable just what portion of the profits
would constitute a &amp;ldquo;fair&amp;rdquo; portion of the profits, but in general we just
get paid our salary. The first employees of a company frequently do get
the payout, but most developers aren&amp;rsquo;t them. I&amp;rsquo;ve also heard tale of
magical things called &amp;ldquo;bonuses&amp;rdquo; but it seems rare that developers
actually get them or that they&amp;rsquo;re enough to buy you more than one box
under the Christmas tree if you do see them. So, for the most part, we
can treat these things as non-existent, which brings us back to our
salary. Which is, in many ways, like insurance. While you don&amp;rsquo;t get a
huge portion of the profits, you do get a guarantee of sorts from your
employer that you&amp;rsquo;ll continue to get paid well even if things don&amp;rsquo;t work
out. Which makes your employer a fellow underwriter in the development
of your software.&lt;/p&gt;
&lt;p&gt;There are three things that need to be underwritten in any given
software project: The effort that will be required to fix things when
they break, the money that will be required to finance the fixing of
broken things, the money that will be required to finance the creation
of potentially broken things. There&amp;rsquo;s also the money required to finance
the project(s) needed to compensate for the projects that didn&amp;rsquo;t bring
in more money than they cost to create and/or maintain but that&amp;rsquo;s a bit
too recursive for this example.&lt;/p&gt;
&lt;p&gt;From a financial standpoint, I think it&amp;rsquo;s understandable why developers
don&amp;rsquo;t get a larger cut of the profits. While the worst case scenario for
us is rather unpleasant, it&amp;rsquo;s also very short lived. But, we still get
paid quite well during all those months and years when the project
wasn&amp;rsquo;t bringing in anything notable, and even when it tanks.&lt;/p&gt;
&lt;p&gt;Unfortunately developers are human, and humans are emotional creatures.
We tend to not pay attention to the thing that are present in our every
day lives, like regular paychecks, and focus on the atypical large
events. Like having a fear of flying. If you&amp;rsquo;re afraid of flying then
your brain is not paying fair attention to the boring everyday fact that
millions of people are whizzing about the skies without any problems.
It&amp;rsquo;s just that when a plane goes down it does so in such an atypically
spectacular way, and that&amp;rsquo;s what we focus on.&lt;/p&gt;
&lt;p&gt;So I&amp;rsquo;d like to propose a couple things for my fellow code underwriters
to help mitigate our risk, and thus minimize the atypical large events
and bring our perceptions more in line with the small portion of the
risk that we&amp;rsquo;re actually taking on.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Write your tests: unit, integration, and system. It&amp;rsquo;s like getting
underwriters for the risk you&amp;rsquo;ve underwritten yourself. They&amp;rsquo;ll put
in the hours of work patrolling your code and making sure it isn&amp;rsquo;t
broken so that you don&amp;rsquo;t have to put in the hours fixing the code
later.&lt;/li&gt;
&lt;li&gt;Increase your bus count. The bigger the bus count the more people
you can throw at the problem so as to fix it faster and / or the
greater the likelihood that the problem can be assigned to someone
other than you.&lt;/li&gt;
&lt;li&gt;Practice &lt;a href=&#34;https://weblog.masukomi.org/2007/8/30/defensive-programming-101&#34; title=&#34;Defensive Development&#34;&gt;Defensive
Development&lt;/a&gt;.
You don&amp;rsquo;t wear a bicycle helmet because you&amp;rsquo;re afraid of falling
over. You wear a bicycle helmet because you&amp;rsquo;re afraid someone else
will make you fall over.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Defensive Programming 101</title>
      <link>https://weblog.masukomi.org/2007/08/30/defensive-programming-101/</link>
      <pubDate>Thu, 30 Aug 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/08/30/defensive-programming-101/</guid>
      <description>&lt;h2 id=&#34;defensive-programming-101&#34;&gt;Defensive Programming 101&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;For any given programmer the following statement should always be
treated as truth:&lt;br&gt;
My code sucks, but your code sucks more - &lt;a href=&#34;http://daveastels.com/&#34;&gt;Dave Astels&lt;/a&gt; [deleted post]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Good version control habits and test coverage will get you out of most
jams related to your own code but we rarely write apps that are
comprised of just our code. There are almost always libraries from other
people code that you’ll include to save yourself from having to
re-invent the wheel. Obviously you don’t want to start writing unit
tests for code from other projects (you’d never finish) but there are
some basic steps you can take to minimize your chances of failure.\&lt;/p&gt;
&lt;h3 id=&#34;untrustable-code&#34;&gt;Untrustable code&lt;/h3&gt;
&lt;p&gt;The fact is that no matter how good your code is you just can’t trust
anything you didn’t write. Furthermore, you can’t trust what people will
do with their code.&lt;/p&gt;
&lt;p&gt;You can’t trust other people’s code because it rarely has good test
coverage or documentation so you can’t be sure if it is broken, or if it
works the way you think it does. And unless it’s a huge open source
project you can generally assume that not many people have looked at it
either.&lt;/p&gt;
&lt;p&gt;You can’t trust what they will do with their code because it’s their
code not your code. Whoever “they” are they’ve got their own ideas about
where it’s going next and how to get it there, and they may not jive
with how you want to use it.&lt;/p&gt;
&lt;p&gt;Your project must never rely on the successful build of another project,
because it may depend on the successful build of yet another project, or
even worse, end up in a sea of circular dependencies.&lt;/p&gt;
&lt;p&gt;The results of another project’s “current” build should similarly not be
trusted. It’s probably not tested well, the implementation could change
completely tomorrow, and it may just be buggy. Whenever possible only
use release builds. If you can’t use a release build at least try and
use one that other people have had success with for a little while.&lt;/p&gt;
&lt;h3 id=&#34;untrustable-people-and-environments&#34;&gt;Untrustable people and environments&lt;/h3&gt;
&lt;p&gt;Even if you take all the steps possible to defend against other people’s
bad code there’s still the fact that humans are incredibly fallible.&lt;/p&gt;
&lt;p&gt;You can not assume that the correct libraries will be where they’re
“supposed to be” or that the version that is there is 100% compatible
with the version you coded against. Even if it is you can’t assume that
someone won’t go and “upgrade” it to a version that isn’t compatible.
Always bring your own libraries and keep them local to your app. Disk
space is cheap and unless you’re on an embedded device it’s better to
bring along copies of the libraries you coded against. It doesn’t matter
if the ones you bring along are completely outdated relative to the
latest version; what’s important is that you can guarantee that the
version you coded against works.&lt;/p&gt;
&lt;p&gt;Your project must never rely on another project or its libraries.
Period. You can not assume that the other project will be on every box
your project is installed on or that the version on those boxes be in a
state that is either working or compatible with yours. Take whatever you
need from their project and copy it into yours. If you need libraries
that it generates or contains, copy them. If you must use source code
copy it but be very careful. You don&amp;rsquo;t want to end up forking it and
having to maintain your own version. Instead, copy it in but do whatever
it takes to make it blazingly obvious that the code should not be edited
unless absolutely necessary. When you do copy over make sure to copy the
smallest amount possible. If you can, build it into a separate library
file that you can update when the need arises.&lt;/p&gt;
&lt;p&gt;You also can’t assume that someone isn’t going to screw up a config
file, and that includes you. Just like libraries, bring your own. Maybe
you’re working on a webapp which has some global configuration file
that’s shared by other webapps on the same box. Don’t trust it. Yes use
it so that you’ll be in sync with the other apps but since you can’t
guarantee that some sysadmin won’t accidentally delete or change some
piece of it that’s crucial to your app bring along a fallback with some
bare bones settings that should work under any circumstance you can
prepare for. This is exactly why your operating system has a “safe
mode”. The operating system developers know you can’t trust the users
not to accidentally screw something up or install an app that screws
something up. Have a fallback.&lt;/p&gt;
&lt;p&gt;If your app is configured differently for different deployments (maybe
you’ve got a dev box, a QA box, and a production box, each with their
own different database settings) then have a separate config file for
each deployment. Don’t have a single config file with different sections
that get commented or uncommented based on which deployment it is. You
simply can’t guarantee that you, or your coworkers, won’t forget to
comment or uncomment the right bits when deploying.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>99 Lines of code on the wall...</title>
      <link>https://weblog.masukomi.org/2007/08/19/99-lines-of-code-on-the-wall/</link>
      <pubDate>Mon, 20 Aug 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/08/19/99-lines-of-code-on-the-wall/</guid>
      <description>&lt;p&gt;99 lines of code on the wall.&lt;br&gt;
99 lines of code.&lt;br&gt;
You look around, refactor it down&amp;hellip;&lt;br&gt;
98 lines of code on the wall.&lt;/p&gt;
&lt;p&gt;98 lines of code on the wall.&lt;br&gt;
98 lines of code.&lt;br&gt;
You look around, refactor it down&amp;hellip;&lt;br&gt;
97 lines of code on the wall.&lt;/p&gt;
&lt;p&gt;Or, alternately&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;singVerse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;numLines&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;numLines&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nb&#34;&gt;document&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;write&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;numLines&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34; lines of code on the wall.\\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nb&#34;&gt;document&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;write&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;numLines&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34; lines of code.\\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nb&#34;&gt;document&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;write&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;You look around, refactor it down...\\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nx&#34;&gt;numLines&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nb&#34;&gt;document&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;write&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;numLines&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34; lines of code on the wall.\\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nx&#34;&gt;singVerse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;numLines&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;numLines&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nb&#34;&gt;document&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;write&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Totally bug free code on the wall\\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nb&#34;&gt;document&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;write&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Need more tests for the code on the wall.\\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;singVerse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;99&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>The best argument for compiled languages</title>
      <link>https://weblog.masukomi.org/2007/08/19/the-best-argument-for-compiled-languages/</link>
      <pubDate>Sun, 19 Aug 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/08/19/the-best-argument-for-compiled-languages/</guid>
      <description>&lt;p&gt;I keep thinking back to a short comment at BarCamp Manchester
in the Unit Testing talk. When asked if anyone had written an app with
100% code coverage the guy beside me raised his hand. Now I&amp;rsquo;ve been
advocating for a while now that it&amp;rsquo;s essentially wasted time to bother
testing your getters and setters, and when I mentioned something to this
effect he said, &amp;ldquo;How do you know you haven&amp;rsquo;t made a typo in a variable
name?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&amp;hellip;&lt;/p&gt;
&lt;p&gt;My mind just kind of spun for a second on that one for a second. I guess
I&amp;rsquo;ve been in Java land for so long that the concept of having such a
thing exist for more than a few seconds just doesn&amp;rsquo;t enter my brain. I
mean first off, the IDE will bitch at you, because it can&amp;rsquo;t compile it,
and even if you&amp;rsquo;re not using an IDE the compiler will bitch at you. I
just responded that &amp;ldquo;I use a compiled language so that&amp;rsquo;s never something
I have to worry about.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Now, as many of you know I&amp;rsquo;m still a huge fan of languages like
&lt;a href=&#34;https://weblog.masukomi.org/2007/7/31/you-treat-her-like-a-sex-toy&#34;&gt;Perl&lt;/a&gt;
and Ruby so I work in them fairly often. And I still say that it&amp;rsquo;s not
worth your time writing tests for your getters and setters even in them
because unlike Java these languages don&amp;rsquo;t have IDEs that happily spit
out a getter and setter for every variable in your class regardless of
if you need it or not. As a result, you only create the ones you need.
And if you need them, then they&amp;rsquo;re going to be used, and if they&amp;rsquo;re
used, you can pretty much guarantee that you&amp;rsquo;ll see the results of any
typos show up really quickly when you test the methods that actually do
something noteworthy, because they&amp;rsquo;ll use the getters and setters
(otherwise why did you write them?) and either blow up when the compiler
hits them or not work as expected, which is why you&amp;rsquo;re writing a test.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>You treat her like a sex toy.</title>
      <link>https://weblog.masukomi.org/2007/07/31/you-treat-her-like-a-sex-toy/</link>
      <pubDate>Tue, 31 Jul 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/07/31/you-treat-her-like-a-sex-toy/</guid>
      <description>&lt;p&gt;You treat her like a sex toy.&lt;br&gt;
Just pulling her out&lt;br&gt;
when you need a quickie.&lt;/p&gt;
&lt;p&gt;She’s not like that you know.&lt;br&gt;
She wants a real relationship&lt;br&gt;
and she’s more than capable&lt;br&gt;
of supporting one.&lt;/p&gt;
&lt;p&gt;But that’s all you ever see her for…&lt;br&gt;
A quickie. A little bit-o-feel-good.&lt;br&gt;
You pop her off to get the job done&lt;br&gt;
but turn your nose up at her&lt;br&gt;
when you catch a glimpse&lt;br&gt;
of how kinky she’ll let you get.&lt;/p&gt;
&lt;p&gt;You think her “objects” are fake.&lt;br&gt;
But I’ll tell you something:&lt;br&gt;
they are as real as that Java bitch’s&lt;br&gt;
and twenty times more flexible.&lt;/p&gt;
&lt;p&gt;You don’t see her for the powerful&lt;br&gt;
woman she is.&lt;br&gt;
You think she’s not good enough&lt;br&gt;
for your “Enterprise”&lt;br&gt;
and then you go and use her again…&lt;br&gt;
squeezing in another quick one&lt;br&gt;
between your “real” apps&lt;br&gt;
when nobody’s looking.&lt;/p&gt;
&lt;p&gt;She deserves better than you.&lt;br&gt;
She deserves someone who’ll&lt;br&gt;
appreciate her, who’ll dress her up,&lt;br&gt;
and make her look pretty.&lt;br&gt;
Someone who won’t be ashamed&lt;br&gt;
to take her out in public.&lt;/p&gt;
&lt;p&gt;Someone who’s loved her&lt;br&gt;
since the beginning and isn’t&lt;br&gt;
afraid to admin it…&lt;br&gt;
isn’t afraid to sing it from the rooftops!&lt;/p&gt;
&lt;p&gt;I LOVE YOU &lt;a href=&#34;http://www.perl.com/&#34; title=&#34;PERL&#34;&gt;PERL&lt;/a&gt; !&lt;br&gt;
And I always will!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Who Cares About Performance</title>
      <link>https://weblog.masukomi.org/2007/07/13/who-cares-about-performance/</link>
      <pubDate>Fri, 13 Jul 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/07/13/who-cares-about-performance/</guid>
      <description>&lt;p&gt;Justin James&lt;a href=&#34;http://blogs.techrepublic.com.com/programming-and-development/?p=436&#34; title=&#34;asks why nobody seems to care about performance anymore&#34;&gt;asks why nobody seems to care about performance
anymore&lt;/a&gt;.
He talks about how the performance hit you get from using a &amp;ldquo;slow&amp;rdquo;
language directly translate into increased hardware and electricity
costs just to maintain the same kind of performance you would have had
if you&amp;rsquo;d used a &amp;ldquo;fast&amp;rdquo; language or spent more time optimizing your code.&lt;/p&gt;
&lt;p&gt;All his points are good, but they&amp;rsquo;re also all irrelevant. You see, for
most applications the performance hits you get from slow languages or
non-optimized code just don&amp;rsquo;t matter. Your system will still be
responsive enough that no-one will be bothered. People don&amp;rsquo;t care
because it just doesn&amp;rsquo;t have any &lt;em&gt;noticeable&lt;/em&gt; effect on the end product
and &lt;a href=&#34;http://www.ruby-lang.org/&#34; title=&#34;some languages&#34;&gt;some languages&lt;/a&gt; make
coding far more enjoyable and productive. Their productivity gains far
outweigh performance hits that are almost unnoticeable by end users.&lt;/p&gt;
&lt;p&gt;This is exactly why Ruby on Rails is kicking ass and taking names. It&amp;rsquo;s
not terribly performant. Ruby is unquestionably a slow language. The
huge infrastructure of RoR makes it even slower&amp;hellip; but it makes
developers incredibly productive and the resulting sites are &amp;ldquo;fast
enough&amp;rdquo;, especially if you take the time to host them with the correct
tools.&lt;/p&gt;
&lt;p&gt;Before I started working at Akamai I was one of those people who
just didn&amp;rsquo;t care about performance and you would have been hard pressed
to convince me that coding for performance really mattered for anyone
who wasn&amp;rsquo;t coding something like a router or OS Kernel. That was until I
started being presented with numbers that just blew my mind. Our group
is currently just looking at a very small subset of the data that flows
through Akamai&amp;rsquo;s pipes and we still have to process hundreds of millions
of log lines per hour. I remember amazed by &lt;a href=&#34;http://www.sics.se/~joe/apachevsyaws.html&#34; title=&#34;a graph showing Yaws handling 80,000&#34;&gt;a graph showing Yaws
handling
80,000&lt;/a&gt;
concurrent connections per second while Apache keeled over at 4,000.
&amp;ldquo;80,000!&amp;rdquo; I thought. &amp;ldquo;With performance like that we could blow through
those logs. Now lets see&amp;hellip; Hundreds of millions divided by 80,000
is&amp;hellip;. oh&amp;hellip; not&amp;hellip; even&amp;hellip; close.&amp;rdquo;
&lt;a href=&#34;http://www.erlang.org/&#34; title=&#34;Erlang&#34;&gt;Erlang&lt;/a&gt; could be an incredible tool
for some of the tasks here but even a language with incredible
concurrency support like Erlang isn&amp;rsquo;t, alone, enough to deal with the
sheer scale of things here. You have to care about performance at
Akamai. It&amp;rsquo;s not just what we sell to our customers, it&amp;rsquo;s the only way
for us to survive what we sell to our customers. I still believe that
for most developers language and framework choices are more important
that worrying about performance, but now I understand what a sheltered
view of the world I had and how that view fits into the larger world.
Joining Akamai combined with a recent series of small performance
related events has opened my eyes to just what a dramatic choice it can
make when you do start taking performance into account. Yes things are
generally &amp;ldquo;fast enough&amp;rdquo; but you will kick your competitors asses when
their products are &amp;ldquo;fast enough&amp;rdquo; but yours is instantaneous. &amp;ldquo;Lightning
fast&amp;rdquo; is a more compelling feature than you would ever guess. It&amp;rsquo;s
pointless market-speak in a feature list but once you experience it it&amp;rsquo;s
damn hard to walk away.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Java: The Mediocre Date</title>
      <link>https://weblog.masukomi.org/2007/07/01/java-the-mediocre-date/</link>
      <pubDate>Sun, 01 Jul 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/07/01/java-the-mediocre-date/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been programming in Java professionally for years now, and while
I&amp;rsquo;ve become good at it, it&amp;rsquo;s never grown into a language I&amp;rsquo;ve been
passionate about. It&amp;rsquo;s powerful, has tons of good libraries and tools
but&amp;hellip; It&amp;rsquo;s like going out on a nice date with someone but having no
desire to ask them out for a second. You wouldn&amp;rsquo;t mind another dinner
with them, and since you&amp;rsquo;ve got a common circle of friends you probably
will, but you&amp;rsquo;re never going to get the butterflies in the tummy when
you think about seeing them again. I&amp;rsquo;ve met a lot of people who&amp;rsquo;ve been
out on a date with Java, and so far none of them seem to have tummy
butterflies either.&lt;/p&gt;
&lt;p&gt;Veritable religious wars break out over languages like Python, Perl,
and Ruby, even C++ has it&amp;rsquo;s zealots but Java? People use Java because
it&amp;rsquo;s stable, it&amp;rsquo;s got good tools, it can scale, and when you mention it
to your customers they&amp;rsquo;ve heard of it and can nod as if they have a
clue. Java is the &lt;a href=&#34;http://en.wikipedia.org/wiki/IBM&#34; title=&#34;IBM&#34;&gt;Big Blue&lt;/a&gt; of
languages. &amp;ldquo;Nobody ever got fired for choosing IBM.&amp;rdquo; they would say.
People learn Java because they can get jobs in it. People learn Ruby
because she&amp;rsquo;s hot, and when you start fooling around she makes some
incredible noises.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m sure Java and I will keep having dinners together but we both know
it&amp;rsquo;s just business. In the meantime I&amp;rsquo;m going to see about getting
another date with that Perl chick. Everyone else has written her off
like &lt;a href=&#34;http://en.wikipedia.org/wiki/Hermione_Granger&#34; title=&#34;Hermione&#34;&gt;Hermione&lt;/a&gt;,
because of her frizzy hair. But I know the truth. She&amp;rsquo;s gorgeous when
she wants to be and under all that frizz lies a dam sexy brain.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Libraries, Boston, Alexandre Vattemare, and me.</title>
      <link>https://weblog.masukomi.org/2007/06/30/libraries-boston-alexandre-vattemare-and-me/</link>
      <pubDate>Sat, 30 Jun 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/06/30/libraries-boston-alexandre-vattemare-and-me/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/masukomi/675539168/&#34;&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2007/6/30/bpl_courtyard.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;One
of my favorite places in Boston is one of it&amp;rsquo;s best kept secrets. It&amp;rsquo;s
not obvious how to get there, or that it even exists, but secreted
within the bowels of the &lt;a href=&#34;http://www.flickr.com/search/?s=int&amp;amp;w=all&amp;amp;q=%22boston+public+library%22&amp;amp;m=text&#34; title=&#34;Photos of the BPL on Flickr&#34;&gt;Boston Public
Library&lt;/a&gt;
is a beautiful courtyard. It&amp;rsquo;s a wonderful, quiet, relaxing place to
spend an afternoon reading. There&amp;rsquo;s even a little coffee shop just
before one of it&amp;rsquo;s entrances.&lt;/p&gt;
&lt;p&gt;This afternoon I went on an excursion. In &lt;a href=&#34;https://weblog.masukomi.org/2007/5/28/math-is-for-people-who-aren-t-content-with-the-status-quo&#34; title=&#34;Math is for people who aren&#39;t content with the status-quo&#34;&gt;my quest to expand my
mathematical knowledge&lt;/a&gt;
I bit off a bit more than I was ready to chew with &lt;a href=&#34;http://www.amazon.com/Nature-Mathematical-Modeling-Neil-Gershenfeld/dp/0521570956/&#34; title=&#34;The Nature of Mathematical Modeling&#34;&gt;The Nature of
Mathematical Modeling&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It came highly recommended and would be great knowledge for my new job,
if only I had the mathematical vocabulary required to read it. So, a few
steps back, maybe &lt;a href=&#34;http://www.randomhacks.net/articles/2007/03/07/hefferon-linear-algebra-review&#34; title=&#34;a refresher course in linear algebra&#34;&gt;a refresher course in linear
algebra&lt;/a&gt;.
But, alas, I had to return it having barely started in on it, and that&amp;rsquo;s
what brought me to the library, where I was given a wonderful reminder
of the power of unexpected individuals.&lt;/p&gt;
&lt;p&gt;You see, once upon a time there was a french man named Alexandre
Vattemare with a talent for voices. Some have called him the world&amp;rsquo;s
greatest ventriloquist, but that is only what made him famous, not what
made him great. Alexandre&amp;rsquo;s talents enabled him to travel the world,
meet emperors and the crowned heads of Europe, and that enabled him to
make connections. Alexandre used those connections to create a system of
international exchanges between libraries which later expanded to
include art, maps, and specimens of natural history. It was because of
him that a young United States came to acquire 300,000 volumes for it&amp;rsquo;s
libraries, and because of him that the Boston Public Library came to
be.&lt;/p&gt;
&lt;p&gt;I have long believed that the public library is one of the greatest
things about the United States. It&amp;rsquo;s not that we have them, it&amp;rsquo;s that
they are supported by law, that they are open to anyone without regard
to money, status, or even citizenship. They aren&amp;rsquo;t owned, and thus
controlled, by private individuals. The people of every state have
collectively decided to build and support an institution where everyone
can go to better themselves even if they don&amp;rsquo;t have a penny to their
name.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t think many of us have any idea just how amazing this is. I
don&amp;rsquo;t think many people have given it much thought, or realize that this
is something that simply doesn&amp;rsquo;t exist for many people around the world.
What an incredible privilege it is to have a place you can go to learn
the skills you need to do practically anything&amp;hellip; It&amp;rsquo;s a place where you
can go and learn that no matter how quirky your skill or personality,
you have the power to change the world, because there are hundreds of
volumes on people like Alexandre Vattemare whose penchant for making
cadavers &amp;ldquo;speak&amp;rdquo; got him expelled from medical school and, ultimately,
gave me my favorite place in Boston.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Why you shouldn&#39;t dismiss Perl so quickly</title>
      <link>https://weblog.masukomi.org/2007/06/22/why-you-shouldnt-dismiss-perl-so-quickly/</link>
      <pubDate>Sat, 23 Jun 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/06/22/why-you-shouldnt-dismiss-perl-so-quickly/</guid>
      <description>&lt;p&gt;A reader commented that&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;the syntax of Perl is so hideous and mysterious it produces
unmaintainable code (I know having maintained a multi-tier Perl
webapp).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And, sadly, he&amp;rsquo;s not the only one that shares that belief. Perl has been
written off by many talented developers because essentially every piece
of Perl code they&amp;rsquo;ve ever encountered is, well, crap. But, when you get
right down to it you&amp;rsquo;re basing your opinion of a language based on what
people write with it. It&amp;rsquo;s like saying that the English language sucks
because there are so many vile and crappy things written in it.&lt;/p&gt;
&lt;p&gt;Perl is quite possibly the most flexible modern programming language.
But, as with anything, &lt;a href=&#34;http://www.newsfromme.com/archives/2005_10_06.html&#34; title=&#34;great power comes with great responsibilty&#34;&gt;great power comes with great responsibility&lt;/a&gt;. Perl geeks believe &amp;ldquo;&lt;a href=&#34;http://computing-dictionary.thefreedictionary.com/There&#39;s+More+Than+One+Way+To+Do+It&#34; title=&#34;There&#39;s more than one way to do it.&#34;&gt;There&amp;rsquo;s more than one way to do
it.&lt;/a&gt;&amp;rdquo;
where as Python geeks follow a slightly different way&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Python philosophy [is] that &amp;ldquo;There should be one&amp;ndash; and preferably
only one &amp;ndash;obvious way to do it.&amp;rdquo; That is, I can write a multitude
of programs that do exactly the same thing in python in different
styles and methods, but there is only one way that is Pythonic&amp;hellip; What
Python does is emphasize a standard quality and method for doing
various tasks instead of just hacking it together. - &lt;a href=&#34;http://www.geekfire.com/~alex/blog/&#34; title=&#34;Alexander Botero-Lowry&#34;&gt;Alexander
Botero-Lowry&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So, if you&amp;rsquo;re working with undisciplined idiots, there&amp;rsquo;s no question,
choose a language like Python. But, what happens when the Pythonic way
of expressing an idea doesn&amp;rsquo;t quite mesh with the idea you are trying to
express?&lt;/p&gt;
&lt;p&gt;In Python you&amp;rsquo;ll generally just have to deal and find a way of
coding what you wanted to express that isn&amp;rsquo;t very &amp;ldquo;Pythonic&amp;rdquo; or that
ends up being more verbose. In Perl there&amp;rsquo;s probably another handful of
ways to express the same concept. It&amp;rsquo;s like always having a kick ass
thesaurus available.&lt;/p&gt;
&lt;p&gt;Yes, this means you&amp;rsquo;ll eventually speak with words
other people aren&amp;rsquo;t familiar with yet or do things in ways others may
not be so kosher with. But Perl is all about letting you work in
whatever way / style feels best to you. This can obviously lead to
situations where different people don&amp;rsquo;t agree with how something&amp;rsquo;s been
implemented even if it&amp;rsquo;s very sensible. What you need to keep in mind
though, is that the readability and maintainability are the direct
result of the experience, discipline, and consideration given for other
developers by the person writing the code.&lt;/p&gt;
&lt;p&gt;The problem with Perl is that
it makes it incredibly easy for a person with no discipline or limited
experience to express themselves badly&amp;hellip; very badly. Combine that with
the fact that it&amp;rsquo;s so easy to get something that works in Perl when you
haven&amp;rsquo;t a clue how to code well in any language and the problem just
compounds itself.&lt;/p&gt;
&lt;p&gt;It is very easy to write readable and maintainable
Perl code, but to do so requires discipline. It&amp;rsquo;s the difference between
giving a kindergartner a generous palette of oil paints and giving one
to Michelangelo. The paint is capable of producing a masterpiece in his
hands, but the kindergartner is just going to make a finger-paintey
mess. Don&amp;rsquo;t blame the paint. Likewise, don&amp;rsquo;t blame Perl for the crap
that idiots and newbs produce with it. Instead, go buy them a copy of
&lt;a href=&#34;http://www.amazon.com/Code-Complete-Second-Steve-McConnell/dp/0735619670/&#34; title=&#34;Code Complete&#34;&gt;Code
Complete&lt;/a&gt;
and make every-one&amp;rsquo;s life a little bit better.\&lt;/p&gt;
&lt;p&gt;And yes, before anyone mentions it, Perl&amp;rsquo;s OOP tools seem a bit hackish
and can feel bolted on. But once you start to understand how they work
they&amp;rsquo;re incredibly flexible and let you do things that you couldn&amp;rsquo;t hope
to touch in Java. And yes, Perl does have a number of funky looking
operators like $# but you really only need to know a few of them. If
you don&amp;rsquo;t like them you&amp;rsquo;ll be happy to know that they weren&amp;rsquo;t too
thrilled with the number of them when they started planning Perl 6.
Speaking of which, there are some truly awesome things that have been
put into Perl 6 and they&amp;rsquo;ve cleaned up a lot of the syntactic issues
people frequently bitch about&amp;hellip;but there will still always be more than
one way to do &amp;ldquo;it&amp;rdquo; so you&amp;rsquo;ll still be able to write ugly code if you
don&amp;rsquo;t know any better.&lt;/p&gt;
&lt;p&gt;A note about Python: Python rocks. It just has a very different mindset
to Perl. Python isn&amp;rsquo;t a language for &amp;ldquo;undisciplined idiots&amp;rdquo; as I implied
above, but it is a better language to have undisciplined idiots coding
in because while their code may still be crap you&amp;rsquo;ll at least be able to
read it because of the formatting limitations and the
intentionally limited number of choices for how to do any given thing.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The trials and tribulations of employment verification</title>
      <link>https://weblog.masukomi.org/2007/06/22/the-trials-and-tribulations-of-employment-verification/</link>
      <pubDate>Fri, 22 Jun 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/06/22/the-trials-and-tribulations-of-employment-verification/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve just clicked send on my letter of resignation. Doing it in person
wasn&amp;rsquo;t an option as my bosses are in NJ and I&amp;rsquo;m in MA. It was scary as
hell to click that button because today was the end of a long stretch of
serious mis-communications related to verifying my past employment and a
significant portion of my brain is in a state of denial that the job
offer is finally finalized. Because a few of you still haven&amp;rsquo;t heard the
details please allow me to explain what has been happening over the past
few weeks. If you don&amp;rsquo;t know me and don&amp;rsquo;t care about the problems I
encountered getting my new job because of HireRight please just take
this simple piece of advice and then stop reading: ALWAYS keep some
pay-stubs from your past employers. ALWAYS keep your w2s / 1099s and
ALWAYS keep in touch with your past managers.&lt;/p&gt;
&lt;p&gt;You see, my new employer uses a company called HireRight to do their
past employment verification checks which normally isn&amp;rsquo;t an issue. The
recruiter I was dealing with said that she had a couple failed dot com
companies on her resume and it wasn&amp;rsquo;t a problem for her. HireRight
called the one company I had a number for and stuck my social security
number into some database for the other two recent employers, other than
my current one, and came up with bupkis. When the easy way failed they
asked me to provide w2 forms or pay-stubs from those employers which is
where things started going wrong because I don&amp;rsquo;t have any. Not only
haven&amp;rsquo;t I been keeping them, I generally shred anything I don&amp;rsquo;t need
that has information that could be used to steal my identity (not that
it would get anyone very far). I&amp;rsquo;m not even going to go into how
amazingly stupid it is for a company whose job is to prove someone isn&amp;rsquo;t
lying about their work history to prove their own work history. If I was
less ethical I would have just photoshopped a fake w2 and faxed it to
them. If I had of known the shit that was going to follow I may have
anyway&amp;hellip;&lt;/p&gt;
&lt;p&gt;Now, before you ask&amp;hellip; no, I have no fear of being audited. I owe the
IRS a fair amount of money and have been dealing with them for a while
to pay it back. They are awesome. Yes, you heard me right. The people at
the IRS kick ass, and I have talked with a lot of them. I know that they
have accurate records on me and if they did randomly audit me things
would come out essentially the same as they already are. No I wouldn&amp;rsquo;t
be able to prove anything but they would only be able to charge me for
what they&amp;rsquo;re already charging me for&amp;hellip;.but all of that is irrelevant to
the story I was trying to tell you.&lt;/p&gt;
&lt;p&gt;So, after a week of HireRight twiddling their thumbs my new employer
decided to take matters into their own hands and asked for a list of
people to contact and w2s or pay-stubs from past employers. I&amp;rsquo;m not sure
why they asked for those as they already knew I didn&amp;rsquo;t have them from
the BS with HireRight but anyway&amp;hellip; Their application form which I had
filled out already included the standard space for three references and
an indication that at least one should be a manager. So I listed three
references one of which was a manager. The first problem was that, for
reasons unknown to me they either thought I hadn&amp;rsquo;t listed a manager or
they thought that since the one one person I listed as a manager was
mentioned as also being a coworker he was unable to act as a manager
reference. I don&amp;rsquo;t know which and I don&amp;rsquo;t care. They also said they
wanted a second manager&amp;rsquo;s reference. Which meant I needed to do some
serious sleuthing to track down some contact info I didn&amp;rsquo;t have.&lt;/p&gt;
&lt;p&gt;The next problem was that when they contacted Autonomy about my
employment at Virage (a company they bought). Autonomy claimed they had
no record of me even though I was definitely on the Autonomy payroll for
a while. I think they probably talked to the wrong office but I&amp;rsquo;ve been
in contact with the correct office and I can&amp;rsquo;t get a response out of
them either confirming or denying my having worked there. They also
called IBM, who I had indicated had bought a company I worked at called
iPhrase. IBM claimed they had no record of me either but I was never on
IBM payroll and this didn&amp;rsquo;t actually surprise me too much. This is
pointed out to me and everyone agreed that this was an issue that had to
be addressed.&lt;/p&gt;
&lt;p&gt;I pointed out that two of my references were coworkers at Virage /
Autonomy and that if they trusted them to be truthful about their
experiences working with me it logically stood to reason that they
trusted them to be truthful about the fact that I actually did work with
them and thus they had two points of verification of my employment their
even though neither were “official” whatever “official” is in this
context. I offered them the contact information of a coworker at iPhrase
/ IBM as a form of verification there and politely suggested that I
would kick Autonomy&amp;rsquo;s ass and see what I could do about IBM.&lt;/p&gt;
&lt;p&gt;They then called my references which was fine until they talked to the
person I marked as a manager. You see I said he was my manager, and
separately I said he was a coworker at Virage and could confirm I worked
there. They, understandably, combined the two data points and assumed he
was my manager at Virage. So they asked him, “Were you Kay&amp;rsquo;s manager at
Virage?” to which my friend honestly replied “no”&amp;hellip;. They didn&amp;rsquo;t think
to ask him if he was my manager anywhere else and he assumed the
conversation would just get around to that point later, but, alas, it
did not.&lt;/p&gt;
&lt;p&gt;I then received a letter saying, essentially, “Why did you claim someone
was your manager who wasn&amp;rsquo;t and why don&amp;rsquo;t the companies you claimed to
have worked for have any record of you?”&amp;hellip;. THAT was the start of a
VERY stressful day for me. Let&amp;rsquo;s summarize shall we?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Two companies claim they have no record of me&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I have no w2 or pay stubs proving that they&amp;rsquo;re wrong.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The person I claimed was my manager told them he wasn&amp;rsquo;t.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Insert hyperventilation and depression here. “There is no way I&amp;rsquo;m
getting this job.” I think to myself. I wouldn&amp;rsquo;t hire me with that list.&lt;/p&gt;
&lt;p&gt;I wrote them a letter explaining about his being a manager and asked him
to e-mail them a note explaining the situation in terms of his
conversation with them. I suggested that if we could get to a point
where everything was approved except needing one more manager reference
I&amp;rsquo;d happily call up my former manager at my current employer but was
hesitant to do so because he still comes into the office one a month and
I didn&amp;rsquo;t want it getting back to them. Given, I think if I asked him he
wouldn&amp;rsquo;t mention anything but I&amp;rsquo;d feel like crap once a month when he
stops by to grab mail and shoot the breeze with us knowing that we both
knew I wanted to leave but that my fellow coder in the office didn&amp;rsquo;t. I
also attempted to point out that in the worst case scenario MA was an
employee at will state and as such they wouldn&amp;rsquo;t be stuck with me if it
turned out I was full of shit. Apparently I came off as preachy / snotty
/ something I wasn&amp;rsquo;t aiming for.&lt;/p&gt;
&lt;p&gt;As luck would have it my friend from iPhrase knew how to get a hold of
iPhrase&amp;rsquo;s Director of Finance and even better, he remembered me! [Chris
I SO owe you.] He offered to talk to my new employer and explain that
IBM only bought iPhrase&amp;rsquo;s assets not the company. So IBM had absolutely
no reason to have any record of me. Furthermore iPhrase doesn&amp;rsquo;t even
exist as a shell company. I have a feeling he said something else
convincing because my new manager&amp;rsquo;s conversation with him seems to have
been what turned the tide. Then I finally got a hold of my manager at
iPhrase who was willing to be act as another manager reference and was
obviously a person of authority to confirm that I actually worked there.
I&amp;rsquo;m not sure if they ended up talking with him or not.&lt;/p&gt;
&lt;p&gt;The new tally stood at:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Two companies claiming they have no record of me&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;One we now have an explanation for and two people (one the
Director of Finance) willing to attest to my having worked
there.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;One who we now have three people, one of which was my manager,
willing to attest to my having worked there.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I still have no pay stubs or w2s&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The person I claimed was a manager has been able to convince them,
truthfully, that even though he wasn&amp;rsquo;t my manager at Virage he
really was my manager at other places. He actually remembered one I
had forgotten. I&amp;rsquo;ve known him for 17 years and have worked over,
under, and beside him on many occasions.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It&amp;rsquo;s still not as glowing as you&amp;rsquo;d like but if you look at it logically
it&amp;rsquo;s reasonable to believe that I actually worked where I claimed I did.&lt;/p&gt;
&lt;p&gt;Today I received an e-mail saying they had the “Green Light” to hire me.
I&amp;rsquo;ll be starting on the 2nd. I responded with:&lt;/p&gt;
&lt;p&gt;A) Holy Crap!&lt;br&gt;
B) Holy Crap!&lt;br&gt;
C) *checks for solar flares*&lt;br&gt;
D) (see A &amp;amp; B)&lt;/p&gt;
&lt;p&gt;I also let them know how thankful I was that they were willing to stick
with me and hire me after all that bullshit. I recognize that they are
taking a bit of a chance. Tim, Catherine, anyone else who was involved:
THANK YOU!! From the bottom of my heart.&lt;/p&gt;
&lt;p&gt;The downside is that I&amp;rsquo;ve obviously started this new adventure on the
wrong foot. The upside is they&amp;rsquo;re getting someone absolutely determined
to prove her worth and that they didn&amp;rsquo;t make the wrong decision.&lt;/p&gt;
&lt;p&gt;I am ecstatic. I am thrilled. I am absolutely bouncing in anticipation
of this new position. The challenge I&amp;rsquo;ll be helping to tackle really has
my mind buzzing. My new manager has known from the beginning what my
major concerns are and how I feel about the process of managing
software. And as if that wasn&amp;rsquo;t good enough my new employer is a fifteen
minute stroll from my house, I will actually be paid a decent wage, and
every developer there gets their choice of mac or pc laptop in addition
to a nicely decked out desktop.&lt;/p&gt;
&lt;p&gt;No, I won&amp;rsquo;t tell you what I&amp;rsquo;m going to be working on. It&amp;rsquo;s a secret. And
I&amp;rsquo;m going to avoid mentioning my new employers name for a while because
I&amp;rsquo;m cautious like that.&lt;/p&gt;
&lt;p&gt;To anyone at my new employer who may be reading this: HOLY FUCK! I AM
REALLY EXCITED TO BE WORKING WITH YOU AND I CAN&amp;rsquo;T WAIT TO START.&lt;/p&gt;
&lt;p&gt;P.S. I am still going to track down my records at Autonomy because I may
need them in the future and it&amp;rsquo;s bullshit that they claimed I hadn&amp;rsquo;t
worked for them.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>A thought exercise for programmers</title>
      <link>https://weblog.masukomi.org/2007/06/21/a-thought-exercise-for-programmers/</link>
      <pubDate>Thu, 21 Jun 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/06/21/a-thought-exercise-for-programmers/</guid>
      <description>&lt;p&gt;In the not so recent &amp;ldquo;outsourcing&amp;rdquo; episode of 30 days the American whose
job has been outsourced to India goes there and comes to a number of
interesting realizations including this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Knowing that probably like 16 people are surviving off of my one job
&amp;hellip; it’s almost like charitable at that point. They need the job way
more than I do.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Your thought exercise for the day is to answer this question: What can
you do as a developer to justify yourself as being more valuable than
sixteen Indians?&lt;/p&gt;
&lt;p&gt;Restrictions: If you are going to participate in this thought exercise
you can&amp;rsquo;t just blow it off by suggesting that outsourced code sucks. I
have seen many examples and yes, it generally does, but there are also
many good examples of outsourced code. Either way, can you honestly
say that yours is so much better that you should keep your job when the
alternative is, in essence, to let sixteen other people benefit from the
work assigned to you? This is not a question you can get out of on
technicalities like pointing out that they could get other jobs or that
the economics aren&amp;rsquo;t actually that cut and dry. It is a question of
morality and value.&lt;/p&gt;
&lt;p&gt;I think there are less than 100 coders out there whose contributions can
pass this test. I don&amp;rsquo;t think I am one of them&amp;hellip;yet. You probably
aren&amp;rsquo;t either. So what can we do as coders that can benefit others so
much that it would be morally better for us to keep our jobs than giving
them to sixteen others? The two biggest things that come to my mind are
teaching and becoming a major contributor to a software project that
significantly benefits thousands of people.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>O&#39;Reilly: a publisher with a brain</title>
      <link>https://weblog.masukomi.org/2007/06/21/oreilly-a-publisher-with-a-brain/</link>
      <pubDate>Thu, 21 Jun 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/06/21/oreilly-a-publisher-with-a-brain/</guid>
      <description>&lt;p&gt;O&amp;rsquo;Reilly has just agreed to assign&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;the full copyright in the book &amp;ldquo;Perl 6 and Parrot Essentials&amp;rdquo; to
The Perl Foundation. The text is out-of-date, but can be updated much
more rapidly than it can be rewritten from scratch.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Three cheers for O&amp;rsquo;Reilly. I wish more publishers would stop being so
damn stupid when it comes to the copyright on old books that they have
no intention of reprinting. Especially geek books which are frequently
outdated and no-one would want them if they were reprinted (not
rewritten).&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Geeks Don&#39;t Touch</title>
      <link>https://weblog.masukomi.org/2007/06/19/geeks-dont-touch/</link>
      <pubDate>Tue, 19 Jun 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/06/19/geeks-dont-touch/</guid>
      <description>&lt;p&gt;Have you noticed? Geeks don&amp;rsquo;t touch. I noticed this in myself a while
ago, and have since been watching other geeks to confirm my theory. I
was at the &lt;a href=&#34;http://boston.rubygroup.org/&#34; title=&#34;Boston Ruby User&#39;s Group&#34;&gt;Boston Ruby User&amp;rsquo;s
Group&lt;/a&gt; a week
ago and essentially no-one touched. When two geeks are introduced,
unless it&amp;rsquo;s a somewhat formal introduction like an interview, we don&amp;rsquo;t
shake. When we encounter each other, or go our separate ways, there&amp;rsquo;s no
casual touching. Many will actually wave at each other in greeting from
a few feet apart so as to avoid the simple touch that normal people
would expect. I think this is a byproduct of the fact that so many developers
are &lt;a href=&#34;https://en.wikipedia.org/wiki/Autism_spectrum&#34;&gt;autistic&lt;/a&gt; regardless
of if they realize it or not.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;Some may even be
&lt;a href=&#34;http://en.wikipedia.org/wiki/Pathology&#34; title=&#34;Pathology&#34;&gt;pathologically&lt;/a&gt;
sensitive to loud noises (as some people with AS have
&lt;a href=&#34;http://en.wikipedia.org/wiki/Hyperacusis&#34; title=&#34;Hyperacusis&#34;&gt;hyperacusis&lt;/a&gt;),
strong smells, or dislike being touched; for example, certain children
with AS exhibit a strong dislike of having their head touched or their
hair disturbed while others like to be touched but dislike loud
noises. - &lt;a href=&#34;http://psychology.wikia.com/wiki/Asperger_syndrome&#34;&gt;Psychology Wiki&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I wouldn&amp;rsquo;t say that most geeks are &amp;ldquo;pathologically sensitive&amp;rdquo; to touch
but please don&amp;rsquo;t think that the geek in your life is being antisocial,
or intentionally rude, or anything like that if they eschew the common
social touches. I think that most of us just don&amp;rsquo;t like to touch anyone
who isn&amp;rsquo;t particularly close to us emotionally.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Programming books for newbs</title>
      <link>https://weblog.masukomi.org/2007/06/14/programming-books-for-newbs/</link>
      <pubDate>Thu, 14 Jun 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/06/14/programming-books-for-newbs/</guid>
      <description>&lt;p&gt;If you&amp;rsquo;re reading this blog there&amp;rsquo;s a fair chance you&amp;rsquo;re a programmer
and that means that from time to time you&amp;rsquo;ll
encounter people who want advice on leaning how to program.
Unfortunately, it&amp;rsquo;s hard
to point them in the right direction because we generally don&amp;rsquo;t want to
spend the time to teach them ourselves and even if we did most of the
learning to program books just plain suck.&lt;/p&gt;
&lt;p&gt;So, I&amp;rsquo;d like to recommend two
books. The first is &lt;a href=&#34;http://www.pragmaticprogrammer.com/titles/fr_ltp/index.html&#34; title=&#34;Learn to Program by Chris Pine&#34;&gt;Learn to Program by Chris
Pine&lt;/a&gt;.This is the best intro to programming that I&amp;rsquo;ve ever seen. It&amp;rsquo;s not
concerned so much with how to do things in a specific language as it is
with teaching people the basic principles of programming although it
uses Ruby to do so. It&amp;rsquo;s based on a series of &lt;a href=&#34;http://pine.fm/LearnToProgram/&#34; title=&#34;tutorials that are still online&#34;&gt;tutorials that are still
online&lt;/a&gt;
but have been improved on, and expanded upon greatly in the book.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s also &lt;a href=&#34;http://www.amazon.com/JavaScript-Beginners-Second-John-Pollock/dp/0072227907/&#34; title=&#34;JavaScript: A Beginner&#39;s Guide by John Pollock&#34;&gt;JavaScript: A Beginner&amp;rsquo;s Guide by John
Pollock&lt;/a&gt;
which does a surprisingly good job of teaching basic programming concepts
with JavaScript. It&amp;rsquo;s not that JavaScript makes this hard, it&amp;rsquo;s that
most of the books get sidetracked on doing html specific things instead
of actually teaching people to program. Yes, the Rhino book
(&lt;a href=&#34;http://www.amazon.com/JavaScript-Definitive-Guide-David-Flanagan/dp/0596101996/&#34; title=&#34;JavaScript: The Definitive Guide&#34;&gt;JavaScript: The Definitive
Guide&lt;/a&gt;
) is undeniably a good JavaScript book but it&amp;rsquo;s not good for people who
don&amp;rsquo;t know how to program.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>What developers can learn from ancient stadium builders</title>
      <link>https://weblog.masukomi.org/2007/06/04/what-developers-can-learn-from-ancient-stadium-builders/</link>
      <pubDate>Mon, 04 Jun 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/06/04/what-developers-can-learn-from-ancient-stadium-builders/</guid>
      <description>&lt;p&gt;I just read &lt;a href=&#34;http://www.csoonline.com/read/050107/fea_crowds.html&#34; title=&#34;an article that compared the crowd management techniques used in the stadium in ancient Pompeii to modern techniques&#34;&gt;an article that compared the crowd management techniques
used in the stadium in ancient Pompeii to modern
techniques&lt;/a&gt;,
and while it&amp;rsquo;s an interesting read all by itself, and I do recommend you
read it, I got to wondering about how similar ideas would apply to
software design.&lt;/p&gt;
&lt;h2 id=&#34;build-a-bigger-bathroom&#34;&gt;Build a bigger bathroom.&lt;/h2&gt;
&lt;p&gt;He&amp;rsquo;s actually talking about the bathrooms and concession stands but
there are a couple applicable bits here: The bathrooms are an incredibly
important part of any stadium. They also have nothing to do with the
core purpose of a stadium. Keith recommends three things in regards to
their creation:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Keep them separate from the main stadium because mixing them in just
causes congestion and increases anxiety.&lt;/li&gt;
&lt;li&gt;Make them big. In a stadium environment your bathrooms are generally
accessed in waves. The average number of people who use it per
minute may be quite load and lead you to think you don&amp;rsquo;t need big
ones, but the usage pattern is anything but steady.&lt;/li&gt;
&lt;li&gt;Make sure you have plenty of space to get to and from them for the
same reason you need to make them big.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The software analogies are fairly obvious. Most applications have
support systems that are completely unrelated to the core function of
the app. Lets look at &lt;a href=&#34;http://www.last.fm&#34;&gt;Last.fm&lt;/a&gt; for example. They&amp;rsquo;ve
got an &lt;a href=&#34;http://www.audioscrobbler.net/&#34;&gt;underlying
system&lt;/a&gt;(Audioscrobbler) that manages the
incoming data from peoples music apps. Without this, Last.fm wouldn&amp;rsquo;t
work but nobody says &amp;ldquo;Oh I want to use Audioscrobbler.&amp;rdquo; Hell, most
people don&amp;rsquo;t even know what it is. No, people say &amp;ldquo;I want to see what
the people I know are listening to.&amp;rdquo; or, &amp;ldquo;I want to share my playlists
with people.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Last.fm just wants to show people lots of interesting
music stuff so that they can sell advertising and convince you to buy
things on Amazon for which they get a cut. If they could accomplish this
without having to write plugins for music apps or tons of bandwidth
costs from people sending in track data I&amp;rsquo;m sure they would.&lt;/p&gt;
&lt;p&gt;In the
meantime though, Last.fm has to be careful that there&amp;rsquo;s a big pipe between
Audioscrobbler and the web site. It needs to be separate because it&amp;rsquo;s
NOT the core product and issues that effect one shouldn&amp;rsquo;t have a
negative impact on the other. They&amp;rsquo;ve also got to make sure that the
Audioscrobbler servers are big enough to handle the surges. If not
people will stop using the main site. They&amp;rsquo;ve also got to be easily
accessible. This means good APIs so that other people will find it easy
to implement and big pipes so that when the morning rush hits they&amp;rsquo;ll be
up to the challenge.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;At Pompeii, he says, “they clearly planned for the rush that would
occur at the end of a spectacle. You had the same human needs”—to
visit rest rooms—“but the layout and design made the whole dynamic of
moving to and from much better.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;separate-queues-from-promenades&#34;&gt;Separate Queues from Promenades.&lt;/h2&gt;
&lt;p&gt;This is actually tied to the bathrooms and concessions, but the point is
that you don&amp;rsquo;t want the traffic that&amp;rsquo;s central to your app getting
bogged down by data that&amp;rsquo;s queued up for a completely different, but
related, system. This doesn&amp;rsquo;t just apply to bandwidth and cycles though.
It also applies to design. Break your functionality down into
appropriately separated bits. You shouldn&amp;rsquo;t have a method that handles
moving objects around two sections of the system when it&amp;rsquo;s much more
sensible to have one for each.&lt;/p&gt;
&lt;p&gt;Open Open Open!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Here’s a challenge: Look for areas of Pompeii’s stadium where
bottlenecks might occur, where the crowd could overwhelm a space.
Still says you won’t find them. Seats are at the optimum viewing
angle, and seating &amp;ldquo;packing densities are to comfort, not cost.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Similarly it&amp;rsquo;s important when writing code to keep in mind that
functionality might expand beyond your original intent. Keep that in
mind and you&amp;rsquo;ll not have to worry about being straight-jacketed into
convoluted or restrictive pieces of code to implement new functionality.
Make sure your code has room to breathe.&lt;/p&gt;
&lt;h2 id=&#34;build-a-big-road&#34;&gt;Build a Big Road&lt;/h2&gt;
&lt;p&gt;I think this mostly speaks to bandwidth and processor cycles and
remembering that we are rarely so lucky as to have constant usage
patterns.&lt;/p&gt;
&lt;h2 id=&#34;limit-corners&#34;&gt;Limit Corners&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Modern stadiums often maintain the oval seating but then put blocky
concourses around it. They also use switchback walkways and stairs.
All of that creates corners. Corners force people to slow down and
encourage congestion. Pompeii’s concourses were elliptical; few
corners exist to slow people down. Still says this also evened out
flow to the vomitories [&lt;a href=&#34;http://www.merriam-webster.com/dictionary/vomitory&#34;&gt;entrancies piercing the banks of seats
of a theater, amphitheater, or stadium&lt;/a&gt;] as people could, like
liquid, choose the path of least resistance easily without interrupting
their pace.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;To me this speaks to good APIs and good GUIs. &lt;a href=&#34;http://www.rubyonrails.org&#34;&gt;Ruby on
Rails&lt;/a&gt; is all about minimizing corners in
the APIs. The goal is to make the process of developing a webapp a
simple easy flow. You don&amp;rsquo;t have to stop and deal with some complexity
here, or some thing unrelated to what you&amp;rsquo;re trying to work on. No,
Rails lets you just keep moving forward with your development, impeding
you as little as possible, and each successive version of the app has
minimized more and more corners.&lt;/p&gt;
&lt;p&gt;When it comes to good GUIs you need to apply the same principle. Users
shouldn&amp;rsquo;t have to stop and do something only tangentially related to
accomplish their task. Consider where people are going and make it so
that they can get there with as few course changes as possible.&lt;/p&gt;
&lt;h2 id=&#34;limit-options&#34;&gt;Limit Options&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;In crowd management, the maxim called &lt;a href=&#34;http://en.wikipedia.org/wiki/Braess&#39;_paradox&#34;&gt;Braess&#39;
paradox&lt;/a&gt; states that
more options equals decreased performance. That is, if you give people
many routes to choose from, crowd traffic will slow down because of
indecisiveness and selfish behavior when choosing one of the paths.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The guys over at &lt;a href=&#34;http://www.37signals.com&#34;&gt;37Signals&lt;/a&gt; have been
preaching this and implementing it to great success for years now. It&amp;rsquo;s
similar to limiting corners because each corner is work and when there&amp;rsquo;s
work people make a conscious or unconscious decision regarding whether
or not it&amp;rsquo;s worth the work. When we limit options we&amp;rsquo;re minimizing the
number of decisions a user has to make to accomplish their task, and as
a result, we&amp;rsquo;re minimizing corners. Users frequently request every
conceivable option and configuration control but when you actually give
it to them they don&amp;rsquo;t want it. It would be like an mp3 player with 37 switches
12 sliders and 4 knobs. Sure it would let you get your music exactly how
you wanted it but it would be too much of a pain in the ass to use so
you&amp;rsquo;d trash it and go buy an iPod.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d recommend checking out &lt;a href=&#34;http://gettingreal.37signals.com/&#34;&gt;Getting
Real&lt;/a&gt; by the 37Signals guys if you
haven&amp;rsquo;t already, because limiting options and corners is central to the
process they describe.&lt;/p&gt;
&lt;h2 id=&#34;anxiety-control&#34;&gt;Anxiety Control&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Still says facility managers “can shift the behavior of a crowd. Good
signage and lighting, for example, will reduce anxiety. People need
information before they approach the crowd. If one person has to ask
where their seat is, then 140 people have to ask. Now there’s a backup
and people are frustrated. Now those frustrated people sense
disorganization and start acting out. Others take that cue and the
anxiety feeds on itself. People say it’s the crowd’s fault. No. As the
facility managers, you shape the behavior.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In our world anxiety doesn&amp;rsquo;t grow into a stampede, it turns into bad
word of mouth and users who won&amp;rsquo;t use your software. So, make sure your
users have all the information they need to accomplish their tasks but
don&amp;rsquo;t overwhelm them with tons of docs. Imagine if you were at the
stadium and had to read through five paragraphs of signage just to
figure out where to pee. Obviously you can help reduce anxiety by
limiting options and corners too.&lt;/p&gt;
&lt;h2 id=&#34;nuceria-vs-pompeii&#34;&gt;Nuceria vs. Pompeii&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;During games between bitter rivals Pompeii and neighboring Nuceria in
A.D. 59, the historian Tacitus writes of an altercation that “arose
out of a trifling incident at a gladiatorial show. During an exchange
of taunts&amp;hellip;abuse led to stone-throwing, and then swords were
drawn.”&amp;hellip; This might seem to disprove Still’s notion of best
practices in ancient crowd control. To the contrary, Still says.
“Think of the fact they could have a sword fight in the stands, what
that meant about how they had very free movement in the stands. And
because of the space, people could cluster away from the small pockets
of danger, preventing small incidents from becoming bigger ones.” The
violence, in other words, was not a stampede or a crush. Today, nearly
all crowd incidents affect the innocent, who simply can’t escape.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We can learn a few lessons from this.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Make sure that one user&amp;rsquo;s craziness can&amp;rsquo;t force itself onto others.&lt;/li&gt;
&lt;li&gt;Make sure your app can handle the fact that some people will come in
carrying unexpected items (ideas of usage and/or data).&lt;/li&gt;
&lt;li&gt;Make sure your entire app doesn&amp;rsquo;t come crashing down when problems
break out in one or more sections. Yeah, you won&amp;rsquo;t be able to use
that one piece but maybe you should be able to use the other pieces
without it.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;respect-personal-space&#34;&gt;Respect Personal Space&lt;/h2&gt;
&lt;p&gt;In ancient Pompeii they made sure that everyone had the appropriate
amount of elbow-room in each section of the stadium. As developers we
need to recognize in advance which portions of the app will be working
hardest and plan accordingly. Mostly this speaks to optimization and
scaling. Early optimization is generally a bad idea but that doesn&amp;rsquo;t
mean you should ignore optimizing sections where it&amp;rsquo;s &lt;em&gt;obvious&lt;/em&gt; you&amp;rsquo;ll
need good performance and if there&amp;rsquo;s a good chance you&amp;rsquo;ll need to spread
some section of your app over multiple boxes then you should plan for it
from the start.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Excellent tip for interviewers of geeks</title>
      <link>https://weblog.masukomi.org/2007/06/01/excellent-tip-for-interviewers-of-geeks/</link>
      <pubDate>Fri, 01 Jun 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/06/01/excellent-tip-for-interviewers-of-geeks/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s so obvious you have to wonder why people haven&amp;rsquo;t been doing this
for years now&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://coderific.com/blog/post/582&#34; title=&#34;Witten proposes&#34;&gt;Witten proposes&lt;/a&gt;
an incredibly simple and good way to evaluate a potential employee&amp;rsquo;s
code skills during the interview. Instead of asking arbitrary code
questions ask them to send in a code example they&amp;rsquo;re proud of before
they come in and actually go over that code with them during the
interview.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This is a much more realistic test for exhibiting coding prowess than
some sort of artificial string manipulation problem. Additionally, and
this is a hugely important point when performing any interview, it
tends to put the candidate at ease to talk about their very own
pre-written code, so they&amp;rsquo;re not sweating bullets and thereby giving
you an inaccurate reading.&lt;/p&gt;
&lt;p&gt;When you do go over someone&amp;rsquo;s code with them during an interview, here
are the sorts of questions to ask:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How would you explain this code to someone unfamiliar with it?&lt;/li&gt;
&lt;li&gt;Why did you make this particular design decision here?&lt;/li&gt;
&lt;li&gt;What are some trade-offs involved with this design decision?&lt;/li&gt;
&lt;li&gt;How would you go about profiling this code?&lt;/li&gt;
&lt;li&gt;Can you think of a way to optimize this particular section?&lt;/li&gt;
&lt;li&gt;How would you change things if the requirements were altered in
this particular way?&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://weblog.masukomi.org/2010/07/26/why-you-should-never-indent-code-with-spaces&#34;&gt;Seriously, man, tabs for indentation&lt;/a&gt;?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Basically, ask all the same sorts of questions you would normally ask
after a candidate solves a stupid string manipulation problem on the
whiteboard, but instead ask those questions about the candidate&amp;rsquo;s own
pre-submitted code, written on a proper computer with the use of a
proper compiler.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There&amp;rsquo;s another benefit to this that Witten doesn&amp;rsquo;t mention in his
article and that&amp;rsquo;s the opportunity to observe what happens when you
challenge that persons decisions. How do they react when you say &amp;ldquo;do you
really think that was the best way to tackle that? Wouldn&amp;rsquo;t it have been
better to &amp;hellip;&amp;rdquo; Even if you don&amp;rsquo;t really believe it better to do it a
different way it&amp;rsquo;s a situation that will come up and you want to know
that the person is going to be able to handle criticism well and be
willing to work on alternate solutions to things.&lt;/p&gt;
&lt;p&gt;Like I said, why haven&amp;rsquo;t we been doing this for years?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Math is for people who aren&#39;t content with the status quo.</title>
      <link>https://weblog.masukomi.org/2007/05/28/math-is-for-people-who-arent-content-with-the-status-quo/</link>
      <pubDate>Mon, 28 May 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/05/28/math-is-for-people-who-arent-content-with-the-status-quo/</guid>
      <description>&lt;p&gt;Update: I just came across a similar post by raganwald wherein he discusses &lt;a href=&#34;https://weblog.raganwald.com/2007/01/business-programming-standards-have.html&#34; title=&#34;the need for more advanced programming skills&#34;&gt;the need for advanced programming skills&lt;/a&gt;&amp;hellip;which you don&amp;rsquo;t get without math. ;)&lt;/p&gt;
&lt;p&gt;When I was in high school no-one ever convinced me of why math was
important and that is my biggest educational regret. Children, and
adults for that matter, will neither seek out, nor retain, knowledge
they don&amp;rsquo;t value. It&amp;rsquo;s all well and good to tell them algebra is
important but unless you show them WHY algebra is important they will
have no reason to retain it.&lt;/p&gt;
&lt;p&gt;I was one of those kids who grasped
geometry without problem, because the practical application of it was
inherent in it&amp;rsquo;s teaching. Algebra, on the other hand, was a series of
essentially random numbers written on a board. They taught you how but
never really dwelled on why. I left high school honestly believing that
I&amp;rsquo;d never need it because no-one ever gave me reason to believe
otherwise.&lt;/p&gt;
&lt;p&gt;Sixteen years later I know why. I&amp;rsquo;ve known why for a while
now, but as I never really grasped, or retained, how I&amp;rsquo;ve been stymied
in my forward progress. You see, when it comes to programming? All the
cool shit requires math.&lt;/p&gt;
&lt;p&gt;Oh yeah, you can build nifty, and useful, apps
without any notable math skills. You&amp;rsquo;ll be able to rework old ideas in
new ways. It&amp;rsquo;s a lot like being a carpenter without any electrical
engineering skills. Sure you can use the belt sander, and you may have
some good ideas on how to make a better belt sander, but without a good
understanding of electrical engineering you&amp;rsquo;ll never be able to
implement those ideas and actually make that better belt sander.&lt;/p&gt;
&lt;p&gt;You may
be happy being a simple carpenter, but I&amp;rsquo;ve been nailing boards together
long enough to have some ideas on how to do it better and I&amp;rsquo;ve never
been a complacent person. I&amp;rsquo;m hunting down math skills and eating them
whole.&lt;/p&gt;
&lt;p&gt;Tonight&amp;rsquo;s lesson? Untyped lambda calculus. You need to learn it
too? Start with the &lt;a href=&#34;http://worrydream.com/AlligatorEggs/&#34; title=&#34;Alligator Eggs&#34;&gt;Alligator
Eggs&lt;/a&gt; game. It&amp;rsquo;s
a sneaky way to introduce it to young children, although, as it mentions
near the bottom, it could use some expanding upon for further clarity.
Then read this &lt;a href=&#34;http://www.inf.fu-berlin.de/lehre/WS03/alpi/lambda.pdf&#34; title=&#34;introduction to lambda calcuclus (pdf)&#34;&gt;introduction to lambda calculus
(pdf)&lt;/a&gt;.
If some of the things in the paper are missing the why aspect try and
match what they&amp;rsquo;re saying with the rules you learned in Alligator Eggs.&lt;/p&gt;
&lt;p&gt;I still don&amp;rsquo;t know why the alligators die but at least now I know how,
when, and where to kill them.&lt;/p&gt;
&lt;p&gt;And, to any youngsters who may be reading
this and wondering why I actually need lambda calculus, the answer is
&amp;ldquo;functional&amp;rdquo; programming languages like Haskell and Erlang. You may be
able to go through the motions, and follow the rules of functional
programming but you&amp;rsquo;ll never really understand the why of it if you
don&amp;rsquo;t understand lambda calculus.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>I think I know why people don&#39;t value tests</title>
      <link>https://weblog.masukomi.org/2007/05/25/i-think-i-know-why-people-dont-value-tests/</link>
      <pubDate>Sat, 26 May 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/05/25/i-think-i-know-why-people-dont-value-tests/</guid>
      <description>&lt;p&gt;I think I understand why people tend to not write tests. Because they
believe that tests aren&amp;rsquo;t something that&amp;rsquo;s either needed or important.&lt;br&gt;
&lt;br&gt;
&amp;ldquo;Duh,&amp;rdquo; I hear you say, but bear with me.&lt;br&gt;
&lt;br&gt;
Why don&amp;rsquo;t people believe that tests are something that&amp;rsquo;s either needed
or important? Well, I think one of the biggest contributing factors to
WHY is that essentially zero of the learn to program in language FOO
books ever mention unit testing. Unit testing has been around in a
formal sense since &lt;a href=&#34;http://www.xprogramming.com/testfram.htm&#34; title=&#34;the creation of SUnit back in 1994&#34;&gt;the creation of SUnit back in
1994&lt;/a&gt;
! 1994 I say! That&amp;rsquo;s thirteen years now. Thirteen years and I could
probably count on one hand the number of introductory language, or
language reference, books that not only mention unit tests but actually
explain why their important and how to use them. Even worse, most
languages don&amp;rsquo;t have unit tests tools built into their core libraries.
All the modern languages have fairly comprehensive test coverage but
they have to use external tools to write those tests. How crazy is that?
We have this common programming task that we all agree is critical to
releasing a stable version of the language but it&amp;rsquo;s not important enough
to build into the language. Wha?!?! The end result is that since we
don&amp;rsquo;t teach tests as being even noteworthy when teaching a language
no-one learns that they are important. For the most part people just
don&amp;rsquo;t seem to understand the value of tests until they&amp;rsquo;ve been in the
industry so long that their feet are riddled with holes.&lt;a href=&#34;#foot1&#34;&gt;[1]&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
Mike Clark, and others, suggest [writing &amp;ldquo;Learning
Tests&amp;rdquo;](&lt;a href=&#34;http://clarkware.com/cgi/blosxom/2005/03/18#RLT1&#34;&gt;http://clarkware.com/cgi/blosxom/2005/03/18#RLT1&lt;/a&gt; &amp;ldquo;writing &amp;ldquo;Learning Tests&amp;rdquo;&amp;rdquo;)
as a way, not only to learn a new language, but as a way to accrete a
repository of what you&amp;rsquo;ve learned about a language. I think this is a
GREAT idea. Imagine if every book that taught a new programming language
showed you not only how to do something but then followed it up with how
to confirm that you didn&amp;rsquo;t screw it up by demonstrating how to write a
test for it? People would start to see test writing as a standard part
of the software writing process. It would be &amp;ldquo;just what you do.&amp;rdquo;&lt;br&gt;
&lt;br&gt;
Imagine the impact that including unit testing as a standard part of
the learning process would have on the software industry! Sure it might
take five to ten years before we started to see the results from it but
wouldn&amp;rsquo;t it be worth the wait?&lt;br&gt;
&lt;br&gt;
[1] From having shot themselves in the foot on many prior occasions.\&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The power of tests...</title>
      <link>https://weblog.masukomi.org/2007/05/25/the-power-of-tests/</link>
      <pubDate>Fri, 25 May 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/05/25/the-power-of-tests/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;If you look at
&lt;a href=&#34;http://studios.thoughtworks.com/mingle-project-intelligence&#34;&gt;Mingle&lt;/a&gt;,
the project management tool we&amp;rsquo;ve been working on&amp;hellip; On that tool I
happen to know that their test base is twice as much as their code
base. So, two-thirds of the code in that product is tests, and that
allows them to do quite violent things. I know that a couple of months
ago they made a very fundamental change to the database scheme. I
mean, we&amp;rsquo;re talking, utterly to the guts of the database scheme. And
they did that and&amp;hellip; it wasn&amp;rsquo;t even an event worth talking about. And,
when they were planning to do it they were saying &amp;lsquo;Yeah, yeah, we&amp;rsquo;ve
got to fundamentally alter the core tables in this application&amp;hellip; Yeah
we&amp;rsquo;ll do that, and it&amp;rsquo;s not a big deal.&amp;rsquo;&amp;quot; -&lt;a href=&#34;http://www.martinfowler.com/&#34;&gt;Martin
Fowler&lt;/a&gt; (paraphrased)&lt;/p&gt;
&lt;/blockquote&gt;
</description>
    </item>
    
    <item>
      <title>Why you should endeavor to hire from startups</title>
      <link>https://weblog.masukomi.org/2007/05/25/why-you-should-endeavor-to-hire-from-startups/</link>
      <pubDate>Fri, 25 May 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/05/25/why-you-should-endeavor-to-hire-from-startups/</guid>
      <description>&lt;p&gt;I just had a thought. Companies looking for new developers should try to
only ever hire from startups and similar small team companies. Why?
Because people who work for small startups can&amp;rsquo;t hide. You can be
reasonably certain that someone who has managed to survive for more than
a few months in a small dev team puts out decent code at a good pace.
Small companies just can&amp;rsquo;t afford to keep crap coders or non-producers
on their payrolls. Such a simple filter. And, I think most of the time
it&amp;rsquo;s an even better filter than that. In my experience small co people tend
to be more flexible and more self-motivated.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Getting some agility in your workplace. A flow chart.</title>
      <link>https://weblog.masukomi.org/2007/05/24/getting-some-agility-in-your-workplace-a-flow-chart/</link>
      <pubDate>Thu, 24 May 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/05/24/getting-some-agility-in-your-workplace-a-flow-chart/</guid>
      <description>&lt;p&gt;The software development industry is plagued with bad practices
even though so many of us
know better. A HUGE portion of this problem is that to really start, and
continue, working the way we know we should requires buy-in from our
managers and coworkers. And it&amp;rsquo;s not just a conceptual buy in that we
need. People need to really get the religion. But, you and I both know
that we can&amp;rsquo;t realistically expect the rest of the company to change
everything at once.&lt;/p&gt;
&lt;p&gt;This flow chart addresses what I think are the
three biggest changes we can make that will dramatically improve our
companies. Find your biggest pain point and work on that. Once you&amp;rsquo;ve
got that working really well in your group and you&amp;rsquo;re confident that
people are going to stick with it you can choose the next biggest pain
point and address that one, remembering what things worked best to get
your employees to buy into the last change.&lt;/p&gt;
&lt;p&gt;Each of the major pain points could easily get their own graph for implementing
solutions at a similar level of complexity, but those are graphs for another day.&lt;/p&gt;
&lt;p&gt;As always you can click on the image for a full sized version and / or
&lt;a href=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2007/5/24/addressing_major_pain_points.dia&#34; title=&#34;download the Dia file&#34;&gt;download the Dia
file&lt;/a&gt;
too.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2007/5/24/addressing_major_pain_points.png&#34;&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2007/5/24/addressing_major_pain_points_small.png&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;a href=&#34;http://creativecommons.org/licenses/by-sa/3.0/us/&#34;&gt;&lt;img src=&#34;http://i.creativecommons.org/l/by-sa/3.0/us/88x31.png&#34; alt=&#34;Creative Commons
License&#34;&gt;&lt;/a&gt;&lt;br&gt;
This work is licensed under a &lt;a href=&#34;http://creativecommons.org/licenses/by-sa/3.0/us/&#34;&gt;Creative Commons Attribution-Share Alike
3.0 United States
License&lt;/a&gt;.&lt;br&gt;
\&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Unit testing your JavaScript</title>
      <link>https://weblog.masukomi.org/2007/05/24/unit-testing-your-javascript/</link>
      <pubDate>Thu, 24 May 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/05/24/unit-testing-your-javascript/</guid>
      <description>&lt;p&gt;Most web developers will agree that unit tests are great, and some even
write them&amp;hellip;but I know very few developers who write unit tests for
their JavaScript, but it&amp;rsquo;s not really their fault. Most don&amp;rsquo;t know of
good unit test systems for JavaScript and / or don&amp;rsquo;t write their
JavaScript in such a way that you even could test well. This means
breaking all the functionality into discreet functions and objects
instead of writing old-school procedural crap. There&amp;rsquo;s also the obvious
problem that most of your JavaScript is tied to the browser and the
current page. So how do you test stuff in the page? Well,
&lt;a href=&#34;http://www.jsunit.net/&#34; title=&#34;JsUnit&#34;&gt;JsUnit&lt;/a&gt; lets you do just that and,
seeing as I&amp;rsquo;ve just added a javascript implementation to the &lt;a href=&#34;http://fbo.masukomi.org&#34; title=&#34;FizzBuzz Overthink&#34;&gt;FizzBuzz
Overthink&lt;/a&gt; you can run
over and see how to do it for your apps too.&lt;/p&gt;
&lt;p&gt;The limitation of JsUnit is that it really wants a complete file to
load into the test harness but it&amp;rsquo;s bean ages since I&amp;rsquo;ve worked on a
site where at least some portion of every page was not dynamically loaded.
Fortunately the workaround is fairly simple: grab the source to the
JsUnit Test Runner ( testRunner.html ) and extract the form but leave
out the the file chooser. Put all that into a template file that will be
dynamically loaded into your app when you view the page as a specific
test user or with a magic cookie. Otherwise it&amp;rsquo;s just not there.&lt;/p&gt;
&lt;p&gt;Now every
page that needs a JavaScript unit test will have a test harness down at
the bottom. Click the button and see if it passes. In order to run all
the tests on all the pages just have your
&lt;a href=&#34;http://www.openqa.org/selenium/&#34; title=&#34;Selenium just Kicks ASS&#34;&gt;Selenium&lt;/a&gt;
tests also check that the unit tests run correctly. Usually you&amp;rsquo;ll want
to have this be a separate test run so that you can log in as the user
who gets to see the tests and because you&amp;rsquo;ll frequently want to populate
your forms and such with data that WILL break things just to test that
your JavaScript doesn&amp;rsquo;t blow up in people&amp;rsquo;s faces.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Getting the most out of version control for hosted web apps.</title>
      <link>https://weblog.masukomi.org/2007/05/23/getting-the-most-out-of-version-control-for-hosted-web-apps/</link>
      <pubDate>Wed, 23 May 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/05/23/getting-the-most-out-of-version-control-for-hosted-web-apps/</guid>
      <description>&lt;p&gt;Another graph for another friend who asked for a flow chart of the
branching and merging described in Best Practices for Web Development
&lt;a href=&#34;http://www.masukomi.org/writings/best_practices/&#34; title=&#34;html&#34;&gt;html&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;http://www.masukomi.org/writings/best_practices.pdf&#34; title=&#34;pdf&#34;&gt;pdf&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Update:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Michael says: I&amp;rsquo;m a little unsure, from you diagram, how, if your
trunk contains two completed and merged features that aren&amp;rsquo;t yet live
(video upload and REST API, say) you put one feature live without
putting the other live. It looks like code only gets to the live
branch via the trunk, but it seems from your diagram that the trunk
could contain all manner of complete and semi-complete features.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;He&amp;rsquo;s right and I cover this in more detail in my Best Practices For Web
Developers Essay
&lt;a href=&#34;http://www.masukomi.org/writings/best_practices/&#34; title=&#34;html&#34;&gt;html&lt;/a&gt; /
&lt;a href=&#34;http://www.masukomi.org/writings/best_practices.pdf&#34; title=&#34;pdf&#34;&gt;pdf&lt;/a&gt; , but
the basic idea is this: Your dev trunk holds the bug fixes and features
you want to see in the next release. If, as in Michael&amp;rsquo;s example, you&amp;rsquo;ve
got the video upload written, but maybe you don&amp;rsquo;t have the hardware in
place to support storing and serving gigs upon gigs of uploaded videos,
so you decide to hold off on deploying that. So you leave it be in it&amp;rsquo;s
little branch, remembering to update it at least once a week until
you&amp;rsquo;re ready to include it in the general codebase.&lt;/p&gt;
&lt;p&gt;Have you come up with a better solution to Michael&amp;rsquo;s problem? Please
let me know if you have.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;I&amp;rsquo;m really not thrilled with this particular chart though. It&amp;rsquo;s got no
flow. If you can improve upon it please do so and send me a copy. I&amp;rsquo;ve
got some ideas but nothing great. I really liked the &lt;a href=&#34;https://weblog.masukomi.org/2007/5/23/using-darcs-with-svn-cvs-flow-chart&#34; title=&#34;it&#39;s got style and flowww baby&#34;&gt;Using Darcs with
SVN / CVS flow
chart&lt;/a&gt;
much better.&lt;/p&gt;
&lt;p&gt;As always you can click on the image for a full sized version and / or
&lt;a href=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2007/5/23/branching.dia&#34; title=&#34;download the dia file&#34;&gt;download the Dia
file&lt;/a&gt;
too.\&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2007/5/23/branching.png&#34;&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2007/5/23/branching_small.png&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://creativecommons.org/licenses/by-sa/3.0/us/&#34;&gt;&lt;img src=&#34;http://i.creativecommons.org/l/by-sa/3.0/us/88x31.png&#34; alt=&#34;Creative Commons
License&#34;&gt;&lt;/a&gt;&lt;br&gt;
This work is licensed under a &lt;a href=&#34;http://creativecommons.org/licenses/by-sa/3.0/us/&#34;&gt;Creative Commons Attribution-Share Alike
3.0 United States
License&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Using Darcs with SVN / CVS Flow Chart</title>
      <link>https://weblog.masukomi.org/2007/05/23/using-darcs-with-svn-cvs-flow-chart/</link>
      <pubDate>Wed, 23 May 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/05/23/using-darcs-with-svn-cvs-flow-chart/</guid>
      <description>&lt;p&gt;A flow chart for a friend demonstrating, step by step, how you&amp;rsquo;d go
about using &lt;a href=&#34;http://www.darcs.net&#34;&gt;Darcs&lt;/a&gt; (or any other distributed
version control system) with SVN / CVS. He needs to do it for the most
common reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;it&amp;rsquo;s a pain to branch and merge with CVS.\&lt;/li&gt;
&lt;li&gt;he&amp;rsquo;d have to coordinate with other departments like QA to get them
working off of whatever the current release branch happened to be at the
moment and convince them that it was a good idea.&lt;/li&gt;
&lt;li&gt;currently his co., like so many, is working off of a single
development trunk. There are no other branches.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Click on the image to get a full sized version. Or &lt;a href=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2007/5/23/using_darcs_with_svn.dia&#34; title=&#34;download the dia file here&#34;&gt;download the dia
file
here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2007/5/23/using_darcs_with_svn.png&#34;&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2007/5/23/using_darcs_with_svn_small.png&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;http://creativecommons.org/licenses/by-sa/3.0/us/&#34;&gt;&lt;img src=&#34;http://i.creativecommons.org/l/by-sa/3.0/us/88x31.png&#34; alt=&#34;Creative Commons
License&#34;&gt;&lt;/a&gt;&lt;br&gt;
This work is licensed under a &lt;a href=&#34;http://creativecommons.org/licenses/by-sa/3.0/us/&#34;&gt;Creative Commons Attribution-Share Alike
3.0 United States
License&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Some earlier related posts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://weblog.masukomi.org/2006/12/29/distributed-scm&#34; title=&#34;Why you should be using a distributed source control system&#34;&gt;Why you should be using a distributed source control
system&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://weblog.masukomi.org/2007/3/29/using-darcs-with-subversion-cvs&#34; title=&#34;Using Darcs with Subversion / CVS&#34;&gt;Using Darcs with Subversion /
CVS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://weblog.masukomi.org/2006/12/29/distributed-scm&#34;&gt;Why you should be using a distributed source control
system&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>FizzBuzz Overthink as a Teaching Aid</title>
      <link>https://weblog.masukomi.org/2007/05/21/fizzbuzz-overthink-as-a-teaching-aid/</link>
      <pubDate>Mon, 21 May 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/05/21/fizzbuzz-overthink-as-a-teaching-aid/</guid>
      <description>&lt;p&gt;UPDATE: I&amp;rsquo;ve created a new subdomain for the FizzBuzz Overthink project
(
&lt;a href=&#34;http://fbo.masukomi.org&#34; title=&#34;http://fbo.masukomi.org&#34;&gt;http://fbo.masukomi.org&lt;/a&gt;
), updated the links below to reference it instead and modified the
Readme in the project (and the default page of the site) to reflect the
new goals of the project&lt;/p&gt;
&lt;p&gt;UPDATE 2: There&amp;rsquo;s a JavaScript example in there now too which, of
course, includes unit testing. &lt;a href=&#34;https://weblog.masukomi.org/2007/5/24/unit-testing-your-javascript&#34;&gt;More details
here.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I was talking with someone the other day who mentioned, in passing, how
they wished they had some good examples of how to do unit tests for his
co-workers. There are, of course, plenty of examples of how to do unit
tests but I haven&amp;rsquo;t seen many online that show them in the context of a
complete but simple application. This conversation made me remember my
&lt;a href=&#34;https://weblog.masukomi.org/2007/3/9/fizzbuzz-rethink&#34; title=&#34;FizzBuzz Overthink&#34;&gt;FizzBuzz
Overthink&lt;/a&gt;
(FBO) that I&amp;rsquo;d written in Java, and it occoured to me that it would make
a great teaching application. Translating an existing FBO into a
language you&amp;rsquo;re trying to learn is also a great way to get your head
around it.&lt;/p&gt;
&lt;p&gt;The FBO demonstrates how to break down an application into useful
methods, how to write unit tests for those methods, and how to document
them.&lt;/p&gt;
&lt;p&gt;So, I&amp;rsquo;ve added a Perl version of the FBO, with docs and unit tests,
although I used &lt;a href=&#34;http://www.naturaldocs.org/&#34; title=&#34;So much better than POD&#34;&gt;Natural
Docs&lt;/a&gt; for the
documentation instead of standard POD because ND is just light-years
ahead of POD in my opinion. You can grab the new Java + Perl versions
&lt;a href=&#34;http://fbo.masukomi.org/FizzBuzzOverthink.zip&#34; title=&#34;as a zip file&#34;&gt;as a zip file&lt;/a&gt; or
better yet check it out with &lt;a href=&#34;http://www.darcs.net&#34; title=&#34;darcs&#34;&gt;darcs&lt;/a&gt; from
&lt;a href=&#34;http://fbo.masukomi.org/code/FizzBuzzOverthink/&#34; title=&#34;http://fbo.masukomi.org/code/FizzBuzzOverthink/&#34;&gt;http://fbo.masukomi.org/code/FizzBuzzOverthink/&lt;/a&gt;
so that you can improve upon it and / or add your own language to it to
help make it a more useful teaching aid. Just use darcs send to send me
a patch with your changes ( masukomi at masukomi dot org ). I think
there are a lot of people who would benefit from a PHP version and I&amp;rsquo;d
personally love to see Haskell and Erlang versions.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Heuristically Driven Development Flow Chart</title>
      <link>https://weblog.masukomi.org/2007/05/18/heuristically-driven-development-flow-chart/</link>
      <pubDate>Fri, 18 May 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/05/18/heuristically-driven-development-flow-chart/</guid>
      <description>&lt;p&gt;This flow chart will only make superficial sense unless you&amp;rsquo;ve read &lt;a href=&#34;http://www.masukomi.org/writings/best_practices/node19.html&#34; title=&#34;the Triage section&#34;&gt;the Triage
section&lt;/a&gt;
of my &lt;a href=&#34;http://www.masukomi.org/writings/best_practices/&#34; title=&#34;Best Practices for Web Developers&#34;&gt;Best Practices for Web Developers&lt;/a&gt;
essay, which I happen to have just updated with an expanded Triage
section.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://weblog.masukomi.org/images/2007/05/18/heuristically_driven_development_flow.png&#34;&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2007/05/18/heuristically_driven_development_flow.png&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Click on the thumbnail for the full-sized verison. If you&amp;rsquo;d like,
&lt;a href=&#34;https://weblog.masukomi.org/images/2007/05/18/hdd_flow.dia&#34;&gt;the Dia file&lt;/a&gt; is
also available if you feel like tweaking it.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How Greasemonkey can save your webapp time and money</title>
      <link>https://weblog.masukomi.org/2007/05/11/how-greasemonkey-can-save-your-webapp-time-and-money/</link>
      <pubDate>Sat, 12 May 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/05/11/how-greasemonkey-can-save-your-webapp-time-and-money/</guid>
      <description>&lt;p&gt;For the most part web developers spend our time guessing what features
people might want and how said features should be integrated. Frequently
we guess wrong and that wastes time and sometimes frustrates users. But
there are tons of users out there who also happen to be developers and
they&amp;rsquo;re actively implementing new features for their favorite sites with
&lt;a href=&#34;http://www.greasespot.net/&#34; title=&#34;Greasemonkey&#34;&gt;Greasemonkey&lt;/a&gt;.
&lt;a href=&#34;http://www.userscripts.org&#34; title=&#34;UserScripts.org&#34;&gt;UserScripts.org&lt;/a&gt; has over
6,000 scripts. That&amp;rsquo;s 6,000 features with working implementations for
popular sites at no cost to those sites! Free I say.&lt;/p&gt;
&lt;p&gt;Each one is a
feature someone wanted so badly that they figured out how a site worked
and then wrote working code to modify that site to implement that
feature. If you&amp;rsquo;ve got a somewhat popular webapp you owe it to yourself
to watch userscripts.org and google for other greasemonkey scripts for
your site. Check out what people have done, see how it works, maybe the
rest of your users would like that too&amp;hellip;&lt;/p&gt;
&lt;p&gt;Consider offering some free goodies to people who send you cool
greasemonkey scripts. Even if it&amp;rsquo;s just a free t-shirt (go to CafePress
and whip one up if you have to). Maybe even put up a page of user
submitted scripts. Some of your own developers may even make them to
implement features they wanted that may not have been appropriate for
all users of your site. Just make sure to emphasize that they&amp;rsquo;re
unsupported. ;)&lt;/p&gt;
&lt;p&gt;Side note: this post was inspired by the creation of
&lt;del&gt;my first Greasemonkey script&lt;/del&gt; [EDIT: userscripts.org went down in 2014]&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s something for people who use Reddit and del.icio.us. Not useful to
Reddit in it&amp;rsquo;s current form but the idea behind it might be very good
for Reddit if expanded to support more bookmarking sites.\&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>LazyWeb Hardware Idea</title>
      <link>https://weblog.masukomi.org/2007/04/18/lazyweb-hardware-idea/</link>
      <pubDate>Wed, 18 Apr 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/04/18/lazyweb-hardware-idea/</guid>
      <description>&lt;p&gt;If you build this I &lt;em&gt;will&lt;/em&gt; buy it.: Ergonomic Dvorak keyboards are
effing expensive. Dvorak keyboards are hard to find in general and
software remapping in the OS has a variety of&amp;hellip;. issues. I want a USB
dongle that remaps keystrokes from a QWERTY keyboard to Dvorak. Even
better put a switch on it to turn off the remapping. I will pay up to
$25 for such a device.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>What if webapps worked like pinball machines?</title>
      <link>https://weblog.masukomi.org/2007/04/11/what-if-webapps-worked-like-pinball-machines/</link>
      <pubDate>Thu, 12 Apr 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/04/11/what-if-webapps-worked-like-pinball-machines/</guid>
      <description>&lt;p&gt;Currently web frameworks are all about the page. This is starting to
change a little thanks to Ajax but mostly just towards the idea of page
snippets. But why? &amp;ldquo;Pages&amp;rdquo; are a metaphor taken from books, but books
are linear and the page serves to restrict the layout. Things like Yahoo
Widgets have shown us that there&amp;rsquo;s no need for layout to be bound to the
&amp;ldquo;page&amp;rdquo; metaphor and we&amp;rsquo;ve known for a long time now that webapps are
rarely linear, and when they are people don&amp;rsquo;t like it. Essentially we&amp;rsquo;re
writing glorified &amp;ldquo;choose your own adventure&amp;rdquo; games that still say &amp;ldquo;To
open the door on the left go to page 65. To open the door on the right
go to page 27. Rails, and it&amp;rsquo;s clones, even number the &amp;ldquo;Pages&amp;rdquo; like
that. We need a new metaphor. What if, instead of writing frameworks
that are all about serving and managing pages, we started to think of
webapps more like pinball machines. There are 5 major parts in every
modern pinball machine (other than the ball):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The Flippers. You use these to force the ball in some direction You
want, as opposed to the direction it wants.&lt;/li&gt;
&lt;li&gt;The Bumpers. Posts that actively push the ball off in another
direction when hit.&lt;/li&gt;
&lt;li&gt;The Posts and Rubbers. These stick out of the Playfield with rubber
that passively bounce the ball away.&lt;/li&gt;
&lt;li&gt;The Playfield. The board that defines the scope of the game.&lt;/li&gt;
&lt;li&gt;Gravity.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For this metaphor let&amp;rsquo;s imagine the ball represents the user and their
session as they bounce around your site.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The Flippers forcefully redirect your users to do something you
want, as opposed to what they wanted, and that generally
appreciated. But sometimes you have to force them to do things like
go to a login page. Of course, every time you have to use the
flippers you risk loosing the ball down the outhole.&lt;/li&gt;
&lt;li&gt;The Post annd Rubbers are simple no real processing required
responses to a user&amp;rsquo;s actions. Maybe it&amp;rsquo;s a request for a css file.
Maybe it&amp;rsquo;s a help page. Either way it&amp;rsquo;s an, essentially static, file
or straight database read that provides the user with some
information that alters their trajectory.&lt;/li&gt;
&lt;li&gt;The Bumpers involve work, some active processing based on the data
imparted by the user hitting it. They alter the user&amp;rsquo;s trajectory
like a Post but also impart energy to the user as they send them
off.&lt;/li&gt;
&lt;li&gt;Gravity is like time. It&amp;rsquo;s what&amp;rsquo;s trying to get the ball to leave
the playfield of your webapp.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In general you want to just let the user do whatever they want. The
pinball machine doesn&amp;rsquo;t care about the where the ball just came from or
where it&amp;rsquo;s going. Maybe it&amp;rsquo;ll keep a running log of the &amp;ldquo;Score&amp;rdquo; but in
general it is only concerned with if the ball is on the Playfield or
not. A bumper doesn&amp;rsquo;t care what other Bumper or Post the ball came from
or where the ball is going after, although it will participate in
recalculating the ball&amp;rsquo;s trajectory. They just sit around in their own
stupid little world listening for input from balls.&lt;/p&gt;
&lt;p&gt;The Ball&amp;hellip;. The
Ball is where the magic is. Since the ball represents our user we can
assume it has a brain&amp;hellip;even if they, like Pooh, they are &amp;ldquo;a bear of
very little brain.&amp;rdquo; It knows where it&amp;rsquo;s been. It sees where it&amp;rsquo;s headed.
And, it is actively trying to get a good score, or get off the
Playfield. That point&amp;rsquo;s never been quite clear. Either way it&amp;rsquo;s the ball
that changes it&amp;rsquo;s direction when affected by gravity. It&amp;rsquo;s the ball that
is running around your site. It&amp;rsquo;s the ball that triggers the bumpers and
it&amp;rsquo;s the ball that makes the game worth playing.&lt;/p&gt;
&lt;p&gt;So what if we stopped
focusing on pages (Bumpers / Posts) and started focusing on the Ball.
What if the Bumpers and Posts were just listeners who knew nothing about
each other. If you like technologies like Mule you could think of them
as listeners on a queue. Or you could think of it as a publish subscribe
model where they&amp;rsquo;re all listeners registered with the ball. Regardless
of how i architect it why should my &amp;ldquo;Address&amp;rdquo; Bumper know anything about
the &amp;ldquo;Company&amp;rdquo; Bumper. Why should it have to know that that&amp;rsquo;s where to
force you next. What if you let the ball decide where it wants to go.
Sure the Bumper will give it a push but maybe the ball just doesn&amp;rsquo;t have
enough energy to care about going to the Company page/Bumper after
filling out an Address. Maybe it&amp;rsquo;s feeling the influence of Gravity and
just wants to get off the Playfield.&lt;/p&gt;
&lt;p&gt;If everything on the Playfield is
truly independent we add and remove them without concern for the effect
on other ones because there isn&amp;rsquo;t any direct coupling. More Posts? No
problem. Since Posts don&amp;rsquo;t know or care where you came from or are going
it doesn&amp;rsquo;t matter if the Post that was there yesterday is still there or
not. More balls? Again, no problem. Yes they might collide but that
doesn&amp;rsquo;t affect the Posts or Bumpers, and interesting things happen when
users interact with each other.&lt;/p&gt;
&lt;p&gt;A friend said,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;I&amp;rsquo;m still a little unclear on how pages are tightly coupled to each
other, and how the bumper idea fixes that.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So let&amp;rsquo;s look at a concrete example. Lets
imagine you were buying some stock. You place a buy order (the ball hits
a Bumper). Now, it&amp;rsquo;s important to the user that they see an
acknowledgment that the order was successfully placed but the Bumper /
Controller that processed that form doesn&amp;rsquo;t and shouldn&amp;rsquo;t care if you
see an acknowledgment or not. It&amp;rsquo;s done it&amp;rsquo;s job by processing your buy
order. It&amp;rsquo;s the User that cares about that acknowledgement. Where you
bounce off to is their concern not the Bumper&amp;rsquo;s (unless of course there
was a problem). But a lot of frameworks actually make you put that
routing information in there with the form processor (Ruby on Rails
being a perfect example).&lt;/p&gt;
&lt;p&gt;What if User A is an advanced user and should
be shown some complex acknowldgement page but User B is a computer
neophyte who should be shown something simple and to the point. Do you
really think it&amp;rsquo;s appropriate for those routing decisions to be
implemented in the controller that submits stock purchase orders? No, of
course not. It should be handled in the object that actually cares about
what&amp;rsquo;s displayed next; the User object. The Ball. The ball knows what
kind of user it represents. It can decide. Sure it&amp;rsquo;ll take suggestions
from the Bumper as hitting a bumper does affect a pinballs trajectory
but the Bumper shouldn&amp;rsquo;t be tied to any of the other Bumpers / Pages.&lt;/p&gt;
&lt;p&gt;Some frameworks like Struts handle this by having the controller send
you to the success or error page and let a central point in the
framework decide what that is, and while this is definitely better it&amp;rsquo;s
still the wrong place. That&amp;rsquo;s like having the bumper ask&lt;/p&gt;
&lt;p&gt;The Playfield
where to send the Ball. It makes no sense. It is the combination of the
spin, speed and initial direction of the ball, it&amp;rsquo;s angle of impact, and
the force of the bumpers push plus a little bit of Gravity and other
more negligable factors.&lt;/p&gt;
&lt;p&gt;The Playfield itself plays almost no part in
the equation. It&amp;rsquo;s almost entirely dependent upon the state of the ball.
In a webapp it&amp;rsquo;s all about what the User wants not what the framework
wants. So why would you have the framework that binds all the Posts and
Bumpers to the playfield decide where the ball should go?&lt;/p&gt;
&lt;p&gt;And before you ask&amp;hellip; No, I&amp;rsquo;m not suggesting you actually ask the user if they want to
see an acknowledgement to their buy order. Im suggesting that the Ball
should act as their proxy. It should know, or at least be able to make
an educated guess at, what the user will want to see after a given
action based on where they came from and where they were headed.&lt;/p&gt;
&lt;p&gt;In most cases this would be akin to the success page / error page routing table
in Struts only moved to the User&amp;rsquo;s control. But, imagine what could
happen if you wanted to get fancy. You could throw in some Bayesian
filtering or other statistical analysis to watch how a user interacts
with Posts and Bumpers. After a few times on your site it would know
that they generally want to go from Post A straight to Bumper D.&lt;/p&gt;
&lt;p&gt;In summary: Why are we using web frameworks to tell users where to go?
Shouldn&amp;rsquo;t web frameworks be listening to where the user wants to go? And
why should different pages and form processors in our webapps be tightly
coupled?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Don&#39;t cut your CharlieCard</title>
      <link>https://weblog.masukomi.org/2007/04/02/dont-cut-your-charliecard/</link>
      <pubDate>Mon, 02 Apr 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/04/02/dont-cut-your-charliecard/</guid>
      <description>&lt;p&gt;The
&lt;a href=&#34;http://en.wikipedia.org/wiki/CharlieCard&#34; title=&#34;buggy piece of crap&#34;&gt;CharlieCard&lt;/a&gt;,
as some of you know, is the &lt;a href=&#34;http://www.mbta.com/&#34; title=&#34;MBTA&#34;&gt;MBTA&lt;/a&gt;&amp;rsquo;s
reusable pass for subway / buss access. The only problem with it, aside
from the fact that the system is constantly breaking, is that it&amp;rsquo;s as
big as a credit card so, if you&amp;rsquo;re like me, it tends to not be in a
readily accessible place as you approach the station. My keys are always
accessible and I have little plastic frequent shopper type cards from
six other companies there. &amp;ldquo;Wouldn&amp;rsquo;t it be nice&amp;rdquo;, I thought, &amp;ldquo;if i could
find the chip in the card and then cut down the card without cutting the
chip so that I could put it on my keyring.&amp;rdquo; Well, I found the chip (in a
strong light you can see it&amp;rsquo;s imprint in the green bar under the guy
with the blue hat) and when March had passed and April&amp;rsquo;s pass was yet to
be added to it (in case things went wrong), I proceeded to cut it down
to a key-fob size. Alas, it didn&amp;rsquo;t work.&lt;/p&gt;
&lt;p&gt;The problem is that there is a thin wire antenna running around the edge
of the card just 1/8th of an inch from the edge. If you&amp;rsquo;re looking at
the front of the card it&amp;rsquo;s a hairs-breath above the top of &amp;ldquo;e&amp;rdquo;, roughly
1/16th of an inch wide, and continues all the way around i think.
Apparently without this antenna the signal just isn&amp;rsquo;t strong enough to
be read by the sensors. So, unless you feel like splicing your own
antenna onto it, which might not be a bad idea, you can&amp;rsquo;t cut it down.&lt;/p&gt;
&lt;p&gt;What we really need is someone with access to anl x-ray machine to take
a pic of their card and post it so that we can see exactly where that
wire runs. Anyone know a doctor?&lt;/p&gt;
&lt;p&gt;P.S. In case you&amp;rsquo;re dubious as to the location of the chip, I have
confirmed it by cutting my way into it once I had already confirmed that
the card was borked.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Using Darcs WITH Subversion / CVS</title>
      <link>https://weblog.masukomi.org/2007/03/29/using-darcs-with-subversion-cvs/</link>
      <pubDate>Fri, 30 Mar 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/03/29/using-darcs-with-subversion-cvs/</guid>
      <description>&lt;h2 id=&#34;using-darcs-with-subversion--cvs&#34;&gt;Using Darcs with Subversion / CVS&lt;/h2&gt;
&lt;p&gt;Some of you have gotten the distributed version control religion (If
you haven&amp;rsquo;t, you should read my &lt;a href=&#34;http://www.masukomi.org/writings/best_practices/&#34; title=&#34;Best Practices essay&#34;&gt;Best Practices
essay&lt;/a&gt;)
but are stuck with Subversion (or CVS) either because that&amp;rsquo;s what they
use at work or because some part of your deployment systems use it. You
may also want to combine them simply because of the power of svn
externals which lets you pull in some of your code from constantly
updated , Subversion Based, 3rd party repositories. Using SVN with a
distributed version control system also gets you a cannonical, no doubt
about it, central repo, instead of just a repo that everyone agrees to
call the central one, plus you can utilize all those nifty notification
and stats tools people have written for svn.&lt;/p&gt;
&lt;p&gt;What makes this work so easily is the fact that Darcs stores everything
in one _darcs directory instead of the SVN / CVS approach of throwing
files in every single directory. There are a ton of reasons to use Darcs
(or it&amp;rsquo;s competitors) when working in a corporate env (even one that
uses SVN / CVS) but my favorite is that you get the full benefit of
version control on all your work and can check in all the buggy crappy
unfinished code you want without polluting the central repo that affects
other developers (until you want to). It&amp;rsquo;s my practices to do a checkin
when I leave work every day, no matter if I&amp;rsquo;m finished with what I was
working on or not. With Darcs it doesn&amp;rsquo;t matter, because I won&amp;rsquo;t break
anyone elses unit tests because it&amp;rsquo;s just my personal version control
system that&amp;rsquo;s effected. When I&amp;rsquo;m done with whatever I was working on and
it passes all the tests I can push it back out to other developers.
Along the way I&amp;rsquo;ve been able to make as many revisions of the files as I
wanted to without screwing anyone else over.&lt;/p&gt;
&lt;h3 id=&#34;sneaking-darcs-in-under-the-radar&#34;&gt;Sneaking darcs in under the radar:&lt;/h3&gt;
&lt;p&gt;For those of you who have to use Subversion / CVS at work sneaking Darcs
in for your personal benefit it trivial. Just follow these steps for
each branch (in svn / cvs ) that you need to work on.&lt;/p&gt;
&lt;p&gt;check out a copy of the branch / trunk / tag / whatever that you&amp;rsquo;ll have
to coordinate with others.&lt;/p&gt;
&lt;p&gt;assuming you want to version control everything that got checked out
you&amp;rsquo;d cd into that directory and&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;darcs add -r *&lt;/li&gt;
&lt;li&gt;darcs record -am &amp;ldquo;Initial Import from svn version XXX&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t worry. Darcs is smart enough to ignore all of your subversion
files.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;From now on whenever you want to start working on something for this
branch you just move to wherever you want to checkout a new repo for a
feature spike / bug fix / whatever and do a &amp;ldquo;darcs get&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Use Darcs as you normally would, checking in whenever you want without
worry.&lt;/p&gt;
&lt;p&gt;When you&amp;rsquo;re done with your feature spike / bug fix / whatever do a
&amp;ldquo;darcs push&amp;rdquo; back into the dir where you started, then cd to that
directory and do a &amp;quot; svn commit -m &amp;ldquo;some comment here&amp;rdquo; &amp;quot; (remember you
haven&amp;rsquo;t added the _darcs dir to svn so you don&amp;rsquo;t have to worry about it
getting checked in).&lt;/p&gt;
&lt;p&gt;Snicker in the knowledge that you&amp;rsquo;ve beaten &amp;ldquo;The Man&amp;rdquo;.&lt;/p&gt;
&lt;h3 id=&#34;combining-forces-for-everyone&#34;&gt;Combining forces for everyone:&lt;/h3&gt;
&lt;p&gt;So you&amp;rsquo;ve convinced everyone to use Darcs. Yay, but for whatever reason
you&amp;rsquo;ve decided to keep SVN. Just follow steps 1-5 above. You could
theoretically check in your _darcs dir but I suspect that might just
lead to more headaches than it&amp;rsquo;s worth, especially when you consider how
easy it is to create a new darcs repo (steps 2.1-2.2) and the fact that
you only have to do this the first time you check something out, which
is to say, almost never.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve tried checking your _darcs dir into svn please add a comment
so that I, and others, can learn from your experience.&lt;/p&gt;
&lt;p&gt;[Update] Related posts:&lt;br&gt;
&lt;a href=&#34;https://weblog.masukomi.org/2007/5/23/using-darcs-with-svn-cvs-flow-chart&#34;&gt;Using Darcs with SVN / CVS Flow
Chart&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://weblog.masukomi.org/2006/12/29/distributed-scm&#34;&gt;Why you should be using a distributed source control
system&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Best Practices For Web Developers</title>
      <link>https://weblog.masukomi.org/2007/03/29/best-practices-for-web-developers/</link>
      <pubDate>Thu, 29 Mar 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/03/29/best-practices-for-web-developers/</guid>
      <description>&lt;p&gt;I wrote this essay a while ago and have been tweaking it based on the
feedback from those I&amp;rsquo;ve sent it to (thanks guys). There are a few
things I&amp;rsquo;d like to change still but I&amp;rsquo;m going to go with the &amp;ldquo;Release
early. Release often&amp;rdquo; mantra on this one. I think it&amp;rsquo;s more important
that it get out there than it being perfect.&lt;/p&gt;
&lt;p&gt;Best Practices for Web Developers introduces the idea of
&lt;a href=&#34;http://www.hyperdictionary.com/search.aspx?define=heuristic&#34;&gt;Heuristically&lt;/a&gt;
Driven Development ( HDD ) as it applies to web development, but
honestly almost everything in there is applicable to all forms of
development. There&amp;rsquo;s &lt;a href=&#34;http://www.masukomi.org/writings/best_practices/&#34;&gt;an HTML
version&lt;/a&gt; and &lt;a href=&#34;http://www.masukomi.org/writings/best_practices.pdf&#34;&gt;a PDF
version&lt;/a&gt; and your
feedback would be greatly appreciated and help to make the next
iteration of the document better.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d include it here but it&amp;rsquo;s just too long for a blog post.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>You really don&#39;t want to &#34;become&#34; a programmer</title>
      <link>https://weblog.masukomi.org/2007/03/12/you-really-dont-want-to-become-a-programmer/</link>
      <pubDate>Tue, 13 Mar 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/03/12/you-really-dont-want-to-become-a-programmer/</guid>
      <description>&lt;p&gt;You really don&amp;rsquo;t want to become a programmer.&lt;/p&gt;
&lt;p&gt;How do I explain to you that programming is an endeavor of passion?&lt;/p&gt;
&lt;p&gt;You look at it and see text on a screen and a good paycheck.&lt;br&gt;
I see problems begging for solutions.&lt;/p&gt;
&lt;p&gt;You see tasks to be completed.&lt;br&gt;
I see mountains to be scaled, and wells to be dug.&lt;/p&gt;
&lt;p&gt;You think, &amp;ldquo;I could sit at a desk and poke at a computer all day.&amp;rdquo;&lt;br&gt;
I forget there is a desk, what day it is,&lt;br&gt;
or that my chair&amp;rsquo;s been broken since I started here.&lt;/p&gt;
&lt;p&gt;You try and do the tasks set before you.&lt;br&gt;
I work binary clay into sculptures,&lt;br&gt;
sometimes bland and functional,&lt;br&gt;
sometimes grand and fanciful,&lt;br&gt;
but always striving, always trying to become.&lt;/p&gt;
&lt;p&gt;You don&amp;rsquo;t want to be a programmer.&lt;br&gt;
You either are one or you aren&amp;rsquo;t.&lt;br&gt;
No school can teach you to love.&lt;br&gt;
They can only give you skills.&lt;br&gt;
And, what good is knowing how to sculpt&lt;br&gt;
if you don&amp;rsquo;t find wonder in the David?&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll spend your days chiseling at stone.&lt;br&gt;
Clink. clink. clink.&lt;br&gt;
I&amp;rsquo;ll spend my days striving for beauty.&lt;br&gt;
You&amp;rsquo;ll go home bored and unfulfilled.&lt;br&gt;
I&amp;rsquo;ll go home thrilled.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s like drugs for us. There&amp;rsquo;s an adrenaline rush.&lt;br&gt;
We solve it! We did it!&lt;/p&gt;
&lt;p&gt;You&amp;hellip; you get to move on to the next task.&lt;/p&gt;
&lt;p&gt;You don&amp;rsquo;t want to become a programmer.&lt;br&gt;
We&amp;rsquo;re born, not made.&lt;br&gt;
It is passion, and skill, and art.&lt;br&gt;
We&amp;rsquo;re obsessed with the problems.&lt;br&gt;
We love, and hate, the insanity of the bugs&lt;br&gt;
that offer themselves up to us.&lt;br&gt;
&amp;ldquo;Why does it do that?! That makes no sense!&amp;rdquo;&lt;br&gt;
we cry with mock outrage, secretly thrilled.&lt;br&gt;
The hunt is on.&lt;/p&gt;
&lt;p&gt;You&amp;hellip; &amp;ldquo;You&amp;rsquo;ve got another problem with your app,&lt;br&gt;
and, oh yeah,&lt;br&gt;
you&amp;rsquo;ve got 20 minutes before they need to demo it.&amp;rdquo;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>FizzBuzz Overthink</title>
      <link>https://weblog.masukomi.org/2007/03/10/fizzbuzz-overthink/</link>
      <pubDate>Sat, 10 Mar 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/03/10/fizzbuzz-overthink/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://weblog.raganwald.com/2007/01/dont-overthink-fizzbuzz.html&#34; title=&#34;Raganwald&#34;&gt;Raganwald&lt;/a&gt;
suggests, with good reasons, why you shouldn&amp;rsquo;t over-think FizzBuzz.
Obviously I took &lt;a href=&#34;https://weblog.masukomi.org/2007/03/09/fizzbuzz-rethink&#34; title=&#34;a different view of it&#34;&gt;a different view of
it&lt;/a&gt;
and yet I still agree with all of his points.&lt;/p&gt;
&lt;p&gt;So, I&amp;rsquo;d like to counter with some reasons why you should over-think
FizzBuzz, and why I did, because I don&amp;rsquo;t think I did a great job of
explaining that in my last post. But first, lets assume you&amp;rsquo;re not being
asked to solve it on a whiteboard while the interviewer waits. In that
case my 400(ish) line solution is completely inappropriate. In fact,
anything but a quicky solution is inappropriate. Lets also assume that
in submitting an over-thought solution to FizzBuzz you make it perfectly
clear that you know it&amp;rsquo;s over-thought and what you were hoping to
achieve by going to such ridiculous lengths in your creation.&lt;/p&gt;
&lt;p&gt;As I mentioned in &lt;a href=&#34;https://weblog.masukomi.org/2007/03/09/fizzbuzz-rethink&#34; title=&#34;FizzBuzz rethink&#34;&gt;FizzBuzz
rethink&lt;/a&gt;
hundreds of programmers rushed to solve FizzBuzz in the comments of the
various posts about it and many of them got it wrong. I suggested that
this was a classic example of what&amp;rsquo;s wrong with this industry. And the
reason I believe that is exactly why I think FizzBuzz should be
over-thought.&lt;/p&gt;
&lt;p&gt;As sad as it is that there are so many &amp;ldquo;programmers&amp;rdquo; out there who
can&amp;rsquo;t successfully solve the FizzBuzz problem I believe it&amp;rsquo;s even sadder
how many companies are allowing their programmers to take a half-assed
approach to software development. There are far too many who still think
that writing unit tests isn&amp;rsquo;t worth the time, or that since they can&amp;rsquo;t
possibly test for every possible scenario they&amp;rsquo;ll test for none. Some
don&amp;rsquo;t even use version control. These companies, like the people who
rushed to post FizzBuzz solutions without really reading the
instructions, allow their developers the slap together the first thing
that comes to mind and rush it out the door without any real clue if
it&amp;rsquo;ll break anything else when deployed, if it really meets the clients
needs, or, in the case of the posters, if it will make them look like an
idiot for not even being able to correctly solve FizzBuzz.&lt;/p&gt;
&lt;p&gt;With the previously stated assumptions in mind an over-thought FizzBuzz
solution is excellent because it tells the employer that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;you&amp;rsquo;ll actually apply some thought to the problems they set before
you.&lt;/li&gt;
&lt;li&gt;you recognize the value of things like testability (you do have unit
tests right?)&lt;/li&gt;
&lt;li&gt;you are familiar with and prepared for the common changes that
clients will ask for.&lt;/li&gt;
&lt;li&gt;you are self-motivated and not the type of person who go above and
beyond what&amp;rsquo;s asked of you.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It&amp;rsquo;s great for the interviewee because if the employer starts
bikeshedding you know you don&amp;rsquo;t want to work for them. If the
interviewer does &amp;ldquo;grill you over why your solution doesn’t use the &lt;a href=&#34;https://weblog.raganwald.com/2007/02/but-y-would-i-want-to-do-thing-like.html&#34;&gt;Y
Combinator&lt;/a&gt;
to implement `compose&amp;rdquo;, as Raganwald suggests, then you know these people may actually have brains, and I would much rather work for people with brains who will challenge me. If the challenge comes in the form of suggesting you&amp;rsquo;re a loon for such an extreme solution it&amp;rsquo;s an opportunity to defend why you think it&amp;rsquo;s good and see how they deal with a person willing to stand up for their craziness. You&amp;rsquo;ll quickly learn if  they&amp;rsquo;re
the kind of company where they expect you to roll over and acquiesce to
their suggestions or if they are willing to have a real debate with you.
Either way you learn a lot about the employer that will help you decide
if you&amp;rsquo;d even want the job. It&amp;rsquo;ll also give them a good idea of how you
handle your peers suggesting that you&amp;rsquo;ve done something wrong.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not sure I want to work for someone who can&amp;rsquo;t see the value of an
intentionally over-thought FizzBuzz like mine.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>FizzBuzz Rethink</title>
      <link>https://weblog.masukomi.org/2007/03/09/fizzbuzz-rethink/</link>
      <pubDate>Fri, 09 Mar 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/03/09/fizzbuzz-rethink/</guid>
      <description>&lt;p&gt;Or maybe overthink would be more appropriate&amp;hellip;.&lt;/p&gt;
&lt;p&gt;[UPDATE] I&amp;rsquo;ve written &lt;a href=&#34;https://weblog.masukomi.org/2007/03/10/fizzbuzz-overthink&#34;&gt;a
followup&lt;/a&gt; about
why an over-thought solution like the one proposed here can be / is a
good thing. And just to be blazingly, obviously, painfully clear on the
matter. I do &lt;em&gt;not&lt;/em&gt; think that every problem should be over-thought to the
degree I took this. My solution represents a crazy amount of code for
such a small problem. It&amp;rsquo;s intended as an example of how I&amp;rsquo;d mentally
approach a real and complex problem presented by a client.&lt;/p&gt;
&lt;p&gt;The FizzBuzz test was conceived by Irman and posted here:
&lt;a href=&#34;http://tickletux.wordpress.com/2007/01/24/using-fizzbuzz-to-find-developers-who-grok-coding/&#34;&gt;http://tickletux.wordpress.com/2007/01/24/using-fizzbuzz-to-find-developers-who-grok-coding/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It was to be used as a method for weeding out applications for developer
positions who couldn&amp;rsquo;t code &lt;em&gt;anything&lt;/em&gt; and the original test
instructions were to:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Write a program that prints the numbers from 1 to 100. But for
multiples of three print &amp;ldquo;Fizz&amp;rdquo; instead of the number and for the
multiples of five print &amp;ldquo;Buzz&amp;rdquo;. For numbers which are multiples of
both three and five print &amp;ldquo;FizzBuzz&amp;rdquo;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;ANY&lt;/strong&gt; developer should be able to write a solution to this and many
did in the comments of the original post and other posts that referenced
it. Unfortunately, as a number of bloggers pointed out, many of the
people who rushed to post solutions GOT IT WRONG! Mostly this was a
result of just not reading those three sentences carefully enough. I
know, you&amp;rsquo;d think you wouldn&amp;rsquo;t have to re-read those&amp;hellip;&lt;/p&gt;
&lt;p&gt;The solutions people were posting were inadvertently providing a classic
example of what&amp;rsquo;s wrong with how so many developers approach
professional software projects, which means that FizzBuzz is a better
interview test than anyone seems to realize. How a person approaches
this problem &lt;em&gt;for an interview&lt;/em&gt; is a great example of how they&amp;rsquo;ll
approach other problems they&amp;rsquo;re faced with should you decide to hire
them.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been coding professionally for over a decade now and along the way
I&amp;rsquo;ve learned a number of things; things that I&amp;rsquo;d like to see addressed
either in code or by the questions an interviewee asks in response to
the test. So lets set the stage for something a little different.&lt;/p&gt;
&lt;p&gt;First, we&amp;rsquo;re going to assume that it&amp;rsquo;s been explained that the FizzBuzz
test is based upon a children&amp;rsquo;s game of the same name.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In this game a group of children sit around in a group and say each
number in sequence, except if the number is a multiple of three (in
which case they say &amp;ldquo;Fizz&amp;rdquo;) or five (when they say &amp;ldquo;Buzz&amp;rdquo;). If a
number is a multiple of both three and five they have to say
&amp;ldquo;Fizz-Buzz&amp;rdquo;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Second, you have to remember that this is for &lt;strong&gt;an interview&lt;/strong&gt; so the
response should not only display that they CAN code but, hopefully, give
an idea of how they&amp;rsquo;d approach the task of writing software for one of
the interviewer&amp;rsquo;s clients because if someone&amp;rsquo;s hiring you to code then
there&amp;rsquo;s a client (even if it happens to be the same company). Seeing if
the interviewee can make this logical leap without being told is another
part of the test.&lt;/p&gt;
&lt;p&gt;Third, after explaining the game the test is based on and with the
assumption that the person knows this is for an interview use the same
instructions.&lt;/p&gt;
&lt;p&gt;Continue reading to see my solution, or pretend you&amp;rsquo;re
an interviewee and write something to impress then see how our solutions
compare.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href=&#34;https://s3.amazonaws.com/mobtvse_masukomi/assets/2007/3/9/FizzBuzz.zip&#34;&gt;This is my
solution&lt;/a&gt;. It
is above and beyond what is needed to address the instructions. But,
it&amp;rsquo;s goal was to show an interviewer how I would address the problem if
it were for a client of theirs and assumes typical clients. I do not
believe that every simple problem needs to be expanded to this extreme.
It&amp;rsquo;s written in Java because that&amp;rsquo;s what I have been coding in all day
today and you should be able to import it as an existing Java project
(compiled against Java 1.6).&lt;/p&gt;
&lt;p&gt;It addresses the following issues:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clients change their minds. Constantly. Just because it&amp;rsquo;s 1-100
today doesn&amp;rsquo;t mean that it won&amp;rsquo;t need to be -1 to 1000 tomorrow.&lt;/li&gt;
&lt;li&gt;While specs change (see above) wording changes even more. Three days
after deploying the code the clients wife / husband will decide that
FizzBuzz is a &amp;ldquo;horribly offensive&amp;rdquo; term or a foreign student will
realise that it means &amp;ldquo;Dung Beetle Sex&amp;rdquo; in some obscure language.
The words will have to be mutable.&lt;/li&gt;
&lt;li&gt;If it&amp;rsquo;s even remotely useful it&amp;rsquo;ll be re-purposed. Which means the
output you &lt;em&gt;thought&lt;/em&gt; was appropriate will now need to be usable by
the web version, the version for mobile devices, the Blackberry
(even though the customer doesn&amp;rsquo;t own any they&amp;rsquo;ve demanded
Blackberry support).&lt;/li&gt;
&lt;li&gt;Documentation. It&amp;rsquo;s got comments. It&amp;rsquo;s got Javadocs. It&amp;rsquo;s got this
document here.&lt;/li&gt;
&lt;li&gt;Readability and maintainability. This is for an interview. The code
should be readable not an example of your &amp;ldquo;leet&amp;rdquo; mastery of obscure
syntax. Furthermore, if this was a &amp;ldquo;real&amp;rdquo; app it&amp;rsquo;s just a matter of
time before someone else will have to pick up where you left off.&lt;/li&gt;
&lt;li&gt;Unit testing. It&amp;rsquo;s got to be done especially for a mission critical
component and I consider successfully obtaining a good job to be a
critical mission so this app has got to run correctly. It should
also show that I know how to write a good test.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Unfortunately it doesn&amp;rsquo;t address these issues but I would hope that my
addressing them in this document will suffice:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The error messages are NOT internationalized but would definitely
need to be in a &amp;ldquo;real&amp;rdquo; app. It&amp;rsquo;s far easier to internationalize in
the beginning than to re-work an existing app but doing so would
have required a bit more work than I thought was appropriate for
this app.&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;ve also chosen to leave out logging because I wanted this to be
runnable without any additional libraries other than jUnit.&lt;/li&gt;
&lt;li&gt;There are no functional tests. Given that the app has no GUI and was
to be run from the command line I&amp;rsquo;ll trust that the operating system
developers of the world have correctly implemented argument passing
to command line apps and that the JVM correctly prints to the
console when it needs to. Were this a &amp;ldquo;real&amp;rdquo; app with a GUI it would
require functional / integration testing.&lt;/li&gt;
&lt;li&gt;It doesn&amp;rsquo;t enable modification of which numbers you&amp;rsquo;d call out Fizz,
Buzz, and FizzBuzz on. This is because the next three prime numbers
are 7, 11, and 13. Considering that this is a children&amp;rsquo;s game to
teach multiplication none of those would come up with enough
regularity to make the game worth playing and non-prime numbers
would come up too often.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The unit test assumes you have jUnit 1.4 in your classpath and an easy
way to run it, like eclipse.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Why you should learn toki pona</title>
      <link>https://weblog.masukomi.org/2007/01/13/why-you-should-learn-toki-pona/</link>
      <pubDate>Sat, 13 Jan 2007 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2007/01/13/why-you-should-learn-toki-pona/</guid>
      <description>&lt;p&gt;If any of the following are true you should learn &lt;a href=&#34;http://www.tokipona.org&#34;&gt;Toki
Pona&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You want to learn a language, but you don&amp;rsquo;t have time.&lt;/li&gt;
&lt;li&gt;You want to learn a language, but you don&amp;rsquo;t have anyone to speak it
with.&lt;/li&gt;
&lt;li&gt;There are things you wish to say to your friends in public (or in
the workplace) without other people knowing what you&amp;rsquo;re saying.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Toki Pona is a minimal language that focuses on the good things in
life. It has been designed to express the most, using the least. The
entire language has only 14 basic sounds and 118 words. The grammar,
although different from English, is very regular and easy to learn.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Those core words are combined in extremely simple ways to convey more
specific meanings. For example: &amp;ldquo;telo&amp;rdquo; means water. &amp;ldquo;nasa&amp;rdquo; means crazy.
&amp;ldquo;telo nasa&amp;rdquo; means crazy water, or alcohol. When you see a compoud word
like &amp;ldquo;telo nasa&amp;rdquo; for the first time it&amp;rsquo;s easy to figure out what it
means. Toki Pona only capitalizes words that aren&amp;rsquo;t Toki Pona. It&amp;rsquo;s
verbs are only conjugated one way so you don&amp;rsquo;t have to remember a past,
present, future, male, and / or female version of every one.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A lot of life wisdom has been &amp;ldquo;built into&amp;rdquo; Toki Pona. Training your
mind to think in Toki Pona can lead to many deeper insights about
yourself or the world around you. In our modern times, we seem to make
life so complicated, and it is easy to lose touch with our basic
origins. Indeed, they say that most of life&amp;rsquo;s problems we create
ourselves, e.g. in our frenetic and always accelerating quest for
&amp;ldquo;progress&amp;rdquo;. When you break down a complex situation to its fundamental
Toki Pona words, it can often become more clear, and you can check if
are in a good direction.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So the whole, &amp;ldquo;I don&amp;rsquo;t have time&amp;rdquo; thing is pretty much a non-issue. If
you have good short term memory you can get the whole vocabulary down in
about 45 minutes. The average person should be able to work through the
lessons by spending a little time each evening over the course of a few
days.&lt;/p&gt;
&lt;p&gt;Now, the big issue of wanting to learn a language but not having anyone
to speak with. Toki Pona has a live journal community and a yahoo group
where you can find converse, but more importantly Toki Pona is that it&amp;rsquo;s
small enough that you might just be able to convince your friends to
learn it with you, because no matter how vibrant an online community may
be for a language there&amp;rsquo;s no substitute for having people to speak it
with in everyday life. What are the odds you can convince your friends
to learn Japanese, or Portugese, or any other big language just because
you think it would be fun?&lt;/p&gt;
&lt;p&gt;I love the idea of being able to speak freely to my friends when in
public. We have opinions and ways of speaking amongs ourselves that are
either too blunt or too socially unacceptable to use in public. There
are things we just can&amp;rsquo;t talk about or have to talk around when riding
the subway. Imagine if that was no longer the case. Imagine that you
have good friends at work but work for a pointy haired boss (a la
Dilbert) and were suddenly able to speak freely in the workplace again.
Or, imagine something a simple as being able to discuss the other people
you see in the mall without having to worry about hurting their feelings
or them getting upset at you. Toki Pona is perfect for all of these
things specifically because there are so few speakers.&lt;/p&gt;
&lt;p&gt;Side note: If you&amp;rsquo;re cynical regarding most conlangs, as I am, you
should read &lt;a href=&#34;http://www.pigdog.org/auto/esperanto/link/2705.html&#34;&gt;this rant wherein a conlang cynic finds the joys of Toki
Pona&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Some Toki Pona links:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://www.tokipona.org&#34;&gt;Toki Pona home page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://tokipona.esperanto-jeunes.org/lesson/lesson0.html&#34;&gt;Toki Pona
lessons&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://community.livejournal.com/tokipona/&#34;&gt;Toki Pona LiveJournal
community&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://groups.yahoo.com/group/tokipona/&#34;&gt;Toki Pona Yahoo! group&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://tokipona.wikia.com/wiki/lipu_lawa&#34;&gt;Toki Pona Wiki&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now I just need to get Mizzy learning it&amp;hellip;&lt;/p&gt;
&lt;p&gt;To give you an example of toki pona I have translated the post above
into it. Of course, I speak toki pona about as well as your
stereotypical immigrant cab driver speaks English so I apologize to
those who know better than I and ask for their patience and corrections.
Toki Pona isn&amp;rsquo;t hard but it definitely mokes you think about things in a
different way in order to express them. So, yes, it took me a while to
write this out, and yes, it&amp;rsquo;s silly to try any convince someone who can
read toki pona that they should learn toki pona, but it was a good
exercise none-the-less.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;ijo nami e kama la ijo li lon ala lon? lon? sina wile sona e toki toki
pona.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;sina wile e toki taso sina jo ala tenpo.&lt;/li&gt;
&lt;li&gt;sina wile e toki lon toki taso sina jo ala e jan pi toki tawa sina.&lt;/li&gt;
&lt;li&gt;sina wile e toki tawa jan pona en sine wile e ni: jan li jo ala e
sona.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;toki pona li pona toki. toki pona li insa lon e ale. ni li pona e ni:
toki li tawa e suli poka lili. toki pona jo 14 kalama en 118 nimi.
toki pi toki pona li pona taso ante tawa Inli. kama sona tawa ni li
pona.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;poka nimi lili la pona pi suli nimi ken li pona. o lukin. telo li lon
Water. nasa li lon Crazy. telo nasa li lon Alcohol. sina lukin e suli
nimi ken la sina sona tawa pona. toki pona li jo ala e nimi wan suli.
sina lukin e nimi wan suli e ni: sina lukin e toki pona ala. nimi tawa
li lon pona. sina kama sona poka lili ike.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;toki pona jo poka insa. toki pona li pona e pilin sina. toki pona li
pona e ni: lukin sina tawa ma sina. lon pi tenpo ni pi mi mute la mi
mute li pona e lon ike. mi mute li jo ala e linja tawa tenpo pini pi
mi mute. ona mute li toki e ni: lon ike li pona tan mi mute. tawa suli
tawa &amp;ldquo;Progress&amp;rdquo; li tan e ni. tawa tan ike tawa pona li lon e nimi pi
toki pona. ni tawa e ilo pona. tan ni la sina li lukin tawa seme nasin
e pona.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;sina jo tenpo tawa kama sona e toki pona. lawa sina tawa tenpo pini li
pona ala pona? pona? ni tan la sina kama sona e nimi e insa 45 Minute.
jan pi pona ala en ike ala li ken sona poka tenpo lili inja tenpo pimeja
lili.&lt;/p&gt;
&lt;p&gt;sina wile e toki lon toki taso sina jo ala e jan pi toki tawa sina: toki
pona li inja LiveJournal en kulupu Yahoo!. pona mute e ni: sina ken poka
lawa sitelen tawa jan pona. toka Onaline li ike ala taso toki poka jan
pona li pona mute. sina ken ala ken pana lawa sitelen pi Japanese&amp;quot; anu
Portugese tawa jan pona? sina ken ala ken tan musi e ni?&lt;/p&gt;
&lt;p&gt;lawa sitelen pi toki jo ala ike inja jan mute li pona tawa mi. jan pona
mi jo ijo mute li ike tawa jan mute. mi mute li ken ala toki inja
Subuwe. inja lawa pawa ni: lawa setelen e tenpo pini. jan pali mute sina
ken toki jo ala ike. sina ken toki poka jan Malu e jo ala ike. toki pona
li pona tawa sina tawa ni en tan ni: toki pona li jo ala jan toki mute.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Why you should be using a distributed source control system</title>
      <link>https://weblog.masukomi.org/2006/12/29/why-you-should-be-using-a-distributed-source-control-system/</link>
      <pubDate>Fri, 29 Dec 2006 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2006/12/29/why-you-should-be-using-a-distributed-source-control-system/</guid>
      <description>&lt;p&gt;I was reading some articles yesterday that finally made the light bulb
go off about distributed source control management (scm) and why we
should be using them. First off, a distributed scm, unlike CVS or
Subversion, has no central repository that all others pull from. It&amp;rsquo;s
possible to set one up and say that it&amp;rsquo;s the master and tell people to
pull from and push to it but that&amp;rsquo;s more a matter of convention. What&amp;rsquo;s
truly unique about these systems is that each checkout is it&amp;rsquo;s own
self-contained ecosystem. And there are many reasons this is a good
thing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can make as many changes as you want, check in unfinished code,
and explore new functionality without ever affecting other
developers. It only impacts other users when you sync your current
working environment with others.&lt;/li&gt;
&lt;li&gt;You don&amp;rsquo;t have to have net access, or be connected to any other box
to get work done while still taking advantage of version control.
Working on your laptop? Stuck in the boonies with just dial-up?
Commit changes, roll-back to previous versions, make branches, none
of it is dependent upon some central server. When you do get back
online you can sync your changes with others.&lt;/li&gt;
&lt;li&gt;&amp;ldquo;You don’t need to set up and manage a central SCM host with
sufﬁcient disk space, compute power, bandwidth, and backup to
support the concurrent SCM operations of your entire development
community.&amp;rdquo; *&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;real-world-uses&#34;&gt;Real world uses:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The open source project:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If Mozilla has taught us anything it&amp;rsquo;s that you&amp;rsquo;re NOT going to get
thousands of developers working on your project. So, while huge
numbers of developers is something that distributed scm handle
exceedingly well I think the point is moot. But, in my experience, a
developer interested in some OSS (Open Source Software) project will
download the source from a traditional scm, poke around to
understand it, and if they&amp;rsquo;re smitten with the idea will start
customizing it for their needs. But, the are forced to either work
without the benefits of version control or they have to check it
into their own personal scm. If they check it into their own you can
pretty much forget about ever getting patches from them because
they&amp;rsquo;re no longer able to sync with your tree and it would be way
more work than they generally want to do to get synced and give you
a patch that was useful. If they work without scm (because they
don&amp;rsquo;t have commit rights to your scm) you may get a patch from them
but for them it&amp;rsquo;s like climbing a rock face without lines and
harnesses.&lt;/p&gt;
&lt;p&gt;If you were to use a distributed scm each developer would be working
off of their own personal copy of the scm that could be synced at
any point in time no matter how many changes, revisions, or commits
they have made. They&amp;rsquo;re generally not going to check it into their
own scm system because that&amp;rsquo;s work that doesn&amp;rsquo;t get them any real
benefit. They already have version control via their checkout and
the fact that it&amp;rsquo;s a distributed system. End result, they don&amp;rsquo;t need
to work without the safety and security of an scm and they will
generally always be working on a system they can easily send you
changes from when they&amp;rsquo;re ready.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Web developers with sites others depend on:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re really working like a pro, you&amp;rsquo;re constantly branching and
merging your code. You&amp;rsquo;ve got a live site branch. You&amp;rsquo;ve got a
branch for each new functionality exploration. You&amp;rsquo;ve got a trunk
branch that everyone merges into their other branches regularly. In
the real world you probably have a live site branch and the trunk
and cross your fingers that each developers functional exploration
doesn&amp;rsquo;t screw over any other developer&amp;rsquo;s pokings. Or, in far too
many cases, you just have the trunk. The problem comes (for those of
us who hate dealing with the pain in the ass that is the current
state of merging on most traditional SCMs and have minimal branches)
when you decide you want to integrate one developers functional
exploration into the live branch. How do you extract that code from
the other code in the trunk (or any other common branch)?&lt;/p&gt;
&lt;p&gt;If you were using a distributed scm it would go something like this:
Everything starts with the live site repo (wherever you happen to
keep that). Everyone&amp;rsquo;s local repo(s) started as a copy of that. It&amp;rsquo;s
not uncommon to check out another copy to go explore some new
feature set in. Maybe you sync it with the live. Maybe you trash it.
It doesn&amp;rsquo;t matter no other repo was affected by your fiddling. You
don&amp;rsquo;t have to make a new branch in some central repo that gets
stored forever even if your fiddlings proved insignificant or were
just abandoned. If everyone decides that the features you worked out
in a particular repo are worth keeping they just sync with it. If
you decide to wait to put it into a later release that&amp;rsquo;s fine too
because there&amp;rsquo;s no need to untangle it from other work you, or
others, have been doing. This is because to &amp;ldquo;branch&amp;rdquo; you just do a
simple checkout from any other repo. When it comes to merging you
benefit from the fact that any decent distributed scm is designed to
work with syncing sweeping changes to entire code-bases not just
individual files. They all handle this a bit differently of course,
and some better than others, but the point is that while you&amp;rsquo;re
almost always going to have conflicts you&amp;rsquo;re working with tools that
&lt;em&gt;have&lt;/em&gt; to be better equipped to avoid them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Projects with reeeeally large code-bases or many many
developers:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I can&amp;rsquo;t really speak to those because I just haven&amp;rsquo;t worked on them
but utilizing distributed scms does mean that you don&amp;rsquo;t have the
huge demands on the server hosting your scm. Plus all the
aforementioned benefits.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So what are your options? Well the main contenders appear to be
&lt;a href=&#34;http://www.darcs.net/&#34;&gt;darcs&lt;/a&gt; (written in Haskell),
&lt;a href=&#34;http://www.selenic.com/mercurial/wiki/index.cgi&#34;&gt;Mercurial&lt;/a&gt; (written in
Python), and &lt;a href=&#34;http://git.or.cz/&#34;&gt;Git&lt;/a&gt; (written in c plus hooks into a
bunch of other things I think). darcs seems to be the easiest to use,
with some decidedly funky features, but isn&amp;rsquo;t great for projects with
huge numbers of files (it can be ram intensive at times). Mercurial is
going to be used by the newly open-sourced JDK, and Git is being used to
manage the Linux kernel.&lt;/p&gt;
&lt;p&gt;* My light bulb moment, and some of the quotes here are thanks in no
small part to &lt;a href=&#34;http://blogs.sun.com/mr/entry/openjdk_scm&#34;&gt;this blog
post&lt;/a&gt; about the JDK moving to
Mercurial by Mark Reinhold. Thanks Mark.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The niftiest little Rails plugin you never heard of</title>
      <link>https://weblog.masukomi.org/2006/12/09/the-niftiest-little-rails-plugin-you-never-heard-of/</link>
      <pubDate>Sat, 09 Dec 2006 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2006/12/09/the-niftiest-little-rails-plugin-you-never-heard-of/</guid>
      <description>&lt;p&gt;Back in January of 2006 &lt;a href=&#34;http://brainspl.at/&#34;&gt;Ezra Zygmuntowicz&lt;/a&gt; came up
with an exceptionally cool Rails plugin that, IMNSHO, should be in rails
core. It&amp;rsquo;s called
&lt;a href=&#34;http://brainspl.at/articles/2006/01/04/more-where-clause-goodness#comments&#34;&gt;ez_where&lt;/a&gt;
and it&amp;rsquo;s svn repo is
&lt;a href=&#34;http://opensvn.csie.org/ezra/rails/plugins/ez_where&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;What&amp;rsquo;s so cool about ez_where? Well, the to really understand it&amp;rsquo;s
beauty you have to step back to one of core concepts that&amp;rsquo;s at the heart
of frameworks like Rails: Database Abstraction and Object Relational
Mappings. Before these concepts really came into their own we were all
writing raw SQL commands in our apps. Now we interact with a layer of
abstraction that lets us work with the objects we&amp;rsquo;re actually
programming with instead of database structures. Except, that&amp;rsquo;s not
quite true with Rails. With rails you end up writing things that are
possibly more complex than the SQL statements we&amp;rsquo;ve been trying to
avoid. Here&amp;rsquo;s a particularly egregious example from a ticket system I&amp;rsquo;ve
been working on:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;no&#34;&gt;Ticket&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;find&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;ss&#34;&gt;:all&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;         &lt;span class=&#34;ss&#34;&gt;:conditions&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&amp;gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;closed = ? AND product_id in (?) AND user_id = ?  
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;             AND ticket_type_id=? &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;product_ids&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;user_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ticket_type_id&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;         &lt;span class=&#34;ss&#34;&gt;:order&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&amp;gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;weighted_vote_percentage DESC, ticket_id DESC&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Personally I don&amp;rsquo;t see this as being particularly better than writing
the raw sql since &lt;em&gt;I am&lt;/em&gt; writing the raw sql. Yes Rails has saved me
from writing the &lt;code&gt;SELECT t.* from tickets t WHERE&lt;/code&gt; but then it forced me
to write the entire where and order clauses and put them in a data
contstruct that took more thinking and more characters than the SQL
would have. How is this better? SQL is database agnostic anyway (unless
you start adding in vendor specific additions ) so it&amp;rsquo;s not really
buying me separation from that&amp;hellip; So what &lt;em&gt;is&lt;/em&gt; it buying me?&lt;/p&gt;
&lt;p&gt;Ezra gets it though. If you use his plugin you&amp;rsquo;ll be able to use the
power of ruby in your find statements. Yes, it may be more wordy than
SQL but what it buys you is a true separation from your database. His
&lt;a href=&#34;http://brainspl.at/articles/2006/01/04/more-where-clause-goodness#comments&#34;&gt;blog posting on
ez_where&lt;/a&gt;
gives this great example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; Model.find_with_conditons( :all, :limit =&amp;gt; ..., :order =&amp;gt; ... ) do 
   foo == &#39;bar&#39;       # [&amp;quot;foo = ?&amp;quot;, &#39;bar]
   baz &amp;lt;=&amp;gt; (1..100)   # [&amp;quot;baz BETWEEN ?AND ?&amp;quot;, 1,100]
   woo =~ &#39;substri%&#39;  # [&amp;quot;woo LIKE ?&amp;quot;, &#39;substri%&#39;]
   id === (1..4)      # [&amp;quot;id IN (?)&amp;quot;, [1,2,3,4]]
   fiz &amp;lt; 10           # lt, gt, leq, geq, etc., should all &amp;quot;just work&amp;quot; 
 end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now, to be totally up front with you, I haven&amp;rsquo;t actually used this
plugin yet, but, honestly, I don&amp;rsquo;t even care if it&amp;rsquo;s buggy. If it&amp;rsquo;s even
remotely close to working I&amp;rsquo;ll be helping to fill in any holes that
present themselves. For years experienced developers have been trying to
get us to &lt;em&gt;remove&lt;/em&gt; SQL from our code, and then Rails comes along and
chucks that advice out the window. This, or something very much like it,
is what we should be moving towards.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>On DRM</title>
      <link>https://weblog.masukomi.org/2006/11/26/on-drm/</link>
      <pubDate>Sun, 26 Nov 2006 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2006/11/26/on-drm/</guid>
      <description>&lt;p&gt;When it comes to DRM &amp;ldquo;protected&amp;rdquo; music people tend to be either
completely ignorant as to how it affects them, or even that it affects
them, or they&amp;rsquo;re religious zealots who have such extreme viewpoints you
can&amp;rsquo;t have a sensible discussion about the issue.&lt;/p&gt;
&lt;p&gt;But there&amp;rsquo;s one simple exercise that will explain just how dangerous DRM
is to you and your friends:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What computers were people using ten years ago?&lt;/li&gt;
&lt;li&gt;Can you run the software from those computers on your current
computer? Does anyone even support or update the software from then?
Would you want it even if they did? &lt;br&gt;
Macs were running OS 7 in 1996. Windows was Win 95.&lt;/li&gt;
&lt;li&gt;Considering that &lt;a href=&#34;http://en.wikipedia.org/wiki/Moore&#39;s_law&#34;&gt;Moore&amp;rsquo;s
Law&lt;/a&gt; essentially says that
computers will double in power every 18 months do you really think
that the computers we have ten years from now will even remotely
resemble the ones we have today?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With that in mind what will become of the DRM &amp;ldquo;protected&amp;rdquo; music you buy
today from iTunes, or almost any other online music store, if the
software to decrypt it can be reasonably expected no neither be
supported, nor runnable in ten years?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Select Gifts On Sale</title>
      <link>https://weblog.masukomi.org/2006/11/26/select-gifts-on-sale/</link>
      <pubDate>Sun, 26 Nov 2006 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2006/11/26/select-gifts-on-sale/</guid>
      <description>&lt;h2 id=&#34;select-gifts-on-sale&#34;&gt;Select Gifts On Sale&lt;/h2&gt;
&lt;p&gt;Those were the words prominently displayed in the window of a Pier 1
Imports today, and they are so very wrong.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://www.hyperdictionary.com/search.aspx?define=gift&#34;&gt;Gift: [n] something acquired without
compensation&lt;/a&gt;
&lt;br&gt;
If it&amp;rsquo;s on sale, you have to purchase it to get it. If you have to
purchase it to get it &lt;em&gt;it&amp;rsquo;s not a gift.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;In this sentence &amp;ldquo;Select&amp;rdquo; reads as a verb, and you can rest assured
that they don&amp;rsquo;t want you to actually select the sale items because
the sale items are the ones they&amp;rsquo;ve cut the profit margin on to
entice you into the store to hopefully buy items that are &lt;em&gt;not&lt;/em&gt; on
sale. Ignoring the fact that the &amp;ldquo;Gifts&amp;rdquo; aren&amp;rsquo;t actually gifts they
should either use quotes to indicate that someone has referred to
these gifts as &amp;ldquo;select&amp;rdquo; and thus making it clear it&amp;rsquo;s an adjective,
or they could have used &amp;ldquo;select&lt;em&gt;ed&lt;/em&gt; gifts&amp;rdquo; instead.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Yes you can easily interpret what they meant to say but the point is that you shouldn&amp;rsquo;t have to interpret their meaning. The people who made that signage (actually it was a static window decal) are being paid good money to construct English promotional material. Were I their employer I would feel &lt;a href=&#34;http://www.urbandictionary.com/define.php?term=gypped&#34;&gt;gypped&lt;/a&gt; to think that my employees a) couldn&amp;rsquo;t correctly construct a four word sentence and b) not one person in all the meetings that this surely went through was bright enough to catch these obvious errors.&lt;/p&gt;
&lt;p&gt;On a related note can someone please suggest a word with the same
meaning as &amp;ldquo;gypped&amp;rdquo; that doesn&amp;rsquo;t have the negative racial connotation?
Are the &lt;a href=&#34;http://www.hyperdictionary.com/search.aspx?define=romany&#34;&gt;Romany&lt;/a&gt;
considered a race?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>On Warranties and Guarantees</title>
      <link>https://weblog.masukomi.org/2006/11/24/on-warranties-and-guarantees/</link>
      <pubDate>Fri, 24 Nov 2006 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2006/11/24/on-warranties-and-guarantees/</guid>
      <description>&lt;p&gt;Your warranty / guarantee says a lot about you and your products and
shouldn&amp;rsquo;t be considered some legal thing to what you will and won&amp;rsquo;t
reimburse the customer for when things go wrong.&lt;/p&gt;
&lt;p&gt;Your company sells quality products or services right? Shouldn&amp;rsquo;t you
stand behind them as if they were as good as you claim they are?&lt;/p&gt;
&lt;p&gt;Let me give you an example. I&amp;rsquo;m looking for a new messenger bag because
my current one has two holes and is starting to break down in other
areas. I want something nice, that will last me a more than just four
years and I&amp;rsquo;d narrowed down my search to two bags. The &lt;a href=&#34;http://www.amazon.com/OGIO-Hip-Hop-Messanger-Copper/dp/B000H14PMQ/&#34;&gt;Ogio Hip
Hop&lt;/a&gt;
(in spite of the name) and the &lt;a href=&#34;http://www.amazon.com/Ground-Shinumo-Shoulder-Bag/dp/B000AHYI3I&#34;&gt;Ground
Shinumo&lt;/a&gt;.
I was having trouble deciding between them. The Ogio had pictures of the
inside (on various sites) that looked like what I wanted but no reviews
and the Ground had great reviews but no pictures of the inside. They
both claimed to be durable and to use uber-fancy materials to resist
wear, but every bag that isn&amp;rsquo;t pure crap claims that.&lt;/p&gt;
&lt;p&gt;So I thought, &amp;ldquo;hmm If these are really good bags the manufacturer will
stand behind them.&amp;rdquo; So I go over to their home pages to see. &lt;a href=&#34;http://www.groundwear.com/warranty.php&#34;&gt;Ground&amp;rsquo;s
warranty&lt;/a&gt; says:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Our lifetime warranty guarantees that the materials and workmanship in
every product we make will stand up to the use for which it was
intended. Our warranty does not cover damage resulting from accidents,
improper care, or the natural breakdown of materials over extended use
and time. Defective or damaged products must be returned to us for
evaluation (they must be cleaned before you send them). We will repair
or replace them at our discretion. We will repair damages resulting
from accident or improper care for a modest fee.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In other words, they guarantee they didn&amp;rsquo;t screw up when they
manufactured it and even accidents or improper care &amp;ldquo;for a modest fee&amp;rdquo;
which probably means whatever it cost them to make your bag. Not bad at
all, admirable even, but not spectacular.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.ogio.com/warranty.php&#34;&gt;Ogio&amp;rsquo;s warrantee&lt;/a&gt; though:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ogio International guarantees its entire *non-golf line of products
for the **lifetime of the product (original sales receipt required).
This warranty covers the product for the original owner against
defects in materials and workmanship only. If the product ever fails
due to a manufacturing or material defect, then Ogio will repair or
replace with like product at our discretion. This warranty does not
cover damage caused by normal wear and tear, accident, improper use,
or the natural break down of colors and materials over time.&lt;/p&gt;
&lt;p&gt;**Expected &amp;ldquo;lifetime&amp;rdquo; of Ogio products depends on customer usage.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The first thing they do is redefine &amp;ldquo;lifetime&amp;rdquo; to be some vague number
they can never be held to that is somehow tied to how much you use it,
and only applies to the person who happened to pay for it (original
owner). You have to keep the receipt for the &amp;ldquo;lifetime&amp;rdquo; of the bag and
you&amp;rsquo;re shit outta luck if it was a gift. Accidents, improper care? Tough
luck. I especially like redefining &amp;ldquo;lifetime&amp;rdquo; in such a way that their
support of their products ends up being inversely proportional to how
useful the product is. If they make something you &lt;em&gt;really&lt;/em&gt; want to use
it&amp;rsquo;ll wear out faster so they&amp;rsquo;ll support it less. If they make some crap
product you never want to use they&amp;rsquo;ll support it longer. Thus punishing
the people most likely to spread the good word about them.&lt;/p&gt;
&lt;p&gt;Then there&amp;rsquo;s &lt;a href=&#34;http://www.llbean.com/customerService/aboutLLBean/guarantee.html&#34;&gt;L.L. Bean&amp;rsquo;s
guarantee&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Our products are guaranteed to give 100% satisfaction in every way.
Return anything purchased from us at any time if it proves otherwise.
We do not want you to have anything from L.L. Bean that is not
completely satisfactory.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;They&amp;rsquo;re not kidding either. There are many tales of people having
returned worn out, beat up bags and things to L.L. Bean and had them
replaced, for free, with the current year&amp;rsquo;s equivalent. Guess which
company I want to buy a bag from?&lt;/p&gt;
&lt;p&gt;In the end I think I&amp;rsquo;ll get the Ground bag. I&amp;rsquo;d love to buy from L.L.
Bean but I&amp;rsquo;m picky about bags and they don&amp;rsquo;t have anything that really
strikes my fancy except maybe &lt;a href=&#34;http://www.llbean.com/webapp/wcs/stores/servlet/CategoryDisplay?storeId=1&amp;amp;catalogId=1&amp;amp;langId=-1&amp;amp;categoryId=47994&amp;amp;sc1=Search&amp;amp;feat=sr&#34;&gt;this nice sling
bag&lt;/a&gt;
which a co-worker happens to have. Before I looked into the warranties I
was really leaning towards the Ogio bag. But now, I&amp;rsquo;m willing to risk
the internal pockets not being exactly what I want because they stand
behind their product, whereas Ogio is doing everything in their power to
get out of it.&lt;/p&gt;
&lt;p&gt;What does your warranty/guarantee say about your company and it&amp;rsquo;s
products or services?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>On having a mission</title>
      <link>https://weblog.masukomi.org/2006/11/21/on-having-a-mission/</link>
      <pubDate>Tue, 21 Nov 2006 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2006/11/21/on-having-a-mission/</guid>
      <description>&lt;p&gt;The cranium of a good developer is filled with ideas for new
applications. Most of them tend to bounce around with little energy and
eventually succumb to entropy. Some ideas are made out of bouncier stuff
and eventually reach escape velocity, at which point they are launched
down the arms and funneled out the fingertips. You can tell just how
cool an idea is by the speed of typing relative to the developers
average words per minute.&lt;/p&gt;
&lt;p&gt;A short while later there&amp;rsquo;s a working prototype, and, should things go
well, a fully fledged app will follow. But, most of these apps have no
goals, no mission in life. Sure they do something, hopefully well, but
for the most part they&amp;rsquo;re like teenagers, and, like most teenagers,
they&amp;rsquo;ll either figure out what they want to do in life or wander around
aimlessly until they figure out what they want to do, start doing
something nobody cares about, or simply keel over dead.&lt;/p&gt;
&lt;p&gt;But what if they knew what they wanted out of life?&lt;br&gt;
Your, application&amp;rsquo;s mission is it&amp;rsquo;s heart, it&amp;rsquo;s driving force. What is
it&amp;rsquo;s purpose in life?&lt;/p&gt;
&lt;p&gt;Google&amp;rsquo;s mission could be &amp;ldquo;To be the world&amp;rsquo;s best search engine.&amp;rdquo;, but
how is that going to drive Google forward in any meaningful way? Where&amp;rsquo;s
the vision? No, Google&amp;rsquo;s got bigger goals than that. Their mission is
&amp;ldquo;to organize the world&amp;rsquo;s information and make it universally accessible
and useful.&amp;rdquo; Admittedly it&amp;rsquo;s not a terribly rousing mission but take a
second and think about the implications of it. To do anything useful
with &amp;ldquo;the world&amp;rsquo;s information&amp;rdquo; you first have to have it. Just imagine
what that means for it&amp;rsquo;s infrastructure! And how about making it useful?
Well, that requires tools. Making it accessible is a combination of
incredible search technology (we are talking about all the information
in the world here) and tools that can handle the various types of
information: text, video, audio, various forms of structured data like
schedules, locations, etc.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.flickr.com&#34; title=&#34;Flickr&#34;&gt;Flickr&lt;/a&gt; &amp;rsquo;s mission could be &amp;ldquo;&lt;em&gt;The best
place to store, sort, search and share your photos.&lt;/em&gt;&amp;rdquo; but honestly, how
lame is that? Their mission is to be the &amp;ldquo;&lt;a href=&#34;http://blog.flickr.com/flickrblog/2006/03/eyes_of_the_wor.html&#34; title=&#34;eyes of the world&#34;&gt;eyes of the
world&lt;/a&gt;
&amp;ldquo;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;That can manifest itself as art, or using photos as a means of keeping
in touch with friends and family, &amp;ldquo;personal publishing&amp;rdquo; or intimate,
small group sharing. It includes &amp;ldquo;memory preservation&amp;rdquo; (the de facto
understanding of what drives the photo industry), but it also includes
the ephemera that keeps people related to each other: do you like my
new haircut? should I buy these shoes? holy smokes - look what I saw
on the way to work! It let&amp;rsquo;s you know who&amp;rsquo;s gone where with whom, what
the vacation was like, how much the baby grew today, all as it&amp;rsquo;s
happening.&lt;/p&gt;
&lt;p&gt;And most dramatically, Flickr gives you a window into things that you
might otherwise never see, from the perspective of people that you
might otherwise never encounter.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Flickr&amp;rsquo;s mission is all about vision, maybe a little to much so because
it&amp;rsquo;s so non-specific. Stuart Butterfield obviously has a good grip on
how it affects them, but anyone else reading just the mission wouldn&amp;rsquo;t
really get it. But that&amp;rsquo;s ok. What&amp;rsquo;s important here is that there was a
mission and that the people behind it understood it&amp;rsquo;s implications. What
good is it to be the world&amp;rsquo;s eyes if nobody can see through them? Flickr
is driven by it&amp;rsquo;s mission to build tools to let you see through those
eyes.&lt;/p&gt;
&lt;p&gt;But missions don&amp;rsquo;t just help you plan. They help keep you on track.
Every nifty feature you want to add to your app should be run through
the filter of your mission. Eyes aren&amp;rsquo;t about statistics or value or
anything like that. They&amp;rsquo;re just about seeing, and that&amp;rsquo;s why you won&amp;rsquo;t
find any analytics or ways to earn money form your images, or anything
else like that on Flickr. If your app&amp;rsquo;s mission is to be &amp;ldquo;The easiest
way to do X&amp;rdquo; you have to ask yourself if that new set of 20 different
configuration options actually make things easier for people or just
serves to confuse or intimidate them?&lt;/p&gt;
&lt;p&gt;So build your rough prototype. Get that initial burst of creative energy
out. Then, sit back and ask yourself what it really wants to be in life,
and let that drive every new feature you add and provide you with the
confidence to &lt;a href=&#34;http://gettingreal.37signals.com/ch04_Make_Opinionated_Software.php&#34; title=&#34;cut out everything else&#34;&gt;cut out everything
else&lt;/a&gt;
.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>XML-RPC vs SOAP</title>
      <link>https://weblog.masukomi.org/2006/11/21/xml-rpc-vs-soap/</link>
      <pubDate>Tue, 21 Nov 2006 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2006/11/21/xml-rpc-vs-soap/</guid>
      <description>&lt;p&gt;Update: This article was written years ago, however, the information
still holds true. What I would note is that these days both XML-RPC and SOAP have excellent libraries which makes working with both fairly simple. This article is about the capabilities of the two technologies, however, in my experience the question is no longer one of capabilities. It&amp;rsquo;s a question of which one you need to talk to, or which one your framework has baked in. In most cases the answer is SOAP. However, if you&amp;rsquo;re considering writing your own API, my recommendation would be to seriously consider using XML-RPC. It&amp;rsquo;s far less complicated and bloated, and the combination will make your debugging efforts much easier &lt;em&gt;in my not so humble opinion&lt;/em&gt;.&lt;/p&gt;
&lt;h1 id=&#34;xml-rpc-vs-soap&#34;&gt;XML-RPC vs. SOAP&lt;/h1&gt;
&lt;p&gt;by k. rhodes &lt;em&gt;&lt;a href=&#34;mailto:masukomi@masukomi.org&#34;&gt;masukomi@masukomi.org&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A simple guide to choosing the best protocol for your XML Remote
Procedure Call needs.&lt;/p&gt;
&lt;p&gt;Within the world of XML there are two main ways to implement a Remote
Procedure Call (RPC). XML-RPC and SOAP. This document will explore the
differences between these two methods in order to help you decide which
is best suited to your needs.&lt;/p&gt;
&lt;h2 id=&#34;general-information&#34;&gt;General information&lt;/h2&gt;
&lt;h3 id=&#34;xml-rpc-httpwwwxmlrpccom&#34;&gt;XML-RPC &lt;em&gt;&lt;a href=&#34;http://www.xml-rpc.com&#34;&gt;http://www.xmlrpc.com&lt;/a&gt;&lt;/em&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;XML-RPC is &amp;ldquo;&amp;hellip;a spec
(&lt;em&gt;&lt;a href=&#34;http://www.xmlrpc.com/spec&#34;&gt;http://www.xmlrpc.com/spec&lt;/a&gt;&lt;/em&gt; ) and a
set of implementations that allow software running on disparate
operating systems, running in different environments to make procedure
calls over the Internet. It&amp;rsquo;s remote procedure calling using HTTP as
the transport and XML as the encoding. XML-RPC is designed to be as
simple as possible, while allowing complex data structures to be
transmitted, processed and returned.&amp;rdquo; - xmlrpc.com&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h5 id=&#34;xml-rpcs-goals&#34;&gt;XML-RPC&amp;rsquo;s Goals&lt;/h5&gt;
&lt;p&gt;XML-RPC is very humble in its goals. It doesn&amp;rsquo;t set out to be the
solution to every problem. Instead it seeks to be a simple and effective
means to request and receive information.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;We wanted a clean, extensible format that&amp;rsquo;s very simple. It should be
possible for an HTML coder to be able to look at a file containing an
XML-RPC procedure call, understand what it&amp;rsquo;s doing, and be able to
modify it and have it work on the first or second try&amp;hellip; We also
wanted it to be an easy to implement protocol that could quickly be
adapted to run in other environments or on other operating systems.&amp;rdquo; -
xmlrpc.com&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h5 id=&#34;comments&#34;&gt;Comments&lt;/h5&gt;
&lt;p&gt;The spec itself is roughly seven pages long, including examples and a
FAQ, and is extremely easy to understand. Any competent programmer
should find no difficulty whatsoever in implementing XML-RPC in their
software after reading its spec.&lt;/p&gt;
&lt;h3 id=&#34;soap-11-httpwwww3orgtrsoap&#34;&gt;SOAP 1.1 &lt;em&gt;&lt;a href=&#34;http://www.w3.org/TR/SOAP/&#34;&gt;http://www.w3.org/TR/SOAP/&lt;/a&gt;&lt;/em&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;SOAP is a lightweight protocol for exchange of information in a
decentralized, distributed environment. It is an XML based protocol
that consists of three parts: an envelope that defines a framework for
describing what is in a message and how to process it, a set of
encoding rules for expressing instances of application-defined
datatypes, and a convention for representing remote procedure calls
and responses.&amp;rdquo; - the SOAP spec.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;SOAP makes extensive use of namespacing and attribute specification tags
in almost every element of a message. For example when mixing data types
within an array you have to set the SOAP-ENC:arrayType to indicate mixed
data types within the array in addition to specifying the type of each
element of the array.&lt;/p&gt;
&lt;h5 id=&#34;soaps-goals&#34;&gt;SOAP&amp;rsquo;s Goals&lt;/h5&gt;
&lt;p&gt;SOAP tries to pick up where XML-RPC left off by implementing user
defined data types, the ability to specify the recipient, message
specific processing control, and other features.&lt;/p&gt;
&lt;h5 id=&#34;comments-1&#34;&gt;Comments&lt;/h5&gt;
&lt;p&gt;Weighing in at 40 pages the SOAP spec is complex and filled with little
gems like, &amp;ldquo;Using SOAP for RPC is orthogonal to the SOAP protocol
binding.&amp;rdquo; If you ask me, it isn&amp;rsquo;t even remotely something I would call
&amp;ldquo;lightweight&amp;rdquo; and they threw out the most important feature of XML-RPC,
its ease of use.&lt;/p&gt;
&lt;p&gt;Contrary to popular belief, SOAP has not been ratified by the W3C. As of
this writing it is just a submission, which, essentially, means they
thought it was nifty enough to start a discussion about it.&lt;/p&gt;
&lt;h2 id=&#34;features--benefits&#34;&gt;Features &amp;amp; Benefits&lt;/h2&gt;
&lt;h3 id=&#34;xml-rpc&#34;&gt;XML-RPC&lt;/h3&gt;
&lt;h5 id=&#34;datatypes&#34;&gt;Datatypes&lt;/h5&gt;
&lt;p&gt;Scalars:&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;p class=&#34;CellHeading&#34;&gt;&lt;a name=&#34;pgfId-605187&#34;&gt;&lt;/a&gt;Type&lt;/p&gt;
&lt;/th&gt;
&lt;th&gt;
&lt;p class=&#34;CellHeading&#34;&gt;&lt;a name=&#34;pgfId-605189&#34;&gt;&lt;/a&gt;Example&lt;/p&gt;
&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-605191&#34;&gt;&lt;/a&gt;32-bit signed integer&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-605193&#34;&gt;&lt;/a&gt;-12&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-605195&#34;&gt;&lt;/a&gt;boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-605197&#34;&gt;&lt;/a&gt;0 or 1&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-605199&#34;&gt;&lt;/a&gt;ASCII string&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-605201&#34;&gt;&lt;/a&gt;hello world&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-605203&#34;&gt;&lt;/a&gt;double-precision signed floating point number&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-605205&#34;&gt;&lt;/a&gt;-12.214&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-605207&#34;&gt;&lt;/a&gt;date/time (iso 8601)&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-605209&#34;&gt;&lt;/a&gt;19980717T14:08:55&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-605211&#34;&gt;&lt;/a&gt;base64-encoded binary&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-605213&#34;&gt;&lt;/a&gt;eW91IGNhbid0IHJlYWQgdGhpcyE=&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Structs: In XML-RPC structs define an anonymous set of name value pairs.
&amp;ldquo;A contains s and each contains a and a . &amp;ldquo;The value(s) can be of any
data type&lt;/p&gt;
&lt;p&gt;Arrays:&lt;/p&gt;
&lt;p&gt;XML-RPC arrays define an anonymous grouping of elements with no
limitation mixing data types like integers and strings within the same
array. &amp;ldquo;An contains a single element, which can contain any number of
s.&amp;rdquo;&lt;/p&gt;
&lt;h5 id=&#34;stability&#34;&gt;Stability&lt;/h5&gt;
&lt;p&gt;XML-RPC has been around for a while and, while it isn&amp;rsquo;t maintained by a
standards committee, it is stable and open to community input.&lt;/p&gt;
&lt;h4 id=&#34;simplicity&#34;&gt;Simplicity&lt;/h4&gt;
&lt;p&gt;XML-RPC&amp;rsquo;s simplicity is its greatest feature. It is extremely easy to
understand, implement, and debug. The syntax is so uncomplicated that it
is very easy to find, and avoid, mistakes.&lt;/p&gt;
&lt;h3 id=&#34;soap&#34;&gt;SOAP&lt;/h3&gt;
&lt;h5 id=&#34;datatypes-1&#34;&gt;Datatypes&lt;/h5&gt;
&lt;p&gt;Scalars:&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;p class=&#34;CellHeading&#34;&gt;&lt;a name=&#34;pgfId-606037&#34;&gt;&lt;/a&gt;Type&lt;/p&gt;
&lt;/th&gt;
&lt;th&gt;
&lt;p class=&#34;CellHeading&#34;&gt;&lt;a name=&#34;pgfId-606039&#34;&gt;&lt;/a&gt;Example&lt;/p&gt;
&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-606041&#34;&gt;&lt;/a&gt;32-bit signed integer&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-606043&#34;&gt;&lt;/a&gt;-12&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-606045&#34;&gt;&lt;/a&gt;boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-606047&#34;&gt;&lt;/a&gt;0 or 1&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-606049&#34;&gt;&lt;/a&gt;ASCII string&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-606051&#34;&gt;&lt;/a&gt;hello world&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-606053&#34;&gt;&lt;/a&gt;signed floating point number&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-606055&#34;&gt;&lt;/a&gt;-12.214&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-606057&#34;&gt;&lt;/a&gt;date/time&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-606059&#34;&gt;&lt;/a&gt;2001-03-27T00:00:01-08:00&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-606061&#34;&gt;&lt;/a&gt;base64-encoded binary&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-606063&#34;&gt;&lt;/a&gt;eW91IGNhbid0IHJlYWQgdGhpcyE=&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Structs: SOAP structs define a set of name value pairs. Structs can be
named.&lt;/p&gt;
&lt;p&gt;Arrays: SOAP arrays define a grouping of elements with no limitation
mixing data types like integers and strings within the same array.
Arrays can be named.&lt;/p&gt;
&lt;p&gt;Array of Bytes: An array of bytes MAY be encoded as a single-reference
or a multi-reference value. The rules for an array of bytes are similar
to those for a string.&lt;/p&gt;
&lt;p&gt;In particular, the containing element of the array of bytes value MAY
have an &amp;ldquo;id&amp;rdquo; attribute. Additional accessor elements MAY then have
matching &amp;ldquo;href&amp;rdquo; attributes.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Polymorphic Accessors: An accessor &amp;ldquo;&amp;hellip;that can polymorphically access
values of several types, each type being available at run time. A
polymorphic accessor instance MUST contain an &amp;ldquo;xsi:type&amp;rdquo; attribute that
describes the type of the actual value.&amp;rdquo; Ex. 29.95&lt;/p&gt;
&lt;p&gt;Enumerations: Based on the &amp;ldquo;XML Schema Part 2: Datatypes&amp;rdquo;
(&lt;em&gt;&lt;a href=&#34;http://www.w3.org/TR/xmlschema-2/&#34;&gt;http://www.w3.org/TR/xmlschema-2/&lt;/a&gt;&lt;/em&gt;
), which is still just a recommendation, a SOAP enumeration is &amp;ldquo;&amp;hellip;a
list of distinct values appropriate to the base type.&amp;rdquo; It is supported
for all simple types except boolean.&lt;/p&gt;
&lt;p&gt;User Defined Data-Types: Developers can define their own simple, or
complex, data types.&lt;/p&gt;
&lt;h5 id=&#34;customizing&#34;&gt;Customizing&lt;/h5&gt;
&lt;p&gt;SOAP&amp;rsquo;s greatest feature is its ability to step past XML-RPC&amp;rsquo;s
limitations and customize every portion of the message. This ability to
customize allows developers to describe exactly what they want within
their message. The downside of this is that the more you customize a
message the more work it will take to make a foreign system do anything
beyond simply parsing it.&lt;/p&gt;
&lt;h5 id=&#34;big-co-support&#34;&gt;Big Co. Support&lt;/h5&gt;
&lt;p&gt;SOAPs two biggest developers are Microsoft and IBM. Microsoft has
incorporated SOAP into it&amp;rsquo;s latest OS and Visual Studio. As usual
though, MS has decided that they don&amp;rsquo;t need to adhere to the whole spec.
In their SOAP for Java SDK they modify the namespace (which breaks some
other implementations), use a limited combination of 1.0 and 1.1 fault
codes (and improperly document it), and include many serious bugs. IBM
seems to have gotten almost everything right in their implementation.&lt;/p&gt;
&lt;h2 id=&#34;limitations&#34;&gt;Limitations&lt;/h2&gt;
&lt;h3 id=&#34;xml-rpc-1&#34;&gt;XML-RPC&lt;/h3&gt;
&lt;h5 id=&#34;method-calls&#34;&gt;Method Calls&lt;/h5&gt;
&lt;p&gt;XML-RPC calls methods via its methodName property which &amp;ldquo;may only
contain identifier characters, upper and lower-case A-Z, the numeric
characters, 0-9, underscore, dot, colon and slash.&amp;rdquo; For most purposes
this is just fine, however it makes it particularly difficult when you
need to pass an object as an argument.&lt;/p&gt;
&lt;h5 id=&#34;named-data-structures&#34;&gt;Named Data Structures&lt;/h5&gt;
&lt;p&gt;The structs (hashes) and arrays are always anonymous. When passing
multiple structs or arrays programmers need to rely on the order of the
parameters ( ) they are contained in to differentiate between each
struct or array. This isn&amp;rsquo;t a significant problem but there are cases
when being able to name your structs and arrays would be nice.&lt;/p&gt;
&lt;h5 id=&#34;simplicity-1&#34;&gt;Simplicity&lt;/h5&gt;
&lt;p&gt;As noted above, simplicity is also XML-RPC&amp;rsquo;s greatest limitation.
Although most all of your RPC needs can be accomplished with it, there
are some things that you just can&amp;rsquo;t do without bending over backwards,
like passing an object as an argument to a function, or specifying which
portion of a receiving application the message is intended for.&lt;/p&gt;
&lt;h3 id=&#34;soap-1&#34;&gt;SOAP&lt;/h3&gt;
&lt;h5 id=&#34;stability-1&#34;&gt;Stability&lt;/h5&gt;
&lt;p&gt;Currently SOAP 1.1 is a submission to the W3C
(&lt;em&gt;&lt;a href=&#34;http://www.w3.org&#34;&gt;http://www.w3.org&lt;/a&gt;&lt;/em&gt; ). This means it is not an
official standard and its specifications can, and almost assuredly will,
change at any time. There are a lot of cooks in the kitchen right now.&lt;/p&gt;
&lt;h5 id=&#34;documentation&#34;&gt;Documentation&lt;/h5&gt;
&lt;p&gt;Last updated in May the SOAP spec is filled with mistakes and
contradictions and points to other specs which are themselves moving
targets. According to Dave Winer, one of the spec&amp;rsquo;s authors, Microsoft
and IBM have taken it upon themselves to add in the WSDL
(&lt;em&gt;&lt;a href=&#34;http://www.w3.org/TR/wsdl&#34;&gt;http://www.w3.org/TR/wsdl&lt;/a&gt;&lt;/em&gt; ) layer
without consulting the other authors. This doesn&amp;rsquo;t bode well for
developers who need something they can count on remaining unchanged, or
almost unchanged, for the forseeable future. Any current SOAP
implementation may be incompatible with future revisions of the spec,
although it should be noted that SOAP is far enough along that most of
its spec should remain essentially the same.&lt;/p&gt;
&lt;h2 id=&#34;comparison&#34;&gt;Comparison&lt;/h2&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;p class=&#34;CellHeading&#34;&gt;&lt;a name=&#34;pgfId-605844&#34;&gt;&lt;/a&gt;Feature&lt;/p&gt;
&lt;/th&gt;
&lt;th&gt;
&lt;p class=&#34;CellHeading&#34;&gt;&lt;a name=&#34;pgfId-605846&#34;&gt;&lt;/a&gt;XML-RPC&lt;/p&gt;
&lt;/th&gt;
&lt;th&gt;
&lt;p class=&#34;CellHeading&#34;&gt;&lt;a name=&#34;pgfId-605848&#34;&gt;&lt;/a&gt;SOAP&lt;/p&gt;
&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-605850&#34;&gt;&lt;/a&gt;basic scalars&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-605852&#34;&gt;&lt;/a&gt;yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-605854&#34;&gt;&lt;/a&gt;yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-607061&#34;&gt;&lt;/a&gt;structs&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-607063&#34;&gt;&lt;/a&gt;yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-607065&#34;&gt;&lt;/a&gt;yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-607081&#34;&gt;&lt;/a&gt;arrays&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-607083&#34;&gt;&lt;/a&gt;yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-607085&#34;&gt;&lt;/a&gt;yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-607100&#34;&gt;&lt;/a&gt;named structs and arrays&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-607102&#34;&gt;&lt;/a&gt;no&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-607104&#34;&gt;&lt;/a&gt;yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-607116&#34;&gt;&lt;/a&gt;detailed fault handling&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-607118&#34;&gt;&lt;/a&gt;yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-607120&#34;&gt;&lt;/a&gt;yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-607132&#34;&gt;&lt;/a&gt;short learning curve&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-607134&#34;&gt;&lt;/a&gt;yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-607136&#34;&gt;&lt;/a&gt;no&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-606494&#34;&gt;&lt;/a&gt;Developers specified character set&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-606496&#34;&gt;&lt;/a&gt;no&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-606498&#34;&gt;&lt;/a&gt;yes (US-ASCII, UTF-8, UTF-16)&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-605856&#34;&gt;&lt;/a&gt;Developer defined data types&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-605858&#34;&gt;&lt;/a&gt;no&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-605860&#34;&gt;&lt;/a&gt;yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-605862&#34;&gt;&lt;/a&gt;Can specify recipient&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-605864&#34;&gt;&lt;/a&gt;no&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-605866&#34;&gt;&lt;/a&gt;yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-605868&#34;&gt;&lt;/a&gt;require client understanding&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-605870&#34;&gt;&lt;/a&gt;no&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-605872&#34;&gt;&lt;/a&gt;yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-605874&#34;&gt;&lt;/a&gt;message specific processing instructions&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-605876&#34;&gt;&lt;/a&gt;no&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p class=&#34;CellBody&#34;&gt;&lt;a name=&#34;pgfId-605878&#34;&gt;&lt;/a&gt;yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;When you get right down to it XML-RPC is about simple, easy to
understand, requests and responses. It is a lowest common denominator
form of communication that allows you to get almost any job done with a
minimum amount of complexity. SOAP, on the other hand, is designed for
transferring far more complex sets of information. It requires profuse
attribute specification tags, namespaces, and other complexities, to
describe exactly what is being sent. This has its advantages and
disadvantages. SOAP involves significantly more overhead but adds much
more information about what is being sent. If you require complex user
defined data types and the ability to have each message define how it
should be processed then SOAP is a better solution than XML-RPC (be sure
to check out language specific solutions to this problem like java&amp;rsquo;s RMI
(&lt;em&gt;&lt;a href=&#34;http://java.sun.com/products/jdk/rmi/&#34;&gt;http://java.sun.com/products/jdk/rmi/&lt;/a&gt;&lt;/em&gt;
)). But, if standard data types and simple method calls are all you need
then XML-RPC will give you a faster app with far fewer headaches.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Make sure you don&amp;rsquo;t use and overly complex package to address what
may be your rather simple needs&amp;rdquo; -Brett McLaughlin
(&lt;em&gt;&lt;a href=&#34;mailto:brett@newinstance.com&#34;&gt;brett@newinstance.com&lt;/a&gt;&lt;/em&gt; )&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;sources--other-links&#34;&gt;Sources &amp;amp; Other Links&lt;/h2&gt;
&lt;h3 id=&#34;xml-rpc-2&#34;&gt;XML-RPC&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;XML-RPC Specification
&lt;em&gt;&lt;a href=&#34;http://www.xmlrpc.com/spec&#34;&gt;http://www.xmlrpc.com/spec&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Internet Scripting: Zope and XML-RPC
&lt;em&gt;&lt;a href=&#34;http://www.xml.com/pub/a/2000/01/xmlrpc/&#34;&gt;http://www.xml.com/pub/a/2000/01/xmlrpc/&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;soap-2&#34;&gt;SOAP&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;SOAP specification
&lt;em&gt;&lt;a href=&#34;http://www.w3.org/TR/SOAP/&#34;&gt;http://www.w3.org/TR/SOAP/&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;SoapWare.org A busy developers guide to SOAP 1.1
&lt;em&gt;&lt;a href=&#34;http://www.soapware.org/bdg&#34;&gt;http://www.soapware.org/bdg&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Some considerations on SOAP
&lt;em&gt;&lt;a href=&#34;http://www.xmlrpc.com/discuss/msgReader$1500?mode=day&#34;&gt;http://www.xmlrpc.com/discuss/msgReader$1500?mode=day&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;assorted-other-links&#34;&gt;Assorted other links&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;PI-RPC, the Platform Independent Remote Procedure Call
&lt;em&gt;&lt;a href=&#34;http://www.blackperl.com/xml/PI-RPC.html&#34;&gt;http://www.blackperl.com/xml/PI-RPC.html&lt;/a&gt;&lt;/em&gt;
is a proposed lightweight alternative to SOAP.&lt;/li&gt;
&lt;li&gt;XML-RPC Extensions
&lt;em&gt;&lt;a href=&#34;http://ontosys.com/xml-rpc/extensions.html&#34;&gt;http://ontosys.com/xml-rpc/extensions.html&lt;/a&gt;&lt;/em&gt;
add a value.&lt;/li&gt;
&lt;li&gt;The Evolution of SOAP::Lite
&lt;em&gt;&lt;a href=&#34;http://www.onlamp.com/pub/a/onlamp/2001/06/29/soap_lite.html&#34;&gt;http://www.onlamp.com/pub/a/onlamp/2001/06/29/soap_lite.html&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;WSDL 1.1 &lt;em&gt;&lt;a href=&#34;http://www.w3.org/TR/wsdl&#34;&gt;http://www.w3.org/TR/wsdl&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Financial Entropy of a Webapp Subscriber</title>
      <link>https://weblog.masukomi.org/2006/11/17/financial-entropy-of-a-webapp-subscriber/</link>
      <pubDate>Fri, 17 Nov 2006 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2006/11/17/financial-entropy-of-a-webapp-subscriber/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://weblog.masukomi.org/images/2006/11/17/black_hole_entropy.png&#34; alt=&#34;image&#34;&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I was consumed with dreams about Stephen Hawking&amp;rsquo;s &lt;a href=&#34;http://en.wikipedia.org/wiki/Black_hole_thermodynamics&#34;&gt;black hole
entropy&lt;/a&gt; formula
last night, which is frustrating because the math is, sadly, beyond me.
But, I mention it to you today because, knowing so little about black
holes my mind instead kept trying to change it into an formula to
calculate the Financial Entropy of a webapp subscriber.&lt;/p&gt;
&lt;p&gt;So, I put it to you, dear reader, have you, or any of your math enabled
friends, come up with a formula for calculating the finincial entropy of
a webapp subscriber? If you haven&amp;rsquo;t, but you could, there are many many
entrepreneurs who would sing your praises and happily buy you a drink.&lt;/p&gt;
&lt;p&gt;On a related note: a little Googling brings up &lt;a href=&#34;http://www.amazon.com/gp/product/0471118567/&#34;&gt;this fascinating looking
book&lt;/a&gt; whose price or
$199.95 puts it beyond that of anything I&amp;rsquo;ll buy without having a damn
good idea of what exactly is inside. Also, why is it that I never heard
the phrase &amp;ldquo;Financial Entropy&amp;rdquo; until last night in my dreams?&lt;/p&gt;
&lt;p&gt;[Edit]: 16 years later&amp;hellip; The book is $4.99 on Amazon and I just ordered a copy.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Improved extract_fixtures</title>
      <link>https://weblog.masukomi.org/2006/11/14/improved-extract_fixtures/</link>
      <pubDate>Tue, 14 Nov 2006 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2006/11/14/improved-extract_fixtures/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m not sure where I originally came across the extract_fixtures rake
task (maybe &lt;a href=&#34;http://www.bigbold.com/snippets/posts/show/2525&#34;&gt;here&lt;/a&gt;)but
there&amp;rsquo;s nothing better than using real data to run your Rails unit
tests. Well, real in the sense that it was generated by actually using
your app. But there&amp;rsquo;s a problem with extract_fixtures. Once you get
some real data to base your tests on you don&amp;rsquo;t want it to change because
it would break your tests. So, after the first run extract_fixtures
becomes almost useless because it&amp;rsquo;ll wipe out the fixtures you&amp;rsquo;ve been
working with.&lt;/p&gt;
&lt;p&gt;So what&amp;rsquo;s a person to do? Well, in my case the answer is to beef it up a
bit. The following version of extract_fixtures takes two optional
parameters:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TABLES=foos,bars,other_foos &lt;br&gt;
Tables takes a comma delimited (no spaces) list of table names that
you want to extract. If you pass this in it will &lt;em&gt;only&lt;/em&gt; extract
those tables.&lt;/li&gt;
&lt;li&gt;OUTPUT_DIR=/some/fully/qualified/non-relative/path &lt;br&gt;
Tell it what directory to output to.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you improve it further please drop me a line and I&amp;rsquo;ll add or link to
your enhancements here.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;desc &amp;quot;Create YAML test fixtures from data in an existing database.  &amp;quot; +
&amp;quot; Defaults to development database.  Set RAILS_ENV to override. &amp;quot; +
&amp;quot;\nSet OUTPUT_DIR to specify an output directory. Defaults to test/fixtures. &amp;quot; +
&amp;quot;\nSet TABLES (a coma separated list of table names) to specify which tables to extract. &amp;quot; +
&amp;quot;Leaving it blank will extract all tables.&amp;quot;

task :extract_fixtures =&amp;gt; :environment do
  sql  = &amp;quot;SELECT * FROM %s&amp;quot;
  skip_tables = [&amp;quot;schema_info&amp;quot;]
  ActiveRecord::Base.establish_connection
  if (not ENV[&#39;TABLES&#39;])
    tables = ActiveRecord::Base.connection.tables - skip_tables
  else
    tables = ENV[&#39;TABLES&#39;].split(/, */)
  end
  if (not ENV[&#39;OUTPUT_DIR&#39;])
    output_dir=&amp;quot;#{RAILS_ROOT}/test/fixtures&amp;quot;
  else
    output_dir = ENV[&#39;OUTPUT_DIR&#39;].sub(/\/$/, &#39;&#39;)
  end
  (tables).each do |table_name|
    i = &amp;quot;000&amp;quot;
    File.open(&amp;quot;#{output_dir}/#{table_name}.yml&amp;quot;, &#39;w&#39;) do |file|
      data = ActiveRecord::Base.connection.select_all(sql % table_name)
      file.write data.inject({}) { |hash, record|
        hash[&amp;quot;#{table_name}_#{i.succ!}&amp;quot;] = record
        hash
      }.to_yaml
    puts &amp;quot;wrote #{table_name} to #{output_dir}/&amp;quot;
    end
  end
end
&lt;/code&gt;&lt;/pre&gt;
</description>
    </item>
    
    <item>
      <title>It reminds me of home...</title>
      <link>https://weblog.masukomi.org/2006/11/14/it-reminds-me-of-home/</link>
      <pubDate>Tue, 14 Nov 2006 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2006/11/14/it-reminds-me-of-home/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/masukomi/297838315/&#34;&gt;&lt;img src=&#34;http://s3.amazonaws.com/mobtvse_masukomi/assets/2006/11/14/two_buildings_in_the_fog.jpg&#34; alt=&#34;image&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It was foggy the other day in Boston and I couldn&amp;rsquo;t help but take some
pictures. Something about this picture just makes me feel like I&amp;rsquo;m home.
I don&amp;rsquo;t really understand it though, because it&amp;rsquo;s the old parts of
Boston that I truly love.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Why Rails Migrations are wrong headed</title>
      <link>https://weblog.masukomi.org/2006/11/05/why-rails-migrations-are-wrong-headed/</link>
      <pubDate>Sun, 05 Nov 2006 00:00:00 +0000</pubDate>
      
      <guid>https://weblog.masukomi.org/2006/11/05/why-rails-migrations-are-wrong-headed/</guid>
      <description>&lt;p&gt;Ever since migrations were introduced to Rails I&amp;rsquo;ve heard nothing but praise for them, and truth be told, they are a far better way of setting up your database than the standard raw sql import. But, that&amp;rsquo;s where the goodness ends.&lt;/p&gt;
&lt;p&gt;The problem is in the concept of going up or down in database versions. The core concept is great, to be able to roll back to a previous version of the database, but the implementation is completely out of sync with the version control systems we use to manage the codebase that depends on that database. I&amp;rsquo;ll use subversion as an example because (for those of you still stuck in CVS land) every time you do a check in the system gets tagged with a new revision number.&lt;/p&gt;
&lt;p&gt;Everything starts out fine. The initial migration reflects the needs of the initial codebase. But after that they&amp;rsquo;re never the same. There&amp;rsquo;s no way to now what migration corresponds to what version of the codebase. What if in checkin 400 I add a new migration that changes the schema. A few weeks later I need to roll back the codebase to version 380. What migration number should i roll the database back to if any? Unless you happen to remember what migration number you were on when the codebase was at 380 you&amp;rsquo;re screwed.&lt;/p&gt;
&lt;p&gt;So what&amp;rsquo;s the solution?&lt;/p&gt;
&lt;p&gt;Well, the solution starts with the schema.rb file that&amp;rsquo;s created every time you run a migration. If you&amp;rsquo;re like me, that gets checked in whenever it changes and the schema.rb file is always in sync with your codebase. So you&amp;rsquo;ve always got a representation of the appropriate database configuration for any revision of your codebase. That&amp;rsquo;s good. In fact that&amp;rsquo;s better than the actual migration scripts because it&amp;rsquo;s always in sync. But there&amp;rsquo;s one more problem&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Priming the database&lt;/strong&gt;&lt;br&gt;
Most webapps don&amp;rsquo;t function well with a completely empty database. There are usually some default settings, maybe an admin account to log in with the first time, things like that. And there are a few rake tasks out there to &lt;a href=&#34;http://rails.techno-weenie.net/forums/2/topics/778?page=1&#34;&gt;bootstrap your database&lt;/a&gt; with the contents of some .yaml files. There are others to &lt;a href=&#34;http://media.pragprog.com/titles/fr_rr/code/CreateFixturesFromLiveData/lib/tasks/extract_fixtures.rake&#34; title=&#34;warning, that&#39;s a raw rake file&#34;&gt;dump your database&lt;/a&gt; into the same files for later import, or generating real data to run your tests against.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Putting it all together&lt;/strong&gt;&lt;br&gt;
If you make sure that your your .yaml files for bootstrapping are always in sync (you should be keeping them in sync anyway) then you can avoid the problem entirely by just making your own schema.rb file (it&amp;rsquo;s just a migration file for all the tables at once) and never running &lt;code&gt;rake db:migrate&lt;/code&gt; again. Instead run your schema.rb (make sure it forces table creation) and then &lt;code&gt;rake db:bootstrap&lt;/code&gt;. When you need to modify your database schema don&amp;rsquo;t make a new migration script. It&amp;rsquo;ll only confuse matters down the road. Instead, modify your schema.rb and make sure your .yaml files are in sync (you&amp;rsquo;d have to do that even if you were using migrations).&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://iamrice.org/&#34;&gt;Damien Tanner&lt;/a&gt; points out that migrations are &lt;em&gt;very useful&lt;/em&gt; when migrating a live site. And I have to agree. My proposed solution is seriously lacking in that department. What would most likely be best is a blending of both concepts. Don&amp;rsquo;t use migrations to muck about with your database during development. Instead, create migration scripts &lt;em&gt;only&lt;/em&gt; for migrating data on live sites. Don&amp;rsquo;t title them &amp;ldquo;&lt;code&gt;create_foo_table&lt;/code&gt;&amp;rdquo; or &amp;ldquo;&lt;code&gt;add_foo_column&lt;/code&gt;&amp;rdquo; but instead name them something like &amp;ldquo;&lt;code&gt;live_site_version_4&lt;/code&gt;&amp;rdquo; or something like that that makes it clear exactly what it&amp;rsquo;s for and how it pertains to your site.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
