<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Whatever happened to Benjamin Ragheb?</title>
	<atom:link href="http://www.benzado.com/blog/feed" rel="self" type="application/rss+xml" />
	<link>http://www.benzado.com/blog</link>
	<description>A professional&#039;s personal blog.</description>
	<lastBuildDate>Mon, 11 Apr 2011 18:06:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.1</generator>
		<item>
		<title>Hello, Fingerpaintball</title>
		<link>http://www.benzado.com/blog/post/381/hello-fingerpaintball</link>
		<comments>http://www.benzado.com/blog/post/381/hello-fingerpaintball#comments</comments>
		<pubDate>Mon, 04 Apr 2011 14:00:00 +0000</pubDate>
		<dc:creator>Benjamin</dc:creator>
				<category><![CDATA[Fingerpaintball]]></category>

		<guid isPermaLink="false">http://www.benzado.com/blog/?p=381</guid>
		<description><![CDATA[A touchscreen is not just a fancypants alternative to using a mouse. To push an onscreen button with a mouse involves several layers of indirection: you move your hand to push a device to move a tiny arrow across the screen until it is over the button, then you move your finger to push a [...]]]></description>
			<content:encoded><![CDATA[<p>A touchscreen is not just a fancypants alternative to using a mouse.</p>
<p>To push an onscreen button with a mouse involves several layers of indirection: you move your hand to push a device to move a tiny arrow across the screen until it is over the button, then you move your finger to push a physical button.</p>
<p>To push the same button on a touch screen, you just reach out and tap it.</p>
<p>This is the reason Apple uses the word &#8220;magical&#8221; in iPad marketing material. Being able to manipulate these virtual things <em>directly</em>, with your hands, is a big deal.</p>
<p>I don&#8217;t remember how long ago I had the idea for <a href="http://www.fingerpaintball.com/">Fingerpaintball</a>. There were a half dozen <a href="http://en.wikipedia.org/wiki/Breakout_(video_game)">Breakout</a> derivatives on the App Store already, but they all required the player to swipe a finger to move a paddle to hit the ball. While it works well with a joystick or a mouse, the interaction feels needlessly artificial on a touchscreen.</p>
<p>In October 2010 I started work on a Breakout-type game that would take advantage of iPad&#8217;s touchscreen. Instead of moving a virtual paddle, the player would draw a line, and the ball would bounce off those lines. The project was also a good opportunity for myself to re-learn OpenGL, since I hadn&#8217;t used it in so long.</p>
<p>Work slowed in November, due to demands from a part-time tech support role. It all but stopped in December, due to family obligations involving a trip halfway around the world. In January and February I was busy with client work, and Fingerpaintball was firmly on the back burner.</p>
<p>One does not usually need to register an app with iTunes until you are ready to upload a finished binary, but certain functionality, such as Game Center and In-App Purchases, require that you register the app in order to test it. Registering your app reserves the name you choose, but it also <a href="http://techcrunch.com/2010/09/10/app-store-name-squatters/">starts a countdown</a>: if you don&#8217;t upload a binary within 120 days, the registration will be deleted and you won&#8217;t be able to use the name any more.</p>
<p>So in mid-February I received a warning: if I didn&#8217;t ship by March 17, I&#8217;d lose the name Fingerpaintball. <a href="http://groups.google.com/group/iphonesb/browse_thread/thread/fb15d608b03857be">Other developers on iphonesb</a> advised me to simply delete it myself to avoid the penalty, re-registering it later when I was ready to finish the app. Ignoring them, I decided to use the deadline as motivation to finish the damn thing. <a href="http://www.folklore.org/StoryView.py?story=Real_Artists_Ship.txt">Real artists ship</a>.</p>
<p>It wasn&#8217;t until March 11 that I had time to work on the game again. I originally had a sizable list of things that &#8220;needed&#8221; to be in the 1.0 release, but with only a week remaining, I quickly learned what was really essential and what was not. For example, my intention from the start was to release the game under a fremium model: free to play the first few levels, pay to play the rest. Designing all the levels and implementing In-App Purchase was therefore necessary for 1.0, until I realized it wasn&#8217;t.</p>
<p>The advanced levels and the purchasing could wait for a later release. Bonuses could also wait. Multiball could wait. Sound effects could wait. It turns out that, when a hard deadline is approaching, a lot of things I thought were necessary could wait.</p>
<p>I thought I understood the idea that <a href="http://successfulsoftware.net/2007/08/07/if-you-arent-embarrassed-by-v10-you-didnt-release-it-early-enough/">You Should Be Embarrassed By Your 1.0</a>, but I didn&#8217;t really understand until now. In the past I would write what I believed to be a minimal feature list, and as I worked, adjust the release date accordingly. Now I see I had it backwards: I should have been picking a release date, then trimming feature list as I go.</p>
<p>So far there are two reviews on the U.S. App Store and they both basically say the same thing: a good concept but kind of boring to play. I tend to agree. <strong>I am embarrassed by Fingerpaintball in its current form.</strong> The parts that are there work well, but it&#8217;s just not enough.</p>
<p>I wonder, though, if iterative development applies to games. Changing the interface of a utility doesn&#8217;t have the same implications as changing the rules of a game. If people are competing via a leaderboard, an update can create an uneven playing field. But these are not insurmountable problems: new leaderboards can be created, or people can simply <em>deal with it</em>. World of Warcraft has an enormously sophisticated set of rules that has changed several times over its lifetime; if Blizzard can find a way to manage, so can I.</p>
<p>If you have an iPad, <a href="http://itunes.apple.com/us/app/fingerpaintball/id404951270?mt=8">install Fingerpaintball</a> and tell me what you think. Then stay tuned: I don&#8217;t intend to stay embarrassed for too long.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.benzado.com/blog/post/381/hello-fingerpaintball/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Facebook is not a social network</title>
		<link>http://www.benzado.com/blog/post/375/social-networks-2</link>
		<comments>http://www.benzado.com/blog/post/375/social-networks-2#comments</comments>
		<pubDate>Wed, 23 Mar 2011 23:20:42 +0000</pubDate>
		<dc:creator>Benjamin</dc:creator>
				<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://www.benzado.com/blog/?p=375</guid>
		<description><![CDATA[At approximately 12:30 a.m. last night I locked myself out of my apartment.]]></description>
			<content:encoded><![CDATA[<p>At approximately 12:30 a.m. last night I locked myself out of my apartment.</p>
<p>I recently moved into a new building with a washer and dryer in the basement. At midnight, I loaded my clothes into the washer, then returned to my apartment to wait. (Why I am so ridiculous as to start doing my laundry at midnight is outside the scope of this discussion.) I was reading, it was hot and radiators are not adjustable, so I removed my hoodie. My iPhone timer went off, so I picked it up, walked downstairs, moved my clothes to the dryer, walked back upstairs, then realized my keys were in the pocket of the hoodie on the other side of the door.</p>
<p>I am by no means a carefree sort of person. I am constantly worried about something. If there is nothing to worry about <em>I will find something</em>. I almost never lose my keys or wallet because I (usually) check my pockets several times before leaving a place. This is the sort of situation that could easily make a person like me flip out.</p>
<p><em>But I did not flip out.</em></p>
<p>I did not flip out because, about four years ago, I took an improv class. If you&#8217;ve heard <a href="http://departments.knox.edu/newsarchive/news_events/2006/x16625.html">Stephen Colbert&#8217;s commencement address to Knox College</a>, you may be expecting me to describe how I used the power of &#8220;yes-and&#8221; to get back into my apartment. But the specifics of improv didn&#8217;t really have anything to do with it.</p>
<p>I didn&#8217;t really matter that the class was an improv class. And it also didn&#8217;t matter that I had taken that class. What mattered is that I socialized with people in that class, and took the next class, and made friends, and took more classes with friends, and assembled performing groups with friends, and even though I don&#8217;t perform as much as I did a year ago, I have a significant number of real friends.</p>
<p>So at the moment I realized I had locked myself out of my apartment, I didn&#8217;t panic because I <em>knew</em> I wouldn&#8217;t have to sleep on the floor or be extorted by a locksmith. I used my phone to <a href="http://twitter.com/benzado/status/50415782949175296">tweet my predicament</a> and within minutes two friends had offered me space on their sofas for the night.</p>
<p>If nobody had replied, there were a dozen people I could call (although I&#8217;d feel pretty terrible about waking them up). If they didn&#8217;t pick up, I still could have walked to <a href="http://newyork.ucbtheatre.com/">the theatre</a> or <a href="http://www.yelp.com/biz/peter-mcmanus-cafe-new-york">designated watering hole</a> (uncomfortably in my socks, but do-able) and probably found somebody to help me out.</p>
<p>Websites like Twitter and Facebook are called &#8220;social networks&#8221; but that&#8217;s not what they are. They are models of social networks or tools to communicate within social networks, but without an underlying social network they are frivolous.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.benzado.com/blog/post/375/social-networks-2/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using curl to test .htaccess redirects</title>
		<link>http://www.benzado.com/blog/post/370/test-htaccess-with-curl</link>
		<comments>http://www.benzado.com/blog/post/370/test-htaccess-with-curl#comments</comments>
		<pubDate>Wed, 02 Feb 2011 19:04:27 +0000</pubDate>
		<dc:creator>Benjamin</dc:creator>
				<category><![CDATA[Nerdery]]></category>
		<category><![CDATA[.htaccess]]></category>
		<category><![CDATA[curl]]></category>

		<guid isPermaLink="false">http://www.benzado.com/blog/?p=370</guid>
		<description><![CDATA[A quick tip for testing htaccess redirects with curl]]></description>
			<content:encoded><![CDATA[<p>Say you want to use .htaccess URL rewriting to make sure that example.com always redirects to www.example.com (or vice-versa). Or something more complicated that depends on the host name.</p>
<p>You want to test it before you upload to your production server, but your staging server has a different URL (obviously).</p>
<p>An easy trick is to use curl, manually setting the Host: header to simulate access through different URLs. For example, assume your test server is at IP address 1.2.3.4 and you want to make sure that example.com redirects to www.example.com. Type this:</p>
<pre>curl --head --header "Host: example.com" http://1.2.3.4/</pre>
<p>The &#8211;head option fetches only the headers. The &#8211;header option spoofs the Host: header with the value that would have been sent by a browser accessing your production site.</p>
<p>If your .htaccess is correct, you should get output like this:</p>
<pre>HTTP/1.1 301 Moved Permanently
Date: Wed, 02 Feb 2011 18:47:54 GMT
Server: Apache/2.2.14
Location: http://www.example.com/</pre>
<p>If the HTTP code on the first line is 301 and you have a Location field with the expected URL, it worked!</p>
<p>If you see &#8220;HTTP/1.1 200 OK&#8221; then the server just served up a regular page. If you see &#8220;HTTP/1.1 500 Internal Server Error&#8221; then something went horribly wrong.</p>
<p>Armed with this knowledge, a clever person could write a script to automate these tests, confirming that all the redirects work as expected <em>before</em> deploying the site.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.benzado.com/blog/post/370/test-htaccess-with-curl/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to make a VirtualBox guest boot from an external drive on a Mac host</title>
		<link>http://www.benzado.com/blog/post/366/virtualbox-external-drive</link>
		<comments>http://www.benzado.com/blog/post/366/virtualbox-external-drive#comments</comments>
		<pubDate>Sun, 30 Jan 2011 00:58:08 +0000</pubDate>
		<dc:creator>Benjamin</dc:creator>
				<category><![CDATA[Nerdery]]></category>
		<category><![CDATA[VirtualBox]]></category>

		<guid isPermaLink="false">http://www.benzado.com/blog/?p=366</guid>
		<description><![CDATA[This is the story of how I used VirtualBox to set up a virtual machine to boot a Windows 7 guest from an external hard disk on a Mac OS X host.]]></description>
			<content:encoded><![CDATA[<p>I have been using Macintosh since before it was cool. A lot has changed since then: now Apple <em>is</em> cool, Macs use Intel processors, and <a href="http://www.kernelthread.com/publications/virtualization/">software can emulate a virtual computer inside your actual computer</a>. Although Microsoft becomes less relevant each day, there are still valid reasons besides masochism that a person might want access to Windows.</p>
<p>This is the story of how I used VirtualBox to set up a Windows 7 guest on a Mac OS X host. Lots of people have done this. The reason I feel my story is compelling enough to tell is that, rather than using a single file to act as a virtual hard disk, I am using an <em>actual</em> hard disk, connected to my Mac via FireWire.</p>
<p>Why do this?</p>
<ul>
<li><strong>Performance</strong>. Giving your virtual machine it&#8217;s own dedicated hard disk means it isn&#8217;t competing with the host machine for access. I haven&#8217;t run tests, and the USB or FireWire bottleneck may compromises guest performance, but my inner engineer would rather have a slower guest than a slower guest<em> and</em> host.</li>
<li><strong>Backup</strong>. A virtual hard disk is a large, frequently changing file. Most backup software, such as <a href="http://www.apple.com/macosx/what-is-macosx/time-machine.html">Time Machine</a>, doesn&#8217;t work well with these.</li>
<li><strong>Portability</strong>. To use the virtual machine on a second computer, all I need to do is copy the settings, only a few kilobytes of data. Then all I have to do is plug the external disk into whatever computer I feel like using that day.</li>
<li><strong>Access</strong>. Instead of being locked away in a virtual hard disk file, my files are accessible to any computer that I can plug the drive into.</li>
</ul>
<p>Now that I have convinced you this is worth the hassle, I will describe the details of the hassle.</p>
<p>Warning: the procedure below is not for the faint of heart. If you are uncomfortable at a command line, you may want to wait for software to support this in a more graceful manner.</p>
<p><span id="more-366"></span></p>
<h3>Install VirtualBox</h3>
<p>On Mac OS X you have three options (that I am aware of): <a href="http://www.parallels.com/products/desktop/">Parallels Desktop</a>, <a href="http://www.vmware.com/products/fusion/">VMware Fusion</a>, and <a href="http://www.virtualbox.org/">VirtualBox</a>. I used VirtualBox because it is free and I am a cheapskate. Parallels and VMware are very reasonably priced, and supposedly offer better performance, but my needs are modest and VirtualBox is pretty good.</p>
<p><a href="http://www.virtualbox.org/wiki/Downloads">Download VirtualBox</a> and follow the installation instructions, etc. Don&#8217;t create your virtual machine just yet. Note to people of the future: 4.0.2 was the latest available version at the time of writing.</p>
<h3>Create Virtual Disk File</h3>
<p>Although your virtual machine will be using an actual hard disk, you still need to make a file that tells VirtualBox how to access the device. You can&#8217;t do this through the graphical interface, so you must drop down to the command line. Connect your disk and <a href="http://guides.macrumors.com/Terminal">open a Terminal window</a>. Then type:</p>
<pre style="margin: 8px;">diskutil list</pre>
<p>You should see some output that looks like this:</p>
<pre style="margin: 8px;">/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *250.1 GB   disk0
   1:                        EFI                         209.7 MB   disk0s1
   2:                  Apple_HFS Macintosh HD            215.8 GB   disk0s2
   3:       Microsoft Basic Data BOOTCAMP                33.9 GB    disk0s3
/dev/disk1
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     Apple_partition_scheme                        *2.2 TB     disk1
   1:        Apple_partition_map                         32.3 KB    disk1s1
   2:                  Apple_HFS Drobo                   2.2 TB     disk1s3
/dev/disk2
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     Apple_partition_scheme                        *10.8 GB    disk2
   1:        Apple_partition_map                         32.3 KB    disk2s1
   2:                 Apple_HFSX benzado                 10.8 GB    disk2s2
/dev/disk4
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *60.0 GB    disk4</pre>
<p>From this list, you need to identify which disk is the one you want to install onto. In my case, it&#8217;s the last one, disk4. I wish I could tell you exactly what to look for, but at this point I don&#8217;t know what&#8217;s on your disk, if it&#8217;s been formatted, etc. If you&#8217;re unsure, look for a number in the size column that matches the size of the drive.</p>
<p>Now for some harsh reality: Mac OS X assigns these disk numbers on a first-connected, first-served basis. In my case, the internal hard drive is disk0 and my <a href="http://www.drobo.com/">Drobo</a> is disk1. When I log in, Finder mounts my <a href="http://www.apple.com/mobileme/features/idisk.html">iDisk</a>, so that&#8217;s disk2. At some point I downloaded and mounted a disk image to install some software, it was disk3. Then I connected the external drive, disk4. Finally, I ejected the disk image, which is why disk3 does not appear in the list above.</p>
<p>Our problem is that VirtualBox needs a disk identifier, but the identifier depends on when we plugged the drive in. The least painful way to deal with this problem is to create a symbolic link to the device identifier, and tell VirtualBox to use that. If the external disk&#8217;s identifier has changed, all we need to do is update the symbolic link. Let&#8217;s do that.</p>
<p>Switch to the directory where VirtualBox stores it&#8217;s hard disk files:</p>
<pre>cd ~/Library/VirtualBox/HardDisks/</pre>
<p>Create a link to the device we noted earlier:</p>
<pre>ln -s /dev/disk4 ExternalDiskDeviceLink</pre>
<p>Create the virtual disk file:</p>
<pre>VBoxManage internalcommands createrawvmdk -filename ExternalDisk.vmdk -rawdisk $PWD/ExternalDiskDeviceLink</pre>
<p>This creates a virtual disk file named ExternalDisk.vmdk which refers to the link ExternalDiskDeviceLink, which in turn points to the device /dev/disk4.</p>
<p>Whenever you need to point to a new device, update the symbolic link file:</p>
<pre>ln -s /dev/disk3 ~/Library/VirtualBox/HardDisks/ExternalDiskDeviceLink</pre>
<p>You may be wondering, why not just use VBoxManage to create a bunch of the vmdk files, and switch between those? You could do that, but each time you create a file, it is assigned a UUID which is apparently visible to the guest OS. Microsoft Office, for example, believes it has been copied to a new computer if this UUID changes, forcing you to reactivate your legally obtained copy by telephone.</p>
<p>Also, clicking around in VirtualBox to change the disk file each time would get annoying (to me) fast.</p>
<h3>Configure a Virtual Machine</h3>
<p>Launch VirtualBox and create a new virtual machine. The prompts are fairly straightforward, I won&#8217;t explain them all. When it asks you to select a virtual hard disk, select <strong>Use existing hard disk</strong> and then click the tiny folder icon to select the ExternalDisk.vmdk file you created earlier.</p>
<p>The guest and the host cannot use the external disk at the same time, so if the disk has been mounted on the host, make sure to eject it before you try to start the virtual machine. If you don&#8217;t, VirtualBox will lambast you with a cryptic, angry error message containing the word BUSY.</p>
<p>(If you get a different error message containing the word UNSUPPORTED, try changing the configuration so that the disk is connected to a virtual IDE controller rather than a virtual SATA controller.)</p>
<p>Once the VM is running, you can install Windows 7 (or whatever other OS you like). Allow the installer to partition and format the external drive.</p>
<h3>Prevent the Drive from Auto-mounting</h3>
<p>Even though I would eject the drives before starting the VM, Mac OS X would mount them again as soon as the VM shut down. This was annoying.</p>
<p>Then at some point I noticed Mac OS X mounted the drives <em>while the virtual machine was running</em>. This caused the VM to lock up and was generally horrible. So even though I was good about unmounting the drives before starting the VM, it is <em>absolutely necessary</em> to prevent Mac OS X from auto-mounting the drives.</p>
<p>If it&#8217;s running, shut down the VM. Let the drives mount automatically or use Disk Utility to mount them. Then open a Terminal window and type:</p>
<pre>diskutil list</pre>
<p>Here is the part of the output we&#8217;re interested in:</p>
<pre>/dev/disk4
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *60.0 GB    disk4
   1:               Windows_NTFS System Reserved         104.9 MB   disk4s1
   2:               Windows_NTFS Homunculus Brain        59.9 GB    disk4s2</pre>
<p>Windows has created two partitions; we need to make sure they don&#8217;t mount. We do this by listing them in the system&#8217;s <a href="http://en.wikipedia.org/wiki/Fstab">fstab file</a>. We can identify disks by label (name) or <a href="http://en.wikipedia.org/wiki/Universally_unique_identifier">UUID</a>. It&#8217;s better to use the UUID if we can, since it&#8217;s easy to change a disk&#8217;s label but impossible (well, very difficult) to change it&#8217;s UUID. Unfortunately, some partitions don&#8217;t appear to have one.</p>
<p>Find out if each partition has a UUID:</p>
<pre>diskutil info disk4s1</pre>
<p>Look for a line like:</p>
<pre>   Volume UUID:              FB4E2CC6-36EF-41E1-9E41-D6E0D932F2EB</pre>
<p>Make a note of the UUID; if it doesn&#8217;t have one, note the Volume Name instead. Repeat for disk4s2 and so on. Now create a file at /etc/fstab (you need <a href="http://guides.macrumors.com/sudo">root privileges</a> to do so) and add the following lines. (If the file already exists, you can just add these lines to the end.)</p>
<pre># identifier, mount point, fs type, options
LABEL=System\040Reserved  none  ntfs  ro,noauto
UUID=FB4E2CC6-36EF-41E1-9E41-D6E0D932F2EB  none  ntfs  ro,noauto</pre>
<p>In my case, &#8220;System Reserved&#8221; did not have a UUID, so I identified it by label, using \040 to represent the space. I&#8217;m not too worried about it, since its label is unlikely to change. The main partition&#8217;s name, other the other hand, can be changed by clicking around within Windows, so I&#8217;ve copied the UUID from above. You should copy the UUID from your system and not the one from this web page.</p>
<p>Anyway, that &#8220;noauto&#8221; keyword on the end of the line is what prevents Mac OS X from mounting the disk when you plug the drive in.</p>
<p>Test it by ejecting the disks, unplugging the drive, then plugging it back in. If nothing happens, you&#8217;ve succeeded!</p>
<p>If you ever want to mount the disks manually (perhaps to copy a file without booting up your VM), use Disk Utility.</p>
<h3>Congratulate yourself</h3>
<p>You have done it: a virtual machine that boots from an actual hard disk.</p>
<p>These instructions are based on my faulty memory of what worked for me on my computer. If you run into problems, leave a comment and let me know, but I can&#8217;t guarantee I can help you.</p>
<p>There is definitely room for improvement here. An enterprising sort of person could probably write a script or application that automatically updates the symbolic link before starting the VM.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.benzado.com/blog/post/366/virtualbox-external-drive/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Changing the default scan format on a Canon imageCLASS MF8450c</title>
		<link>http://www.benzado.com/blog/post/362/mfing-mf8450c</link>
		<comments>http://www.benzado.com/blog/post/362/mfing-mf8450c#comments</comments>
		<pubDate>Thu, 09 Dec 2010 23:01:00 +0000</pubDate>
		<dc:creator>Benjamin</dc:creator>
				<category><![CDATA[Nerdery]]></category>
		<category><![CDATA[Canon]]></category>
		<category><![CDATA[MF8450c]]></category>
		<category><![CDATA[usability]]></category>

		<guid isPermaLink="false">http://www.benzado.com/blog/?p=362</guid>
		<description><![CDATA[I provide tech support for an office with a Canon Color imageCLASS MF8450c. It&#8217;s a printer, scanner, fax machine, and copier all in one. It is a usability nightmare. It takes dozens of button presses to accomplish anything. This is made worse by the fact that it has some pretty stupid default settings. For example, [...]]]></description>
			<content:encoded><![CDATA[<p>I provide tech support for an office with a <a href="http://www.amazon.com/gp/product/B001IDYVW6?ie=UTF8&amp;tag=benjpeteragh-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B001IDYVW6">Canon Color imageCLASS MF8450c</a>. It&#8217;s a printer, scanner, fax machine, and copier all in one. <strong>It is a usability nightmare.</strong> It takes dozens of button presses to accomplish anything. This is made worse by the fact that it has some pretty stupid default settings. For example, as a scanner it can create files in PDF, JPEG, and TIFF format. Guess which is the default? If you guessed &#8220;WTF is TIFF?&#8221; then you get a cookie!</p>
<p>This is a scanner for office settings, where people are usually interested in creating PDF files from legal documents, and don&#8217;t want high resolution uncompressed black and white images. So <em>every </em>time somebody needs to scan <em>anything</em>, they must change the format from TIFF to PDF. This is crazy.</p>
<p>For the longest time, I didn&#8217;t think there was a way to change the default. Turns out I was wrong. I don&#8217;t think you will blame me for thinking it was impossible, though. Inspired by <a href="http://www.automationadventures.com/2009/01/14/setting-default-scan-format-on-canon-5075i/">instructions for other models of Canon equipment</a>, I gave it another try. Here&#8217;s how to do it:</p>
<ol>
<li>&#8220;Additional Func.&#8221;</li>
<li>&#8220;Communications Settings&#8221;</li>
<li>&#8220;Common Settings&#8221;</li>
<li>&#8220;TX Settings&#8221;</li>
<li>&#8220;Change Send Func. Mode&#8221;</li>
<li>&#8220;Register&#8221;</li>
<li>Now you see a menu of scanning options, including an item for Color/File Format. Change it to whatever you like.</li>
<li>Select &#8220;Register&#8221; and then &#8220;Done&#8221; the appropriate number of times to get back to the main menu.</li>
<li>The next time you scan, you may be presented with the old defaults, making you think the change did not take hold. If you back out to the main menu and then try to scan again, you may find that the change has taken effect.</li>
</ol>
<p>I mean, seriously? <em>Communications settings?</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.benzado.com/blog/post/362/mfing-mf8450c/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>How to Learn to Program in 2010</title>
		<link>http://www.benzado.com/blog/post/358/how-to-learn-to-program-in-2010</link>
		<comments>http://www.benzado.com/blog/post/358/how-to-learn-to-program-in-2010#comments</comments>
		<pubDate>Fri, 29 Oct 2010 21:25:56 +0000</pubDate>
		<dc:creator>Benjamin</dc:creator>
				<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://www.benzado.com/blog/?p=358</guid>
		<description><![CDATA[This is a response to a friend, Nate Dern, a smart guy who wants to learn to program but doesn’t know where to start. Spoiler alert: I rant for a while and then briefly answer his question at the very end. Here’s what worked for me: I was born in 1980 to parents who were [...]]]></description>
			<content:encoded><![CDATA[<p><em>This is a response to a friend, <a href="http://benzado.tumblr.com/post/1434123635/dear-hardcore-multiplier-of-matrices-i-have-an">Nate Dern</a>, a smart guy who wants to learn to program but doesn’t know where to start. Spoiler alert: I rant for a while and then briefly answer his question at the very end.</em></p>
<p>Here’s what worked for me: I was born in 1980 to parents who were successful enough to afford a home computer and also easygoing enough to let their children play with it. The timing was fortuitous because it meant I had plenty of time to learn and — I think this is key — computers of the late 80s/early 90s were easier to learn about. Since then all I’ve had to do is keep up.</p>
<p>In other words, what worked for me definitely won’t work for you.</p>
<p>First of all, you should know that programming is not the same as computer science. It’s like the difference between doing math and being a mathematician. Or between gardening and being a plant biologist. I already knew how to program long before I got to college. Most students who enter C.S. programs do, in fact, which is why college programming classes are usually terrible. Don’t bother taking a class, unless you know someone who can vouch for it.</p>
<p>Second, you should distinguish programming (the skill) from learning a specific programming language, like Java or C++ or MATLAB. Different languages are suited for different tasks, but regardless of your ultimate goal, <em>your first task is to learn programming</em>. For example, if you want to write an iPhone app, you must learn Objective-C, but if you know nothing about programming, it’s a terrible place to start.</p>
<p>The first computers I ever used had a built-in BASIC interpreter, and if you were a geek (which you were, because <em>you had a computer in your home in 1989</em>) you would buy magazines with program listings in the back and type them in. Even if you didn’t want to learn how to write programs, you could not help but be exposed to the process.</p>
<p>Since then, computers have become consumer products that do all sorts of useful things out of the box, no programming required. Also, graphical interfaces have completely replaced text-based command lines. That’s great news, unless you’re learning to program, because <em>programming for a graphical user interface is hard</em>.</p>
<p>When you write for a text-based system, your program starts executing at the top, and continues line by line, until it gets to the end. This is relatively easy for a beginner to understand. When you write for a graphical system (desktop or web), your program is responding to events, and different functions are called in response to user actions. Writing programs for an <em>event-based</em> environment is a lot more complicated.</p>
<p>Why am I telling you this? Well, a lot of tutorials ignore or try to gloss over this difference. They believe you will be more excited to draw circles on the screen than to print text in a terminal, so they drop you in the event-based world without a good explanation of what is going on, telling you stick your code here and not worry about the rest of it. But the minute you start experimenting your program locks up and you don’t know why. A good tutorial will teach you programming skills in a text-based environment.</p>
<p>OK, so those are some of my opinions on learning to program, from the perspective of someone who likes to write programs. But you aren’t specifically interested in becoming a programmer, you just want to learn enough to mine data from websites. So, if I haven’t scared you off, let’s talk about your specific case:</p>
<p>The good news is that you won’t need to learn any of that event-based graphical user interface stuff. And not in you-can-cut-corners way, but in a that-won’t-be-useful-for-the-task way.</p>
<p>Second, you will want a language that can deal with text easily, since you will eventually be downloading web pages and then parsing out the bits you are interested in.</p>
<p>Anything in the category of “scripting language” would fit the bill, and those are a good choice for learning general programming concepts, too. The big ones in that category are <a href="”http://www.python.org/”">Python</a>, <a href="”http://www.perl.org/”">Perl</a>, and <a href="”http://www.ruby-lang.org/”">Ruby</a>.</p>
<p>My advice: find a book that teaches programming using one of those languages. Preferably, a “Learn How to Program” book that happens to use one of them, as opposed to a “Learn Python/Perl/Ruby” book that claims to assume no prior knowledge is necessary.</p>
<p>I can’t recommend a specific book. Search Amazon and read the reviews or go to a bookstore and browse through the books. Even better: go to a bookstore and look up the Amazon reviews on your smartphone as you browse.</p>
<p>Once you pick a book, treat it like a college textbook and work through it. Do all the exercises. (Oh yeah, pick a book with exercises.) Wander off course and experiment on your own if you’re feeling bold, but if you get lost or stuck, go back to the book.</p>
<p>Oh, and sign up for an account at <a href="”http://stackoverflow.com/”">Stack Overflow</a>. It’s a Q&amp;A site for programmers. If you have a question, you can search there to see if it’s been answered, and if it hasn’t, you can ask it. (I’m happy to help, too, but I guarantee Stack Overflow will get you answers faster.)</p>
<p>Good luck! Let me know how it goes.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.benzado.com/blog/post/358/how-to-learn-to-program-in-2010/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Not even Apple can predict the future</title>
		<link>http://www.benzado.com/blog/post/356/not-even-apple-can-predict-the-future</link>
		<comments>http://www.benzado.com/blog/post/356/not-even-apple-can-predict-the-future#comments</comments>
		<pubDate>Sat, 23 Oct 2010 22:58:24 +0000</pubDate>
		<dc:creator>Benjamin</dc:creator>
				<category><![CDATA[Commentary]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Mac App Store]]></category>

		<guid isPermaLink="false">http://www.benzado.com/blog/?p=356</guid>
		<description><![CDATA[As soon as Apple announced that a Mac App Store is coming, somebody on macsb lit the following match: So&#8230; what do folks think about the app store? Good? Bad? That was Wednesday, and the thread is still going on. The discussion has actually been pretty reasonable. Anyway, I just spent a while contributing the [...]]]></description>
			<content:encoded><![CDATA[<p>As soon as Apple announced that <a href="http://www.apple.com/macosx/lion/">a Mac App Store is coming</a>, somebody on <a href="http://tech.groups.yahoo.com/group/macsb/">macsb</a> lit the following <a href="http://tech.groups.yahoo.com/group/macsb/message/17360">match</a>:</p>
<blockquote>
<p>So&#8230; what do folks think about the app store? Good? Bad?</p>
</blockquote>
<p>That was Wednesday, and the thread is still going on. The discussion has actually been pretty reasonable. Anyway, I just spent a while contributing <a href="http://tech.groups.yahoo.com/group/macsb/message/17518">the 137th message of the thread</a>, and since I spent a lot of time on it, I thought I would reproduce it here.</p>
<p>On Oct 23, 2010, at 9:34 AM, Ken Aspeslagh wrote:</p>
<blockquote>
<p>Unlikely? I disagree. As announced, the Mac App Store sets Mac apps moving in the direction of iPhone apps. Apple has set it in motion, moving in a direction, and it will continue on this course. Apple is genius when it comes to transitions. They know how to make a difficult plan, execute it incrementally over the course of years, and make each incremental announcement sound exciting. This is just the first step of a plan to completely revolutionize desktop computers, just as they forever revolutionized mobile phones.</p>
</blockquote>
<p>You&#8217;re making an assumption that Apple has some grand vision of the future that they are steering everybody toward, whether we like it or not. Not just you. That idea is at the heart of a lot of the fatalistic comments about the App Store.</p>
<p>You could be right. But I think it&#8217;s a side effect of Apple&#8217;s secrecy that you never see how uncertain they are. Companies that talk about products in development can look clueless because you see them trying out different, possibly terrible ideas. Apple is very careful to hide their cards unless they think they have a winning hand. And even when they do, they still bet small.</p>
<p>One thing Apple does that is unusual for such a large company, is that when something isn&#8217;t working, they don&#8217;t double down like idiots. Consider Apple TV: when version 1.0 didn&#8217;t sell so well, they didn&#8217;t look for ways to &#8220;revise&#8221; the existing product into success. They more or less scrapped it and made a new product with the same name. If they had a &#8220;vision&#8221;, they were clearly willing to adjust it.</p>
<p>Remember the fat iPod nano? I think Jobs didn&#8217;t even show a picture of it during the touchscreen nano announcement. Now the nano is a tiny touchscreen. That&#8217;s nuts how different that is from the previous one! Is it selling well? I don&#8217;t know, but if it isn&#8217;t, Apple will be sure to go back to a clickwheel nano next year. Just like they put buttons back on the iPod shuffle this year.</p>
<p>So here&#8217;s the deal with the Mac App Store. They saw that people liked buying apps on their phones, because the environment made it easy and safe. So they are trying to bring that to the Mac. I think it could go a number of ways, and I don&#8217;t think Apple has decided which way yet. I think they are going to respond to the market.</p>
<p>Here&#8217;s something to consider: the Mac App Store might actually lead to a less restrictive environment on iOS devices. How? Well, the argument for requiring code to be signed by Apple is that it makes supporting a product much easier. If the Mac App Store leads to a drastic reduction in Mac software support issues, even while allowing users to install their own software, that makes the case that maybe the iOS restriction on unsigned code can be relaxed.</p>
<p>Or maybe the other thing will happen, where all software must come from Apple.</p>
<p>Who knows? Nobody does.</p>
<p>The point is, saying that Apple has a plan for where this is going to go is like saying that the Steelers have a plan to win the Superbowl. Sure, they have a plan, but ultimately they have to react to what happens in the real world. They are not all-powerful. They just good at looking like they are.</p>
<p>So, while I accept that a horrible totalitarian future is possible, if it comes to pass it will be because that&#8217;s what the market demanded. And anyone who &#8220;knew it all along&#8221; will have as much right to brag as somebody who bet on the winning Superbowl team.</p>
<p>Go Steelers!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.benzado.com/blog/post/356/not-even-apple-can-predict-the-future/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>File references relative to DERIVED_FILE_DIR in Xcode</title>
		<link>http://www.benzado.com/blog/post/352/file-references-relative-to-derived_file_dir-in-xcode</link>
		<comments>http://www.benzado.com/blog/post/352/file-references-relative-to-derived_file_dir-in-xcode#comments</comments>
		<pubDate>Tue, 28 Sep 2010 21:42:52 +0000</pubDate>
		<dc:creator>Benjamin</dc:creator>
				<category><![CDATA[Nerdery]]></category>
		<category><![CDATA[Xcode]]></category>

		<guid isPermaLink="false">http://www.benzado.com/blog/?p=352</guid>
		<description><![CDATA[Let&#8217;s say you have a Mac or iOS app which stores its data in an SQLite database. It looks for this database file on launch; if missing, the app copies a template file from its bundle. How do you configure your Xcode project to store that template file in the app bundle? Let&#8217;s also say [...]]]></description>
			<content:encoded><![CDATA[<p>Let&#8217;s say you have a Mac or iOS app which stores its data in an SQLite database. It looks for this database file on launch; if missing, the app copies a template file from its bundle. How do you configure your Xcode project to store that template file in the app bundle?</p>
<p>Let&#8217;s also say you have a source file of SQL commands, checked into source control, that you use to generate the database file. You could manually generate the database file and add it to your project, but you want a clean build process, with no steps to remember between checkout and build.</p>
<p>The right way to accomplish this is by adding a <a href="http://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/XcodeBuildSystem/200-Build_Phases/bs_build_phases.html#//apple_ref/doc/uid/TP40002690-CJABHEIB">Run Script Build Phase</a> to your target, so that when you build, Xcode creates the database file for you.</p>
<p>Xcode lets you specify the Input Files the script depends on and the Output Files it generates, so that it can examine modification dates and determine if the script needs to be run at all. When you add a new Output File to the list, the default value is <strong>$(DERIVED_FILE_DIR)/myfile</strong>, which seems to be a pretty clear endorsement of that location as the place to store generated files.</p>
<p>So let&#8217;s say you write the script and save the database file to <strong>$(DERIVED_FILE_DIR)/Template.db</strong>. You add a reference to this file to your Xcode project (navigating to a DerivedSources folder somewhere within the Intermediate Build Files directory). When you build, Xcode generates your file (Run Script phase) then copies it into your app&#8217;s bundle (Copy Bundle Resources phase). Hooray!</p>
<p>Then you change the build configuration from Debug to Release, and it breaks. Why?</p>
<p>The problem is the file references. The DERIVED_FILE_DIR location depends on the current target and build configuration. When you switched from Debug to Release, the script dutifully generated a file in the correct location, but the file references are looking in the wrong place. The Debug location is hardcoded into the path.</p>
<p>Select any of the files and hit Cmd-I, and you&#8217;ll see a Path Type popup menu that tells Xcode <a href="http://developer.apple.com/library/ios/documentation/DeveloperTools/Conceptual/XcodeProjectManagement/130-Files_in_Projects/project_files.html#//apple_ref/doc/uid/TP40002666-BBCDFECB">how to resolve that file&#8217;s path</a>. Here are all the options:</p>
<ul>
<li><strong>Relative to Enclosing Group:</strong> this just passes the buck.</li>
<li><strong>Relative to Project:</strong> this is where your source files are stored.</li>
<li><strong>Absolute Path:</strong> this doesn&#8217;t even try.</li>
<li><strong>Relative to Build Product:</strong> this sounds promising, but Build Products are distinct from Intermediate Build Files, and we want the latter.</li>
<li><strong>Relative to Xcode folder:</strong> nope.</li>
<li><strong>Relative to Current SDK:</strong> of course not.</li>
</ul>
<p>At this point, you could give up and modify your script to write the file directly into the app bundle. But that would be so dirty!</p>
<p>It turns out you are not limited to only those options. Additional source trees you define in Xcode Preferences will appear in that popup menu. Here&#8217;s what to do:</p>
<ol>
<li>If you haven&#8217;t already, organize all the derived files into a DerivedSources group, and set the Path Type of each to be <strong>Relative to Enclosing Group</strong>. If done properly, the Path: field should contain only the file name. (If that&#8217;s not the case, click <strong>Choose&#8230;</strong> to select the file. If the file doesn&#8217;t exist, do a build to create it.)</li>
<li>Open Xcode Preferences and select <strong>Source Trees</strong>.</li>
<li>Add a new source tree, with Setting Name as <strong>DERIVED_FILE_DIR</strong>, Display Name as <strong>Derived Files</strong>, and Path as <strong>$(DERIVED_FILE_DIR)</strong>.</li>
<li>Click OK.</li>
<li>In the project window, select the <strong>DerivedSources</strong> group and hit Cmd-I.</li>
<li>Change Path Type to <strong>Relative to Derived Files</strong>.</li>
<li>Unfortunately, the Xcode GUI is not able to resolve DERIVED_FILE_DIR properly; the Full Path will be missing the active target&#8217;s name. As a result, the path is invalid, and Xcode will fill in the Path field trying to find it&#8217;s way to a DerivedSources folder. We don&#8217;t want that, we want Path: to be None. I know of no way to do that within Xcode, so we&#8217;ll have to edit the project file. <strong>Take a deep breath.</strong></li>
<li>Close Xcode.</li>
<li>Use a text editor to open the <strong>project.pbxproj</strong> file inside your Xcode project bundle.</li>
<li>Find the <strong>DerivedSources</strong> section. It will contain a few key-value pairs: isa, children, name, path, and sourceTree. Delete the <strong>path</strong> line and save the file.</li>
<li>Reopen your project file.</li>
</ol>
<p>The group will appear in red, indicating that the Xcode GUI can&#8217;t find them, but when you perform a build Xcode will look in the right places and use the correct files.</p>
<p>I figured this out by experimenting on my own, so it&#8217;s possible that these instructions won&#8217;t work for you, or that there&#8217;s a better way to do this. If that&#8217;s the case, let me know, and I&#8217;ll update this post.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.benzado.com/blog/post/352/file-references-relative-to-derived_file_dir-in-xcode/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A simple way to keep your Mac awake</title>
		<link>http://www.benzado.com/blog/post/346/pmset-noidle</link>
		<comments>http://www.benzado.com/blog/post/346/pmset-noidle#comments</comments>
		<pubDate>Wed, 15 Sep 2010 06:07:11 +0000</pubDate>
		<dc:creator>Benjamin</dc:creator>
				<category><![CDATA[Nerdery]]></category>

		<guid isPermaLink="false">http://www.benzado.com/blog/?p=346</guid>
		<description><![CDATA[This is a meandering post that ends with a shell scripting tip. Images on this blog had been broken ever since I migrated to NearlyFreeSpeech.NET several months ago. I took some time today to fix them and tie up some other loose ends. I learned that PHP&#8217;s safe mode (as implemented by NSFN, anyway) won&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<p>This is a meandering post that ends with a shell scripting tip.</p>
<p>Images on this blog had been broken ever since I migrated to <a href="https://www.nearlyfreespeech.net/">NearlyFreeSpeech.NET</a> several months ago. I took some time today to fix them and tie up some other loose ends. I learned that PHP&#8217;s safe mode (as implemented by NSFN, anyway) won&#8217;t allow a file to be created unless the group of the destination directory and the script being executed match. Once I <code>chgrp</code>&#8216;d everything to the &#8220;web&#8221; group, things I couldn&#8217;t get working before, like <a href="http://wordpress.org/extend/plugins/wp-super-cache/">WP-Super-Cache</a>, started working again.</p>
<p>I use rsync to update my website, and it would be great if it could take care of setting the owner and group appropriately on files it copied to the web server. Unfortunately, rsync will only try to find a group with the same name on both systems, or ignore the group it entirely. There doesn&#8217;t seem to be a way to provide your own mapping to rsync, and tell it that the local group &#8220;staff&#8221; should be mapped to group &#8220;web&#8221; on the remote system.</p>
<p>Just in case there were some rsync secrets I didn&#8217;t know about, I went searching on Super User, and that&#8217;s where I browsed my way to this question: ﻿<a href="http://superuser.com/questions/99247/stop-my-mac-from-sleeping-whilst-a-bash-script-is-running-and-then-allow-it-to-sl">Stop my mac from Sleeping whilst a bash script is running and then allow it to sleep as normal when it&#8217;s done?</a></p>
<p>The lone answer to the question merely suggested reading the <a href="http://www.manpagez.com/man/1/pmset/">manual page for pmset</a>. I figured I could offer the world something more helpful than <a href="http://xkcd.com/293/">RTFM</a>, so I took a look at it myself. At first I thought I&#8217;d have to do a lot of work to figure out the current power settings, save them, disable sleep, do whatever work the Mac needs to stay awake for, then finally restore the saved settings. That would have been especially difficult since pmset&#8217;s output isn&#8217;t designed for parsing.</p>
<p>However, it turns out pmset has a mode designed just for this situation. It&#8217;s barely explained in the manual, but if you call <code>pmset noidle</code>, sleep will be disable for as long as the process is alive. So all you need to do is something like this:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># start background process to disable sleep</span>
pmset noidle <span style="color: #000000; font-weight: bold;">&amp;</span>
<span style="color: #666666; font-style: italic;"># save its process ID so we can terminate it later</span>
<span style="color: #007800;">PMSETPID</span>=<span style="color: #007800;">$!</span>
&nbsp;
...have your fun here...
&nbsp;
<span style="color: #666666; font-style: italic;"># kill pmset so the computer can sleep if it wants to</span>
<span style="color: #c20cb9; font-weight: bold;">kill</span> <span style="color: #007800;">$PMSETPID</span></pre></div></div>

<p>It would be nice if <a href="http://superuser.com/questions/99247/stop-my-mac-from-sleeping-whilst-a-bash-script-is-running-and-then-allow-it-to-sl/188743#188743">my write up</a> would improve <a href="http://superuser.com/users/21562/benzado">my Super User Reputation</a>, but considering that the question is viewed approximately 0.37 times per day, I&#8217;m not holding my breath.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.benzado.com/blog/post/346/pmset-noidle/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MetroCost is now free!</title>
		<link>http://www.benzado.com/blog/post/340/metrocost-is-now-free</link>
		<comments>http://www.benzado.com/blog/post/340/metrocost-is-now-free#comments</comments>
		<pubDate>Thu, 06 May 2010 16:33:46 +0000</pubDate>
		<dc:creator>Benjamin</dc:creator>
				<category><![CDATA[MetroCost]]></category>

		<guid isPermaLink="false">http://www.benzado.com/blog/?p=340</guid>
		<description><![CDATA[I&#8217;ve decided to make MetroCost available for free! In case you haven&#8217;t met yet, MetroCost is an app for iPhone or iPod touch that keeps a record of when you ride public transit, then recommends whether a pay-per-ride or unlimited ride card is a better deal for you. It&#8217;s an app designed to save you [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve decided to make <a href="http://www.metrocost.com/">MetroCost</a> available for free! In case you haven&#8217;t met yet, MetroCost is an app for iPhone or iPod touch that keeps a record of when you ride public transit, then recommends whether a pay-per-ride or unlimited ride card is a better deal for you. <em>It&#8217;s an app designed to save you money, and now you can get it for no money!</em></p>
<p>I live in New York City. When I used to commute to an office, paying for a 30-day Unlimited Ride card was a no-brainer. But once I started working from home, I noticed there were days when I didn&#8217;t ride the train at all. I began to wonder if I would be better off with a pay-per-ride card, and that&#8217;s when I wrote MetroCost.</p>
<p>From last September through March, I have spent $498 on MetroCards: initially unlimited, then pay-per-ride, then recently switching back to unlimited. Each time I had to renew my card, I followed MetroCost&#8217;s recommendation. The result is that I spent an average of $83/month, a savings of $6/month over the MTA&#8217;s 30-day Unlimited Ride card. That&#8217;s $72 a year!</p>
<p>I could say that MetroCost pays for itself, but since it is now completely free, what&#8217;s really happening is that <em>I am giving you money</em>. How about that?</p>
<p>Two more things:</p>
<ul>
<li>MetroCost was designed with New York City in mind, but it is customizable. So, if your public transit system operates on a single fare-per-ride system, you can use it, too. San Francisco and Atlanta are supported out of the box. In a future update I may add support for Boston or even London (if you stay within one zone).</li>
<li>I am by no means abandoning this app. I just decided that I didn&#8217;t want to deal with the difficulty of trying to market a product designed for people who are trying to save money. I have a few ideas for updates, when I have the time.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.benzado.com/blog/post/340/metrocost-is-now-free/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Served from: www.benzado.com @ 2012-02-04 19:20:07 by W3 Total Cache -->
