<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Ryan Scott Brown</title>
    <link>https://rsb.io/</link>
    <description>Recent posts from on Ryan Scott Brown's blog</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Wed, 10 Jun 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://rsb.io/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>LLM Etiquette at Work</title>
      <link>https://rsb.io/posts/llm-etiquette-at-work/</link>
      <pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/llm-etiquette-at-work/</guid>
      <description>&lt;p&gt;This post about the &amp;ldquo;slop grenade&amp;rdquo; got me thinking. New technology requires new social norms to go along with it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img class=&#34;pure-img&#34; src=&#34;https://rsb.io/img/slop-grenade-post.png&#34;&#xA;alt=&#34;Screenshot of a LinkedIn post by Carlos Arguelles, Senior Principal Engineer at Amazon. The post reads: I just learned a new term: slop grenade. How many times have you asked a peer a simple question and you got a wall back of AI slop? (at least remove the emdashes LOL). It is one of my pet peeves. I use AI constantly to be a more efficient reader, writer and software engineer, but every single response from me is 100% human-made.&#34;&#xA;/&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>TIL: Using Only One-Shot Agents</title>
      <link>https://rsb.io/posts/til-you-only-got-one-shot-do-not-miss-your-chance-to-yolo/</link>
      <pubDate>Tue, 02 Jun 2026 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/til-you-only-got-one-shot-do-not-miss-your-chance-to-yolo/</guid>
      <description>&lt;p&gt;Models have gotten considerably better in the past year and my intuition for&#xA;comfortably agent-sized tasks went stale. I now try to one-shot as much as&#xA;possible by writing better prompts.&lt;/p&gt;&#xA;&lt;p&gt;I have taken back my editor (it&amp;rsquo;s human-only now) and I don&amp;rsquo;t watch inference&#xA;happen anymore. Agents go out into independent sandboxes (with &lt;code&gt;--yolo&lt;/code&gt;) and&#xA;work without input until it&amp;rsquo;s time to review and merge.&lt;/p&gt;&#xA;&lt;p&gt;My new setup is:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Shuffle-Sharding&#39;s Evil Twin: Chokepoint Capital</title>
      <link>https://rsb.io/posts/shuffle-sharding-evil-twin-the-capital-chokepoints/</link>
      <pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/shuffle-sharding-evil-twin-the-capital-chokepoints/</guid>
      <description>&lt;p&gt;Concentration risk is shuffle-sharding&amp;rsquo;s evil twin: an oligopoly of SaaS companies creating invisible choke points.&lt;/p&gt;&#xA;&lt;p&gt;The Crowdstrike outage (nobody expects a blank file!) revealed a deep concentration risk among industries that follow similar compliance regimes: they want to be legible to auditors as being secure. How does one do that? Crowdstrike became a de facto monopoly not because it&amp;rsquo;s good, but because of a combination of enterprise sales, cargo culting, and similar CISOs swapping between similar companies.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Restarting Python Automation in 2026</title>
      <link>https://rsb.io/posts/python-automation-starter-guide/</link>
      <pubDate>Sun, 08 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/python-automation-starter-guide/</guid>
      <description>&lt;p&gt;A friend recently asked me to help them get started writing their own&#xA;automations. I pointed them at &lt;a href=&#34;https://automatetheboringstuff.com/&#34;&gt;Automate the Boring Stuff with Python&lt;/a&gt;,&#xA;updated in late 2025 to cover Python 3.12+. This post covers a grab bag of&#xA;techniques I&amp;rsquo;ve learned over the years.&lt;/p&gt;&#xA;&lt;p&gt;The quickest start is my short post on &lt;a href=&#34;https://rsb.io/posts/til-uv-script-notation/&#34;&gt;using uv to manage single-file&#xA;scripts&lt;/a&gt; to make standalone, machine-independent Python scripts.&lt;/p&gt;&#xA;&lt;h2 id=&#34;techniques&#34;&gt;Techniques&lt;/h2&gt;&#xA;&lt;h3 id=&#34;think-like-a-spreadsheet&#34;&gt;Think Like a Spreadsheet&lt;/h3&gt;&#xA;&lt;p&gt;The most useful mental model for data-driven automation is the spreadsheet. You&#xA;have input cells (files, API responses, environment variables), intermediate&#xA;cells (transformations, filters, lookups), and output cells (reports, deployed&#xA;artifacts, notifications). When an input changes, only the cells that depend on&#xA;it should update.&lt;/p&gt;</description>
    </item>
    <item>
      <title>My Favorites from Re:Invent 2025</title>
      <link>https://rsb.io/posts/re-invent-re-cap-2026/</link>
      <pubDate>Fri, 02 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/re-invent-re-cap-2026/</guid>
      <description>&lt;p&gt;In the month since Re:Invent, I&amp;rsquo;ve put together my own greatest hits list of all the Pre:Invent and Re:Invent announcements. I missed Re:Invent in person, but sessions and announcements were put online almost-live. Sincerely, thank you AWS online events team that put together the live streams. Chalk Talks aren&amp;rsquo;t streamed, and were what I missed most.&lt;/p&gt;&#xA;&lt;h2 id=&#34;my-top-5&#34;&gt;My Top 5&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; The AWS CLI gets a revamp of &lt;a href=&#34;https://aws.amazon.com/blogs/security/simplified-developer-access-to-aws-with-aws-login/&#34;&gt;SSO integration&lt;/a&gt; with the &lt;code&gt;aws login&lt;/code&gt; command. It obsoletes most of &lt;code&gt;aws-sso-util&lt;/code&gt; and &lt;code&gt;awsume&lt;/code&gt; by bringing session-aware keys into the main CLI.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Revisited: Delegating Authority to Capricious Agents</title>
      <link>https://rsb.io/posts/revisited-delegating-to-capricious-agents/</link>
      <pubDate>Sat, 27 Dec 2025 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/revisited-delegating-to-capricious-agents/</guid>
      <description>&lt;p&gt;Earlier this year I wrote a post about &lt;a href=&#34;https://rsb.io/posts/delegating-to-capricious-agents/&#34;&gt;semi-trusting &amp;ldquo;agentic&amp;rdquo; development tools&lt;/a&gt;. My own workflow has evolved since, but &lt;code&gt;container-use&lt;/code&gt; is still my favorite way to let agents work with minimal supervision and &lt;code&gt;--dangerously-allow-all&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Since August, Opus 4.5 was released and included in Claude Code. This felt like a bigger leap than 3 to 4, or Sonnet 4 to Opus 4 for software development. The main change I noticed in my own usage was in how much more closely 4.5 adhered to specs like &lt;a href=&#34;https://www.openapis.org/&#34;&gt;OpenAPI&lt;/a&gt; and &lt;a href=&#34;https://json-schema.org/&#34;&gt;JSON Schema&lt;/a&gt;. Tool usage also improved, instruction adherence seems better, and I have switched to using &lt;code&gt;skills/&lt;/code&gt; for everything except &lt;code&gt;container-use&lt;/code&gt; and Playwright.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ID Structures: What&#39;s in a Name?</title>
      <link>https://rsb.io/posts/id-structure-whats-in-a-name/</link>
      <pubDate>Thu, 11 Dec 2025 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/id-structure-whats-in-a-name/</guid>
      <description>&lt;p&gt;When building applications, mostly people think about entity IDs. Usually they are intentionally opaque: nobody wants users seeing auto-incrementing integers that reveal how many customers you have. Others, like &lt;a href=&#34;https://www.trek10.com/blog/leveraging-ulids-to-create-order-in-unordered-datastores&#34;&gt;ULIDs&lt;/a&gt;, trade away some opacity for sortability.&lt;/p&gt;&#xA;&lt;p&gt;What about human-facing codes, ones users actually see and may need to share? Nobody thinks ahead about those.&lt;/p&gt;&#xA;&lt;h2 id=&#34;codes-are-everywhere&#34;&gt;Codes Are Everywhere&lt;/h2&gt;&#xA;&lt;p&gt;Think about all the places you need stable, human-friendly identifiers:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Error codes&lt;/strong&gt;: &lt;code&gt;RB2042: Invalid configuration&lt;/code&gt; gives your support team something to grep for and your users something to Google.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Discount codes&lt;/strong&gt;: Marketing promo codes like &lt;code&gt;SUMMER25&lt;/code&gt; need to be flexible, but internally you want something that&amp;rsquo;s stable and could have many codes linked to it.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Product SKUs&lt;/strong&gt;: Warehouse staff, customer service reps, and sales teams all need something they can read over the phone without wanting to die.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Feature flags&lt;/strong&gt;: &lt;code&gt;FF0042&lt;/code&gt; beats &lt;code&gt;enable_new_checkout_flow_v2_final_REAL&lt;/code&gt; when you&amp;rsquo;re debugging.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Ticket IDs&lt;/strong&gt;: Jira and other task trackers use &lt;code&gt;CT-0042&lt;/code&gt; for tickets. The title can change as things become more clear, but commits, branches, and pull requests can be linked by the stable ID.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The pattern is the same: you need an identifier that&amp;rsquo;s stable, greppable, and doesn&amp;rsquo;t make humans sad.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Delegating Authority to Capricious Agents</title>
      <link>https://rsb.io/posts/delegating-to-capricious-agents/</link>
      <pubDate>Mon, 25 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/delegating-to-capricious-agents/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been looking for a good way to be able to context switch less frequently&#xA;when using tools like Claude Code and Github Copilot. So far one of my biggest&#xA;obstacles has been the approval process. I want to come back to &amp;ldquo;complete&amp;rdquo;&#xA;changesets to review and apply at my leisure, not stare at the model talking&#xA;nonsense to itself.&lt;/p&gt;&#xA;&lt;img src=&#34;https://rsb.io/img/claude-being-very-silly.png&#34; alt=&#34;Claude Code repeatedly attempting to replace the string z.string().datetime() with z.iso.datetime() and failing, resorting to calling itself silly and continuing to mix up the two strings.&#34; /&gt;&#xA;&lt;aside&gt;&#xA;    Claude Code repeatedly attempting to replace the string &lt;code&gt;z.string().datetime()&lt;/code&gt; with &lt;code&gt;z.iso.datetime()&lt;/code&gt; and failing, resorting to calling itself silly and continuing to mix up the two strings.&#xA;&lt;/aside&gt;&#xA;&lt;p&gt;In addition to not wanting to sit there and read the &amp;ldquo;reasoning&amp;rdquo; (read: LLM&#xA;talking to itself), there&amp;rsquo;s a trust problem.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Carpe Access: AWS IAM for People &amp; Systems</title>
      <link>https://rsb.io/posts/carpe-access-writing-aws-iam/</link>
      <pubDate>Wed, 20 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/carpe-access-writing-aws-iam/</guid>
      <description>&lt;p&gt;One rogue &lt;code&gt;*&lt;/code&gt; can bypass security controls for an S3 bucket with petabytes of&#xA;data if you aren&amp;rsquo;t paying close attention. AWS has 150 services and counting,&#xA;apps need more external services and therefore granular RBAC. As engineers, we&#xA;now have to worry about access for team members, LLM agents, and services we&#xA;run. Managing the right levels of access is great for limiting the blast radius&#xA;of a bug. Developers (and their agents) can&amp;rsquo;t ruin what they can&amp;rsquo;t change.&lt;/p&gt;</description>
    </item>
    <item>
      <title>TIL: uv scripting and uvx</title>
      <link>https://rsb.io/posts/til-uv-script-notation/</link>
      <pubDate>Sun, 29 Dec 2024 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/til-uv-script-notation/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve known about &lt;a href=&#34;https://docs.astral.sh/uv/&#34;&gt;Astral&amp;rsquo;s&lt;/a&gt; &lt;code&gt;uv&lt;/code&gt; and &lt;code&gt;uvx&lt;/code&gt; tools for&#xA;a while, but over the holidays break I&amp;rsquo;ve been working to streamline my setup&#xA;and (if possible) simplify the tools I use.&lt;/p&gt;&#xA;&lt;p&gt;Changing over to &lt;code&gt;uv&lt;/code&gt; from &lt;code&gt;pipx&lt;/code&gt;/&lt;code&gt;pyenv&lt;/code&gt;/&lt;code&gt;pipenv&lt;/code&gt; helps solve my accumulation&#xA;of one-off scripts. Normally, when I write a script I make a new directory with&#xA;a &lt;code&gt;__main__.py&lt;/code&gt;, &lt;code&gt;requirements.txt&lt;/code&gt;, the works. Now with &lt;code&gt;uv&lt;/code&gt; I can keep all my&#xA;one-offs in a single directory for reuse or reference while keeping dependencies&#xA;reasonable.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Re:Explaining DSQL</title>
      <link>https://rsb.io/posts/re-explaining-dsql/</link>
      <pubDate>Thu, 19 Dec 2024 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/re-explaining-dsql/</guid>
      <description>&lt;p&gt;DSQL is my favorite Re:Invent announcement in a while, and it feels like AWS returning to what it does best: foundational services that change the categories they exist in.&#xA;Still, I don&amp;rsquo;t think AWS is selling it to developers in the right way.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;m old enough (ow, my back!) to remember deploying before S3&amp;rsquo;s ubiquitous HTTP-connected object storage or dynamically provisioned EC2 instances.&#xA;I was deeply excited (on &lt;a href=&#34;https://rsb.io/posts/overview-of-hugo-lambda/&#34;&gt;this very blog&lt;/a&gt;) a decade ago for Lambda as a replacement for cron on a server.&lt;/p&gt;</description>
    </item>
    <item>
      <title>TIL: Bot Detection &amp; AWS WAFs</title>
      <link>https://rsb.io/posts/til-bot-detection-and-wafs-on-aws/</link>
      <pubDate>Sun, 10 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/til-bot-detection-and-wafs-on-aws/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s been a while since I&amp;rsquo;ve had to pay close attention to WAF&amp;rsquo;s, and I still&#xA;don&amp;rsquo;t love the &lt;a href=&#34;https://docs.aws.amazon.com/waf/latest/developerguide/web-acl-setting-body-inspection-limit.html&#34;&gt;maximum inspected body size&lt;/a&gt; of 8KB or Application&#xA;Load Balancers and 64KB for API Gateway, CloudFront, etc. But there were a&#xA;couple announcements this week that caught my eye.&lt;/p&gt;&#xA;&lt;p&gt;First, &lt;a href=&#34;https://aws.amazon.com/about-aws/whats-new/2024/10/amazon-cloudfront-ja4-fingerprinting/&#34;&gt;CloudFront added JA4 Fingerprinting&lt;/a&gt; which I&amp;rsquo;d never heard&#xA;of. It uses differences in each implementation of TLS libraries, you can take a&#xA;fingerprint of the &amp;ldquo;HELLO&amp;rdquo; sent to start any HTTPS request and over time build&#xA;lists of known-bad or known-good actors. Why use this? The hurdle for changing&#xA;your fingerprint is at least somewhat harder than stripping session-id cookies,&#xA;changing the user agent, and other browser-based fingerprints. For full details&#xA;check out &lt;a href=&#34;https://blog.cloudflare.com/ja4-signals/&#34;&gt;this article from Cloudflare&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Trying Out Typespec</title>
      <link>https://rsb.io/posts/trying-typespec-schema-definition-language/</link>
      <pubDate>Sat, 20 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/trying-typespec-schema-definition-language/</guid>
      <description>&lt;p&gt;My favorite part of working in GraphQL isn&amp;rsquo;t any of the runtime stuff. Applications I&amp;rsquo;ve worked on haven&amp;rsquo;t suffered from the over-fetching so commonly pointed to by GraphQL advocates as an inefficiency. Having a schema definition that is easily maintained and written without much of a learning curve is what makes GraphQL great. Recently I discovered &lt;a href=&#34;https://typespec.io/docs/&#34;&gt;Typespec&lt;/a&gt;, which has a familiar struct-like Schema Definition Language (SDL), decorators, and custom transformers. It also doesn&amp;rsquo;t require runtime application changes &amp;ndash; you can use it for defining schemas without making any application changes.&lt;/p&gt;</description>
    </item>
    <item>
      <title>TIL: Tauri Debugging Tools</title>
      <link>https://rsb.io/posts/til-tauri-debugging-tools/</link>
      <pubDate>Wed, 06 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/til-tauri-debugging-tools/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been working on &lt;a href=&#34;https://github.com/ryansb/arsd&#34;&gt;arsd&lt;/a&gt; support for multiple simultaneous AWS IAM&#xA;Identity Center sessions, and found &lt;a href=&#34;https://docs.crabnebula.dev/devtools/get-started/&#34;&gt;devtools&lt;/a&gt; by one of the Tauri&#xA;project&amp;rsquo;s sponsors &lt;a href=&#34;https://crabnebula.dev&#34;&gt;CrabNebula&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Devtools gives you a log viewer and waterfall graph interface for calls between&#xA;the JS and Rust processes. I&amp;rsquo;ve found it helpful for tracking down UI hangs&#xA;where the frontend is waiting on a worker.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to run CDK CloudASM from a ZIP</title>
      <link>https://rsb.io/posts/running-cdk-cloudasm-from-zip/</link>
      <pubDate>Sun, 03 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/running-cdk-cloudasm-from-zip/</guid>
      <description>&lt;p&gt;For all my funsies projects (except the &lt;a href=&#34;https://github.com/ryansb/arsd&#34;&gt;Rust ones&lt;/a&gt;), I use&#xA;&lt;a href=&#34;https://pantsbuild.org&#34;&gt;pantsbuild&lt;/a&gt; to build and deploy my code. It&amp;rsquo;s a great tool, and but its&#xA;separation between artifacts requires that CDK code be run during the build&#xA;step.&lt;/p&gt;&#xA;&lt;p&gt;Artifacts that contain multiple files to be output in the &lt;code&gt;pants package&lt;/code&gt; need&#xA;to be archives. For my use case, I have a single Python file that builds every&#xA;CDK stack and merges them into a single &lt;a href=&#34;https://docs.aws.amazon.com/cdk/api/v2/docs/cloud-assembly-schema-readme.html&#34;&gt;Cloud Assembly&lt;/a&gt;. For example, here&#xA;is a simplified build file:&lt;/p&gt;</description>
    </item>
    <item>
      <title>TIL: FoundationDB&#39;s Excessive Testing</title>
      <link>https://rsb.io/posts/til-foundationdb-testing-framework/</link>
      <pubDate>Thu, 29 Feb 2024 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/til-foundationdb-testing-framework/</guid>
      <description>&lt;p&gt;An aphorism I&amp;rsquo;ve been feeling more every day is &amp;ldquo;slow is smooth, and smooth is&#xA;fast,&amp;rdquo; and I found this post about the beginning of FoundationDB&amp;rsquo;s engineering&#xA;journey.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Before we even started writing the database, we first wrote a fully-deterministic event-based network simulation that our database could plug into. This system let us simulate an entire cluster of interacting database processes [&amp;hellip;] driven by the same random number generator. We could run this virtual cluster, inject network faults, kill machines, simulate whatever crazy behavior we wanted, and see how it reacted.&lt;/p&gt;</description>
    </item>
    <item>
      <title>TIL: ONNX Shortcut Models</title>
      <link>https://rsb.io/posts/til-onnx-shortcut-models/</link>
      <pubDate>Tue, 09 Jan 2024 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/til-onnx-shortcut-models/</guid>
      <description>&lt;p&gt;Getting &lt;code&gt;sentence-transformers&lt;/code&gt; to work in my &lt;a href=&#34;https://llm.datasette.io/en/stable/embeddings/cli.html#llm-embed-models&#34;&gt;llm&lt;/a&gt; environment has been a real pain, and I&amp;rsquo;ve been looking for a way to avoid the hassle.&#xA;So I did a code walk of other projects that offer embeddings, and found that &lt;a href=&#34;https://github.com/chroma-core/chroma/blob/28aa64c55872b4e8ce3937a9aa059bf7623cafc3/chromadb/utils/embedding_functions.py#L361-L373&#34;&gt;ChromaDB encountered the same problem&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;They solved it by using an &lt;a href=&#34;https://github.com/chroma-core/onnx-embedding&#34;&gt;onnx&lt;/a&gt; format model automatically downloaded on the first use.&#xA;See the code for yourself &lt;a href=&#34;https://github.com/chroma-core/chroma/blob/28aa64c55872b4e8ce3937a9aa059bf7623cafc3/chromadb/utils/embedding_functions.py#L361-L373&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>TIL: Prompts Generating Prompts</title>
      <link>https://rsb.io/posts/til-prompts-generating-prompts/</link>
      <pubDate>Wed, 12 Apr 2023 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/til-prompts-generating-prompts/</guid>
      <description>&lt;p&gt;Using ChatGPT I&amp;rsquo;ve started adding a tail onto prompts to generate better&#xA;prompts. For example:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;How might I set use custom metrics for my applications in AWS? Compare&#xA;planning to use CloudWatch Embedded Metric Format (EMF), calling the&#xA;CloudWatch API from my app, and using the CloudWatch agent.&lt;/p&gt;&#xA;&lt;p&gt;Also, how could I have asked this better to get a clearer answer?&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;This gets a bit more out of the model, and I&amp;rsquo;ve found feeding the response back&#xA;as a prompt has good results. Sometimes it misses the instruction for the&#xA;suffix, and I haven&amp;rsquo;t found a pattern for that.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Book: Order Without Design</title>
      <link>https://rsb.io/posts/book-review-order-without-design/</link>
      <pubDate>Sat, 13 Aug 2022 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/book-review-order-without-design/</guid>
      <description>&lt;p&gt;&lt;em&gt;Alain Bertaud 2018, MIT Press&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;A city is the height of human acheivement, a way for humanity&amp;rsquo;s social nature to be concentrated into an efficient space while enjoying a good standard of living.&#xA;The author of &lt;a href=&#34;https://www.amazon.com/Order-without-Design-Markets-Cities-ebook/dp/B08BSYX83S/&#34;&gt;Order Without Design&lt;/a&gt; argues that urban planning can be improved by crossing disciplines between urban planners and economists.&#xA;Cross-discipline collaboration is valuable because individual specialties can be blind to effects outside their legibility.&lt;/p&gt;&#xA;&lt;p&gt;This book is packed with stats, especially about New York City and the ins and outs of zoning regulations there.&#xA;The author starts from the assumption that cities exist for economic purposes: people live in cities for job prospects.&#xA;Therefore, the city government should focus on facilitating economic activity in cities by maximizing the number of people who can afford to live within commuting distance of those jobs.&#xA;From these initial assumptions, Bertaud focuses on maximizing density within the city (high FARs) and on ensuring commuters can reach the city from the suburbs quickly.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Book: There is no Antimemetics Division</title>
      <link>https://rsb.io/posts/book-review-there-is-no-antimemetics-division/</link>
      <pubDate>Sat, 04 Dec 2021 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/book-review-there-is-no-antimemetics-division/</guid>
      <description>&lt;p&gt;&lt;em&gt;qntm 2020&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;This book is extremely fun to read. You can get a free sample by reading the &lt;a href=&#34;https://scp-wiki.wikidot.com/scp-055&#34;&gt;SCP-055&lt;/a&gt; listing written by the same author.&#xA;The core concept of the book is that there exist information with self-destructive properties. Information that, when learned, just slips out of your head.&lt;/p&gt;&#xA;&lt;p&gt;The SCP Foundation exists to counter all sorts of world-threatening anomalies, including &lt;a href=&#34;https://www.amazon.com/gp/product/B08FHHQRM2/&#34;&gt;Antimemetic ones&lt;/a&gt;.&#xA;The book is told as a series of vignettes, with characters recurring between them as we learn and unlearn things about antimemetic threats.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Git and Github Class Resources</title>
      <link>https://rsb.io/posts/git-and-github-class-resources/</link>
      <pubDate>Mon, 07 Mar 2016 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/git-and-github-class-resources/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://rawgit.com/ryansb/gdi-core-git-github/master/index.html#/&#34;&gt;Slides&lt;/a&gt; for&#xA;this talk are adapted from the GDI official git curriculum. Upstream repo is&#xA;&lt;a href=&#34;https://github.com/girldevelopit/gdi-core-git-github&#34;&gt;here&lt;/a&gt; and my repo is&#xA;&lt;a href=&#34;https://github.com/ryansb/gdi-core-git-github&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;additional-resources&#34;&gt;Additional Resources&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://ndpsoftware.com/git-cheatsheet.html&#34;&gt;Visual git cheatsheet&lt;/a&gt; (animated!)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://git-scm.com/docs&#34;&gt;Full reference manual&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://training.github.com/kit/downloads/github-git-cheat-sheet.pdf&#34;&gt;GitHub quick reference&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://git-scm.com/book/en/v2&#34;&gt;Pro Git&lt;/a&gt; (published by Apress, available free online)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://justinhileman.info/article/git-pretty/git-pretty.png&#34;&gt;How to get out of a git mess&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://help.github.com/&#34;&gt;GitHub guides&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://cheat.errtheblog.com/s/git&#34;&gt;Git command-line cheat sheet&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://gitready.com&#34;&gt;Git-ready blog of tips &amp;amp; tutorials&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Atreus: Sunrise Edition</title>
      <link>https://rsb.io/posts/atreus-sunrise-keyboard/</link>
      <pubDate>Sun, 21 Feb 2016 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/atreus-sunrise-keyboard/</guid>
      <description>&lt;p&gt;Since college I&amp;rsquo;ve been interested in building &lt;a href=&#34;https://rsb.io/posts/keyboards-and-the-state-of-input/&#34;&gt;better ways to type&lt;/a&gt;,&#xA;and this weekend I took some time to build (yet another) keyboard. This one is&#xA;the &lt;a href=&#34;http://atreus.technomancy.us/&#34;&gt;Atreus&lt;/a&gt;, a small ortholinear keyboard kit.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;m not a big fan of the default Matias switches. I got an Infinity Keyboard&#xA;from &lt;a href=&#34;https://massdrop.com/&#34;&gt;Massdrop&lt;/a&gt; and the attachment for the keycaps made it feel like&#xA;I was at risk of snapping the PCB while putting them on, and I actually &lt;em&gt;did&lt;/em&gt;&#xA;break one switch while removing a keycap. The stem of the switches also have a lot of&#xA;wobble when typing, so the board doesn&amp;rsquo;t feel as solid as my Ergodox, which&#xA;uses Cherry switches. It&amp;rsquo;s also much harder to find keycaps with fun colors for&#xA;Matias switches since they&amp;rsquo;re so much less common.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Keyboards and the State of Typing</title>
      <link>https://rsb.io/posts/keyboards-and-the-state-of-input/</link>
      <pubDate>Sat, 20 Feb 2016 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/keyboards-and-the-state-of-input/</guid>
      <description>&lt;p&gt;Back in college, I read a great post on loper-os, &lt;a href=&#34;http://www.loper-os.org/?p=861&#34;&gt;Englebart&amp;rsquo;s Violin&lt;/a&gt;&#xA;which I&amp;rsquo;m unlikely to do justice to here, but is definitely recommended&#xA;reading. It focuses on the tools that humans use for potentially billions of&#xA;hours each day: the keyboard and the mouse.&lt;/p&gt;&#xA;&lt;p&gt;If you were to show the keyboard attached to your computer to a typist in the&#xA;1950&amp;rsquo;s, the most innovative piece according to them would be the&#xA;apparently-magical &lt;a href=&#34;https://en.wikipedia.org/wiki/Light-emitting_diode#Discoveries_and_early_devices&#34;&gt;light-emitting diode&lt;/a&gt; on the caps lock key (invented 1962).&#xA;Everything else is the same: the key-per-character usage, the labels, the&#xA;layout, even the plastics haven&amp;rsquo;t moved ahead all that much.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using namedtuple with SQLAlchemy Core</title>
      <link>https://rsb.io/posts/namedtuple-and-sqlalchemy/</link>
      <pubDate>Mon, 05 Oct 2015 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/namedtuple-and-sqlalchemy/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.sqlalchemy.org/&#34;&gt;SQLAlchemy&lt;/a&gt; is solidly in my top 5 favorite Python libraries, and has a&#xA;starring role in many of my work and personal projects. OpenStack runs on&#xA;SQLAlchemy.&lt;/p&gt;&#xA;&lt;p&gt;The ORM in SQLAlchemy is helpful for projects with complex relations and logic,&#xA;but when there are only simple data types SQLAlchemy Core is often all you&#xA;need. I have a few pieces of data that map to a table easily,&#xA;and relations aren&amp;rsquo;t important. For that case, the humble&#xA;&lt;a href=&#34;https://docs.python.org/3/library/collections.html#collections.namedtuple&#34;&gt;collections.namedtuple&lt;/a&gt; is invaluable. Declaring a namedtuple that&#xA;matches column names is an easy way to add a little syntax sugar on top of&#xA;SQLAlchemy Core without using the ORM.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Pomodoro: Feedback Loops Refined</title>
      <link>https://rsb.io/posts/pomodoro-feedback-loops/</link>
      <pubDate>Thu, 24 Sep 2015 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/pomodoro-feedback-loops/</guid>
      <description>&lt;p&gt;Making a habit out of not just doing work, but doing the &lt;em&gt;right&lt;/em&gt; work is&#xA;critical to succeeding on a yearly basis. It&amp;rsquo;s easy to settle into a routine&#xA;that makes each day look like a win on its own, but when you look back over the&#xA;year you must be able to answer &amp;ldquo;well what did I do?&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;Did you build a business from X dollars to X + Y dollars? Did you get (and&#xA;figure out how to stay) in shape? Did you learn a skill? Did you get organized?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Choosing a Personal SLA</title>
      <link>https://rsb.io/posts/personal-sla/</link>
      <pubDate>Wed, 23 Sep 2015 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/personal-sla/</guid>
      <description>&lt;p&gt;Email is absolutely a &lt;a href=&#34;http://theoatmeal.com/comics/email_monster&#34;&gt;monster&lt;/a&gt;, and nobody loves their inbox. I&#xA;certainly don&amp;rsquo;t, but it&amp;rsquo;s a critical communication medium and mailing lists are&#xA;the life-blood of Open Source projects like OpenStack. Ignoring them is not an&#xA;option.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve tried to restrict email to certain times of the day in the past, but it&amp;rsquo;s&#xA;never really stuck because it&amp;rsquo;s just so easy to leave your email client open&#xA;all day and check in every so often. Part of the reason I failed so miserably&#xA;to corral my email is because I felt like I &lt;em&gt;had&lt;/em&gt; to respond to everyone as&#xA;soon as I could.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Gollum as a Secure Personal Knowledge Base</title>
      <link>https://rsb.io/posts/gollum-personal-wiki/</link>
      <pubDate>Wed, 27 May 2015 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/gollum-personal-wiki/</guid>
      <description>&lt;p&gt;After stumbling across &lt;a href=&#34;https://github.com/gollum/gollum&#34;&gt;gollum&lt;/a&gt;, I decided it was about time I started&#xA;tracking things I find and learn in a more structured way. Especially tracking&#xA;tasks I don&amp;rsquo;t do often.&lt;/p&gt;&#xA;&lt;p&gt;My requirements were:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Must have search.&lt;/li&gt;&#xA;&lt;li&gt;Plaintext. No specific data formats.&lt;/li&gt;&#xA;&lt;li&gt;Ability to add to it from my ChromeBook.&lt;/li&gt;&#xA;&lt;li&gt;Secure.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Gollum nails the first 3, with its beautiful web interface and git-backed&#xA;markdown goodness.&lt;/p&gt;&#xA;&lt;p&gt;So let&amp;rsquo;s start by going for 3-out-of-4. First, decide how you&amp;rsquo;re going to&#xA;install gollum. I used &lt;a href=&#34;http://rvm.io/&#34;&gt;rvm&lt;/a&gt; for the first pass, so let&amp;rsquo;s go with that. Get&#xA;a shell as the user you want to be running gollum as, and let&amp;rsquo;s get going.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Git as a Presentation Tool</title>
      <link>https://rsb.io/posts/git-as-powerpoint/</link>
      <pubDate>Sat, 16 May 2015 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/git-as-powerpoint/</guid>
      <description>&lt;p&gt;This past week I gave a talk on &lt;a href=&#34;http://flask.pocoo.org/&#34;&gt;Flask&lt;/a&gt; at &lt;a href=&#34;http://www.meetup.com/Python-Buffalo/&#34;&gt;Python Buffalo&lt;/a&gt; with&#xA;no slides. Not only did I skip slides; I made the whole presentation one big&#xA;live demo application. Yes, I said to myself, tempt gods that would mock the&#xA;hubris of the live demo.&lt;/p&gt;&#xA;&lt;p&gt;Watching people type is &lt;em&gt;booooring&lt;/em&gt;. Typos are about as interesting as a&#xA;text-wall Powerpoint slide &amp;ndash; which is to say not. To avoid exposing how poor&#xA;a typist I am, I built the demo ahead of time and made a commit for each step.&#xA;The repo looked something like this.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Declarative Orchestration: Lessons in Scaling Ops</title>
      <link>https://rsb.io/posts/why-declarative-orchestration/</link>
      <pubDate>Sat, 02 May 2015 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/why-declarative-orchestration/</guid>
      <description>&lt;p&gt;Disclaimer: I work at Red Hat on &lt;a href=&#34;http://docs.openstack.org/developer/heat/&#34;&gt;OpenStack Heat&lt;/a&gt;, a declarative&#xA;orchestration tool so &lt;em&gt;of course&lt;/em&gt; I think they&amp;rsquo;re the way to go.&lt;/p&gt;&#xA;&lt;p&gt;As more and more organizations move to cloud infrastructure instead of&#xA;traditional physical or virtual systems, tools to handle large complex&#xA;workloads are getting more important. The only wrinkle is that an operational&#xA;system will tend towards higher complexity unless it is carefully designed.&lt;/p&gt;&#xA;&lt;p&gt;Orchestration aims to make complex systems simpler to run by masking some of&#xA;the complexity of actually creating all the pieces of a large application like:&#xA;instances, DNS names, load balancers, databases, and private networks. Modeling&#xA;all these in code makes management easier, changes more transparent, and are&#xA;self-documenting ways to express interdependencies between your application&amp;rsquo;s&#xA;infrastructure.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Deploying Hugo-Lambda</title>
      <link>https://rsb.io/posts/deploying-hugo-lambda/</link>
      <pubDate>Thu, 26 Mar 2015 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/deploying-hugo-lambda/</guid>
      <description>&lt;p&gt;Last post, I &lt;a href=&#34;http://rsb.io/posts/overview-of-hugo-lambda/&#34;&gt;announced&lt;/a&gt; the &lt;a href=&#34;https://github.com/ryansb/hugo-lambda&#34;&gt;hugo-lambda&lt;/a&gt; project, a way to&#xA;use a static site generator without actually running it. Since Lambda is just a&#xA;developer preview, it isn&amp;rsquo;t the easiest to work with or debug at the moment.&lt;/p&gt;&#xA;&lt;p&gt;To help with that, Mitch Garnaat has released &lt;a href=&#34;https://github.com/garnaat/kappa&#34;&gt;kappa&lt;/a&gt;, a tool that&#xA;streamlines the process pretty significantly. Each function gets a config file&#xA;that defines its name, IAM roles, and event sources (triggers). With that&#xA;information, kappa lets you deploy, test, and audit your function with a few&#xA;simple commands.&lt;/p&gt;</description>
    </item>
    <item>
      <title>An Overview of Hugo-Lambda</title>
      <link>https://rsb.io/posts/overview-of-hugo-lambda/</link>
      <pubDate>Wed, 25 Mar 2015 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/overview-of-hugo-lambda/</guid>
      <description>&lt;p&gt;When Amazon introduced &lt;a href=&#34;https://aws.amazon.com/lambda/&#34;&gt;AWS Lambda&lt;/a&gt; I saw tons of interesting&#xA;possibilities. Being able to react to events without needing to constantly run&#xA;(and pay for) EC2 instances. I built &lt;a href=&#34;https://github.com/ryansb/hugo-lambda&#34;&gt;hugo-lambda&lt;/a&gt; to take&#xA;advantage of Lambda to rebuild my static site whenever I made a change.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;If you&amp;rsquo;ve read much about lambda, skip this paragraph.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Lambda is still in an AWS (developer preview) product that consumes events from&#xA;Kinesis (stream processing), S3 events, DynamoDB changes, and more. You can use&#xA;it to make advanced materialized views out of DynamoDB tables, react to&#xA;uploaded images, or archive old content. In short, you write a function&#xA;(currently only in node.js) and it is presented with JSON containing&#xA;information about the event&amp;rsquo;s source and content.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Let My Email Go</title>
      <link>https://rsb.io/posts/let-my-email-go/</link>
      <pubDate>Mon, 05 Aug 2013 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/let-my-email-go/</guid>
      <description>&lt;p&gt;For a while, I&amp;rsquo;ve been looking to switch away from Gmail to maintain more&#xA;control over my own data, especially something as critical as email. When&#xA;looking for somewhere to switch, I had a few requirements.&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Ability to transfer existing email to the new system (more on this later)&lt;/li&gt;&#xA;&lt;li&gt;High reliability&lt;/li&gt;&#xA;&lt;li&gt;SSL/TLS for IMAP and SMTP (read &amp;ldquo;security&amp;rdquo;)&lt;/li&gt;&#xA;&lt;li&gt;Clear business relationsip. I had to be the customer, not the product.&lt;/li&gt;&#xA;&lt;li&gt;Support for custom domains&lt;/li&gt;&#xA;&lt;li&gt;Web interface (optional)&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;With all of these in mind, off I went on my search. Early on, &lt;a href=&#34;https://www.fastmail.fm/&#34;&gt;Fastmail&lt;/a&gt;&#xA;seemed like a clear winner. They had a mighty shiny web interface, custom&#xA;domain support, and a good track record.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Redundant Split-Horizon BIND</title>
      <link>https://rsb.io/posts/redundant-split-horizon-bind/</link>
      <pubDate>Wed, 01 May 2013 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/redundant-split-horizon-bind/</guid>
      <description>&lt;p&gt;There are certain topics in BIND9 that are well documented, like running a&#xA;slave DNS server, or delegating a subzone. One of the least documented setups&#xA;I&amp;rsquo;ve seen also happens to be one I had to implement.&lt;/p&gt;&#xA;&lt;p&gt;I found myself in need of redundant split-horizon name servers behind a static&#xA;NAT. I went through several iterations building this topology, and I learned&#xA;something new at every step.&lt;/p&gt;&#xA;&lt;p&gt;The topology would have three zones:&lt;/p&gt;</description>
    </item>
    <item>
      <title>SpaceHub Follow-Up</title>
      <link>https://rsb.io/posts/spacehub-follow-up/</link>
      <pubDate>Wed, 01 May 2013 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/spacehub-follow-up/</guid>
      <description>&lt;p&gt;Today is the day. It&amp;rsquo;s the deadline for &lt;a href=&#34;http://spaceappschallenge.org/&#34;&gt;Space Apps Challenge&lt;/a&gt; project&#xA;submissions, and &lt;a href=&#34;https://github.com/ryansb/spacehub&#34;&gt;SpaceHub&lt;/a&gt; has a video submitted. Some of our wonderful&#xA;colleagues at the &lt;a href=&#34;http://foss.rit.edu/&#34;&gt;FOSSBox&lt;/a&gt; helped us build a logo.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://rsb.io/img/spacehub_solo.png&#34; alt=&#34;SpaceHub&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Our project is a way to bring together disparate codebases on Github. The&#xA;challenge in question was to take all the different projects NASA has scattered&#xA;across BitBucket, private Mercurial repos, SVN repos, and &lt;em&gt;shudder&lt;/em&gt; tarballs&#xA;and centralize them on Github.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Light Up The Dark Net</title>
      <link>https://rsb.io/posts/light-up-the-dark-net/</link>
      <pubDate>Sat, 13 Apr 2013 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/light-up-the-dark-net/</guid>
      <description>&lt;p&gt;Last night I lit up my connection to &lt;a href=&#34;http://hyperboria.net/&#34;&gt;Hyperboria&lt;/a&gt; which has been neat. Other&#xA;than connecting, I haven&amp;rsquo;t done very much, but setting up &lt;a href=&#34;https://github.com/cjdelisle/cjdns&#34;&gt;cjdns&lt;/a&gt; was&#xA;exceptionally straightforward. The hardest part of it was finding other users&#xA;to peer with.&lt;/p&gt;&#xA;&lt;p&gt;It seems to be a lot like what I imagine the early internet was like. There are&#xA;a few peers and no real central authority. Names are assigned organically, and&#xA;most seem to be on the network for experimentation. There are peers providing&#xA;classic services like IRC and project mirrors as well as more modern services&#xA;like a URL shortener and a reddit clone (Uppit).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Bash on Brass Balls</title>
      <link>https://rsb.io/posts/bash-on-brass-balls/</link>
      <pubDate>Sun, 07 Apr 2013 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/bash-on-brass-balls/</guid>
      <description>&lt;p&gt;As a break from working on &lt;a href=&#34;http://github.com/ryansb/panstora&#34;&gt;Panstora&lt;/a&gt; I wrote a silly app in a web framework&#xA;I found. It&amp;rsquo;s called &lt;a href=&#34;http://github.com/jayferd/balls&#34;&gt;Bash on Balls&lt;/a&gt;, and the application I wrote is&#xA;called &lt;a href=&#34;http://github.com/ryansb/brassballs&#34;&gt;Brass Balls&lt;/a&gt;. It&amp;rsquo;s a stupid web app that lets you mess with the&#xA;computer that&amp;rsquo;s running it. Effectively, you make GET requests against it, and&#xA;it runs arbitrary shell commands. It does all kinds of neat stuff.&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;ll alias vim to emacs, try to fill up your hard drive, and even attempt to&#xA;&amp;ldquo;upgrade&amp;rdquo; your operating system to &lt;a href=&#34;http://linux.oracle.com/switch/centos/&#34;&gt;Oracle Linux&lt;/a&gt; if that can be said to be&#xA;an upgrade.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hack Upstate 2013</title>
      <link>https://rsb.io/posts/hack-upstate/</link>
      <pubDate>Sun, 07 Apr 2013 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/hack-upstate/</guid>
      <description>&lt;p&gt;This weekend the &lt;a href=&#34;http://foss.rit.edu/&#34;&gt;FOSSBox&lt;/a&gt; sent a team to &lt;a href=&#34;http://hackupstate.com/&#34;&gt;Hack Upstate&lt;/a&gt;, which drew&#xA;attendees from upwards of 300 miles away. It was a very different feel than a&#xA;lot of hackathons in Rochester, much more business- and design-type folks. Our&#xA;team felt a little out of place as nearly pure programmers. This was pretty&#xA;apparent during the pitches, which included farmers market awareness apps and&#xA;WYSIWYG Wordpress plugin builders.&lt;/p&gt;&#xA;&lt;p&gt;Our project is called [panstora] and it&amp;rsquo;s designed to provide a more online&#xA;interface to physical stores. It&amp;rsquo;s built on &lt;a href=&#34;http://docs.pylonsproject.org/projects/pyramid/en/latest/&#34;&gt;Pyramid&lt;/a&gt; and &lt;a href=&#34;http://iron.io/&#34;&gt;SQLAlchemy&lt;/a&gt;.&#xA;Users are supposed to use the app in stores to view more info about the item&#xA;and to have the item delivered to them the same day, instead of buying items&#xA;and carrying them home.&lt;/p&gt;</description>
    </item>
    <item>
      <title>On Coding Standards</title>
      <link>https://rsb.io/posts/on-coding-standards/</link>
      <pubDate>Thu, 04 Apr 2013 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/on-coding-standards/</guid>
      <description>&lt;p&gt;Yesterday I discovered a project under MediaWiki written in Python. The project&#xA;is &lt;a href=&#34;https://www.mediawiki.org/wiki/EventLogging&#34;&gt;EventLogging&lt;/a&gt; that captures data about users as they interact with&#xA;MediaWiki sites. On viewing the code, I noticed a couple of inconsistencies and&#xA;out of curiousity asked where the MediaWiki code guidelines were for Python.&#xA;They didn&amp;rsquo;t exist but for a single line in the &lt;a href=&#34;https://www.mediawiki.org/wiki/Manual:Coding_conventions&#34;&gt;MW:Code Conventions&lt;/a&gt; that&#xA;mentions the PEP8 whitespace guidelines.&lt;/p&gt;&#xA;&lt;p&gt;The folks in &lt;code&gt;#mediawiki-e3&lt;/code&gt; recommended that I be &lt;a href=&#34;http://en.wikipedia.org/wiki/Wikipedia:Be_bold&#34;&gt;WP:BOLD&lt;/a&gt; and write some&#xA;guidelines, so I did. The guidelines are PEP8, but in &lt;a href=&#34;https://www.mediawiki.org/wiki/Manual:Coding_conventions/Python&#34;&gt;the article&lt;/a&gt; I pulled out&#xA;a few of the more important points and added pieces of PEP257 to make a more&#xA;clear docstring standard.&lt;/p&gt;</description>
    </item>
    <item>
      <title>xkcd Hashing Challenge</title>
      <link>https://rsb.io/posts/xkcd-hashing-challenge/</link>
      <pubDate>Wed, 03 Apr 2013 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/xkcd-hashing-challenge/</guid>
      <description>&lt;p&gt;On the 1st, the popular webcomic xkcd issued a hash-breaking challenge to&#xA;universities. I didn&amp;rsquo;t find out about this until around noon yesterday (the&#xA;second) meaning I was very, very late to the game. Especially in comparison to&#xA;other competitors like CMU. When I began, RIT was below even the least of&#xA;competitors. Even the laughable &amp;ldquo;fuckgoogle.com&amp;rdquo; was defeating us.&lt;/p&gt;&#xA;&lt;p&gt;Fortunately, several hackathons this year have been giving out free Amazon Web&#xA;Services credits. I decided to put mine to use for my alma mater. I spun up a&#xA;total of 16 cc2.8xlarge instances, for a total of 512 cores. In the 12 hours I&#xA;ran them, RIT was catapulted to 69th place with a hash distance of 386.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Microchord Chorded Keyboard</title>
      <link>https://rsb.io/posts/microchord-chorded-keyboard/</link>
      <pubDate>Sat, 30 Mar 2013 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/microchord-chorded-keyboard/</guid>
      <description>&lt;p&gt;For some time I&amp;rsquo;ve had the idea that keyboards as we know them are terrible.&#xA;I&amp;rsquo;ve looked at other keyboard layouts like colemak, dvorak, programmers dvorak,&#xA;and so on. These are an improvement over qwerty according to some people, but&#xA;it&amp;rsquo;s still the same keyboard that puts your hands in an exceptionally poor&#xA;ergonomic positions.&lt;/p&gt;&#xA;&lt;p&gt;So then you start looking to alternatives like a &lt;a href=&#34;https://www.kinesis-ergo.com/keyboards.htm&#34;&gt;kinesis&lt;/a&gt; that lets you&#xA;separate your hands, and save keystrokes by programming in your own macros.&#xA;This is great, but you still end up moving your fingers a lot, and have a risk&#xA;of adopting a pronating posture because the buttons still require lots of&#xA;finger movement and are laid out parallel to your work surface.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python Packaging is Hard</title>
      <link>https://rsb.io/posts/python-packaging-is-hard/</link>
      <pubDate>Sat, 16 Mar 2013 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/python-packaging-is-hard/</guid>
      <description>&lt;p&gt;Conveniently after last week&amp;rsquo;s post on &lt;a href=&#34;http://github.com/oddshocks/pythong&#34;&gt;pythong&lt;/a&gt; I attended &lt;a href=&#34;http://us.pycon.org&#34;&gt;PyCon&lt;/a&gt; and&#xA;was privileged to attend both the Python Packaging Mini-Summit and the Python&#xA;Packaging Panel.  This taught me a lot about the past and future of packaging&#xA;in Python.&lt;/p&gt;&#xA;&lt;p&gt;What I took away from the whole experience was &amp;ldquo;packaging is hard, lots of&#xA;people want things, holy crap.&amp;rdquo; There&amp;rsquo;s the scientific community that needs to&#xA;compile things like &lt;a href=&#34;http://www.netlib.org/blas/&#34;&gt;blas&lt;/a&gt; which is written in fortran.  There are&#xA;sysadmins that hate having to compile &lt;a href=&#34;http://lxml.de/&#34;&gt;lxml&lt;/a&gt; on every machine they deploy&#xA;on, web developers that need things to work on their Macs, and developers that&#xA;want to deploy from version control seamlessly.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python Project Bootstrapping</title>
      <link>https://rsb.io/posts/python-project-bootstrapping/</link>
      <pubDate>Tue, 12 Mar 2013 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/python-project-bootstrapping/</guid>
      <description>&lt;p&gt;This is the introduction post for &lt;a href=&#34;http://github.com/oddshocks/pythong&#34;&gt;pythong&lt;/a&gt; a minimal, yet comfortable&#xA;project bootstrapping tool. It&amp;rsquo;s intended to replace the now-unmaintained&#xA;&amp;ldquo;paster create&amp;rdquo;. It will walk you through creating the project directory&#xA;structure and prompt you for the information you need to build a good setup.py&#xA;using the most recent packaging idioms.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://rsb.io/img/lenin_packaging.png&#34; alt=&#34;Ministry of Packaging&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;This means distutils, first of all, and we built prompts to help walk you&#xA;through the process of creating a distribute-based setup script.&lt;/p&gt;</description>
    </item>
    <item>
      <title>RIT Week Numbers</title>
      <link>https://rsb.io/posts/rit-week-numbers/</link>
      <pubDate>Mon, 01 Oct 2012 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/rit-week-numbers/</guid>
      <description>&lt;p&gt;Over the weekend I found a fun &lt;a href=&#34;http://optics.eee.nottingham.ac.uk/matt/weeknumbers/weeknumbers_form.php&#34;&gt;PHP form&lt;/a&gt; that will build week numbers&#xA;(Monday-Sunday) for arbitrary date ranges. Using it to make a base of week&#xA;number ICAL files for each of the RIT quarters, I made liberal use of Perl to&#xA;convert from Monday-Sunday numbered weeks to Monday-Friday numbered weeks, and&#xA;factored in RIT breaks. The &lt;a href=&#34;http://www.ryansb.com/static/resources/rit_week_numbers_12-13.ical&#34;&gt;ICAL file&lt;/a&gt; is available, and has week numbers&#xA;for Fall-Spring of the 12-13 academic year.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Flash Drive Automation</title>
      <link>https://rsb.io/posts/flash-drive-automation/</link>
      <pubDate>Mon, 10 Sep 2012 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/flash-drive-automation/</guid>
      <description>&lt;p&gt;Today I flashed over 120 USB sticks for &lt;a href=&#34;http://ice-gic.ieee-cesoc.org/2010/index.php&#34;&gt;IGIC&lt;/a&gt; conference happening at the&#xA;Strong campus in Rochester. At first the task seemed daunting, but a&#xA;&lt;a href=&#34;https://gist.github.com/3613000&#34;&gt;quick script&lt;/a&gt; solved the problem of manual copying pretty handily, and a&#xA;powered USB hub made it posssible to write to 9 drives at a time. Bash swoops in&#xA;to provide a handy solution yet again.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Editing Remote Files With Vim</title>
      <link>https://rsb.io/posts/editing-remote-files-with-vim/</link>
      <pubDate>Tue, 21 Aug 2012 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/editing-remote-files-with-vim/</guid>
      <description>&lt;p&gt;As you already know, Vim is a fine tool for editing files locally. Now, you can&#xA;edit files on other machines. This is great for editing files on your&#xA;webserver, or any other machine you have shell access to but don&amp;rsquo;t really want&#xA;to SSH into.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim scp://www.ryansb.com/var/www/html/index.html&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This opens up a buffer on my local machine with the file from the remote&#xA;machine, and I can save it and the new copy will be saved on the remote&#xA;machine. Netrw supports FTP (ftp://host/name/of/file), SCP&#xA;(scp://host/name/of/file), rsync (rsync://host/i/think/you/get/it/now), and&#xA;many other common (and uncommon) protocols.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fun With **kwargs</title>
      <link>https://rsb.io/posts/fun-with-kwargs/</link>
      <pubDate>Wed, 21 Mar 2012 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/fun-with-kwargs/</guid>
      <description>&lt;p&gt;Ever want to write functions that flexibly receive arguments? What about&#xA;getting defaults from a configuration on the module level, then have those&#xA;defaults automatically used by functions in your module?&lt;/p&gt;&#xA;&lt;p&gt;Well kwargs might be just what you need. &amp;ldquo;kwarg&amp;rdquo; is a nickname for &amp;ldquo;keyword&#xA;arguments&amp;rdquo;, which you&amp;rsquo;re likely already familiar with in a format like this:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#81a1c1;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#88c0d0&#34;&gt;func&lt;/span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;(&lt;/span&gt;first&lt;span style=&#34;color:#81a1c1&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a3be8c&#34;&gt;&amp;#39;ask questions&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;,&lt;/span&gt; second&lt;span style=&#34;color:#81a1c1&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a3be8c&#34;&gt;&amp;#39;shoot&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#81a1c1&#34;&gt;print&lt;/span&gt; &lt;span style=&#34;color:#a3be8c&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#a3be8c&#34;&gt;{0}&lt;/span&gt;&lt;span style=&#34;color:#a3be8c&#34;&gt; first&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;format&lt;span style=&#34;color:#eceff4&#34;&gt;(&lt;/span&gt;first&lt;span style=&#34;color:#eceff4&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#81a1c1&#34;&gt;print&lt;/span&gt; &lt;span style=&#34;color:#a3be8c&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#a3be8c&#34;&gt;{0}&lt;/span&gt;&lt;span style=&#34;color:#a3be8c&#34;&gt; second&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;format&lt;span style=&#34;color:#eceff4&#34;&gt;(&lt;/span&gt;second&lt;span style=&#34;color:#eceff4&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#81a1c1;font-weight:bold&#34;&gt;if&lt;/span&gt; __name__ &lt;span style=&#34;color:#81a1c1&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a3be8c&#34;&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    func&lt;span style=&#34;color:#eceff4&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Let&amp;rsquo;s try it out!&lt;/p&gt;</description>
    </item>
    <item>
      <title>ZSH&#43;Boto Tab Completion for AWS</title>
      <link>https://rsb.io/posts/zsh-boto-tab-completion-for-aws/</link>
      <pubDate>Sun, 26 Feb 2012 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/zsh-boto-tab-completion-for-aws/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://zsh.sourceforge.net/&#34;&gt;zsh&lt;/a&gt; is an awesome shell. It has enhanced &lt;a href=&#34;http://www.jukie.net/bart/blog/zsh-tab-completion&#34;&gt;tab&#xA;completion&lt;/a&gt; features that go&#xA;way beyond what you probably expect from a shell. If you don&amp;rsquo;t already use zsh&#xA;but would like to start, &lt;a href=&#34;http://zshwiki.org/home/start&#34;&gt;this&lt;/a&gt; is a great place&#xA;to jump in, it has everything you could ever want to know about zsh.&lt;/p&gt;&#xA;&lt;p&gt;I use zsh as my main shell, especially for the revision control information in&#xA;my prompt, appreciatively copied from the &lt;a href=&#34;https://github.com/grml/grml-etc-core/blob/master/etc/zsh/zshrc&#34;&gt;grml&#xA;zshrc&lt;/a&gt;, 2700&#xA;lines of more than you need in a shell.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Distutils and You</title>
      <link>https://rsb.io/posts/distutils-and-you/</link>
      <pubDate>Tue, 21 Feb 2012 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/distutils-and-you/</guid>
      <description>&lt;p&gt;Writing a python module is great, but what&amp;rsquo;s really important is getting it out&#xA;to others so they can make use of it too. What&amp;rsquo;s the best way to do that?&lt;/p&gt;&#xA;&lt;p&gt;Of course, the best way is to use existing infrastructure in the Python&#xA;community. &lt;a href=&#34;http://pypi.python.org/pypi/&#34;&gt;PyPI&lt;/a&gt; is the place to get Python&#xA;modules. You can browse them on the web, and they are all just a &amp;ldquo;easy_install&amp;rdquo;&#xA;or &amp;ldquo;pip install&amp;rdquo; away.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Ripkern Remote IPython Kernels</title>
      <link>https://rsb.io/posts/ripkern-remote-ipython-kernels/</link>
      <pubDate>Mon, 23 Jan 2012 00:00:00 +0000</pubDate>
      <guid>https://rsb.io/posts/ripkern-remote-ipython-kernels/</guid>
      <description>&lt;p&gt;In lieue of using the standard Python shell, I have been using &lt;a href=&#34;http://ipython.org/&#34;&gt;IPython&lt;/a&gt; and it&amp;rsquo;s been treating me very well. If you&amp;rsquo;ve never tried it, you can now &lt;a href=&#34;http://www.pythonanywhere.com/try-ipython/&#34;&gt;try it online&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ ipython&#xA;In [1]: print &amp;#34;hello there&amp;#34;&#xA;hello there&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It adds some convienient features like tab completion, integration with your favorite editor, and &amp;ldquo;magic&amp;rdquo; functions that make your life easier.&lt;/p&gt;&#xA;&lt;p&gt;One of the &amp;ldquo;magic&amp;rdquo; functions is &amp;ldquo;%time&amp;rdquo; for when you need to know how long an operation takes. The short of it is that IPython makes Python shells fun.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
