<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Greg Reinacker&apos;s Weblog</title>
    <description>Greg Reinacker&apos;s Weblog - Musings on just about everything.</description>
    <link>https://www.rassoc.com/</link>
    <atom:link href="https://www.rassoc.com/gregr/weblog/feed/" rel="self" type="application/rss+xml"/>
    <pubDate>Thu, 12 Mar 2026 14:36:36 -0600</pubDate>
    <lastBuildDate>Thu, 12 Mar 2026 14:36:36 -0600</lastBuildDate>
    <generator>Jekyll v4.4.1</generator>
    
      <item>
        <title>SmartThings to HomeKit bridge for door locks</title>
        <description>&lt;p&gt;My automation system of choice in my house is Apple Home, but I have devices that are not
directly compatible, including a Schlage door lock. It’s connected (via Zigbee and SmartThings),
but not accessible via HomeKit / Apple Home.&lt;/p&gt;

&lt;p&gt;In the past, I have used &lt;a href=&quot;https://homebridge.io&quot;&gt;Homebridge&lt;/a&gt; and a plugin to connect this up. 
This worked fine for a while, but for some
reason it would periodically stop working and require some maintenance steps (for the record,
I’m sure this was my fault, and not a Homebridge problem!). I ended up just turning off the
Homebridge server, and just used SmartThings with some Apple Shortcuts for automation.&lt;/p&gt;

&lt;p&gt;Recently, though, I decided to tackle this again, but this time with some custom single-purpose
code. &lt;a href=&quot;https://github.com/greinacker/st-hk-bridge&quot;&gt;st-hk-bridge&lt;/a&gt; is the result - a 
small server, which will run in a Docker
container, that bridges a SmartThings-compatible lock into HomeKit:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/gregr/weblog/assets/postImages/frontdoor.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I’ve been running this
for a couple of weeks, and after ironing out a few kinks, it’s been working well. It uses the
SmartThings API, so if you’d like to use it yourself, you’ll need to sign up for the (free) 
API, and get your deviceId and an
access token.&lt;/p&gt;

&lt;p&gt;The majority of the code was written by &lt;a href=&quot;https://developers.openai.com/codex/&quot;&gt;Codex&lt;/a&gt;, which 
has truly seen massive improvement over the last few months!&lt;/p&gt;
</description>
        <pubDate>Thu, 12 Mar 2026 14:25:00 -0600</pubDate>
        <link>https://www.rassoc.com/gregr/weblog/2026/03/12/smartthings-homekit-bridge/</link>
        <guid isPermaLink="true">https://www.rassoc.com/gregr/weblog/2026/03/12/smartthings-homekit-bridge/</guid>
        
        <category>HomeKit</category>
        
        <category>SmartThings</category>
        
        
        <category>development</category>
        
      </item>
    
      <item>
        <title>GoatBar menu bar app for GoatCounter</title>
        <description>&lt;p&gt;When I recently &lt;a href=&quot;/gregr/weblog/2026/01/31/hello-jekyll/&quot;&gt;moved&lt;/a&gt; my blog to 
Jekyll, I also wanted to find a lightweight 
solution to analytics. I don’t need a lot around here - just seeing pageviews
and referrers is generally enough, and given that, I don’t want to use a super
heavy solution that downloads huge javascript files.&lt;/p&gt;

&lt;p&gt;I settled on &lt;a href=&quot;https://www.goatcounter.com&quot;&gt;GoatCounter&lt;/a&gt;, which is a lightweight solution for my needs, and
has been working well for me so far.&lt;/p&gt;

&lt;p&gt;Since this site doesn’t get a ton of traffic, I’m unlikely to visit the 
analytics pages every day, and thus might miss someone who has linked here
that I might want to respond to. So, I built &lt;a href=&quot;https://github.com/greinacker/GoatBar&quot;&gt;GoatBar&lt;/a&gt; - 
a small menu bar
app that displays total pageviews in the last 24 hours on the menu bar:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/gregr/weblog/assets/postImages/menu-bar-status.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And if you click it, you’ll see an hourly breakdown for those last 24 hours:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/gregr/weblog/assets/postImages/menu-bar-menu.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It’s very small and lightweight - I’ve had it running for a week or so on my
Mac, and it’s using around 23MB of RAM.&lt;/p&gt;

&lt;p&gt;I’m making it available in source form only, so you’ll need to build it yourself
in Xcode, but it just takes a minute!&lt;/p&gt;

&lt;p&gt;Related, it’s quite striking how much progress tools like &lt;a href=&quot;https://developers.openai.com/codex/&quot;&gt;Codex&lt;/a&gt;
and &lt;a href=&quot;https://code.claude.com/docs/en/overview&quot;&gt;Claude Code&lt;/a&gt; have made
in the last few months. Codex wrote the majority of the code in this app.&lt;/p&gt;
</description>
        <pubDate>Sat, 28 Feb 2026 11:35:00 -0700</pubDate>
        <link>https://www.rassoc.com/gregr/weblog/2026/02/28/goatbar-for-goatcounter/</link>
        <guid isPermaLink="true">https://www.rassoc.com/gregr/weblog/2026/02/28/goatbar-for-goatcounter/</guid>
        
        <category>GoatBar</category>
        
        <category>GoatCounter</category>
        
        
        <category>development</category>
        
      </item>
    
      <item>
        <title>Hello Jekyll</title>
        <description>&lt;p&gt;Hello again everyone! I realize it’s been a while…hopefully that will change!&lt;/p&gt;

&lt;p&gt;First, I’d like to apologize to those of you reading this in a RSS reader, if you’re seeing a bunch of posts from the past showing up again. Hopefully this won’t happen again for a while.&lt;/p&gt;

&lt;p&gt;This blog has been around since the early days of blogging. I started on &lt;a href=&quot;/gregr/weblog/2002/06/03/welcome/&quot;&gt;Jan 3, 2002&lt;/a&gt; with &lt;a href=&quot;http://radio.userland.com&quot;&gt;Radio Userland&lt;/a&gt;, and quite enjoyed having a new blog. This of course led to some &lt;a href=&quot;/gregr/weblog/2003/01/04/news-aggregator/&quot;&gt;dabbling with RSS&lt;/a&gt;, and later to starting NewsGator.&lt;/p&gt;

&lt;p&gt;Just under a year later, I did what many developers did at the time :), and spent my Christmas break building my own blogging platform in &lt;a href=&quot;/gregr/weblog/2002/12/29/no-more-radio/&quot;&gt;Dec 2002&lt;/a&gt;, built on .NET and Microsoft SQL Server (which was my development specialty at the time). In hindsight, this was a good choice for me personally, as it led to lots of experimentation with the community with pingbacks, trackbacks, comment feeds, and lots of RSS/Atom involvement.&lt;/p&gt;

&lt;p&gt;This worked great up until Nov 2007, when I really felt like I could take advantages of some of the features built into Wordpress (like standardized posting APIs, etc), and I didn’t really have time to add these features myself (NewsGator was in full swing at this time). So, I &lt;a href=&quot;/gregr/weblog/2007/11/29/and-the-blog-moratorium-shall-end/&quot;&gt;switched over&lt;/a&gt; &lt;a href=&quot;/gregr/weblog/2007/11/29/migration-to-wordpress/&quot;&gt;to Wordpress&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And now, over 18 years later (I can’t believe I just typed that!), I’m finding Wordpress to be less desirable. I don’t need 99% of its features. It (or more specifically, mysql) often exhausts the available RAM on the VPS it runs on, leading to issues like automated SSL certificate renewals failing. It was also multiple major PHP versions behind, multiple WP versions behind, and I didn’t feel like upgrading everything all the time was a good use of my time any more.&lt;/p&gt;

&lt;p&gt;So I’ve moved to a static site generator, &lt;a href=&quot;https://jekyllrb.com&quot;&gt;Jekyll&lt;/a&gt;, and using the &lt;a href=&quot;https://github.com/cotes2020/jekyll-theme-chirpy&quot;&gt;Chirpy theme&lt;/a&gt; which seems to be somewhat actively maintained at the moment. The migration itself wasn’t trivial, mostly due to having used multiple posting tools in the past that inserted “extra” HTML markup in the posts that needed to be removed after converting to markdown. A tale that I’m sure no one wants to hear about!&lt;/p&gt;

&lt;p&gt;A couple of items about this change I wanted to mention:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;User comments have been removed, including old comments. The majority of these were 10+ years old, so hopefully no one will be too bothered. I still have them, and I can bring them back in the future if I decide to, but for now comments are not available.&lt;/li&gt;
  &lt;li&gt;The Project 365 site from 2010 has also been removed. The photos themselves from the &lt;a href=&quot;/gregr/weblog/2010/01/06/project-365/&quot;&gt;project&lt;/a&gt; are still available on Flickr (!).&lt;/li&gt;
  &lt;li&gt;Since &lt;a href=&quot;https://www.w3.org/Provider/Style/URI&quot;&gt;cool URIs don’t change&lt;/a&gt;, all post URLs have been preserved. The last time they changed was in 2007, at which point they were redirected from some &lt;em&gt;really&lt;/em&gt; old URLs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So if you got this far - I’m happy you’re still here reading my site, and I really do hope to post more frequently with the new setup!&lt;/p&gt;
</description>
        <pubDate>Sat, 31 Jan 2026 12:00:00 -0700</pubDate>
        <link>https://www.rassoc.com/gregr/weblog/2026/01/31/hello-jekyll/</link>
        <guid isPermaLink="true">https://www.rassoc.com/gregr/weblog/2026/01/31/hello-jekyll/</guid>
        
        <category>jekyll</category>
        
        
        <category>development</category>
        
      </item>
    
      <item>
        <title>Pythonista scripts for EC2</title>
        <description>&lt;p&gt;My &lt;a href=&quot;/gregr/weblog/2016/01/25/web-development-with-ipad-pro/&quot;&gt;last post&lt;/a&gt; discussed doing web development with an &lt;a href=&quot;http://www.macmall.com/p/Apple-iPad/product~dpno~13696669~pdp.jhffcdc&quot;&gt;iPad Pro&lt;/a&gt; and a VPS, and included &lt;a href=&quot;https://appsto.re/us/P0xGF&quot;&gt;Pythonista&lt;/a&gt; scripts for automating the creation/deletion of nodes on Linode. Today, I’ll show different versions of these scripts that can be used for starting and stopping EC2 instances.&lt;/p&gt;

&lt;p&gt;The scripts assume you have an EBS-backed EC2 instance, which we will start and stop. Unlike Linode and others, EC2 instances of this type do not incur charges when stopped (other than storage), so our scripts will simply start and stop the instance you’ve already created.&lt;/p&gt;

&lt;p&gt;To get started, first install &lt;a href=&quot;https://github.com/boto/boto&quot;&gt;boto&lt;/a&gt;, a Python library for accessing AWS. The easiest way I’ve found to install it is to run &lt;a href=&quot;https://gist.github.com/greinacker/5a61309be34490a63aa6&quot;&gt;this script&lt;/a&gt;, which will install boto in Pythonista, in a folder called boto-module.&lt;/p&gt;

&lt;p&gt;Then, in a different folder, save the ec2_start.py script:&lt;/p&gt;

&lt;noscript&gt;&lt;a href=&quot;https://gist.github.com/3888373ee4a5cb54732c#file-ec2_start-py&quot;&gt;https://gist.github.com/3888373ee4a5cb54732c#file-ec2_start-py&lt;/a&gt;&lt;/noscript&gt;
&lt;script src=&quot;https://gist.github.com/3888373ee4a5cb54732c.js?file=ec2_start.py&quot;&gt; &lt;/script&gt;

&lt;p&gt;Modify it to add EC2 instance ID you want it to start, and the AWS access key you want to use. You’ll be prompted on the first run to enter your secret key, which will be stored in the keychain.&lt;/p&gt;

&lt;p&gt;The script will start the instance, and then poll every couple of seconds waiting for the public IP address to be available, which will be copied to the clipboard.&lt;/p&gt;

&lt;p&gt;If you want to open another app when the script is completed, pass a URL as a parameter to the script such as workflow://, and that URL will be opened when the script completes. See the &lt;a href=&quot;/gregr/weblog/2016/01/25/web-development-with-ipad-pro/&quot;&gt;prior post&lt;/a&gt; for an example of how to do this with the Workflow app.&lt;/p&gt;

&lt;p&gt;To stop the instance, use ec2_stop.py:&lt;/p&gt;

&lt;noscript&gt;&lt;a href=&quot;https://gist.github.com/3888373ee4a5cb54732c#file-ec2_stop-py&quot;&gt;https://gist.github.com/3888373ee4a5cb54732c#file-ec2_stop-py&lt;/a&gt;&lt;/noscript&gt;
&lt;script src=&quot;https://gist.github.com/3888373ee4a5cb54732c.js?file=ec2_stop.py&quot;&gt; &lt;/script&gt;

&lt;p&gt;That’s it - pretty simple, and super convenient for starting and stopping EBS-backed EC2 instances from iOS!&lt;/p&gt;
</description>
        <pubDate>Wed, 10 Feb 2016 09:50:14 -0700</pubDate>
        <link>https://www.rassoc.com/gregr/weblog/2016/02/10/pythonista-scripts-for-ec2/</link>
        <guid isPermaLink="true">https://www.rassoc.com/gregr/weblog/2016/02/10/pythonista-scripts-for-ec2/</guid>
        
        <category>aws</category>
        
        <category>ipad</category>
        
        <category>ipad-pro</category>
        
        <category>vps</category>
        
        <category>pythonista</category>
        
        <category>workflow</category>
        
        <category>ec2</category>
        
        
        <category>development</category>
        
      </item>
    
      <item>
        <title>Web development with iPad Pro</title>
        <description>&lt;p&gt;As I mentioned &lt;a href=&quot;/gregr/weblog/2016/01/15/using-working-copy-with-1writer-on-ipad-pro/&quot;&gt;last week&lt;/a&gt;, I’ve recently been doing a bunch of development and other work with the &lt;a href=&quot;http://www.macmall.com/p/Apple-iPad/product~dpno~13696669~pdp.jhffcdc&quot;&gt;iPad Pro&lt;/a&gt;. This has generally been going very well - the only thing I &lt;em&gt;have&lt;/em&gt; to go back to my Mac for, at the moment, is &lt;a href=&quot;https://www.amazon.com/QuickBooks-Small-Business-Accounting-Software/dp/B013EXF9T6/&quot;&gt;QuickBooks&lt;/a&gt;. (And yes, I know there is an online version of QuickBooks - however, there is one thing in it that didn’t work well for me last time I tried it, so for now I’m still using the desktop version.)&lt;/p&gt;

&lt;p&gt;Part of what I do on a day-to-day basis is web development, using Ruby and Rails. To do this on the Mac I use &lt;a href=&quot;http://www.sublimetext.com/3&quot;&gt;Sublime Text&lt;/a&gt;, and a couple of terminal windows to accomplish what I need. If we break this down a bit, this is what’s needed for development:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;An editor for editing source files&lt;/li&gt;
  &lt;li&gt;A terminal window of some sort for running specs, deploying code, etc&lt;/li&gt;
  &lt;li&gt;A browser for testing changes&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There isn’t any requirement that that editor needs to be editing files on your local machine, nor that the terminal window needs to be a session on the local machine, nor that the browser needs to point to the local machine. Which forms the basis for a reasonable iPad-based workflow for development.&lt;/p&gt;

&lt;p&gt;I’ve been doing this using a combination of a development VPS running Linux, and a few tools on the iPad Pro. The main tool I’ve been using is &lt;a href=&quot;https://appsto.re/us/5KZ2D&quot;&gt;Coda&lt;/a&gt;, which combines an editor, SSH client, and FTP client together in one app. In my experience, Coda is sometimes a bit buggy (random crashes, sometimes freezes for a few seconds at a time, sometimes line numbers go haywire), but for the most part it’s quite polished, and definitely worth using.&lt;/p&gt;

&lt;p&gt;And Coda has one feature that really ties everything together - it can edit remote files (on my development VPS) directly, without having to explicitly transfer them. Don’t worry - I’m not editing live files on a production server; rather, I’m editing files live on a development VPS, and connecting to that dev machine using Coda.&lt;/p&gt;

&lt;p&gt;When I want to make some changes to the site, I simply:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Start up a new VPS from an image I’ve created&lt;/li&gt;
  &lt;li&gt;Connect to that image from Coda&lt;/li&gt;
  &lt;li&gt;Make code changes with the Coda editor&lt;/li&gt;
  &lt;li&gt;Test changes with a browser pointing to the VPS&lt;/li&gt;
  &lt;li&gt;Run specs, commit changes, etc. using Coda’s SSH client&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All in all, this works just as well as making code changes from the desktop - the only real difference is using the Coda editor rather than Sublime Text.&lt;/p&gt;

&lt;h2 id=&quot;optimizing-the-vps-workflow-for-linode&quot;&gt;Optimizing the VPS workflow for Linode&lt;/h2&gt;

&lt;p&gt;I could just create the development VPS and leave it running all the time, waiting for me to connect and use it. However, it’s almost as easy to start and stop the VPS as necessary, and we’ll save a few bucks doing it this way. Plus we can have some more fun, with &lt;a href=&quot;https://appsto.re/us/P0xGF&quot;&gt;Pythonista&lt;/a&gt;, which was recently updated for the iPad Pro!&lt;/p&gt;

&lt;p&gt;The steps and scripts below are for &lt;a href=&quot;https://www.linode.com/?r=2c10ab7a0d87f3f27045363cfa6106859afb3d6b&quot;&gt;Linode&lt;/a&gt; (shameless referral link), but you can do this anywhere you like. &lt;a href=&quot;/gregr/weblog/2016/02/10/pythonista-scripts-for-ec2/&quot;&gt;Here are similar scripts for AWS/EC2&lt;/a&gt;. But for Linode, this is what we need to do:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Create a development server VPS. Install whatever software you need (e.g. Ruby, etc.), clone your source code into a folder, and basically get everything up and running.&lt;/li&gt;
  &lt;li&gt;Create a saved image of that VPS, using the &lt;a href=&quot;https://www.linode.com/docs/platform/linode-images&quot;&gt;Linode Manager tools&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Assuming you have the image saved, you can now delete the original VPS.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You now have a saved image, that you can create a new VPS from any time you like. But that will be a lot of tapping around on the Linode Manager to do so…so instead, we can use a script (which uses the Linode API) to automate this, and run this script in Pythonista.&lt;/p&gt;

&lt;p&gt;It turns out this script has to do quite a few things; creating a new node from an image in the Linode Manager hides some of these steps from you (like setting up a configuration profile), but we must do them all manually when using the API.&lt;/p&gt;

&lt;p&gt;To get set up, first copy the &lt;a href=&quot;https://github.com/tjfontaine/linode-python/blob/master/linode/api.py&quot;&gt;api.py&lt;/a&gt; file from the &lt;a href=&quot;https://github.com/tjfontaine/linode-python&quot;&gt;linode-python&lt;/a&gt; GitHub repository to Pythonista. You can copy down the entire repo if you want, but the api.py is the part we need. Then, you can use this script in Pythonista to create a new node:&lt;/p&gt;

&lt;noscript&gt;&lt;a href=&quot;https://gist.github.com/0a4f2b0a64b7c5b13a48#file-new_node-py&quot;&gt;https://gist.github.com/0a4f2b0a64b7c5b13a48#file-new_node-py&lt;/a&gt;&lt;/noscript&gt;
&lt;script src=&quot;https://gist.github.com/0a4f2b0a64b7c5b13a48.js?file=new_node.py&quot;&gt; &lt;/script&gt;

&lt;p&gt;This script assumes it’s in the same directory as api.py, and further assumes the following:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;You have an manually-created image saved, and that image is called “dev image”&lt;/li&gt;
  &lt;li&gt;You want the new node to be called “dev01”, and be saved in a group called “Dev”&lt;/li&gt;
  &lt;li&gt;You want your new node to be in the Dallas data center, and you want it to be on the Linode 1024 plan; it will be set up with a 22GB main volume, and a 256MB swap volume, with the latest 64-bit kernel.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can change any of the above assumptions by editing the code on lines 20-26.&lt;/p&gt;

&lt;p&gt;The script will create a new VPS, and will copy the public IP of the new node to the clipboard. From there, you can open Coda, create or edit a site configuration there, and paste in the new IP. In my experience, by the time you open Coda and paste in the new IPs, the VPS will be booted and ready to connect.&lt;/p&gt;

&lt;p&gt;To make things a bit more automated, I run the script from a workflow in the &lt;a href=&quot;https://appsto.re/us/2IzJ2&quot;&gt;Workflow&lt;/a&gt; app; here is a screenshot of the workflow I use:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/gregr/weblog/assets/uploads/2016/01/image.jpeg&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It’s quite simple - it just runs the Pythonista script, sending “workflow://” as the return URL, and then opens Coda, with the new IP address on the clipboard ready to paste into your site configuration. I add a shortcut to the workflow to my home screen, and I can spin up a new node with literally one tap. But if you want to, you could do the equivalent without using Workflow at all in this case.&lt;/p&gt;

&lt;p&gt;We can also delete the node when we’re done, using another script; &lt;strong&gt;be careful&lt;/strong&gt; with this one, and make sure you completely understand what it’s doing before you run it - if it finds a node called dev01 in the Dev group, it will delete it without confirmation:&lt;/p&gt;

&lt;noscript&gt;&lt;a href=&quot;https://gist.github.com/0a4f2b0a64b7c5b13a48#file-delete_node-py&quot;&gt;https://gist.github.com/0a4f2b0a64b7c5b13a48#file-delete_node-py&lt;/a&gt;&lt;/noscript&gt;
&lt;script src=&quot;https://gist.github.com/0a4f2b0a64b7c5b13a48.js?file=delete_node.py&quot;&gt; &lt;/script&gt;

&lt;p&gt;Using these scripts and the apps I’ve mentioned, I’ve found development on the iPad Pro (with a keyboard) can be quite similar to the equivalent on a desktop.&lt;/p&gt;
</description>
        <pubDate>Mon, 25 Jan 2016 15:20:26 -0700</pubDate>
        <link>https://www.rassoc.com/gregr/weblog/2016/01/25/web-development-with-ipad-pro/</link>
        <guid isPermaLink="true">https://www.rassoc.com/gregr/weblog/2016/01/25/web-development-with-ipad-pro/</guid>
        
        <category>ipad</category>
        
        <category>ipad-pro</category>
        
        <category>linode</category>
        
        <category>vps</category>
        
        <category>pythonista</category>
        
        <category>coda</category>
        
        <category>workflow</category>
        
        
        <category>development</category>
        
      </item>
    
      <item>
        <title>Using Working Copy with 1Writer on iPad Pro</title>
        <description>&lt;p&gt;Over the last month or so, I’ve been doing development and other work with a new &lt;a href=&quot;http://www.apple.com/ipad-pro/&quot;&gt;iPad Pro&lt;/a&gt;, and the &lt;a href=&quot;http://www.apple.com/smart-keyboard/&quot;&gt;smart keyboard&lt;/a&gt;. I sometimes get incredulous looks from people when I tell them about this, so I thought I’d write about some of the things I’ve been doing. First up, editing markdown files in a Github repository.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://workingcopyapp.com/&quot;&gt;Working Copy&lt;/a&gt; (&lt;a href=&quot;https://appsto.re/us/xONC1&quot; target=&quot;_blank&quot;&gt;app store&lt;/a&gt;) is one of those apps that seems to fly below the radar - but it’s by far the best git client I’ve found for iOS. It’s free to try, with a in-app purchase to unlock certain features like the ability to push changes to a remote repository. But my favorite part is the way it implements a document provider, allowing you to edit files in your repo with other applications. So here, I’ll show you how to edit markdown files in your repo using another great app, &lt;a href=&quot;http://1writerapp.com/&quot;&gt;1Writer&lt;/a&gt; (&lt;a href=&quot;https://appsto.re/us/GjYJO&quot; target=&quot;_blank&quot;&gt;app store&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;First, you need to clone your repository into Working Copy. Once you have it down, it will look something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/gregr/weblog/assets/uploads/2016/01/img_0021.png&quot;&gt;&lt;img src=&quot;/gregr/weblog/assets/uploads/2016/01/img_0021-1024x768.png&quot; alt=&quot;img_0021&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here, this repository is a set of API documentation that I want to edit. Now, we could edit this right here within Working Copy, but instead we will use 1Writer. Open 1Writer, and click the “+” button in the lower right corner:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/gregr/weblog/assets/uploads/2016/01/img_0022.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The first time you do this, you’ll notice Working Copy isn’t in the list. Click “More”, and you’ll be able to enable it:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/gregr/weblog/assets/uploads/2016/01/img_0023.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;After you get it enabled, you’ll see it in the list:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/gregr/weblog/assets/uploads/2016/01/img_0024.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now tap Working Copy, and you’ll see a list of documents you can open from the repository:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/gregr/weblog/assets/uploads/2016/01/img_0025.png&quot;&gt;&lt;img src=&quot;/gregr/weblog/assets/uploads/2016/01/img_0025-1024x768.png&quot; alt=&quot;img_0025&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pick the document you want (we’ll edit the README.md as an example), and make your edits.&lt;/p&gt;

&lt;p&gt;When you’re done editing, go back to Working Copy:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/gregr/weblog/assets/uploads/2016/01/img_0026.png&quot;&gt;&lt;img src=&quot;/gregr/weblog/assets/uploads/2016/01/img_0026-1024x768.png&quot; alt=&quot;img_0026&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You’ll see on the left that README.md is modified, and if you tap on it, you can see the changes that were made. When you’re ready, you can click “Commit” to commit the changes you’ve made, and then push to remote repository if you need to.&lt;/p&gt;
</description>
        <pubDate>Fri, 15 Jan 2016 11:11:36 -0700</pubDate>
        <link>https://www.rassoc.com/gregr/weblog/2016/01/15/using-working-copy-with-1writer-on-ipad-pro/</link>
        <guid isPermaLink="true">https://www.rassoc.com/gregr/weblog/2016/01/15/using-working-copy-with-1writer-on-ipad-pro/</guid>
        
        <category>ipad</category>
        
        <category>1writer</category>
        
        <category>working-copy</category>
        
        <category>ipad-pro</category>
        
        <category>iOS</category>
        
        
        <category>development</category>
        
      </item>
    
      <item>
        <title>Zero to PostgreSQL streaming replication in 10 mins</title>
        <description>&lt;p&gt;I’ve found a number of articles on the web for setting up streaming replication in PostgreSQL, but none of them seemed to actually put everything together that I needed, and none of them seemed to use the new &lt;a href=&quot;http://www.postgresql.org/docs/9.2/static/app-pgbasebackup.html&quot;&gt;pg_basebackup&lt;/a&gt; in PostgreSQL 9.1 and later. So with that in mind, here are a set of steps you can use to set up streaming replication, over the internet if you wish, using an encrypted SSL connection. We’re not going to set up log archiving - we’re going to rely solely on the streaming replication for now.&lt;/p&gt;

&lt;p&gt;I’m assuming you have a master server set up on Ubuntu 10.04 or 12.04, running PostgreSQL 9.2.x, and you have a new slave server set up on the same OS and pg version. The IP of the master is 1.2.3.4, and the IP of the slave is 5.6.7.8.&lt;/p&gt;

&lt;p&gt;First, create the replication user on the master:&lt;/p&gt;

&lt;noscript&gt;&lt;a href=&quot;https://gist.github.com/4968619#file-user-sh&quot;&gt;https://gist.github.com/4968619#file-user-sh&lt;/a&gt;&lt;/noscript&gt;
&lt;script src=&quot;https://gist.github.com/4968619.js?file=user.sh&quot;&gt; &lt;/script&gt;

&lt;p&gt;Note that we are using REPLICATION permissions, rather than creating a superuser.&lt;/p&gt;

&lt;p&gt;Next, configure the master for streaming replication. Edit postgresql.conf (on Ubuntu, this is at /etc/postgresql/9.2/main/postgresql.conf):&lt;/p&gt;

&lt;noscript&gt;&lt;a href=&quot;https://gist.github.com/4968619#file-master_postgresql-conf&quot;&gt;https://gist.github.com/4968619#file-master_postgresql-conf&lt;/a&gt;&lt;/noscript&gt;
&lt;script src=&quot;https://gist.github.com/4968619.js?file=master_postgresql.conf&quot;&gt; &lt;/script&gt;

&lt;p&gt;We’re configuring 8 WAL segments here; each is 16MB. If you expect your database to have more than 128MB of changes in the time it will take to make a copy of it across the network to your slave, or in the time you expect your slave to be down for maintenance or something, then consider increasing those values.&lt;/p&gt;

&lt;p&gt;Then edit the access control on the master to allow the connection from the slave; in pg_hba.conf (/etc/postgresql/9.2/main/pg_hba.conf on Ubuntu):&lt;/p&gt;

&lt;noscript&gt;&lt;a href=&quot;https://gist.github.com/4968619#file-master_pg_hba-conf&quot;&gt;https://gist.github.com/4968619#file-master_pg_hba-conf&lt;/a&gt;&lt;/noscript&gt;
&lt;script src=&quot;https://gist.github.com/4968619.js?file=master_pg_hba.conf&quot;&gt; &lt;/script&gt;

&lt;p&gt;In this case, 5.6.7.8 is the IP address of the slave that will be connecting for replication, and hostssl means this host can only connect via SSL.&lt;/p&gt;

&lt;p&gt;You’ll need to restart the master after making the above changes.&lt;/p&gt;

&lt;p&gt;Now on to the slave. In the slave’s postgresql.conf, add the following:&lt;/p&gt;

&lt;noscript&gt;&lt;a href=&quot;https://gist.github.com/4968619#file-slave_postgresql-conf&quot;&gt;https://gist.github.com/4968619#file-slave_postgresql-conf&lt;/a&gt;&lt;/noscript&gt;
&lt;script src=&quot;https://gist.github.com/4968619.js?file=slave_postgresql.conf&quot;&gt; &lt;/script&gt;

&lt;p&gt;Then restart the slave. No changes are required in the slave’s pg_hba.conf specifically to support replication. You’ll still need to make whatever entries you need in order to connect to it from your application and run queries, if you wish.&lt;/p&gt;

&lt;p&gt;That’s all the initial setup we need to do. After you’ve done the above configuration, running the following script on the slave will copy the database over and begin replication (1.2.3.4 is the IP of the master):&lt;/p&gt;

&lt;noscript&gt;&lt;a href=&quot;https://gist.github.com/4968619#file-start_replication-sh&quot;&gt;https://gist.github.com/4968619#file-start_replication-sh&lt;/a&gt;&lt;/noscript&gt;
&lt;script src=&quot;https://gist.github.com/4968619.js?file=start_replication.sh&quot;&gt; &lt;/script&gt;

&lt;p&gt;That script will stop the slave, delete the old slave cluster directory, run pg_basebackup connecting to the master to copy over the databases (you’ll see the progress as it goes), create a new recovery.conf file, and start the slave. If you look at the logs after this script completes, you should hopefully see messages about it having reached a consistent recovery state.&lt;/p&gt;

&lt;p&gt;Be careful - that script is going to delete the old database cluster on your slave, so make sure to read through it and understand what it’s doing.&lt;/p&gt;

&lt;p&gt;At this point, you can try writing data to the master database, and you should see it mirrored over to the slave. To check the replication status, you can run the following on the master:&lt;/p&gt;

&lt;noscript&gt;&lt;a href=&quot;https://gist.github.com/4968619#file-status-sh&quot;&gt;https://gist.github.com/4968619#file-status-sh&lt;/a&gt;&lt;/noscript&gt;
&lt;script src=&quot;https://gist.github.com/4968619.js?file=status.sh&quot;&gt; &lt;/script&gt;

&lt;p&gt;If you found this guide handy, you might also find the &lt;a href=&quot;https://www.amazon.com/PostgreSQL-9-High-Availability-Cookbook/dp/1849516960/&quot;&gt;PostgreSQL 9 High Availability Cookbook&lt;/a&gt; useful as well!&lt;/p&gt;
</description>
        <pubDate>Sat, 16 Feb 2013 14:10:04 -0700</pubDate>
        <link>https://www.rassoc.com/gregr/weblog/2013/02/16/zero-to-postgresql-streaming-replication-in-10-mins/</link>
        <guid isPermaLink="true">https://www.rassoc.com/gregr/weblog/2013/02/16/zero-to-postgresql-streaming-replication-in-10-mins/</guid>
        
        <category>postgresql</category>
        
        <category>postgres</category>
        
        <category>replication</category>
        
        <category>streaming-replication</category>
        
        
        <category>development</category>
        
      </item>
    
      <item>
        <title>No one is &quot;forced&quot; into piracy</title>
        <description>&lt;p&gt;&lt;a href=&quot;http://www.thedailybeast.com/articles/2012/11/28/why-are-cable-companies-forcing-people-to-turn-to-piracy.html&quot;&gt;No one is “forced” into piracy&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;[…] if piracy is actually wrong, it doesn’t get less wrong simply because you can’t have the product exactly when and where you want it at a price you wish to pay.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This. Just because you can’t find the content you want in the form you’d like to have it, doesn’t mean it’s ok to steal it. [via &lt;a href=&quot;http://www.marco.org/2012/11/29/forcing-people-into-piracy&quot;&gt;Marco&lt;/a&gt;]&lt;/p&gt;
</description>
        <pubDate>Thu, 29 Nov 2012 10:42:26 -0700</pubDate>
        <link>https://www.rassoc.com/gregr/weblog/2012/11/29/no-one-is-forced-into-piracy/</link>
        <guid isPermaLink="true">https://www.rassoc.com/gregr/weblog/2012/11/29/no-one-is-forced-into-piracy/</guid>
        
        
        <category>internet</category>
        
      </item>
    
      <item>
        <title>Letterpress</title>
        <description>&lt;p&gt;&lt;a href=&quot;https://itunes.apple.com/us/app/letterpress-word-game/id526619424?mt=8&quot;&gt;Letterpress&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A new word game from Loren Brichter (of Tweetie fame). If you love casual games, and you’re tired of Words with Friends, Letterpress is a lot of fun!&lt;/p&gt;
</description>
        <pubDate>Wed, 24 Oct 2012 16:25:45 -0600</pubDate>
        <link>https://www.rassoc.com/gregr/weblog/2012/10/24/letterpress/</link>
        <guid isPermaLink="true">https://www.rassoc.com/gregr/weblog/2012/10/24/letterpress/</guid>
        
        
        <category>apps</category>
        
      </item>
    
      <item>
        <title>Car fox at 90,000 feet</title>
        <description>&lt;iframe class=&quot;embed-video&quot; loading=&quot;lazy&quot; src=&quot;https://www.youtube.com/embed/Vj3MRLqDOVY&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;I love stuff like this. Even more, I love that for under a few thousand dollars, anyone can take video that shows the curvature of the earth.&lt;/p&gt;

&lt;p&gt;[via &lt;a href=&quot;http://www.autoblog.com/2012/10/17/carfax-sends-car-fox-into-orbit-no-vehicle-history-report-avail/?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+weblogsinc%2Fautoblog+%28Autoblog%29&quot;&gt;Autoblog&lt;/a&gt;]&lt;/p&gt;
</description>
        <pubDate>Thu, 18 Oct 2012 15:41:49 -0600</pubDate>
        <link>https://www.rassoc.com/gregr/weblog/2012/10/18/car-fox-at-90000-feet/</link>
        <guid isPermaLink="true">https://www.rassoc.com/gregr/weblog/2012/10/18/car-fox-at-90000-feet/</guid>
        
        
        <category>video</category>
        
      </item>
    
  </channel>
</rss>