<?xml version="1.0" encoding="UTF-8"?> <rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" ><channel><title>Brett Terpstra &#187; Blog</title> <atom:link href="http://brettterpstra.com/category/blog/feed/" rel="self" type="application/rss+xml" /><link>http://brettterpstra.com</link> <description>Elegant solutions to complex problems.</description> <lastBuildDate>Wed, 28 Jul 2010 14:27:33 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3946</generator> <item><title>Single-keystroke Instapaper in Google Reader</title><link>http://brettterpstra.com/2010/07/28/single-keystroke-instapaper-in-google-reader/</link> <comments>http://brettterpstra.com/2010/07/28/single-keystroke-instapaper-in-google-reader/#comments</comments> <pubDate>Wed, 28 Jul 2010 14:02:05 +0000</pubDate> <dc:creator>Brett</dc:creator> <category><![CDATA[Blog]]></category> <category><![CDATA[Code]]></category> <category><![CDATA[extension]]></category> <category><![CDATA[safari]]></category> <category><![CDATA[safari 5]]></category><guid isPermaLink="false">http://brettterpstra.com/?p=836</guid> <description><![CDATA[This was a quick plugin I put together last night when I got too frustrated to work on my actual jobs. It lets you define a single shortcut key which, after you input your Instapaper username and password, will let you send the currently-selected article in Google Reader straight to Instapaper. It works fine with themes like Helvetireader (Safari extension),&#8230;No related posts. ]]></description> <content:encoded><![CDATA[<p><img src="http://cdn.brettterpstra.com/wp-content/uploads/2010/07/greaderinstapapericon.jpg" alt="GReader Instapaper Icon" title="GReader Instapaper Icon" width="200" height="200" class="alignright size-full wp-image-838 noshadow" />This was a quick plugin I put together last night when I got too frustrated to work on my actual jobs. It lets you define a single shortcut key which, after you input your <a href="http://www.instapaper.com/">Instapaper</a> username and password, will let you send the currently-selected article in <a href="http://www.google.com/reader/">Google Reader</a> straight to Instapaper. It works fine with themes like <a href="http://helvetireader.com/">Helvetireader</a> (<a href="http://kirindave.tumblr.com/post/675464589/safari-5-port-of-helvetireader">Safari extension</a>), and functions in both list view and expanded view.</p><p>Click below to download, unzip the extension and double click it to install. Head for <strong>Preferences-&gt;Extensions</strong> and set up your Instapaper username and password, and pick a hotkey. The default hotkey is “i”, which doesn’t interfere with existing Google shortcuts. Tailor to taste.</p><p>The only issue I’m having right now is that it doesn’t fail properly if you have an incorrect user/pass combination. It tells you it succeeded, but doesn’t post to your account. I’ll have to add a verification step at some point in the process. For now, if things aren’t showing up in Instapaper for you, check your username and password in the Extensions preferences. Be sure to check out <a href="http://brettterpstra.com/2010/06/09/instapaper-beyond-for-safari/">Instapaper Beyond</a>, too!</p><h4>Download:</h4><p class="download_desc"><a href="http://brettterpstra.com/downloads/GReaderInstapaper.0.1.zip" title="Download GReader Instapaper (322)"><img src="http://cdn.brettterpstra.com/wp-content/uploads/downloads/thumbnails/2010/07/icon.png" alt="download image for GReader Instapaper" width="64" height="64" /></a><a href="http://brettterpstra.com/downloads/GReaderInstapaper.0.1.zip" title="Download GReader Instapaper (322)">GReader Instapaper</a> — Adds single-keystroke sending of the current article in Google Reader to your Instapaper account. <a href="http://brettterpstra.com/2010/07/28/single-keystroke-instapaper-in-google-reader/">More Info</a></p><p>No related posts.</p> ]]></content:encoded> <wfw:commentRss>http://brettterpstra.com/2010/07/28/single-keystroke-instapaper-in-google-reader/feed/</wfw:commentRss> <slash:comments>10</slash:comments> </item> <item><title>Instapaper Beyond 1.8.9</title><link>http://brettterpstra.com/2010/07/26/instapaper-beyond-1-8-9/</link> <comments>http://brettterpstra.com/2010/07/26/instapaper-beyond-1-8-9/#comments</comments> <pubDate>Mon, 26 Jul 2010 13:31:29 +0000</pubDate> <dc:creator>Brett</dc:creator> <category><![CDATA[Blog]]></category> <category><![CDATA[Code]]></category> <category><![CDATA[extension]]></category> <category><![CDATA[instapaper]]></category> <category><![CDATA[instapaper beyond]]></category> <category><![CDATA[safari]]></category> <category><![CDATA[safari 5]]></category><guid isPermaLink="false">http://brettterpstra.com/?p=832</guid> <description><![CDATA[Instapaper Beyond version 1.8.9 is another small release with a couple of usability enhancements. Thanks to everyone who's been submitting ideas and bugs, I'll do my best to keep up! This release includes: Alphabetical sorting of the help HUD (A-Z,a-z) Edit a bookmark with "E" (Shift-E) you can tab through the fields and submit with Enter, returning you to your&#8230;<ul><li><a href="http://brettterpstra.com/2010/07/16/instapaper-beyond-fix-for-text-style-controls/" rel="bookmark">Instapaper Beyond: fix for text style controls</a></li><li><a href="http://brettterpstra.com/2010/07/25/instapaper-beyond-1-8-7/" rel="bookmark">Instapaper Beyond 1.8.7</a></li><li><a href="http://brettterpstra.com/2010/06/05/instapaper-beyond-1-3/" rel="bookmark">Instapaper Beyond 1.3</a></li></ul> ]]></description> <content:encoded><![CDATA[<p><a href="http://brettterpstra.com/2010/06/09/instapaper-beyond-for-safari/">Instapaper Beyond</a> version 1.8.9 is another small release with a couple of usability enhancements. Thanks to everyone who's been submitting ideas and bugs, I'll do my best to keep up!</p><p>This release includes:</p><ul><li>Alphabetical sorting of the help HUD (A-Z,a-z)</li><li>Edit a bookmark with "E" (Shift-E)<ul><li>you can tab through the fields and submit with Enter, returning you to your listing</li></ul></li><li>Scroll animation when navigating bookmark lists<ul><li>makes it more obvious which direction the page just scrolled you in when selecting a bookmark partially or entirely offscreen.</li></ul></li></ul><p><strong>Download:</strong></p><p class="download_desc"><a href="http://brettterpstra.com/downloads/InstapaperBeyond.1.8.10.zip" title="Download Instapaper Beyond for Safari 5 (94)"><img src="http://cdn.brettterpstra.com/wp-content/uploads/downloads/thumbnails/2010/06/instapaperbeyond95.png" alt="download image for Instapaper Beyond for Safari 5" width="64" height="64" /></a><a href="http://brettterpstra.com/downloads/InstapaperBeyond.1.8.10.zip" title="Download Instapaper Beyond for Safari 5 (94)">Instapaper Beyond for Safari 5</a> - Instapaper Beyond for Safari adds full keyboard navigation and Ajax loading of text views to Instapaper (http://www.instapaper.com). This extension is for Safari 5 with extensions enabled. <a href="http://brettterpstra.com/2010/06/09/instapaper-beyond-for-safari/">More Info</a></p><ul><li><a href="http://brettterpstra.com/2010/07/16/instapaper-beyond-fix-for-text-style-controls/" rel="bookmark">Instapaper Beyond: fix for text style controls</a></li><li><a href="http://brettterpstra.com/2010/07/25/instapaper-beyond-1-8-7/" rel="bookmark">Instapaper Beyond 1.8.7</a></li><li><a href="http://brettterpstra.com/2010/06/05/instapaper-beyond-1-3/" rel="bookmark">Instapaper Beyond 1.3</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://brettterpstra.com/2010/07/26/instapaper-beyond-1-8-9/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Instapaper Beyond 1.8.7</title><link>http://brettterpstra.com/2010/07/25/instapaper-beyond-1-8-7/</link> <comments>http://brettterpstra.com/2010/07/25/instapaper-beyond-1-8-7/#comments</comments> <pubDate>Sun, 25 Jul 2010 16:40:07 +0000</pubDate> <dc:creator>Brett</dc:creator> <category><![CDATA[Blog]]></category> <category><![CDATA[Code]]></category> <category><![CDATA[extension]]></category> <category><![CDATA[instapaper]]></category> <category><![CDATA[instapaper beyond]]></category> <category><![CDATA[safari]]></category> <category><![CDATA[safari 5]]></category><guid isPermaLink="false">http://brettterpstra.com/?p=825</guid> <description><![CDATA[Update: I just pushed out version 1.8.8 with a minor fix for some spacebar-in-forms issues. The download link and auto-update file have already been updated. Thanks to John P for the bug report! This is relatively minor update for Instapaper Beyond, the Safari extension which gives you full Ajax loading and keyboard control over Instapaper. It does, however, have one&#8230;<ul><li><a href="http://brettterpstra.com/2010/06/09/instapaper-beyond-for-safari/" rel="bookmark">Instapaper Beyond for Safari!</a></li><li><a href="http://brettterpstra.com/2010/07/16/instapaper-beyond-fix-for-text-style-controls/" rel="bookmark">Instapaper Beyond: fix for text style controls</a></li><li><a href="http://brettterpstra.com/2010/06/05/instapaper-beyond-1-3/" rel="bookmark">Instapaper Beyond 1.3</a></li></ul> ]]></description> <content:encoded><![CDATA[<p><strong>Update:</strong> I just pushed out version 1.8.8 with a minor fix for some spacebar-in-forms issues. The download link and auto-update file have already been updated. Thanks to John P for the bug report!</p><p>This is relatively minor update for <a href="http://brettterpstra.com/2010/06/09/instapaper-beyond-for-safari/">Instapaper Beyond</a>, the Safari extension which gives you full Ajax loading and keyboard control over <a href="http://www.instapaper.com">Instapaper</a>. It does, however, have one very cool new feature, and one often-requested fix.</p><p>The new feature is type-ahead folder selection in the popup HUDs for Move To and Go To Folder. When the HUD pops up, you can just start typing and it will find the first folder that matches the letters you've typed and select it. The arrow keys function as usual, and enter or right arrow will open the selected folder. If you type a few letters and then hit backspace or escape, it will clear the filter field. If you pause for a second, then start typing again, it will start a new filter, QuickSilver/Launchbar style.</p><p>The other noticeable change is that it works better with Greystyled now. It's not perfect, as Greystyled wants to do its own thing with the Ajax-loaded text versions and there's a major conflict. I check for Greystyled now, though, and give it a little leeway. The text view will not look like it does in Greystyled without IB loaded, but it will work for you.</p><p>If you have Instapaper Beyond loaded, it will either update automatically, or show up in your available updates if you have auto-updates turned off. If you haven't loaded it, download it below and give it a try!</p><p class="download_desc"><a href="http://brettterpstra.com/downloads/InstapaperBeyond.1.8.10.zip" title="Download Instapaper Beyond for Safari 5 (94)"><img src="http://cdn.brettterpstra.com/wp-content/uploads/downloads/thumbnails/2010/06/instapaperbeyond95.png" alt="download image for Instapaper Beyond for Safari 5" width="64" height="64" /></a><a href="http://brettterpstra.com/downloads/InstapaperBeyond.1.8.10.zip" title="Download Instapaper Beyond for Safari 5 (94)">Instapaper Beyond for Safari 5</a> - Instapaper Beyond for Safari adds full keyboard navigation and Ajax loading of text views to Instapaper (http://www.instapaper.com). This extension is for Safari 5 with extensions enabled. <a href="http://brettterpstra.com/2010/06/09/instapaper-beyond-for-safari/">More Info</a></p><ul><li><a href="http://brettterpstra.com/2010/06/09/instapaper-beyond-for-safari/" rel="bookmark">Instapaper Beyond for Safari!</a></li><li><a href="http://brettterpstra.com/2010/07/16/instapaper-beyond-fix-for-text-style-controls/" rel="bookmark">Instapaper Beyond: fix for text style controls</a></li><li><a href="http://brettterpstra.com/2010/06/05/instapaper-beyond-1-3/" rel="bookmark">Instapaper Beyond 1.3</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://brettterpstra.com/2010/07/25/instapaper-beyond-1-8-7/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Notes on cleaning up the MediaTemple hack (JohnnyA)</title><link>http://brettterpstra.com/2010/07/24/notes-on-cleaning-up-the-mediatemple-hack-johnnya/</link> <comments>http://brettterpstra.com/2010/07/24/notes-on-cleaning-up-the-mediatemple-hack-johnnya/#comments</comments> <pubDate>Sat, 24 Jul 2010 22:19:57 +0000</pubDate> <dc:creator>Brett</dc:creator> <category><![CDATA[Blog]]></category> <category><![CDATA[exploit]]></category> <category><![CDATA[security]]></category> <category><![CDATA[webdev]]></category> <category><![CDATA[Wordpress]]></category><guid isPermaLink="false">http://brettterpstra.com/?p=823</guid> <description><![CDATA[First, the hack described here is not MediaTemple's fault, nor an exploit of their security system. It's a reminder to all of us that checking permissions and updating software are the bare minimum we can do to avoid a lot of headache and potential security issues. MediaTemple was apparently just targeted because of their size, the responsibility for the hacked&#8230;<ul><li><a href="http://brettterpstra.com/2010/07/01/better-wordpress-security-through-comment-filters/" rel="bookmark">Better WordPress security through comment filters</a></li><li><a href="http://brettterpstra.com/2009/11/14/fk-a-useful-bash-function/" rel="bookmark">fk: a useful bash function</a></li><li><a href="http://brettterpstra.com/2010/04/17/adding-a-tinymce-button/" rel="bookmark">Adding a TinyMCE button to WordPress</a></li></ul> ]]></description> <content:encoded><![CDATA[<p><img src="http://cdn.brettterpstra.com/wp-content/uploads/2010/07/johnnyapostheaderimage.jpg" alt="johnnyapostheaderimage.jpg" border="0" width="650" height="187" class="headerimg" /></p><p>First, the hack described here is not MediaTemple’s fault, nor an exploit of their security system. It’s a reminder to all of us that checking permissions and updating software are the bare minimum we can do to avoid a lot of headache and potential security issues. MediaTemple was apparently just targeted because of their size, the responsibility for the hacked sites lies with the site’s owner/webmaster.</p><p>Second, it doesn’t just affect WordPress. I found bits of the exploit in MODx files, static files, and even some sites that weren’t accessible through the internet.</p><p>Lastly, to the perpetrators: thanks for the security reminder, but curses upon you and your families. May you spend eternity grepping for obscure lines of code while every client you have calls you to tell you their business is going to fail because their site is throwing security warnings.</p><p>What follows is not a full-fledged guide to cleaning up a hacked server, just some notes from my experience with this round.</p><h3>Have you been hacked?</h3><p>The exploit is a little difficult to notice. It inserts percent-escaped lines of code into JavaScript files you’re already including on your page, which then use document.write to add redirect code to the rendered page. This means that viewing source won’t show it, you have to see the rendered source, ala Firebug, Safari Web Inspector, or one of various plugins that show the actual source after the DOM has loaded.</p><p>What you’ll find in the rendered source is a little function that uses an array of colors and urls to generate somewhat random redirects. A url called ‘edisonsnightclub’ is always in the mix, so that’s what I search for. The redirect has the side-effect of triggering Firefox’s security warnings, which is a fair sight better than just sending clients off to malicious sites. However, it appears to only execute the code for search engine bots, so it could potentially go unnoticed on your site for quite some time.</p><p><span id="more-823"></span></p><h3>Cleanup</h3><p>I did my cleanup job hastily, and didn’t track everything as well as I should have. There were lines inserted into main template PHP files which I just quickly deleted. These always began with <code>$o=</code>, so that became my server-wide search pattern (more on that in a second). This didn’t only affect WordPress, it also hit my MODx sites and the exploit would probably hit static sites or any other CMS just fine, so check everything.</p><p>Once the PHP files were cleaned up, I realized that the most insidious part of the hack was that it picked random script files from your page to insert itself into. Tracking it down got interesting. One thing to note: you can tell what file it’s in when you view the rendered source by looking at the script tag right before the exploit code. The included script is where you’ll find the <code>document.write</code> line.</p><p>The point of entry on my GridServer turned out to be a single directory in a single WordPress install, from which a rootkit (identifiable by the existence of an <code>is_writable.php</code> file) was able to gain write access to 20+ sites that I host there. The rootkit was found in the <code>img</code> directory of a TinyMCE theme within a WordPress install.</p><p>The exploit doesn’t even change the mod dates on the files, so it’s hard to filter out the infected scripts. What I did was SSH in and <code>cd</code> to the <code>domains</code> directory, where I ran a grep for the patterns I’d found so far. The line within the javascript file looks like this (truncated):</p><p><code>var st1 = 0;document.write(unescape('%3C%73%63...%74%3E'));var gr0=0;</code></p><p>So I set up a grep command like this:</p><p><code>find ./ -name "*.js" -exec grep -l "gr0=0" {} \;</code></p><p>That gives me just the name and path of any file which contains a match to the string “gr0=0,” which is unique enough to narrow things down. I ran a similar grep for the PHP files:</p><p><code>find ./ -name "*.php" -exec grep -l '$o=' {} \;</code></p><p>That one yields some false positives, I need to find a more specific search criteria. It gets the job done, though. Then it’s just a matter of manually cleaning out the inserted lines. Be careful not to delete anything in your JavaScript files after the <code>gr0=0;</code>, such as the opening of a comment block or the first line of a jQuery plugin. Just delete up to the semicolon and you’ll be fine.</p><p>You’ll also want to check <em>all</em> of your databases. First look for extra admin users (JohnnyA is what they were always called in mine), then check for lines in your content tables as mentioned on the <a href="http://wiki.mediatemple.net/w/WordPress_Redirect_Exploit">MediaTemple wiki</a>.</p><p>Check that your permissions are secure<sup id="fnref:harden"><a href="#fn:harden" rel="footnote">1</a></sup> and make sure you find the rootkit and remove it. That will be several PHP files in a random directory, and they’ll have recent modification timestamps. As I mentioned, one of them should be called <code>is_writeable.php</code>, which you can use in a <code>find</code> statement as well.</p><p>Best of luck, and please add any additional notes or corrections in the comments!</p><div class="footnotes"><hr /><ol><li id="fn:harden"><p>See <a href="http://codex.wordpress.org/Hardening_WordPress">Hardening WordPress</a> in the Codex for examples <a href="#fnref:harden" rev="footnote">↩</a></p></li></ol></div><ul><li><a href="http://brettterpstra.com/2010/07/01/better-wordpress-security-through-comment-filters/" rel="bookmark">Better WordPress security through comment filters</a></li><li><a href="http://brettterpstra.com/2009/11/14/fk-a-useful-bash-function/" rel="bookmark">fk: a useful bash function</a></li><li><a href="http://brettterpstra.com/2010/04/17/adding-a-tinymce-button/" rel="bookmark">Adding a TinyMCE button to WordPress</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://brettterpstra.com/2010/07/24/notes-on-cleaning-up-the-mediatemple-hack-johnnya/feed/</wfw:commentRss> <slash:comments>13</slash:comments> </item> <item><title>Make amazing coffee without the hassle</title><link>http://brettterpstra.com/2010/07/24/make-amazing-coffee-without-the-hassle/</link> <comments>http://brettterpstra.com/2010/07/24/make-amazing-coffee-without-the-hassle/#comments</comments> <pubDate>Sat, 24 Jul 2010 16:48:02 +0000</pubDate> <dc:creator>Brett</dc:creator> <category><![CDATA[Blog]]></category> <category><![CDATA[Write]]></category> <category><![CDATA[coffee]]></category> <category><![CDATA[personal]]></category> <category><![CDATA[tips]]></category><guid isPermaLink="false">http://brettterpstra.com/?p=816</guid> <description><![CDATA[I've really been enjoying my current coffee and tea setup, so I thought I'd share. There's an investment involved, but you can set it up for anywhere from about $50 to $200, plus the ongoing cost of coffee beans and tea. Here's the rundown. The beans Thanks to an old friend of mine (@tubetone), I've discovered Sweet Maria's, a California-based&#8230;<ul><li><a href="http://brettterpstra.com/2010/01/29/big-nerd-ranchero/" rel="bookmark">Big Nerd Ranchero</a></li><li><a href="http://brettterpstra.com/2010/07/25/instapaper-beyond-1-8-7/" rel="bookmark">Instapaper Beyond 1.8.7</a></li><li><a href="http://brettterpstra.com/2010/06/06/multimarkdown-in-marsedit/" rel="bookmark">MultiMarkdown in MarsEdit</a></li></ul> ]]></description> <content:encoded><![CDATA[<p><img src="http://cdn.brettterpstra.com/wp-content/uploads/2010/07/coffeepostheader.jpg" alt="Coffee Post header" border="0" width="650" height="187" class="headerimg" /></p><p>I’ve really been enjoying my current coffee and tea setup, so I thought I’d share. There’s an investment involved, but you can set it up for anywhere from about $50 to $200, plus the ongoing cost of coffee beans and tea. Here’s the rundown.</p><h3>The beans</h3><p><img src="http://cdn.brettterpstra.com/wp-content/uploads/2010/07/coffeebeans.jpg" alt="coffeebeans.jpg" border="0" width="200" height="181" class="alignright noshadow" />Thanks to an old friend of mine (<a href="http://twitter.com/tubetone">@tubetone</a>), I’ve discovered <a href="http://www.sweetmarias.com/">Sweet Maria’s</a>, a California-based coffee supplier which sells excellent coffee beans (primarily green) online. I don’t roast my own (yet), so I’ve been ordering <a href="http://www.sweetmarias.com/prod.roastedespresso.php">espresso-roasted coffee beans</a> from them, and they’re excellent. You can do whatever you like with preparation, but if you start with less-than-satisfactory beans, you might as well just stir up some Folgers. Research growers online and in your area, and find some good beans you can enjoy without the guilt of rainforest destruction and slave labor. It’s just more fun that way. <span id="more-816"></span></p><h3>Grinding</h3><p><a href="http://cdn.brettterpstra.com/wp-content/uploads/2010/07/burrgrinder.jpg" rel="lightbox[816]"><img src="http://cdn.brettterpstra.com/wp-content/uploads/2010/07/burrgrinder-150x150.jpg" alt="" title="burrgrinder.jpg" width="150" height="150" class="alignright size-thumbnail wp-image-810" /></a>I’ve been through an array of grinders in my life, but it’s only been recently that I’ve invested in a <a href="http://www.amazon.com/s/?ie=UTF8&amp;keywords=conical+burr+grinder&amp;tag=googhydr-20&amp;index=aps&amp;hvadid=2961750899&amp;ref=pd_sl_7g293s1ie_b">conical burr grinder</a>. The <a href="http://www.amazon.com/Breville-BCG450XL-Conical-Burr-Grinder/dp/B000MDHH0Q/ref=sr_1_2?ie=UTF8&amp;s=home-garden&amp;qid=1279986165&amp;sr=8-2">one I got</a> may not be perfect, but it works just fine. It quietly creates a grind to your exact specifications, without warming or burning the beans in the process. For this preparation setup, I grind to the fine end of the “drip” setting, and dial it to 20 seconds which gives me the exact amount of grounds I need and doesn’t require me watching over it. I keep the sealed hopper full of beans, and then just grind out what I need when I’m making coffee. There are plenty of options for conical burr grinders. The only reason I really prefer them over your average Black and Decker is granular control over the fineness of the grounds, but do what works for you (and your budget).</p><h3>Brewing</h3><p><img src="http://cdn.brettterpstra.com/wp-content/uploads/2010/07/aeropress.jpg" alt="aeropress.jpg" border="0" width="167" height="321" class="alignright noshadow" />Say what you will about the <a href="http://www.amazon.com/AeroPress-Coffee-and-Espresso-Maker/dp/B000GXZ2GS/ref=sr_1_1?ie=UTF8&amp;s=home-garden&amp;qid=1279985733&amp;sr=8-1">AeroPress</a> ($18.99 on Amazon right now), which is essentially a glorified French Press, but it makes the best coffee I’ve ever had outside of an expensive espresso bar. It takes about 45 seconds to make a great cup of coffee, once you have the hot water and grounds ready. I’d recommend alternatives to this, but I haven’t found any. The AeroPress is inexpensive and, to rip off a phrase, it Just Works™. The optimum temperature for the AeroPress is 175°, and I’ve got that nailed and on tap with my <a href="http://shopmandalatea.com/zojirushi-champagne-micom-water-boiler-and-warmer-1.html">Zojirushi water heater</a><sup id="fnref:shrimpeyes"><a href="#fn:shrimpeyes" rel="footnote">1</a></sup>. I purchased it from Mandala Tea (friends of mine) for the purpose of brewing perfect tea, but it’s doing double duty now that I have my AeroPress. 175° works perfectly for green tea <em>and</em> coffee, so I generally just leave it set there and have hot water on tap.</p><p><a href="http://cdn.brettterpstra.com/wp-content/uploads/2010/07/zojirushi.jpg" rel="lightbox[816]"><img src="http://cdn.brettterpstra.com/wp-content/uploads/2010/07/zojirushi-150x150.jpg" alt="" title="zojirushi.jpg" width="150" height="150" class="alignleft size-thumbnail wp-image-813" /></a>Combine pre-heated water with a hopper of beans that have my pre-measured grounds in 20 seconds, I’ve got a great cup of coffee in about one minute. Daily cleanup is as simple as putting the mug in the dishwasher, popping the grounds out of the AeroPress (just aim toward the trash and push the plunger, then run the plunger under water) and sweeping up the grounds I inevitably scatter around the grinder.</p><p><a href="http://cdn.brettterpstra.com/wp-content/uploads/2010/07/teathermos.jpg" rel="lightbox[816]"><img src="http://cdn.brettterpstra.com/wp-content/uploads/2010/07/teathermos-126x150.jpg" alt="" title="teathermos.jpg" width="126" height="150" class="alignright size-thumbnail wp-image-814" /></a>These days I tend to wake up to a single, great cup of coffee, and then drink tea for the rest of the day. <a href="http://shopmandalatea.com">Mandala Tea</a> keeps me well-stocked in hand-picked, loose leaf teas (I especially like the <a href="http://shopmandalatea.com/oolong-tea/ginseng-oolong.html">Ginseng Oolong</a>), and I picked up a <a href="http://shopmandalatea.com/double-walled-tea-thermos.html">tea thermos</a> from them that makes sipping all day a pleasure. In the end, I’ve found that a great cup of coffee doesn’t require a religious routine or a lot of hassle, just the right supplies. I’m not trying to sell anyone on any of this kit, it’s just what I’m using and it’s working great.</p><div class="footnotes"><hr /><ol><li id="fn:shrimpeyes"><p>If you choose to boil your water on the stove and don’t have a thermometer handy, you can use the “shrimp eyes” technique. The Chinese refer to the point where water first starts to form bubbles at the bottom of the pot as “shimp eyes,” and a full boil is “whale eyes.” Shrimp eyes begin at approximately 175°, so just keep an eye out for them. <a href="#fnref:shrimpeyes" rev="footnote">↩</a></p></li></ol></div><ul><li><a href="http://brettterpstra.com/2010/01/29/big-nerd-ranchero/" rel="bookmark">Big Nerd Ranchero</a></li><li><a href="http://brettterpstra.com/2010/07/25/instapaper-beyond-1-8-7/" rel="bookmark">Instapaper Beyond 1.8.7</a></li><li><a href="http://brettterpstra.com/2010/06/06/multimarkdown-in-marsedit/" rel="bookmark">MultiMarkdown in MarsEdit</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://brettterpstra.com/2010/07/24/make-amazing-coffee-without-the-hassle/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Fixing Gleebox</title><link>http://brettterpstra.com/2010/07/17/fixing-gleebox/</link> <comments>http://brettterpstra.com/2010/07/17/fixing-gleebox/#comments</comments> <pubDate>Sun, 18 Jul 2010 00:11:14 +0000</pubDate> <dc:creator>Brett</dc:creator> <category><![CDATA[Blog]]></category> <category><![CDATA[Code]]></category> <category><![CDATA[css]]></category> <category><![CDATA[extension]]></category> <category><![CDATA[gleebox]]></category> <category><![CDATA[userstyle]]></category><guid isPermaLink="false">http://brettterpstra.com/?p=778</guid> <description><![CDATA[If you haven’t tried it, gleeBox is an amazing extension. I have it installed in my Firefox and Chrome setups, and I’m more than thrilled that it’s finally available for Safari. It lets you do a lot of crazy (and useful) things with keyboard commands on any website. There’s a great writeup over at PimpMySafari.com, so I won’t go into&#8230;No related posts. ]]></description> <content:encoded><![CDATA[<p><a href="http://cdn.brettterpstra.com/wp-content/uploads/2010/07/defaultgleeboxhighlights.jpg" rel="lightbox[778]"><img src="http://cdn.brettterpstra.com/wp-content/uploads/2010/07/defaultgleeboxhighlights-150x150.jpg" alt="" title="defaultgleeboxhighlights" width="150" height="150" class="size-thumbnail wp-image-784 alignright" /></a>If you haven’t tried it, <a href="http://thegleebox.com/">gleeBox</a> is an amazing extension. I have it installed in my Firefox and Chrome setups, and I’m more than thrilled that it’s finally available for Safari. It lets you do a lot of crazy (and useful) things with keyboard commands on any website. There’s a <a href="http://www.pimpmysafari.com/extensions/gleebox-command-line-interface-for-safari">great writeup over at PimpMySafari.com</a>, so I won’t go into depth on the wonderful parts. I’ll concentrate on the one thing that bugs me about gleeBox: the highlight colors on found and selected elements. They are, in my opinion, a little obnoxious. <span id="more-778"></span></p><p>Fortunately, another Safari extension comes to the rescue. <a href="http://code.grid.in.th/">User CSS</a> is a pretty effective way to use slightly-modified <a href="userstyles.org/">userstyles</a> and generate your own CSS overrides. If you happen to have both extensions installed (or are on your way to get them right now), here’s a recipe for de-uglifying gleeBox (<a href="http://cdn.brettterpstra.com/wp-content/uploads/2010/07/UserCSSGleebox.jpg" rel="lightbox[778]">settings screenshot</a>):</p><ol><li>Create a new User CSS in the User CSS Manager</li><li>Name it Glee Highlight Override and set the Domains field to *</li><li>Add the code below in the Styles field:</li></ol><div markdown=0><pre><code>
body .GleeHL { 
    background-color:#eef49b !important;
    -webkit-box-shadow:none !important;
    border:solid 1px #dfec2c !important;
    padding:0 !important;
}
body .GleeReaped {
    background-color:#f6f9c9 !important;
    border:solid 1px #c0c660 !important;
}
</code></pre></div><p><a href="http://cdn.brettterpstra.com/wp-content/uploads/2010/07/adjustedGleeboxHighlights.jpg" rel="lightbox[778]"><img src="http://cdn.brettterpstra.com/wp-content/uploads/2010/07/adjustedGleeboxHighlights-150x150.jpg" alt="" title="adjustedGleeboxHighlights" width="150" height="150" class="size-thumbnail wp-image-782 alignright" /></a>The highlights should be prettier now, even if the change is fairly subtle. The style also removes the padding and shadow on the selected item so that, in most cases, selected items don’t jump around and move other elements as you tab through the page. Let me know if it doesn’t work for you. Obviously, the colors are adjustable to taste. You could even create special overrides for certain sites to match color schemes better… I mean, if you were crazy obsessive or something. If you come up with a better all-around color set, let me know!</p><p>By the way, the <a href="http://userstyles.org/styles/33647">Reddit Twitter</a> style is great in Safari! Here’s a <a href="http://img.skitch.com/20100717-mhhsdfh8194rhyg6imtp36byf4.jpg" rel="lightbox[778]">shot of it</a> with custom gleeBox highlights!</p><p>No related posts.</p> ]]></content:encoded> <wfw:commentRss>http://brettterpstra.com/2010/07/17/fixing-gleebox/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>And now… something happier</title><link>http://brettterpstra.com/2010/07/17/now-something-happier/</link> <comments>http://brettterpstra.com/2010/07/17/now-something-happier/#comments</comments> <pubDate>Sat, 17 Jul 2010 14:00:18 +0000</pubDate> <dc:creator>Brett</dc:creator> <category><![CDATA[Blog]]></category> <category><![CDATA[Music]]></category> <category><![CDATA[music]]></category> <category><![CDATA[personal]]></category> <category><![CDATA[recording]]></category> <category><![CDATA[something precious]]></category><guid isPermaLink="false">http://brettterpstra.com/?p=757</guid> <description><![CDATA[Junky Angel, my last post, was a rather dark look into my psyche, which makes this next one, "All Comes Spilling Out," seem happy by comparison. It's a love song, dark though it may be. Kind of like Robert Smith's more stable side doing a cover of "Give My Love to Rose." Maybe. As with the other songs I've posted&#8230;<ul><li><a href="http://brettterpstra.com/2010/06/27/sad-music-for-happy-people-part-1/" rel="bookmark">Sad music for happy people, part 1</a></li><li><a href="http://brettterpstra.com/2010/07/16/sad-songs-part-2-junky-angel/" rel="bookmark">Sad songs, part 2: Junky Angel</a></li><li><a href="http://brettterpstra.com/2009/12/12/designing-draw/" rel="bookmark">Designing Draw</a></li></ul> ]]></description> <content:encoded><![CDATA[<p>Junky Angel, my last post, was a rather dark look into my psyche, which makes this next one, “All Comes Spilling Out,” seem happy by comparison. It’s a love song, dark though it may be. Kind of like Robert Smith’s more stable side doing a cover of <a href="http://www.youtube.com/watch?v=D1LBKTONZ0M&amp;hd=1">“Give My Love to Rose.”</a> Maybe.</p><p>As with the other songs I’ve posted so far, this one was penned long ago, but the recording was only finished recently. In this case, the recording was only <em>started</em> two weeks ago, and I’ve pieced it together in my free time. I went a little “synth” on this one, and used some vocal effects I normally wouldn’t (and probably shouldn’t). All in all, though, I really like the way it came out.</p><object classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' width='470' height='25' id='single-20299' name='single-20299'><param name='movie' value='http://cdn.brettterpstra.com/share/player.swf'><param name='allowfullscreen' value='true'><param name='allowscriptaccess' value='always'><param name='wmode' value='transparent'><param name='flashvars' value='file=http://cdn.brettterpstra.com/share/AllComesSpillingOut.mp3&controlbar=top&skin=http://cdn.brettterpstra.com/share/stormtrooper/stormtrooper.xml'><audio controls preload='auto'><source src='http://cdn.brettterpstra.com/share/AllComesSpillingOut.mp3' type='audio/mp3'><source src='http://cdn.brettterpstra.com/share/AllComesSpillingOut.ogg' type='audio/ogg'></audio></object><p><a href='http://cdn.brettterpstra.com/share/AllComesSpillingOut.mp3'>Download All Comes Spilling Out by Brett Terpstra</a></p><ul><li><a href="http://brettterpstra.com/2010/06/27/sad-music-for-happy-people-part-1/" rel="bookmark">Sad music for happy people, part 1</a></li><li><a href="http://brettterpstra.com/2010/07/16/sad-songs-part-2-junky-angel/" rel="bookmark">Sad songs, part 2: Junky Angel</a></li><li><a href="http://brettterpstra.com/2009/12/12/designing-draw/" rel="bookmark">Designing Draw</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://brettterpstra.com/2010/07/17/now-something-happier/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Sad songs, part 2: Junky Angel</title><link>http://brettterpstra.com/2010/07/16/sad-songs-part-2-junky-angel/</link> <comments>http://brettterpstra.com/2010/07/16/sad-songs-part-2-junky-angel/#comments</comments> <pubDate>Sat, 17 Jul 2010 02:14:25 +0000</pubDate> <dc:creator>Brett</dc:creator> <category><![CDATA[Blog]]></category> <category><![CDATA[Music]]></category> <category><![CDATA[music]]></category> <category><![CDATA[personal]]></category> <category><![CDATA[recording]]></category> <category><![CDATA[something precious]]></category><guid isPermaLink="false">http://brettterpstra.com/?p=754</guid> <description><![CDATA[If not the saddest song I've ever written, "Junky Angel" is at least in the top 5. I'm not always this much of a downer, but I really needed to get this one up here as I start publishing my more recent work, mostly because this song in particular lays a historical and emotional backdrop for the journey and growth&#8230;<ul><li><a href="http://brettterpstra.com/2010/06/27/sad-music-for-happy-people-part-1/" rel="bookmark">Sad music for happy people, part 1</a></li><li><a href="http://brettterpstra.com/2010/07/17/now-something-happier/" rel="bookmark">And now… something happier</a></li><li><a href="http://brettterpstra.com/2009/11/12/songza-lucky-link-service/" rel="bookmark">Songza Lucky Link Service</a></li></ul> ]]></description> <content:encoded><![CDATA[<p><img src="http://cdn.brettterpstra.com/wp-content/uploads/2010/07/junkyangelheaderimage.jpg" alt="junkyangelheaderimage.jpg" border="0" width="650" height="187" class="headerimg" /></p><p>If not the saddest song I’ve ever written, “Junky Angel” is at least in the top 5. I’m not always this much of a downer, but I really needed to get this one up here as I start publishing my more recent work, mostly because this song in particular lays a historical and emotional backdrop for the journey and growth that follows.</p><p>The song is not entirely literal. There isn’t one, singular Junky Angel; rather, it’s an amalgam of friends, lovers and acquaintances in my life who shared a common thread. For those who knew Jessica and might be wondering, this song was written before she died. It’s about her, though, as much as it’s about all of us.</p><p>I don’t need to provide much backstory for this song, it’s a story in and of itself. I don’t think it needs much further explanation at all, aside from noting that it’s pretty long (~8m). Don’t miss the last minute, though, it kind of all comes together at the end. I suppose that <em>is</em> when stories usually come together…</p><p>The lyrics and music were written by me, and I did the vocals, but the guitar <em>and</em> the recording chops on this one belong entirely to my friend Randy Kline (one of the best musicians I’ve ever known). Thanks for checking it out.</p><object classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' width='470' height='25' id='single-20240' name='single-20240'><param name='movie' value='http://cdn.brettterpstra.com/share/player.swf'><param name='allowfullscreen' value='true'><param name='allowscriptaccess' value='always'><param name='wmode' value='transparent'><param name='flashvars' value='file=http://cdn.brettterpstra.com/share/JunkyAngel.mp3&controlbar=top&skin=http://cdn.brettterpstra.com/share/stormtrooper/stormtrooper.xml'><audio controls preload='auto'><source src='http://cdn.brettterpstra.com/share/JunkyAngel.mp3' type='audio/mp3'><source src='http://cdn.brettterpstra.com/share/JunkyAngel.ogg' type='audio/ogg'></audio></object><p><a href='http://cdn.brettterpstra.com/share/JunkyAngel.mp3'>Download Junky Angel by Brett Terpstra</a></p><p>Next one’s a little more upbeat, I promise.</p><ul><li><a href="http://brettterpstra.com/2010/06/27/sad-music-for-happy-people-part-1/" rel="bookmark">Sad music for happy people, part 1</a></li><li><a href="http://brettterpstra.com/2010/07/17/now-something-happier/" rel="bookmark">And now… something happier</a></li><li><a href="http://brettterpstra.com/2009/11/12/songza-lucky-link-service/" rel="bookmark">Songza Lucky Link Service</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://brettterpstra.com/2010/07/16/sad-songs-part-2-junky-angel/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Instapaper Beyond: fix for text style controls</title><link>http://brettterpstra.com/2010/07/16/instapaper-beyond-fix-for-text-style-controls/</link> <comments>http://brettterpstra.com/2010/07/16/instapaper-beyond-fix-for-text-style-controls/#comments</comments> <pubDate>Fri, 16 Jul 2010 09:00:08 +0000</pubDate> <dc:creator>Brett</dc:creator> <category><![CDATA[Blog]]></category> <category><![CDATA[Code]]></category> <category><![CDATA[extension]]></category> <category><![CDATA[instapaper]]></category> <category><![CDATA[instapaper beyond]]></category> <category><![CDATA[safari]]></category> <category><![CDATA[safari 5]]></category><guid isPermaLink="false">http://brettterpstra.com/?p=761</guid> <description><![CDATA[This is a bugfix release of Instapaper Beyond for Safari which brings the version up to 1.8.6. It fixes a few visual glitches, but most importantly it restores the functionality of the text style menu at the top of a read page, allowing you to set and remember the font, size, width and line spacing of your text view. I&#8230;<ul><li><a href="http://brettterpstra.com/2010/07/26/instapaper-beyond-1-8-9/" rel="bookmark">Instapaper Beyond 1.8.9</a></li><li><a href="http://brettterpstra.com/2010/06/09/instapaper-beyond-bugs/" rel="bookmark">Instapaper Beyond Bugs (fixed)</a></li><li><a href="http://brettterpstra.com/2010/07/28/single-keystroke-instapaper-in-google-reader/" rel="bookmark">Single-keystroke Instapaper in Google Reader</a></li></ul> ]]></description> <content:encoded><![CDATA[<p>This is a bugfix release of Instapaper Beyond for Safari which brings the version up to 1.8.6. It fixes a few visual glitches, but most importantly it restores the functionality of the text style menu at the top of a read page, allowing you to set and remember the font, size, width and line spacing of your text view.</p><p>I actually ended up rewriting the existing javascript as a module in Instapaper Beyond, so there's the possibility of easily extending it to handle more options. Background color, more fonts, etc. We'll see how far I get with that. My next order of business is to get it to work with some of the existing userstyles out there, but time has been tight for me when it comes to these side projects. I'll keep you posted.</p><p>If you have Instapaper Beyond installed, it should show up in your updates (or be updated automatically, depending on your settings). If you want to download the extension, please use the link below. For more information on Instapaper Beyond, see the <a href="http://brettterpstra.com/2010/06/09/instapaper-beyond-for-safari/">original post for the Safari Release</a>.</p><p class="download_desc"><a href="http://brettterpstra.com/downloads/InstapaperBeyond.1.8.10.zip" title="Download Instapaper Beyond for Safari 5 (94)"><img src="http://cdn.brettterpstra.com/wp-content/uploads/downloads/thumbnails/2010/06/instapaperbeyond95.png" alt="download image for Instapaper Beyond for Safari 5" width="64" height="64" /></a><a href="http://brettterpstra.com/downloads/InstapaperBeyond.1.8.10.zip" title="Download Instapaper Beyond for Safari 5 (94)">Instapaper Beyond for Safari 5</a> - Instapaper Beyond for Safari adds full keyboard navigation and Ajax loading of text views to Instapaper (http://www.instapaper.com). This extension is for Safari 5 with extensions enabled. <a href="http://brettterpstra.com/2010/06/09/instapaper-beyond-for-safari/">More Info</a></p><ul><li><a href="http://brettterpstra.com/2010/07/26/instapaper-beyond-1-8-9/" rel="bookmark">Instapaper Beyond 1.8.9</a></li><li><a href="http://brettterpstra.com/2010/06/09/instapaper-beyond-bugs/" rel="bookmark">Instapaper Beyond Bugs (fixed)</a></li><li><a href="http://brettterpstra.com/2010/07/28/single-keystroke-instapaper-in-google-reader/" rel="bookmark">Single-keystroke Instapaper in Google Reader</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://brettterpstra.com/2010/07/16/instapaper-beyond-fix-for-text-style-controls/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>EverSave revisited, now with session restore!</title><link>http://brettterpstra.com/2010/07/15/eversave-revisited-now-with-session-restore/</link> <comments>http://brettterpstra.com/2010/07/15/eversave-revisited-now-with-session-restore/#comments</comments> <pubDate>Fri, 16 Jul 2010 01:50:46 +0000</pubDate> <dc:creator>Brett</dc:creator> <category><![CDATA[Blog]]></category> <category><![CDATA[Code]]></category> <category><![CDATA[applescript]]></category> <category><![CDATA[evernote]]></category> <category><![CDATA[safari]]></category> <category><![CDATA[service]]></category> <category><![CDATA[snow leopard]]></category> <category><![CDATA[System Service]]></category><guid isPermaLink="false">http://brettterpstra.com/?p=744</guid> <description><![CDATA[Safari 5 has brought several solutions for managing lists of open tabs, from the simple (like my TabLinks extension) to full session-management capabilities (see the beautiful Sessions extension). However, I've found I still like using my EverSave script in many situations, primarily because it allows me to annotate, tag and sync my important sessions for later retrieval. One thing's been&#8230;<ul><li><a href="http://brettterpstra.com/2010/03/06/saving-safari-browsing-sessions-to-evernote/" rel="bookmark">Saving Safari browsing sessions to Evernote</a></li><li><a href="http://brettterpstra.com/2010/06/18/tablinks-safari-extension/" rel="bookmark">TabLinks Safari Extension</a></li><li><a href="http://brettterpstra.com/2010/06/06/fun-with-marsedit-part-i/" rel="bookmark">Fun with MarsEdit, part I</a></li></ul> ]]></description> <content:encoded><![CDATA[<p>Safari 5 has brought several solutions for managing lists of open tabs, from the simple (like my <a href="http://brettterpstra.com/2010/06/18/tablinks-safari-extension/">TabLinks extension</a>) to full session-management capabilities (see the beautiful <a href="http://dl.dropbox.com/u/8247646/sessions/index.html">Sessions extension</a>). However, I've found I still like using my <a href="http://brettterpstra.com/2010/03/06/saving-safari-browsing-sessions-to-evernote/">EverSave script</a> in many situations, primarily because it allows me to annotate, tag and sync my important sessions for later retrieval. One thing's been bugging me, though, and that's the inability to do a mass restore on a tab list (i.e. open them all at once).</p><p>When I decided to fix this, the first issue was that when EverSave creates the Evernote note, it lets Evernote convert the list from HTML to Rich Text. Once it's stored in Rich Text Format (RTF), manipulating it via any shell language, including AppleScript, becomes quite difficult. It's not impossible, but I quickly decided it wasn't a route I wanted to wander down. Here's what I <strong>did</strong> do... <span id="more-744"></span></p><h3>Saving tabs to Evernote</h3><p>What I ended up doing was modifying what EverSave stored, and including the actual URL in the visible text of the note. It's not the prettiest solution, but it's the only way that this particular system will work. I did my best to minimize the visual presence of the URL using the rudimentary markup that Evernote actually pays attention to. The final product looks like this:</p><p><img src="http://cdn.brettterpstra.com/wp-content/uploads/2010/07/EverSaveRevisedBookmarks.jpg" alt="EverSaveRevisedBookmarks.jpg" border="0" width="650" height="93" /></p><p>The actual layout is still fully controlled by the _template property in the first line, which is the only line that's changed from the original script. I'm posting the whole thing again, with this minor revision, for convenience. With a little bit of HTML (remember to escape your double quotes), you can modify the template to look however you like. Just keep in mind that Evernote strips 90% of markup out when it creates the note from your HTML, so stick with basic tags. See the <a href="http://brettterpstra.com/2010/03/06/saving-safari-browsing-sessions-to-evernote/">original EverSave post</a> for a breakdown of the script.</p><p>Be sure to continue reading after the script to see how we handle the "restore" functionality.</p><div markdown=0><pre><code>
property _template : &quot;&lt;li&gt;&lt;strong&gt;&lt;a href=\&quot;%url\&quot;&gt;&amp;uArr;&lt;/a&gt; %name&lt;/strong&gt; &lt; &lt;small&gt;%url&lt;/small&gt; &gt;&quot;

--search and replace function for template
on snr(tofind, toreplace, TheString)
    set ditd to text item delimiters
    set text item delimiters to tofind
    set textItems to text items of TheString
    set text item delimiters to toreplace
    if (class of TheString is string) then
        set res to textItems as string
    else -- if (class of TheString is Unicode text) then
        set res to textItems as Unicode text
    end if
    set text item delimiters to ditd
    return res
end snr

set prettyDate to do shell script &quot;date &#x27;+%A, %B %d, %Y at %l:%M %p&#x27;&quot;
set theTitle to &quot;Bookmarks &quot; &amp; prettyDate
set urlList to &quot;&lt;ul&gt;&quot;

tell application &quot;Safari&quot;
    set tabList to every tab of front window
    repeat with aTab in tabList
        set aLink to _template
        set aLink to my snr(&quot;%name&quot;, name of aTab, aLink)
        set aLink to my snr(&quot;%url&quot;, URL of aTab, aLink)
        set urlList to urlList &amp; aLink &amp; return
    end repeat
end tell
set urlList to urlList &amp; &quot;&lt;/ul&gt;&quot;

tell application &quot;Evernote&quot;
    set theNote to create note with html urlList title theTitle notebook &quot;Bookmarks&quot;
end tell
</code></pre></div><p><a href="applescript://com.apple.scripteditor?action=new&amp;script=property%20_template%20%3A%20%22%3Cli%3E%3Cstrong%3E%3Ca%20href%3D%5C%22%25url%5C%22%3E%26uArr%3B%3C%2Fa%3E%20%25name%3C%2Fstrong%3E%20%3C%20%3Csmall%3E%25url%3C%2Fsmall%3E%20%3E%22%0A%0A%2D%2Dsearch%20and%20replace%20function%20for%20template%0Aon%20snr%28tofind%2C%20toreplace%2C%20TheString%29%0A%09set%20ditd%20to%20text%20item%20delimiters%0A%09set%20text%20item%20delimiters%20to%20tofind%0A%09set%20textItems%20to%20text%20items%20of%20TheString%0A%09set%20text%20item%20delimiters%20to%20toreplace%0A%09if%20%28class%20of%20TheString%20is%20string%29%20then%0A%09%09set%20res%20to%20textItems%20as%20string%0A%09else%20%2D%2D%20if%20%28class%20of%20TheString%20is%20Unicode%20text%29%20then%0A%09%09set%20res%20to%20textItems%20as%20Unicode%20text%0A%09end%20if%0A%09set%20text%20item%20delimiters%20to%20ditd%0A%09return%20res%0Aend%20snr%0A%0Aset%20prettyDate%20to%20do%20shell%20script%20%22date%20%27%2B%25A%2C%20%25B%20%25d%2C%20%25Y%20at%20%25l%3A%25M%20%25p%27%22%0Aset%20theTitle%20to%20%22Bookmarks%20%22%20%26%20prettyDate%0Aset%20urlList%20to%20%22%3Cul%3E%22%0A%0Atell%20application%20%22Safari%22%0A%09set%20tabList%20to%20every%20tab%20of%20front%20window%0A%09repeat%20with%20aTab%20in%20tabList%0A%09%09set%20aLink%20to%20_template%0A%09%09set%20aLink%20to%20my%20snr%28%22%25name%22%2C%20name%20of%20aTab%2C%20aLink%29%0A%09%09set%20aLink%20to%20my%20snr%28%22%25url%22%2C%20URL%20of%20aTab%2C%20aLink%29%0A%09%09set%20urlList%20to%20urlList%20%26%20aLink%20%26%20return%0A%09end%20repeat%0Aend%20tell%0Aset%20urlList%20to%20urlList%20%26%20%22%3C%2Ful%3E%22%0A%0Atell%20application%20%22Evernote%22%0A%09set%20theNote%20to%20create%20note%20with%20html%20urlList%20title%20theTitle%20notebook%20%22Bookmarks%22%0Aend%20tell%0A">Open this script in Script Editor</a></p><p>I have this script saved as "EverSave.scpt" in my <code>~/Library/Scripts/Applications/Safari</code> folder (create it if you don't have it), and launch it using <a href="http://www.red-sweater.com/fastscripts/">FastScripts</a> with a Command-Shift-S shortcut. Safari doesn't have anything bound to that key-combo, and it's easy to remember (Save As in most programs).</p><h3>Restoring tabs</h3><p>This solution makes a few assumptions, but the script is easily customized to handle any differences in your setup. I went with a System Service (Snow Leopard) for the restore function, primarily because it allows me to act directly on selected text in Evernote. It's a very simple Ruby script that parses the selected text for urls, and then opens any that it finds in sequential order using your default browser. There's a commented out line if you want to always target Safari directly when opening them, which may be useful in some situations. I use <a href="http://www.choosyosx.com/">Choosy</a>, and have a rule that just directs all of these to Safari. If you have Safari set as your default browser, and that's where you want to open your links, this will just work as is.</p><p>To set up the service:</p><ol><li>Open Automator and select "Service" as the new file type.</li><li>On the right hand side, tell it that "Service receives selected" <strong><em>text</em></strong> in <strong><em>Evernote.app</em></strong> (choose Other... and select Evernote).</li><li>Find "Run Shell Script" in the list on the left and drag it into the area on the right.</li><li>Set the Shell dropdown to /usr/bin/ruby</li><li>Insert the following code, and feel free to modify</li><li>Save the result as "EverRestore"</li><li>Assign a shortcut key, if desired, in System Preferences > Keyboard > Keyboard Shortcuts > Services</li></ol><p>Here's the code for the service:</p><div markdown=0><pre><code>
ARGF.each do |f|
    links = f.scan /&lt; (https?:\/\/.*?) &gt;/mi
    # The above scans specifically for the angle brackets in my template. 
    # If you remove those from the output of EverSave, be sure to update
    # the regular expression accordingly.
    if links.empty? then
        exit
    else
        links.each {|link| %x{osascript -e &#x27;open location &quot;#{link[0]}&quot;&#x27;}}
        # links.each {|link| %x{osascript -e &#x27;tell application &quot;Safari&quot; to open location &quot;#{link[0]}&quot;&#x27;}   }
    end
end
</code></pre></div><p>The simple regular expression in line 2 does scan specifically for the angle brackets I used in the new EverSave template. That just relieves some complexity. If you want a regular expression that doesn't require the angle brackets, try replacing line 2 with this:</p><div markdown=0><pre><code>
links = f.scan /(https?:\/\/([^\s&quot;,;]+)\..{2,4}(\/[^\s&quot;,;!]+))/mi
</code></pre></div><p>Once it's saved in Automator, it should be available when you select text in Evernote. If there are visible URLs in the selected text, running this Service will open them in tabs in Safari (or your default browser). You can selectively open certain urls by only selecting the lines that contain the ones you want to open. Non-contiguous selections will require a little text editing, of course.</p><h3>Not as hard as it looks... really.</h3><p>The explanation got a little long, and probably seems unnecessarily complex. The fact is, I can save a Safari browsing session with one key combo, edit, annotate and tag it (if I want to), then restore it later by highlighting and typing a new command combination. It's actually quite convenient, and fairly bulletproof. I'd love to hear how you use it, or what you're doing instead!</p><ul><li><a href="http://brettterpstra.com/2010/03/06/saving-safari-browsing-sessions-to-evernote/" rel="bookmark">Saving Safari browsing sessions to Evernote</a></li><li><a href="http://brettterpstra.com/2010/06/18/tablinks-safari-extension/" rel="bookmark">TabLinks Safari Extension</a></li><li><a href="http://brettterpstra.com/2010/06/06/fun-with-marsedit-part-i/" rel="bookmark">Fun with MarsEdit, part I</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://brettterpstra.com/2010/07/15/eversave-revisited-now-with-session-restore/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>New Safari Extensions give good source</title><link>http://brettterpstra.com/2010/07/09/new-safari-extensions-give-good-source/</link> <comments>http://brettterpstra.com/2010/07/09/new-safari-extensions-give-good-source/#comments</comments> <pubDate>Fri, 09 Jul 2010 20:37:01 +0000</pubDate> <dc:creator>Brett</dc:creator> <category><![CDATA[Blog]]></category> <category><![CDATA[extension]]></category> <category><![CDATA[safari]]></category> <category><![CDATA[safari 5]]></category> <category><![CDATA[source]]></category><guid isPermaLink="false">http://brettterpstra.com/?p=740</guid> <description><![CDATA[A couple of very cool Safari Extensions came down the pipe today, both geared toward web developers and code monkeys. The two of them combined make viewing source in Safari a whole lot better. I love doing web development in Safari, and the Web Inspector pretty well covers the Firebug front for me, but these two extensions are going to&#8230;<ul><li><a href="http://brettterpstra.com/2009/12/31/clippable-updated-to-remove-source-code-line-numbers/" rel="bookmark">Clippable updated to remove source code line numbers</a></li><li><a href="http://brettterpstra.com/2010/07/28/single-keystroke-instapaper-in-google-reader/" rel="bookmark">Single-keystroke Instapaper in Google Reader</a></li><li><a href="http://brettterpstra.com/2010/06/09/instapaper-beyond-for-safari/" rel="bookmark">Instapaper Beyond for Safari!</a></li></ul> ]]></description> <content:encoded><![CDATA[<p><img src="http://cdn.brettterpstra.com/wp-content/uploads/2010/07/sourceviewextension.jpg" alt="sourceviewextension.jpg" border="0" width="234" height="184" class="alignright" />A couple of very cool Safari Extensions came down the pipe today, both geared toward web developers and code monkeys. The two of them combined make viewing source in Safari a whole lot better. I love doing web development in Safari, and the Web Inspector pretty well covers the Firebug front for me, but these two extensions are going to make life much easier.</p><p><a href="http://www.awarepixel.com/safari/bettersource/">BetterSource</a> adds two buttons to your toolbar. The first is for viewing the source code of the current page in a new tab, and with line numbers and syntax highlighting. That in itself is a huge improvement over the native source viewer. The second does the same, but with the rendered source (after DOM changes and other javascript fun), which is basically what you get in the Inspector, but with less fuss and easier copying.</p><p>Entropy provides the second <del datetime="2010-07-10T15:29:20+00:00">extension</del> <ins datetime="2010-07-10T15:29:20+00:00">(actually, a plugin to be placed in ~/Library/Internet Plugins)</ins>, called the <a href="http://www.entropy.ch/software/macosx/xmlviewplugin/">XML View Plugin</a>. It provides a more Firefox-like view of XML data (which Safari fails to display), and also formats JSON data for easy viewing. For anyone who works with API’s and consumes web services, this is a great tool and a welcome addition to Safari.</p><ul><li><a href="http://brettterpstra.com/2009/12/31/clippable-updated-to-remove-source-code-line-numbers/" rel="bookmark">Clippable updated to remove source code line numbers</a></li><li><a href="http://brettterpstra.com/2010/07/28/single-keystroke-instapaper-in-google-reader/" rel="bookmark">Single-keystroke Instapaper in Google Reader</a></li><li><a href="http://brettterpstra.com/2010/06/09/instapaper-beyond-for-safari/" rel="bookmark">Instapaper Beyond for Safari!</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://brettterpstra.com/2010/07/09/new-safari-extensions-give-good-source/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>An ode to Twilight, and a TextMate tip</title><link>http://brettterpstra.com/2010/07/08/an-ode-to-twilight-and-a-textmate-tip/</link> <comments>http://brettterpstra.com/2010/07/08/an-ode-to-twilight-and-a-textmate-tip/#comments</comments> <pubDate>Thu, 08 Jul 2010 10:39:24 +0000</pubDate> <dc:creator>Brett</dc:creator> <category><![CDATA[Blog]]></category> <category><![CDATA[design]]></category> <category><![CDATA[textmate]]></category> <category><![CDATA[themes]]></category><guid isPermaLink="false">http://brettterpstra.com/?p=729</guid> <description><![CDATA[A good friend of mine, Christina Warren, just published a piece on Mashable / Dev &#38; Design about TextMate themes, and it warms my heart to know there are other people as dedicated to this aging text editor as I am. She also made her collection available on GitHub, so check that out if you're in the market for a&#8230;<ul><li><a href="http://brettterpstra.com/2010/06/19/textmate-drag-command-for-base64-encoding-images/" rel="bookmark">TextMate drag command for Base64 encoding images</a></li><li><a href="http://brettterpstra.com/2009/11/12/songza-lucky-link-service/" rel="bookmark">Songza Lucky Link Service</a></li><li><a href="http://brettterpstra.com/2009/11/03/getting-back-into-real-textmate-blogging/" rel="bookmark">Getting back into real TextMate blogging</a></li></ul> ]]></description> <content:encoded><![CDATA[<p><img src="http://cdn.brettterpstra.com/wp-content/uploads/2010/07/twilightpostheader.jpg" alt="" title="twilightpostheader" width="650" height="187" class="alignnone size-full wp-image-730 headerimg" /></p><p><a href="http://cdn.brettterpstra.com/wp-content/uploads/2010/07/twothemes.jpg" rel="lightbox[729]"><img src="http://cdn.brettterpstra.com/wp-content/uploads/2010/07/twothemes-300x234.jpg" alt="" title="twothemes" width="300" height="234" class="alignright size-medium wp-image-731" /></a></p><p>A good friend of mine, <a href="http://www.christinawarren.com/">Christina Warren</a>, just published a piece on <a href="http://mashable.com/dev-design/">Mashable / Dev &amp; Design</a> about <a href="http://mashable.com/2010/07/07/textmate-themes-list/">TextMate themes</a>, and it warms my heart to know there are other people as dedicated to this aging text editor as I am. She also made her <a href="http://github.com/filmgirl/TextMate-Themes/">collection available</a> on GitHub, so check that out if you’re in the market for a new look.</p><p>Despite the lack of any major TextMate update for <em>years</em> now, it’s still my absolute favorite editor. I’ve tried to let go of it. I played with Coda when it came out, and even tried to port some of my favorite TextMate bundles (without much success), but in the end it turned out that I really <em>like</em> having multiple windows taking advantage of my multi-monitor setup. At least when it comes to Terminal (which, thanks to <a href="http://docs.blacktree.com/visor/visor">Visor</a>, is never further away than a double-tap on my control key), FTP programs and my editor. So that was a wash.</p><p><span id="more-729"></span>Espresso came out a while after, and it was (and is) hands-down the sexiest text editor out there. I still use it whenever I can, but I just haven’t found it to be as extensible and comfortable for me as TextMate. I can make TextMate do <em>anything</em>. Seriously, it made the coffee I’m drinking.</p><p>And now, I’d like to pay tribute to one of the original TextMate themes which, in my opinion, is still the greatest theme ever. I’m not alone in this, people espouse its virtues <a href="http://www.google.com/search?client=safari&amp;rls=en&amp;q=textmate+twilight+theme&amp;ie=UTF-8&amp;oe=UTF-8">throughout the search engines</a>, it’s been ported to Espresso, Coda, even Notepad++ on Windows, and you can often find online code rendered in its pleasing pallete. I like light on dark themes in general, and I do, on occasion, like to switch to something high-contrast like Succulent or Vibrant Ink. I even like dark brown backgrounds with mellow foregrounds, sometimes. But I always end up back at Twilight, with its slate background and perfectly contrasted colors. It’s detailed and effective in just about every possible syntax, and I find it perfect for readability. I just wish they hadn’t gone and named a tale of girly vampires after it.</p><p>I <em>will</em> offer a bit of a tip to try to bring this post around to being… interesting? Did you know that you can actually pull off multiple themes in one? If you look at the screenshot in this post, you’ll see two different color schemes, one for my MultiMarkdown files, and one for my PHP code. It’s a customization of the Twilight theme, with custom colors added for Markdown-specific scopes. In the Preferences, under Fonts &amp; Colors, you’ll note that every color definition has a related scope. You can add new scopes and define colors by pressing the plus button on the left.</p><p>You can use a simple TextMate command to find the scope for a particular item. Create a new command in the Bundle Editor, set it to Save Nothing, Input: None, Output: Show as Tool Tip. In the Command field, enter:</p><div markdown=0><pre><code>
echo "$TM_SCOPE" | pbcopy
echo "$TM_SCOPE copied"
</code></pre></div><p>Then assign a key equivalent to it and you can just stick your cursor inside whatever you want to know the scope of, and press your key combination. The scope is in your clipboard now, and you can do what you want with it (like add new color definitions). Enjoy!</p><ul><li><a href="http://brettterpstra.com/2010/06/19/textmate-drag-command-for-base64-encoding-images/" rel="bookmark">TextMate drag command for Base64 encoding images</a></li><li><a href="http://brettterpstra.com/2009/11/12/songza-lucky-link-service/" rel="bookmark">Songza Lucky Link Service</a></li><li><a href="http://brettterpstra.com/2009/11/03/getting-back-into-real-textmate-blogging/" rel="bookmark">Getting back into real TextMate blogging</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://brettterpstra.com/2010/07/08/an-ode-to-twilight-and-a-textmate-tip/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Better WordPress security through comment filters</title><link>http://brettterpstra.com/2010/07/01/better-wordpress-security-through-comment-filters/</link> <comments>http://brettterpstra.com/2010/07/01/better-wordpress-security-through-comment-filters/#comments</comments> <pubDate>Thu, 01 Jul 2010 11:57:22 +0000</pubDate> <dc:creator>Brett</dc:creator> <category><![CDATA[Blog]]></category> <category><![CDATA[Code]]></category> <category><![CDATA[comments]]></category> <category><![CDATA[functions.php]]></category> <category><![CDATA[hacks]]></category> <category><![CDATA[Wordpress]]></category><guid isPermaLink="false">http://brettterpstra.com/?p=727</guid> <description><![CDATA[I have an admin username (it's not admin) which I use to manage my WordPress blog, and an editor user with which I write posts and leave comments. Sometimes, though, I get confused, lazy or both, and end up leaving comments as my admin user. This rather defeats the purpose of using a non-default admin username, which is generally done&#8230;<ul><li><a href="http://brettterpstra.com/2010/04/17/adding-a-tinymce-button/" rel="bookmark">Adding a TinyMCE button to WordPress</a></li><li><a href="http://brettterpstra.com/2010/07/24/notes-on-cleaning-up-the-mediatemple-hack-johnnya/" rel="bookmark">Notes on cleaning up the MediaTemple hack (JohnnyA)</a></li><li><a href="http://brettterpstra.com/2010/05/26/auto-lightboxing-image-links/" rel="bookmark">Auto-lightboxing image links</a></li></ul> ]]></description> <content:encoded><![CDATA[<p><img src="http://cdn.brettterpstra.com/wp-content/uploads/2010/07/wordpresssecuritycommentfiltersheader.jpg" alt="Wordpress security comment filters header image" border="0" width="650" height="187" class="headerimg" /></p><p><img src="http://cdn.brettterpstra.com/wp-content/uploads/2010/07/combolock200.jpg" alt="Combination Lock" border="0" width="200" height="200" class="alignright" />I have an admin username (it's not <em>admin</em>) which I use to manage my WordPress blog, and an editor user with which I write posts and leave comments. Sometimes, though, I get confused, lazy or both, and end up leaving comments as my admin user. This rather defeats the purpose of using a non-default admin username, which is generally done for security purposes (if they can't guess the admin's username, it makes it that much harder to hack the admin account).</p><p>More out of laziness than anything else (we can call it efficiency, right?), I dropped the functions below into my <code>functions.php</code> file. They filter my admin username out of any comments I leave. WordPress also adds the user's name in a class for the list item of the comment, so I needed to remove that as well. If you're in a similar situation, feel free to grab the code and place it in your own theme's <code>functions.php</code> file, replacing the adminuser and regularuser placeholders with your own admin and editor usernames. The comment class code is modified from a hack <a href="http://www.wprecipes.com/wordpress-hack-remove-admin-name-in-comments-class">found at WPRecipes</a>.</p><div markdown=0><pre><code>
// change the class that wordpress assigns to the comment
function change_comment_author_class( $classes ) {
    foreach( $classes as $key => $class ) {
        // change adminuser to your admin username
        if(strstr($class, "comment-author-adminuser")) {
            // change regularuser to the user you comment with
            $classes[$key] = 'comment-author-regularuser';
        }
    }
    return $classes;
}
// substitute a user name for the admin name
function change_comment_author($author)
{
    // change this to the admin username
    if(strstr($author,"adminuser")) { 
        // change this to the name of the user you comment with
        return "regularuser"; 
    }
    return $author;
}
// apply the filters
add_filter( 'comment_class' , 'change_comment_author_class' );
add_filter( 'get_comment_author' , 'change_comment_author' );
</code></pre></div><ul><li><a href="http://brettterpstra.com/2010/04/17/adding-a-tinymce-button/" rel="bookmark">Adding a TinyMCE button to WordPress</a></li><li><a href="http://brettterpstra.com/2010/07/24/notes-on-cleaning-up-the-mediatemple-hack-johnnya/" rel="bookmark">Notes on cleaning up the MediaTemple hack (JohnnyA)</a></li><li><a href="http://brettterpstra.com/2010/05/26/auto-lightboxing-image-links/" rel="bookmark">Auto-lightboxing image links</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://brettterpstra.com/2010/07/01/better-wordpress-security-through-comment-filters/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Sad music for happy people, part 1</title><link>http://brettterpstra.com/2010/06/27/sad-music-for-happy-people-part-1/</link> <comments>http://brettterpstra.com/2010/06/27/sad-music-for-happy-people-part-1/#comments</comments> <pubDate>Sun, 27 Jun 2010 18:58:33 +0000</pubDate> <dc:creator>Brett</dc:creator> <category><![CDATA[Blog]]></category> <category><![CDATA[Music]]></category> <category><![CDATA[music]]></category> <category><![CDATA[personal]]></category> <category><![CDATA[recording]]></category> <category><![CDATA[something precious]]></category><guid isPermaLink="false">http://brettterpstra.com/?p=713</guid> <description><![CDATA[While I normally keep my blogging pretty technical, I've decided to start sharing some of my more personal projects, just to see what happens. I've been (slowly) working on a few songs for a very low-budget EP, and this is the first one I've "finished," per my own standards, anyway. It's not exactly polished; between a lack of studio equipment&#8230;<ul><li><a href="http://brettterpstra.com/2010/07/16/sad-songs-part-2-junky-angel/" rel="bookmark">Sad songs, part 2: Junky Angel</a></li><li><a href="http://brettterpstra.com/2010/07/17/now-something-happier/" rel="bookmark">And now… something happier</a></li><li><a href="http://brettterpstra.com/2009/11/12/songza-lucky-link-service/" rel="bookmark">Songza Lucky Link Service</a></li></ul> ]]></description> <content:encoded><![CDATA[<p>While I normally keep my blogging pretty technical, I’ve decided to start sharing some of my more personal projects, just to see what happens. I’ve been (slowly) working on a few songs for a very low-budget EP, and this is the first one I’ve “finished,” per my own standards, anyway.</p><p>It’s not exactly polished; between a lack of studio equipment and a personality that enjoys imperfections, I don’t tend to end up with anything that anyone could consider professional, at least in the musical arena. That’s ok with me, these aren’t meant to make me a million dollars, just to be an outlet for some things that would otherwise drag me down. <span id="more-713"></span></p><h3>Backstory</h3><p>Here’s where it gets really personal, and if you’d rather just try out my Safari extensions and coding experiments, you should probably just hit that “Code” button in the menu at the top…</p><p>I wrote the lyrics to this song almost ten years ago in St. Paul, Minnesota, sitting on a squeaky bed with a very, very thin mattress, at what turned out, thankfully, to be my last stint in rehab. I had lost pretty much everything in my life that I cared about, and I had no idea where I was going next. I only knew that something had to be different this time. My roommate, a 300 lb. gorilla of a gangbanger named Angel, read them (with my permission) and told me that he sincerely felt I should hold on to them, that they would have more meaning to me when I could look back at them as a memory and not as a present horror. He was right.</p><p>About a year after I was released from that treatment center, I picked up a cheap acoustic guitar and started playing again. I found a yellow, college-ruled notepad in the remainder of my belongings, and the words to this song were on the second page. The chords just happened, and it became a song I played often. It was another 7 years before I started working on a recording of it. What I’m posting here is the third permutation of this song, but it maintains the same roots it had on the day I first strummed out this rather dark chord progression for it.</p><p>The words themselves are no longer relevant to my life, but they serve as a strong reminder to me of where I’ve been and where I need to keep heading. My wife complains that I never play any happy songs, for which I am apologetic. Music has always served as my outlet for the bad feelings, the fears and the sorrow. I’m in a happy place now, and I enjoy happy music, but I’m not at a point where I know how to make it, or really feel it when I play it. I cannot bounce around like Raffi, but I’m hoping to get closer to that mindset in the not-too-distant future.</p><p>Without further ado, I offer “Alone Again.”</p><object classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' width='470' height='25' id='single-64869' name='single-64869'><param name='movie' value='http://cdn.brettterpstra.com/share/player.swf'><param name='allowfullscreen' value='true'><param name='allowscriptaccess' value='always'><param name='wmode' value='transparent'><param name='flashvars' value='file=http://cdn.brettterpstra.com/share/AloneAgain.mp3&controlbar=top&skin=http://cdn.brettterpstra.com/share/stormtrooper/stormtrooper.xml'><audio controls preload='auto'><source src='http://cdn.brettterpstra.com/share/AloneAgain.mp3' type='audio/mp3'><source src='http://cdn.brettterpstra.com/share/AloneAgain.ogg' type='audio/ogg'></audio></object><p><a href='http://cdn.brettterpstra.com/share/AloneAgain.mp3'>Download Alone Again by Brett Terpstra</a></p><ul><li><a href="http://brettterpstra.com/2010/07/16/sad-songs-part-2-junky-angel/" rel="bookmark">Sad songs, part 2: Junky Angel</a></li><li><a href="http://brettterpstra.com/2010/07/17/now-something-happier/" rel="bookmark">And now… something happier</a></li><li><a href="http://brettterpstra.com/2009/11/12/songza-lucky-link-service/" rel="bookmark">Songza Lucky Link Service</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://brettterpstra.com/2010/06/27/sad-music-for-happy-people-part-1/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Minor TabLinks update</title><link>http://brettterpstra.com/2010/06/26/minor-tablinks-update/</link> <comments>http://brettterpstra.com/2010/06/26/minor-tablinks-update/#comments</comments> <pubDate>Sat, 26 Jun 2010 14:01:17 +0000</pubDate> <dc:creator>Brett</dc:creator> <category><![CDATA[Blog]]></category> <category><![CDATA[Code]]></category> <category><![CDATA[extension]]></category> <category><![CDATA[safari]]></category> <category><![CDATA[safari 5]]></category> <category><![CDATA[tablinks]]></category><guid isPermaLink="false">http://brettterpstra.com/?p=708</guid> <description><![CDATA[I just posted version 1.3 of TabLinks. It doesn't fix all of the things I eventually want to fix, but it does do some rudimentary entity encoding that allows you to actually use HTML tags in the templates. I had said that &#60;a href="%u"&#62;%t&#60;/a&#62; would work as a template, but it didn't. Now it does. The automatic update is functioning,&#8230;<ul><li><a href="http://brettterpstra.com/2010/07/25/instapaper-beyond-1-8-7/" rel="bookmark">Instapaper Beyond 1.8.7</a></li><li><a href="http://brettterpstra.com/2010/07/16/instapaper-beyond-fix-for-text-style-controls/" rel="bookmark">Instapaper Beyond: fix for text style controls</a></li><li><a href="http://brettterpstra.com/2010/06/09/instapaper-beyond-for-safari/" rel="bookmark">Instapaper Beyond for Safari!</a></li></ul> ]]></description> <content:encoded><![CDATA[<p><a href="http://cdn.brettterpstra.com/wp-content/uploads/2010/06/TabLinksWithHTML.jpg" rel="lightbox[708]"><img src="http://cdn.brettterpstra.com/wp-content/uploads/2010/06/TabLinksWithHTML-150x150.jpg" alt="TabLinks With HTML Template" title="TabLinks With HTML Template" width="150" height="150" class="alignright size-thumbnail wp-image-709" /></a>I just posted version 1.3 of <a href="http://brettterpstra.com/2010/06/18/tablinks-safari-extension/">TabLinks</a>. It doesn't fix all of the things I eventually want to fix, but it <em>does</em> do some rudimentary entity encoding that allows you to actually use HTML tags in the templates. I had said that <code>&lt;a href="%u"&gt;%t&lt;/a&gt;</code> would work as a template, but it didn't. Now it does.</p><p>The automatic update is functioning, so anyone with TabLinks already installed should see it show up in their updates, or just update automatically if you have that option enabled. This version should show up as 1.3. If you're looking for the initial install, you can find it below.</p><p class="download_desc"><a href="http://brettterpstra.com/downloads/TabLinks1.3.zip" title="Download TabLinks Safari Extension (381)"><img src="http://cdn.brettterpstra.com/wp-content/uploads/downloads/thumbnails/2010/06/Icon.png" alt="download image for TabLinks Safari Extension" width="64" height="64" /></a><a href="http://brettterpstra.com/downloads/TabLinks1.3.zip" title="Download TabLinks Safari Extension (381)">TabLinks Safari Extension</a> - TabLinks gathers all of the link information from every open tab and presents them for copying based on a user-defined template. <a href="http://brettterpstra.com/2010/06/18/tablinks-safari-extension/">More Info</a></p><ul><li><a href="http://brettterpstra.com/2010/07/25/instapaper-beyond-1-8-7/" rel="bookmark">Instapaper Beyond 1.8.7</a></li><li><a href="http://brettterpstra.com/2010/07/16/instapaper-beyond-fix-for-text-style-controls/" rel="bookmark">Instapaper Beyond: fix for text style controls</a></li><li><a href="http://brettterpstra.com/2010/06/09/instapaper-beyond-for-safari/" rel="bookmark">Instapaper Beyond for Safari!</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://brettterpstra.com/2010/06/26/minor-tablinks-update/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk
Page Caching using xcache
Database Caching 135/413 queries in 3.466 seconds using xcache
Object Caching 2221/4170 objects using xcache
Content Delivery Network via Amazon Web Services: CloudFront: Amazon Web Services: S3: cdn.brettterpstra.com

Served from: brettterpstra.com @ 2010-08-01 03:26:19 -->