<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><description>
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));

var pageTracker = _gat._getTracker("UA-354125-2");
pageTracker._initData();
pageTracker._trackPageview();
</description><title>NSDiary</title><generator>Tumblr (3.0; @jxl)</generator><link>http://notes.jaspe.rs/</link><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/nsdiary" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="nsdiary" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://tumblr.superfeedr.com/" /><item><title>TVs suck</title><description>&lt;p&gt;Since the rumors of a real Apple TV are picking up again, I think they can make a TV that doesn&amp;#8217;t suck. It isn&amp;#8217;t that hard, here is why I think all current TV&amp;#8217;s suck.&lt;/p&gt;

&lt;p&gt;As much as computers have evolved, TV&amp;#8217;s seem to have stopped evolving ever since they invented the remote control. Having a flat screen a few centimeters thick is an engineering marvel, but it doesn&amp;#8217;t make watching TV any better than the TV from 10-15 years ago.&lt;/p&gt;

&lt;h2&gt;Switching channels&lt;/h2&gt;

&lt;p&gt;A TV 10 years ago was big and bulky but it did its job remarkably well. Sure its sound and screen were probably quite some levels lower than today&amp;#8217;s standards, but it did one thing very well: switching channels was instanteneous. I could go through 20 channels in a snap, not that we had 20 channels 10 years ago but that&amp;#8217;s beside the point, the TV supported 99 channels, the providers were lacking.&lt;/p&gt;

&lt;p&gt;If you buy a high end TV today I can pretty much guarantee you it won&amp;#8217;t be able to switch channels faster than the TV of 10 years ago. It&amp;#8217;ll probably have a perfectly valid technical reason why it can&amp;#8217;t, after all watching in UltraHDMaxSuperQuality isn&amp;#8217;t easy, but that doesn&amp;#8217;t mean it can&amp;#8217;t be solved.&lt;/p&gt;

&lt;p&gt;Worst case scenario you add some kind of fade in/out effect to it, make it shiny and call it a feature. But just shipping it and calling it one of the drawbacks of flat screen technology is just a cop out.&lt;/p&gt;

&lt;h2&gt;The remote&lt;/h2&gt;

&lt;p&gt;For me, they stopped evolving pretty much right after adding infrared to it, at least with the remotes sold with the TV. Logitech has some advanced touchbased remotes but not quite there yet. The best remote is a remote I don&amp;#8217;t have to look at, after all I&amp;#8217;m busy watching the TV.&lt;/p&gt;

&lt;p&gt;My main gripes with the current state of remotes:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;p&gt;It&amp;#8217;s IR based so needs direct line of sight, that&amp;#8217;s not a disaster just a small annoyance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It invariably has at least 4 buttons you never use, in my case it&amp;#8217;s &amp;#8216;DTV&amp;#8217;, &amp;#8216;EPG&amp;#8217;, &amp;#8216;ESG&amp;#8217; and RADIO. Never ever used them. Now take your remote and find your four buttons.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On my Telenet remote they are: &amp;#8216;Comm&amp;#8217;, Mode&amp;#8217;, &amp;#8216;Delete&amp;#8217; and &amp;#8216;Exit&amp;#8217;. I never ever use them, they mostly indicate a lack of UX.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The back button only remembers the last selected channel, much like the clipboard on the mac. Emacs solved this by introducing a kill ring, it&amp;#8217;s basically a clipboard that can go backward and forward. TV&amp;#8217;s need this.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Example:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;You&amp;#8217;re watching snooker on BBC&lt;/li&gt;
&lt;li&gt;Switch to Eurosport to catch curling because it&amp;#8217;s a slow frame&lt;/li&gt;
&lt;li&gt;Watch some curling until a commercial break&lt;/li&gt;
&lt;li&gt;Switch back to BBC using back.&lt;/li&gt;
&lt;li&gt;Still a boring frame switch back to curling&lt;/li&gt;
&lt;li&gt;Still a commercial, go to channel 1 and see if anything is on.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;At this point you&amp;#8217;re stuck, the only way to get back to snooker is by pressing the channel number. If TV&amp;#8217;s had a kill ring you&amp;#8217;d only have to press &lt;code&gt;back&lt;/code&gt; &lt;code&gt;back&lt;/code&gt; and you&amp;#8217;re back just in time to catch a century break in the making.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ll admit this last point might be something only I could appreciate.&lt;/p&gt;

&lt;h2&gt;Lack of UX&lt;/h2&gt;

&lt;p&gt;Most TVs pretty much stopped evolving their interface when they could overlay one above the currently playing content. Showing the current channel number briefly with a slight glow behind is considered the high water mark of UI.&lt;/p&gt;

&lt;p&gt;This doesn&amp;#8217;t bother as much as the rest of the &amp;#8216;Settings&amp;#8217;; worst offender usually is the ordering of channels, it&amp;#8217;s the holy grail of TV UX, it&amp;#8217;s unsolvable, or so it seems.&lt;/p&gt;

&lt;p&gt;The rest is usually solved by adding sliders to tweak each and every little thing of color and audio. Unfortunately, you can tweak so many things it&amp;#8217;s no longer clear what the correct defaults should be. After all in the shop they&amp;#8217;ve turned the colors up to eleven to make them &amp;#8216;pop&amp;#8217;, which looks good in the shop but looks like crappy video when you get home.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;d pay good money to get a tv that ships with sensible defaults, except I already paid good money for such a tv. And what defaults did I get? &amp;#8220;Soft&amp;#8221;, &amp;#8220;User&amp;#8221;, &amp;#8220;Dynamic&amp;#8221;, &amp;#8220;Sports&amp;#8221;, &amp;#8220;Movies&amp;#8221;. And they all don&amp;#8217;t look quite right.&lt;/p&gt;

&lt;h2&gt;Picture in picture&lt;/h2&gt;

&lt;p&gt;What happened here? I remember watching commercials of TVs that supported picture in picure, you could watch two channels at the same time! Glorious day!&lt;/p&gt;

&lt;p&gt;Except that day never came, now I probably never want to watch two things at the same time for a long period of time, but as a way of quickly glancing at what&amp;#8217;s on it would rock. Heck I need picture in picture in picture in picture.&lt;/p&gt;

&lt;h2&gt;;tldr&lt;/h2&gt;

&lt;p&gt;The current line of TV&amp;#8217;s lack all the stuff Apple has shown again and again to be able to execute: great UI, sufficient speed, ItJustWorks factor.&lt;/p&gt;

&lt;p&gt;However I don&amp;#8217;t think Apple wants to be in the TV business just to make another TV. If they&amp;#8217;re going to make a TV, it will be one that (hopefully) addresses the issues listed above (or at least some of them) and tackles the other elephant in the room: content. Which would make for another post all in itself.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/nsdiary/~4/Vt9eoPSuPOY" height="1" width="1"/&gt;</description><link>http://notes.jaspe.rs/post/24086538904</link><guid>http://notes.jaspe.rs/post/24086538904</guid><pubDate>Wed, 30 May 2012 18:05:46 -0400</pubDate></item><item><title>Debug oneliner</title><description>&lt;p&gt;To quickly get the rect of a view add this to your .pch&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
#define RectLog(x) NSLog(@"%s rect: %@",#x, NSStringFromCGRect(x.frame))
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now you can do&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
UIView *aWellNamedView = [[UIView alloc] initWithFrame:CGRectMake(0,0,250,300)];
RectLog(aWellNamedView);
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Which will print out:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
aWellNamedView rect: {{0, 0}, {250, 300}}
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Which is nice.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/nsdiary/~4/HO3CsiNC7_k" height="1" width="1"/&gt;</description><link>http://notes.jaspe.rs/post/4717053766</link><guid>http://notes.jaspe.rs/post/4717053766</guid><pubDate>Mon, 18 Apr 2011 08:34:45 -0400</pubDate></item><item><title>"90% of coding is debugging. The other 10% is writing bugs."</title><description>“90% of coding is debugging. The other 10% is writing bugs.”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;Bram Cohen (of BitTorrent fame)&lt;/em&gt;&lt;img src="http://feeds.feedburner.com/~r/nsdiary/~4/ITwFBJYtIEk" height="1" width="1"/&gt;</description><link>http://notes.jaspe.rs/post/4168934500</link><guid>http://notes.jaspe.rs/post/4168934500</guid><pubDate>Mon, 28 Mar 2011 18:34:24 -0400</pubDate></item><item><title>"Enlightened trial and error succeeds over the planning of the lone genius."</title><description>“Enlightened trial and error succeeds over the planning of the lone genius.”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;a href="http://www.youtube.com/watch?v=M66ZU2PCIcM&amp;feature=player_embedded"&gt;IDEO&lt;/a&gt;&lt;/em&gt;&lt;img src="http://feeds.feedburner.com/~r/nsdiary/~4/1rHnkrOfzXI" height="1" width="1"/&gt;</description><link>http://notes.jaspe.rs/post/2609599737</link><guid>http://notes.jaspe.rs/post/2609599737</guid><pubDate>Wed, 05 Jan 2011 10:11:32 -0500</pubDate></item><item><title>Proposal for a new acronym</title><description>&lt;p&gt;&lt;h1&gt;STO&lt;/h1&gt;

&lt;h2&gt;Stating The Obvious.&lt;/h2&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/nsdiary/~4/yGKLPl6MM_w" height="1" width="1"/&gt;</description><link>http://notes.jaspe.rs/post/1662720537</link><guid>http://notes.jaspe.rs/post/1662720537</guid><pubDate>Tue, 23 Nov 2010 17:51:00 -0500</pubDate></item><item><title>"Everyone can be taught to sculpt: Michelangelo would have had to be taught how not to. So it is with..."</title><description>“Everyone can be taught to sculpt: Michelangelo would have had to be taught how not to. So it is with the great programmers”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;a href="http://www-pu.informatik.uni-tuebingen.de/users/klaeren/epigrams.html"&gt;Alan Perlis&lt;/a&gt;&lt;/em&gt;&lt;img src="http://feeds.feedburner.com/~r/nsdiary/~4/OxCuN6sDdN0" height="1" width="1"/&gt;</description><link>http://notes.jaspe.rs/post/1566280352</link><guid>http://notes.jaspe.rs/post/1566280352</guid><pubDate>Sat, 13 Nov 2010 19:16:42 -0500</pubDate></item><item><title>"I can work 25 hours a day if necessary, live on any reasonable salary, and don’t give a black..."</title><description>“I can work 25 hours a day if necessary, live on any reasonable salary, and don’t give a black damn for job security, office politics, or adverse public relations.”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;a href="http://www.ottawacitizen.com/Hunter+Thompson+brutally+honest+Canadian+request/3606508/story.html"&gt;Hunter S Thompson in the best job request I’ve ever read.&lt;/a&gt;&lt;/em&gt;&lt;img src="http://feeds.feedburner.com/~r/nsdiary/~4/r8-Rb3Rrh_E" height="1" width="1"/&gt;</description><link>http://notes.jaspe.rs/post/1234957692</link><guid>http://notes.jaspe.rs/post/1234957692</guid><pubDate>Sun, 03 Oct 2010 08:40:23 -0400</pubDate></item><item><title>"For four years we have offered the synchronization service for no charge, predicated on the..."</title><description>“For four years we have offered the synchronization service for no charge, predicated on the hypothesis that a business model would emerge to support the free service.”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;a href="http://blog.xmarks.com/?p=1886"&gt;http://blog.xmarks.com/?p=1886&lt;/a&gt;&lt;/em&gt;&lt;img src="http://feeds.feedburner.com/~r/nsdiary/~4/R5EfjI4_f_0" height="1" width="1"/&gt;</description><link>http://notes.jaspe.rs/post/1203568242</link><guid>http://notes.jaspe.rs/post/1203568242</guid><pubDate>Tue, 28 Sep 2010 03:46:25 -0400</pubDate></item><item><title>"Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code..."</title><description>“Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Brian_Kernighan"&gt;Brian Kernighan&lt;/a&gt;&lt;/em&gt;&lt;img src="http://feeds.feedburner.com/~r/nsdiary/~4/9NkvCbYE98A" height="1" width="1"/&gt;</description><link>http://notes.jaspe.rs/post/757474473</link><guid>http://notes.jaspe.rs/post/757474473</guid><pubDate>Thu, 01 Jul 2010 08:27:12 -0400</pubDate></item><item><title>"This will take science. It will take art. It will take innovation. It will take ambition. And it..."</title><description>“This will take science. It will take art. It will take innovation. It will take ambition. And it will take humility. But the fantastic thing is: This is what you get to do.”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;a href="http://www.newyorker.com/online/blogs/newsdesk/2010/06/gawande-stanford-speech.html"&gt;I’m mentally replacing medecine with computer science&lt;/a&gt;&lt;/em&gt;&lt;img src="http://feeds.feedburner.com/~r/nsdiary/~4/kjr2J2icqAY" height="1" width="1"/&gt;</description><link>http://notes.jaspe.rs/post/731497936</link><guid>http://notes.jaspe.rs/post/731497936</guid><pubDate>Thu, 24 Jun 2010 10:37:00 -0400</pubDate></item><item><title>&amp;#8216;The future of magazines is now.&amp;#8217;

- No, it’s not. The future is never now.

source</title><description>&lt;h1&gt;&amp;#8216;The future of magazines is now.&amp;#8217;&lt;/h1&gt;

&lt;h1&gt;- No, it’s not. The future is never now.&lt;/h1&gt;

&lt;p&gt;&lt;a href="http://informationarchitects.jp/wired-on-ipad-just-like-a-paper-tiger/"&gt;source&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/nsdiary/~4/2sNjzsvowT0" height="1" width="1"/&gt;</description><link>http://notes.jaspe.rs/post/640619662</link><guid>http://notes.jaspe.rs/post/640619662</guid><pubDate>Fri, 28 May 2010 08:31:10 -0400</pubDate></item><item><title>"It always takes longer than you expect, even when you take into account Hofstadter’s Law."</title><description>“It always takes longer than you expect, even when you take into account Hofstadter’s Law.”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;Hofstadter’s Law (&lt;a href="http://fuckyeahcomputerscience.tumblr.com/post/593208065/hofstadters-law"&gt;via&lt;/a&gt;)&lt;/em&gt;&lt;img src="http://feeds.feedburner.com/~r/nsdiary/~4/IbH3pMt5iuk" height="1" width="1"/&gt;</description><link>http://notes.jaspe.rs/post/616171338</link><guid>http://notes.jaspe.rs/post/616171338</guid><pubDate>Thu, 20 May 2010 09:15:55 -0400</pubDate></item><item><title>
  &amp;#8220;It’s been cool to see so many Flash sites work on mobile devices. However because there is...</title><description>&lt;blockquote&gt;
  &lt;p&gt;&amp;#8220;It’s been cool to see so many Flash sites work on mobile devices. However because there is such a variety of Flash content out on the web, it’s important to understand that not all of it is going to run on devices like the Nexus One, both because of lower hardware capabilities of devices and because of user interface design.&amp;#8221; - &lt;a href="http://blog.digitalbackcountry.com/2010/05/examples-of-flash-content-running-on-android/"&gt;source&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then why do it at all&amp;#160;? If Flash had one thing going for them, it was the &amp;#8220;we-run-on-all-platforms&amp;#8221;; now it turns out they&amp;#8217;re like Java. They do run on every platform but the definition of running varies wildly.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/nsdiary/~4/hYsWPSUK95I" height="1" width="1"/&gt;</description><link>http://notes.jaspe.rs/post/591939546</link><guid>http://notes.jaspe.rs/post/591939546</guid><pubDate>Wed, 12 May 2010 04:20:00 -0400</pubDate></item><item><title>"If sleep doesn’t serve an absolutely vital function, it is the greatest mistake evolution ever..."</title><description>“If sleep doesn’t serve an absolutely vital function, it is the greatest mistake evolution ever made.”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Allan_Rechtschaffen"&gt;Allan_Rechtschaffen&lt;/a&gt;&lt;/em&gt;&lt;img src="http://feeds.feedburner.com/~r/nsdiary/~4/_reQJJl7omA" height="1" width="1"/&gt;</description><link>http://notes.jaspe.rs/post/586619063</link><guid>http://notes.jaspe.rs/post/586619063</guid><pubDate>Mon, 10 May 2010 07:44:09 -0400</pubDate></item><item><title>"Great minds discuss ideas; Average minds discuss events; Small minds discuss people"</title><description>“Great minds discuss ideas; Average minds discuss events; Small minds discuss people”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;Eleanor Roosevelt&lt;/em&gt;&lt;img src="http://feeds.feedburner.com/~r/nsdiary/~4/B5hNzhA46Go" height="1" width="1"/&gt;</description><link>http://notes.jaspe.rs/post/553050444</link><guid>http://notes.jaspe.rs/post/553050444</guid><pubDate>Tue, 27 Apr 2010 05:39:11 -0400</pubDate></item><item><title>"We are at the beginning of a significant change in the industry, and I believe that ultimately open..."</title><description>“We are at the beginning of a significant change in the industry, and I believe that ultimately open platforms will win out over the type of closed, locked down platform that Apple is trying to create.”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;a href="http://www.mikechambers.com/blog/2010/04/20/on-adobe-flash-cs5-and-iphone-applications/"&gt;Meanwhile Flash isn’t open sourced-either, put up or shut up&lt;/a&gt;&lt;/em&gt;&lt;img src="http://feeds.feedburner.com/~r/nsdiary/~4/Rn4vAtwi5M8" height="1" width="1"/&gt;</description><link>http://notes.jaspe.rs/post/538171725</link><guid>http://notes.jaspe.rs/post/538171725</guid><pubDate>Wed, 21 Apr 2010 08:35:48 -0400</pubDate></item><item><title>Go: Quickly to your projects</title><description>&lt;p&gt;If you&amp;#8217;re reading this, you probably already know that I&amp;#8217;m:&lt;/p&gt;

&lt;p&gt;a. A fan of &lt;a href="http://www.flickr.com/photos/pjaspers/3526862628/"&gt;Terminal.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;b. A fan of &lt;a href="http://github.com/robbyrussell/oh-my-zsh"&gt;Oh-my-zsh&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now a and b got even better, thanks to a little function that helps me &lt;code&gt;cd&lt;/code&gt; directly to my projects. I&amp;#8217;ve called it go and it&amp;#8217;s largely based on the work of &lt;a href="http://atog.be"&gt;@atog&lt;/a&gt; (he made the function without the autocompletion) and the rake-completion in oh-my-zsh (I&amp;#8217;ve largely copied/stolen/adjusted their code to fit mine).&lt;/p&gt;

&lt;p&gt;Look for it &lt;a href="http://gist.github.com/368394"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s not the prettiest of functions but it is a handy one.&lt;/p&gt;

&lt;p&gt;UPDATE: Be sure to look at the comment by &lt;a href="http://workswithruby.com/"&gt;@defv&lt;/a&gt; his script is even sweeter (no temp file required)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/nsdiary/~4/8Q6-Kho8TMU" height="1" width="1"/&gt;</description><link>http://notes.jaspe.rs/post/535573411</link><guid>http://notes.jaspe.rs/post/535573411</guid><pubDate>Tue, 20 Apr 2010 07:29:00 -0400</pubDate></item><item><title>"The intrusion of ads into my stream seems like a fairly small issue overall. I’m used to having my..."</title><description>“&lt;p&gt;The intrusion of ads into my stream seems like a fairly small issue overall. I’m used to having my personal life interrupted by branded content from commercials on TV, to billboards on the bus my son and I ride to school, to Facebook and Gmail ads next to my personal correspondence.&lt;/p&gt;

&lt;p&gt;On its own, I’m not sure the Twitter ad plan will make that big a dent in a world that is already so heavily sponsored.&lt;/p&gt;”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;a href="http://tweetagewasteland.com/2010/04/im-being-followed-by-rogaine/"&gt;Tweetage Wasteland aced it&lt;/a&gt;&lt;/em&gt;&lt;img src="http://feeds.feedburner.com/~r/nsdiary/~4/tn6j9QAm3hI" height="1" width="1"/&gt;</description><link>http://notes.jaspe.rs/post/520407225</link><guid>http://notes.jaspe.rs/post/520407225</guid><pubDate>Wed, 14 Apr 2010 04:47:55 -0400</pubDate></item><item><title>Keyboard Macros: The greatest feature you've never used. </title><description>&lt;p&gt;You might have read my &lt;a href="http://notes.jaspe.rs/post/498808895/podcasts"&gt;previous&lt;/a&gt; post on podcasts and wondered how much time I&amp;#8217;ve spent creating that list with its URLs and short descriptions etc.&lt;/p&gt;

&lt;p&gt;Fortunably/regrettably (depending on wether you liked that post) this is a matter of minutes thanks to the wonderful invention of Keyboard Macros (available in Textmate and Emacs and probably others).&lt;/p&gt;

&lt;p&gt;So if you&amp;#8217;re willing to play along and learn something that will save you time (promised) when working with text, please be so kind to copy the text in &lt;a href="http://dl.dropbox.com/u/16204/tumblr_posts/raw_podcasts.txt"&gt;this file&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In case you&amp;#8217;re curious that&amp;#8217;s the result of selecting my podcasts in iTunes (pic), copy and a paste.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://dl.dropbox.com/u/16204/tumblr_posts/itunes_podcasts.png" alt="Selected podcasts"/&gt;&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m assuming you&amp;#8217;ve pasted my text in your favorite editor (Emacs will get you bonuspoints).&lt;/p&gt;

&lt;h5&gt;Emacs&lt;/h5&gt;

&lt;p&gt;&lt;code&gt;M-x kmacro-start-macro-or-insert-counter&lt;/code&gt; (bound to F3) to start the macro&lt;/p&gt;

&lt;p&gt;&lt;code&gt;M-x kmacro-end-or-call-macro&lt;/code&gt; (bound to F4) to stop/call the macro&lt;/p&gt;

&lt;h5&gt;Textmate&lt;/h5&gt;

&lt;p&gt;Take a look in the Bundles-menu-item, look at the shortcut for starting a Macro, memorize it (you can do this entire thing without ever touching the mouse, think of the &lt;a href="http://inessential.com/2007/04/25/thoughts_about_large_cocoa_projects"&gt;kittens&lt;/a&gt;!).&lt;/p&gt;

&lt;p&gt;&lt;img src="http://dl.dropbox.com/u/16204/tumblr_posts/bundle_menu.png" alt="Bundle Menu"/&gt;&lt;/p&gt;

&lt;h3&gt;Let&amp;#8217;s dig in&lt;/h3&gt;

&lt;p&gt;(I&amp;#8217;m assuming your caret is on the first line of the file, if it isn&amp;#8217;t please do so)&lt;/p&gt;

&lt;p&gt;The keyboard commands you need to hit:&lt;/p&gt;

&lt;table id="macros"&gt;&lt;tr&gt;&lt;th&gt;Emacs&lt;/th&gt;
    &lt;th&gt;Textmate&lt;/th&gt;
    &lt;th&gt;What am I doing?&lt;/th&gt;
  &lt;/tr&gt;&lt;tr&gt;&lt;td&gt;F3&lt;/td&gt;
    &lt;td&gt;Alt-Command-M&lt;/td&gt;
    &lt;td&gt;Start recording the macro&lt;/td&gt;
  &lt;/tr&gt;&lt;tr&gt;&lt;td colspan="2"&gt;C-a&lt;/td&gt;
    &lt;td&gt;Position caret a beginning of line&lt;/td&gt;
  &lt;/tr&gt;&lt;tr&gt;&lt;td colspan="2"&gt;Press # two times&lt;/td&gt;
    &lt;td&gt;Typing 2 hashes&lt;/td&gt;
  &lt;/tr&gt;&lt;tr&gt;&lt;td&gt;C-s (incr search)&lt;/td&gt;
    &lt;td&gt;Command-F&lt;/td&gt;
    &lt;td&gt;Looking for the tab char&lt;/td&gt;
  &lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Since the text is delimited by tabs, we need to look for the tab character to move our caret along for our next action. In Textmate we can do this by using Find with a regex&lt;/p&gt;

&lt;p&gt;&lt;img src="http://dl.dropbox.com/u/16204/tumblr_posts/search_regex.png" alt="Find with regex"/&gt;&lt;/p&gt;

&lt;p&gt;In Emacs we can do an incremental search and enter a tab by using the &lt;code&gt;quoted-insert&lt;/code&gt; command (bound to C-q), so &lt;code&gt;C-s C-q tab&lt;/code&gt; will do the trick. Great! We&amp;#8217;ve found the tab character, moving on.&lt;/p&gt;

&lt;table id="macros"&gt;&lt;tr&gt;&lt;th&gt;Emacs&lt;/th&gt;
    &lt;th&gt;Textmate&lt;/th&gt;
    &lt;th&gt;What am I doing?&lt;/th&gt;
  &lt;/tr&gt;&lt;tr&gt;&lt;td colspan="2"&gt;Press # two times&lt;/td&gt;
    &lt;td&gt;Typing 2 hashes (to end markdown title)&lt;/td&gt;
  &lt;/tr&gt;&lt;tr&gt;&lt;td colspan="2"&gt;C-d (two times)&lt;/td&gt;
    &lt;td&gt;Forward deletes the next two tabs&lt;/td&gt;
  &lt;/tr&gt;&lt;tr&gt;&lt;td colspan="2"&gt;Press return&lt;/td&gt;
    &lt;td&gt;Moving to a new line&lt;/td&gt;
  &lt;/tr&gt;&lt;tr&gt;&lt;td colspan="2"&gt;Press &amp;gt; once&lt;/td&gt;
    &lt;td&gt;Creating a markdown blockquote&lt;/td&gt;
  &lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Command-F&lt;/td&gt;
    &lt;td&gt;C-s (incr search)&lt;/td&gt;
    &lt;td&gt;Looking for the tab char (remember last time)&lt;/td&gt;
  &lt;/tr&gt;&lt;tr&gt;&lt;td colspan="2"&gt;C-d&lt;/td&gt;
    &lt;td&gt;Deletes tab char&lt;/td&gt;
  &lt;/tr&gt;&lt;tr&gt;&lt;td colspan="2"&gt;Return&lt;/td&gt;
    &lt;td&gt;Moving to a new line&lt;/td&gt;
  &lt;/tr&gt;&lt;tr&gt;&lt;td colspan="2"&gt;Type `[link](`&lt;/td&gt;
    &lt;td&gt;Creating markdown link&lt;/td&gt;
  &lt;/tr&gt;&lt;tr&gt;&lt;td colspan="2"&gt;C-e&lt;/td&gt;
    &lt;td&gt;Move to end of line&lt;/td&gt;
  &lt;/tr&gt;&lt;tr&gt;&lt;td colspan="2"&gt;Type `)`&lt;/td&gt;
    &lt;td&gt;Ending the link&lt;/td&gt;
  &lt;/tr&gt;&lt;tr&gt;&lt;td colspan="2"&gt;Press returning&lt;/td&gt;
    &lt;td&gt;Adding another line&lt;/td&gt;
  &lt;/tr&gt;&lt;tr&gt;&lt;td colspan="2"&gt;C-n&lt;/td&gt;
    &lt;td&gt;Moving caret to the next line&lt;/td&gt;
  &lt;/tr&gt;&lt;tr&gt;&lt;td&gt;F4&lt;/td&gt;
    &lt;td&gt;Control-Command-M&lt;/td&gt;
    &lt;td&gt;Stop recording the macro&lt;/td&gt;
  &lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Phiew. Glad that&amp;#8217;s done. What we&amp;#8217;ve done now is created a Keyboard Macro, think of it as a small program defined by keystrokes, every keystroke you press in a macro is a command. This way you can quickly create throwaway string manipulation programs.&lt;/p&gt;

&lt;p&gt;Knowing your way around a keyboard is pretty vital to the whole damn operation, so (&lt;a href="http://notes.jaspe.rs/post/264980019/useful-keybindings"&gt;this&lt;/a&gt; might come in handy).&lt;/p&gt;

&lt;p&gt;Now to execute the &amp;#8220;program&amp;#8221;.&lt;/p&gt;

&lt;table id="macros"&gt;&lt;tr&gt;&lt;th&gt;Emacs&lt;/th&gt;
    &lt;th&gt;Textmate&lt;/th&gt;
    &lt;th&gt;What am I doing?&lt;/th&gt;
  
  &lt;/tr&gt;&lt;tr&gt;&lt;td&gt;F4&lt;/td&gt;
    &lt;td&gt;Command-Shift-M&lt;/td&gt;
    &lt;td&gt;Executes the macro.&lt;/td&gt;
  &lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Now repeat this step as many times as necessary. See what we&amp;#8217;ve done, isn&amp;#8217;t that almost indistinguishable from magic.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://dl.dropbox.com/u/16204/tumblr_posts/finished.png" alt="Finished result"/&gt;&lt;/p&gt;

&lt;h3&gt;Notes&lt;/h3&gt;

&lt;ul&gt;&lt;li&gt;It&amp;#8217;s always handy to start a macro with a C-a to know exactly where you start.&lt;/li&gt;
&lt;li&gt;If you mistype, just undo and move on. The macro will do this undo each and every time, but it&amp;#8217;s a program; it won&amp;#8217;t care.&lt;/li&gt;
&lt;li&gt;Keyboard shortcuts are your friend, learn them.&lt;/li&gt;
&lt;li&gt;This isn&amp;#8217;t just for humongous amounts of text, it will work wonders on lists etc. as well&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/nsdiary/~4/5ufkknBTQ4g" height="1" width="1"/&gt;</description><link>http://notes.jaspe.rs/post/506678973</link><guid>http://notes.jaspe.rs/post/506678973</guid><pubDate>Thu, 08 Apr 2010 18:55:11 -0400</pubDate></item><item><title>"As anyone who uses MS Word will tell you, software that goes out of its way to be extra helpful..."</title><description>“As anyone who uses MS Word will tell you, software that goes out of its way to be extra helpful often turns out to be a hindrance.”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;Damn skippy. &lt;a href="http://javascriptweblog.wordpress.com/2010/03/16/a-few-javascript-gotchas/"&gt;via&lt;/a&gt;&lt;/em&gt;&lt;img src="http://feeds.feedburner.com/~r/nsdiary/~4/p89fgzhvo-0" height="1" width="1"/&gt;</description><link>http://notes.jaspe.rs/post/503000136</link><guid>http://notes.jaspe.rs/post/503000136</guid><pubDate>Wed, 07 Apr 2010 07:33:51 -0400</pubDate></item></channel></rss>

