<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	
	<title>jimeh / blog</title>
	<link href="http://jimeh.me/blog/atom.xml" rel="self" />
	<link href="http://jimeh.me/blog/" />
	<updated>2012-10-11T11:19:26+01:00</updated>
	<id>http://jimeh.me/blog/</id>
	<author>
		<name>Jim Myhrberg</name>
		<email>contact@jimeh.me</email>
	</author>
	
	
	<entry>
		<title>My Ruby Development Environment</title>
		<link href="http://jimeh.me/blog/2011/11/01/my-ruby-development-environment"/>
		<updated>2011-11-01T00:00:00+00:00</updated>
		<id>http://jimeh.me/blog/2011/11/01/my-ruby-development-environment</id>
		<content type="html">&lt;p&gt;Setting up your development environment is always a tedious task. My own
environment has changed many times over the years. I've recently gotten my
Ruby-related setup to the point I'm finally really happy with it.&lt;/p&gt;

&lt;p&gt;This is by no means a complete in-depth step-by-step guide of how to setup
your environment like mine though. Instead it's meant as a quick reference of
the tools I use, and how I use them. If you were looking for a magical silver
bullet, this article is not it. If you're looking for an exciting adventure
and treasure hunt, this article is hopefully it.&lt;/p&gt;

&lt;h2&gt;Ruby&lt;/h2&gt;

&lt;p&gt;I install and manage multiple Ruby versions with &lt;a href=&quot;https://github.com/sstephenson/rbenv&quot;&gt;rbenv&lt;/a&gt; and &lt;a href=&quot;https://github.com/sstephenson/ruby-build&quot;&gt;ruby-build&lt;/a&gt;.
They are not as established as &lt;a href=&quot;http://beginrescueend.com/&quot;&gt;RVM&lt;/a&gt; which has been around a lot longer, but
I prefer rbenv for it's bare-bones simplicity. If you're coming from RVM, the
main thing that you'll miss is it's gemset feature, which won't be an issue if
you use Bundler properly. There is however a &lt;a href=&quot;https://github.com/jamis/rbenv-gemset&quot;&gt;gemset&lt;/a&gt; plugin
available for rbenv.&lt;/p&gt;

&lt;p&gt;To install rbenv, check the &lt;a href=&quot;https://github.com/sstephenson/rbenv&quot;&gt;ReadMe&lt;/a&gt; on the project page. I prefer the
Git checkout method. &lt;a href=&quot;https://github.com/sstephenson/ruby-build&quot;&gt;ruby-build&lt;/a&gt; has installation info on the project page
too, but on OS X I prefer installing it with &lt;a href=&quot;http://mxcl.github.com/homebrew/&quot;&gt;Homebrew&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Once both are installed, you can install your Ruby version of choice, for
example:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ rbenv install 1.9.3-p0
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then set your global Ruby version:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ rbenv global 1.9.3-p0
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I tend to install a very basic set of gems, as all project-specific gems will
be managed by Bundler. So obviously &lt;code&gt;bundler&lt;/code&gt; needs to be installed:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ gem install bundler
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;With rbenv this does not create the &lt;code&gt;bundle&lt;/code&gt; executable however, so the next
step is to run:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ rbenv rehash
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This creates the &lt;code&gt;bundle&lt;/code&gt; executable in &lt;code&gt;~/.rbenv/shims&lt;/code&gt;, and also any missing
executables for other gems you have installed.&lt;/p&gt;

&lt;h2&gt;Gem Management with Bundler&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;http://gembundler.com/&quot;&gt;Bundler&lt;/a&gt; is fantastic, but if you just run &lt;code&gt;bundle install&lt;/code&gt; as default, I would
argue you're not actually using Bundler correctly as it installs the gems into
your Ruby verion's gem path. One of Bundler's great features is that you can
keep gems completely self-contained within a project. For that reason I use
the &lt;code&gt;--path&lt;/code&gt; option, to install gems into &lt;code&gt;vendor/bundle&lt;/code&gt; relative to the
Gemfile.&lt;/p&gt;

&lt;p&gt;And because I'm lazy, I have a handy bash alias for my &lt;code&gt;bundle install&lt;/code&gt;
command.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;alias &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;bi&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;bundle install --path vendor/bundle --binstubs=vendor/bundle/bin&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;The &lt;code&gt;--binstubs&lt;/code&gt; option there leads me into how I avoid typing &lt;code&gt;bundle exec&lt;/code&gt;
before every command. It tells Bundler to package binaries from all the
installed gems into &lt;code&gt;vendor/bundle/bin&lt;/code&gt; directory within the project. Simply
add the following at the very end of your &lt;code&gt;~/.profile&lt;/code&gt; or &lt;code&gt;~/.bash_profile&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PATH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;./vendor/bundle/bin:$PATH&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;This enables you to call all of the project's gem binaries like normal,
but they're Bundler aware, as if they'd been called with &lt;code&gt;bundle exec&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I also have a few bash aliases for &lt;code&gt;bundle exec ...&lt;/code&gt; which I find useful:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;alias &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;ru&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;bundle exec ruby&amp;quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;alias &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;ra&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;bundle exec rake&amp;quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;alias &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;rs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;bundle exec rspec&amp;quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;alias &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;ca&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;bundle exec cap&amp;quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;alias &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;cu&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;bundle exec cucumber&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Instead of using an alias to set Bundler options, you can set
default Bundler config options in &lt;code&gt;~/.bundle/config&lt;/code&gt;. Mine looke liks this:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;yaml&quot;&gt;&lt;span class=&quot;nn&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;l-Scalar-Plain&quot;&gt;BUNDLE_PATH&lt;/span&gt;&lt;span class=&quot;p-Indicator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;l-Scalar-Plain&quot;&gt;vendor/bundle&lt;/span&gt;
&lt;span class=&quot;l-Scalar-Plain&quot;&gt;BUNDLE_BIN&lt;/span&gt;&lt;span class=&quot;p-Indicator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;l-Scalar-Plain&quot;&gt;vendor/bundle/bin&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Run &lt;code&gt;bundle help config&lt;/code&gt; for more information.&lt;/p&gt;

&lt;h2&gt;Running Ruby Apps&lt;/h2&gt;

&lt;p&gt;For running web-based apps I use &lt;a href=&quot;http://pow.cx/&quot;&gt;Pow&lt;/a&gt; and/or &lt;a href=&quot;https://github.com/ddollar/foreman&quot;&gt;Foreman&lt;/a&gt;. Pow is my
favorite of the two, but for certain projects Foreman is the better match.&lt;/p&gt;

&lt;p&gt;I tend to go on a case-by-case basis. For example, some projects might need a
few background workers, I tend to start all of them with Foreman, while I
might run the web-based frontend with Pow.&lt;/p&gt;

&lt;h2&gt;MySQL, Redis, and More...&lt;/h2&gt;

&lt;p&gt;Because I run Mac OS X, I use &lt;a href=&quot;http://mxcl.github.com/homebrew/&quot;&gt;Homebrew&lt;/a&gt; to install things liky &lt;a href=&quot;http://www.mysql.com/&quot;&gt;MySQL&lt;/a&gt;,
&lt;a href=&quot;http://redis.io/&quot;&gt;Redis&lt;/a&gt;, &lt;a href=&quot;http://memcached.org/&quot;&gt;Memcache&lt;/a&gt;, and others. If you're not on OS X, you'll have to
find your own preferred way to install these kinds of tools. But I'd imagine
your operating system has some form of package management system you can use.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Concept: Decentralized Zero-Conf VPN</title>
		<link href="http://jimeh.me/blog/2011/01/06/concept-decentralized-zero-conf-vpn"/>
		<updated>2011-01-06T00:00:00+00:00</updated>
		<id>http://jimeh.me/blog/2011/01/06/concept-decentralized-zero-conf-vpn</id>
		<content type="html">&lt;p&gt;Imagine a new kind of VPN service which doesn't require any kind of configuration and magically just works without a central server.&lt;/p&gt;

&lt;h2&gt;Who Am I?&lt;/h2&gt;

&lt;p&gt;Before I go on, I should point out that I have no background in network infrastructure, P2P network development, or pretty much any of the specific technologies this touches. My background lies in web development, and this idea is based on my understanding of these technologies. As such, please point out any errors, misconceptions or other issues you might find. But keep in mind, this is simply an idea of a potentially awesome technology.&lt;/p&gt;

&lt;h2&gt;The Idea&lt;/h2&gt;

&lt;p&gt;For a while now it's been bugging me how messy it can be to get a VPN up and running. Or just getting setup through any means to gain remote access to different computers. Yesterday I had an idea somewhat based on &lt;a href=&quot;http://en.wikipedia.org/wiki/Hamachi_%28software%29&quot;&gt;Hamachi&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/BitTorrent_%28protocol%29&quot;&gt;BitTorrent&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Imagine a VPN service which instead of connecting to a central server, uses BitTorrent's &lt;a href=&quot;http://en.wikipedia.org/wiki/BitTorrent_%28protocol%29#Distributed_trackers&quot;&gt;DHT&lt;/a&gt; implementation to find peers which are part of the same “network”, just like BitTorrent clients finds peers who have the same torrent. Once peers have been found, secure and encrypted connections are setup between the local machine and all remote peers, creating a Virtual Private Network across the Internet which in essence works a lot like Apple's Bonjour technology; Everybody talks directly to everybody.&lt;/p&gt;&lt;/blockquote&gt;

&lt;h2&gt;The Details&lt;/h2&gt;

&lt;p&gt;I believe the concept is rather simple, but implementing it could be another story. From a functionality point of view, these are some of my initial ideas/notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The networks you are connected to are managed by “key files”, containing the following:

&lt;ul&gt;
&lt;li&gt;A random unique hash string which identifies the network when the client searches for peers via DHT.&lt;/li&gt;
&lt;li&gt;An encryption key (or a set of encryption keys), which are used to encrypt all traffic between peers.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Create a network: You generate a new key file which is populated with a random hash signature and encryption keys for you automatically. Somewhat like how SSH keys are generated.&lt;/li&gt;
&lt;li&gt;Join a network: You simply copy the key file from one computer to another. The second computer will find the first computer via DHT and start communicating with it automatically.&lt;/li&gt;
&lt;li&gt;PEX (Peer Exchange) can also be used to faster discover all peers in your Network. Meaning once you find one peer via DHT, it will tell you about all peers it knows about.&lt;/li&gt;
&lt;li&gt;Once peers are connected to each other, Apple's Bonjour technology (or something similar) could be used to get around potential IP conflicts and the like.&lt;/li&gt;
&lt;li&gt;In theory, the VPN client could behave just like a BitTorrent client when searching for peers via DHT. Once a peer is found however, it uses it's own protocol to setup a secure VPN connection. This could allow us to take advantage of BitTorrent DHT nodes already online, effectively piggybacking on BitTorrent users.&lt;/li&gt;
&lt;li&gt;Everything should be open source. Cause really, what's the point otherwise? :)&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;To me, the coolest and most interesting point is piggybacking on existing BitTorrent DHT nodes. If this is something BitTorrent client developers will consider evil, I don't know.&lt;/p&gt;

&lt;p&gt;That's why I'm writing this post. I'm hoping to get some feedback, suggestions, insults, and ideas from people who are smarter, and know a lot more about these kind of technologies than I do.&lt;/p&gt;

&lt;p&gt;In terms of an actual implementation, personally I would love to build this thing. But my networking and low-level programming skills are not very great at all, it would take some time before I could have anything presentable. But if someone else might be interested in starting it, I would very much like to be part of the effort, in any way I can till I've gained the required skills.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Fan Boys & Haters, Seriously?</title>
		<link href="http://jimeh.me/blog/2010/06/15/fan-boys-and-haters-seriously"/>
		<updated>2010-06-15T00:00:00+01:00</updated>
		<id>http://jimeh.me/blog/2010/06/15/fan-boys-and-haters-seriously</id>
		<content type="html">&lt;p&gt;Fan Boys and Haters have been equally annoying me as of late. The most common claim is that their favorite company is good, while all others are evil. This is simply bullshit.&lt;/p&gt;

&lt;p&gt;Companies are not good or evil. They are simply companies. They are here to make a profit at the end of the day, and to that means, they'll do things their customers, rivals, and the rest of world likes, and things they don't like.&lt;/p&gt;

&lt;p&gt;Apple has gotten a lot of media attention the past two years thanks to their app approval process for the App Store. Most recently, they're getting a lot of attention for locking out all advertising platforms aside from their own iAds platform from the App Store.&lt;/p&gt;

&lt;p&gt;Microsoft was working with IBM in late 80s to develop IBM's PS/2 operating system as the OS of the future. After it had shifted it's internal focus to Windows, it kept face with IBM, and kept pushing 3rd party developers to port their existing DOS applications to PS/2. Windows became a huge hit, PS/2 was abandoned, and a whole industry of software development houses had spent months to years porting their applications to PS/2. The result was, that nobody had anything ready for Windows, except Microsoft, who's office package displaced all 3rd party products with their own for Windows, making it an industry standard, as there simply was no other package available.&lt;/p&gt;

&lt;p&gt;In more recent years, Microsoft created it's Windows Media-based PlaysForSure™ standard for portable music players, and got the whole industry (except Apple) to adopt the standard. Little than a year later, Microsoft releases it's own portable music player — the Zune — which is not compatible with PlaysForSure™ devices, but uses a new Zune-specific DRM standard. In the mist of this, all the PlaysForSure™ partners were left hanging with a standard abandoned by the company that created it and owned the rights to it.&lt;/p&gt;

&lt;p&gt;Even Google, with their &lt;em&gt;&quot;Don't be evil&quot;&lt;/em&gt; corporate motto don't get away without stains. It was recently revealed that Google's Street View cars have accidentally been collecting payload data from all open wifi networks they drive by, all over the world. On an unencrypted network all your emails, webpages you visit, chats, and more are transmitted over the air in plain text. This plain text data is what Google has been collecting and storing for the past three years, accidentally. This is one of biggest and worst invasions of privacy I've seen in a long time at least.&lt;/p&gt;

&lt;p&gt;Companies do bad, and even evil things, but they also do good things. Neither of this makes a company good or evil in my opinion though. They are just companies, so stop treating them as people, religions, or any kind of entity that has the ability to be good or evil.&lt;/p&gt;

&lt;p&gt;I tend to get labeled as an Apple fan boy, and a Microsoft/Google hater a lot. The reasons for it are mainly valid all things considered, but they're still wrong. The reasons being that I'm a Mac and an iPhone user. And I love both devices/platforms. In all honesty, I do hate Windows, as it's only ever really been a major pain in my ass, specially back when I was a Windows user and still to this day as I'm always the one everybody comes with when their PC breaks for any reason. That said, I actually do like Windows 7, but could it replace Mac OS X for me? No way. Could an Android phone completely replace my iPhone? No way. It's close, it's the 2nd best thing next to the iPhone, but still no.&lt;/p&gt;

&lt;p&gt;I don't care what companies do, what their policies are, or even how stupid or intelligent their CEO is. What I care about is the product, the experience it offers, and how well it fits what I want, need and like.&lt;/p&gt;

&lt;p&gt;I use a Mac, cause it's the perfect world between the commercial application availability of Windows, and the open source UNIX sub-system of Linux/UNIX systems. I use an iPhone cause of it's easy of use, it's wide selection of apps, it's unix sub-system available after Jailbreaking, and cause of how well it integrates with everything from my music library, photos, contacts, password managers and more.&lt;/p&gt;

&lt;p&gt;To summarize what I'm saying:&lt;/p&gt;

&lt;p&gt;I don't give a shit about the companies and their policies. I only care about my own personal experience with the products.&lt;/p&gt;

&lt;p&gt;To point out how serious I am about this, in the spring of 2004 when I bought my first Mac, and I &lt;strong&gt;seriously&lt;/strong&gt; hated Microsoft and Windows after having more problems with my PC thanks to Windows than I can count. Guess what mouse I bought for my brand new €2800 PowerBook G4. A Microsoft Optical Notebook Mouse. It was simply the nicest, and best mouse for what I needed and wanted. In the autumn of the same year, I bought an Xbox as well, and I loved it.&lt;/p&gt;

&lt;p&gt;I hated Microsoft for all the problems and headaches I'd gotten thanks to Windows, but at the very same time I'd bought a cheap and an expensive Microsoft product, and I loved them both.&lt;/p&gt;

&lt;p&gt;The same goes for the more recent &quot;war&quot; between iPhone and Android users. I actually own an HTC Magic, and I use it quite a lot — in fact, it's the phone I have in my pocket right now — but not as much as my 2G iPhone. Despite my iPhone's wifi being broken, I still generally prefer the iPhone cause of the experience and integration it offers me compared to the Android phone. Do I care about Apple's policies regarding iAds? Do I care about Google collecting payload data from open wifi networks? No and no. If the product is superior than all others for my needs, I'll use it.&lt;/p&gt;

&lt;p&gt;So please, next time you come and tell me that you refuse to use ______ company's products cause they're evil, or you think their policies suck, or you think I'm a blind stupid fool cause I use ______ company's products, just shut the fuck up. I'm not interested, and I don't care.&lt;/p&gt;

&lt;p&gt;Thanks for reading my quick little rant.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;{insert picture of a unicorn caring for a cute little kitten here}&lt;/p&gt;&lt;/blockquote&gt;
</content>
	</entry>
	
	<entry>
		<title>Get YouTube Video Bookmarklet</title>
		<link href="http://jimeh.me/blog/2010/05/02/get-youtube-video-bookmarlet"/>
		<updated>2010-05-02T00:00:00+01:00</updated>
		<id>http://jimeh.me/blog/2010/05/02/get-youtube-video-bookmarlet</id>
		<content type="html">&lt;p&gt;There's a few ways to download videos off of &lt;a href=&quot;http://www.youtube.com/&quot;&gt;YouTube&lt;/a&gt;, my favorite is using a bookmarklet which injects a link onto the page to download the MP4 version of the video. The best of these bookmarklets was by someone over at the &lt;a href=&quot;http://googlesystem.blogspot.com/&quot;&gt;Google System Blog&lt;/a&gt;, it was well maintained and all. Unfortunately, the post about their bookmarklet has been deleted, and as such, it hasn't been updated for the new video page layout YouTube switched to a few weeks back.&lt;/p&gt;

&lt;p&gt;I took it upon myself to update the last version the GSB guys posted to work with the new layout, and it turned out to be dead simple. So without further ado, here's the bookmarklet:&lt;/p&gt;

&lt;p class=&quot;thumbs&quot;&gt;
    &lt;a href=&quot;javascript:if(!document.getElementById('download-youtube-video')){var%20video_id=null;var%20video_hash=null;var%20video_player=document.getElementById('movie_player');if(video_player){var%20flash_variables=video_player.attributes.getNamedItem('flashvars');if(flash_variables){var%20flash_values=flash_variables.value;if(flash_values){var%20video_id_match=flash_values.match(/[^a-z]video_id=([^(\&amp;|$)]*)/);if(video_id_match!=null)video_id=video_id_match[1];var%20video_hash_match=flash_values.match(/[^a-z]t=([^(\&amp;|$)]*)/);if(video_hash_match!=null)video_hash=video_hash_match[1]}}}if(video_id==null||video_hash==null){var%20args=null;try{args=yt.getConfig('SWF_ARGS')}catch(e){}if(args){video_id=args['video_id'];video_hash=args['t']}}if(video_id!=null&amp;&amp;video_hash!=null){var%20div_embed=document.getElementById('watch-info');if(div_embed){var%20div_download=document.createElement('div');var%20div_download_code='%3Cbr%20/%3E%3Cspan%20id=\'download-youtube-video\'%3E%3Ca%20href=\''+'http://www.youtube.com/get_video?fmt=18&amp;video_id='+video_id+'&amp;t='+video_hash+'\'%20onclick=\'blur(this);\'%3EDownload%20as%20MP4%3C/a%3E';try{if(yt.getConfig('IS_HD_AVAILABLE'))div_download_code=div_download_code+'%20|%20%3Ca%20href=\''+'http://www.youtube.com/get_video?fmt=22&amp;video_id='+video_id+'&amp;t='+video_hash+'\'%20onclick=\'blur(this);\'%3EDownload%20as%20MP4%20HD%3C/a%3E'}catch(e){}div_download.innerHTML=div_download_code+'%3C/span%3E';div_embed.appendChild(div_download)}}}void(0)&quot;&gt;Get YouTube Video&lt;/a&gt;
&lt;/p&gt;


&lt;p&gt;To install the bookmarklet, simply drag the above link to your browsers bookmarks bar. To use it, simply open a YouTube video page and click the bookmarklet. You will get a link right above the &quot;Like&quot; button underneath the video saying &lt;em&gt;&quot;Download as MP4&quot;&lt;/em&gt;. Simply right click on the link and select &lt;em&gt;&quot;Save link as...&quot;&lt;/em&gt; or however your browser of choice is wording it.&lt;/p&gt;

&lt;p&gt;I'll try to keep the above bookmarklet up to date as often as I can, or notice that I can't download videos anymore myself. So check back here if your bookmarklet stops working.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>My Life, 2010 And Beyond...</title>
		<link href="http://jimeh.me/blog/2010/04/25/my-life-2010-and-beyond"/>
		<updated>2010-04-25T00:00:00+01:00</updated>
		<id>http://jimeh.me/blog/2010/04/25/my-life-2010-and-beyond</id>
		<content type="html">&lt;p&gt;We're 4 months into this year, and somehow I've already got more stories to tell from this year than 2009. And 2009 was a pretty eventful year with me spending a week in London speaking at  the &lt;a href=&quot;http://www.erlang-factory.com/conference/London2009/speakers/jimmyhrberg&quot;&gt;Erlang Factory&lt;/a&gt; conference, five weeks in Palo Alto as part of Facebook's &lt;a href=&quot;http://fbfund.com/people/#Gameyola&quot;&gt;fbFund&lt;/a&gt; seed fund, and finally quitting my job in November for many different reasons, one of which to pursue a freelance career.&lt;/p&gt;

&lt;h2&gt;Right Now&lt;/h2&gt;

&lt;p&gt;I'm sitting on the ferry on my way to Athens. I've been on the island of &lt;a href=&quot;http://maps.google.com/maps?f=q&amp;amp;source=s_q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=Ios,+Greece&amp;amp;sll=36.690514,25.354871&amp;amp;sspn=0.154444,0.277748&amp;amp;g=ios,+greece&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=Ios,+Cyclades,+Greece&amp;amp;ll=36.721274,25.285034&amp;amp;spn=2.469964,4.44397&amp;amp;z=8&quot;&gt;Ios&lt;/a&gt; for the past 2 weeks. I'm heading back to Athens to clean and organize my apartment as I'm gonna try to sublet it during the summer while I'm working on Ios. And I also have a few meetings regarding some freelance projects which are coming close to the end.&lt;/p&gt;

&lt;p&gt;I'm going back to Ios for the summer and work for one of my best friends fixing computers, and managing his Internet Cafés. It's the same kind of work I did the last three summers I spent on Ios before I moved to Athens a year and a half ago. I've decided to do it cause for some reason I feel like a last summer on Ios might do me good, and cause work-wise I'll be in charge of and responsible for quite a few more things than I was last time. This means more money, and opportunity to learn new things.&lt;/p&gt;

&lt;p&gt;I'll still be freelancing part-time while I'm working in the internet cafe in the evening, as all I do is just sit on my computer working, watching movies, or playing games.&lt;/p&gt;

&lt;p&gt;I'm not all too sure how I really feel about spending the summer on Ios though. One of the biggest reasons I moved to Athens was to get off the island. Don't get me wrong, it's a beautiful and peaceful little Greek island, but for me, it almost served as a prison of sorts with so little things to do and no opportunities for much of anything, that I felt like I was going crazy for the last five of the twelve years I lived there. But I'm hoping it'll be a worthwhile experience on more than just the financial level this summer.&lt;/p&gt;

&lt;h2&gt;So Far This Year&lt;/h2&gt;

&lt;p&gt;Like I mentioned earlier, a lot as happened in the past four months. Among other things, my girlfriend of three and a half years is now my ex-girlfriend as of February 13th. I've had to deal with a bunch of seriously fucked up family issues. I'm starting my own company with two friends, and it's the first time serious effort is put into a project of my own. I've had to learn to manage both my time and my money a lot better since I started freelancing in November. I've become more social and outgoing. I've made some new friends, one of which I suspect will probably be one of my best friends till the very day I die. The list goes on...&lt;/p&gt;

&lt;h2&gt;And Beyond...&lt;/h2&gt;

&lt;p&gt;Despite the fact that a breakup is never really a good or positive thing, I now believe my breakup back in February has had a positive effect on me. It forced change into my life, and I was in need of change. Not that I knew it at the time though. Since then I've set out to change a number of things in my life, and most importantly, about myself. So far, it's been moderately successful.&lt;/p&gt;

&lt;p&gt;One of the ideas I've been toying with the past few months, is to start looking for a job abroad for next year. Like in San Francisco, Seattle, Boston, or London. I have friends in all four cities, so finding work and a place to live would hopefully not be too difficult.&lt;/p&gt;

&lt;p&gt;San Francisco is currently the most tempting the place, and the more I think about it, the more I wanna go for it. The US with their gun craziness and such has never really been that tempting. But the tech community in the bay area is simply fantastic. And San Francisco as a city is also quite amazing and unique compared to other places I've seen.&lt;/p&gt;

&lt;p&gt;Last night a friend of mine who lives in San Francisco randomly dropped by my house on Ios while he was there for a few days. And we got talking about San Francisco the job opportunities I'd have there compared to Greece. It's a conversation that I believe has turned my loose thoughts about moving, into serious consideration.&lt;/p&gt;

&lt;p&gt;There's not that much state of the art technology advancements going on in Greece. Most of tech-related jobs available here are generic grind work. Build another site for another client based on template X, *yawn*. Sure, there are jobs where you get to work on interesting and new technologies, but the pay is still between almost to utterly insulting.&lt;/p&gt;

&lt;p&gt;I've been offered €850 per month for jobs which I was beyond overqualified for, and €1,100 for a lead-developer position within a highly successful digital media design and development firm. I turned both those jobs down, and others too. And just to be clear, I don't mean anything bad about these companies or people. They're awesome and great people. I just get annoyed with how low the average and even the &quot;good&quot; salaries are here in Greece, and have been for many many years way before the recent financial chaos started here.&lt;/p&gt;

&lt;p&gt;For these reasons, and more personal reasons, the thought of moving to say, San Francisco, is really starting to grow on me. I want change, I wanna see a different culture, be somewhere else, do something interesting, hopefully even something which I truly love doing. If I'll go through with these thoughts though, I don't know. This summer and autumn a lot of things will be happening. I'll see how things go with the new company and project we're starting. How things go with a few other projects I'm working on. And how I feel after the summer and towards the end of the year.&lt;/p&gt;

&lt;p&gt;However, I do believe I'm gonna start asking around for work. Even if it's for next year, I'm hoping to get enough feedback (and maybe even job offers) so I can get a good idea of what I'd be looking at if I decide to go for it.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>LiteMySQL: ActiveRecord's Little Brother</title>
		<link href="http://jimeh.me/blog/2010/04/23/litemysql-activerecords-little-brother"/>
		<updated>2010-04-23T00:00:00+01:00</updated>
		<id>http://jimeh.me/blog/2010/04/23/litemysql-activerecords-little-brother</id>
		<content type="html">&lt;p&gt;Ever needed a quick and lightweight MySQL PHP library for some small single/multi page project? Pulling out a full ORM is just overkill, but writing the PHP code needed to connect to the server, run a query, and process the results is a lot of hassle? I thought so. I've been there too.&lt;/p&gt;

&lt;p&gt;So what if you could do something like this:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;php&quot;&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$sql&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;litemysql&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;host&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;username&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;testdb&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;books&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$books&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$sql&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;find_all&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;author&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;John Twelve Hawks&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Rather than something like this:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;php&quot;&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$db&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;mysql_connect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;host&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;username&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;password&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$db&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;die&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;Could not connect: &amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;mysql_error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;());&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$db_selected&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;mysql_select_db&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;testdb&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$link&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$db_selected&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;die&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;Can&amp;#39;t use testdb : &amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;mysql_error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;());&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;mysql_query&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;SELECT * FROM `books` WHERE `author` = &amp;#39;John Twelve Hawks&amp;#39;;&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$books&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$row&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;mysql_fetch_assoc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;$books&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$row&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;About two years ago, I found myself in need of just such a small, lightweight library. There were full ORMs like &lt;a href=&quot;http://adodb.sourceforge.net/&quot;&gt;ADOdb&lt;/a&gt; and others available, but they were serious overkill for the kind of simple stuff I needed. After some googling, I noticed there didn't seem to be any in-between libraries. Either you had to go for a whole jumbo jet, or start folding your own paper airplanes, and I didn't like either option. I just wanted to grab existing paper airplanes, and start throwing them in the direction I needed them to go.&lt;/p&gt;

&lt;p&gt;So in true geek fashion when you want something ready-made to make your life easy, I ended up building my own such library. Spending an order of magnitude more time on the MySQL connection part of the project than I would have needed if I'd just done it the ugly way as the second code example above.&lt;/p&gt;

&lt;p&gt;And that's how I started building &lt;a href=&quot;http://github.com/jimeh/litemysql&quot;&gt;LiteMySQL&lt;/a&gt;. Rather than building it from the ground up though, I started by lifting the essential parts from the full ORM/ActiveRecord implementation I'd written for &lt;a href=&quot;http://github.com/jimeh/zynapse&quot;&gt;Zynapse&lt;/a&gt;, and mainly just wrote glue-code to make it a feature-complete library.&lt;/p&gt;

&lt;p&gt;After close to a year of being ignored, I recently spent an afternoon fixing some long-standing bugs, migrating to &lt;a href=&quot;http://github.com/&quot;&gt;GitHub&lt;/a&gt;, and writing some decent documentation for the project.&lt;/p&gt;

&lt;p&gt;You can read more, and download the library &lt;a href=&quot;http://github.com/jimeh/litemysql&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Seriously?</title>
		<link href="http://jimeh.me/blog/2010/04/22/seriously"/>
		<updated>2010-04-22T00:00:00+01:00</updated>
		<id>http://jimeh.me/blog/2010/04/22/seriously</id>
		<content type="html">&lt;p&gt;Here I am, on a small little island in the middle of nowhere, a 9 hour ferry trip from Athens. There are no ferries for another 24 hours, and I've got an eye exam in 12 hours, which I've waited for the past two months.&lt;/p&gt;

&lt;p&gt;I was supposed to travel back to Athens this afternoon, but yesterday morning the communist party in Greece initiated a ferry strike, stopping all ferries in and out of Piraeus as far as I've understood. And only for two days, the second day being the one I was supposed to travel on.&lt;/p&gt;

&lt;p&gt;To top it off, I was calling the hospital repeatedly this morning for about 3 hours to try to reschedule my appointment, and all I got was either a busy tone, or no answer at all, on all their phone numbers. If I ever do get hold of anyone there, I'll probably need to wait six months this time instead of two considering how my luck is going.&lt;/p&gt;

&lt;p&gt;As I was writing the previous paragraph my sister called me, with news of a rumor that there's no ferries scheduled to the island till June. Not so sure I believe it, but I doubt it'd surprise me that much at this point... lol&lt;/p&gt;

&lt;p&gt;FML :D&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>How Are You?</title>
		<link href="http://jimeh.me/blog/2010/02/26/how-are-you"/>
		<updated>2010-02-26T00:00:00+00:00</updated>
		<id>http://jimeh.me/blog/2010/02/26/how-are-you</id>
		<content type="html">&lt;pre&gt;&lt;code&gt;*** Initializing analytics system.
*** Initializing health check sub-system.
*** Booting health check sensors.
*** Running physical health checks.
[Warning] Optical subsystem initialized with errors:
[Error] Focal systems out of optimal range.
*** Running psychological health checks.
[Error] Corrupt system file: human-to-human-communication.dylib
[Warning] H2H protocol daemon is reporting malformed I/O.
*** Running humor health checks.
[Error] Syntax error in humor.conf.
*** Running spiritual health checks.
[Error] Spirit is corrupt or missing, attempting to use system default.
[Error] Default system spirit is missing.
[Error] No usable spirit found, system entering zombie mode.
*** Finalizing health checks.
*** System status: CRITICAL
*** Status summary: Visually impaired anti-social Zombie with
                    corrupt sense of humor.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This was originally a response I wrote to some chick I don't know who messaged me out of the blue asking &quot;how are you?&quot;. After sending it, I thought it was funny enough to post here... lol&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Zynapse Is Out</title>
		<link href="http://jimeh.me/blog/2010/02/25/zynapse-is-out"/>
		<updated>2010-02-25T00:00:00+00:00</updated>
		<id>http://jimeh.me/blog/2010/02/25/zynapse-is-out</id>
		<content type="html">&lt;p&gt;So I finally bit off my own sense of perfection in regards to my Zynapse web-development framework for PHP5 which I started developing in 2007. It was never perfect, never ready, so I never released.&lt;/p&gt;

&lt;p&gt;Now after close to two years of hardly working on it, and doing most things with Ruby on Rails, I've decided to push it up on GitHub as is.&lt;/p&gt;

&lt;p&gt;So check out &lt;a href=&quot;http://github.com/jimeh/zynapse&quot;&gt;Zynapse&lt;/a&gt; on GitHub if you're interested.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Built-in Sudo for Ruby Command-Line Tools</title>
		<link href="http://jimeh.me/blog/2010/02/22/built-in-sudo-for-ruby-command-line-tools"/>
		<updated>2010-02-22T00:00:00+00:00</updated>
		<id>http://jimeh.me/blog/2010/02/22/built-in-sudo-for-ruby-command-line-tools</id>
		<content type="html">&lt;p&gt;I was looking through &lt;a href=&quot;http://gist.github.com/jimeh&quot;&gt;my gists&lt;/a&gt; today on GitHub, and decided I'd do a couple of posts on some of the pieces of code I've put up there. The first of which is the &lt;code&gt;sudome&lt;/code&gt; Ruby method.&lt;/p&gt;

&lt;p&gt;Ever written a command-line tool in Ruby that requires root access for one reason or another? The simplest way to achieve this is to have the end user call the command via &lt;code&gt;sudo&lt;/code&gt;. It's not the most elegant solution there is, but it works.&lt;/p&gt;

&lt;p&gt;A more elegant solution might be what the &lt;a href=&quot;http://www.finkproject.org/&quot;&gt;Fink Project&lt;/a&gt; is doing with their &lt;code&gt;fink&lt;/code&gt; command. It doesn't need to be run via &lt;code&gt;sudo&lt;/code&gt;, as it calls it within itself. Meaning that when you run &lt;code&gt;fink&lt;/code&gt;, you'll be prompted to type your password, just as if you had used &lt;code&gt;sudo&lt;/code&gt;. Some might argue that this is not good practice, and they are probably right. But it all depends on the details of what you're doing.&lt;/p&gt;

&lt;p&gt;A while back I was working on something which the best solution was to make sure the tool always runs as root. To get identical functionality as Fink, I wrote the very simple method shown below:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;sudome&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;ENV&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;USER&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;root&amp;quot;&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;exec&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;sudo &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;ENV&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;_&amp;#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;ARGV&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Simply call &lt;code&gt;sudome&lt;/code&gt; as early as possible in your code. If needed it will re-run your script with &lt;code&gt;sudo&lt;/code&gt;, requiring the user to type his password, at which point your script then has full root access to the system.&lt;/p&gt;

&lt;p&gt;» &lt;a href=&quot;http://gist.github.com/239876&quot;&gt;Original Gist on GitHub&lt;/a&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>JavaScript Performance Wars</title>
		<link href="http://jimeh.me/blog/2010/02/19/javascript-performance-wars"/>
		<updated>2010-02-19T00:00:00+00:00</updated>
		<id>http://jimeh.me/blog/2010/02/19/javascript-performance-wars</id>
		<content type="html">&lt;p&gt;Is the difference between &lt;a href=&quot;http://www.google.com/chrome&quot;&gt;Chrome&lt;/a&gt;'s &lt;a href=&quot;http://code.google.com/p/v8/&quot;&gt;V8&lt;/a&gt; engine, and &lt;a href=&quot;http://nightly.webkit.org/&quot;&gt;WebKit&lt;/a&gt;'s &lt;a href=&quot;http://webkit.org/blog/214/introducing-squirrelfish-extreme/&quot;&gt;SquirrelFish Extreme&lt;/a&gt; (SFX for short) significant enough that we need to care if we use Chrome or Safari/WebKit?&lt;/p&gt;

&lt;p&gt;After some quick Googling for recent posts and comparisons of V8 and SFX, it seems nobody has bothered doing any comparisons after late 2008. Maybe I'm just completely outta the game, and the performance of the two engines is now common knowledge. If that's the case, it's knowledge I sure don't have.&lt;/p&gt;

&lt;p&gt;I set out to do a quick (and unscientific) performance test between the latest released beta/development build of Chrome, and the latest WebKit nightly. I decided to use &lt;a href=&quot;http://www2.webkit.org/perf/sunspider-0.9/sunspider.html&quot;&gt;SunSpider&lt;/a&gt; as it's still highly respected from what I know, and a test only takes 2-4 minutes instead of 15 minutes with &lt;a href=&quot;http://dromaeo.com/&quot;&gt;Dromaeo&lt;/a&gt;. For good measure I also threw in the latest &lt;a href=&quot;http://my.opera.com/desktopteam/blog/2010/02/11/windows-beta-released-and-more&quot;&gt;alpha build&lt;/a&gt; of Opera, and the latest shipping versions of Safari and Firefox.&lt;/p&gt;

&lt;h2&gt;The Results&lt;/h2&gt;

&lt;p class=&quot;thumbs&quot;&gt;
    &lt;img src=&quot;http://files.jimeh.me/.blog/javascript_wars-20100219-195711.png&quot; alt=&quot;SunSpider Results&quot; /&gt;
&lt;/p&gt;


&lt;p&gt;I don't know about you, but a 4.6 ms difference between Chrome and WebKit is something I really don't care about. I don't even care about the 54.6 ms difference between Chrome and the latest shipping version of Safari. Specially not since I've been using WebKit nightlies the past 8 months with no more or less issues and/or crashes than with the standard Safari release.&lt;/p&gt;

&lt;p&gt;Something that did grab my attention however was how well Opera 10.50 Alpha did with it's new &lt;a href=&quot;http://my.opera.com/core/blog/2009/12/22/carakan-revisited&quot;&gt;Carakan&lt;/a&gt; JavaScript engine. With that said, Carakan was eating about 80-90% CPU time during the tests, while all other browsers only used about 30%. Firefox's &lt;a href=&quot;https://wiki.mozilla.org/JavaScript:TraceMonkey&quot;&gt;TraceMonkey&lt;/a&gt; engine was unsurprisingly the slowest.&lt;/p&gt;

&lt;p&gt;I'm looking forward to see what Opera does over the next couple of years with their desktop browser. Both in terms of performance, and in terms of page rendering. If you're following me on Twitter, you may know that from a web designer's point of view, I've had more issues and headaches with Firefox 3 lately than with Opera 10.&lt;/p&gt;

&lt;h2&gt;Detailed Results&lt;/h2&gt;

&lt;p&gt;I ran all tests with a freshly relaunched browser, with no pages open aside from SunSpider. The test system was my 2007 MacBook Pro with a 2.4GHz Core 2 Duo processor and 4GB Ram running Mac OS X 10.6.2.&lt;/p&gt;

&lt;p&gt;Below is a list of the specific browser versions I used, and the detailed SunSpider results.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WebKit Nightly r54921 (&lt;a href=&quot;http://www2.webkit.org/perf/sunspider-0.9/sunspider-results.html?%7B%223d-cube%22:%5B19,19,19,18,18%5D,%223d-morph%22:%5B23,23,23,23,23%5D,%223d-raytrace%22:%5B20,20,20,18,18%5D,%22access-binary-trees%22:%5B6,6,5,5,8%5D,%22access-fannkuch%22:%5B21,20,20,20,20%5D,%22access-nbody%22:%5B17,16,15,15,15%5D,%22access-nsieve%22:%5B9,8,7,7,7%5D,%22bitops-3bit-bits-in-byte%22:%5B6,5,5,5,5%5D,%22bitops-bits-in-byte%22:%5B8,8,8,8,8%5D,%22bitops-bitwise-and%22:%5B5,6,5,7,8%5D,%22bitops-nsieve-bits%22:%5B13,15,11,11,11%5D,%22controlflow-recursive%22:%5B5,4,5,5,5%5D,%22crypto-aes%22:%5B15,14,15,14,14%5D,%22crypto-md5%22:%5B7,7,7,7,7%5D,%22crypto-sha1%22:%5B6,7,6,7,6%5D,%22date-format-tofte%22:%5B26,25,25,25,24%5D,%22date-format-xparb%22:%5B24,23,24,23,23%5D,%22math-cordic%22:%5B16,16,16,16,16%5D,%22math-partial-sums%22:%5B24,24,22,23,23%5D,%22math-spectral-norm%22:%5B9,9,10,9,8%5D,%22regexp-dna%22:%5B29,21,22,22,22%5D,%22string-base64%22:%5B19,17,17,18,19%5D,%22string-fasta%22:%5B18,26,26,30,27%5D,%22string-tagcloud%22:%5B38,36,36,36,36%5D,%22string-unpack-code%22:%5B56,56,55,54,55%5D,%22string-validate-input%22:%5B23,25,24,24,23%5D%7D&quot;&gt;details&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Chrome 5.0.322.2 dev (&lt;a href=&quot;http://www2.webkit.org/perf/sunspider-0.9/sunspider-results.html?%7B%223d-cube%22:%5B34,25,31,22,21%5D,%223d-morph%22:%5B26,23,24,41,24%5D,%223d-raytrace%22:%5B21,19,17,33,21%5D,%22access-binary-trees%22:%5B2,2,2,7,2%5D,%22access-fannkuch%22:%5B16,14,15,18,16%5D,%22access-nbody%22:%5B19,18,18,20,18%5D,%22access-nsieve%22:%5B4,4,4,5,5%5D,%22bitops-3bit-bits-in-byte%22:%5B2,3,3,3,4%5D,%22bitops-bits-in-byte%22:%5B9,8,9,14,10%5D,%22bitops-bitwise-and%22:%5B9,9,9,9,10%5D,%22bitops-nsieve-bits%22:%5B10,13,11,16,11%5D,%22controlflow-recursive%22:%5B2,6,3,4,3%5D,%22crypto-aes%22:%5B9,11,10,19,10%5D,%22crypto-md5%22:%5B9,9,9,9,8%5D,%22crypto-sha1%22:%5B8,8,9,9,8%5D,%22date-format-tofte%22:%5B24,22,23,60,21%5D,%22date-format-xparb%22:%5B22,23,23,22,23%5D,%22math-cordic%22:%5B21,14,15,20,14%5D,%22math-partial-sums%22:%5B23,24,26,33,24%5D,%22math-spectral-norm%22:%5B8,7,10,10,8%5D,%22regexp-dna%22:%5B21,20,22,22,23%5D,%22string-base64%22:%5B14,13,14,20,14%5D,%22string-fasta%22:%5B17,20,17,21,17%5D,%22string-tagcloud%22:%5B41,40,39,54,39%5D,%22string-unpack-code%22:%5B49,49,51,52,47%5D,%22string-validate-input%22:%5B21,20,22,21,22%5D%7D&quot;&gt;details&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Opera 10.50 Alpha (&lt;a href=&quot;http://www2.webkit.org/perf/sunspider-0.9/sunspider-results.html?%7B%223d-cube%22:%5B19,17,19,17,16%5D,%223d-morph%22:%5B18,18,17,19,19%5D,%223d-raytrace%22:%5B22,22,21,22,21%5D,%22access-binary-trees%22:%5B6,7,6,6,7%5D,%22access-fannkuch%22:%5B19,19,18,20,19%5D,%22access-nbody%22:%5B13,12,12,14,14%5D,%22access-nsieve%22:%5B6,6,8,7,6%5D,%22bitops-3bit-bits-in-byte%22:%5B2,1,2,2,2%5D,%22bitops-bits-in-byte%22:%5B2,2,3,3,2%5D,%22bitops-bitwise-and%22:%5B2,2,2,3,3%5D,%22bitops-nsieve-bits%22:%5B9,9,9,9,10%5D,%22controlflow-recursive%22:%5B4,4,6,5,5%5D,%22crypto-aes%22:%5B18,18,17,17,19%5D,%22crypto-md5%22:%5B7,6,6,6,6%5D,%22crypto-sha1%22:%5B4,3,4,4,5%5D,%22date-format-tofte%22:%5B37,32,32,33,31%5D,%22date-format-xparb%22:%5B40,39,39,42,42%5D,%22math-cordic%22:%5B9,9,8,9,9%5D,%22math-partial-sums%22:%5B17,16,18,17,19%5D,%22math-spectral-norm%22:%5B5,6,6,6,7%5D,%22regexp-dna%22:%5B16,16,16,17,18%5D,%22string-base64%22:%5B21,20,21,21,21%5D,%22string-fasta%22:%5B28,27,30,27,32%5D,%22string-tagcloud%22:%5B53,53,56,50,55%5D,%22string-unpack-code%22:%5B39,42,37,41,41%5D,%22string-validate-input%22:%5B39,41,40,44,44%5D%7D&quot;&gt;details&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Safari 4.0.4 (&lt;a href=&quot;http://www2.webkit.org/perf/sunspider-0.9/sunspider-results.html?%7B%223d-cube%22:%5B19,17,18,19,21%5D,%223d-morph%22:%5B26,24,25,24,25%5D,%223d-raytrace%22:%5B20,21,21,21,22%5D,%22access-binary-trees%22:%5B6,6,7,6,6%5D,%22access-fannkuch%22:%5B22,23,22,22,21%5D,%22access-nbody%22:%5B15,16,15,15,15%5D,%22access-nsieve%22:%5B12,11,10,10,10%5D,%22bitops-3bit-bits-in-byte%22:%5B5,5,7,5,5%5D,%22bitops-bits-in-byte%22:%5B10,9,9,8,8%5D,%22bitops-bitwise-and%22:%5B6,7,8,10,7%5D,%22bitops-nsieve-bits%22:%5B13,11,11,11,11%5D,%22controlflow-recursive%22:%5B5,4,7,5,6%5D,%22crypto-aes%22:%5B16,16,19,17,17%5D,%22crypto-md5%22:%5B8,9,11,8,8%5D,%22crypto-sha1%22:%5B7,7,8,7,7%5D,%22date-format-tofte%22:%5B29,29,29,29,31%5D,%22date-format-xparb%22:%5B36,37,38,36,38%5D,%22math-cordic%22:%5B15,15,15,17,14%5D,%22math-partial-sums%22:%5B23,23,23,23,25%5D,%22math-spectral-norm%22:%5B9,9,9,11,9%5D,%22regexp-dna%22:%5B24,23,23,21,24%5D,%22string-base64%22:%5B20,20,21,20,20%5D,%22string-fasta%22:%5B36,37,37,36,36%5D,%22string-tagcloud%22:%5B39,40,39,39,47%5D,%22string-unpack-code%22:%5B53,52,52,52,53%5D,%22string-validate-input%22:%5B34,34,36,35,35%5D%7D&quot;&gt;details&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Firefox 3.6 (&lt;a href=&quot;http://www2.webkit.org/perf/sunspider-0.9/sunspider-results.html?%7B%223d-cube%22:%5B49,47,48,48,47%5D,%223d-morph%22:%5B27,29,29,29,28%5D,%223d-raytrace%22:%5B69,66,70,70,68%5D,%22access-binary-trees%22:%5B43,43,49,46,44%5D,%22access-fannkuch%22:%5B63,62,63,67,66%5D,%22access-nbody%22:%5B28,34,31,31,29%5D,%22access-nsieve%22:%5B12,13,12,12,13%5D,%22bitops-3bit-bits-in-byte%22:%5B1,1,1,2,1%5D,%22bitops-bits-in-byte%22:%5B9,11,10,11,11%5D,%22bitops-bitwise-and%22:%5B3,3,2,2,3%5D,%22bitops-nsieve-bits%22:%5B25,26,25,24,23%5D,%22controlflow-recursive%22:%5B34,34,34,34,34%5D,%22crypto-aes%22:%5B32,35,31,33,33%5D,%22crypto-md5%22:%5B15,14,14,24,15%5D,%22crypto-sha1%22:%5B8,11,8,9,9%5D,%22date-format-tofte%22:%5B87,88,90,88,88%5D,%22date-format-xparb%22:%5B60,59,58,59,58%5D,%22math-cordic%22:%5B10,10,10,10,9%5D,%22math-partial-sums%22:%5B17,16,16,16,16%5D,%22math-spectral-norm%22:%5B6,6,7,6,7%5D,%22regexp-dna%22:%5B59,59,60,62,62%5D,%22string-base64%22:%5B12,12,12,16,13%5D,%22string-fasta%22:%5B76,77,76,78,78%5D,%22string-tagcloud%22:%5B98,99,100,99,99%5D,%22string-unpack-code%22:%5B110,109,110,110,111%5D,%22string-validate-input%22:%5B32,32,32,31,30%5D%7D&quot;&gt;details&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Don't take my findings too seriously however, cause I didn't have time to do multiple repetitive tests, rebooting the system between tests, or really much of anything to properly ensure the tests are 100% accurate. If you need seriously accurate numbers, run the tests yourself.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>To Caffeinate, Or Not To Caffeinate?</title>
		<link href="http://jimeh.me/blog/2010/02/14/to-caffeinate-or-not-to-caffeinate"/>
		<updated>2010-02-14T00:00:00+00:00</updated>
		<id>http://jimeh.me/blog/2010/02/14/to-caffeinate-or-not-to-caffeinate</id>
		<content type="html">&lt;p&gt;I used to be a caffeine junkie. My caffeinated poison of choice was Coke, the &lt;a href=&quot;http://files.jimeh.me/.blog/legal-coke-20100213-224302.png&quot; class=&quot;fancybox&quot; title=&quot;I look more like the ad...or, uhmm, used to.....&quot;&gt;legal&lt;/a&gt; kind, not the &lt;a href=&quot;http://files.jimeh.me/.blog/illegal-coke-20100213-224557.png&quot; class=&quot;fancybox&quot;&gt;illegal&lt;/a&gt; one.&lt;/p&gt;

&lt;p&gt;When I say I was a junkie, I don't use those words lightly. At most, I was drinking about 3-4 liters &lt;strong&gt;per day&lt;/strong&gt;. I kid you not. On average though it was around 1.5 liters per day, seven days a week, 365 days a year. The recommended liquid intake per day for adults is 2 liters (of water). This had been going on roughly since I was 16 or 17 years old, or 7-8 years ago.&lt;/p&gt;

&lt;h2&gt;Why Caffeinate?&lt;/h2&gt;

&lt;p&gt;I drank Coke for two reasons. Firstly cause I loved the taste of it. Secondly, and most importantly, cause the caffeine and sugar gave me energy. Being a developer, I spend all my time on the computer thinking a gazillion different thoughts at the same time all day long. Thanks to this, my brain eats up enormous amounts of glucose (sugar), and Coke is the perfect counter agent for this, as it contains both sugar and caffeine.&lt;/p&gt;

&lt;p&gt;Also, I never really sleep a full night's sleep, so I'm always tired throughout the day. If I didn't have any Coke in the morning though, or there was a too long gap between one glass and the next, I'd get extremely tired, to the point of almost dosing off and not being able to get much work done. So I'd have another glass of Coke to counter these deep swings in my alertness.&lt;/p&gt;

&lt;h2&gt;Going Cold Turkey&lt;/h2&gt;

&lt;p&gt;So let's jump to last spring, April 16th 2009 to be exact. While on a road trip, I decided to stop drinking Coke, cold turkey style. Originally I wanted to do it over the weekend just to see how I'd feel without any caffeine in my system. Which was something I hadn't experienced for years. I was honestly a little surprised that after being a bit more tired than normal the first day, I was fine the second day.&lt;/p&gt;

&lt;h2&gt;The Withdrawal&lt;/h2&gt;

&lt;p&gt;After the weekend ended, I kept away from caffeine, and around day three or four, I started getting light headaches multiple times per day, everyday. And I &lt;strong&gt;never&lt;/strong&gt; have headaches, except for when I'm dead sick with some flu so I can hardly stand on my own two feet. So I figured that the headaches were from caffeine &lt;a href=&quot;http://en.wikipedia.org/wiki/Caffeine#Tolerance_and_withdrawal&quot;&gt;withdrawal&lt;/a&gt;. According to Wikipedia, withdrawal symptoms can last for one to five days. My headaches didn't let up for about two weeks.&lt;/p&gt;

&lt;h2&gt;The Aftermath&lt;/h2&gt;

&lt;p&gt;I didn't drink a single drop of caffeine of any form for the next two months. And since then, it's a rare event which generally only happens when I go to the cinema and buy popcorn and Coke for the movie. I generally feel better, I think. I'm still generally tired throughout the day cause I don't get enough sleep, but I never get the deep end energy swings I used to get if I didn't have any Coke for a while.&lt;/p&gt;

&lt;p&gt;My wallet is also feeling healthier. I used to spend between 50 to 100 EUR on Coke every month, now that money is going to paying my cell phone bill instead.&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;I don't need caffeine. I wanted to quit drinking caffeine cause I was curious. I knew it couldn't be that good for me to keep drinking as much Coke as I was, and it was kinda expensive as well.&lt;/p&gt;

&lt;p&gt;If you do consume a lot of caffeine, I'd suggest you try quitting cold turkey style for a week – or even just a weekend – to see how you feel without it. Cause chances are, that you can at the very least save a decent pile of cash over the course of a year or so, without feeling any worse than we all naturally do in our fragile human condition.&lt;/p&gt;

&lt;h2&gt;P.S.&lt;/h2&gt;

&lt;p&gt;I bought a bottle of Coke the other day, cause I felt like having some. After half a glass, I realized that I don't really like the taste of it anymore. So this bottle will probably sit in my fridge indefinitely, and might be the last bottle I ever buy for myself.&lt;/p&gt;

&lt;p&gt;Ten months after quitting Coca Cola, I don't like the taste anymore. It's lame, but for me it's a pretty big event, as I used to consider Coke the best tasting thing on the planet in liquid form.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Was I Really “That” Social?</title>
		<link href="http://jimeh.me/blog/2010/02/10/was-i-really-that-social"/>
		<updated>2010-02-10T00:00:00+00:00</updated>
		<id>http://jimeh.me/blog/2010/02/10/was-i-really-that-social</id>
		<content type="html">&lt;p&gt;As some of you might have noticed the last couple of days, I haven't been online much on IM networks. I'm not sure what originally kept me from launching Adium the other day, but along the way I've come to a realization.&lt;/p&gt;

&lt;h2&gt;The Problem&lt;/h2&gt;

&lt;p&gt;I realized that IM has been taking up way too much of my time, and constantly distracting me from both work and personal matters. You just can't hide from the tsunami of Growl notifications, bouncing and flashing Dock icons, plinging sounds, and more that almost all IM clients spew out in one form or another whenever you receive a message.&lt;/p&gt;

&lt;p&gt;A friend of mine &lt;a href=&quot;http://blog.sugarenia.com/archives/productivity/why-i-gave-up-on-instant-messaging&quot;&gt;gave up&lt;/a&gt; on IM networks almost a year ago, for pretty much same reasons. — Yes, I'm linking to Sugarenia again. She always seems to have the same opinions as me, just days/months before me. &lt;em&gt;Dammit!&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;The Solution&lt;/h2&gt;

&lt;p&gt;Unfortunately I couldn't bring myself to completely disconnect from IM networks, so I took a slightly different approach than Sugarenia. I've gone out of my way to make sure my IM client — Adium of course — doesn't notify me via Growl, Dock icon, sound, telepathy, or even alien abduction. This means, I'm online, I can chat, but unless I manually switch to the space/virtual-desktop where my IM client sets up camp, I don't even know if I have any new messages.&lt;/p&gt;

&lt;p&gt;After a couple of days, I have to say it's a quite nice change. I only get distracted &lt;strong&gt;when I choose&lt;/strong&gt; to check if there are any IM messages to respond to.&lt;/p&gt;

&lt;p&gt;So now you know why it might take me 8 hours to respond to a chat message. I simply didn't want to check for new messages, or I completely forgot cause I was hopefully working along all excited on my next attempt at building an awesome online service which will hopefully pay my rent, and maybe even food.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>About That “Pad” Thing</title>
		<link href="http://jimeh.me/blog/2010/02/06/about-that-pad-thing"/>
		<updated>2010-02-06T00:00:00+00:00</updated>
		<id>http://jimeh.me/blog/2010/02/06/about-that-pad-thing</id>
		<content type="html">&lt;p&gt;So I was gonna write a post with my opinions about the iPad, but a cup of tea and staring at wall of wet paint is almost more tempting. If you don't get why the iPad is important, and why it will succeed, I'm not even gonna try convincing you otherwise, time will just prove you wrong and make you feel stupid.&lt;/p&gt;

&lt;p&gt;By this point you're then thinking “What the fuck is this post about then?”. &lt;a href=&quot;http://blog.sugarenia.com/&quot;&gt;Sugarenia&lt;/a&gt; just wrote up a quick rant regarding her &lt;a href=&quot;http://blog.sugarenia.com/archives/rantings/saturday-ranting-about-ipad-flash&quot;&gt;opinions&lt;/a&gt; on the iPad, which pretty much sums up my own opinions to the letter. Only she's written and explained herself much better than I most likely would have.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;The iPad is not made for you and me, fellow geek. It’s primarily targeted to people that are still afraid of interacting with PCs, those that don’t have a clue about drivers and web apps and Wi-Fi setup. And this is exactly the kind of people that &lt;strong&gt;won’t&lt;/strong&gt; buy a Linux netbook, dear Open Source zealots – because as much as Ubuntu has made Linux user-friendly, there’s still much filling that shows between the seams.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Read the &lt;a href=&quot;http://blog.sugarenia.com/archives/rantings/saturday-ranting-about-ipad-flash&quot;&gt;full article&lt;/a&gt;, please.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I just noticed a &lt;a href=&quot;http://octidextro.us/2010/01/28/apples-ipad-and-why-its-upsetting-geeks/&quot;&gt;post&lt;/a&gt; by another friend of mine which is also good:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;I think the main reason why self-described geeks are throwing a fit over the iPad is that it's a shiny new toy that's not meant for them.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Read the &lt;a href=&quot;http://octidextro.us/2010/01/28/apples-ipad-and-why-its-upsetting-geeks/&quot;&gt;full article&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update 2:&lt;/strong&gt; Seems using Jekyll can have some downsides. I accidentally named the file for this post &lt;code&gt;2010-05-06-[...].md&lt;/code&gt; without noticing that it was labeled as posted “06 May”. I've corrected it, but the permalink to this post has changed. &lt;em&gt;*facepalm*&lt;/em&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>New Avatar, Same Old Fugly Face</title>
		<link href="http://jimeh.me/blog/2010/02/05/new-avatar-same-old-fugly-face"/>
		<updated>2010-02-05T00:00:00+00:00</updated>
		<id>http://jimeh.me/blog/2010/02/05/new-avatar-same-old-fugly-face</id>
		<content type="html">&lt;p&gt;Today marks the day I update my online avatar/profile picture. I've had the same sepia colored half-face avatar for 4 or 5 years now. So it was about time for a change. However, the biggest reason I changed it, was cause I cut my hair short in November, after having long hair for about 10 years.&lt;/p&gt;

&lt;p&gt;But why the heck am I blogging about it? Cause I wanted to have an excuse to add &lt;a href=&quot;http://fancybox.net/&quot;&gt;Fancybox&lt;/a&gt; to my newly redesigned site. And the previous post was looking lonely after two days in solitary here.&lt;/p&gt;

&lt;p&gt;So without further ado, I present my old and my new avatar in complete Fancybox glory with fading animations and all. If you're reading this in a feed reader, click &lt;a href=&quot;http://jimeh.me/blog/2010/02/05/new-avatar-same-old-fugly-face&quot;&gt;here&lt;/a&gt; (if you're really bored).&lt;/p&gt;

&lt;p class=&quot;thumbs&quot;&gt;
    &lt;a href=&quot;http://files.jimeh.me/.blog/jimeh_1.0_large-20100205-042133.jpg&quot; class=&quot;fancybox&quot; rel=&quot;2010-02-05-avatar&quot;&gt;&lt;img src=&quot;http://files.jimeh.me/.blog/jimeh_1.0-20100205-034118.png&quot; alt=&quot;Old Avatar: jimeh 1.0 (2005)&quot; /&gt;&lt;/a&gt;
    &lt;a href=&quot;http://files.jimeh.me/.blog/jimeh_2.0_large-20100205-042205.jpg&quot; class=&quot;fancybox&quot; rel=&quot;2010-02-05-avatar&quot;&gt;&lt;img src=&quot;http://files.jimeh.me/.blog/jimeh_2.0-20100205-034010.png&quot; alt=&quot;New Avatar: jimeh 2.0 (2010)&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;


&lt;p&gt;Because I'm a perfectionist and decent bit insane, here's the 50x50 pixel versions too, so you can see how they both look in really small sizes, which is the most common size they appear in on different sites anyway.&lt;/p&gt;

&lt;p class=&quot;thumbs&quot;&gt;
    &lt;a href=&quot;http://files.jimeh.me/.blog/jimeh_1.0_large-20100205-042133.jpg&quot; class=&quot;fancybox no-title&quot; rel=&quot;2010-02-05-avatar-s&quot;&gt;&lt;img src=&quot;http://files.jimeh.me/.blog/jimeh_1.0_small-20100205-070219.jpg&quot; alt=&quot;Old Avatar: jimeh 1.0 (2005)&quot; /&gt;&lt;/a&gt;
    &lt;a href=&quot;http://files.jimeh.me/.blog/jimeh_2.0_large-20100205-042205.jpg&quot; class=&quot;fancybox no-title&quot; rel=&quot;2010-02-05-avatar-s&quot;&gt;&lt;img src=&quot;http://files.jimeh.me/.blog/jimeh_2.0_small-20100205-070251.jpg&quot; alt=&quot;New Avatar: jimeh 2.0 (2010)&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;


&lt;p&gt;And incase you're wondering, I'm 18 or 19 in the old photo, and 24 in the new one. If I shave though I can easily fool people into believing that I'm 17. In fact, some people think I am 17 :P... I guess I'll appreciate it more when I'm 30-40 and people think I'm 26, hehe.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Automated Profile Picture Update Service?</title>
		<link href="http://jimeh.me/blog/2010/02/05/automated-profile-picture-update-server"/>
		<updated>2010-02-05T00:00:00+00:00</updated>
		<id>http://jimeh.me/blog/2010/02/05/automated-profile-picture-update-server</id>
		<content type="html">&lt;p&gt;After I updated my &lt;a href=&quot;http://jimeh.me/blog/2010/02/05/new-avatar-same-old-fugly-face/&quot;&gt;profile picture&lt;/a&gt; today, a friend of mine &lt;a href=&quot;http://twitter.com/jonromero/status/8655908664&quot;&gt;responded&lt;/a&gt; with:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Build a service that changes your profile picture in all social networks!&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;He also didn't like the new profile picture, but that's his problem. My first response was &lt;s&gt;&lt;em&gt;fuck off&lt;/em&gt;&lt;/s&gt; &lt;em&gt;“Gravatar?”&lt;/em&gt;. Obviously he didn't mean Gravatar, I just mentioned it to annoy him.&lt;/p&gt;

&lt;p&gt;A service which automagically just updates your Facebook, Twitter, Flickr, YouTube, Vimeo, Gravatar, &lt;em&gt;...&lt;/em&gt; profile pictures would be quite cool. Thinking about it a bit more, there are three problems with building such a service:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A lot of these sites you will need to crawl programmatically using some kind of web-crawler library. It will be a pain to write, and even bigger pain whenever they change anything in the HTML layout of their pages.&lt;/li&gt;
&lt;li&gt;Some sites have specific and/or strange restrictions for image dimensions, file size, and even file format.&lt;/li&gt;
&lt;li&gt;Will people actually trust such a service with passwords for all of their online social networking accounts?&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;The later problem, trust, is definitely the biggest one. And I'm not sure you could overcome it unless the service is officially sponsored and/or operated by Google or somebody. I do think it could be a fun project to undertake, but I think it's pretty doomed right from the start unfortunately. Although if I updated my profile pictures more than once every 4-5 years, I might just build a prototype for myself at least.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>New Site and Blog Powered by Dr. Jekyll</title>
		<link href="http://jimeh.me/blog/2010/02/03/new-site-and-blog-powered-by-dr-jekyll"/>
		<updated>2010-02-03T00:00:00+00:00</updated>
		<id>http://jimeh.me/blog/2010/02/03/new-site-and-blog-powered-by-dr-jekyll</id>
		<content type="html">&lt;p&gt;I finally found some time to rebuild my site, and add a blog. I'm also working on a portfolio, which I will probably be putting up on &lt;a href=&quot;http://heartb.it/&quot;&gt;heartb.it&lt;/a&gt;. I haven't really decided how I'm gonna make the split between my personal site and work portfolio yet though.&lt;/p&gt;

&lt;p&gt;For archival reasons I've made the &lt;a href=&quot;http://v1.jimeh.me/&quot;&gt;previous&lt;/a&gt; &lt;a href=&quot;http://v2.jimeh.me/&quot;&gt;versions&lt;/a&gt; of my site available for anybody who might be curious.&lt;/p&gt;

&lt;p&gt;On an unrelated note, it happens to be my 24th birthday today, I haven't decided yet if that's a good or a bad thing. But at least I found time to push up my new site today, so I guess that's a good start at least :)&lt;/p&gt;

&lt;h2&gt;Powered by Dr. Jekyll?&lt;/h2&gt;

&lt;p&gt;My personal site has always been a &lt;strong&gt;very&lt;/strong&gt; simple site. In the past it's just been a single HTML page which I've coded by hand and uploaded via SFTP. It's a simple process, and decently straight forward. This time however, I wanted to incorporate a blog as well. My first choice was &lt;a href=&quot;http://www.wordpress.org/&quot;&gt;WordPress&lt;/a&gt;, as I've used it on my &lt;a href=&quot;http://blog.zydev.info/&quot;&gt;previous&lt;/a&gt; blog. But it's overkill for what I need, and keept getting hacked all the fucking time even when I was keeping WordPress decently up to date.&lt;/p&gt;

&lt;p&gt;So I'm using &lt;a href=&quot;http://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt; this time around. Jekyll is a small website framework written in &lt;a href=&quot;http://www.ruby-lang.org/&quot;&gt;Ruby&lt;/a&gt; which generates static HTML files. It was created by one of &lt;a href=&quot;http://github.com/&quot;&gt;GitHub&lt;/a&gt;'s founders, and is used on GitHub &lt;a href=&quot;http://pages.github.com/&quot;&gt;Pages&lt;/a&gt;. Part of what makes it nice is that it's more intended to be a quick and elegant blogging engine, rather than just a static site generator. It let's you write blog posts in pure HTML, Markdown, or Textile. Meaning I'm writing this post in TextMate, which always puts a smile on my face.&lt;/p&gt;

&lt;p&gt;I'll soon write a more in-depth article about Jekyll and how I'm using it.&lt;/p&gt;

&lt;h2&gt;Comments with Disqus&lt;/h2&gt;

&lt;p&gt;Since I'm using static HTML files, I'm left with only a few — but awesome — solutions to have a commenting feature on the blog. Both &lt;a href=&quot;http://disqus.com/&quot;&gt;Disqus&lt;/a&gt; and &lt;a href=&quot;http://intensedebate.com/&quot;&gt;Intense Debate&lt;/a&gt; have great Javascript-based commenting systems which work for static HTML sites. My favorite of the two is Disqus.&lt;/p&gt;

&lt;h2&gt;Deployment with Rake+Rsync&lt;/h2&gt;

&lt;p&gt;I've also opted for a much easier way to deploy to the live server once I'm done with changes locally. Namely, Ruby's Make program, &lt;em&gt;Rake&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I've written a couple of custom rake tasks which run Jekyll to build the static HTML files, and to rsync said HTML files to the remote server. So instead of using a SFTP client, or something like &lt;a href=&quot;http://www.panic.com/coda/&quot;&gt;Coda&lt;/a&gt; to upload and update the remote site, I simply run &lt;code&gt;rake deploy&lt;/code&gt; from a terminal.&lt;/p&gt;

&lt;p&gt;I get butterflies in my stomach whenever I think about how neat it is.&lt;/p&gt;

&lt;h2&gt;Source Code Management with Git&lt;/h2&gt;

&lt;p&gt;After being an avid user of &lt;a href=&quot;http://subversion.apache.org/&quot;&gt;Subversion&lt;/a&gt; for about 5 years, I switched permanently to &lt;a href=&quot;http://git-scm.com/&quot;&gt;Git&lt;/a&gt; last August when I spent 4 hours reading a PDF I had with me on holiday. So I'm obviously using Git for this site, and the source code is &lt;a href=&quot;http://github.com/jimeh/jimeh.me&quot;&gt;available&lt;/a&gt; on GitHub in all it's glory.&lt;/p&gt;

&lt;h2&gt;Design&lt;/h2&gt;

&lt;p&gt;I really focused on minimalism, to the point I'm not using a single image, but rather only text on a white background. This is a first for me, as I generally like to have nice rounded corners, or drop shadows, or something, but still simple and elegant looking.&lt;/p&gt;

&lt;p&gt;Since the design in highly text-focussed, good typography was a must right from the start. I wanted to stray away from the standard web-safe fonts, to create a truly unique and elegant looking site in terms of it's typography. To do this, I needed to embed fonts, and I used the &lt;a href=&quot;http://en.wikipedia.org/wiki/Web_typography#Browser_support&quot;&gt;@font-face&lt;/a&gt; technique for it.&lt;/p&gt;

&lt;p&gt;The two fonts I'm using are &lt;a href=&quot;http://www.fontsquirrel.com/fonts/Colaborate&quot;&gt;Colaborate&lt;/a&gt; for body text, and &lt;a href=&quot;http://www.fontsquirrel.com/fonts/DejaVu-Sans-Mono&quot;&gt;DejaVu Sans Mono&lt;/a&gt; for fixed width text and code examples. I got both from &lt;a href=&quot;http://www.fontsquirrel.com/&quot;&gt;Font Squirrel&lt;/a&gt;'s excellent &lt;a href=&quot;http://www.fontsquirrel.com/fontface&quot;&gt;@font-face fontkit&lt;/a&gt; page which has hundreds of free and ready to use kits.&lt;/p&gt;

&lt;h2&gt;The End&lt;/h2&gt;

&lt;blockquote&gt;&lt;p&gt;{insert &lt;a href=&quot;http://en.wikipedia.org/wiki/Mother_insult&quot;&gt;yo mamma joke&lt;/a&gt; here}. Have a nice day.&lt;/p&gt;&lt;/blockquote&gt;
</content>
	</entry>
	
	
</feed>