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

  <title>Ted Kulp</title>
  <link href="http://tedkulp.com/atom.xml" rel="self"/>
  <link href="http://tedkulp.com/"/>
  <updated>2012-05-05T19:29:19-04:00</updated>
  <id>http://tedkulp.com/</id>
  <author>
    <name>Ted Kulp</name>
    
  </author>

  
  <entry>
    <title>Using Pagekite with Pow!</title>
    <link href="http://tedkulp.com/2012/05/05/using-pagekite-with-pow%21/"/>
    <updated>2012-05-05T18:51:31-04:00</updated>
    <id>http://tedkulp.com/2012/05/05/using-pagekite-with-pow!</id>
    <content type="html">&lt;p&gt;There are always situations where you need to display the work on your local maichine to the outside world.
In the old days, we would setup a dyndns account, forward some weird port on our firewall to port 80 on our
local machine, and give out the weird URL. Those, my friends were the dark ages.&lt;/p&gt;

&lt;p&gt;Now we have services like &lt;a href=&quot;https://pagekite.net/&quot;&gt;Pagekite&lt;/a&gt;. Basically, Pagekite makes it stupid easy to
make a tunnel from your local machine to a URL on the outside world. It handles all the traffic tunneling
for you, which is really impressive. It can basically forward any port, which makes it great for SSL and
stuff.&lt;/p&gt;

&lt;p&gt;On my local machine, I use Pow! for all of my rails development. It basically makes http://anything.dev
point to a local running rails instance. It's been discussed before, so I won't go into it. But, Pow! works
by reconfiguring your local DNS and making anything with .dev point to your localhost and a weird port behind
the scenes. It needs to know what the hostname is in order to know what site to use.&lt;/p&gt;

&lt;p&gt;Since Pagekite gives you one URL (at least by default) that doesn't end in .dev, Pow! will have no clue what
site to serve when you go to your Pagekite URL and just give you a generic welcome message. I came up with a
quick hack to work around this limitation.&lt;/p&gt;

&lt;p&gt;Create (or modify if you have one) a &lt;code&gt;~/.powconfig&lt;/code&gt; file. In it, put the following:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
export POW_EXT_DOMAINS=pagekite.me
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now, restart Pow! (I use Powify, so that's just &lt;code&gt;powify server restart&lt;/code&gt; for me). Then, create a new Pow!
site for your current app that is the same name as your Pagekite hostname.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
ln -s . ~/.pow/pagekitehostname
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Voila! External page serving bliss. And if there's a situation where you need to show a different app
instead, you just change your pagekitehostname symlink to point to a different app instead. Easy!&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Instagram on Android Backlash</title>
    <link href="http://tedkulp.com/2012/04/12/instagram-on-android/"/>
    <updated>2012-04-12T00:00:00-04:00</updated>
    <id>http://tedkulp.com/2012/04/12/instagram-on-android</id>
    <content type="html">&lt;p&gt;&lt;img src=&quot;https://img.skitch.com/20120413-ghcciadwrhxtuq4fs9igj7xmnk.jpg&quot; alt=&quot;Really?&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Does anyone else find this as hilarious as I do? Just one of many pictures from the
&lt;a href=&quot;http://failblog.org/2012/04/05/mobile-phone-texting-autocorrect-autocowrecks-apple-fans-butthurt-that-android-got-instagram/&quot;&gt;failblog post&lt;/a&gt;
about people being butthurt about Instagram finally debuting on Android. It's a great
collection of real rocket scientists, too. But that's beside the point.&lt;/p&gt;

&lt;p&gt;They're all complaining that Andoird users are going to screw up their perfect walled garden.
If this is perfection, then we're all doomed. The Instagram of today isn't the same as the one
I left 9 months ago when I moved to Android. Since then it's become the mainstream place to post
things. And while that's not all bad, once you let in the masses, things tend to lose their charm.&lt;/p&gt;

&lt;p&gt;Maybe I'm some kind of hipster, but Instagram in it's early days really had some great pictures, or
at least was about sharing your little life moments. And at it's heart, that's what it is and is
still great at that. But acting like it's the perfect community of artists is a little disingenuous.&lt;/p&gt;

&lt;p&gt;Take a look at the Popular page at any time of the day. What do they normally consist of?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The boy band of the moment (swoon!)&lt;/li&gt;
&lt;li&gt;Some half naked girl who's skirting by the no nudity rules with some fairly clever hand placement because she has some &quot;Daddy Love Me&quot; complex (no, I'm not complaining -- I'm making a point)&lt;/li&gt;
&lt;li&gt;A teenager who could practically be a model complaining how awkward or skinny they are. (Boo hoo, I feel so sorry for you)&lt;/li&gt;
&lt;li&gt;Random bad picture from some B level celebrity and what they had for dinner&lt;/li&gt;
&lt;li&gt;Maybe two quality pictures of real photography in there somewhere (big maybe)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Has anyone read the comments to any of those pictures? They're a very, very slight step up from YouTube comments.&lt;/p&gt;

&lt;p&gt;The point is that this &quot;community&quot; is a bunch of BS. When things go mainstream,
that &quot;community&quot; is over. There's little subgroups in there somewhere, but it's
not what it was when it first started. Stop being some hipster remembering the
glory days and think they still exist. They don't. It's the real world, my
friends. And most people don't have anything in common with most people.&lt;/p&gt;

&lt;p&gt;I'm not saying it's a useless app. There are great pockets of really creative people
doing a lot of great things. But let's face it, the people who bitched the most were
most likely contributing the garbage that makes the app useless outside of those
great, creative circles.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Padrino and the Asset Pipeline</title>
    <link href="http://tedkulp.com/2011/11/25/padrino-and-the-asset-pipeline/"/>
    <updated>2011-11-25T20:46:44-05:00</updated>
    <id>http://tedkulp.com/2011/11/25/padrino-and-the-asset-pipeline</id>
    <content type="html">&lt;p&gt;I've been messing with &lt;a href=&quot;http://www.padrinorb.com/&quot;&gt;Padrino&lt;/a&gt; a bit over the past couple of weeks.
There are several smallish apps that I've thought that Rails was a
little bit of overkill for. However, what I didn't realize that I was
missing was the Asset Pipeline. It's terribly useful, especially if you
tend to mix technologies together in the same app. Once you get into the
habit of using it, it gets hard to go without.&lt;/p&gt;

&lt;p&gt;I decided to see if I could implement &lt;a href=&quot;https://github.com/sstephenson/sprockets&quot;&gt;Sprockets&lt;/a&gt; directly into Padrino.
It turned out to be fairly easy to do, especially since there was
already a &lt;a href=&quot;https://github.com/nightsailer/padrino-sprockets&quot;&gt;padrino-sprockets&lt;/a&gt; gem out there. Once I figured out the
proper way to put everything together, it worked perfectly.&lt;/p&gt;

&lt;p&gt;Here is a very quick walkthrough of how to set it up with a brand new
Padrino app. Let's create a basic Padrino application. I've basically
picked my usual defaults, but it doesn't matter too much which you use.
The bonus is that any of the rendering and templates gems will be
available for Sprockets already.&lt;/p&gt;

&lt;p&gt;``` bash&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;padrino g project something -t cucumber -s jquery -e slim -c compass -e slim
cd something
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;```&lt;/p&gt;

&lt;p&gt;Add the following to your Gemfile. This will add the padrino-sprockets
gem as well as the handlers for Coffeescript. That part's optional, but
given the Coffeescript love in Rails 3.1 and above, you'll probably want
it.&lt;/p&gt;

&lt;p&gt;``` ruby&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# Use Sprockets
gem 'padrino-sprockets', :require =&amp;gt; 'padrino/sprockets'

# Use Coffeescript
gem 'coffee-script'
# rack-coffee shouldn't be needed
# gem 'rack-coffee', :require =&amp;gt; 'rack/coffee'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;```&lt;/p&gt;

&lt;p&gt;Run bundler and make sure all the gems are installed.&lt;/p&gt;

&lt;p&gt;``` bash&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;bundle install
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;```&lt;/p&gt;

&lt;p&gt;Now let's move all of the stuff in public to app/assets instead. The
default stylesheets and javascripts are fine defaults.&lt;/p&gt;

&lt;p&gt;``` bash&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;mkdir -p app/assets
mv public/* app/assets/
rm app/assets/favicon.ico
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;```&lt;/p&gt;

&lt;p&gt;Replace app/assets/javascripts/application.js with the following. This is
basically the default rails application.js file, and just automatically
includes all other files in this directory. Putting the jquery and
jquery-ujs files isn't necessary, but putting them explicitly in the
file makes sure that they show up before everything else.&lt;/p&gt;

&lt;p&gt;``` javascript&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// This is a manifest file that'll be compiled into including all the files listed below.
// Add new JavaScript/Coffee code in separate files in this directory and they'll automatically
// be included in the compiled file accessible from http://example.com/assets/application.js
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// the compiled file.
//
//= require jquery
//= require jquery-ujs
//= require_tree .
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;```&lt;/p&gt;

&lt;p&gt;And do the same for app/assets/stylesheets/application.css&lt;/p&gt;

&lt;p&gt;``` css&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/*
 * This is a manifest file that'll automatically include all the stylesheets available in this directory
 * and any sub-directories. You're free to add application-wide styles to this file and they'll appear at
 * the top of the compiled file, but it's generally better to create a new file per style scope.
 *= require_self
 *= require_tree .
*/
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;```&lt;/p&gt;

&lt;p&gt;The last thing we need to do is put the sprockets init code into
app/app.rb config block. This just includes sprockets and
padrino-sprockets and starts it up.&lt;/p&gt;

&lt;p&gt;``` ruby&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# Sprockets support
require 'sprockets'
register Padrino::Sprockets
sprockets
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;```&lt;/p&gt;

&lt;p&gt;Now if you startup the server, you should be able to hit
&lt;code&gt;http://site/assets/application.js&lt;/code&gt; and
&lt;code&gt;http://site/assets/application.css&lt;/code&gt;, you should get the proper results.&lt;/p&gt;

&lt;p&gt;The only issue I've found is that there is no easy way to override the
directories for where stylesheets and javascripts are stored. This
basically makes stylesheet_link_tag and javascript_include_tag useless.
Instead, you'll have to hardcode the following into the head section of
your application layout.&lt;/p&gt;

&lt;p&gt;``` html&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;link href=&quot;http://tedkulp.com/assets/application.css&quot; media=&quot;screen&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&amp;gt;
&amp;lt;script src=&quot;http://tedkulp.com/assets/application.js&quot; type=&quot;text/javascript&quot;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;```&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Impressions on Android</title>
    <link href="http://tedkulp.com/2011/10/17/impressions-on-android/"/>
    <updated>2011-10-17T05:57:29-04:00</updated>
    <id>http://tedkulp.com/2011/10/17/impressions-on-android</id>
    <content type="html">&lt;p&gt;&lt;em&gt;(Note: I actually started writing this over a week ago. I can probably
rewrite some of it at this point, but I'm going to keep it written with
the feel that I just got the phone a day or two ago.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Before I became an iPhone user in early 2008, I was rocking the Treo for
years. From the first day that I fixed a client's problem via email
while out to dinner, I was hooked on the idea of a Smartphone. This is
obviously not a great thing for everyone, but in my particular line of
work, it was indispensable. Not that the Treo was very smart.&lt;/p&gt;

&lt;p&gt;&lt;span class='caption-wrapper'&gt;&lt;img class='caption' src='https://img.skitch.com/20111010-bthb6gxkb9en5r7nhrnktpf8w8.jpg' width='' height='' alt='The iPhone 1' title='The iPhone 1'&gt;&lt;span class='caption-text'&gt;The iPhone 1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;The iPhone 1 was an amazing device, even in it's terribly locked up
state. This was the dark ages of no apps. If you wanted to do anything
outside of the 10 standard applications on the phone, you had to
jailbreak it, and install apps via Cydia. Being technical, this wasn't
a huge deal to me, but it was still pretty amazing when the App Store
was released.&lt;/p&gt;

&lt;!-- more --&gt;


&lt;p&gt;I had the iPhone 1 for about 18 months before the 3GS was released,
which I got that week. I'm not a sucker to sit out in line on day 1
normally, so I went to a random AT&amp;amp;T store about two days after it was
released and got it no problem. The iPhone 3GS has done well, but by the
end of it's life, it started showing it's age and I was ready to move on
again -- especially after my two year contract was up.&lt;/p&gt;

&lt;p&gt;&lt;span class='caption-wrapper'&gt;&lt;img class='caption' src='https://img.skitch.com/20111010-muj9t7qeuurh3trmd34rs4k9yg.jpg' width='' height='' alt='The Trusty 3GS' title='The Trusty 3GS'&gt;&lt;span class='caption-text'&gt;The Trusty 3GS&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;In February, I posted &quot;&lt;a href=&quot;http://tedkulp.com/should-i-go-android/&quot;&gt;Should I Go Android?&lt;/a&gt;&quot;, which was basically saying
that I was getting fed up with recent Apple changes to the iOS ecosystem
and was looking for a change. The only reason I didn't do it then is
because the Atrix didn't come out until later and the reviews were mixed
at best.&lt;/p&gt;

&lt;p&gt;I said that I would basically wait until a premiere phone was released
or the iPhone 5 (well, 4S), and wait I did. I decided to hold out for
the Galaxy S2 to be released in the states. Little did I know it was
going to take 6 months... but I was determined.&lt;/p&gt;

&lt;p&gt;About two weeks ago, my trusty 3GS started acting up. It wouldn't pause
correctly, and was doing some other weird things. Then it just stopped
working all together. At this point, the S2 release date was live and
the Apple date was announced, so I decided to wait another couple of
weeks and slum it with wife's old 3G that was sitting in a drawer.&lt;/p&gt;

&lt;p&gt;AT&amp;amp;T released the Galaxy S2 two days before the iPhone 4S was announced.
Initially, I was going to wait and see what was announced, but as the
rumors about the 4S being a minor upgrade from the 4 became more apparent, it
became clear that it wasn't worth waiting for. That Sunday morning, I
ran up to the mall and took the plunge (after asking if I had time to
return it -- 30 days, apparently).&lt;/p&gt;

&lt;p&gt;&lt;span class='caption-wrapper'&gt;&lt;img class='caption' src='https://img.skitch.com/20111010-t81458npds7y72trrjc915asur.jpg' width='' height='' alt='The Samsung Galaxy S2' title='The Samsung Galaxy S2'&gt;&lt;span class='caption-text'&gt;The Samsung Galaxy S2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;h3&gt;Hardware&lt;/h3&gt;

&lt;p&gt;The Galaxy S2 is beautiful. The size is bordering on being a little too
big, but it's not detremental to the device. It still fits fine in my
pocket. The thinness of it is just amazing... I'm really impressed how
much they can get into such a small package.&lt;/p&gt;

&lt;p&gt;The AMOLED+ screen is really bright -- insanely so. In fact, I almost
think it's a little too colorful. When I take a picture, all the images
look SO saturated. It's totally unnatural looking and throws me off.
It's only until I get the picture online and look at it from a regular
computer that I realize that it's the screen playing tricks on me. It
took me a day or two to get over it.&lt;/p&gt;

&lt;p&gt;Speaking of the camera, I'm not that impressed with it. I'm not sure if
it's the camera itself, or Samsung's camera application. There's a well
known pink spot problem that I do see, and any images that use the flash
are just flat out ugly. The white balance is all wrong, as well, and any
image taken indoors is entirely too warm. Since the camera is something
I use a lot, I'll definitely be messing with it more until I figure it
out.&lt;/p&gt;

&lt;p&gt;Battery life is pretty great. The first day I got it, I was a bit
concerned as it seemed to be dying quickly, but it must've been because
I was constantly fiddling with it. If I charge it overnight (I bought a
dock for my bed), and with regular use (several hours of podcasts, some
phone and SMS), it's only at about 40% by the time I go to bed. I think
that's more than acceptable -- as I knew I was going to have to do a
charge nightly once I went to an Android phone. It's just the way it is.&lt;/p&gt;

&lt;h3&gt;User Experience&lt;/h3&gt;

&lt;p&gt;I listen to a lot of pundits on various podcasts that tell me about how
bad Android is to use, and how anything coming out of Cupertino is the
best thing since sliced bread. Honestly, except for fixing something on
my dad's phone once, I never touched Android in any depth before I had
already given them my credit card. Without a clue how to use it, I left
the store.  Talk about a leap of faith.&lt;/p&gt;

&lt;p&gt;The way it was getting talked up, I was expecting this big learning
curve with switching to a new operating system. And it's not true. Yes,
Android works differently than iOS. The home screens and the application
list are separate, and some things interact differently than you intiall
expect. But when it comes down to it, it's not any more difficult to
use. It's just like the differences beween Windows and Mac ..It works,
and it's intuitive -- it's just different.&lt;/p&gt;

&lt;p&gt;It does have some advantages, though. Widgets are amazing to use, and
it's still something that iOS still doesn't have. The notification
improvements are awesome too, though I know iOS 5 has something similar
now. I love the fact that you can turn on/off Bluetooth, GPS and Wifi
right from the notification pulldown -- this was something that I had on
my jailbroken 3GS and I'm glad it exists here.&lt;/p&gt;

&lt;p&gt;It does have some downsides, of course. Relying on the back button is
kind of a pain, though it is nice that it's ubiquitous to the device.
You also have to get used to the idea of the Settings menu and thinking
of it as sort of a &quot;right click&quot;. There is a lot of inconsistency in
what shows up there, but you get used to it after awhile. It also means
a lot less cluttered interfaces as compared to some iOS apps (GoodReader,
I'm looking at you). It also took me awile to figure out the &quot;hold down
home to switch apps&quot; thing -- that wasn't obvious at all.&lt;/p&gt;

&lt;p&gt;&lt;span class='caption-wrapper'&gt;&lt;img class='caption' src='https://img.skitch.com/20111017-n8w1t6uejt4b3a53hca1gkrqqk.jpg' width='' height='' alt='GoodReader. Great app, but yikes!' title='GoodReader. Great app, but yikes!'&gt;&lt;span class='caption-text'&gt;GoodReader. Great app, but yikes!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;h3&gt;Apps / Marketplace&lt;/h3&gt;

&lt;p&gt;Yes, Apple still has a leg up in this case. The fact of the matter is
that the Android Marketplace is the Wild West. Pretty much anything
goes, just like the regular internet. And just like the internet, you
have to be careful what you download and what you agree to. I can see
that being a big issue for the &quot;normals&quot;, but for a nerd like myself, I
don't mind it. I just watch what I'm doing, check reviews, make sure I
know who is actually releasing the app, etc. It's not difficult, but it
is a lot to ask of the general populace. It's in this case that I
totally get why Apple does what it does... for the most part. I still
don't get things like not being able to release a Gmail app because
people will &quot;get confused&quot; -- that's still anti-competitive bullshit.&lt;/p&gt;

&lt;p&gt;Just like my initial research on Android, I'm only missing one
application in my switch -- Instagram. Now understand that any iOS games I play are
on my iPad, so I'm a bit of a rare case in that I didn't have a lot of
iPhone games. As far as all the other apps I normally use, mainly
Foursquare, Twitter, Google+, etc., I'm finding perfect parity.&lt;/p&gt;

&lt;p&gt;Now, as a card carrying member of the Google Experience, I'm finding
Android to totally shine over iOS. The GMail app is incredible. The
Google Voice integration (it's my main phone # for work) is fantastic
and I could only wish that it could work like that in iOS. It's
something that Apple wouldn't let fly...  oh well.&lt;/p&gt;

&lt;p&gt;I also find the ability to replace the default app for different
functions incredible. Don't like the default Android camera (actually Samsung replaced it, but either way I don't), totally
replace it. Default calendar crappy (hint: it is)? Then replace it.
Again, I can see where Apple is coming from a customer service and
controlling the experience aspect, but I'm not a child and I can take
it. I know that I can change it back if I don't like my new default --
no big deal.&lt;/p&gt;

&lt;p&gt;Did I mention I'm missing Instagram? No, Picplz is not as good. Can't
they get on that already? I'm dying here.&lt;/p&gt;

&lt;h3&gt;Where to from here?&lt;/h3&gt;

&lt;p&gt;I had 30 days to decide if I was keeping this phone. I basically asked
just in case the iPhone 4S turned out to be something that I absolutely
had to have. When it was announced, I was feeling a little better about
my decision. While it seems like a nice phone, it's not a huge step, and
it's allowing me to see how the other side lives for awhile.&lt;/p&gt;

&lt;p&gt;Ice Cream sandwich is coming, and since my phone is new enough, I'll
actually get to see and enjoy it. For the moment, though, I'm looking to
root, unlock, and put &lt;a href=&quot;http://www.cyanogenmod.com/&quot;&gt;Cyanogenmod&lt;/a&gt; on this thing &lt;em&gt;(edit: I've done them
all already)&lt;/em&gt; and enjoy the idea of controlling my phone's destiny for
awhile.&lt;/p&gt;

&lt;p&gt;We'll see where things lie in the iOS/Android war in another two years
when my contract is up. Until then, I'm digging my decision.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Standing Desk Switch</title>
    <link href="http://tedkulp.com/2011/08/29/standing-desk-switch/"/>
    <updated>2011-08-29T13:07:09-04:00</updated>
    <id>http://tedkulp.com/2011/08/29/standing-desk-switch</id>
    <content type="html">&lt;p&gt;I work for myself, from home. There are a lot of positives about this
fact... I have no commute, I have a lot of flexibility in my schedule,
and the coffee is a lot better. But, it does have negatives as well. For
instance, it could literally be days between the times that I leave the
house. Since my job is software engineering, it also means I spend 8-10
hours a day at my desk, sitting in the chair, slowly shortening my
lifespan.&lt;/p&gt;

&lt;p&gt;&lt;span class='caption-wrapper'&gt;&lt;img class='caption' src='https://lh4.googleusercontent.com/-yrQg_Ur5FoQ/Tk5c-6yiOrI/AAAAAAAAA6I/x58v4ZzlNmw/s640/20110804-IMG_1988.jpg' width='' height='' alt='My New Home' title='My New Home'&gt;&lt;span class='caption-text'&gt;My New Home&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;I've actually heard about the standing desk movement for a long time
now, but never really gave it a lot of serious consideration. That's
partially due to be younger, I guess. Indestructible. But I've kind of
made this my year to start considering some changes in my lifestyle --
and sitting all day isn't something I really need to be doing. I like
my job, but I don't really like that aspect of it.&lt;/p&gt;

&lt;!-- more --&gt;


&lt;p&gt;The thing that really threw me over the edge was the &lt;a href=&quot;http://smarterware.org/7102/how-and-why-i-switched-to-a-standing-desk&quot;&gt;article&lt;/a&gt; that Gina
Tripani posted earlier this year on her transition. She's in the same
situation that I'm in -- 8-10 hours a day in the same spot. I had made
up my mind and decided to make this my project to do this summer.&lt;/p&gt;

&lt;p&gt;Before committing to anything, I figured that I better test out the
concept first and make sure that it was something I really wanted to do.
For a day or two, I propped up my keyboard and mouse using a board and
some milk crates. Because my monitors weren't raised, it wasn't
something I could do for a long period of time since it would eventually
strain my neck, but I at least wanted to know if I had enough stamina to
handle that much.&lt;/p&gt;

&lt;p&gt;Ignoring the neck cramps, it went very well and I knew I was ready to
commit a little more seriously.&lt;/p&gt;

&lt;p&gt;My office sits in a room that was converted from a carport years ago by
the last owner. They did a pretty lousy job, and because of that, the
concrete floor still remains -- they just carpeted over it. However,
because of this, it gives me a little bit of leeway as far as what I can
do in the room and not worry about messing it up.&lt;/p&gt;

&lt;p&gt;I knew the long term goal was to get my dad to make nice risers for my
desk at his metal shop, but I didn't want him to go through the trouble
only for me to decide that it didn't work for me. It's time and
materials for him to make something, so I didn't want to waste it.&lt;/p&gt;

&lt;p&gt;However, cinder blocks are really cheap. Since it's a concrete floor,
bringing cinder blocks into the room really doesn't mess anything up --
they just sort of fit right in. My desk has three &quot;T&quot; legs on it, so I
bought six 8&quot; blocks and six 4&quot; half-blocks and proceeded to life my
desk up. This meant that if I decided I didn't like it, I could just
lose the cinder blocks and only be $15 in the hole.&lt;/p&gt;

&lt;p&gt;I did this roughly six weeks ago. I did break down and buy a &lt;a href=&quot;http://www.ikea.com/us/en/catalog/products/S09874587#/S99874583/&quot;&gt;bar stool&lt;/a&gt; to
sit on in case I get tired -- but so far I maybe only use it 30-60 min a
day. Usually that's when I'm either in a conversation on Skype or really
trying to think through a tough problem. The rest of the time, standing
has just become the norm. Sitting here is less comfortable than
standing, which was the correct outcome if you ask me.&lt;/p&gt;

&lt;h3&gt;How did you adjust?&lt;/h3&gt;

&lt;p&gt;I generally like to jump right into things. I didn't have the bar stool
for the first week, and I forced myself the whole time. The first two
days were pretty rough. I actually have to imagine that I lost a good
deal of productivity because I just wasn't concentrating as hard on my
work as I would usually. The uncomfortable feeling would bring me out of
any deep thought or &quot;groove&quot; that I might have gotten into normally.&lt;/p&gt;

&lt;p&gt;By day three, this wasn't an issue. My feet still hurt at the end of the
day, but I found myself able to concentrate for the majority of the day.
By the beginning of the next week, there was no problems at all.&lt;/p&gt;

&lt;h3&gt;What kind of desk is that?&lt;/h3&gt;

&lt;p&gt;It's the &lt;a href=&quot;http://www.ikea.com/us/en/catalog/products/S39855479&quot;&gt;IKEA Galant&lt;/a&gt; series. I purchased it about three years ago when I
went into business for myself. It's roughly the layout I linked to, but
the piece on the right is longer on mine.&lt;/p&gt;

&lt;p&gt;I've also added the two shelves using the 47&quot; version of the &lt;a href=&quot;http://www.ikea.com/us/en/catalog/products/20025047&quot;&gt;Ekby Järpen shelf&lt;/a&gt;
and attaching on &lt;a href=&quot;http://www.ikea.com/us/en/catalog/products/00054564&quot;&gt;6&quot; Capita legs&lt;/a&gt; directly to the bottom.&lt;/p&gt;

&lt;p&gt;The bar stool is the 30&quot; &lt;a href=&quot;http://www.ikea.com/us/en/catalog/products/S09874587#/S99874583/&quot;&gt;Henriksdal&lt;/a&gt;. It's fairly comfortable, but
not enough that you want to sit on it for hours at a time, which is
perfect.&lt;/p&gt;

&lt;p&gt;Most interestingly, my headphones holder that hangs under the desk is a
&lt;a href=&quot;http://www.ikea.com/us/en/catalog/products/20047898&quot;&gt;toilet paper roll holder&lt;/a&gt;. I love IKEA.&lt;/p&gt;

&lt;h3&gt;Any other suggestions?&lt;/h3&gt;

&lt;p&gt;Wear good shoes. In my case, it's especially important because of the
concrete floor.  Since it was summer, I made the mistake of trying to
do a whole day without shoes on. But the 3rd hour, my feet were killing
me. Having no support is a terrible idea, and now I always wear sneakers
and socks, or at a minimum, sandals with some decently padded soles.&lt;/p&gt;

&lt;p&gt;I've also done the same thing as Gina and put a foot stool under my desk
that I can prop one foot or the other on from time to time. It seems to
really help to take the pressure off of one foot and then the other
periodically without having to resort to sitting for a long stretch of
time.&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;I'm definitely happy with my decision. Once things calm down at my dad's
shop, I'll probably get the nicer looking risers put together and ditch
my cinder blocks. It was a nice prototype, but it really is a bit of an
eyesore... concrete floor or not.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Using Pow for PHP (or anything on Apache)</title>
    <link href="http://tedkulp.com/using-pow-for-php-or-anything-on-apache"/>
    <updated>2011-08-19T12:07:30-04:00</updated>
    <id>http://tedkulp.com/using-pow-for-php-(or-anything-on-apache)</id>
    <content type="html">&lt;p&gt;When I reinstalled my system w/ Lion a few weeks back, I decided to
start using &lt;a href=&quot;http://pow.cx/&quot;&gt;Pow!&lt;/a&gt; as my &quot;web server&quot; of choice. I've been spending a
lot more time in Rails over the past few months because of my day job
and wasn't really relying on my Apache/PHP installation as much. I
delegated Apache off to port 8080 while Pow took port 80 over because it
was just too convenient.&lt;/p&gt;

&lt;p&gt;The way I've always done my PHP development was just dump my projects in
subdirectories of the Apache web root (&lt;code&gt;/Library/WebServer/Documents&lt;/code&gt;) and
leave it at that. Most of my URLs would look something like:
&lt;code&gt;http://localhost:8080/some-project&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Today I was luck enough to come across this post in Assaf Arkin's Lab
Notes site: &lt;a href=&quot;http://labnotes.org/2011/08/09/using-pow-with-your-node-js-project/&quot;&gt;Using Pow with your Node.js project&lt;/a&gt;. Long story short
is that it uses the fact that config.ru is actually a Ruby script and
uses it to make a little proxy to connect to whatever node.js server/daemon
that you happen to be running. It still requires you to start it up, but it's
pretty convenient to have it with the same URL scheme and port 80-ness
of the rest of your projects.&lt;/p&gt;

&lt;p&gt;I immediately decided to see if I could modify it to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Work on my port 8080 Apache install and&lt;/li&gt;
&lt;li&gt;Get it to automatically work with my subdirectory scheme.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;First, I dropped an .rvmrc into my PHP project's directory so I had a
php specific gemset.&lt;/p&gt;

&lt;p&gt;``` bash&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;rvm_install_on_use_flag=1
rvm --create use 1.9.2@php
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;```&lt;/p&gt;

&lt;p&gt;Then, I installed rack into that gemset.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;gem install rack&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;I copied in my modified config.ru (which, incidentally has the path
&lt;em&gt;some-project&lt;/em&gt; hardcoded at the moment -- I'll clean it up later.)&lt;/p&gt;

&lt;p&gt;``` ruby&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require &quot;net/http&quot;

class ProxyApp
  def call(env)
    begin
      request = Rack::Request.new(env)
      headers = {}
      env.each do |key, value|
        if key =~ /^http_(.*)/i
          headers[$1] = value
        end
      end
      http = Net::HTTP.new(&quot;localhost&quot;, 8080)
      http.start do |http|
        response = http.send_request(request.request_method, '/some-project' + request.fullpath, request.body.read, headers)
        [response.code, response.to_hash, [response.body]]
      end
    rescue Errno::ECONNREFUSED
      [500, {}, [&quot;Server is down, try $ sudo apachectl start&quot;]]
    end
  end
end
run ProxyApp.new
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;```&lt;/p&gt;

&lt;p&gt;And lastly, symlinked my directory into my &lt;code&gt;~/.pow&lt;/code&gt; dir. Since I use
powify, I just did a &lt;code&gt;powify create&lt;/code&gt; to basically do the same thing.&lt;/p&gt;

&lt;p&gt;Pointed my browser to &lt;code&gt;http://some-project.dev&lt;/code&gt; and voila! I don't see any visible slowdowns related
to the proxy, and it works really nicely. It's a keeper!&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Wonderworks</title>
    <link href="http://tedkulp.com/2011/08/16/wonderworks/"/>
    <updated>2011-08-16T07:53:17-04:00</updated>
    <id>http://tedkulp.com/2011/08/16/wonderworks</id>
    <content type="html">&lt;p&gt;&lt;a href=&quot;https://picasaweb.google.com/lh/photo/pNLhya5gy1cgXifuTjWrFQ?feat=directlink&quot;&gt;&lt;img class='' src='https://lh5.googleusercontent.com/-mB9FLpfM6W8/Tknl3SMe7zI/AAAAAAAAA5I/NuqYmJcBzKw/s640/IMG_2059_60_61_tonemapped.jpg' width='640' height='427' alt='' title=''&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wonderworks in Myrtle Beach is one of the neatest buildings I've seen
in awhile. Basically a building constructed to look like it fell upside
down on top of another one. The light was perfect, so I propped my arm
on a handrail and grabbed a 2+2 stop HDR.&lt;/p&gt;

&lt;p&gt;I think I'm starting to finally get an eye for where HDR really works.
You really start to see where pictures that look great in your head
that would never actually turn out if you took the picture. I think this
falls into that category.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Switch to Octopress</title>
    <link href="http://tedkulp.com/2011/08/15/switch-to-octopress/"/>
    <updated>2011-08-15T08:42:49-04:00</updated>
    <id>http://tedkulp.com/2011/08/15/switch-to-octopress</id>
    <content type="html">&lt;p&gt;A couple of weeks ago, I stumbled on the &lt;a href=&quot;http://octopress.org&quot;&gt;Octopress&lt;/a&gt;
project. It's essentially a cleaned up framework around the &lt;a href=&quot;http://jekyllrb.com&quot;&gt;Jekyll&lt;/a&gt;
blogging &quot;engine&quot; that Github Pages uses (an my site). It gives it a
clean HTML 5 template, some nice plugins, etc. Since it's essentially
just a pretty version of Jekyll, I knew that it would be possible to
swtich with minimal work and saved it for when I was on vacation and
looking for little personal projects to work on.&lt;/p&gt;

&lt;p&gt;Switching was fairly simple. The only thing that really required work
was porting over my post_filter code from my Jekyll fork. Basically, I
added a bunch of hooks to Jekyll to allow me to run plugins before and
after rendering, and after a page was written to the disk. Hooking into
that allows me to do things like auto-post items to my archive blog, and
send out bitly links to Twitter when something is posted.&lt;/p&gt;

&lt;p&gt;Luckily, I've learned a lot about ruby since I wrote that stuff, and was
now competent to do it with monkey patching the jekyll gem instead of
having to keep a fork -- which made it really clean. Once that was
there, my other plugins started working immediately.&lt;/p&gt;

&lt;p&gt;Since Octopress is just Jekyll under the hood, all of my other things
worked without any intervention. My email-to-post script works, as well
as my automatic Dropbox publishing stuff that I setup.&lt;/p&gt;

&lt;p&gt;In fact, the only thing I had to fix was some formatting for a few posts
that have code or gists embedded in them. I'm happy with my
decision -- now to just blog a little more and maybe customize the
template a little bit.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Tunnel</title>
    <link href="http://tedkulp.com/2011/07/22/tunnel/"/>
    <updated>2011-07-22T06:29:16-04:00</updated>
    <id>http://tedkulp.com/2011/07/22/tunnel</id>
    <content type="html">&lt;a href=&quot;http://instagr.am/p/IPH6h/&quot; style=&quot;border: 0;&quot;&gt;&lt;img src=&quot;http://images.instagram.com/media/2011/07/22/4e62ce7ebe844a33a1749606182706c7_7.jpg&quot; width=&quot;500&quot;&gt;&lt;/a&gt;&lt;br&gt;&lt;p style=&quot;font-size: 80%;&quot;&gt;Taken w/ &lt;a href=&quot;http://instagr.am/&quot;&gt;Instagram&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <title>Almost Home</title>
    <link href="http://tedkulp.com/2011/07/10/almost-home/"/>
    <updated>2011-07-10T17:40:58-04:00</updated>
    <id>http://tedkulp.com/2011/07/10/almost-home</id>
    <content type="html">&lt;a href=&quot;http://instagr.am/p/HaD80/&quot; style=&quot;border: 0;&quot;&gt;&lt;img src=&quot;http://images.instagram.com/media/2011/07/10/2960734f11f446de99eb12b4cdbd5376_7.jpg&quot; width=&quot;500&quot;&gt;&lt;/a&gt;&lt;br&gt;&lt;p style=&quot;font-size: 80%;&quot;&gt;Taken w/ &lt;a href=&quot;http://instagr.am/&quot;&gt;Instagram&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <title>Running Folder Actions automatically on USB devices</title>
    <link href="http://tedkulp.com/2011/06/23/running-folder-actions-automatically-on-usb-devices/"/>
    <updated>2011-06-23T17:40:47-04:00</updated>
    <id>http://tedkulp.com/2011/06/23/running-folder-actions-automatically-on-usb-devices</id>
    <content type="html">&lt;p&gt;The last piece of my new camera kit arrived today and I was eager to try
it out. The &lt;a href=&quot;http://www.amazon.com/AGL3080-Logger-Windows-Software-included/dp/B000WO6HJW&quot;&gt;AGL 3080 GPS Unit&lt;/a&gt; is a small device designed for
geotagging your photos. When you're head out on a photo walk, you flip
it on, throw it in your bag and go about your business. When you get
home and dump your pictures, you use special software to link the
timestamps on the photos with the GPS &quot;trail&quot; of information and the
photos are magically tagged precisely with where they were taken.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/21xm2laOjBL._SL500_AA300_.jpg&quot; alt=&quot;AGL 3080&quot; /&gt;&lt;/p&gt;

&lt;p&gt;To do this magical feat, I use Jeffrey Friedl's &lt;a href=&quot;http://regex.info/blog/lightroom-goodies/gps&quot;&gt;Geoencoding Plugin for
Lightroom&lt;/a&gt;. However, this makes the process even more difficult. The
reason for this is that the plugin wants the data in GPX format, which
is XML based, and the AGL 3080 logs all of it's data in NMEA format.&lt;/p&gt;

&lt;p&gt;Luckily, there is a great command line utility called &lt;a href=&quot;http://www.gpsbabel.org/&quot;&gt;GPSBabel&lt;/a&gt; that
will convert the files from a whole bunch of different formats into a
whole bunch of other formats. As a bonus, &lt;a href=&quot;http://www.gpsbabel.org/&quot;&gt;GPSBabel&lt;/a&gt; is in &lt;a href=&quot;http://mxcl.github.com/homebrew/&quot;&gt;Homebrew&lt;/a&gt;,
so it was stupid easy to install.&lt;/p&gt;

&lt;p&gt;So, this got me to thinking -- it would be really sweet if I could
plugin in the AGL, have it pull the files off automatically, convert
them to GPX format, and unmount the device. I knew that it was all
possible to do that in a shell script.&lt;/p&gt;

&lt;p&gt;But, what would be really cool is if I could get it to it all
automatically as soon as the AGL is plugged in. Even though I never used
Folder Actions before, I had a vague idea that it was possible to fire a
script or Automator workflow when a directory changes.&lt;/p&gt;

&lt;p&gt;This was enough information for me to at least get started.&lt;/p&gt;

&lt;!--more--&gt;


&lt;h3&gt;Enter Automator&lt;/h3&gt;

&lt;p&gt;Automator is one of those things about a Mac that I should really take
advantage of more. To be honest, I'm not totally sure why I don't. And
judging by these incredibly naive attempts at workflows, you'll most
likely agree that I'm very green on this subject.&lt;/p&gt;

&lt;p&gt;Create a new Automator workflow. Make it of type Folder Action.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://img.skitch.com/20110624-riitty4hdhh46ibtuhctfqp4r4.png&quot; alt=&quot;Folder Action&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Then create a very basic workflow. I know there's a better way to do
this, but I didn't feel like messing around.  I know enough bash
scripting to just do it quickly, but I'm sure someone with Automator
skills could do everything this script does in Automator directly.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://img.skitch.com/20110624-b15uk686ku8yrgjjc3tbe16kng.png&quot; alt=&quot;Workflow&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Basically, I've created a shell script that runs first. Take careful
note that it ignores the input from the File Action, since I'm dealing
with hardcoded paths. Nothing fancy, it looks to see if the directory
from the AGL exists, if it does it loops through all the .log files and
uses gpsbabel to convert them to GPX format and dump them in a directory
under my home dir. The code looks like this:&lt;/p&gt;

&lt;div&gt;&lt;figure role=code&gt;&lt;figcaption&gt;&lt;span&gt;convert.sh &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class=&quot;highlight&quot;&gt;&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class='line'&gt;1&lt;/span&gt;
&lt;span class='line'&gt;2&lt;/span&gt;
&lt;span class='line'&gt;3&lt;/span&gt;
&lt;span class='line'&gt;4&lt;/span&gt;
&lt;span class='line'&gt;5&lt;/span&gt;
&lt;span class='line'&gt;6&lt;/span&gt;
&lt;span class='line'&gt;7&lt;/span&gt;
&lt;span class='line'&gt;8&lt;/span&gt;
&lt;span class='line'&gt;9&lt;/span&gt;
&lt;span class='line'&gt;10&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code' width='100%'&gt;&lt;pre&gt;&lt;code class='sh'&gt;&lt;div class='line'&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; -d &lt;span class=&quot;s2&quot;&gt;&amp;quot;/Volumes/GPS Tracker/GPSFILES&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;; &lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
&lt;/div&gt;&lt;div class='line'&gt;&lt;span class=&quot;k&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;/Volumes/GPS Tracker/GPSFILES&amp;quot;&lt;/span&gt;
&lt;/div&gt;&lt;div class='line'&gt;  &lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;f in *.log
&lt;/div&gt;&lt;div class='line'&gt;  &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
&lt;/div&gt;&lt;div class='line'&gt;&lt;span class=&quot;k&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;NAME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;basename &lt;span class=&quot;nv&quot;&gt;$f&lt;/span&gt; .log&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;
&lt;/div&gt;&lt;div class='line'&gt;    /usr/local/bin/gpsbabel -i nmea -f &lt;span class=&quot;s2&quot;&gt;&amp;quot;/Volumes/GPS Tracker/GPSFILES/$f&amp;quot;&lt;/span&gt; -x discard,hdop&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;10 -o gpx -F &lt;span class=&quot;s2&quot;&gt;&amp;quot;/Users/tedkulp/gps-tracks/$NAME.gpx&amp;quot;&lt;/span&gt;
&lt;/div&gt;&lt;div class='line'&gt;  &lt;span class=&quot;k&quot;&gt;done&lt;/span&gt;
&lt;/div&gt;&lt;div class='line'&gt;&lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;
&lt;/div&gt;&lt;div class='line'&gt;&lt;span class=&quot;k&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;exit &lt;/span&gt;0;
&lt;/div&gt;&lt;div class='line'&gt;&lt;span class=&quot;k&quot;&gt;fi&lt;/span&gt;
&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;


&lt;p&gt;Then, I do a quick hack to look for mounted GPS directory, and feed that
into Eject Disk. If I run this directly from Automator, it works perfectly.&lt;/p&gt;

&lt;h3&gt;Folder Actions&lt;/h3&gt;

&lt;p&gt;Now for the magical part of it. The basic concept is that we need to
link this script to the /Volumes directory as a Folder Action. This is
actually very easy, except for the fact that /Volumes is hidden from
Finder by default. A quick Googling gave me this code to run from the
Terminal:&lt;/p&gt;

&lt;div&gt;&lt;figure role=code&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class='line'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code' width='100%'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;div class='line'&gt;sudo SetFile -a v /Volumes&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;


&lt;p&gt;Now it's very straightforward. Navigate to /Volumes in Finder, right
click to Services -&gt; Folder Actions Setup... A popup will come up
automatically. Select the Folder Action you saved earlier and you're
set.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://img.skitch.com/20110624-bccwyuu5yyethwt8qcfeg6ue24.png&quot; alt=&quot;Set It&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://img.skitch.com/20110624-xdff3cubqg5ybygm5pa2mxqyim.png&quot; alt=&quot;Magic&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Magic! Now I plug it in, wait 5 seconds (wait for the volume to
disappear from the Desktop), and disconnect it again. The files are
waiting in &lt;code&gt;~/gps-tracks&lt;/code&gt; all ready for Lightroom.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Summer Sunset</title>
    <link href="http://tedkulp.com/2011/06/22/summer-sunset/"/>
    <updated>2011-06-22T17:26:22-04:00</updated>
    <id>http://tedkulp.com/2011/06/22/summer-sunset</id>
    <content type="html">&lt;a href=&quot;http://instagr.am/p/GNIhB/&quot; style=&quot;border: 0;&quot;&gt;&lt;img src=&quot;http://images.instagram.com/media/2011/06/22/5b0a50e58873406ea1e6d33e90380238_7.jpg&quot; width=&quot;500&quot;&gt;&lt;/a&gt;&lt;br&gt;&lt;p style=&quot;font-size: 80%;&quot;&gt;Taken w/ &lt;a href=&quot;http://instagr.am/&quot;&gt;Instagram&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <title>Around the House</title>
    <link href="http://tedkulp.com/2011/06/06/around-the-house/"/>
    <updated>2011-06-06T18:21:56-04:00</updated>
    <id>http://tedkulp.com/2011/06/06/around-the-house</id>
    <content type="html">&lt;p&gt;I probably could've titled this post, &quot;Man, I love my 50mm lens&quot;. Just
snapping random photos while testing out my new &lt;a href=&quot;http://www.bhphotovideo.com/c/product/722104-REG/Vello_BG_C5_BG_C5_Battery_Grip_for.html&quot;&gt;vertical grip&lt;/a&gt;. Just
posting the two best ones in the batch.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/wishy/5806363143&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3662/5806363143_f7bfa4f303_z_d.jpg&quot; alt=&quot;Here, Have a Thomas&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This photo proves how insane the noise reduction is in Lightroom 3.
Taken at 1600 ISO in a fairly dark room. Only thing on my side was the
bright 50mm prime lens, which pulled amazing depth of field even from
the dimly lit evening room.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/wishy/5806927082&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3395/5806927082_0e0ce68716_z_d.jpg&quot; alt=&quot;Maddie Portrait&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Love this photo. Though, she almost looks like she might be getting
sick. I hope not.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Canon T3i -- First Pics</title>
    <link href="http://tedkulp.com/2011/06/05/canon-t3i-first-pics/"/>
    <updated>2011-06-05T00:08:12-04:00</updated>
    <id>http://tedkulp.com/2011/06/05/canon-t3i-first-pics</id>
    <content type="html">&lt;p&gt;Got my new Canon T3i today. Still trying to figure out all the tricks to
it, but I'm still happy with some of the results of day #1 of shooting
with it. After spending some time reading the manual and clicking around
the house, I took it with us to Jeannine and Joel's to meet baby Megan.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/wishy/5798918854&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2137/5798918854_dd1d6b773a_z_d.jpg&quot; alt=&quot;Frank&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I did a bit of cleanup to this shot. Not because of a bad picture, but
because the carpet was way too messy and it was distracting. Lightroom's
heal tool came in handy to &quot;clean&quot; the carpet.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/wishy/5798921016&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3062/5798921016_010535045a_z_d.jpg&quot; alt=&quot;Lexie and Megan&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I love this shot. Best one of the night.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/wishy/5798371451&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3518/5798371451_769c828220_z_d.jpg&quot; alt=&quot;Barn&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Jeannine and Joel have an awesome barn off beyond the edge of their
backyard. None of the shots I got were that fantastic, but this one
looked much better once a bit of Sepia was added.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/wishy/5798373449&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2462/5798373449_96c616ac9a_z_d.jpg&quot; alt=&quot;Megan Rose&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/wishy/5798370737&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3158/5798370737_815fd097a6_z_d.jpg&quot; alt=&quot;Me&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Don't let my expression fool you. I'm a sucker for babies. My wife took
this shot with the &quot;Green Square&quot; full auto mode. It came out pretty
nice. The handling of auto white balance is way better than on my old
300D.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;All in all, I'm thrilled so far. Just the startup time alone is worth
it. The fact that the images are gorgeous doesn't hurt either. Still
feel a little weird not shooting RAW, but the files are almost 25 megs a
piece -- it's just not worth it for stuff that's not super-critical. I
just don't have that kind of HD space on my laptop.&lt;/p&gt;

&lt;p&gt;Of course, shooting JPEG means I'm bound to the white balance gods. But,
so far the results have been decent, and for anything that's been off,
Lightroom could more than handle fixing it up enought to look natural.
I'm sure once I get used to the camera, I'll be able to compensate while
balance without thinking.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Old and New</title>
    <link href="http://tedkulp.com/2011/06/04/old-and-new/"/>
    <updated>2011-06-04T07:11:41-04:00</updated>
    <id>http://tedkulp.com/2011/06/04/old-and-new</id>
    <content type="html">&lt;a href=&quot;http://instagr.am/p/FLST0/&quot; style=&quot;border: 0;&quot;&gt;&lt;img src=&quot;http://images.instagram.com/media/2011/06/04/4c3b9edc536c404aa22b6c7e3549597f_7.jpg&quot; width=&quot;500&quot;&gt;&lt;/a&gt;&lt;br&gt;&lt;p style=&quot;font-size: 80%;&quot;&gt;Taken w/ &lt;a href=&quot;http://instagr.am/&quot;&gt;Instagram&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <title>Amazing Timelapse - The City Limits</title>
    <link href="http://tedkulp.com/2011/05/26/amazing-timelapse--the-city-limits/"/>
    <updated>2011-05-26T18:59:03-04:00</updated>
    <id>http://tedkulp.com/2011/05/26/amazing-timelapse--the-city-limits</id>
    <content type="html">&lt;div&gt;
&lt;iframe src=&quot;http://player.vimeo.com/video/23237102?color=ffffff&quot; width=&quot;400&quot; height=&quot;225&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;&lt;p&gt;&lt;a href=&quot;http://vimeo.com/23237102&quot;&gt;Timelapse - The City Limits&lt;/a&gt; from &lt;a href=&quot;http://vimeo.com/dominicboudreault&quot;&gt;Dominic&lt;/a&gt; on &lt;a href=&quot;http://vimeo.com&quot;&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;


&lt;p&gt;Inspiring photography. Do yourself a favor. Watch it in Full Screen HD and turn up the sound. :)&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Testing the Grape Microframework</title>
    <link href="http://tedkulp.com/2011/05/26/testing-the-grape-microframework/"/>
    <updated>2011-05-26T00:00:00-04:00</updated>
    <id>http://tedkulp.com/2011/05/26/testing-the-grape-microframework</id>
    <content type="html">&lt;p&gt;Stumbled across the awesome &lt;a href=&quot;https://github.com/intridea/grape&quot;&gt;Grape&lt;/a&gt; framework for writing a simple REST
server for a small project I'm messing with. Since I was trying to write
tests right out of the gate instead of using curl to do everything, I
immediately started trying to get Rest::Test to work, which was failing
miserably.&lt;/p&gt;

&lt;p&gt;After googling and playing around for awhile, I did eventually get it.
It was mainly with how to setup the app function, which didn't make a
lot of sense when config.ru uses the run function to get itself going.&lt;/p&gt;

&lt;p&gt;I figured I'd just post this code below so if anyone else runs into this issue, they'll
have the answer. This is using MiniTest and Ruby 1.9.&lt;/p&gt;

&lt;p&gt;``` ruby&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require 'helper'
require &quot;rack/test&quot;

class TestApi &amp;lt; MiniTest::Unit::TestCase
  include Rack::Test::Methods

  def app
    Rack::Builder.new {
      map &quot;/&quot; do
        run Rest::API # The class that extends Grape::API
      end
    }.to_app
  end

  def test_it_gives_back_some_content
    get '/rest/v1/content'
    assert last_response.ok?
    assert_equal '[]', last_response.body
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;```&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Beer Snob says "ewww"</title>
    <link href="http://tedkulp.com/2011/05/23/beer-snob-says-ewww/"/>
    <updated>2011-05-23T13:56:43-04:00</updated>
    <id>http://tedkulp.com/2011/05/23/beer-snob-says-ewww</id>
    <content type="html">&lt;a href=&quot;http://instagr.am/p/Eorzy/&quot; style=&quot;border: 0;&quot;&gt;&lt;img src=&quot;http://images.instagram.com/media/2011/05/23/e835919781034f6aaf23d226b16591a8_7.jpg&quot; width=&quot;500&quot;&gt;&lt;/a&gt;&lt;br&gt;&lt;p style=&quot;font-size: 80%;&quot;&gt;Taken w/ &lt;a href=&quot;http://instagr.am/&quot;&gt;Instagram&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <title>Automating Jekyll Builds</title>
    <link href="http://tedkulp.com/2011/05/22/automating-jekyll-builds/"/>
    <updated>2011-05-22T00:00:00-04:00</updated>
    <id>http://tedkulp.com/2011/05/22/automating-jekyll-builds</id>
    <content type="html">&lt;p&gt;When I setup Jekyll, I wanted to make it so it was possible to deploy new
posts automatically. I wanted to be able to drop a file in my &lt;code&gt;_posts&lt;/code&gt; directory
in any of my Dropbox enabled devices and have the site rebuild itself. Plus,
I wanted my &lt;code&gt;_drafts&lt;/code&gt; folder to go to my dev site that show my Draft posts.&lt;/p&gt;

&lt;p&gt;The most obvious solution would be to setup a cron job that runs every 5 or
10 minutes. Of course, not only does this make the site build unnecessarily,
but it also kills any immediate satisfaction of seeing my posts immediately.
I needed to find another way.&lt;/p&gt;

&lt;h3&gt;Incron to the Rescue!&lt;/h3&gt;

&lt;p&gt;After some clever Google-fu, I stumbled across &lt;a href=&quot;http://inotify.aiken.cz/?section=incron&amp;amp;page=about&amp;amp;lang=en&quot;&gt;incron&lt;/a&gt;. The website
doesn't quite do it justice, or even do a good job of explaining what it
does. The basic concept is that it's a cron-like daemon, but it fires if
there are file system changes. A file is added, removed, edited, etc. --
see where this is going?&lt;/p&gt;

&lt;p&gt;To get started, I installed incron from apt. Everyone that can use
incron has to have their username added to /etc/incron.allow by the root
user like so:&lt;/p&gt;

&lt;p&gt;```&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;tedkulp
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;```&lt;/p&gt;

&lt;p&gt;Then as your user, fire up &lt;code&gt;incrontab -e&lt;/code&gt;. After messing around with it
for a long time, I found the proper entry is something like:&lt;/p&gt;

&lt;p&gt;```&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/home/tedkulp/Dropbox/tedkulp.com/_posts IN_DELETE,IN_CLOSE_WRITE,IN_MOVE,IN_NO_LOOP /home/tedkulp/runbuild.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;```&lt;/p&gt;

&lt;p&gt;The first section is the directory to watch, which in my case is my
&lt;code&gt;_posts&lt;/code&gt; directory. The next section are the various flags. In this case,
I want it to fire whenever a file is saved, moved or deleted. The
IN_NO_LOOP is especially important, because it will allow my script to
only run once at a time, even if mutliple events fire. The last bit is
obviously the script that fires.&lt;/p&gt;

&lt;p&gt;Because I use RVM system-wide, the script is a little complicated. This
is because incron only sends a very minimal amount of environment
variables to the script when it's invoked. RVM relies heavily on
environment variables, and since they're not being set, we have to write
them by hand. I haven't found a better way -- and I tried a lot of them.
Here is my script... it's using rvm installed ruby 1.9.2.&lt;/p&gt;

&lt;p&gt;``` bash&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/bin/bash
cd /var/www/tedkulp.com/jekyll/_source

export LANG=en_US.UTF-8
export GEM_HOME=/usr/local/rvm/gems/ruby-1.9.2-p180
export GEM_PATH=/usr/local/rvm/gems/ruby-1.9.2-p180:/usr/local/rvm/gems/ruby-1.9.2-p180@global
export PATH=/usr/local/rvm/gems/ruby-1.9.2-p180/bin:/usr/local/rvm/gems/ruby-1.9.2-p180@global/bin:/usr/local/rvm/rubies/ruby-1.9.2-p180/bin:/usr/local/rvm/bin:$PATH

/usr/local/rvm/rubies/ruby-1.9.2-p180/bin/ruby /var/www/tedkulp.com/www/bin/jekyll /var/www/tedkulp.com/www/_source /var/www/tedkulp.com/www/_source/_site &amp;gt; /tmp/blah.txt 2&amp;gt; /tmp/blah2.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;```&lt;/p&gt;

&lt;p&gt;I got the majority of this information from &lt;code&gt;rvm info&lt;/code&gt; while logged in
as the same user that would run the script. I also pump the output to
tmp files for debugging purposes, because incron doesn't really handle
any script output at all -- it's terribly difficult to debug.&lt;/p&gt;

&lt;p&gt;That being said, except for a few hiccups, it's a nice stable system. I
now have my site automatically updating whenever I change a file, which
is stupidly convenient.&lt;/p&gt;

&lt;h3&gt;Bonus Dropbox Trick&lt;/h3&gt;

&lt;p&gt;I won't take credit for this one, as it was suggested by Dan Benjamin of
&lt;a href=&quot;http://5by5.tv/&quot;&gt;5by5&lt;/a&gt;. He's a smart dude.&lt;/p&gt;

&lt;p&gt;Chances are that you really don't want to have your whole personal
&lt;a href=&quot;http://db.tt/CE8AtiE&quot;&gt;Dropbox&lt;/a&gt; sitting on a server somewhere that you might not have a full
amount of control over. Of course, you do want to be able to edit your
posts from various machines, and get them onto the server, though.&lt;/p&gt;

&lt;p&gt;What to do?  What to do?&lt;/p&gt;

&lt;p&gt;It's pretty simple, actually. Create a second Dropbox account for your
site. Create a directory for your site, and put your &lt;em&gt;posts and &lt;/em&gt;drafts
directories in there. Then, share that directory with your main Dropbox
account.&lt;/p&gt;

&lt;p&gt;On the server, sync to the 2nd account instead so that you're only
syncing over just the files needed for that site. Don't feel bad about
this, though. You're not really &quot;getting one over&quot; on Dropbox. Files in
shared directories are subtracted from the quotas of ALL the users that
share that directory, so in essence, except for some overhead for
&lt;a href=&quot;http://db.tt/CE8AtiE&quot;&gt;Dropbox&lt;/a&gt; having to keep track of a 2nd accounts details, you're not
really taking very much advantage of their kindness.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;For more information on my interaction with Jekyll, check out the Jekyll
tag on my blog &lt;a href=&quot;http://tedkulp.com/tag/jekyll&quot;&gt;here&lt;/a&gt;. I'd also love any Dropbox referrals
you might be able to give, click &lt;a href=&quot;http://db.tt/CE8AtiE&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Running Late</title>
    <link href="http://tedkulp.com/2011/05/21/running-late-blog/"/>
    <updated>2011-05-21T12:26:46-04:00</updated>
    <id>http://tedkulp.com/2011/05/21/running-late-blog</id>
    <content type="html">&lt;a href=&quot;http://instagr.am/p/Eia9f/&quot; style=&quot;border: 0;&quot;&gt;&lt;img src=&quot;http://images.instagram.com/media/2011/05/21/cf8e2031386243dd86e228f7d56a69a0_7.jpg&quot; width=&quot;500&quot;&gt;&lt;/a&gt;&lt;br&gt;&lt;p style=&quot;font-size: 80%;&quot;&gt;Taken w/ &lt;a href=&quot;http://instagr.am/&quot;&gt;Instagram&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
</feed>

