<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Midnight Cheese]]></title>
  <link href="http://www.midnightcheese.com/atom.xml" rel="self"/>
  <link href="http://www.midnightcheese.com/"/>
  <updated>2012-11-08T19:55:48-06:00</updated>
  <id>http://www.midnightcheese.com/</id>
  <author>
    <name><![CDATA[Russell Cale Mooth]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Amateur Radio]]></title>
    <link href="http://www.midnightcheese.com/2012/11/amateur-radio/"/>
    <updated>2012-11-09T16:04:00-06:00</updated>
    <id>http://www.midnightcheese.com/2012/11/amateur-radio</id>
    <content type="html"><![CDATA[<p>
  Because I&#8217;m not already leading a completely geek-filled lifestyle between my
  <a href='http://myemma.com'>day job</a>
  and my time on
  <a href='http://jawgrind.com/'>Jawgrind</a>
  discussing the merits of original Star Trek episodes, I decided to seal the deal and get my ham radio license.
</p>
<p>
  <a href='http://assets.midnightcheese.com/images/ham-license-large.jpg'><img alt='Amateur radio license' src='http://assets.midnightcheese.com/images/ham-license.jpg' /></a>
  <small>Amateur radio license</small>
</p>
<p>The process of getting my license kind of happened by accident. My grandfather was a ham (K9PSA) and I always remember seeing his radio setup as a kid, but I never really put together what it was all about. Last year I accidentally stumbled upon a form of data transmission popular in the ham world that allows people to transmit text across great distances with an extreme minimum of transmission power.</p>
<p>
  <a href='http://assets.midnightcheese.com/images/psk31-large.jpg'><img alt='PSK31 Screenshot' src='http://assets.midnightcheese.com/images/psk31.jpg' /></a>
  <small>Screenshot of PSK31. Notice the &#8220;waterfall&#8221; of incoming signals. Transmissions are appearing from as far away as Cuba.</small>
</p>
<p>
  The idea of transmitting messages across states and countries sans-internet is interesting, but the visual aspect of
  <a href='http://en.wikipedia.org/wiki/PSK31'>PSK31</a>
  that allows you to literally see the data flowing through a block of spectrum is intriguing. So I had to try it myself.
</p>
<p>Over the last several months I&#8217;ve been using a little RadioShack shortwave receiver to view the transmissions, and now that I finally have my license, I hope to be transmitting soon.</p>
<p>
  <a href='http://assets.midnightcheese.com/images/radioshack-dx-402.jpg'><img alt='Radioshack DX-402 Reciever' src='http://assets.midnightcheese.com/images/radioshack-reciever.jpg' /></a>
  <small>Radio Shack DX-402 Reciever</small>
</p>
<p>I passed both my Technician and General tests in March and received KK4HSX as my call sign. Now I&#8217;ve begun to slowly put a rig together. Recently I picked up an Alpha Delta antenna and mounted it to the highest point in the attic. With a length close to 40 feet, it fit perfectly stretching from one end of the attic to the other.</p>
<p>
  While saving up some dough to get a decent radio for that antenna, I&#8217;ve been playing around a bit on the local repeaters with a little
  <a href='http://www.kenwoodusa.com/Communications/Amateur_Radio/Portables/TH-K20A'>Kenwood TH-K20A</a>
  FM transceiver. I even enlisted my Dad&#8217;s help in building a larger (j-pole) antenna to plug into that little handheld. Still trying to find some time to properly test that thing out.
</p>
<p>
  <a href='http://www.flickr.com/photos/midnightcheese/8041018911/in/photostream/'><img alt='J-pole antenna' src='http://assets.midnightcheese.com/images/j-pole-antenna.jpg' /></a>
  <small>J-pole antenna</small>
</p>
<p>That just about sums things up for now. I&#8217;m sure many more amateur radio related posts will follow this one.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Republic Wireless Review]]></title>
    <link href="http://www.midnightcheese.com/2012/11/republic-wireless-review/"/>
    <updated>2012-11-07T13:41:00-06:00</updated>
    <id>http://www.midnightcheese.com/2012/11/republic-wireless-review</id>
    <content type="html"><![CDATA[<p>Now that I have a month&#8217;s worth of time with Republic Wireless under my belt, I thought this would be a good point to write up a review of those first 30 days.</p>
<p>
  <a href='http://republicwireless.com/'><img alt='Republic Wireless Logo' src='http://assets.midnightcheese.com/images/republic-wireless-logo.jpg' /></a>
</p>
<p>
  <a href='http://republicwireless.com/'>Republic Wireless</a>
  is geared toward users who spend most of their time in an environment with persistent Wi-Fi. When in range of Wi-Fi access all phone calls are placed and received over Wi-Fi. When outside of Wi-Fi range Sprint is the carrier that all calls and data are routed through.
</p>
<p>With most of a user&#8217;s calling minutes and data flowing over Wi-Fi, Republic Wireless can charge a low monthly fee of just $20 for unlimited everything.</p>
<p>
  <a href='http://assets.midnightcheese.com/images/android-large.jpg'><img alt='Android OS' src='http://assets.midnightcheese.com/images/android.jpg' /></a>
</p>
<p>With access to Wi-Fi at home and work, this works out well. Even prior to Republic Wireless, my data usage over the cell network never made it over half a GB per month. So far so good! Let&#8217;s get into some detail.</p>
<p>
  <strong>First Impressions</strong>
  <br />
  While this is mostly UPS&#8217;s fault, my box arrived mangled and open. Luckily nothing had fallen out of the box in transit. (As far as I know.) I was looking forward to Republic Wireless stickers that
  <a href='http://www.yitch.com/republic-wireless-optimus-cellphone-unboxing/'>other customers had received</a>
  but was disappointed not to find any in the box. Maybe they fell out along the way.
</p>
<p>Luckily the phone itself was unscathed. I was able to open everything up, charge the phone, and make calls right away.</p>
<p>
  <a href='http://assets.midnightcheese.com/images/busted-box-large.jpg'><img alt='Busted box' src='http://assets.midnightcheese.com/images/busted-box.jpg' /></a>
  <small>UPS did a number on this package.</small>
</p>
<p>
  <strong>The phone: Motorola DEFY</strong>
  <br />
  The
  <a href='http://en.wikipedia.org/wiki/Motorola_Defy'>DEFY</a>
  is by no means a high-end Android device, but compared to the iPhone 3G that I was using previously, the DEFY is lightening fast. Switching between apps produces no lag. Waiting (sometimes minutes) for the keyboard to respond after a keypress on the iPhone is a thing of the past.
</p>
<p>
  <a href='http://assets.midnightcheese.com/images/motorola-defy-large.jpg'><img alt='Motorola DEFY' src='http://assets.midnightcheese.com/images/motorola-defy.jpg' /></a>
  <small>The Motorola DEFY.</small>
</p>
<p>
  Coming from the iPhone, the DEFY feels cheap and fragile, even though Motorola
  <a href='http://reviews.cnet.com/smartphones/motorola-defy-t-mobile/4505-6452_7-34176620.html'>touts it as a rugged device</a>
  that is water resistant and able to absorb shocks.
</p>
<p>The best hardware feature of the DEFY compared to the 3G is the high-res screen. Even switching back and forth between the DEFY and the iPad 2, the iPad begins to look low-res.</p>
<p>
  <a href='http://assets.midnightcheese.com/images/high-res-screen-large.jpg'><img alt='High res screen' src='http://assets.midnightcheese.com/images/high-res-screen.jpg' /></a>
  <small>Notice the smoothness of the edge of circular elements like the @ symbol.</small>
</p>
<p>GPS is more erratic on the DEFY compared to the iPhone. Some of this could be attributed to Waze&#8217;s software, but when sitting at a traffic light the GPS software has a difficult time knowing that the device is stationary. The position icon will move back and forth and the map will spin around thinking the device&#8217;s direction has changed. Never saw this behavior on the iPhone.</p>
<p>
  <strong>Android UX</strong>
  <br />
  This being my first Android device, I actually expected a much worse experience after using iOS. There&#8217;s no question Android isn&#8217;t as polished as iOS, but it&#8217;s by no means unusable. The biggest fault in Android is the lack of consistency when interacting with similar UI elements across apps. For example, when using a text field, selected text is the usual indicator that text will go away when the user starts typing. This appears in Android, but only half the time. In other instances when interacting with a text field, the text will not be selected yet still disappear when the user begins to type. That makes me question whether or not the text I&#8217;m about to modify is about to all disappear.
</p>
<p>
  <a href='http://assets.midnightcheese.com/images/selected-text-large.jpg'><img alt='Selected text' src='http://assets.midnightcheese.com/images/selected-test.jpg' /></a>
  <small>This text is clearly selected.</small>
</p>
<p>There are tons of little things like that throughout the OS. When the screen is off, iOS will light the screen and display a notification when receiving a text message. Android does not do this, so it&#8217;s difficult to know when notifications are arriving if you have the phone on silent.</p>
<p>Pinch and zoom gestures aren&#8217;t as smooth as iOS. Icons aren&#8217;t very well designed and often use unnecessary animation. The icon indicating that GPS is in use is an animated crosshair. There&#8217;s no reason to create that extra distraction for the user.</p>
<p>The row of hardware based buttons at the bottom of the screen are silly. That should all be in the software UI.</p>
<p>Individually, these are all small annoyances, but they can add up to a less than pleasant experience.</p>
<p>Android does offer a few nice items, including the ability to have on-off switches for Wi-Fi, GPS, etc. on the home screen. They&#8217;re not there by default which is great for normal users, but it&#8217;s nice to have the option for power users. I do like Google&#8217;s voice commands. I find myself using that quite a bit for alarms, weather conditions and measurement conversions.</p>
<p>Most of these complaints can be attributed to the DEFY running Android version 2.3. Next month that will be a two year old operating system. In the tech world, that&#8217;s a lifetime. Unfortunately, with the Google/handset manufacturer track record, I&#8217;ll be amazed if I see a newer version of Android show up on this phone.</p>
<p>
  <strong>Wi-Fi Calling</strong>
  <br />
  I think this is where Republic Wireless will really shine once the service moves out of beta. Wi-Fi call quality placed on a connection without heavy network traffic is quite superb. Audio has much more clarity than a traditional call placed over a cellular network.
</p>
<p>On the shared public Wi-Fi at work (which is very user heavy) I do get reports of echoing, or artifacts similar to those heard on services like Skype or Vonage when under similar network conditions. On the receiving end, I&#8217;ve never heard audio drop or degrade.</p>
<p>I had to make some tweaks to my router at home to hear both ends of a Wi-Fi conversation, but once that was done I haven&#8217;t had any issues at the house. From what I&#8217;ve read on the Republic Wireless forums, the next over-the-air phone update will address some of the router issues that require settings to be changed by the end user.</p>
<p>I&#8217;ve only had one person comment on call quality and that&#8217;s only been when standing outside of the building where Wi-Fi coverage gets sketchy, combined with the busy network traffic. Not bad for beta.</p>
<p>
  <strong>Cellular Service</strong>
  <br />
  Cellular service from Sprint is what you would expect from any carrier: Reliable calls and data based on their coverage map. Data doesn&#8217;t appear to be limited or throttled for Republic Wireless users. I recently spent two long weekend completely off Wi-Fi and encountered zero issues.
</p>
<p>
  <strong>SMS Messaging</strong>
  <br />
  A couple issues to keep in mind here. Text messaging is only mostly supported. MMS messaging is not supported at all. Basic text messaging works without issue, but a lot of services like GroupMe and WoW don&#8217;t support sending messages to VOIP based services like Republic Wireless. It does vary service to service. Google Calendar alerts send just fine. But, keep that in mind if you rely heavily on those types of services.
</p>
<p>
  <strong>Go for it.</strong>
  <br />
  All in all, for the price, the service is completely worth it. If you&#8217;re not a heavy phone and data user, Republic Wireless takes care of the basics. Calls are clear and data is abundant. If you don&#8217;t consider yourself technically inclined, wait until they get all the kinks worked out and sign-up once they&#8217;re out of beta. Adjusting router settings isn&#8217;t something the average user should have to deal with.
</p>
<p>I&#8217;ll be sticking with the service and look forward to what Republic Wireless has in store in the near future.</p>
<p>
  <strong>In Summary</strong>
</p>
<strong>The Good</strong>
<ul>
  <li>Great price</li>
  <li>Unlimited calling and data</li>
</ul>
<strong>The Bad</strong>
<ul>
  <li>2-year-old Android OS</li>
  <li>Fiddling with router settings required</li>
</ul>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[A quick how-to with the aprs.fi API]]></title>
    <link href="http://www.midnightcheese.com/2012/09/a-quick-how-to-with-the-aprs-dot-fi-api/"/>
    <updated>2012-09-11T15:49:00-05:00</updated>
    <id>http://www.midnightcheese.com/2012/09/a-quick-how-to-with-the-aprs-dot-fi-api</id>
    <content type="html"><![CDATA[<p><a href="www.aprs.org/">APRS</a> lets users share information (GPS tracks, WX info, etc.) both over the internet and over the air via amateur radio. (<a href="http://en.wikipedia.org/wiki/Automatic_Packet_Reporting_System">See Wikipedia for more about APRS</a>.)</p>

<p><a href="http://aprs.fi/">aprs.fi</a> is the go-to site to see current APRS activity in your (or any) area. They also have an <a href="http://aprs.fi/page/api">API</a> that lets users tie into all this great data.</p>

<p>In the example below I&#8217;ve written a small PHP script that demonstrates how to pull data from the API and display that data in your terminal window.</p>

<pre>
<code lang="php">
&lt;?php

ini_set( "user_agent", "Midnight Cheese (+http://midnightcheese.com/)" );

echo "\n\nFetching APRS data...\n\n";

function display_APRS() {
	$json_url = "http://api.aprs.fi/api/get?apikey=0000&name=KBNA,KF4KFQ,AG4FW,WR1Q&what=wx&format=json";
	$json = file_get_contents( $json_url, 0, null, null );
	$json_output = json_decode( $json, true);
	$station_array = $json_output[ 'entries' ];
	foreach ( $station_array as $station ) {
		$name = $station[ 'name' ];
		$temp = $station[ 'temp' ];
		$temp = ( ( 9 / 5 ) * $temp ) + 32; // Convert celsius to fahrenheit.
		echo "Temperature is ".$temp."°F at ".$name."\n";
	}
	echo "\n\n";
}

display_APRS();

?>
</code>
</pre>

<p>In this case we&#8217;re requesting a list of weather information posted by a handful of different operators. The API returns the data in JSON which is then parsed and displayed. The final output is displayed below.</p>

<pre>
Fetching APRS data...

Temperature is 82.04°F at KBNA
Temperature is 84.92°F at KF4KFQ
Temperature is 78.08°F at AG4FW
Temperature is 82.94°F at WR1Q
</pre>

<p><a href="http://assets.midnightcheese.com/images/aprs.fi-large.png"><img src="http://assets.midnightcheese.com/images/aprs.fi.jpg" alt="Objects on the aprs.fi map."></a><br><small>Lots of APRS objects displayed on the <a href="http://aprs.fi/">aprs.fi</a> map.</small></p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Old Stones River Road]]></title>
    <link href="http://www.midnightcheese.com/2012/01/old-stones-river-road/"/>
    <updated>2012-01-07T12:27:00-06:00</updated>
    <id>http://www.midnightcheese.com/2012/01/old-stones-river-road</id>
    <content type="html"><![CDATA[<p>If you look at the <a href="http://g.co/maps/4vhf6">Percy Priest Lake area on Google Maps</a> you can often see old roads that lead straight into the water. Recently I noticed such a road parallel to Stones River Road here in La Vergne, and this past fall Merredith and I decided to take a walk to see what we could find.</p>

<p><a href="http://g.co/maps/4vhf6"><img src="http://assets.midnightcheese.com/images/google-maps-old-stones-river-road.jpg" alt="Old Stones River Road on Google Maps"></a><br><small>Old Stones River Road on Google Maps</small></p>

<p>It turns out there was quite a bit to see of Old Stones River Road. From small drainage bridges to old fencing to the actual roadbed, it looks as though the road was left as-is when <a href="http://en.wikipedia.org/wiki/Percy_priest_lake">Percy Priest Lake</a> was built in the 1960s. The following photos were taken just south of the Hurricane Creek boat ramp area.</p>

<p><a href="http://www.flickr.com/photos/midnightcheese/6654353083/"><img src="http://assets.midnightcheese.com/images/old-stones-river-road.jpg" alt="Old Stones River Road"></a><br><small>Old Stones River Road</small></p>
<p><a href="http://www.flickr.com/photos/midnightcheese/6654343085/"><img src="http://assets.midnightcheese.com/images/old-stones-river-road-drainage-bridge.jpg" alt="One of the drainage bridges along Old Stones River Road"></a><br><small>One of the drainage bridges along Old Stones River Road</small></p>
<p><a href="http://www.flickr.com/photos/midnightcheese/6654350701/"><img src="http://assets.midnightcheese.com/images/old-stones-river-road-drainage.jpg" alt="Old Stones River Road showing fencing and drainage bridge"></a><br><small>Old Stones River Road showing fencing and drainage bridge</small></p>
<p><a href="http://www.flickr.com/photos/midnightcheese/6654354413/"><img src="http://assets.midnightcheese.com/images/percy-priest-lake-from-old-stones-river-road.jpg" alt="View of Percy Priest Lake from Old Stones River Road"></a><br><small>View of Percy Priest Lake from Old Stones River Road</small></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Switching From WordPress to Octopress]]></title>
    <link href="http://www.midnightcheese.com/2011/11/switching-from-wordpress-to-octopress/"/>
    <updated>2011-11-03T10:37:00-05:00</updated>
    <id>http://www.midnightcheese.com/2011/11/switching-from-wordpress-to-octopress</id>
    <content type="html"><![CDATA[<p>Today marks yet another milestone for Midnight Cheese by successfully making the migration from <a href="http://wordpress.org/">WordPress</a> to <a href="http://octopress.org/">Octopress</a>. With web trends moving toward fast, light, and responsive, my WordPress setup was becoming slow, bloated, and stagnant. WordPress functions well, but for a single user it was just too large of a feature set. The slow page-load times really made this obvious.</p>

<p>Octopress is the complete opposite of WordPress. Octopress is all static. No scripting. No DB.</p>

<p><strong>Some History</strong><br />The current design is the default Octopress theme. That means a redesign is coming soon. I started looking back and realized 2007 was the last time I applied a design update, which is a bit embarrassing.</p>

<p>Octopress is the fourth blogging CMS that the site has operated under. <a href="http://en.wikipedia.org/wiki/Blogger_(service)">Blogger</a> started everything off very early on, followed by <a href="http://en.wikipedia.org/wiki/Greymatter_(software)">Greymatter</a> (also based on static files) in 2001, WordPress in 2004, and now Octopress.</p>

<p><img src="http://assets.midnightcheese.com/images/midnightcheese-2002.png" alt="Midnight Cheese in 2002" border="0"><br /><small>Midnight Cheese in 2002</small></p>

<p><strong>Issues with Disqus</strong><br />The WordPress import instructions on the Octopress site worked well. The most time consuming part for me was getting <a href="http://disqus.com/">Disqus</a> properly set up. It turns out you have to enable comments on each post.</p>

<pre><code>
  comments: true
</code></pre>

<p>This meant a lot of text manipulation across some 470 posts. I used a little perl action to run through the _posts folder and change what was needed in each file. Basically a find and replace action.</p>

<pre><code>
  perl -pi -e 's/type: post/type: post\ncomments: true/g' *.html
</code></pre>

<p>In addition, to get the comment count to appear on the main index view, I had to implement <a href="http://www.benjiegillam.com/2011/09/octopress-slash-disqus-issue-resolved/">this Disqus fix from Benjie Gillam</a>.</p>

<p><strong>Image Files and Redirects</strong><br />Storing my repo on <a href="http://github.com/">Github</a>, I decided I didn&#8217;t want to have all my images and various media files sitting on Github&#8217;s servers, or across multiple repos on my various computers. On most posts I often have quite a few images. To solve this I created an assets subdomain and moved everything over, keeping all those large files out of the code base.</p>

<p>Many of my images rank well on Google image search which drives a good bit of traffic to the site. That meant 301 redirects for all my images. And again I used that perl script to run through all the posts to modify image URLs.</p>

<p><strong>To the Future</strong><br />I love how light and responsive the site has become with the static setup. Next on the list is a fresh design and custom asides. Flickr will probably be top on the aside list.</p>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Displaying Twitter and Weather on your Arduino LCD Screen]]></title>
    <link href="http://www.midnightcheese.com/2011/10/displaying-twitter-and-weather-on-your-arduino-lcd-screen/"/>
    <updated>2011-10-28T22:08:00-05:00</updated>
    <id>http://www.midnightcheese.com/2011/10/displaying-twitter-and-weather-on-your-arduino-lcd-screen</id>
    <content type="html"><![CDATA[<p>Pieced together from many different sources, the following scripts will allow you to display the Twitter public timeline, the top 20 Twitter trending topics and the current weather on your <a href="http://www.arduino.cc/">Arduino</a> LCD screen. This is done with a PHP script and an Arduino connected to OS X via USB.</p>

<p>You can <a href="http://www.midnightcheese.com/download/arduino-tweet-weather.zip">download the scripts as a zip file</a>.</p>

<p><strong>The Arduino Program</strong>
The tricky part of this project was getting the text to scroll up the two line LCD screen. In the Arduino program, we&#8217;re looking to see if a line of text has a special character prefixed to it. Text prefixed with &#8216;!&#8217; will place the text on line 1. Text prefixed with &#8216;@&#8217; will place the text on line 2. Sending the  &#8216;^&#8217; character clears the screen.</p>

<pre>
<code lang="c">
#include &lt;liquidcrystal.h&gt;
#include &lt;wstring.h&gt;

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(2, 3, 4, 9, 10, 11, 12);

void setup() {
  analogWrite(5, 100);    // Set LCD contrast level (0-255)
  lcd.begin(16, 2);       // Set the LCD's number of rows and columns
  Serial.begin(9600);     // Initialize communication with serial(USB) port.
  lcd.print("Hello.");    // Print welcome message to LCD.
}

int bufferArray[250];     // Our array to store characters arriving from serial port.
int output = 0;
int i = 0;

void loop() {
  int count = Serial.available();

  if (Serial.available() > -1) {
    delay(1000);
    for (i=0; i&lt;count ; i++) {
     bufferArray[i] = Serial.read();          // Put into array
     output = 1;                              // Show new data has been recieved
    } 
  }
  
  if (output != 0) {                          // If new bytes have been recieved                
    int position = 0;
    if (bufferArray[0] == '!') {              // Print on first line if message begins with '!'
      lcd.clear();
      lcd.setCursor(0,0);
      position = 1;
    } else if (bufferArray[0] == '@') {       // Print on second line if message begins with '@'
      lcd.setCursor(0,1);
      position = 1;
    } else if (bufferArray[0] == '^') {       // Clear screen if message begins with '^'
      lcd.clear();
      lcd.setCursor(0,0);
      position = 1;
    } else {
      lcd.clear();
      lcd.setCursor(0,0);
    }
    int j;
    for (j = position; j &lt; count; j++) {
      lcd.write(bufferArray[j]);
    }
    output = 0;                               // Don't print on next iteration
    memset(bufferArray, 0, count);
    count = 0;
  }
}
</code></pre>

<p><strong>The PHP Script</strong>
With those rules established, our PHP script can handle the rest. I&#8217;m using fun classes like <a href="http://php.net/manual/en/function.wordwrap.php">wordwrap</a> and <a href="http://php.net/manual/en/function.explode.php">explode</a> to break long strings of text into LCD width chunks that are placed into an array, prefixed with our placement characters, and fed to the Arduino.</p>

<pre>
<code lang="php">
&lt;?php
// Include the PHP Serial class.
include "php_serial.class.osx.php";
//Define the serial port to use
define('SERIALPORT','/dev/cu.usbserial-A900adK5');

// Weather
$zipcode = 37211;
$title = "Nashville WX.";

// Setup the serial connection
$serial = new phpSerial; 
$serial->deviceSet(SERIALPORT);
$serial->confBaudRate(9600);

// Time
$lastTime = date('D M j H:i:s Y');
$lastTime = strtotime($lastTime);

// Scroll text up LCD screen 
function scrollChunks($message) {
  global $serial;
  $serial->deviceOpen();
  for ($i=0; $i&lt;count ($message); $i++) {
    if ($i==0) {
      $serial->sendMessage($message[$i]);
    } else if ($i&1 && $i!=0) { // If $i is odd and not zero
      $serial->sendMessage($message[$i]);
      sleep(1);
      $message[$i] = substr_replace($message[$i], "!", 0, 1); // Print on top line !
      $serial->sendMessage($message[$i]);
    } else if (!($i&1) && $i!=0) { // If $i is even and not zero
      $message[$i] = substr_replace($message[$i], "@", 0, 1); // Print on top line @
      $serial->sendMessage($message[$i]);
      sleep(1);
      $message[$i] = substr_replace($message[$i], "!", 0, 1); // Print on top line !
      $serial->sendMessage($message[$i]);
    }
    echo $message[$i]."\n";
    sleep(1);
  }
  sleep(1);
  $serial->sendMessage(" ");
  $serial->deviceClose();
}

// Wordwrap our text to lines no more than 15 characters long.
// The LCD displays 16 characters at a time, minus a space for our
// placement character.
function segmentString($t) {
  $chunks = wordwrap($t, 15, "\n", true);
  $chunks = explode("\n", $chunks);
  // Alternate each line with '!' and '@'
  for ($i=0; $i&lt;count ($chunks); $i++) {
    if ($i&1) {
      $chunks[$i] = "@".$chunks[$i];
    } else {
      $chunks[$i] = "!".$chunks[$i];
    }
  }
  scrollChunks($chunks);
}

function displayRSS() {
  global $serial;
  global $title;
  echo "Display only: ".$title."\n";
  sleep(3);
  $serial->deviceOpen();
  $serial->sendMessage($title);
  sleep(240);
  $serial->sendMessage("^");
  sleep(3);
  $serial->deviceClose();
}

function pullWXRSS() {
  global $zipcode;
  $yql = "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20location%3D".$zipcode."&format=json";
  $session = curl_init($yql);
  curl_setopt($session, CURLOPT_RETURNTRANSFER,true);
  $json = curl_exec($session);
  $json_output =  json_decode($json,true);
  global $serial;
  global $title;
  $title = $json_output['query']['results']['channel']['item']['condition']['temp']."F ".$json_output['query']['results']['channel']['item']['condition']['text'];
  echo "Pull and Display: ".$title."\n";
  echo "Waiting a few seconds to display on Arduino...\n\n";
  sleep(5);
  $serial->deviceOpen();
  $serial->sendMessage($title);
  sleep(240);
  $serial->deviceClose();
  sleep(3);
}

// Display current weather from Yahoo! YQL
function displayWX() {
  global $lastTime;
  global $title;
  
  $currentTime = date('D M j H:i:s Y');
  $currentTime = strtotime($currentTime);
  
  echo "\n\n\n\nCurrent Time: ".$currentTime."\n";
  echo "Last Time: ".$lastTime."\n";
  
  $timeDiff = $currentTime - $lastTime;
  echo "Time Difference: ".$timeDiff."\n";
  
  // 1 hour = 3600
  if ($timeDiff>=3605 || $title == "Nashville WX.") {
    echo "It's been an hour. Pulling WX.\n";
    $lastTime = $currentTime;
    pullWXRSS();
  } else {
    echo "An hour has not passed. Displaying old WX.\n";
    displayRSS();
  }
  displayPubTimeline();
}

function displayPubTimeline() {
  $jsonurl = "http://api.twitter.com/1/statuses/public_timeline.json";
  $json = file_get_contents($jsonurl,0,null,null);
  $json_output = json_decode($json,true);
  foreach ($json_output as $tweet) {
    $name = $tweet['user']['screen_name'];
    $text = $tweet['text'];
    echo "\n\n\n".$name."\n";
    echo $text."\n\n";
    global $serial;
    $serial->deviceOpen();
    $serial->sendMessage("Twitter User:");
    sleep(1.5);
    $serial->sendMessage("@".$name);
    echo "@".$name."\n";
    sleep(2);
    $serial->deviceClose();
    if (strlen($text) > 16) {
      segmentString($text);
    } else {
      $serial->deviceOpen();
      $serial->sendMessage($text);
      $serial->deviceClose();
    }
    sleep(5);
  }
  sleep(5);
  displayTopTrends();
}

function displayTopTrends () {
  $jsonurl = "http://api.twitter.com/1/trends/daily.json";
  $json = file_get_contents($jsonurl,0,null,null);
  $json_output = json_decode($json,true);
  $json_output = current($json_output['trends']);
  
  global $serial;
  
  $serial->deviceOpen();
  $serial->sendMessage("The top 20");
  sleep(1);
  $serial->sendMessage("@Twitter trends:");
  $serial->deviceClose();
  sleep(3);
  echo "\n\nTwitter Trends\n\n";
  
  foreach ($json_output as $trend) {
    $trendname = $trend['name'];
    echo $trendname."\n";
    $serial->deviceOpen();
    $serial->sendMessage("^".$trendname);
    $serial->deviceClose();
    sleep(15);
  }
  $serial->deviceOpen();
  $serial->sendMessage("^");
  sleep(1);
  $serial->deviceClose();
  sleep(3);
  displayWX();
}

displayWX();
?>
</code></pre>

<p><strong>PHP Serial Class</strong>
The PHP script requires an OS X specific serial class to talk with the Arduino board. I&#8217;m using <a href="https://gist.github.com/51342">this serial class by Rémy Sanchez</a>, modified by <a href="http://andrewhutchings.com/php-serial-class-for-os-x">Andrew Hutchings</a>. You&#8217;ll need to define your serial device (which you can find in /dev). It should look something like /dev/cu.usbserial-A900adK5.</p>

<p><strong>Bash Start-up File</strong>
In addition, due to the way OS X handles communication over the USB connection (you can <a href="http://www.mydarkmaterials.co.uk/2008/11/30/interfacing-php-with-the-arduino/">read more about it here</a>) we need to run a sleep command to prevent the Arduino from resetting itself each time you send data to it.</p>

<pre>
<code lang="bash">
#!/bin/bash

nohup sleep 36000 &lt; /dev/cu.usbserial-A900adK5 &amp;

php tweet-arduino.php
</code>
</pre>

<p>That&#8217;s it. Pass the Arduino program to your Arduino, change the name of your serial device in the PHP script and these scripts should run right out of the box.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[10K Apart Weather App]]></title>
    <link href="http://www.midnightcheese.com/2011/10/10k-apart-weather-app/"/>
    <updated>2011-10-05T00:00:00-05:00</updated>
    <id>http://www.midnightcheese.com/2011/10/10k-apart-weather-app</id>
    <content type="html"><![CDATA[<p><a href="http://www.midnightcheese.com/wx/">10KWX</a> is a responsive weather app that I submitted to this year&#8217;s <a href="http://10k.aneventapart.com/">10K Apart</a> exercise.</p>

<p><a href="http://assets.midnightcheese.com/images/10KWX-Day.png" rel="lightbox"><img src="http://assets.midnightcheese.com/images/10KWX-Day.jpg" border="0" alt="10KWX weather app during the day" /></a></p>

<p>The app uses a web browser&#8217;s <a href="http://dev.w3.org/geo/api/spec-source.html">geo location feature</a> to grab the user&#8217;s location and then pass that info off to <a href="http://developer.yahoo.com/weather/">Yahoo!&#8217;s weather API</a> for current conditions and forecast.</p>

<p><a href="http://assets.midnightcheese.com/images/10KWX-Mobile.png" rel="lightbox"><img src="http://assets.midnightcheese.com/images/10KWX-Mobile.jpg" border="0" class="blogImage" alt="10KWX Mobile screen shots" /></a><small>The application is responsive!</small></p>

<p>To fit within the 10K file size limit, use of images was out of the question. But, what&#8217;s a weather forecast without a nice graphical indicator of the weather? Using the HTML5 canvas element and CSS3 animation I was able to render the graphics and the subtle animation of each weather illustration. (Be sure to check in during a thunderstorm.)</p>

<p>Having done quite a bit of animation in Flash and After Effects, CSS3 animation techniques are actually a welcomed way of doing things. I love being able to specify keyframes as percentage points.</p>

<pre><code lang="css">
@-moz-keyframes rain1 {  
  0% {  
    margin-top: 0px;
    margin-left: 0px;
    opacity: 0;
  }
  20% {
    margin-top: 6px;
    margin-left: -4px;
    opacity: .55;
  }
  80% {
    margin-top: 54px;
    margin-left: -36px;
    opacity: .55;
  }
  100% {  
    margin-top: 60px;
    margin-left: -40px;
    opacity: 0;
  }  
}
</code></pre>

<p>One bug(?) I found with CSS3 animation was not being able to span values across multiple percentage breaks. For example, looking at the animation above, I originally didn&#8217;t have the top and left margin values written out on the 20% and 80% marks, just the 0% and 100% marks. But, this caused some funky animation to occur, especially on the iOS version of Webkit. Adding top and left margin to the 20% and 80% points solved this problem. The only downside: It requires calculating those margin values at that specific percentage point.</p>

<p><a href="http://assets.midnightcheese.com/images/10KWX-Night.png" rel="lightbox"><img src="http://assets.midnightcheese.com/images/10KWX-Night.jpg" border="0" class="blogImage" alt="10KWX weather app at night" /></a></p>

<p>This project was a lot of fun. Surprisingly time consuming, but that happened to be a good thing.</p>

<p>You can view my <a href="http://10k.aneventapart.com/Entry/Details/555">10K Apart project page</a>, the actual <a href="http://10k.aneventapart.com/2/Uploads/555/">10KWX app</a>, and this enhanced version of <a href="http://www.midnightcheese.com/wx/">10KWX</a> with a nice font from Google and the ability to enter a zip code as a URL variable. (?z=33186)</p>

<p>Also, <a href="http://visitmix.com/labs/ai2canvas/">Ai->Canvas</a> is a great plugin for converting Adobe Illustrator shapes to a canvas object.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Podcastin' with Jawgrind]]></title>
    <link href="http://www.midnightcheese.com/2011/09/podcastin-with-jawgrind/"/>
    <updated>2011-09-06T00:00:00-05:00</updated>
    <id>http://www.midnightcheese.com/2011/09/podcastin-with-jawgrind</id>
    <content type="html"><![CDATA[<p>I had the opportunity to geek out with <a href="http://trey.cc/">Trey</a> and <a href="http://about.me/stephenwyattbush">Stephen</a> on the <a href="http://jawgrind.com/post/9729604918/episode-2-stephens-moustache">lastest episode of Jawgrind</a>. We had a lot of fun talking about all things web related: <a href="http://www.vimconf.org/" title="VimConf">VimConf</a>, <a href="http://www.getskeleton.com/" title="Skeleton Boilerplate">Skeleton</a>, <a href="http://10k.aneventapart.com/" title="Responsive Web Design in 10K of code">10K Apart</a> (I&#8217;ll be posting my project soon), bookmarking sites, <a href="http://html5weekly.com/" title="HTML% Weekly">HTML5</a> and <a href="http://javascriptweekly.com/" title="Javascript Weekly">JavaScript Weekly</a>, Rails 3.1 and much more. Alcohol may have been involved.</p>

<p>Stephen and Trey are much more talented in the world of web dev than I, so it was great to sit-in and learn a thing or two. <a href="http://jawgrind.com/post/9729604918/episode-2-stephens-moustache">Give Jawgrind a listen here</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Seedling: A Garden Tracking App]]></title>
    <link href="http://www.midnightcheese.com/2011/08/seedling-a-garden-tracking-app/"/>
    <updated>2011-08-30T00:00:00-05:00</updated>
    <id>http://www.midnightcheese.com/2011/08/seedling-a-garden-tracking-app</id>
    <content type="html"><![CDATA[<p>Since it&#8217;s inception about a year ago, I&#8217;ve been working on a new project that has really been a lot of fun. The project is called <a href="http://seedlinglog.com/">Seedling</a> and it&#8217;s a new web app that will let people track the progress of their backyard gardens.</p>

<p>The app lets you <a href="http://blog.seedlinglog.com/2011/08/logging-plant-progress/">log basic milestones</a> like plant yield, height, photos, etc. With that data, the app  automatically creates graphs so you can visualize the progress and performance of your fruit and vegetables (or any other type of plant.)</p>

<p><a href="http://seedlinglog.com/"><img src="http://assets.midnightcheese.com/images/seedling-app.jpg" alt="Seedling" border="0" class="blogImage" /></a></p>

<p>There will also be a social aspect to Seedling. In addition to posting and sharing photos, people can comment on milestones and follow other users.</p>

<p>We&#8217;re aiming for a soft launch/preview in time for folks to start tracking some of their fall gardens, which means invite emails will be going out soon.</p>

<p>To sign-up for the first launch or to receive more info as we progress, you can get on our email list at <a href="http://seedlinglog.com/">http://seedlinglog.com/</a> We&#8217;ll also be posting more info on the <a href="http://blog.seedlinglog.com/">Seedling blog</a> in the coming weeks.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Broadcast iTunes AirPlay Tracks to Campfire Chat with TrackFire]]></title>
    <link href="http://www.midnightcheese.com/2011/06/broadcast-itunes-airplay-tracks-to-campfire-chat-with-trackfire/"/>
    <updated>2011-06-09T00:00:00-05:00</updated>
    <id>http://www.midnightcheese.com/2011/06/broadcast-itunes-airplay-tracks-to-campfire-chat-with-trackfire</id>
    <content type="html"><![CDATA[<p><strong>Update:</strong> <a href="https://github.com/Cale/TrackFire" title="TrackFire on GitHub">TrackFire is now on GitHub</a> for your forking pleasure.</p>

<p>TrackFire is an <a href="http://developer.apple.com/library/mac/#documentation/AppleScript/Conceptual/AppleScriptX/AppleScriptX.html">AppleScript</a> &#8220;app&#8221; that posts <a href="http://www.apple.com/itunes/">iTunes</a> track titles played over an <a href="http://www.apple.com/itunes/airplay/">AirPlay</a> device to a <a href="http://campfirenow.com/">Campfire</a> chat room.</p>

<p>In the office we often play music from iTunes over an Airport Express device for the entire floor to hear. Inevitably, someone asks, &#8220;What band is this?&#8221; Being the avid users of Campfire that we are, we thought it would be perfect if iTunes AirPlay tracks could automatically have their name and album info posted to a Campfire chatroom. And so TrackFire took form.</p>

<p>The AppleScript runs every few seconds checking for a running version of iTunes, then if iTunes is in play mode and broadcasting to a specific AirPlay device, the track information is posted to Campfire.</p>

<p>For the most part, the script runs without issue, but an error is thrown every once in a while. &#8220;Can&#8217;t make &laquo;class cFIT&raquo; id 10219 of &laquo;class cUsP&raquo; id 10192 of &laquo;class cSrc&raquo; id 65 of application &#8216;iTunes&#8217; into the expected type.&#8221; (Still tracking down the cause.) Thanks to the folks over at the <a href="https://discussions.apple.com/">Apple Discussion Boards</a> for all their help.</p>

<strong>Installation</strong>
<ol>
	<li>Paste the script into AppleScript Editor replacing the Campfire variables with your own information.</li>
	<li>Save as an Application with &#8220;Stay Open&#8221; checked. Double-click your new script and it will run in the background.</li>
	<li> Use iTunes as you normally would and the script does the rest.</li>
</ol>

<pre><code lang="applescript">
(* Begin user defined settings ************)

property campfire_token : "1234567" (* Your Campfire API authentication token *)
property airplay_device : "Apple TV" (* The name of your AirPlay device *)
property campfire_room : "https://yourname.campfirenow.com/room/123456/speak.xml" (* The Campfire room you'd like to post to *)

(* End user defined settings *************)

global current_track, last_track, current_device

on run
	(* init at runtime*)
	set current_track to ""
	set current_device to ""
	set last_track to ""
end run

on idle
	if application "iTunes" is not running then return 10
	tell application "iTunes"
		if (player state is not playing) or (current track is equal to last_track) then return 5
		
		set last_track to current track
		
		set minimized of front browser window to false
		set visible of front browser window to true
		set current_device to my getDevice()
		if current_device as string is not equal to airplay_device & " AirPlay" then return 5
		
		set track_info to my mungeText({name, artist, album} of last_track, "", " :: ")
		set track_info to track_info as string
		set track_info to my mungeText(track_info, "&", "&amp;") -- Replace ampersands
		set track_info to my mungeText(track_info, "\"", "&#34;") -- Replace quotation marks
		set track_info to my mungeText(track_info, "'", "&#39;") -- Replace apostrophes
		
		set shellCommand to ("curl -u " & campfire_token & ":X -H 'Content-Type: application/xml' -d '<message><type>TextMessage</type><body>" & track_info & "</body></message>' " & campfire_room)
		set shellCommand to shellCommand as string
		do shell script shellCommand
		(*display dialog shellCommand*)
		(*log "Posting to Campfire:" & shellCommand*)
		return 5
	end tell
end idle

on getDevice()
	tell application "System Events"
		tell process "iTunes"
			return description of button 8 of window "iTunes"
		end tell
	end tell
end getDevice

on mungeText(itxt, stxt, rtxt)
	set tid to AppleScript's text item delimiters
	if class of itxt is text then
		set AppleScript's text item delimiters to stxt
		set itxt to text items of itxt
	end if
	set AppleScript's text item delimiters to rtxt
	set otxt to itxt as text
	set AppleScript's text item delimiters to tid
	return otxt
end mungeText
</code></pre>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[bbbrowser: Fun with the Dribbble API]]></title>
    <link href="http://www.midnightcheese.com/2011/06/bbbrowser-fun-with-the-dribbble-api/"/>
    <updated>2011-06-09T00:00:00-05:00</updated>
    <id>http://www.midnightcheese.com/2011/06/bbbrowser-fun-with-the-dribbble-api</id>
    <content type="html"><![CDATA[<p>I love thinking up ways to display interesting data that continuously updates. Browsing through the <a href="http://dribbble.com/api">Dribbble API</a> I thought it would be a lot of fun to see <a href="http://dribbble.com/shots/everyone">everyone&#8217;s</a> shots pass through a display as they&#8217;re uploaded.</p>

<p><a href="http://midnightcheese.com/bbbrowser/"><img src="http://assets.midnightcheese.com/images/bbbrowser-small.jpg" border="0" alt="bbbrowser &mdash; Fun with Dribbble" class="blogImage" /></a></p>

<p><a href="http://midnightcheese.com/bbbrowser/">bbbrowser</a> hits the Dribbble API every 24 seconds and displays the newest shots in your browser window. I like to leave this window open throughout the day and watch all the new artwork roll in. It&#8217;s a great source of inspiration. If your browser supports fullscreen mode, even better.</p>

<p>The layout is tailored to widescreen monitors. The images do stretch as your browser is resized, however, so make sure you find that sweet spot between size and aspect ratio. (I&#8217;d hate to see someone&#8217;s beautiful typography get all squishy.)</p>

<p><a href="http://midnightcheese.com/bbbrowser/">Jump in and start exploring</a>!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Arduino, LCD and Plexiglass]]></title>
    <link href="http://www.midnightcheese.com/2011/05/arduino-lcd-and-plexiglass/"/>
    <updated>2011-05-15T00:00:00-05:00</updated>
    <id>http://www.midnightcheese.com/2011/05/arduino-lcd-and-plexiglass</id>
    <content type="html"><![CDATA[<p>I&#8217;ve been wanting to build some type of container for my <a href="http://www.midnightcheese.com/2010/03/hooking-up-a-parallel-lcd-to-arduino/">Ardiuno/LCD combination</a> for some time. A couple weekends ago I finally bought some plexiglass and machine screws and made it happen.</p>

<p>The plexiglass is more fragile than I expected. It&#8217;s extremely scratch prone and cracks easily with just a slight bit of pressure. Scoring and snapping was actually the easiest part of dealing with the plastic. Drilling holes produced small cracks on more than one occasion.</p>

<p>Eventually I  got it right and now the <a href="http://www.arduino.cc/">Arduino</a> and its components have a solid base to function on.</p>

<p><a href="http://assets.midnightcheese.com/images/arduino-lcd-plexiglass-large.jpg" rel="lightbox"><img src="http://assets.midnightcheese.com/images/arduino-lcd-plexiglass.jpg" alt="Arduino, Plexiglass and LCD screen" border="0" class="blogImage" /></a></p>

<p><a href="http://assets.midnightcheese.com/images/arduino-lcd-close-large.jpg" rel="lightbox"><img src="http://assets.midnightcheese.com/images/arduino-lcd-close.jpg" alt="Arduino and LCD screen" border="0" class="blogImage" /></a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[My iPhoneTracker Map is Mostly Useless]]></title>
    <link href="http://www.midnightcheese.com/2011/04/my-iphonetracker-map/"/>
    <updated>2011-04-20T00:00:00-05:00</updated>
    <id>http://www.midnightcheese.com/2011/04/my-iphonetracker-map</id>
    <content type="html"><![CDATA[<p>A former Apple employee has created an app called <a href="http://petewarden.github.com/iPhoneTracker/">iPhoneTracker</a> that pulls data from your iPhone backups in iTunes and then displays pretty much everywhere you&#8217;ve been lately. There&#8217;s a <a href="http://radar.oreilly.com/2011/04/apple-location-tracking.html">huge storm of privacy concern</a> going on as a result.</p>

<p>You can certainly tell what cities someone has been to, but most of the location data is way off. Hundreds of miles off in my case. I can&#8217;t imagine anyone finding much use in this as local data is grossly unreliable.</p>

<p>Here&#8217;s my map. Larger dots are correct. I have been to Birmingham and Jacksonville, but the smaller dots in places like Northwestern Alabama and the central panhandle of Florida are completely incorrect.</p>

<p><a href="http://assets.midnightcheese.com/images/iphonetracker-map-large.png" rel="lightbox"><img src="http://assets.midnightcheese.com/images/iphonetracker-map.jpg" border="0" class="blogImage" alt="iPhoneTracker Map" /></a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Honda Indy Grand Prix at Barber: Photos]]></title>
    <link href="http://www.midnightcheese.com/2011/04/honda-indy-grand-prix-at-barber-photos/"/>
    <updated>2011-04-10T00:00:00-05:00</updated>
    <id>http://www.midnightcheese.com/2011/04/honda-indy-grand-prix-at-barber-photos</id>
    <content type="html"><![CDATA[<p>Select photos from the Continental Tire Sports Car Series Race and the PORSCHE 250 Race (<a href="http://www.grand-am.com/">Grand-Am</a> Rolex Series) on Saturday at the <a href="http://www.barbermotorsports.com/">Barber Motorsports Complex</a> in Birmingham.</p>

<p><a href="http://assets.midnightcheese.com/images/gt-class-line-up.jpg" rel="lightbox"><img src="http://assets.midnightcheese.com/images/gt-line-up-small.jpg" width="420" border="0" class="blogImage" alt="GT Class lined up to enter starting grid at Barber" /></a></p>

<p><a href="http://assets.midnightcheese.com/images/barber-race.jpg" rel="lightbox"><img src="http://assets.midnightcheese.com/images/barber-race-small.jpg" width="420" border="0" class="blogImage" alt="Continental Tire Race at Barber" /></a></p>

<p><a href="http://assets.midnightcheese.com/images/mustang-camaro.jpg" rel="lightbox"><img src="http://assets.midnightcheese.com/images/mustang-camaro-small.jpg" width="420" border="0" class="blogImage" alt="Mustang and Camaro Cars" /></a></p>

<p><a href="http://assets.midnightcheese.com/images/vette.jpg" rel="lightbox"><img src="http://assets.midnightcheese.com/images/vette-small.jpg" width="420" border="0" class="blogImage" alt="Whelen Corvette" /></a></p>

<p><a href="http://assets.midnightcheese.com/images/reba.jpg" rel="lightbox"><img src="http://assets.midnightcheese.com/images/reba-small.jpg" width="420" border="0" class="blogImage" alt="Reba McEntire" /></a></p>

<p><a href="http://assets.midnightcheese.com/images/ants.jpg" rel="lightbox"><img src="http://assets.midnightcheese.com/images/ants-small.jpg" width="420" border="0" class="blogImage" alt="Ant Sculptures at Barber Motorsports Park" /></a></p>

<p><a href="http://assets.midnightcheese.com/images/barber-motorsports.jpg" rel="lightbox"><img src="http://assets.midnightcheese.com/images/barber-motorsports-small.jpg" width="420" border="0" class="blogImage" alt="Barber Motorsports Park" /></a></p>

<p><a href="http://assets.midnightcheese.com/images/camaro.jpg" rel="lightbox"><img src="http://assets.midnightcheese.com/images/camaro-small.jpg" width="420" border="0" class="blogImage" alt="Camaro racing in Continental Tire race" /></a></p>

<p><a href="http://assets.midnightcheese.com/images/vw-gti.jpg" rel="lightbox"><img src="http://assets.midnightcheese.com/images/vw-gti-small.jpg" width="420" border="0" class="blogImage" alt="VW GTI" /></a></p>

<p><a href="http://assets.midnightcheese.com/images/barber-museum.jpg" rel="lightbox"><img src="http://assets.midnightcheese.com/images/barber-museum-small.jpg" width="420" border="0" class="blogImage" alt="Barber Museum" /></a></p>

<p><a href="http://assets.midnightcheese.com/images/st-winners.jpg" rel="lightbox"><img src="http://assets.midnightcheese.com/images/st-winners-small.jpg" width="420" border="0" class="blogImage" alt="ST Class Winners at Victory Lane" /></a></p>

<p><a href="http://assets.midnightcheese.com/images/gt-winners.jpg" rel="lightbox"><img src="http://assets.midnightcheese.com/images/gt-winners-small.jpg" width="420" border="0" class="blogImage" alt="GT Class Winners at Victory Lane" /></a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Nissan Leaf Review]]></title>
    <link href="http://www.midnightcheese.com/2011/03/nissan-leaf-review/"/>
    <updated>2011-03-26T00:00:00-05:00</updated>
    <id>http://www.midnightcheese.com/2011/03/nissan-leaf-review</id>
    <content type="html"><![CDATA[<p>The <a href="http://drivenissanleaf.com/">Nissan Leaf Drive Electric Tour</a> stopped in Franklin this weekend at <a href="http://www.nissanusa.com/about/corporate-info.html">Nissan&#8217;s North American headquarters</a>. I <a href="https://drivenissanleaf.com/Event/Default.aspx">signed up to drive</a> some weeks ago and our group was the first to drive Saturday morning.</p>

<p><a href="http://www.flickr.com/photos/midnightcheese/4286548266/"><img src="http://assets.midnightcheese.com/images/nissan-leaf-front.jpg" alt="Nissan Leaf Nashville" border="0" class="blogImage" width="400" height="266" /></a></p>

<p><strong>In short, the Leaf felt like any other small car.<br />It felt good.</strong>
The Nissan Leaf feels just like any other small sedan on the market. And that&#8217;s a good thing. Actually, the car is quite a bit smoother and feels more solid than most. (The Chevy Aveo is a nightmare on the interstate). But all things considered, aside from the dashboard, there&#8217;s nothing else about the drive that tells you you&#8217;re steering an electric car.</p>

<p>The test drive lasted approximately two and a half miles including some interstate time. Acceleration was excellent. I had no trouble getting up to interstate speeds (70mph).</p>

<p><strong>Range Indicator needs work</strong>
The only thing that really bothered me was the range indicator. The car indicated 103 miles in available range when we left, yet after returning 2.5 miles later, the car indicated 78 miles available. I&#8217;m sure the range algorithm is to blame. Even our tour guide said it was just recently updated to factor in hills. And granted, it was a cold morning (low 40s) with interstate driving and heat blasting. That would take some time to get used to. I wonder if it wouldn&#8217;t be more acceptable as a simple full/empty gauge rather than trying to indicate range down to individual miles. Even most gas cars don&#8217;t try to do this.</p>

<p><img src="http://assets.midnightcheese.com/images/leaf-range-meter.jpg" class="blogImage" border="0" alt="Nissan Leaf Range Meter" /></p>

<p><strong>A Different Driving Interface</strong>
The gear shifter was another oddity where Nissan is trying something different. The car can be in park, drive or eco drive. But it&#8217;s not your standard shifter. To shift from park to drive, the &#8220;shifter&#8221; is more of a nob that you drag in a &#8220;C&#8221; shape, then the nob retracts to it&#8217;s original position. The car is placed back in park by pressing the &#8220;P&#8221; button located in the middle of the shifter nob. That&#8217;s all fine once you get used to it, but if Nissan really wants to get people into electric cars, giving them unfamiliar controls seems to take away from the goal. It&#8217;s just one more excuse for someone not to buy.</p>

<p>Reverse and Neutral were not readily obvious. I was so curious with Drive and Park that I didn&#8217;t even think to ask about those other two.</p>

<p><img src="http://assets.midnightcheese.com/images/nissan-leaf-shifter.jpg" class="blogImage" border="0" alt="Nissan Leaf Shifter" /><br /><small>This photo from Nissan is actually a bit different from the actual model I drove.</small></p>

<p><strong>Minimal Maintenance, Awesome Accessories</strong>
With an electric car you do away with oil changes, radiator fluid (and leaks) and lots of other little sub-mechanics like fuel pumps, water pumps and thousands of moving parts that make up a gasoline engine that inevitably need to be serviced and maintained.</p>

<p>You can basically control the Leaf from your phone. The car can notify you if you forget to pug it in at night. You always know where the closest charging station is, and here&#8217;s the interesting part, Nissan can tell you if someone is using a specific charger. This is huge because this means Nissan knows when, where and how much electricity each car is acquiring (and spending). The data Nissan is collecting is impressive. I assume they&#8217;ll use it to learn the habits of drivers and to make improvements over time.</p>

<p><img src="http://assets.midnightcheese.com/images/leaf-iphone-control.jpg" class="blogImage" border="0" alt="Nissan Leaf iPhone Control" /></p>

<p><strong>I&#8217;d Buy One</strong>
If I had an extra $32K hanging out, I&#8217;d absolutely buy a Leaf. I&#8217;d be paying an early adoper fee at this point, but that&#8217;s okay with me. My commute length (30 miles round-trip) is ideal. Even with our current cars, we rent when taking long trips, so no change there. The Leaf has a funky look, but it could look twice as weird and still not matter as long as I never had to pull up to a gas pump again.</p>

<p>All in all, the Nissan Leaf feels like a great car. The issues described above are just nitpicks which I would love to have the chance to get used to. Hey Nissan, can I barter some design work in exchange for a Leaf? I think that&#8217;s fair.</p>

<p><em>Sorry for the lack of photos this time. We arrived so early, our group was ushered through with zero waiting and I never had time to even pull out my phone. Nissan also didn&#8217;t have the &#8220;Win a Nissan Leaf Booth&#8221; manned, so unfortunately, I won&#8217;t be winning a Leaf. :)</em></p>

<p>Here are a few photos from the Leaf tour from last year:</p>

<p><a href="http://www.flickr.com/photos/midnightcheese/4286548266/"><img src="http://assets.midnightcheese.com/images/nissan-leaf-front.jpg" alt="Nissan Leaf Front" border="0" class="blogImage" width="400" height="266" /></a></p>

<p><a href="http://www.flickr.com/photos/midnightcheese/4285806209/"><img src="http://assets.midnightcheese.com/images/nissan-leaf-charging-port.jpg" alt="Nissan Leaf Charging Port" border="0" class="blogImage" width="400" height="266" /></a></p>

<p><a href="http://www.flickr.com/photos/midnightcheese/4285807777/"><img src="http://assets.midnightcheese.com/images/nissan-leaf-back.jpg" alt="Nissan Leaf Back" border="0" class="blogImage" width="400" height="266" /></a></p>

<p><a href="http://www.flickr.com/photos/midnightcheese/4286549832/"><img src="http://assets.midnightcheese.com/images/nissan-leaf-event-nashville.jpg" alt="Nissan Leaf Event Nashville" border="0" class="blogImage" width="400" height="266" /></a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Bulging MacBook Pro Battery]]></title>
    <link href="http://www.midnightcheese.com/2011/02/bulging-macbook-pro-battery/"/>
    <updated>2011-02-20T00:00:00-06:00</updated>
    <id>http://www.midnightcheese.com/2011/02/bulging-macbook-pro-battery</id>
    <content type="html"><![CDATA[<p>Normally I swap between two different batteries when using my <a href="http://gdgt.com/apple/macbook-pro/15-inch/">MacBook Pro</a>. Today I opened a drawer to my desk to fetch one of the batteries and found a bulging surprise waiting for me. From the photos below you can see the results of some type of internal reaction.</p>

<p>Luckily, the reaction wasn&#8217;t enough to burst the battery or start a fire. Thankfully, the battery wasn&#8217;t in my laptop at the time.</p>

<p><a href="http://assets.midnightcheese.com/images/bulging-macbook-pro-battery.jpg" rel="lightbox"><img src="http://assets.midnightcheese.com/images/bulging-macbook-pro-battery-small.jpg" class="blogImage" /></a></p>

<p><a href="http://assets.midnightcheese.com/images/bulging-macbook-pro-battery-2.jpg" rel="lightbox"><img src="http://assets.midnightcheese.com/images/bulging-macbook-pro-battery-2-small.jpg" class="blogImage" /></a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Just Another Nashville Snowpocalypse]]></title>
    <link href="http://www.midnightcheese.com/2011/02/just-another-snowpocalypse-in-nashville/"/>
    <updated>2011-02-10T00:00:00-06:00</updated>
    <id>http://www.midnightcheese.com/2011/02/just-another-snowpocalypse-in-nashville</id>
    <content type="html"><![CDATA[<p>It only took about 2&#8221; of snow to turn a 30 minute afternoon commute into 2, 3, 4 or more hours. I spent 2 hours in the car after leaving the offive at 8:30 last night. Merredith spent over 4 hours trying to get home.</p>

<p><img src="http://assets.midnightcheese.com/images/nashville-snow-i-65.png" border="0" alt="Snow in Nashville I-65" />
<small>Nashville snow at I-65 near Armory Wednesday Afternoon</small></p>

<p><img src="http://assets.midnightcheese.com/images/nashville-snow-440.png" border="0" alt="Snow in Nashville I-440" />
<small>Nashville snow at I-440 near 21st Ave Wednesday Afternoon</small></p>

<p><img src="http://assets.midnightcheese.com/images/snow-murfreesboro-rd-airport.jpg" border="0" class="blogImage" alt="Snow and traffic on Murfreesboro Road entering the airport tunnel" />
<small>Snow and traffic on Murfreesboro Road entering the airport tunnel</small></p>

<p><img src="http://assets.midnightcheese.com/images/snow-ice-i-24.jpg" border="0" class="blogImage" alt="Snow an Ice on I-24" />
<small>Snow on I-24 Wednesday night around 10:00pm</small></p>

<p><img src="http://assets.midnightcheese.com/images/snow-in-lavergne.jpg" border="0" class="blogImage" alt="Snow in LaVergne Thursday Morning" />
<small>Snow in LaVergne Thursday Morning</small></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Rolex 24 Series Race at Daytona 2011]]></title>
    <link href="http://www.midnightcheese.com/2011/02/rolex-24-series-race-at-daytona-2011/"/>
    <updated>2011-02-02T00:00:00-06:00</updated>
    <id>http://www.midnightcheese.com/2011/02/rolex-24-series-race-at-daytona-2011</id>
    <content type="html"><![CDATA[<p>Compilation of video and still images taken at this year&#8217;s <a href="http://www.grand-am.com/">Rolex Series</a> race at <a href="http://www.daytonainternationalspeedway.com/">Daytona</a>. 

<p><img src="http://assets.midnightcheese.com/images/chairs-daytona-speedway.jpg" width="420" height="420" class="blogImage" border="0" alt="Chairs at Daytona International Speedway" />

<p><iframe title="YouTube video player" class="youtube-player" type="text/html" width="420" height="266" src="http://www.youtube.com/embed/m-E5nuOo6yk" frameborder="0" allowFullScreen></iframe></p>

<p><iframe title="YouTube video player" class="youtube-player" type="text/html" width="420" height="266" src="http://www.youtube.com/embed/3nxqLhgC4G4" frameborder="0" allowFullScreen></iframe></p>

<p><iframe title="YouTube video player" class="youtube-player" type="text/html" width="420" height="266" src="http://www.youtube.com/embed/LvY5VtAtHE0" frameborder="0" allowFullScreen></iframe></p>

<p><iframe title="YouTube video player" class="youtube-player" type="text/html" width="420" height="266" src="http://www.youtube.com/embed/8j17AdIs8lg" frameborder="0" allowFullScreen></iframe></p>

<p><iframe title="YouTube video player" class="youtube-player" type="text/html" width="420" height="266" src="http://www.youtube.com/embed/EMY3QvHzeIE" frameborder="0" allowFullScreen></iframe></p>

<p><iframe title="YouTube video player" class="youtube-player" type="text/html" width="420" height="266" src="http://www.youtube.com/embed/yKMeCE9FNGM" frameborder="0" allowFullScreen></iframe></p>

<p><iframe title="YouTube video player" class="youtube-player" type="text/html" width="420" height="266" src="http://www.youtube.com/embed/xINAPF5b_9U" frameborder="0" allowFullScreen></iframe></p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Another Middle Tennessee Snow]]></title>
    <link href="http://www.midnightcheese.com/2011/01/another-middle-tennessee-snow/"/>
    <updated>2011-01-26T00:00:00-06:00</updated>
    <id>http://www.midnightcheese.com/2011/01/another-middle-tennessee-snow</id>
    <content type="html"><![CDATA[<p>We ended up with 2 inches in the La Vergne area. Definitely a good snow for Middle Tennessee. Here&#8217;s some HD footage from around 7:00 this morning.</p>

<p><iframe title="YouTube video player" class="youtube-player" type="text/html" width="420" height="256" src="http://www.youtube.com/embed/b6L89i0TSp4" frameborder="0" allowFullScreen></iframe></p>

<p>Roads were still bad this morning, despite looking clear. The <a href="http://tncam.midnightcheese.com/">Tennessee Traffic Camera Widget</a> caught this accident.</p>

<p><a href="http://tncam.midnightcheese.com/"><img src="http://assets.midnightcheese.com/images/briley-parkway.png" alt="wreck on Briley Parkway - Tennessee Traffic Widget" border="0" /></a></p>

<p><img src="http://assets.midnightcheese.com/images/2-inches-of-snow.jpg" alt="2 inches of snow" class="blogImage" border="0" /></p>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Tennessee Traffic Widget Version 2.0]]></title>
    <link href="http://www.midnightcheese.com/2011/01/tennesee-traffic-widget-version-2/"/>
    <updated>2011-01-17T00:00:00-06:00</updated>
    <id>http://www.midnightcheese.com/2011/01/tennesee-traffic-widget-version-2</id>
    <content type="html"><![CDATA[<p><a href="http://tncam.midnightcheese.com/">Tennessee Traffic Widget</a> v2.0 has been released. On the front-end, this new version restores Memphis and Knoxville camera images to the widget.</p>

<p>On the back-end, this version of the widget is a complete rewrite. The city and camera list is now dynamically generated each time the widget is accessed. This will result in much faster update times on the periodic occasion that camera image URLs change.</p>

<p>Visit the <a href="http://tncam.midnightcheese.com/">Tennessee Traffic Widget site</a> to download the new version.</p>

<p><a href="http://tncam.midnightcheese.com/"><img src="http://assets.midnightcheese.com/images/tennessee-traffic-widget.jpg" width="348" height="340" alt="Tennessee Traffic camera widget for OS X" border="0" /></a></p>
]]></content>
  </entry>
  
</feed>
