<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Command-Tab</title>
    <link href="https://command-tab.org/feed.xml" rel="self" type="application/atom+xml"/>
    <link href="https://command-tab.org/"/>
    <id>https://command-tab.org/feed.xml</id>
    <updated>2022-04-24T00:00:00Z</updated>
    <author><name>Collin Allen</name></author>

    <entry>
        <title>Running Nuxt 3 Behind an nginx Reverse Proxy</title>
        <link href="https://command-tab.org/2022/04/24/running-nuxt-3-behind-an-nginx-reverse-proxy/"/>
        <id>tag:command-tab.org,2022-04-24:running-nuxt-3-behind-an-nginx-reverse-proxy</id>
        <published>2022-04-24T00:00:00Z</published>
        <updated>2022-04-24T00:00:00Z</updated>
        <content type="html">&lt;p&gt;I was attempting to run &lt;a href=&#34;https://github.com/nuxt/framework&#34;&gt;Nuxt 3&lt;/a&gt; RC1 in development mode behind a local nginx reverse proxy, but ran into several issues. There are a number of reasons to run a development application server behind a &lt;a href=&#34;https://en.wikipedia.org/wiki/TLS_termination_proxy&#34;&gt;TLS-terminating reverse proxy&lt;/a&gt;, including more closely mirroring a production setup, ensuring an application performs correctly when proxied, and gaining HTTPS support to enable use of  newer &lt;a href=&#34;https://www.digicert.com/blog/https-only-features-in-browsers&#34;&gt;HTTPS-only user-agent APIs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;However, when nginx reverse proxies to the Nuxt server using a configuration like the following, the application will load correctly in the browser but &lt;a href=&#34;https://vitejs.dev&#34;&gt;Vite&lt;/a&gt; (bundled with Nuxt) will no longer be able connect to its backend websocket server to provide hot module replacement (HMR).&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To fix this, Vite needs to be made aware it&#39;s being reverse proxied, and nginx needs to pass through Vite&#39;s websocket connection.&lt;/p&gt;
&lt;p&gt;In the Nuxt config (&lt;code&gt;nuxt.config.ts&lt;/code&gt;), add the following Vite config:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vite: {
  server: {
    hmr: {
      protocol: &#39;wss&#39;,
      clientPort: 443,
      path: &#39;hmr/&#39;
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Vite will now use the secure websocket protocol over the same HTTPS port as the application, but it will request it at a new, distinct path.&lt;/p&gt;
&lt;p&gt;In the nginx config, add a new &lt;code&gt;location&lt;/code&gt; directive to match the configured Vite path (&lt;code&gt;/_nuxt&lt;/code&gt; is always prepended), have it perform an HTTP Upgrade, and then reverse proxy to Vite&#39;s websocket server, which always listens on port 24678:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;location /_nuxt/hmr/ {
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection &amp;quot;Upgrade&amp;quot;;
    proxy_pass http://127.0.0.1:24678;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After restarting the development server and nginx, Nuxt 3 and Vite HMR work great behind nginx, which now handles TLS termination and reverse proxying of HTTP and websocket traffic.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2023-09-28&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As of Nuxt 3.7.4, the &lt;code&gt;nuxt.config.ts&lt;/code&gt; configuration &lt;a href=&#34;https://github.com/nuxt/nuxt/issues/12003#issuecomment-1738373498&#34;&gt;is unnecessary&lt;/a&gt;, though having the following nginx config in place avoids a WebSocket error about the WebSocket host being undefined:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;location /_nuxt/ {
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection &amp;quot;upgrade&amp;quot;;
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
    proxy_pass http://127.0.0.1:3000;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Note the differences from the above config -- the location path dropped &lt;code&gt;hmr/&lt;/code&gt;, the Vite HMR port (&lt;code&gt;24678&lt;/code&gt;) became the default Nuxt port (&lt;code&gt;3000&lt;/code&gt;), and the &lt;code&gt;Host&lt;/code&gt; header was also added (but the &lt;code&gt;Host&lt;/code&gt; header is likely not critical for this scenario).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2026-03-23&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Tangentially related: In development, &lt;a href=&#34;https://nuxt.com/modules/icon&#34;&gt;Nuxt Icon&lt;/a&gt; collections are loaded from the Nuxt server at &lt;code&gt;/api/_nuxt_icon&lt;/code&gt;, but this path might introduce a conflict if you are integrating a completely separate non-Nuxt API at &lt;code&gt;/api&lt;/code&gt;. In my case, I often have a Python API expecting requests bearing that path prefix. My local nginx setup forwards requests with &lt;code&gt;/api&lt;/code&gt; prefixed paths to Python, resulting in a Nuxt 404 on Nuxt Icon collection manifests such as &lt;code&gt;/api/_nuxt_icon/bi.json?icons=escape&lt;/code&gt; or &lt;code&gt;/api/_nuxt_icon/solar.json?icons=check&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Setting a &lt;code&gt;localApiEndpoint&lt;/code&gt; overrides the default value of &lt;code&gt;/api/_nuxt_icon&lt;/code&gt; both in how the Nuxt server route is offered and how the Nuxt client requests the collection JSON. The &lt;a href=&#34;https://github.com/nuxt/icon/issues/185&#34;&gt;issue&lt;/a&gt; and &lt;a href=&#34;https://github.com/nuxt/icon/pull/191&#34;&gt;fix&lt;/a&gt; are both documented on GitHub. In &lt;code&gt;nuxt.config.ts&lt;/code&gt;, add something like the following:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;icon: {
  localApiEndpoint: &#39;/_nuxt_icon&#39;,
},
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Note that &lt;code&gt;/api&lt;/code&gt; is absent from the value of &lt;code&gt;localApiEndpoint&lt;/code&gt;, durecting Nuxt Icon to use a path &lt;em&gt;other than&lt;/em&gt; &lt;code&gt;/api/_nuxt_icon&lt;/code&gt;. Anything that will not be picked up by an external API is valid here, and will make the Nuxt Icon module work again.&lt;/p&gt;</content>
    </entry>

    <entry>
        <title>Building cen64 on macOS</title>
        <link href="https://command-tab.org/2020/01/11/building-cen64-on-macos/"/>
        <id>tag:command-tab.org,2020-01-11:building-cen64-on-macos</id>
        <published>2020-01-11T00:00:00Z</published>
        <updated>2020-01-11T00:00:00Z</updated>
        <content type="html">&lt;p&gt;For testing Nintendo 64 homebrew ROMs, &lt;a href=&#34;https://github.com/n64dev/cen64&#34;&gt;cen64&lt;/a&gt; is the most accurate emulator (though it doesn&#39;t run at full speed yet). Here&#39;s how to build it from source on macOS:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install XQuartz from the official &lt;a href=&#34;https://www.xquartz.org/&#34;&gt;distributed disk image&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;brew install cmake glew&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git clone https://github.com/n64dev/cen64.git&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd cen64&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mkdir build&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd build&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cmake ..&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;make&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you&#39;d like to enable cen64&#39;s debug logging, create a debug build when running &lt;code&gt;cmake&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cmake -DCMAKE_BUILD_TYPE=Debug ..
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When running cen64 outside of an XQuartz X11 terminal, it may report:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Using NTSC-U PIFROM
create_device: Failed to initialize the VI.
Failed to create a device.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To fix this, you can run it within an XQuartz X11 terminal, or set the &lt;code&gt;DISPLAY&lt;/code&gt; environment variable to something like &lt;code&gt;:0&lt;/code&gt; either in your &lt;code&gt;.bashrc&lt;/code&gt; file or inline during invocation:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;DISPLAY=:0 ./cen64 /path/to/pifdata.bin /path/to/rom.z64
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;DISPLAY&lt;/code&gt; needs to be set because cen64 calls &lt;a href=&#34;https://tronche.com/gui/x/xlib/display/opening.html&#34;&gt;XOpenDisplay&lt;/a&gt; with a NULL display name (presumably to default to your &lt;code&gt;DISPLAY&lt;/code&gt; environment variable), but if it&#39;s not set, XOpenDisplay returns NULL and cen64 has no display within which to create a window for rendering Nintendo 64 content.&lt;/p&gt;
&lt;p&gt;For extremely verbose register-level output, edit &lt;code&gt;CMakeLists.txt&lt;/code&gt; and set &lt;code&gt;DEBUG_MMIO_REGISTER_ACCESS&lt;/code&gt; to &lt;code&gt;ON&lt;/code&gt;. Make sure to remove any cached data in &lt;code&gt;build/&lt;/code&gt; to ensure your changes are reflected, then recompile and re-run.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2024-03-02&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Development on cen64 has not progressed in many months and is now considered unmaintained. &lt;a href=&#34;https://ares-emu.net&#34;&gt;ares&lt;/a&gt;, a cross-platform, open source, multi-system emulator is now regarded as the best emulator for Nintendo 64 development.&lt;/p&gt;</content>
    </entry>

    <entry>
        <title>BrewBot - Sending Coffee Notifications to Slack</title>
        <link href="https://command-tab.org/2017/09/16/brewbot-sending-coffee-notifications-to-slack/"/>
        <id>tag:command-tab.org,2017-09-16:brewbot-sending-coffee-notifications-to-slack</id>
        <published>2017-09-16T00:00:00Z</published>
        <updated>2017-09-16T00:00:00Z</updated>
        <content type="html">&lt;p&gt;At work, we have a coffee machine that serves dozens of people in the building, and it&#39;s difficult to know when to come get fresh coffee. You might arrive when it&#39;s empty and be tasked with making more, but the ideal situation is to arrive just as a fresh pot is being brewed.&lt;/p&gt;
&lt;p&gt;We also use Slack for team chat and various notifications, so integrating the coffee machine status was a no-brainer. Using a non-invasive/inductive current sensor and Raspberry Pi, the following setup monitors coffee machine energy consumption and waits for a significant rise in current draw, followed by several minutes of sustained usage. Once a time threshold has passed, it does an HTTP POST to a Slack webhook, sleeps for about 15 minutes, then starts monitoring again. This &#34;brewbot&#34; code is &lt;a href=&#34;https://github.com/command-tab/brewbot&#34;&gt;available on GitHub&lt;/a&gt;, and a parts list can be found below.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Completed kit&#34; src=&#34;https://r2.command-tab.com/brewbot_full_kit.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Packaged in box&#34; src=&#34;https://r2.command-tab.com/brewbot_box.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;ADC board&#34; src=&#34;https://r2.command-tab.com/brewbot_adc_board.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Full parts list:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://www.adafruit.com/products/856&#34;&gt;MCP3008 8-Channel 10-Bit Analog to Digital Converter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.adafruit.com/products/998&#34;&gt;Raspberry Pi model B&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.adafruit.com/products/2203&#34;&gt;16-pin IC socket&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.adafruit.com/products/344&#34;&gt;Assortment of heat shrink tubing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.adafruit.com/products/937&#34;&gt;Panel mount to Micro USB adapter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.sparkfun.com/products/11508&#34;&gt;10KΩ 1/4W LED resistor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.adafruit.com/products/1148&#34;&gt;Half-size Perma-Proto Raspberry Pi Breadboard PCB Kit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.sparkfun.com/products/9594&#34;&gt;5mm Yellow LED&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;1/8&#34; panel mount audio jack&lt;/li&gt;
&lt;li&gt;10uF electrolytic decoupling capacitor&lt;/li&gt;
&lt;li&gt;33Ω 1/2W burden resistor&lt;/li&gt;
&lt;li&gt;2x 470KΩ 1/2W voltage divider resistors&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.sparkfun.com/products/11005&#34;&gt;30A non-invasive current sensor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.sparkfun.com/products/11367&#34;&gt;22 AWG Solid Core Hook Up Wire&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;5x7 photo box, from The Container Store&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/B00B588HY2&#34;&gt;8 GB Class 10 SDHC card&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.amazon.com/dp/B005CLMJLU&#34;&gt;Edimax EW-7811Un Wireless Nano USB Adapter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;6x Nylon screws washers and nuts&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.monoprice.com/Product?p_id=8617&#34;&gt;8&#34; AC Cord Clips&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.monoprice.com/Product?c_id=102&amp;amp;cp_id=10242&amp;amp;cs_id=1024201&amp;amp;p_id=3645&amp;amp;seq=1&amp;amp;format=2&#34;&gt;HDMI to Mini HDMI adapter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.monoprice.com/Product?c_id=104&amp;amp;cp_id=10419&amp;amp;cs_id=1041909&amp;amp;p_id=3654&amp;amp;seq=1&amp;amp;format=2&#34;&gt;6&#39; Mini HDMI to HDMI Cable&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.acehardware.com/product/index.jsp?productId=29313236&#34;&gt;10&#39; USB A Male to B Male Cable&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Related reading: &lt;a href=&#34;https://en.wikipedia.org/wiki/Hyper_Text_Coffee_Pot_Control_Protocol&#34;&gt;Hyper Text Coffee Pot Control Protocol&lt;/a&gt;&lt;/p&gt;</content>
    </entry>

    <entry>
        <title>GottaGo</title>
        <link href="https://command-tab.org/2013/07/23/gottago/"/>
        <id>tag:command-tab.org,2013-07-23:gottago</id>
        <published>2013-07-23T00:00:00Z</published>
        <updated>2013-07-23T00:00:00Z</updated>
        <content type="html">&lt;p&gt;Working at &lt;a href=&#34;http://www.blackboard.com/mobile-learning/index.aspx&#34;&gt;Blackboard Mobile&lt;/a&gt; making unique mobile apps is fun, but occasionally it&#39;s interesting to do something completely different at work, just to see what you can come up with. To that end, we recently hosted our first Hackathon, where small teams of co-workers had 24 straight hours to create a project of any theme using resources available inside our outside of the office, and the results would be judged by our peers. One of the other benefits of working in a growing industry is that we&#39;re expanding our staff almost weekly. Unfortunately, though, that means that the building we&#39;re in is less and less able to handle the increasing capacity. Specifically, the bathrooms are occupied more frequently, resulting in either a return trip to your desk only to try again later, or an awkward wait of unknown duration.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;header&#34; src=&#34;https://r2.command-tab.com/gottago_header.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Working with &lt;a href=&#34;https://twitter.com/JMT3&#34;&gt;Joe Taylor&lt;/a&gt; and &lt;a href=&#34;https://twitter.com/eclittlejohn&#34;&gt;Eric Littlejohn&lt;/a&gt;, our Hackathon project set out to make the office bathroom availability more visible and accessible through a combination of hardware and software. The piece of the project that lets this all work is a microswitch installed inside each door jamb, such that when the locking bolt is engaged, the switch is tripped. That way, we can do anything with resulting data, knowing that when the door is locked, the room is in use. Running wire down through the hollow metal trim was tedious and time consuming, and involved a lot of false starts and fishing around with a straightened coat hanger, but we finally got a run of wire inside each frame.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;door switch&#34; src=&#34;https://r2.command-tab.com/gottago_switch.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;On each office floor there are two bathrooms side by side, and the pair of switches inside the door jambs are wired to a single &lt;a href=&#34;http://arduino.cc/&#34;&gt;Arduino&lt;/a&gt; fitted with an &lt;a href=&#34;http://arduino.cc/en/Main/ArduinoEthernetShield&#34;&gt;Ethernet Shield&lt;/a&gt; for network connectivity. The Arduino samples the switches many times per second, providing near-instant feedback.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;arduinno board&#34; src=&#34;https://r2.command-tab.com/gottago_arduino.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;After &lt;a href=&#34;http://www.labbookpages.co.uk/electronics/debounce.html&#34;&gt;debouncing&lt;/a&gt; the switch input signal over about 50 milliseconds, the Arduino waits for a definitive change in state -- from locked to unlocked, or unlocked to locked -- before illuminating LED lights on the wall.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;wall lights&#34; src=&#34;https://r2.command-tab.com/gottago_lights.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;After the light corresponding to the now-occupied bathroom is lit, the Arduino also performs an HTTP POST, sending the event details (floor level, which room, and current occupancy state) to an in-house webserver running Node.js and MongoDB. The webserver records the data and makes it visible on a web page for viewers to check the availability digitally, for those who can&#39;t see the wall mounted lights from their seating position.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;event sequence animation&#34; src=&#34;https://r2.command-tab.com/gottago.gif&#34; /&gt;&lt;/p&gt;
&lt;p&gt;If you&#39;d like to employ a project like this, the code we hacked together is &lt;a href=&#34;https://github.com/BbMobile/GottaGo&#34;&gt;available on GitHub&lt;/a&gt;, and the wiring is rather straightforward:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;All components share a common ground&lt;/li&gt;
&lt;li&gt;LED anodes are wired to &lt;code&gt;room_a_led_pin&lt;/code&gt; and &lt;code&gt;room_b_led_pin&lt;/code&gt; and brought high when doors are locked, and low when unlocked&lt;/li&gt;
&lt;li&gt;Switches bring &lt;code&gt;room_a_switch_pin&lt;/code&gt; and &lt;code&gt;room_b_switch_pin&lt;/code&gt; low when triggered, and the Arduino uses the &lt;code&gt;INPUT_PULLUP&lt;/code&gt; pinMode for the unlocked state&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Our Hackathon project came in at second place, losing to an as-yet-unannounced software project, but we had a lot of fun staying up and hacking all night!&lt;/p&gt;</content>
    </entry>

    <entry>
        <title>Adventures with Nest</title>
        <link href="https://command-tab.org/2013/06/06/adventures-with-nest/"/>
        <id>tag:command-tab.org,2013-06-06:adventures-with-nest</id>
        <published>2013-06-06T00:00:00Z</published>
        <updated>2013-06-06T00:00:00Z</updated>
        <content type="html">&lt;p&gt;I recently purchased a pair of &lt;a href=&#34;https://nest.com&#34;&gt;Nest Learning Thermostats&lt;/a&gt; for my new home. Compared to the white brick style Honeywell thermostats that came with the place, the Nest is so much more advanced. It does temperature learning, auto-away, and remote control over Wi-Fi from the web and iOS devices. It also has a color LCD and just generally looks beautiful on the wall with its brushed stainless steel housing.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;nest thermostat&#34; src=&#34;https://r2.command-tab.com/nest.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Installing the Nest is pretty straightforward with a modern forced air heating and cooling system:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Remove the old thermostat and mounting plate from the wall&lt;/li&gt;
&lt;li&gt;Disconnect the wires&lt;/li&gt;
&lt;li&gt;Patch and paint any holes&lt;/li&gt;
&lt;li&gt;Install the Nest mounting base and connect the wires&lt;/li&gt;
&lt;li&gt;Pop the Nest onto the base and configure the software&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My initial install went well physically, but not long after, I discovered that the Nest would regularly run out of battery power. I quickly learned that due to how the HVAC circuits are arranged, the Nest can only draw power while the system is running. When the system is not busy heating, cooling, or running the fan, the Nest is left to run under its own battery power. And in sunny California during the springtime, the system doesn&#39;t run often enough to let the Nest keep a charge. Several times per day, I would have to unplug the Nest from its base and charge it over micro USB. Not a great solution.&lt;/p&gt;
&lt;p&gt;Reading more about the Nest and HVAC circuitry, I found that there is a solution for situations like this. A &#34;common wire&#34; that provides a path back to the HVAC controller would allow the Nest to draw the power it needs while not running any systems. As luck would have it, my system provided this common wire, but connecting it to the Nest had no effect on the battery. More telling was the fact that the Nest did not detect that the wire was connected.&lt;/p&gt;
&lt;p&gt;So, I decided to find out what was at the other end of that common wire. I put up a ladder and ventured into the attic of my home and scouted around the furnace. On top of it, inside an easily-opened metal enclosure, was the thermostat controller, a ZTech ZTE2S. Double checking the &lt;a href=&#34;https://r2.command-tab.com/zte2s_wiring.pdf&#34;&gt;wiring diagram&lt;/a&gt; and comparing it with the wires on the left (coming from the Nests), it&#39;s clear that the blue common wire is simply not connected to the controller. In the photo below, you can see that it&#39;s clipped short, close to the brown jacket covering the bundle of five wires.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;wiring before with blue wire disconnected&#34; src=&#34;https://r2.command-tab.com/nest_before.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Reconnecting the wire was a matter of disconnecting the wires that were already connected, snipping them all to the same length, and stripping a little plastic off the end so that all five can be connected to the HVAC controller.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;wiring after with blue wire connected&#34; src=&#34;https://r2.command-tab.com/nest_after.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;A few hours after leaving the Nest installed with the common wire attached and the HVAC controller all closed up, its battery has fully charged and the features work great.&lt;/p&gt;</content>
    </entry>

    <entry>
        <title>Simulating Slow Internet for iOS Testing</title>
        <link href="https://command-tab.org/2011/05/12/simulating-slow-internet-for-ios-testing/"/>
        <id>tag:command-tab.org,2011-05-12:simulating-slow-internet-for-ios-testing</id>
        <published>2011-05-12T00:00:00Z</published>
        <updated>2011-05-12T00:00:00Z</updated>
        <content type="html">&lt;p&gt;Apple&#39;s iOS Simulator is an acceptable environment for testing development code, but when users purchase your finished app from the App Store, they&#39;ll be running it on real hardware, particularly on networks that are likely much less reliable than your home or office internet.&lt;/p&gt;
&lt;p&gt;To ensure your app performs well under real-world conditions, you can load up the code on a device and go outside, but then you can&#39;t debug as easily. And even if you bring your MacBook Air with you, what if your Verizon iPhone is everything you hoped, and it performs admirably on the worst of days? To get around all of this, you can approximate an unreliable network with &lt;a href=&#34;http://mschrag.github.com&#34;&gt;SpeedLimit&lt;/a&gt;. SpeedLimit is a System Preferences pane for intentionally and selectively slowing down specific ports and domains.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;speedlimit window&#34; src=&#34;https://r2.command-tab.com/speedlimit.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Download and install SpeedLimit, add one or more hosts (separated by commas, as seen above), select a target speed, and click Slow Down. Subsequent network requests matching the criteria you set will be throttled, giving you time to go all out testing your app&#39;s performance and error handling. Does it crash when users hit the Back button while a UITableView is loading? Does it lock the UI while downloading avatars or thumbnails? SpeedLimit lets you find out, and be confident in your networking code.&lt;/p&gt;</content>
    </entry>

    <entry>
        <title>How to Find the Right Windows Driver</title>
        <link href="https://command-tab.org/2009/09/14/how-to-find-the-right-windows-driver/"/>
        <id>tag:command-tab.org,2009-09-14:how-to-find-the-right-windows-driver</id>
        <published>2009-09-14T00:00:00Z</published>
        <updated>2009-09-14T00:00:00Z</updated>
        <content type="html">&lt;p&gt;When setting up a new Windows machine, whether it&#39;s Windows 2000 all the way up through Windows 7, you&#39;ll occasionally run into an issue where you need drivers for a system or PCI device that you just can&#39;t seem to find. To make matters worse, you don&#39;t know which company made the device, so you don&#39;t even know where to start looking for drivers. Should you go to Dell&#39;s site? The motherboard manufacturer? Persistent &#34;Unknown device&#34; entries in the Windows Device Manager are a plague upon even the most seasoned techs. Here&#39;s a tip to get your driver hunt moving in the right direction.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Find Out Who Made the Device&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Figuring out which company made the device(s) in question is the first step towards getting it working. Start by opening the Windows Device Manager. My preferred quick way of doing this is clicking Start, Run, type &lt;code&gt;devmgmt.msc&lt;/code&gt;, and pressing Enter. Once there, choose the device in question and right click it, and select Properties. Select the Details tab to see something like the view below:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;windows device manager&#34; src=&#34;https://r2.command-tab.com/windows_device_manager.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Note the PCI &lt;code&gt;VEN&lt;/code&gt; and &lt;code&gt;DEV&lt;/code&gt; 4-character identifiers. PCI, USB, and many other system devices have Vendor and Device IDs. The Vendor ID is specific to the manufacturer, like Broadcom or nVIDIA. The Device ID is specific to the particular make or model of device you have. These are expressed in hexadecimal (0 through 9 plus A through F), so don&#39;t be surprised to see letters there, as well. Some common Vendor IDs are &lt;code&gt;8080&lt;/code&gt; and &lt;code&gt;8086&lt;/code&gt; for Intel, &lt;code&gt;0A5C&lt;/code&gt; for Broadcom, &lt;code&gt;10DE&lt;/code&gt; for nVIDIA, &lt;code&gt;1002&lt;/code&gt; for ATI, and &lt;a href=&#34;http://www.pcidatabase.com/reports.php?type=tab-delimeted&#34;&gt;many more&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Look Up Vendor and Device IDs&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A common way to express both the Vendor and Device IDs in a single string is 1022:2000, Vendor ID first. Combine your Vendor and Device IDs in this manner, and wrap it with quotes: &#34;1022:2000&#34;. Google that, and you should quickly figure out who made your &#34;Unknown device&#34; and what model it is. With this knowledge, you can either find the appropriate driver on your computer manufacturer&#39;s website (Dell makes a good note of which manufacturer&#39;s devices they use for a particular system), or you can visit the device manufacturer&#39;s website directly.&lt;/p&gt;
&lt;p&gt;I hope this information can help those looking to simply get their hardware working under Windows, whether it&#39;s running on a Mac or PC.&lt;/p&gt;</content>
    </entry>

    <entry>
        <title>MacAlly IceKey USB 2.0</title>
        <link href="https://command-tab.org/2009/07/05/macally-icekey-usb-2-0/"/>
        <id>tag:command-tab.org,2009-07-05:macally-icekey-usb-2-0</id>
        <published>2009-07-05T00:00:00Z</published>
        <updated>2009-07-05T00:00:00Z</updated>
        <content type="html">&lt;p&gt;MacAlly has been producing the same IceKey keyboard since 2003, and while it&#39;s a solid performer featuring comfortable low profile scissor keys and extra USB ports, it still ships with a maddeningly slow internal USB 1.1 hub. While this early USB specification is plenty fast for a keyboard alone, it throttles back speeds of all attached devices like flash drives, iPods, and digital cameras. Copying an music album or two can take several minutes over USB 1.1, whereas today&#39;s USB 2.0 takes only seconds. With USB 2.0 as today&#39;s ubiquitous standard and USB 3.0 just around the corner, it&#39;s disappointing that MacAlly has yet to update the IceKey to include a faster hub. Luckily, you can take matters into your own hands. Here&#39;s how to install a high speed hub inside the keyboard while maintaining MacAlly&#39;s elegant factory appearance.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;macally icekey keyboard&#34; src=&#34;https://r2.command-tab.com/macally_icekey_start.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What You&#39;ll Need&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a MacAlly IceKey&lt;/li&gt;
&lt;li&gt;a small, narrow USB hub (a cheap Targus hub worked fine for me)&lt;/li&gt;
&lt;li&gt;a screwdriver set&lt;/li&gt;
&lt;li&gt;a soldering iron, solder, and spare wire&lt;/li&gt;
&lt;li&gt;a pocket knife (I&#39;m not sure any project I&#39;ve done &lt;em&gt;didn&#39;t&lt;/em&gt; require this...)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Open the Hub&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;USB hubs generally aren&#39;t too complicated to open, and this Targus on is no exception. A single screw on the underside holds together the hub&#39;s two plastic halves, which snap apart with little effort. Write a note or take a picture to document the wire colors and order relevant to the orientation of the board inside -- it will come in handy later.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;usb hub board&#34; src=&#34;https://r2.command-tab.com/macally_usb_hub_board.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Open the Keyboard&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The MacAlly IceKey is slightly trickier to get apart, but not much. Remove all the obvious screws on the bottom of the keyboard, including the one under the &#34;Do Not Remove&#34;/Quality Control/Warranty sticker. Then, flip open the pivoting feet to expose two more screws covered by a protective piece of rubber. The final two screws are under the front rubber feet.&lt;/p&gt;
&lt;p&gt;Starting with the keyboard upright and facing you, begin unsnapping the plastic hooks around the perimeter starting at the front middle. A plastic pry tool might come in handy, but isn&#39;t required. Once the top is removed, you can clearly see all the important electronics, including a very common Cypress USB controller chip.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;keyboard controller&#34; src=&#34;https://r2.command-tab.com/macally_keyboard_controller.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;left port&#34; src=&#34;https://r2.command-tab.com/macally_keyboard_leftport.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Test Fit Everything&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Just to make sure the rest of this modification is physically possible, fit the USB hub board in the open space at the top of the keyboard and set the keyboard bezel on top. Luckily, the IceKey has plenty of room to spare. I was planning to have to remove the USB ports from the hub board to make everything fit, but there was so much extra space that I didn&#39;t even have to go to that length.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Unhook the Keyboard&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Carefully pull the keyboard ribbon cables straight away from their matching plugs on the controller board. Gently flip the keyboard pad over, and unscrew the two short ground wires to completely free the keyboard keys from the plastic housing. Set it aside for later; it does not need to be modified -- all the action happens on the two remaining circuit boards. Unscrew both boards to get at the backs of each.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;ribbon cables&#34; src=&#34;https://r2.command-tab.com/macally_keyboard_ribbon_cables.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cut Wires&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cut the gray ribbon that leads from the controller board to the left port. Since that wire only provides USB 1.1 speed, we won&#39;t be using it. You&#39;ll note that it has two extra wires that run to an unpopulated LED on the left board, so we can skip those when doing the re-wiring. (I wonder what MacAlly had in store for that, or if this keyboard is a &#34;port&#34; from another language or something?)&lt;/p&gt;
&lt;p&gt;Unplug the USB cord from the controller board and cut off the connector. This cord needs to run to the input on the new USB hub, and not to the input on the keyboard controller board where it currently connects.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cut Traces&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Since the right port also needs USB 2.0 speeds, it too will need to be disconnected from its USB 1.1 source. However, it is soldered directly onto the controller board and is effectively hard-wired into the slowness. This is perhaps the trickiest part of the whole project: desolder the USB connector and use a knife to scrape away the traces that run to the port. Some are on top of the board, and some are on the bottom. (You might be able to get away with cutting the traces without removing the port, as a little bit of the traces are exposed on the top before routing into electronic components, but you&#39;ll want to test with a multimeter and make sure you&#39;ve done this successfully.) Once all four traces to the port are cut, re-solder the USB port in place (if you removed it).&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;cut traces&#34; src=&#34;https://r2.command-tab.com/macally_usb_traces_cut.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Re-wire the Keyboard Controller and Ports&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Here&#39;s a simple before and after block diagram to help your wiring layout:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;wiring diagram&#34; src=&#34;https://r2.command-tab.com/macally_icekey2_diagram.gif&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solder Keyboard Cord to Hub Input&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Strip about an inch of plastic from the cut end of the keyboard cord to expose its individual wires, and strip just a millimeter or two from each of those. Using your note from earlier, solder the keyboard wires to the matching USB hub input connections. On this Targus hub, the wires were in the same order as the standard &lt;a href=&#34;https://images.google.com/images?q=USB%20pinout&#34;&gt;USB pinout&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solder Keyboard Controller to a Hub Port&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Solder four wires from the keyboard input port (where the cord originally connected to) to one of the USB hub ports, effectively making the keyboard controller into one of four devices on the hub. Previously, the keyboard supplied its own hub, but we&#39;re bypassing it altogether. Luckily, most everything is either color coded or silkscreen labeled on the circuit boards (&lt;code&gt;V/5V&lt;/code&gt; is red, &lt;code&gt;D-&lt;/code&gt; is green, &lt;code&gt;D+&lt;/code&gt; is white, and &lt;code&gt;G/GND&lt;/code&gt; is black).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solder Keyboard USB Ports to Hub Ports&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Solder wire from the left USB port board to another free USB hub port, making sure to get the order correct. With the traces cut on the right port, run wire from the connections under the board to yet another free hub port. You should end up with a hub layout like this:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;hub wires&#34; src=&#34;https://r2.command-tab.com/macally_keyboard_hub_wires.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Test and Close It Up&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;With each new component wired up, double-check your connections and plug it in. Initially, my first test failed and Windows complained about a malfunctioning USB device (I tested it on an old PC, just in case I shorted out the computer&#39;s USB controller. I&#39;d rather fry an old computer than my new iMac!) The key to making everything work properly was to reconnect those two shared ground wires from early on -- the keyboard must have a common ground with the controller and hub!&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;completed wiring&#34; src=&#34;https://r2.command-tab.com/macally_keyboard_test.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Once it works, secure all the wires and boards. I used a few short pieces of electrical tape to stop everything from bouncing around, too. Snap the plastic top back on, replace all the screws, and enjoy your USB 2.0 MacAlly IceKey!&lt;/p&gt;</content>
    </entry>

    <entry>
        <title>Boot Camp Drivers for iMac (Early 2009)</title>
        <link href="https://command-tab.org/2009/06/14/boot-camp-drivers-for-imac-early-2009/"/>
        <id>tag:command-tab.org,2009-06-14:boot-camp-drivers-for-imac-early-2009</id>
        <published>2009-06-14T00:00:00Z</published>
        <updated>2009-06-14T00:00:00Z</updated>
        <content type="html">&lt;p&gt;Apple&#39;s newest iMacs are a fast set of machines and run Windows faster than any PC I&#39;ve ever used, but unfortunately, Apple has yet to update Boot Camp with the required drivers to support the latest and greatest components. Mac OS X ships with the necessary software and works as expected, but Windows XP is met with some trouble. Right away, you&#39;ll notice that your graphics resolution is set to a paltry 800x600, and you have no sound output as well. Here&#39;s how to get those systems working until Apple can provide an &#34;official&#34; fix:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Graphics Drivers&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Visit &lt;a href=&#34;http://www.nvidia.com&#34;&gt;nVidia&lt;/a&gt; and download the &#34;GeForce 9M Series (Notebooks)&#34; driver package, as this is graphics chipset in the Early 2009 iMacs. Run the downloaded setup utility, next-next-nexting your way through the steps, and reboot at the end when prompted. Upon restart, you&#39;ll be able to properly max out your display to the iMac&#39;s native resolution.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Audio Drivers&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Boot Camp 2.1 actually ships with RealTek HD audio drivers, as evidenced by the lack of a yellow exclamation mark for this system in Windows&#39; Device Manager, but they don&#39;t seem to work properly, since there&#39;s no sound output. Visit &lt;a href=&#34;http://www.realtek.com.tw/downloads&#34;&gt;RealTek&lt;/a&gt; and download the &#34;High Definition Audio Codecs&#34; driver package for your OS. In this instance, I downloaded &#34;Windows 2000, Windows XP/2003(32/64 bits) Driver only (Executable file)&#34;, since I&#39;m running Windows XP Pro SP2. Run this setup utility as well, rebooting again when done. After restarting, you should be greeted with Windows&#39; standard login sound, confirming the install worked.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; The Mac OS X 10.6 Snow Leopard disc includes Boot Camp drivers for these iMacs. The Snow Leopard disc is a hybrid image: it provides the Mac OS X installer when viewed under a Mac OS X system, but shows Windows drivers when viewed in Windows. Just run the setup in Windows right off the disc, and you should be set.&lt;/p&gt;</content>
    </entry>

    <entry>
        <title>Dig into iPhone Apps</title>
        <link href="https://command-tab.org/2009/03/22/dig-into-iphone-apps/"/>
        <id>tag:command-tab.org,2009-03-22:dig-into-iphone-apps</id>
        <published>2009-03-22T00:00:00Z</published>
        <updated>2009-03-22T00:00:00Z</updated>
        <content type="html">&lt;p&gt;So you&#39;re curious about the contents of iPhone and iPod Touch apps, including artwork, sounds, and more? Here&#39;s how to dig into an application and see what goodies are hidden inside. Standard copyrights still apply.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sync Your Apps with iTunes&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Assuming you already have the target application on your iPhone or iPod Touch (just &#34;iPhone&#34; from this point forward for brevity&#39;s sake), simply sync your iPhone with your Mac or PC. Doing so will backup your device and transfer any purchased applications in both directions. With the target application now on your computer, navigate to your iTunes &#34;Mobile Applications&#34; folder, where iTunes typically does its own file housekeeping. Under Mac OS X, the default location is &lt;code&gt;/Users/yourname/Music/iTunes/Mobile Applications/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Unzip an App&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Copy your target &lt;code&gt;.ipa&lt;/code&gt;-suffixed application to a different location, ensuring that the original stays in the Mobile Applications folder to keep iTunes happy. To get inside the application, rename its extension to &lt;code&gt;.zip&lt;/code&gt;. Open the zip file, and you will have access to the guts of the app (except the source code, of course).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;High-res App Artwork&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Directly inside the unzipped application folder, you&#39;ll find a file named &lt;code&gt;iTunesArtwork&lt;/code&gt;, with no extension. A hex editor revealed that the file is typically a jpeg image, so rename it to include &lt;code&gt;.jpg&lt;/code&gt; at the end, and you&#39;ll end up with the same 512x512 pixel artwork displayed by iTunes when browsing downloaded Applications. To get at other resources, open up the adjacent &#34;Payload&#34; folder, and you&#39;ll find a &lt;code&gt;.app&lt;/code&gt; file -- the application bundle that runs on the iPhone. Right- or Control-click on the &lt;code&gt;.app&lt;/code&gt;, and choose &#34;Show Package Contents&#34; to open up the bundle.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sounds&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Sounds are typically found among the many resources directly inside the application as files with extensions like &lt;code&gt;.caf&lt;/code&gt;, &lt;code&gt;.mp3&lt;/code&gt;, &lt;code&gt;.aif&lt;/code&gt;, and &lt;code&gt;.m4a&lt;/code&gt;. At this point, the organizational structure is up to the application&#39;s developer, so you may need to look around a little. Leopard&#39;s QuickLook feature is a boon in times like this, helping assess a file&#39;s purpose without opening half a dozen applications.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Other Graphics&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Also nestled inside iPhone applications are many of the graphics used throughout the app. It&#39;s possible that some may be drawn by code, but complex graphics are generally stored as images. However, viewing the images isn&#39;t as easy as renaming the files as before. This will be a bit trickier, as the iPhone works some magic on the images before finishing the app build process, leaving images in an iPhone-optimized state. Fortunately, the process can be reversed with a little bit of Terminal trickery:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Copy all &lt;code&gt;.png&lt;/code&gt; images to a new folder elsewhere. Images of other formats (&lt;code&gt;.jpg&lt;/code&gt;, &lt;code&gt;.gif&lt;/code&gt;, etc.) should be readily viewable.&lt;/li&gt;
&lt;li&gt;Download David Watanabe&#39;s &lt;a href=&#34;http://www.newsfirex.com/blog/?p=176&#34;&gt;modified iPhonePNG&lt;/a&gt; command-line application, unzip the archive, and open up Terminal from your /Applications/Utilities folder.&lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;cd&lt;/code&gt;, then drop the iPhonePNG folder into the Terminal, and tap Return to switch to that folder.&lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;./iPhonePNG&lt;/code&gt;, drop the folder of encoded images into the Terminal, and tap Return to decode the whole folder full of images.&lt;/li&gt;
&lt;li&gt;The output folder sites beside iPhonePNG, so type &lt;code&gt;open .&lt;/code&gt; and tap Return (open space dot) to open the current folder (a dot, in Unix terms) in the Finder. Open the decoded images folder and have a look around!&lt;/li&gt;
&lt;/ol&gt;</content>
    </entry>

    <entry>
        <title>iPod Screen Scratch Removal Revisited</title>
        <link href="https://command-tab.org/2009/01/06/ipod-screen-scratch-removal-revisited/"/>
        <id>tag:command-tab.org,2009-01-06:ipod-screen-scratch-removal-revisited</id>
        <published>2009-01-06T00:00:00Z</published>
        <updated>2009-01-06T00:00:00Z</updated>
        <content type="html">&lt;p&gt;Several years ago, I recommended RadTech&#39;s &lt;a href=&#34;http://www.radtech.us/Products/IceCreme.aspx&#34;&gt;IceCreme&lt;/a&gt; as a great solution for cleaning up your iPod&#39;s scratched-up screen. While I still stand by my results and recommendation, IceCreme isn&#39;t the sort of thing you can find at a nearby store, and is also a little pricey. Removing scratches from iPods and other pocket-bound electronics remains a common problem, so I thought it would be worthwhile to test some of the other available options. Additionally, since nicks and scratches occur on more than just the screen, we&#39;ll also test the solutions elsewhere on an iPod. For this little experiment, I chose three solutions offering varying levels of abrasiveness: Colgate toothpaste, Brasso metal polish, and Easy-Off oven cleaner. All three promise to leave their intended surfaces shiny and clean, and in the case of the latter two, free of scratches. We&#39;ll see how each fares when put to use on both the front plastic and back metal of an iPod.&lt;/p&gt;
&lt;p&gt;To keep things clear, each polish will be used in a masked-off area, hopefully leaving a clear division among the results. The target iPod is an already well-used 4G 20GB iPod, with most of its still working inner parts removed and replaced with padding just to help sustain its form while being polished. Donated to the cause, this iPod will be beat up even further, with even layers of light scratches, heavy scratches, and deep cuts, simluating everything from normal wear to keychain induced destruction. It has surely seen better days, and is now destined for that great Apple Store in the sky, all in the name of science. I started with Brasso first, since it has been recommended many times since my last scratch removal post, both by commenters and firsthand accounts. If you&#39;re attempting this yourself, be sure to work in a well ventilated area, as Brasso smells very strongly of ammonia, and might start to irritate your eyes after a short while!&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;scratched ipod with brasso&#34; src=&#34;https://r2.command-tab.com/scratch_ipod_brasso.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;After only five minutes of polishing, the results were quite good, with nearly all of the light and medium scratches completely removed from the screen area. Deeper cuts remained, though their rough edges were significantly smoother.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;polished ipod with brasso&#34; src=&#34;https://r2.command-tab.com/scratch_ipod_brasso_done.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Toothpaste was next on the list, and while it left the iPod minty fresh with a sparkling shine, its scratch-reducing effects were barely noticeable. Due to its sticky consistency, it was also more difficult to polish with than the more liquid Brasso, yielding poorer results for double the effort -- a total flop. Oven cleaner was last, and I really had no idea what to expect with it. Claiming to leave glassy surfaces shiny and free of scratches, it sounded like a possible winner. As it turns out, it&#39;s not much more than a repackaged kitchen cleaner, resulting in a streak-free but still heavily scratched iPod. I&#39;ll end up cleaning my glass top oven with this one, and nothing else. With the front of the iPod clearly showing Brasso as the top choice, it was time to see what worked best on the scratched metal backing of the iPod.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;ipod with scratched back&#34; src=&#34;https://r2.command-tab.com/scratch_ipod_scratched_back.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Again, after just a few minutes with each polish, Brasso came out on top, while the other two trailed woefully behind. The Brasso-polished back still had quite a few scratches, though far less pronounced than when I started. All of them, including the deep cuts, had a very slick feel, whereas the others still left the surface pretty rough.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;scratch comparison&#34; src=&#34;https://r2.command-tab.com/scratch_back_comparison.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Convinced that Brasso was the right choice, I went back and finished off the front, cleaning up all but the most severe marks on the screen.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;ipod front&#34; src=&#34;https://r2.command-tab.com/scratch_ipod_front.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Given the results of my tests, I can easily recommend Brasso as a great iPod polishing solution that can be had for under $3 at your local stores.&lt;/p&gt;</content>
    </entry>

    <entry>
        <title>Learning Cocoa for the iPhone</title>
        <link href="https://command-tab.org/2008/12/21/learning-cocoa-for-the-iphone/"/>
        <id>tag:command-tab.org,2008-12-21:learning-cocoa-for-the-iphone</id>
        <published>2008-12-21T00:00:00Z</published>
        <updated>2008-12-21T00:00:00Z</updated>
        <content type="html">&lt;p&gt;These last few weeks, I&#39;ve been teaching myself Cocoa to learn what makes Mac OS X and iPhone OS apps tick. While Objective-C is quite a departure from my usual web development world, it has quickly become one of my favorite languages, as it takes care of much of the drudgery of pure C and has plenty of useful frameworks to get your application up and running quickly. Here are some of the best resources I&#39;ve found so far:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://cocoadevcentral.com/&#34;&gt;Cocoa Dev Central&lt;/a&gt; and &lt;a href=&#34;http://www.cocoalab.com/?q=becomeanxcoder&#34;&gt;Become an Xcoder&lt;/a&gt; are both excellent tutorials for beginners, written in a clear, straightforward manner. They also explain the ins and outs of memory management, which is critical on platforms like the iPhone and iPod touch.&lt;/li&gt;
&lt;li&gt;Stanford&#39;s &lt;a href=&#34;https://cs193p.sites.stanford.edu/&#34;&gt;CS193P lecture notes&lt;/a&gt; and examples have proven to be one of the best resources for learning Cocoa, particularly for the iPhone. These notes and tests offer Cocoa Touch in bite-size chunks, with a little bit of &#34;on your own&#34; work to ensure you know your stuff before moving on.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://developers.google.com/code-search&#34;&gt;Google Code Search&lt;/a&gt; is a good last resort for examples of how others are using a small bit of code or a particular class. For more accurate results, append &#34;lang:objectivec&#34; to your search string to narrow results to only Objective-C code.&lt;/li&gt;
&lt;/ul&gt;</content>
    </entry>

    <entry>
        <title>Consolas Cursor Fix</title>
        <link href="https://command-tab.org/2008/12/16/consolas-cursor-fix/"/>
        <id>tag:command-tab.org,2008-12-16:consolas-cursor-fix</id>
        <published>2008-12-16T00:00:00Z</published>
        <updated>2008-12-16T00:00:00Z</updated>
        <content type="html">&lt;p&gt;If you&#39;ve attempted to use Consolas as your choice programming font on the Mac, you may have noticed (&lt;a href=&#34;/2008/02/19/finding-the-perfect-programming-font/&#34;&gt;as I did&lt;/a&gt;) an odd issue with the font, where your blinking cursor hangs much lower than the current line. Oddly enough, this little issue only seems to affect Mac OS X. Even the Consolas set that ships with Microsoft Office 2008 has the same problem! Yet, when the same exact font file is used under Windows, the cursor position is correct.&lt;/p&gt;
&lt;p&gt;John Gruber &lt;a href=&#34;http://daringfireball.net/linked/2008/12/15/bbedit-91&#34; title=&#34;Daring Fireball: BBEdit 9.1&#34;&gt;mentioned&lt;/a&gt; that &lt;a href=&#34;http://www.barebones.com/products/bbedit/demo.html&#34;&gt;BBEdit 9.1&lt;/a&gt; now ships with Consolas as its default font, so I decided to see if it had the same cursor problem I had experienced in the past. As it turns out, BBEdit&#39;s version of Consolas works just fine, as seen in the image above. However, it doesn&#39;t include the other styles like Consolas Bold, Italic, and Bold Italic.&lt;/p&gt;
&lt;p&gt;Through one way or another, the copy of Consolas that ships with BBEdit 9.1 is different than the one that ships with Microsoft Office 2008. To make system-wide use of the working version, &lt;a href=&#34;http://www.barebones.com/products/bbedit/demo.html&#34;&gt;download BBEdit 9.1&lt;/a&gt;, mount and open the .dmg, and navigate to:&lt;/p&gt;
&lt;p&gt;(Control-click BBEdit, and choose &#34;Show Package Contents&#34; to get inside the application bundle): &lt;code&gt;BBEdit.app/Contents/Resources/Fonts/consola.ttf&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Copy consola.ttf from BBEdit&#39;s &#34;Fonts&#34; folder to your own Fonts folder at /Users/you/Library/Fonts, or /Library/Fonts if you want to make it available to everyone who has an account on your computer. Then, fire up your favorite editor, set Consolas as your preferred fixed-width font, and get coding!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Bare Bones has apparently changed the version of Consolas that ships with BBEdit versions later than 9.1, and they now have the cursor problem as well...&lt;/p&gt;</content>
    </entry>

    <entry>
        <title>iPhone NDA Dropped</title>
        <link href="https://command-tab.org/2008/10/01/iphone-nda-dropped/"/>
        <id>tag:command-tab.org,2008-10-01:iphone-nda-dropped</id>
        <published>2008-10-01T00:00:00Z</published>
        <updated>2008-10-01T00:00:00Z</updated>
        <content type="html">&lt;p&gt;After hearing the cries of thousands of upset iPhone app developers, Apple has &lt;a href=&#34;http://developer.apple.com/iphone/program/&#34;&gt;lifted the non-disclosure agreement&lt;/a&gt; covering (released) iPhone software. Developers can now freely talk about the inner workings of their applications, &lt;a href=&#34;http://www.pragprog.com/titles/amiphd/iphone-sdk-development&#34;&gt;write&lt;/a&gt; &lt;a href=&#34;http://www.amazon.com/iPhone-Developers-Cookbook-Building-Applications/dp/0321555457/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1222881181&amp;amp;sr=8-1&#34;&gt;books&lt;/a&gt;, publish blog entries, etc. Communicating developers means solutions to common problems get solved and &lt;a href=&#34;http://furbo.org/2008/10/01/redacted/&#34;&gt;shared&lt;/a&gt;, resulting in better software, making the iPhone and iPod Touch platform better as a whole.&lt;/p&gt;
&lt;p&gt;For some time I&#39;ve been worried that the NDA was going to remain in place indefinitely, silencing those who Apple needs the most, but it appears Apple has finally taken a positive action to help their App Store environment grow further. If you thought there was some cool stuff on the App Store now, just give it time.&lt;/p&gt;</content>
    </entry>

    <entry>
        <title>iPhone and iPod Touch Icon Template</title>
        <link href="https://command-tab.org/2008/09/21/iphone-and-ipod-touch-icon-template/"/>
        <id>tag:command-tab.org,2008-09-21:iphone-and-ipod-touch-icon-template</id>
        <published>2008-09-21T00:00:00Z</published>
        <updated>2008-09-21T00:00:00Z</updated>
        <content type="html">&lt;p&gt;While working on some iPhone and iPod Touch apps, I found that the iPhone OS automatically masks and overlays your application icon for quick and easy development. You supply a square 57x57 pixel image, and it rounds off the corners and overlays the Mac-like gloss to create a consistent look.&lt;/p&gt;
&lt;p&gt;When developing an icon for a Touch-based application, it&#39;s handy to be able to see what your rendered creation will look like without going through the hassle of exporting your icon, compiling your code, and running your software every time a change is made. To that end, I present a small Photoshop file which very closely mimics the iPhone-applied mask and gloss, which you can place over top of your in progress icon layers to approximate the final result. Also, if you dislike the gloss, or have something special in mind, you can set a certain flag in the application&#39;s Info.plist to disable the gloss... I hope my Photoshop file will help others create great looking Touch app icons!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; By request, I&#39;ve added a 512x512 version of the template as well, so you can get a good feel for what your icon will look like when displayed in iTunes. Both files are now combined in a zip archive, &lt;a href=&#34;https://r2.command-tab.com/iphone_icon_templates.zip&#34;&gt;downloadable here&lt;/a&gt;.&lt;/p&gt;</content>
    </entry>

    <entry>
        <title>fmTuner: A Last.fm Plugin for WordPress</title>
        <link href="https://command-tab.org/2008/09/07/fmtuner-a-last-fm-plugin-for-wordpress/"/>
        <id>tag:command-tab.org,2008-09-07:fmtuner-a-last-fm-plugin-for-wordpress</id>
        <published>2008-09-07T00:00:00Z</published>
        <updated>2008-09-07T00:00:00Z</updated>
        <content type="html">&lt;p&gt;fmTuner is a WordPress plugin for retrieving song details from your &lt;a href=&#34;http://www.last.fm&#34;&gt;Last.fm&lt;/a&gt; profile and publishing them anywhere in your WordPress theme. It provides options for choosing among your Recent, Loved, or Top tracks, as well as tools to adjust the update frequency and appearance.&lt;/p&gt;
&lt;p&gt;Of particular note is the customizable Display Format option. Using simple tags like &lt;code&gt;[::artist::]&lt;/code&gt; and &lt;code&gt;[::image::]&lt;/code&gt; intermixed with regular HTML, you can tweak your Last.fm tracks exactly how you like, or however your WordPress theme requires. You have full control!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Download&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://wordpress.org/extend/plugins/fmtuner/&#34;&gt;Download the latest fmTuner from WordPress.org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Requirements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WordPress 2.7 or newer.&lt;/li&gt;
&lt;li&gt;PHP 5 or newer&lt;/li&gt;
&lt;li&gt;Basic knowledge of PHP, HTML, and WordPress.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Installation&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Upload fmtuner.php to a directory inside &lt;code&gt;/wp-content/plugins/&lt;/code&gt; directory. For example: &lt;code&gt;/wp-content/plugins/fmtuner/fmtuner.php&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Ensure &lt;code&gt;/wp-content/plugins/fmtuner/&lt;/code&gt; is writable by your webserver.&lt;/li&gt;
&lt;li&gt;Activate the plugin through the &#34;Plugins&#34; menu in WordPress.&lt;/li&gt;
&lt;li&gt;Set up options in the &#34;Settings&#34; menu in WordPress.&lt;/li&gt;
&lt;li&gt;Place the PHP code &lt;code&gt;if(function_exists(&#39;fmtuner&#39;)) { fmtuner(); }&lt;/code&gt; in your templates, to call up fmTuner.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Release History&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;fmTuner 1.1&lt;/strong&gt; Released on Feb. 1, 2010 Added a placeholder image field to the fmTuner Settings page, which will be substituted when tracks have no artwork. Tested under WordPress 2.9.1.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fmTuner 1.0.8&lt;/strong&gt; Released on Nov. 3, 2009 Fixed a bug with the &lt;code&gt;[::url::]&lt;/code&gt; fmTuner tag that caused Last.fm links to appear incorrectly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fmTuner 1.0.7&lt;/strong&gt; Released on Apr. 23, 2009 Tracks with foreign character sets now display more accurately.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fmTuner 1.0.6&lt;/strong&gt; Released on Mar. 29, 2009 You can now display more than 10 Recent Tracks, and you should get fewer tracks without artwork.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fmTuner 1.0.5&lt;/strong&gt; Released on Mar. 22, 2009 Track information is now properly escaped to handle $ signs, quotes, and other non-alphanumeric characters.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fmTuner 1.0.4&lt;/strong&gt; Released on Dec. 14, 2008 Made minor tweaks for fmTuner Settings page under WordPress 2.7.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fmTuner 1.0.3&lt;/strong&gt; Released on Nov. 15, 2008 By request, a &lt;code&gt;[::number::]&lt;/code&gt; fmTuner tag has been added, which emits a sequential number for each track (starting at 1). This is particularly useful for CSS and JavaScript display purposes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fmTuner 1.0.2&lt;/strong&gt; Released on Oct. 5, 2008 Added a cURL-based alternative to &lt;code&gt;file_get_contents&lt;/code&gt; to hopefully resolve &#34;URL file-access is disabled&#34; issues. If &lt;code&gt;allow_url_fopen&lt;/code&gt; is disabled in the php.ini, cURL will be used to fetch the Last.fm feed instead.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fmTuner 1.0.1&lt;/strong&gt; Released on Sept. 9, 2008 Added better failure checking and informational messages, removed development code, and updated instructions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fmTuner 1.0&lt;/strong&gt; Released on Sept. 6, 2008 Initial release.&lt;/li&gt;
&lt;/ul&gt;</content>
    </entry>

    <entry>
        <title>How to Run Hamachi on Leopard</title>
        <link href="https://command-tab.org/2008/08/30/how-to-run-hamachi-on-leopard/"/>
        <id>tag:command-tab.org,2008-08-30:how-to-run-hamachi-on-leopard</id>
        <published>2008-08-30T00:00:00Z</published>
        <updated>2008-08-30T00:00:00Z</updated>
        <content type="html">&lt;p&gt;&lt;a href=&#34;/2006/08/13/hamachi-on-mac-os-x/&#34;&gt;A while back&lt;/a&gt; I detailed how to get Hamachi VPN running on Mac OS X, but times have changed, so here&#39;s how to go about it under Leopard. Again, it&#39;s a bit tricky, involving some Terminal work, but it&#39;s pretty straightforward as far as command-line software goes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Download and Install Tun/Tap&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Hamachi for Mac OS X depends on some other tunneling software, a Tun/Tap kernel extension which does the low-level work. &lt;a href=&#34;http://tuntaposx.sourceforge.net/&#34;&gt;Download&lt;/a&gt; the latest Tun/Tap package and install it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Download and Install Hamachi&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Next, &lt;a href=&#34;https://secure.logmein.com/products/hamachi/list.asp&#34;&gt;download&lt;/a&gt; the latest Hamachi for Mac OS X. Installation is a bit more complicated than the Tun/Tap drivers. Unzip the archive, and open up a Terminal window, and type &lt;code&gt;cd&lt;/code&gt;, followed by a space. Don&#39;t press Return just yet... Instead, drop the Hamachi folder right into the Terminal window, which will insert the path to that folder after the prefix you just typed: &lt;code&gt;cd /Users/you/Downloads/hamachi-0.9.9.9-20-osx&lt;/code&gt;. Press Return, and the Terminal&#39;s new working directory will be the Hamachi folder -- this is just a quick drag-and-drop shortcut to avoid typing out the path to a folder you already have available.&lt;/p&gt;
&lt;p&gt;Once in the Hamachi folder, type &lt;code&gt;sudo ./install&lt;/code&gt;. Enter your administrator password to perform the install.&lt;/p&gt;
&lt;p&gt;Hamachi should now be installed, and you can initialize it for the first time by typing &lt;code&gt;hamachi-init&lt;/code&gt;. This will generate public and private encryption keys in your Home folder, under &lt;code&gt;.hamachi/&lt;/code&gt; (the initial dot makes the folder hidden in regular Finder windows). With both set-ups out of the way, it&#39;s time to start using Hamachi!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Run Hamachi&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Configure Tun/Tap by typing &lt;code&gt;sudo ./usr/sbin/tuncfg&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Start up Hamachi by typing &lt;code&gt;hamachi start&lt;/code&gt; followed by &lt;code&gt;hamachi login&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;At this point, you should be connected to the Hamachi service, but without a VPN for your computers to join. If you already have a network, or plan to join a trusted friend&#39;s network, you can easily join it by typing: &lt;code&gt;hamachi join SomeNetwork&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Most likely, though, you&#39;ll need to create your own network: &lt;code&gt;hamachi create MyNetwork&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Now you should have a virtual network in place and can go online &lt;code&gt;hamachi go-online MyNetwork&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;To see other parties on the network, run &lt;code&gt;hamachi list&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;If other computers are online, you&#39;re ready to connect to them with any higher-level software like iChat via Bonjour, the Finder&#39;s &#34;Connect to Server&#34; command, Safari, etc.&lt;/p&gt;
&lt;p&gt;To log out of Hamachi and shut down VPN connections, run &lt;code&gt;hamachi stop&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;For more information about how to use Hamachi, you can view its manual by running &lt;code&gt;hamachi -h&lt;/code&gt;.&lt;/p&gt;</content>
    </entry>

    <entry>
        <title>Coda 1.5</title>
        <link href="https://command-tab.org/2008/08/27/coda-1-5/"/>
        <id>tag:command-tab.org,2008-08-27:coda-1-5</id>
        <published>2008-08-27T00:00:00Z</published>
        <updated>2008-08-27T00:00:00Z</updated>
        <content type="html">&lt;p&gt;The developers at &lt;a href=&#34;http://www.panic.com&#34;&gt;Panic&lt;/a&gt; have been very busy for the last several months preparing a major update for their one-window web development app (covered &lt;a href=&#34;http://www.command-tab.com/2008/04/15/two-weeks-with-coda/&#34;&gt;earlier&lt;/a&gt;), &lt;a href=&#34;http://www.panic.com/coda/&#34;&gt;Coda&lt;/a&gt;, and have finally delivered. Coda 1.5 brings tons of new features like multi-file search, customizable books, &#34;reverse publish&#34;, and &lt;a href=&#34;http://www.panic.com/coda/releasenotes.html&#34; title=&#34;Coda release notes&#34;&gt;more&lt;/a&gt;, but the one that really takes the cake is full Subversion support. None of that bolted-on nonsense, either -- Panic went out of their way to carefully weave Subversion into the interface, presenting commands as needed. The update is also free for registered owners.&lt;/p&gt;
&lt;p&gt;If Coda is your primary tool for web development, and you already use Subversion, you&#39;re most likely aware of &lt;a href=&#34;http://www.versionsapp.com/&#34;&gt;Versions&lt;/a&gt; and &lt;a href=&#34;http://www.zennaware.com/cornerstone/&#34;&gt;Cornerstone&lt;/a&gt;, but now you can toss both of those apps and have your source code management built right into your leafy-green development environment. And, after reading how to go about setting up &lt;a href=&#34;http://www.command-tab.com/2008/08/24/how-to-set-up-multiple-subversion-repos-on-mediatemple/&#34;&gt;Subversion on MediaTemple&lt;/a&gt;, your Mac web development paradise should be complete, ready to start developing all those killer web apps you&#39;ve been pondering. &lt;a href=&#34;http://www.panic.com/coda/&#34;&gt;Check out Coda&lt;/a&gt; and get coding!&lt;/p&gt;</content>
    </entry>

    <entry>
        <title>iPhoto Billing Information Error</title>
        <link href="https://command-tab.org/2008/08/26/iphoto-billing-information-error/"/>
        <id>tag:command-tab.org,2008-08-26:iphoto-billing-information-error</id>
        <published>2008-08-26T00:00:00Z</published>
        <updated>2008-08-26T00:00:00Z</updated>
        <content type="html">&lt;p&gt;While trying to order some prints from Kodak/Apple via iPhoto yesterday, I repeatedly got the error message &#34;Please review your billing information and approve it.&#34; After checking out my billing information twice, and still getting that error, I found the answer on an &lt;a href=&#34;http://discussions.apple.com/thread.jspa?threadID=1235552&amp;amp;tstart=2265&#34;&gt;Apple Discussions&lt;/a&gt; thread: Make sure your credit card verification code is entered in the Account Information screen. Why iPhoto doesn&#39;t highlight or complain about the missing required field is beyond me, but overlooking this tiny field causes problems that hardly indicate their source.&lt;/p&gt;</content>
    </entry>

    <entry>
        <title>MacBook Pro Insomnia</title>
        <link href="https://command-tab.org/2008/08/03/macbook-pro-insomnia/"/>
        <id>tag:command-tab.org,2008-08-03:macbook-pro-insomnia</id>
        <published>2008-08-03T00:00:00Z</published>
        <updated>2008-08-03T00:00:00Z</updated>
        <content type="html">&lt;p&gt;For the past several weeks, my MacBook Pro had been occasionally waking up during periods where it was expected to be in sleep mode. Even with the lid closed, it would briefly wake up, illuminate the screen and Apple logo, then fall back asleep moments later. Seemingly random, it would sometimes happen only once every other day, and other times it would happen sequentially with only seconds in between cycles. I had no idea if the issue was hardware or software, but it didn&#39;t seem major enough to warrant an AppleCare call.&lt;/p&gt;
&lt;p&gt;A quick trip to the Console application in the Applications &amp;gt; Utilities folder reported dozens of instances of &#34;USB caused wake event (EHCI)&#34;, which gave me some initial Google hits. The obvious answer is that a USB device was waking up the computer, however I rarely had USB hardware plugged in when the random awakenings were occurring.&lt;/p&gt;
&lt;p&gt;As it turns out, &lt;a href=&#34;http://tancredi.co.uk/2007/12/9/solving-macbook-wake-from-sleep-issue&#34;&gt;others&lt;/a&gt; &lt;a href=&#34;http://forums.macrumors.com/archive/index.php/t-428248.html&#34;&gt;have&lt;/a&gt; had this problem before. As indicated in the previous links, Mac OS X keeps its power schedule inside /Library/Preferences/SystemConfiguration/com.apple.AutoWake.plist, but this file didn&#39;t exist for me, apparently &#34;confusing&#34; Mac OS X. Without it, it would exhibit the symptoms I was encountering.&lt;/p&gt;
&lt;p&gt;Following suggestions, I opened System Preferences, Energy Saver, Schedule, where you can schedule system sleeps and wakes. By toggling on a scheduled wake, clicking OK, then disabling it, the &lt;code&gt;com.apple.AutoWake.plist&lt;/code&gt; was re-created, and left with no scheduled sleeps or wakes. So far, this has cured my MacBook Pro&#39;s insomnia!&lt;/p&gt;</content>
    </entry>

</feed>