<?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>Hi, Rahim</title>
	<atom:link href="http://www.hirahim.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.hirahim.com/blog</link>
	<description>Displayed on 100% recycled pixels.</description>
	<lastBuildDate>Wed, 02 May 2012 03:59:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Dissecting the Sonos Controller</title>
		<link>http://www.hirahim.com/blog/2012/04/29/dissecting-the-sonos-controller/</link>
		<comments>http://www.hirahim.com/blog/2012/04/29/dissecting-the-sonos-controller/#comments</comments>
		<pubDate>Mon, 30 Apr 2012 02:27:45 +0000</pubDate>
		<dc:creator>Rahim Sonawalla</dc:creator>
				<category><![CDATA[how-to's]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[Music Hack Day]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Sonos]]></category>
		<category><![CDATA[Sydney]]></category>

		<guid isPermaLink="false">http://www.hirahim.com/blog/?p=362</guid>
		<description><![CDATA[I&#8217;ve been eyeing the Sonos devices for some time now, but never found a chance to sit down and play with them. For the folks that have never heard of Sonos, they make high-quality wireless speakers that you can set up in your home to stream music through. The interesting thing about them is that [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been eyeing the <a class="external" href="http://www.sonos.com/system/">Sonos devices</a> for some time now, but never found a chance to sit down and play with them. For the folks that have never heard of Sonos, they make high-quality wireless speakers that you can set up in your home to stream music through. The interesting thing about them is that they&#8217;re fairly easy to configure—just plug in power and connect to your home network—and they play well with each other. Adding multiple speakers is as easy as plugging them in and joining them to your home network. The devices automatically find each other, and from there you can easily arrange them however you like (have all the speakers play the same song, have two playing one song in one room and another playing a different song in another room, and so on). The downside is that they&#8217;re quite expensive (the cheapest speaker costs ~$300), which made it hard for me to justify getting one. However, that all changed recently. I was in Australia for <a class="external" href="http://sydney.musichackday.org/2012">Music Hack Day Sydney</a> this past weekend and, as a sponsor of the event, Sonos was there with a bunch of Play:5 speakers!</p>
<p>Realizing that this was the perfect opportunity to finally tinker with the Sonos players, I started digging through their <a class="external" href="http://musicpartners.sonos.com/?q=node/21">developer documentation</a>. What I quickly found out though, was that while there were plenty of docs (and sample code) for creating applications that stream music <em>through</em> the speakers, there was no documentation on how one could control the speakers themselves. After a bit or reading, I learned that the Sonos devices communicate with each other over <a class="external" href="https://en.wikipedia.org/wiki/Universal_Plug_and_Play">UPnP</a>, so controlling the speakers would simply be a matter of working with that protocol. Unfortunately, that was easier said than done. Despite being an open protocol, UPnP is lacking in easy to understand documentation and easy to use libraries. To be fair, there seem to be good UPnP libraries in C, but I didn&#8217;t want to dust off my ancient C programming skills for a weekend hackathon. I was able to find two Python libraries, <a class="external" href="http://brisa.garage.maemo.org/">BRisa</a> and <a class="external" href="https://github.com/henkelis/sonospy">sonospy</a>, but neither worked when I gave them a go. It was time to get creative.</p>
<h3>Peaking Under the Hood</h3>
<p>I had a working Sonos controller on my computer, the official Sonos application, I just needed to figure out how it did its magic. Enter <a class="external" href="http://www.wireshark.org/">Wireshark</a>, the revealer of secrets. After a few packet sniffing sessions, I had what I needed. Sonos devices can be controlled by sending them SOAP messages. For example, to pause the currently playing track, you would make the following HTTP POST request:</p>
<blockquote><p><code>POST http://[Sonos speaker&#8217;s IP address]:1400/MediaRenderer/AVTransport/Control</code></p>
<p>POST Headers:<br />
<code>Content-type: text/xml</code><br />
<code>SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#Pause"</code></p>
<p>POST Body:<br />
<code>&lt;s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"&gt;&lt;s:Body&gt;&lt;u:Pause xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"&gt;&lt;InstanceID&gt;0&lt;/InstanceID&gt;&lt;Speed&gt;1&lt;/Speed&gt;&lt;/u:Pause&gt;&lt;/s:Body&gt;&lt;/s:Envelope&gt;</code></p></blockquote>
<p><a href="http://www.hirahim.com/blog/wp-content/Menubar.png"><img class="figure-b" title="About Sonos Menubar" src="http://www.hirahim.com/blog/wp-content/Menubar-300x261.png" alt="About Sonos Menubar" width="300" height="261" /></a>Finding out the Sonos speaker&#8217;s IP address is done programmaticaly through the <a class="external" href="https://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol">Simple Service Discovery Protocol</a> (SSDP). I wasn&#8217;t able to write the code to do dynamic discovery over the weekend, so I took the easier route. If you have the official Sonos application installed, you can get a report of all the speakers&#8217; IPs by clicking on &#8220;About My Sonos System&#8221; in the Sonos menu.</p>
<p>It&#8217;ll give you an output similar to the one below.</p>
<blockquote><p>Associated ZP: 10.0.0.103<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
BRIDGE: BRIDGE<br />
Serial Number: 00-0E-58-4F-87-AC:F<br />
Version: 3.7 (build 17551200)<br />
Hardware Version: 1.5.0.0-2<br />
IP Address: 10.0.0.100<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
PLAY:5: HACK CHILL ROOM1<br />
Serial Number: 00-0E-58-5D-15-32:E<br />
Version: 3.7 (build 17551200e)<br />
Hardware Version: 1.16.4.1-2<br />
IP Address: 10.0.0.102<br />
OTP: 1.1.1(1-16-4-zp5s-0.5)<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p></blockquote>
<p>I was able to implement the other basic controller functionality, like play, stop, next track, previous track, and get information about the currently playing track, by sending similar SOAP messages. A few hours into the weekend, and I was able to control the hackathon&#8217;s Sonos speakers through my terminal! (This got pretty annoying for the other hackers at the event since those were the sames speakers that were playing the music for the weekend.)</p>
<h3>Spicing Things Up</h3>
<p>A terminal prompt makes for a lousy hackathon demo, so I decided to code up some simple applications on top of my base Sonos controller library. The first was a web app version of the Sonos controller. To spice things up, I used the <a class="external" href="http://developer.rovicorp.com">Rovi API</a> to bring in high-quality cover art and editorial album reviews. I also used the <a class="external" href="http://developer.rdio.com">Rdio API</a> to add in a &#8220;favorite&#8221; button. Push it and the currently playing track gets added to an Rdio playlist.</p>
<p><a href="http://www.hirahim.com/blog/wp-content/soco.png"><img class="figure-c" title="Screenshot of SoCo web app" src="http://www.hirahim.com/blog/wp-content/soco-1024x492.png" alt="Screenshot of SoCo web app" width="717" height="344" /></a></p>
<p>For my second example application, I used the <a class="external" href="http://www.twilio.com">Twilio API</a> to let me control the Sonos speaker through SMS. This was particularly cool because the official Sonos application for the iPhone only works when you&#8217;re in your home network. With SMS, I could control the speakers even when I was out. Ran out of the house, but forgot to turn off your music? Just send your speaker a text message.</p>
<h3>The Payoff</h3>
<p><a href="http://www.hirahim.com/blog/wp-content/sonos.png"><img class="figure-b" title="Sonos Play:3 and Bridge" src="http://www.hirahim.com/blog/wp-content/sonos-225x300.png" alt="Sonos Play:3 and Bridge" width="225" height="300" /></a>All three demos went over well with the audience at the hackathon during my presentation on Sunday night, and I ended up winning a Sonos Play:3 and bridge of my very own!</p>
<h3>The Real Payoff</h3>
<p>While winning some hardware of my own is awesome, the real win for me is the potential for great things in the near future. All of my code for the weekend and the sample applications is available on <a class="external" href="https://github.com/rahims/SoCo">my Github page</a>. With the basic groundwork laid, I hope developers at future hackdays will be able to create all kinds of interesting takes on controlling Sonos devices. Bring on the Kinect and OpenCV hacks! If you build something cool, please let me know about it through <a href="mailto:rsonawalla@gmail.com">e-mail</a> or <a class="external" href="http://www.twitter.com/rahims">twitter</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hirahim.com/blog/2012/04/29/dissecting-the-sonos-controller/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to Renew an Expired Passport in Nine Hours</title>
		<link>http://www.hirahim.com/blog/2011/08/03/how-to-renew-an-expired-passport-in-nine-hours/</link>
		<comments>http://www.hirahim.com/blog/2011/08/03/how-to-renew-an-expired-passport-in-nine-hours/#comments</comments>
		<pubDate>Thu, 04 Aug 2011 04:31:54 +0000</pubDate>
		<dc:creator>Rahim Sonawalla</dc:creator>
				<category><![CDATA[travel]]></category>

		<guid isPermaLink="false">http://www.hirahim.com/blog/?p=342</guid>
		<description><![CDATA[It was the day before Startup Festival and I was just a few hours away from hopping on a red eye to Montreal. I went to United&#8217;s website to check in when I was prompted to enter my passport number. I pull out my passport and take a look at the information, expires July 8th [...]]]></description>
			<content:encoded><![CDATA[<p>It was the day before <a href="http://www.startupfestival.com">Startup Festival</a> and I was just a few hours away from hopping on a red eye to Montreal. I went to United&#8217;s website to check in when I was prompted to enter my passport number. I pull out my passport and take a look at the information, expires July 8th 2011. It was July 12th—shit. My passport expired four days ago and I had a flight to catch.</p>
<p>I call up United and, as I suspected, they inform me that I won&#8217;t be able to fly on an expired passport. My only option was to cancel the flight, scramble to renew my passport in a day, and book a new flight tomorrow. This is how I did it.</p>
<p>Disclaimer: I did this in Los Angeles. The process should be the same elsewhere in the nation, but your mileage may vary. Also, I cut this close; there&#8217;s no guarantee that you&#8217;ll be able to renew your passport the same day, but it&#8217;s worth a shot.</p>
<ul>
<li><strong>Make an appointment</strong>. Call up the <a href="http://travel.state.gov/passport/">US Passport Office</a> and use their automated phone system to make an appointment. When I called, they gave me a date late into next week. That wouldn&#8217;t work for me so I decided to hangup and show up the next day, sans appointment. Following the appointment process is the recommended way, but I was desperate.</li>
<li><strong>Get your photo taken</strong>. An expired passport means an outdated passport photo. In order to renew your passport, you&#8217;ll need new photos. Call around to the local CVS and Walgreens. I was able to find a nearby Walgreens that had a photo department that was open until 10 PM. I went over and had two photos made. It cost me around $10. If you can&#8217;t find anything, you can go to the photo place near the <a href="http://maps.google.com/maps/place?q=Federal+Building+11000+Wilshire+Blvd.,+Suite+1000+Los+Angeles,+CA+90024-3602&amp;hl=en&amp;cid=3988301706415377649">Federal Building&#8217;s</a> cafeteria the next morning. They open at 7 AM and charge $14 for two photos. (Avoid this since it would cause you to lose your place in line.)</li>
<li><strong>Fill out the renewal form</strong>. Go to the US Passport Office&#8217;s website and download the <a href="http://travel.state.gov/passport/forms/ds82/ds82_843.html">DS-82 form</a>. Print it out and complete it ahead of time so that you&#8217;re not scrambling last minute. Don&#8217;t staple your photos to it, they&#8217;ll take care of it at the office. When filling out the form, you&#8217;ll want the passport book, not the passport card. (I accidentally checked &#8220;both&#8221; and had to change it later.)</li>
<li><strong>Print out your itinerary</strong>. In order to renew your passport at the last minute, you need to be able to prove that it&#8217;s urgent. Print our your itinerary that shows that you&#8217;re flying soon. (I attempted to use my hotel reservation, but they wanted to see a flight itinerary.)</li>
</ul>
<p>The next morning, bring with you:</p>
<ul>
<li>a copy of your itinerary</li>
<li>your DS-82</li>
<li>your expired passport</li>
<li>your wallet</li>
</ul>
<ul>
<li><strong>Line up early</strong>. At the time of this writing, the Los Angeles US Passport Office opens at 7 AM. (Check the website for your location&#8217;s hours.) I woke up at 5 AM and was at the office by 5:30 AM. There were three people already lined up in front of me. Get there early. If you don&#8217;t have an appointment, you&#8217;ll need to line up at the &#8220;Will Call&#8221; windows. You should be able to see them when you arrive at the <a href="http://maps.google.com/maps/place?q=Federal+Building+11000+Wilshire+Blvd.,+Suite+1000+Los+Angeles,+CA+90024-3602&amp;hl=en&amp;cid=3988301706415377649">Federal Building</a>. They&#8217;re labeled &#8220;Will Call A&#8221; and &#8220;Will Call B&#8221;. There will be two lines, one at will call for people that don&#8217;t have appointments, and one at the door to the passport office for those that do have appointments.</li>
<li><strong>Make your case</strong>. At around 7 AM the window will open and they&#8217;ll take people one at a time. Be polite, show your itinerary, and explain your situation. &#8220;My passport expired and I need to fly out tonight. I don&#8217;t have an appointment, is there anything you can do?&#8221; The person will give you a ticket with a number on it and tell you to go wait in the line with people that have appointments. That ticket is essentially your appointment.</li>
<li><strong>Wait</strong>. You&#8217;ll slowly make your way through the appointment line to security. The security check is just like the one you&#8217;d find at an airport. Turn off your cell phones (this is required) and leave as much as you can in your car (don&#8217;t bring a laptop or anything more than your paperwork and old passport). Once in the building you&#8217;ll head to the Passport office and stand in another line. Eventually you&#8217;ll get to the window where the clerk will look your paperwork over and give you another ticket. You&#8217;ll then sit in the waiting area and wait for your number to be called. Cell phones and laptops are not allowed, so chat up the people next to you or bring a book—the analog kind.</li>
<li><strong>Pay the fee</strong>. Eventually, your number will be called and you&#8217;ll go up to a window. (By now it was around 9 AM.) The clerk will look over your paperwork once more and you&#8217;ll pay $110 to renew the passport and $60 to expedite the process, so $170 total. (These prices were at the time of writing, they may increase. They accept credit cards.) If everything goes well, they&#8217;ll give you a receipt with a time to come back to pick up your passport. Typically, it&#8217;s between 1 PM and 3 PM that same day. If you got this far, there&#8217;s a very good chance you&#8217;ll be getting your passport.</li>
<li><strong>Wait some more</strong>. Go grab lunch at In-n-Out and come back to the Federal Building around 2 PM. (The receipt says to show up between 1 PM and 3 PM, but they never have it ready that early.) Stand in the will call line and give the clerk your receipt. They&#8217;ll either have your passport ready, or ask you to wait a bit longer. I ended up getting mine at 3 PM, right when the Passport office closes.</li>
</ul>
<p>There you have it, a passport in nine hours. Now, never do this again. Be prudent and renew by mail well in advance next time. Happy travels.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hirahim.com/blog/2011/08/03/how-to-renew-an-expired-passport-in-nine-hours/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>SSH tunneling with Tomato</title>
		<link>http://www.hirahim.com/blog/2010/10/25/ssh-tunneling-with-tomato/</link>
		<comments>http://www.hirahim.com/blog/2010/10/25/ssh-tunneling-with-tomato/#comments</comments>
		<pubDate>Tue, 26 Oct 2010 05:28:24 +0000</pubDate>
		<dc:creator>Rahim Sonawalla</dc:creator>
				<category><![CDATA[how-to's]]></category>
		<category><![CDATA[Firesheep]]></category>
		<category><![CDATA[SSH tunnel]]></category>
		<category><![CDATA[Tomato]]></category>

		<guid isPermaLink="false">http://www.hirahim.com/blog/?p=318</guid>
		<description><![CDATA[Eric Butler released Firesheep yesterday and the Internet forums have already started debating the ethics of it. I&#8217;m not sure what kind of impact it&#8217;ll have on other people, but it convinced me to take action and secure my computers. There are a few ways to secure your computers, but after reviewing the HN thread, [...]]]></description>
			<content:encoded><![CDATA[<p>Eric Butler released <a class="external" href="http://codebutler.com/firesheep">Firesheep</a> yesterday and the Internet forums have already started <a class="external" href="http://news.ycombinator.com/item?id=1828955">debating the ethics</a> of it. I&#8217;m not sure what kind of impact it&#8217;ll have on other people, but it convinced me to take action and secure my computers.</p>
<p>There are a few ways to secure your computers, but after reviewing the <a class="external" href="http://news.ycombinator.com/item?id=1827928">HN thread</a>, it looks like the quickest and cheapest (free) way is to set up an SSH tunnel and route all wireless traffic through it.</p>
<p>These instructions assume you&#8217;re moderately tech savvy (find a nerdy friend), and that your home router runs <a class="external" href="http://www.polarcloud.com/tomato">Tomato</a>.</p>
<h3>Set up the SSH daemon</h3>
<p>The first thing you&#8217;ll need to do is turn on Tomato&#8217;s built-in SSH daemon.</p>
<p><a href="http://www.hirahim.com/blog/wp-content/tomato_preferences.png"><img class="figure-c" src="http://www.hirahim.com/blog/wp-content/tomato_preferences-267x300.png" alt="" title="Tomato Administration Preferences" width="267" height="300"></a></p>
<ol>
<li>Open up a web browser and navigate to http://192.168.1.1</li>
<li>Type in your router&#8217;s username and password</li>
<li>Click on the &#8220;Administration&#8221; link in the lefthand menu</li>
<li>Check &#8220;Enable at Startup&#8221; and &#8220;Remote Access&#8221; (so that you can create an SSH tunnel to your router even when you&#8217;re out and about)</li>
<li>Enter &#8220;2222&#8243; for the remote port. (Pick another port number if you like.)</li>
<li>Uncheck &#8220;Allow Password Login.&#8221; (We&#8217;ll enter in authorized keys in the next section.)</li>
</ol>
<h3>Set up each computer</h3>
<p>Next, you&#8217;ll need to create SSH keys for each of the computers you plan on using.</p>
<ol>
<li>Open up Terminal and type <code>ssh-keygen -d</code> to create a new key</li>
<li>Accept all the defaults</li>
<li>Type in a passphrase of your choosing</li>
<li>Using a text editor, open up the newly created &#8220;id_dsa.pub&#8221; file. (Found under ~/.ssh/id_dsa.pub by default.)</li>
<li>Copy and paste the contents of the file into the &#8220;Authorized keys&#8221; section in Tomato. (Add multiple keys by pasting them one after the other in the &#8220;Authorized keys&#8221; section.)</li>
</ol>
<h3>Connecting securely</h3>
<ol>
<li>Create a new text file and paste in the following:</li>
<blockquote><p>
<code>#!/bin/sh</code></p>
<p><code>ssh -fND 8887 -p 2222 root@[router's external IP address]</code>
</p></blockquote>
<li>Save the file as &#8220;setup_tunnel.sh&#8221;</li>
<li>Make the file executable by running <code>chmod +x setup_tunnel.sh</code> in Terminal</li>
</ol>
<p>Now whenever you want to create an SSH tunnel to your router, just open up Terminal and run <code>./setup_tunnel.sh</code>.</p>
<h3>Route traffic through the tunnel</h3>
<p>Once you&#8217;ve got a secure tunnel running on your computer, you&#8217;ll need to route traffic through it.</p>
<h4>OS X</h4>
<p><a href="http://www.hirahim.com/blog/wp-content/osx_network_preferences.png"><img class="figure-c" src="http://www.hirahim.com/blog/wp-content/osx_network_preferences-300x260.png" alt="" title="Proxy Configuration for OS X" width="300" height="260"></a></p>
<ol>
<li>System Preferences &#8594; Network</li>
<li>Select &#8220;AirPort&#8221; in the lefthand list</li>
<li>Click on the &#8220;Advanced&#8221; button</li>
<li>Click on the &#8220;Proxies&#8221; tab</li>
<li>Check &#8220;SOCKS Proxy&#8221; and enter &#8220;localhost&#8221; for the host and &#8220;8887&#8243; for the port</li>
</ol>
<h4>Ubuntu</h4>
<p><a href="http://www.hirahim.com/blog/wp-content/ubuntu_network_preferences.png"><img class="figure-c" src="http://www.hirahim.com/blog/wp-content/ubuntu_network_preferences-300x271.png" alt="" title="Proxy Configuration in Ubuntu" width="300" height="271"></a></p>
<ol>
<li>System &#8594; Preferences &#8594; Network Proxy</li>
<li>Check &#8220;Manual proxy configuration&#8221;</li>
<li>Under &#8220;Socks host&#8221; type &#8220;localhost&#8221; and &#8220;8887&#8243; for the port</li>
<li>Click &#8220;Apply System-Wide&#8230;&#8221;</li>
</ol>
<h3>Secure Firefox</h3>
<p>By default, Firefox doesn&#8217;t route DNS through the proxy, so do the following to fix that.</p>
<ol>
<li>Open up Firefox and type &#8220;about:config&#8221; in the address bar</li>
<li>Click &#8220;I&#8217;ll be careful, I promise&#8221;</li>
<li>Type &#8220;network.proxy.socks_remote_dns&#8221; in the filter.</li>
<li>Toggle the value to &#8220;true&#8221; by double clicking on it</li>
</ol>
<p>And that&#8217;s it, a free way to secure your computers&#8217; Wi-Fi connections!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hirahim.com/blog/2010/10/25/ssh-tunneling-with-tomato/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Import/export added to Gas Log</title>
		<link>http://www.hirahim.com/blog/2010/10/18/import-export-added-to-gas-log/</link>
		<comments>http://www.hirahim.com/blog/2010/10/18/import-export-added-to-gas-log/#comments</comments>
		<pubDate>Mon, 18 Oct 2010 18:23:43 +0000</pubDate>
		<dc:creator>Rahim Sonawalla</dc:creator>
				<category><![CDATA[projects]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Gas Log]]></category>

		<guid isPermaLink="false">http://www.hirahim.com/blog/?p=301</guid>
		<description><![CDATA[The latest versions of Gas Log and Gas Log Pro are now available on the Android Market. The update adds two new features: import and export. You can now export your log as a CSV file to the SD card. From there, you can pull it off your SD card and save it as a [...]]]></description>
			<content:encoded><![CDATA[<p>The latest versions of Gas Log and Gas Log Pro are now available on the Android Market.</p>
<p>The update adds two new features: import and export. You can now export your log as a <a class="external" href="http://en.wikipedia.org/wiki/Comma-separated_values">CSV</a> file to the SD card. From there, you can pull it off your SD card and save it as a backup, or use any spreadsheet tool, like Excel, and do whatever your heart desires with the data.</p>
<p>Importing has also been added, which should make switching to the paid version of Gas Log simple&#8212;just export the log from the free version and import it into Gas Log Pro.</p>
<p><a href="http://www.hirahim.com/projects/gaslog/images/gaslog_import_export.png"><img class="figure-c" src="http://www.hirahim.com/projects/gaslog/images/thumbnails/gaslog_import_export.png" alt="Screenshot of Gas Log's Import/Export feature."></a></p>
<p>So far, the free and paid versions have been the same (except that the free version is ad-supported). Going forward, that&#8217;s going to change. The free version will still get bug fixes and features, but the paid version will get all that plus some extra nice features. For example, that three digit precision that users have been asking for, more statistics, and maybe even <a class="external" href="http://www.fuelly.com">Fuelly</a> support.</p>
<p>Get it now.</p>
<p><img class="figure-c" src="http://chart.apis.google.com/chart?cht=qr&#038;chs=220x220&#038;chl=market%3A%2F%2Fsearch%3Fq%3Dpub%253A%2522Rahim%2520Sonawalla%2522" alt="QR code to download Gas Log."></p>
]]></content:encoded>
			<wfw:commentRss>http://www.hirahim.com/blog/2010/10/18/import-export-added-to-gas-log/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Support Dashboard</title>
		<link>http://www.hirahim.com/blog/2010/09/18/support-dashboard/</link>
		<comments>http://www.hirahim.com/blog/2010/09/18/support-dashboard/#comments</comments>
		<pubDate>Sat, 18 Sep 2010 21:22:04 +0000</pubDate>
		<dc:creator>Rahim Sonawalla</dc:creator>
				<category><![CDATA[projects]]></category>
		<category><![CDATA[Shokii]]></category>
		<category><![CDATA[Support Dashboard]]></category>
		<category><![CDATA[Twilio]]></category>

		<guid isPermaLink="false">http://www.hirahim.com/blog/?p=287</guid>
		<description><![CDATA[I&#8217;ve been working on some tools to make my life easier once Shokii comes out of private beta. This is one I made Friday morning (before lunch, yay) to help me keep track of whatever support calls I get. I figured even though it&#8217;s pretty simple, it might be useful to other small businesses, so [...]]]></description>
			<content:encoded><![CDATA[<p><a class="external" href="http://www.shokii.com/support_dashboard/"><img class="figure-c" src="http://www.shokii.com/support_dashboard/support_dashboard_medium.png" width="700" height="326" alt="Screenshot of Support Dashboard."></a></p>
<p>I&#8217;ve been working on some tools to make my life easier once <a class="external" href="http://www.shokii.com">Shokii</a> comes out of private beta. This is one I made Friday morning (before lunch, yay) to help me keep track of whatever support calls I get. I figured even though it&#8217;s pretty simple, it might be useful to other small businesses, so I&#8217;m putting it out as free, open source software with a business-friendly <a class="external" href="http://www.opensource.org/licenses/mit-license.php">MIT license</a>.</p>
<p>It&#8217;s called <a class="external" href="http://www.shokii.com/support_dashboard/">Support Dashboard</a> and it makes it easy for small businesses to track and view their support calls.</p>
<p>You&#8217;ll need an account on <a class="external" href="http://www.twilio.com">Twilio</a> for it to work. Hopefully, that won&#8217;t be too much of a problem for people.</p>
<p>You can read all about it and download it at <a class="external" href="http://www.shokii.com/support_dashboard/">http://www.shokii.com/support_dashboard/</a>. For all you developers, the source code is up on <a class="external" href="http://github.com/rahims/Support-Dashboard">github</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hirahim.com/blog/2010/09/18/support-dashboard/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
