<?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>Curtis Tasker</title>
	<atom:link href="http://curtistasker.com/feed" rel="self" type="application/rss+xml" />
	<link>http://curtistasker.com</link>
	<description>&#099;&#117;&#114;&#116;&#105;&#115; (at) &#099;&#117;&#114;&#116;&#105;&#115;&#116;&#097;&#115;&#107;&#101;&#114; (dot) &#099;&#111;&#109;</description>
	<lastBuildDate>Fri, 18 May 2012 21:50:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Video Scrubbing in iTunes</title>
		<link>http://curtistasker.com/blog/programming/794/video-scrubbing-in-itunes</link>
		<comments>http://curtistasker.com/blog/programming/794/video-scrubbing-in-itunes#comments</comments>
		<pubDate>Fri, 24 Feb 2012 23:03:33 +0000</pubDate>
		<dc:creator>Curtis</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[applescript]]></category>
		<category><![CDATA[automator]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[itunes]]></category>
		<category><![CDATA[itunes u]]></category>
		<category><![CDATA[osx]]></category>
		<category><![CDATA[shortcut]]></category>

		<guid isPermaLink="false">http://curtistasker.com/?p=794</guid>
		<description><![CDATA[For years, I&#8217;ve used college course websites to help supplement my learning. If you poke around, you&#8217;ll find a lot of sites with lecture notes, code samples, and assignments all posted online. You don&#8217;t need to enroll in the course, or even attend college, to benefit from these little nuggets of learning. Sometimes it beats [...]]]></description>
			<content:encoded><![CDATA[<p>For years, I&#8217;ve used college course websites to help supplement my learning.  If you poke around, you&#8217;ll find a lot of sites with lecture notes, code samples, and assignments all posted online.  You don&#8217;t need to enroll in the course, or even attend college, to benefit from these little nuggets of learning.  Sometimes it beats bashing your head against a new topic, without any sort of plan.</p>
<h2>iTunes U</h2>
<p>My only real problem with this method has been lack of access to the lecture itself. <a href="http://www.apple.com/education/itunes-u/">iTunes U</a> has been around for a while, with many schools offering access to videos and notes classroom lectures.  Its been gaining steady traction, to the point where I&#8217;m pretty sure you could do an entire undergraduate degree online.<br />
<span id="more-794"></span><br />
There&#8217;s even an <a href="http://itunes.apple.com/us/app/itunes-u/id490217893">app for iOS</a> that allows you to access all the content on your mobile device alongside your computer.  Speirs has a great <a href="http://speirs.org/blog/2012/2/19/driving-the-classroom-with-itunes-u.html">article discussing iTunes U</a>, if you&#8217;re really interested in all the technical details.  </p>
<p>Currently I&#8217;ve got one monitor up playing the lecture, with slides up on my iPhone (here&#8217;s one thing I&#8217;d love an iPad for), and a browser and programming tools up on the main monitor.  Granted, this whole solution isn&#8217;t as beneficial as personal access to a professor to answer your questions and make sure you&#8217;re learning the material.  Then again, its a heck of a lot cheaper.  </p>
<p>On the whole, the experience has been very reminiscent of sitting in a lecture with my laptop open.  Including the unfortunate point where I get distracted for a few moments and suddenly snap my attention back to the professor, trying to remember what he just said.  Unlike an actual lecture, I can quickly rewind so I don&#8217;t miss anything.</p>
<h2>Video Scrubbing</h2>
<p>I&#8217;ve been watching a lot of videos with <a href="http://en.wikipedia.org/wiki/Plex_(software)">Plex</a> lately, and I&#8217;ve gotten hooked on its fast forward and rewind keyboard shortcuts.  Namely, the right arrow skips forward 30 seconds, the left arrow rewinds 15 seconds, the up arrow skips forward 10 minutes, and the down arrow rewinds 10 minutes.  Much to my dismay, I hit a giant brick wall when trying to do something similar in iTunes.  It just doesn&#8217;t have any built in functionality for this.  Scrubbing using the progress bar and mouse is doable, but nowhere near as fast, and requires careful attention.</p>
<div id="attachment_856" class="wp-caption alignright" style="width: 285px"><img src="http://curtistasker.com/blog/wp-content/uploads/2012/02/itunes_media_kind.png" alt="" title="itunes_media_kind" width="275" height="132" class="size-full wp-image-856" /><p class="wp-caption-text">Awkward half solution</p></div>
<p>If I view the content on my iOS device, there is a dedicated rewind 30s button.  This works great, but watching hours of lectures on my iPhone is a bit much.  I tried using <a href="http://en.wikipedia.org/wiki/AirPlay">AirPlay</a> to stream it to the TV, and it worked out ok.  That said, I don&#8217;t really want to be in front of the TV all the time, so this is out.  In iTunes, if you change the Media Kind for each of the video files from iTunes U to Podcast, suddenly the 30s skip backwards button appears on the computer.  So I&#8217;ve got skip on the computer, but in a severely limiting form.  I can do better.</p>
<h2>Creating a Solution</h2>
<p>My final solution to the problem was of course, programmatic.  I started out by opening <a href="http://en.wikipedia.org/wiki/Automator">Automator</a> and creating 4 new Services: Forward 30s, Rewind 15s, Forward 10m, Rewind 5m.  Each Service will only work with iTunes, and takes no input.  The script for each service differs only in the first line.  The script simply changes the player position of the current track based on the skipAmount value.<br />
<div id="attachment_827" class="wp-caption alignnone" style="width: 499px"><img src="http://curtistasker.com/blog/wp-content/uploads/2012/02/automator_example1.png" alt="" title="automator_example" width="489" height="369" class="size-full wp-image-827" /><p class="wp-caption-text">Change the skipAmount property to suit your needs.</p></div></p>
<p>Then, hit up System Preferences > Keyboard > Keyboard Shortcuts and bind the arrow keys to these services.<br />
<div id="attachment_828" class="wp-caption alignnone" style="width: 678px"><img src="http://curtistasker.com/blog/wp-content/uploads/2012/02/keybinding.png" alt="" title="keybinding" width="668" height="598" class="size-full wp-image-828" /><p class="wp-caption-text">Bind the arrow keys to the new Services</p></div></p>
<p>While my initial script worked fine, I made a few refinements.  First, I check for a current track, which gets rid of an error message if you press a hotkey when there is no track playing.  Second, I added checks for skipping before the start or past the end of the track, which was causing the player to exit when this happened.</p>
<h2>Final Product</h2>
<div id="attachment_826" class="wp-caption alignnone" style="width: 599px"><img src="http://curtistasker.com/blog/wp-content/uploads/2012/02/automator_example2.png" alt="" title="automator_example2" width="589" height="368" class="size-full wp-image-826" /><p class="wp-caption-text">The ¬ means that a long line is being broken up into multiple lines.</p></div>
<p>And here&#8217;s the same code for cut and paste:</p>
<pre>property skipAmount : -300
on run {input, parameters}
tell application "iTunes"
if current track exists then
if (player position + skipAmount) is greater than (start of current track) ¬
and player position is less than ((finish of current track) - skipAmount) then
set player position to (player position + skipAmount)
end if
end if
end tell
return input
end run</pre>
<p>Now I&#8217;m able to scrub through lectures with ease.  One can always hope that Apple will bake in this kind of functionality, but I doubt it.  Until then, I&#8217;ll make due with clever hacks.</p>
]]></content:encoded>
			<wfw:commentRss>http://curtistasker.com/blog/programming/794/video-scrubbing-in-itunes/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Killing Your Apps in iOS</title>
		<link>http://curtistasker.com/blog/technology/889/killing-your-apps-in-ios</link>
		<comments>http://curtistasker.com/blog/technology/889/killing-your-apps-in-ios#comments</comments>
		<pubDate>Mon, 09 Jan 2012 19:35:31 +0000</pubDate>
		<dc:creator>Curtis</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[apps]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://curtistasker.com/?p=889</guid>
		<description><![CDATA[I was poking around an Apple Store when an elderly gentleman came in and complained that his iPhone was frozen. The screen was locked to a running application, and pressing the home button did nothing. I hung nearby, curious as to the official tech support procedure for this type of issue. This wasn&#8217;t a genius [...]]]></description>
			<content:encoded><![CDATA[<p><div id="attachment_935" class="wp-caption alignnone" style="width: 521px"><img src="http://curtistasker.com/blog/wp-content/uploads/2012/01/overheard_tweet.png" alt="" title="overheard_tweet" width="511" height="381" class="size-full wp-image-935" /><p class="wp-caption-text">It all started with this</p></div><br />
I was poking around an Apple Store when an elderly gentleman came in and complained that his iPhone was frozen.  The screen was locked to a running application, and pressing the home button did nothing.  I hung nearby, curious as to the official tech support procedure for this type of issue.  This wasn&#8217;t a <a href="http://en.wikipedia.org/wiki/Genius_Bar">genius bar</a> appointment, it was simply a sales associate helping someone who walked up to them at the front of the store.<br />
<span id="more-889"></span></p>
<h2>Micromanging your Phone</h2>
<p>When queried, the gentleman said the phone hadn&#8217;t gotten wet, and it was fully charged, and he was not aware of how to reboot the device.  The sales associate plugged the phone into a dock cable (apparently it was very low on power), and the phone responded just fine.  He then proceeded to, without any further investigation, tell the gentleman the problem.  &#8220;You&#8217;ve got too many apps running.  You have to double tap the home button to bring up the task manager, then tap and hold on an app to make them wiggle, then tap to kill them.  You&#8217;ve got to kill your apps when you&#8217;re not using them, or the system will get full and freeze up.&#8221;</p>
<p>I was very shocked to hear this, because I actually <a href="https://developer.apple.com/library/ios/#DOCUMENTATION/iPhone/Conceptual/iPhoneOSProgrammingGuide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html">know</a> how <a href="http://en.wikipedia.org/wiki/IOS">iOS</a> manages its memory and processing power.  Clearly this sales associate didn&#8217;t have a clue.  I tweeted and walked away amused, only to have a very long twitter conversation with a friend about this issue.  Apparently he had been told the same thing, but by a <a href="http://en.wikipedia.org/wiki/Genius_Bar">genius</a>.  To make matters worse, he had shared the knowledge of how to kill tasks (which by design is pretty difficult to stumble upon) with a friend of his.  This friend now runs an app, and when he&#8217;s done, immediately kills it.  Every single app, every single time.  I was just flabbergasted.</p>
<p>I mean, I kill apps myself, but only in one specific instance: if the app has frozen and its quicker to kill it and restart than wait for iOS to decide its had enough and perform the kill itself.  The thing is, I know what I&#8217;m doing.  I would never tell a normal user how to kill their apps, unless I also included a hefty educational speech about when and why you do this.  In everyday usage, nobody should have to do it, period.  Even those rare instances should be infrequent<a href="http://en.wikipedia.org/wiki/Android_(operating_system)"></a> enough that the average user doesn&#8217;t encounter it.  Having a user forced to manage what apps are running strikes me as straying far into Android territory.  If iOS is failing so badly at memory management that the everyday user is forced to manage running processes, why not add in an activity monitor app so I can see memory and CPU usage while I&#8217;m at it.</p>
<h2>The Problem is Getting Attention</h2>
<p>I spent some time poking around the dark corners of the internet, and there were plenty of confused normals spouting this &#8220;kill your apps manually&#8221; nonsense.  To make matters worse, the people who knew better came off as condescending when trying to correct the normals, and every thread I found just devolved into name calling.  I didn&#8217;t feel up to wading into the mess, so I made sure to educate my relatives, then let sleeping dogs lie.  Fast forward a few months, and the problem is getting a little attention, at least in certain circles.</p>
<p>It started with <a href="http://speirs.org/blog/2012/1/2/misconceptions-about-ios-multitasking.html">Speirs</a>, got picked up by <a href="http://daringfireball.net/2012/01/ios_multitasking">Gruber</a>.  Then Speirs went and <a href="http://vimeo.com/34660348">documented the whole process</a> on video, which in my mind should lay to rest this issue, at least for anybody willing to watch the video in its entirety.</p>
<h2>Who is To Blame?</h2>
<p>The thing is that really bothers me is, how exactly are <abbr title="People who are not technically inclined">&#8220;normals&#8221;</abbr> getting educated about the app kill functionality?  I&#8217;m not sure, but my best guess is word of mouth many times removed, eventually traced back to uninformed apple employees or know it all children.</p>
<p>Clearly Apple needs to include the app kill method as part of their employee training, and make sure their employees know what it does and does not accomplish.  That would at least stop the misinformation at the source.</p>
<p>I know Apple would be happy if most users never knew about the app kill functionality, and perhaps its best that way.  However, in order to clean up the mess made by their well intentioned employees, consumers need to be educated on the facts, at least on a case by case basis.  People who overuse the app kill functionality are wasting massive amounts of their time, and this needs to be stopped.</p>
]]></content:encoded>
			<wfw:commentRss>http://curtistasker.com/blog/technology/889/killing-your-apps-in-ios/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Games, Resolutions, and Multiple Monitors</title>
		<link>http://curtistasker.com/blog/gaming/892/games-resolutions-and-multiple-monitors</link>
		<comments>http://curtistasker.com/blog/gaming/892/games-resolutions-and-multiple-monitors#comments</comments>
		<pubDate>Thu, 03 Nov 2011 17:30:46 +0000</pubDate>
		<dc:creator>Curtis</dc:creator>
				<category><![CDATA[Gaming]]></category>
		<category><![CDATA[bootcamp]]></category>
		<category><![CDATA[lua]]></category>
		<category><![CDATA[monitor]]></category>
		<category><![CDATA[osx]]></category>
		<category><![CDATA[resolution]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://curtistasker.com/?p=892</guid>
		<description><![CDATA[I spend way too much time dealing with resolution oddities in games. Nothing is quite as maddening as when a game decides to launch at a ridiculously low resolution, in full screen. The side effects vary, but usually include either shoves every window I had open to my secondary monitor (shrinking them in the process), [...]]]></description>
			<content:encoded><![CDATA[<p>I spend way too much time dealing with <a href="http://en.wikipedia.org/wiki/Display_resolution">resolution</a> oddities in games.  Nothing is quite as maddening as when a game decides to launch at a ridiculously low resolution, in full screen.  The side effects vary, but usually include either shoves every window I had open to my secondary monitor (shrinking them in the process), or just shrinking them to fit the new tiny resolution on the main monitor.  Granted the screen resizing issues only happen on the first launch of the game (assuming you immediately set the resolution properly in game), but that&#8217;s no excuse for not fixing it.  Plenty of games start just fine at your native resolution, and don&#8217;t screw with your windows.<br />
<span id="more-892"></span><br />
There&#8217;s a whole host of resolution related problems that crop up in gaming.  My personal annoyances are: slow/impossible multitasking between other applications with cmd/alt+tab, screen edge scrolling issues with multiple monitors, and the blanking of secondary monitors.  Most of the issues I encounter arise from the use of multiple monitors, and I&#8217;m honestly a little surprised.  The types of people creating games are exactly the types of people who should have multiple monitors.  How can they not be bothered to make a game run properly on their development machines?</p>
<p>This isn&#8217;t necessarily a platform specific set of problems, as I&#8217;ve seen each issue in both <a href="http://en.wikipedia.org/wiki/Windows">Windows</a> and <a href="http://en.wikipedia.org/wiki/Osx">OSX</a>.  When a game is multiplatform, however, it&#8217;s almost a certainty that the Windows version handles multiple monitors better than the OSX version.</p>
<p>Honestly I&#8217;ve only seen one company, <em>ever</em>, get multiple monitor support right.  And as a bonus, they do it right on both Windows and OSX, and they have a full screen windowed mode in one of their games that is just absolutely <em>perfect</em>.  I&#8217;ll give you one guess which <a href="http://blizzard.com">company</a> that is.</p>
<h2>Civilization V</h2>
<p>I decided to kill a little time the other day, and I didn&#8217;t feel like <a href="http://en.wikipedia.org/wiki/Boot_Camp_(software)">booting to Windows</a> to play <a href="http://en.wikipedia.org/wiki/Civ5">Civ5</a> in all its glory.  The OSX version usually suffices, and performance is ok as long as I keep the map size reasonable.  While attempting to play, I quickly remembered why I hate playing Civ5 on OSX:  resolution issues.</p>
<p>I have multiple monitors, and I want the second monitor usable at all times.  That&#8217;s kind of the point of having multiple monitors.  If I play Civ5 in fullscreen mode, it will blank my secondary monitor, so this is out.  Fullscreen mode games also tend to be very slow to react to switching between the game and other applications, so I usually play in windowed mode.  Native monitor resolution windowed mode has a slight performance hit over fullscreen mode, but its acceptable.</p>
<h2>Problem</h2>
<p><div id="attachment_965" class="wp-caption alignnone" style="width: 603px"><img src="http://curtistasker.com/blog/wp-content/uploads/2011/11/civ5_hidden_toppanel.png" alt="" title="civ5_hidden_toppanel" width="593" height="80" class="size-full wp-image-965" /><p class="wp-caption-text">Before</p></div>Native screen resolution (2560&#215;1440) in windowed mode takes up every inch of space possible (as it should), <em>except</em> for the OSX Menu Bar at the top of the screen.  The difficulty here is that it actually renders the game at max monitor resolution, and clips off the top 20 pixels of the game by hiding them behind the OSX Menu Bar.</p>
<p>This wouldn&#8217;t necessarily be a problem in many games, but Civ5 has a TopPanel which is an in-game menu bar, offering access to critical gameplay information.  Much of this information you just <em>cannot</em> access anywhere else.</p>
<p><div id="attachment_966" class="wp-caption alignright" style="width: 215px"><img src="http://curtistasker.com/blog/wp-content/uploads/2011/11/civ5_greyed_out.png" alt="" title="civ5_greyed_out" width="205" height="245" class="size-full wp-image-966" /><p class="wp-caption-text">No toggles for you!</p></div>In the launch edition of the OSX client, there was a hotkey (cmd+enter) which would allow you to switch between fullscreen and windowed modes on the fly.  This did take a few seconds to happen, and was a real waste of time over the course of a game, but at least allowed access to the hidden information.  In all patched versions of the client, this option has been greyed out and unusable.</p>
<p>So basically my options are:</p>
<ul>
<li>Reboot to Windows and play fullscreen with proper multiple monitor support.</li>
<li>Play fullscreen in OSX with one monitor blanked out.</li>
<li>Play fullscreen windowed in OSX without access to critical game information.</li>
<li>Play windowed in OSX at the second highest resolution (1920&#215;1200).</li>
</ul>
<p>The latter option seemed to be my only real choice, and it would give me a small performance boost as a side benefit.  I do dislike the loss of game immersion by playing in less than fullscreen.  It also irks me to waste all that monitor space.</p>
<h2>Solution</h2>
<p><div id="attachment_967" class="wp-caption alignnone" style="width: 600px"><img src="http://curtistasker.com/blog/wp-content/uploads/2011/11/civ5_toppanel.png" alt="" title="civ5_toppanel" width="590" height="97" class="size-full wp-image-967" /><p class="wp-caption-text">After</p></div>The ideal solution would be to chop 20 pixels off of the Y resolution of the game, and render it at 2560&#215;1420 just below the menubar.  Its usually not a difficult solution, and I&#8217;ve done similar things before in other games.  I poked around online for an hour, and came up with nothing.  There were plenty of people <a href="http://www.civfanatics.com/">complaining</a> about the issue, and lots of ideas that never panned out.  Everybody seems fixated on the <code>~/Library/Application Support/Sid Meier's Civilization 5/GraphicsSettingsDX9.ini</code> file.  Changing the resolution here does nothing unless the numbers match the in-game resolution options.</p>
<p>Since the UI is moddable through <a href="http://en.wikipedia.org/wiki/Lua_(programming_language)">Lua</a>, I figured it might be possible to write my own mod to change the position of the TopPanel.  I poked around a bit trying to do this, to no avail.  I managed to add some custom content to the TopPanel (by editing the <code>~/Library/Application Support/Steam/SteamApps/common/sid meier's civilization v/assets/UI/InGame/TopPanel.lua</code> file), but I couldn&#8217;t figure out how to change the bar&#8217;s position.  Luckily, while fooling around with this, I stumbled upon a real solution.</p>
<p>In the file <code>~/Library/Application Support/Steam/SteamApps/common/sid meier's civilization v/Assets/UI/Options/OptionsMenu.lua</code> there&#8217;s a little variable at the top of the file called <code>m_WindowResList</code>.  Apparently it stores some default resolutions for the game.  I found some code later in the file adds your current monitor resolution to the collection (mine wasn&#8217;t there by default) &#8220;just in case they&#8217;re running something weird&#8221;, as the developer&#8217;s comments informed me.  I simply added a new resolution to this list, and removed 40 pixels from the Y resolution.</p>
<p><div id="attachment_968" class="wp-caption alignright" style="width: 424px"><img src="http://curtistasker.com/blog/wp-content/uploads/2011/11/civ5_resolution_selector.png" alt="" title="civ5_resolution_selector" width="414" height="271" class="size-full wp-image-968" /><p class="wp-caption-text">Select the new resolution</p></div>Why remove 40 pixels rather than 20?  The game window is anchored to the center of the screen, and I couldn&#8217;t find a way to anchor it to the bottom instead.  So for every 2 pixels you subtract from the Y resolution, it effectively moves the TopPanel down 1 pixel.  The end result of this is that the TopPanel is fully visible just below the OSX Menu Bar, and you lose 20 pixels of the game window at the bottom of your screen.  </p>
<p>&nbsp;<br />
Once this is done, you can simply launch the game and select the new resolution from the Options screen.  While this solution isn&#8217;t perfect, I declare it close enough.</p>
]]></content:encoded>
			<wfw:commentRss>http://curtistasker.com/blog/gaming/892/games-resolutions-and-multiple-monitors/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Strings in Java</title>
		<link>http://curtistasker.com/blog/programming/494/strings-in-java</link>
		<comments>http://curtistasker.com/blog/programming/494/strings-in-java#comments</comments>
		<pubDate>Fri, 30 Sep 2011 04:41:23 +0000</pubDate>
		<dc:creator>Curtis</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[refactoring]]></category>
		<category><![CDATA[string]]></category>
		<category><![CDATA[stringbuffer]]></category>

		<guid isPermaLink="false">http://curtistasker.com/?p=494</guid>
		<description><![CDATA[At my first big programming job, we were building web applications using Servlets and EJBs. This is before Java web application frameworks had been invented, Servlets and EJBs were still in their infancy, and JSP were not even on the map. Everybody was feeling out how to use the technology properly, and a lot of [...]]]></description>
			<content:encoded><![CDATA[<p>At my first big programming job, we were building web applications using <a href="http://en.wikipedia.org/wiki/Java_Servlet">Servlets</a> and <a href="http://en.wikipedia.org/wiki/Enterprise_JavaBean">EJBs</a>. This is before Java <a href="http://en.wikipedia.org/wiki/Web_application_framework">web application frameworks</a> had been invented, Servlets and EJBs were still in their infancy, and <a href="http://en.wikipedia.org/wiki/JavaServer_Pages">JSP</a> were not even on the map. Everybody was feeling out how to use the technology properly, and a lot of mistakes were made along the way.<br />
<span id="more-494"></span><br />
The first thing I was tasked with was helping the existing team to improve performance in an application that had just been launched. Looking back, I cringe at how badly this application was written, but at the time it was the best the team could come up with. While there were many problems with this app, performance was the showstopper: loading a page took an average of 60 seconds.</p>
<p>The app was pulling large amounts of data from an <a href="http://en.wikipedia.org/wiki/Oracle_Database">Oracle database</a> using <a href="http://en.wikipedia.org/wiki/Stored_procedure">stored procedures</a>, and building presentation html right there in the servlet layer.  We couldn&#8217;t afford software to properly analyze the app, so we wrote a quick timer and started doing simple start/stop events throughout the loading of particularly slow pages, tracking the time it took to perform specific actions.</p>
<p>We slowly figured out that no one part of the app was being egregiously slow; The whole thing was just uniformly slow.  Obviously loops through <a href="http://en.wikipedia.org/wiki/Resultset">resultsets</a> were taking up the bulk of the time, but inside the loops each statement performed at the same equal snail&#8217;s pace.</p>
<p>Searching for help on the web didn&#8217;t help.  I&#8217;m not sure if my <a href="http://www.urbandictionary.com/define.php?term=google-fu">google-fu</a> was just in its infancy back then, or if there really was no information out about this problem.  Eventually I started writing simple test servlets and tried to do the same task in different ways, hoping to flush out the piece of code that was causing the slowdown.  As it turned out, I stumbled upon the solution in Sun&#8217;s <a href="http://download.oracle.com/javase/6/docs/api/">Javadocs</a>.</p>
<h2>The Problem</h2>
<p>Apparently in Java, <a href="http://download.oracle.com/javase/6/docs/api/java/lang/String.html">Strings</a> are <a href="http://en.wikipedia.org/wiki/Immutable_object">immutable</a> (they cannot be altered after they are created).  The idea is like so: Lets say you&#8217;re going to display an invoice to a customer.  You have their name in a string, pulled from the customer table.  You read in the invoice, and you have their name again, pulled twice from the billing and shipping information.  Now you have three string <a href="http://en.wikipedia.org/wiki/Variable_(computer_science)">variables</a> all storing the same static bit of information in memory.  Rather than waste 3x the space, Java simply points all three to the same chunk of memory.</p>
<p>Now you might think this would be a bad thing;  What if the customer changes their billing address name?  Because strings cannot be changed after they are created, every time you think you&#8217;re changing a string, you&#8217;re actually creating a brand new string and pointing your variable to the new string.  In the event that the old string has no more variables pointing to it, it will be <a href="http://en.wikipedia.org/wiki/Garbage_collection_(computer_science)">garbage collecte</a>d.</p>
<p>Understanding how this whole mess affected this application has to do with how we were building our html.  You see, building a page went something like this:</p>
<pre>
...
String body = new String();
body += &quot;&lt;table border='1'&gt;&lt;/table&gt;&quot;;
body += &quot;&lt;tr&gt;&quot;;
body += &quot;    &lt;th&gt;Column 1&lt;/th&gt;&quot;;
body += &quot;    &lt;th&gt;Column 2&lt;/th&gt;&quot;;
body += &quot;&lt;/tr&gt;&quot;;

while( rs.next() )
{
    body += &quot;&lt;tr&gt;&quot;;
    body += &quot;    &lt;td&gt;&quot;+rs.getString(1)+&quot;&lt;/td&gt;&quot;;
    body += &quot;    &lt;td&gt;&quot;+rs.getFloat(2)+&quot;&lt;/td&gt;&quot;;
    body += &quot;&lt;/tr&gt;&quot;;
}
body += &quot;&lt;/table&gt;&quot;;
...
return header + body + footer;
</pre>
<p>That&#8217;s right, every line of html that was being created for every page was done by string <a href="http://en.wikipedia.org/wiki/Concatenation">concatenation</a>.  With strings, when <code>body += "html here"</code> is used, it creates a new string containing the concatenated contents of both strings, then points <code>body</code> to the new string.  This means that the old string <code>body</code> pointed to, along with the html that was concatenated with it, are now floating around waiting for garbage collection.  Each and every line of html created using this method has the side effect of creating 1 or more new string variables.  Object creation is expensive in Java, and the garbage collection for these excess strings was nearly as expensive.</p>
<h2>The Solution</h2>
<p>The solution was actually pretty trivial, but time consuming to implement.  Java has a <a href="http://download.oracle.com/javase/6/docs/api/java/lang/StringBuffer.html">StringBuffer</a> class which is specifically designed for this type of problem.  It stores the same information as a String, but it a mutable fashion.  This allows us to alter its contents without the hassle of object creation and garbage collection.  The fixed code looked like so:</p>
<pre>
...
StringBuffer body = new StringBuffer();
body.append( &quot;&lt;table border='1'&gt;&lt;/table&gt;&quot; );
body.append( &quot;&lt;tr&gt;&quot; );
body.append( &quot;    &lt;th&gt;Column 1&lt;/th&gt;&quot; );
body.append( &quot;    &lt;th&gt;Column 2&lt;/th&gt;&quot; );
body.append( &quot;&lt;/tr&gt;&quot; );

while( rs.next() )
{
    body.append( &quot;&lt;tr&gt;&quot; );
    body.append( &quot;    &lt;td&gt;&quot;).append( rs.getString(1) ).append( &quot;&lt;/td&gt;&quot; );
    body.append( &quot;    &lt;td&gt;&quot;).append( rs.getFloat(2)  ).append( &quot;&lt;/td&gt;&quot; );
    body.append( &quot;&lt;/tr&gt;&quot; );
}
body.append( &quot;&lt;/table&gt;&quot; );
...
return (new StringBuffer( header.toString() )
                 .append( body )
                 .append( footer )
       ).toString();
</pre>
<p>For anybody doing Java web apps now, you just won&#8217;t run into this problem as often. JSPs allow for much more readable presentation code, and you rarely run around appending to your html like this. That said, the misuse of strings in Java is in no way limited to this example here. The problem crops up more than you&#8217;d imagine, with experienced and inexperienced developers alike.</p>
<h2>New Job, Same Problem</h2>
<p>At my second big computer job, I was surrounded by some very smart people.  They had been using Java for years, and were currently maintaining a huge, high performance web app using JSPs, Servlets, and EJBs. They were handling exclusively backend work, and passing off finished code webmonkeys to design <a href="http://en.wikipedia.org/wiki/User_interface">UIs</a> around.  I remember sitting in my little cubicle, pouring over code rapidly, trying to get a grasp of how the application worked. I overheard three of the senior developers discussing a problem a few cubicles over. Much to my surprise, they were having performance problems with a new piece of code that sounded suspiciously like it was an immutable string issue.</p>
<p>I listened for a minute or two, then swaggered over to solve their problem.  What took days to figure out at my first job was related and then fixed in mere minutes here, and the performance issue disappeared.  I&#8217;m always reminded of this moment, and how even experienced developers don&#8217;t know everything.  There&#8217;s always something more to learn.</p>
]]></content:encoded>
			<wfw:commentRss>http://curtistasker.com/blog/programming/494/strings-in-java/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Remote Access</title>
		<link>http://curtistasker.com/blog/technology/604/remote-access</link>
		<comments>http://curtistasker.com/blog/technology/604/remote-access#comments</comments>
		<pubDate>Sat, 27 Aug 2011 20:43:35 +0000</pubDate>
		<dc:creator>Curtis</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[dropbox]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[sugarsync]]></category>
		<category><![CDATA[sync]]></category>

		<guid isPermaLink="false">http://curtistasker.com/?p=604</guid>
		<description><![CDATA[Since high school, I&#8217;ve been dealing with the same old problem: How do I access my files when I&#8217;m not at my home computer? I started out with external storage; I used a 5.25&#8243; floppy disk for a year, and quickly upgraded to a 3.5&#8243; floppy. It held all of my documents and programming files, [...]]]></description>
			<content:encoded><![CDATA[<p>Since high school, I&#8217;ve been dealing with the same old problem: How do I access my files when I&#8217;m not at my home computer?  I started out with external storage; I used a 5.25&#8243; <a href="http://en.wikipedia.org/wiki/Floppy_disk">floppy disk</a> for a year, and quickly upgraded to a 3.5&#8243; floppy.  It held all of my documents and programming files, all meticulously organized.  The disk itself has long since failed, but the files it contained are still with me to this day (though I&#8217;ve long since converted them to modern <a href="http://en.wikipedia.org/wiki/File_format">file formats</a>).  I moved to a laptop for some time as my primary machine, and backups were few and far between.  I&#8217;ve only suffered data loss once:  a <a href="http://en.wikipedia.org/wiki/RAID#Standard_levels">RAID 0</a> crashed and 3 months of files were lost.  I still rue that day, as I knew full well the RAID was failing, but I was too busy to run a backup and investigate further.<br />
<span id="more-604"></span><br />
In college I kept some of my files on the school servers, and used a <a href="http://www.ftpedit.com/">text editor</a> which could edit files over ftp to edit them remotely.  I had a brief stint using web based file storage, where the provider offered a way to mount the storage to a drive letter in Windows.  The service didn&#8217;t last more than a few years, but it definitely gave me a taste of things to come.  I&#8217;ve run custom <a href="http://en.wikipedia.org/wiki/Rsync">rsync</a> scripts, <a href="http://en.wikipedia.org/wiki/Secure_shell">SSH</a> servers mounted as drives, and owned a variety of external media.  Buying a Mac made the whole problem slightly more annoying, as I had to maintain cross platform compatibility.</p>
<h2>The Rise of the Syncing Services</h2>
<p>Eventually I stumbled upon a service called <a href="http://en.wikipedia.org/wiki/Sugarsync">SugarSync</a>, and I fell in love.  I was able to specify certain folders, and these folders would automagically stay in sync across multiple computers and multiple OSs, without effort.  I even had access to the files through a website.</p>
<p>I set up a client with SugarSync to mirror their documents to several business computers, and used a script to make backup copies of critical files, which are then backed up to the web via SugarSync.  Coupled with its file versioning support, it has on more than one occasion allowed me to recover files and undo drastic mistakes that would have otherwise crippled the business.</p>
<p>I ended up getting into an invite-only service called <a href="http://en.wikipedia.org/wiki/Dropbox_(service)">Dropbox</a> not long before it went public, and to date it is my primary solution to the remote access problem.  I still maintain SSH server and <a href="http://en.wikipedia.org/wiki/Remote_desktop">remote desktop</a> access to my desktop, but I almost never need to bother.</p>
<p>My roommate recently had her notebook stolen, and was rather devastated.  She&#8217;s starting a new business, and one of the lost files was the most recent copy of her business plan.  She asked me to <a href="http://en.wikipedia.org/wiki/Optical_character_recognition">OCR</a> an older copy she had lying around, and I was a little confused;  I had set her up with Dropbox several months prior, and I don&#8217;t think she fully understood the benefits.  Sure enough, all of her files were fine, safely mirrored to her old desktop and the web.</p>
<p>While these services are highly useful, they have yet to hit the mainstream.  Both <a href="http://en.wikipedia.org/wiki/Windows_Live_Skydrive">Microsoft</a> and <a href="http://en.wikipedia.org/wiki/Icloud">Apple</a> have their own competing versions, and moving forward we&#8217;re going to see this kind of sync become a key part of the computing experience.  Already you can log into your online photo gallery or email account from anywhere and have access to all your data.  Eventually all of your files will be stored in the <a href="http://en.wikipedia.org/wiki/Cloud_computing">cloud</a>, and will be automatically accessed by any device you own.  You&#8217;ll be able to log onto a friend&#8217;s computer, and all of your files, applications, and settings will be the same as if you were using your own computer.</p>
<p>I don&#8217;t see computers all becoming dumb terminals like the early days of computing, but the effect will be much the same.  It will no longer matter if we&#8217;re using a tablet, phone, desktop, or laptop.  It will no longer matter where we are, or who owns the device we&#8217;re using.  We&#8217;ll no longer be constrained to any particular device or location to accomplish our tasks.</p>
]]></content:encoded>
			<wfw:commentRss>http://curtistasker.com/blog/technology/604/remote-access/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Touchpad Scrolling</title>
		<link>http://curtistasker.com/blog/technology/612/touchpad-scrolling</link>
		<comments>http://curtistasker.com/blog/technology/612/touchpad-scrolling#comments</comments>
		<pubDate>Wed, 20 Jul 2011 17:33:21 +0000</pubDate>
		<dc:creator>Curtis</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[osx]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[touchpad]]></category>
		<category><![CDATA[ux]]></category>

		<guid isPermaLink="false">http://curtistasker.com/?p=612</guid>
		<description><![CDATA[I&#8217;ve only switched to a touchpad within the last few years, and only then when faced with the clear superiority of Apple&#8217;s product. I&#8217;ve grown so enamored of multitouch gestures that I even have a touchpad for the desktop, sitting alongside my mouse, which I use mostly for browsing. There are programs out there that [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve only switched to a touchpad within the last few years, and only then when faced with the clear superiority of Apple&#8217;s <a href="http://en.wikipedia.org/wiki/Magic_Trackpad">product</a>.  I&#8217;ve grown so enamored of multitouch gestures that I even have a touchpad for the desktop, sitting alongside my mouse, which I use mostly for browsing.</p>
<p>There are programs out there that allow you to customize your systemwide gestures, but I&#8217;ve always been kind of a purist when it comes to input solutions.  I&#8217;d rather learn to use what &#8216;the masses&#8217; use, so I&#8217;m equally at home on someone&#8217;s stock install as I am on my highly customized one.  Recent self discovery has made me rethink my position a bit, but I digress.<br />
<span id="more-612"></span></p>
<h2>Up or Down</h2>
<p>With the release of <a href="http://en.wikipedia.org/wiki/Osx_lion">OSX Lion</a>, millions of people are quickly discovering that scrolling with the trackpad doesn&#8217;t work like it used to.  In fact, it works opposite.  Years of scrolling with the touchpad, in multiple OSs, has taught us that dragging your fingers top to bottom should scroll the page down, and dragging your fingers bottom to top should scroll the page up.  Amusingly, on all <a href="http://en.wikipedia.org/wiki/List_of_iOS_devices">iOS devices</a>, the opposite is true.  With a touchscreen, you grab and drag the page with your finger.  Thus, dragging bottom to top scrolls the page down by pushing the content up and off the screen.  Apple has decided to force this scrolling paradigm on its OSX users, and I can&#8217;t say I disagree with them.  Honestly it takes all of a day to get used to the new direction; Your brain is quick to adapt.</p>
<p>The exception, of course, is if you have to use another computer: An older copy of OSX, or a Windows machine where the scroll directions are now &#8216;backwards&#8217;.  Your brain can compensate with a little difficulty, but its confusing to go back and forth every day.  The simple solution is to swap your Mac to match the Windows default, but this causes problems moving forward.  If you spend a lot of time working on different Macs, you&#8217;re going to spend a lot of time being annoyed with the scroll direction.  You can of course change the Windows scroll direction to match the Mac default, but you&#8217;re going to have the same problems if you end up working on a lot of different Windows machines.  The best solution (other than waiting for Microsoft to mirror Apple&#8217;s change, or waiting for Apple to capitulate and change back), is to just pick what world you spend most of your time in, and set your scroll directions to give you the least amount of change.</p>
<p>My roommate had this very problem, but was unable to change his Windows scroll direction.  His mouse driver didn&#8217;t support it, and he lacked the registry access necessary to flip the proper bit.  I wrote a fix for him in my head a few seconds after he complained about it:</p>
<pre>WheelDown::WheelUp
WheelUp::WheelDown</pre>
<p>  Running this script in <a href="http://www.autohotkey.com/">AutoHotkey</a> reverses the scroll direction for almost all cases (ignoring a few games that grab low level mouse input).</p>
<h2>Backwards or Forwards</h2>
<p>In addition to the scroll direction changes, OSX also changed the default forward/backwards direction for webpages in Safari.  Before, three fingers right to left would go backwards a page, and three fingers left to right would move you forward a page.  Now, two fingers right to left moves you forward a page (by pushing the old page offscreen), and two fingers left to right moves you backwards a page.  My big problem here is with Apple&#8217;s <a href="http://en.wikipedia.org/wiki/Finder_(software)">Finder</a> application.  Two finger forward/backwards does not work, and instead scrolls around the content in the window.  Honestly, this is exactly what I want and would expect, but it breaks rank with Safari.</p>
<h2>Two Fingers or Three</h2>
<p>To make matters even more confusing, there is an option to enable the old 3 finger scrolling gesture, which then allows Finder and Safari to both support 3 finger scrolling in the same direction: the old one.  Apparently 3 finger scrolling ignores the systemwide scroll reversal option.  There&#8217;s also a 2 and 3 finger option that allows you to use both gestures, but it ends up being an ungainly mess.  You end up scrolling backwards with 3 fingers, forwards with 2.</p>
<h2>Consistency</h2>
<p>Honestly I&#8217;m not sure what they were thinking here.  Consistency is one thing I value highly, and this is anything but.  For now, I&#8217;ve accepted reverse up/down scrolling, but I&#8217;ve kept backwards left/right 3 finger scrolling.  A mess to be sure, but its the smallest mess I could make.</p>
]]></content:encoded>
			<wfw:commentRss>http://curtistasker.com/blog/technology/612/touchpad-scrolling/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ye Olde Command Line</title>
		<link>http://curtistasker.com/blog/technology/607/ye-olde-command-line</link>
		<comments>http://curtistasker.com/blog/technology/607/ye-olde-command-line#comments</comments>
		<pubDate>Thu, 12 May 2011 18:29:52 +0000</pubDate>
		<dc:creator>Curtis</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[command line]]></category>
		<category><![CDATA[scp]]></category>
		<category><![CDATA[vi]]></category>

		<guid isPermaLink="false">http://curtistasker.com/?p=607</guid>
		<description><![CDATA[I set up someone&#8217;s new Macbook Pro recently, and I ended up having to do a little command line work to move some files over from my desktop, and do a little vi editing. The funny thing is, I was unable to actually use the terminal on this brand new install of OSX until I [...]]]></description>
			<content:encoded><![CDATA[<p>I set up someone&#8217;s new Macbook Pro recently, and I ended up having to do a little command line work to <a href="http://en.wikipedia.org/wiki/Secure_copy">move</a> some files over from my desktop, and do a little <a href="http://en.wikipedia.org/wiki/Vi">vi</a> editing.  The funny thing is, I was unable to actually use the terminal on this brand new install of OSX until I had customized the terminal.<br />
<span id="more-607"></span><br />
I&#8217;m perfectly fine with white on black for most things: coding, writing documents, reading webpages.  When it comes to executing terminal commands, it just doesn&#8217;t feel right unless its a black background with white or green text.  I know its silly, but its what I grew up on.  It just feels awkward without that familiar interface.</p>
<p>The default <a href="http://en.wikipedia.org/wiki/Apple_Terminal">OSX Terminal</a> application is a great little program, with plenty of features.  It even comes with a selection of themes to style the look and feel of the app, and years ago I may have just changed to the Pro theme and been done with it.  However, I&#8217;ve long since developed my own terminal theme, very similar to the <a href="http://blog.toddwerth.com/entries/6">IR_Black</a> theme.  I have some mild look and feel differences, and I&#8217;ve altered the keybindings to more closely mirror what happens in the rest of the OS.  In addition to this, I also copy over a .bash_profile with some useful settings (prompt colors, aliases for ls variants), a .vimrc file with some minor tweaks, and a .inputrc file to help with keybindings.  In particular, standardized keybindings for home/end and pgup/pgdown are necessary to preserve my sanity at the command line (yay laptop keyboards).</p>
<p>Only after this ritual is complete can I really settle down and get any sort of command line work done.  Some day in the distant future, perhaps someone else besides me will launch the terminal on this laptop and say a little prayer of thanks.</p>
]]></content:encoded>
			<wfw:commentRss>http://curtistasker.com/blog/technology/607/ye-olde-command-line/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>News Overload</title>
		<link>http://curtistasker.com/blog/technology/731/news-overload</link>
		<comments>http://curtistasker.com/blog/technology/731/news-overload#comments</comments>
		<pubDate>Tue, 15 Mar 2011 19:36:41 +0000</pubDate>
		<dc:creator>Curtis</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[feed]]></category>
		<category><![CDATA[filtering]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[pipes]]></category>
		<category><![CDATA[rss]]></category>
		<category><![CDATA[yahoo]]></category>

		<guid isPermaLink="false">http://curtistasker.com/?p=731</guid>
		<description><![CDATA[Several years past, my morning ritual involved launching a web browser and loading a dozen or more web pages. First as separate windows, and eventually as tabs, when they became part and parcel of the browser. Sites like cnn.com, slashdog.org were my launching point for broad swathes of news. I poured over arstechnica.com and anandtech.com [...]]]></description>
			<content:encoded><![CDATA[<p>Several years past, my morning ritual involved launching a web browser and loading a dozen or more web pages.  First as separate windows, and eventually as <a href="http://en.wikipedia.org/wiki/Tab_(GUI)">tabs</a>, when they became part and parcel of the browser.  Sites like <a href="http://cnn.com">cnn.com</a>, slashdog.org were my launching point for broad swathes of news.  I poured over <a href="http://arstechnica.com">arstechnica.com</a> and <a href="http://anandtech.com">anandtech.com</a> for more in-depth information to sate my technothirst.  Enthusiast sites like <a href="http://nvnews.net">nvnews.net</a> and <a href="http://tomshardware.com">tomshardware.com</a> kept me up to date on the minutia of gaming hardware.<br />
<span id="more-731"></span><br />
I would spend my morning catching up on news from all of these sites and more.  As the day wore on, I would periodically hit refresh on each of these pages, then swap to a new page, hit refresh, and continue.  By the time I got through the list, the content on the first page would be done loading, and I could start reading.  I would consume a site until I hit an overlap point from my previous viewing, then continue on to the next.  God forbid I skipped reading a high volume site for a day, I&#8217;d have too much to catch up on.  Taking a break from this ritual was not an option; eventually I&#8217;d have to accept the fact that I missed some news, and start anew at today&#8217;s news.<br />
<!--more--></p>
<h2>An Easier Way</h2>
<p>I&#8217;m still a bit crazy about missing news, but thankfully <a href="http://en.wikipedia.org/wiki/Rss">RSS</a> has at least made this process manageable.  It amuses me to no end that the average user has no idea that this technology exists, despite the fact that it is used so widely.  That said, not every page puts out a <a href="http://en.wikipedia.org/wiki/Web_feed">feed</a>.  Sometimes they do publish one, but its riddled with information you don&#8217;t want:  Occasional advertisements, rants about off-topic issues, and other information that doesn&#8217;t interest you.  While stumbling my way to a solution for this problem, I discovered <a href="http://pipes.yahoo.com/">Yahoo Pipes</a>.</p>
<p>Imagine if you could take a source of information, anything from a webpage to a <a href="http://en.wikipedia.org/wiki/Comma-separated_values">CSV</a> file, and filter out what you don&#8217;t want.  The resulting data can then be merged with another data source, and then republished as a single new data source.  With Yahoo Pipes, you can do exactly this.</p>
<p><a href="http://www.tor.com/">Tor</a> doesn&#8217;t offer feeds for its authors, so I my first pipe took their master feed and filtered by the author I wanted.  I created a pipe to filtered out a friend&#8217;s blog posts from a collaborative site.  I made a pipe to watch the price change feed for <a href="http://appshopper.com">appshopper.com</a>, and filter out only applications I was interested in buying.  I even made a pipe that takes a calendar and strips out events I don&#8217;t want to attend.  You can take most any published data as input, transform and combine it at will, and output it in whatever format you desire.  It isn&#8217;t exactly the most user friendly of tools, but its got enough power to make up for that.</p>
<h2>Overlap</h2>
<p>There&#8217;s a serious amount of overlap in my feeds;  I&#8217;ll read about news from its original source, from someone reporting on that source, from someone reporting twice removed, and then it&#8217;ll hit mainstream media, and I&#8217;ll read about it 10x over the next few weeks as it gets repeated.  I like knowing about bleeding edge technology news before the mainstream media does.  Often I&#8217;ll hear about things days or weeks before they hit CNN.  Often rather than follow a pundit and read the news he puts out, I&#8217;ll go straight to his sources and follow them instead.  I have to constantly prune my sources, lest I become overwhelmed. Do I want to read information from sources that are among the first to report it, or would I rathe read a more critical analysis from a site that reports thirdhand a few days later?  Often the best choice still involves some level of overlap.</p>
<h2>Filtering</h2>
<p>I&#8217;ve tried to create pipes to handle this overlap, but its not easy.  Assuming two sites publish a story and use the same title, the stories are easily matched and one can be discarded.  This rarely happens.  Even using lots of metadata (author, source link, rough date/time, categories), its a beast of a matching problem and difficult to do consistently.  Also, there&#8217;s the problem of comments, which offer actual useful information from time to time.  If you discard one article, you lose the comments of all the other duplicate articles.</p>
<p>Clearly this issue needs to be handled at a higher level than pipes was intended to solve.  The underlying data to solve this problem is there.  Most reputable sites link back to their sources.  Brute force comparison of articles can easily establish if they&#8217;re discussing the same topic.  I want an engine that sees all news from all sources, and groups them together by common threads.  For critical topics, an actual person could serve to quickly make links between related stories.</p>
<p>As a story develops, additional sources and comments can be added to the aggregate news source.  If I read about a product, and it is mentioned a dozen times over the course of the next month, with each source offering no new information, I shouldn&#8217;t have to see any of the duplicate articles.  If these new sources offer actual new information, or a decent amount of analysis, I&#8217;d like the information to be merged with the original story, and the story marked as <em>updated with new information</em>.  No matter what site you visit to learn about a news story, you should be able to easily link to the master source of all news on that story.</p>
<p>Someday soon I hope to have my overlap handled automatically and seamlessly.  Perhaps then I&#8217;ll free up a few more minutes each day to do something besides reading.  Then again, perhaps I&#8217;ll just broaden my horizons and start reading new topics.</p>
<h2>Update 9/2011</h2>
<p>A tool far less powerful than pipes, but quite interesting, has cropped up recently: <a href="http://ifttt.com/">ifft.com</a>.  You can use <a href="http://ifttt.com/recipes">recipes</a> which allow you to have triggered actions happen on pre-specified events.  It has only a small overlap with pipes in terms of functional uses, but you can do some interesting things with it.  Feeds can be created from every post you star in <a href="http://en.wikipedia.org/wiki/Twitter">Twitter</a>.  <a href="http://en.wikipedia.org/wiki/Instagram">Instagram</a> pictures can auto save to your <a href="http://en.wikipedia.org/wiki/Dropbox_(service)">Dropbox</a>.  Checking in on <a href="http://en.wikipedia.org/wiki/Foursquare">Foursquare</a> can trigger a <a href="http://en.wikipedia.org/wiki/Facebook">Facebook</a> status change.  A text message can be sent if the weather report says its going to rain.  If someone tags you in a picture in Facebook, you can have the picture emailed to your mom.  I&#8217;ve found ways to use this service to complement pipes, by creating quick and easy to use data sources that pipes can then work with.</p>
]]></content:encoded>
			<wfw:commentRss>http://curtistasker.com/blog/technology/731/news-overload/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Don&#8217;t Steal My Focus</title>
		<link>http://curtistasker.com/blog/technology/565/dont-steal-my-focus</link>
		<comments>http://curtistasker.com/blog/technology/565/dont-steal-my-focus#comments</comments>
		<pubDate>Tue, 04 Jan 2011 00:03:54 +0000</pubDate>
		<dc:creator>Curtis</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[focus]]></category>
		<category><![CDATA[multitasking]]></category>
		<category><![CDATA[os]]></category>

		<guid isPermaLink="false">http://curtistasker.com/?p=565</guid>
		<description><![CDATA[I&#8217;m not the first to complain about this, but I won&#8217;t be the last. There is no worse sin for an OS than to let an application take control of my focus. Nothing is quite like the exquisite torment of being in the middle of giving your program commands, and nothing happens. Perhaps another program [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m <a href="http://www.codinghorror.com/blog/2007/12/please-dont-steal-my-focus.html">not</a> the <a href="http://radio-weblogs.com/0103807/stories/2002/06/07/dontStealMyFocus.html">first</a> to <a href="http://wiki.clarolab.com/people/emilio.moretti/blog/2010/12/10/please-dont-steal-my-focus">complain</a> about <a href="http://kinrowan.net/blog/2005/01/31/dont-steal-my-focus/">this</a>, but I <a href="http://useful-sounds.de/pivot/entry.php?id=102">won&#8217;t</a> be the <a href="http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2008/07/24/10634.aspx">last</a>.</p>
<p>There is no worse sin for an OS than to let an application take control of my <a href="http://en.wikipedia.org/wiki/Focus_(computing)">focus</a>.  Nothing is quite like the exquisite torment of being in the middle of giving your program commands, and nothing happens.  Perhaps another program popped up in a second window when I wasn&#8217;t looking and took focus from me.  Sometimes I launch a program, then switch to a web browser and start navigating, only to have my focus is lost to a <a href="http://en.wikipedia.org/wiki/Modal_window">modal</a> popup.  I switch back to the web browser, continue navigating, and the <em>same</em> app opens another modal popup, breaking up my browsing experience yet again.<br />
<span id="more-565"></span><br />
Seriously, I&#8217;m trying to get some work done here.  I swapped away from your slow, bloated program, because it takes 20 seconds to fully launch.  I don&#8217;t want to sit there wasting time while you finish.  Just do your load, and don&#8217;t steal my focus, is that so hard?</p>
<p>Besides being horribly annoying, its been known to cause serious problems for people.  My personal low involved me setting my away message in my messaging program to my banking website password for two days.  Currently most of the onus of this problem is on the application developer, but I think that&#8217;s just passing the buck.  OS developers need to make a stand and put in place protections to prevent this sort of thing.</p>
]]></content:encoded>
			<wfw:commentRss>http://curtistasker.com/blog/technology/565/dont-steal-my-focus/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iTunes Frustrates Me</title>
		<link>http://curtistasker.com/blog/technology/579/itunes-frustrates-me</link>
		<comments>http://curtistasker.com/blog/technology/579/itunes-frustrates-me#comments</comments>
		<pubDate>Sun, 12 Dec 2010 00:26:46 +0000</pubDate>
		<dc:creator>Curtis</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[itunes]]></category>
		<category><![CDATA[multitasking]]></category>
		<category><![CDATA[updates]]></category>
		<category><![CDATA[ux]]></category>

		<guid isPermaLink="false">http://curtistasker.com/?p=579</guid>
		<description><![CDATA[So I fire up iTunes, and see there are 17 updates for my iOS apps. I click on the Apps sidebar option, then click on the little 17 Updates Available link in the lower right. I then click the Download All Free Updates button in the upper right. The Enter Password box pops up. I [...]]]></description>
			<content:encoded><![CDATA[<p>So I fire up <a href="http://en.wikipedia.org/wiki/Itunes">iTunes</a>, and see there are 17 updates for my <a href="http://en.wikipedia.org/wiki/IOS">iOS</a> apps.  I click on the Apps sidebar option, then click on the little <code>17 Updates Available</code> link in the lower right.  I then click the <code>Download All Free Updates</code> button in the upper right.  The <code>Enter Password</code> box pops up.  I enter it, then switch back to browsing the web while it updates.  I switch back to iTunes a few minutes later greeted with a <code>Some of these apps contain age restricted material, please click OK to continue</code> box.  I click OK, switch back to browsing.<br />
<span id="more-579"></span><br />
I switch back later, <code>You've used iTunes on another computer recently, please verify your billing information.</code>  I enter my credit card&#8217;s CSD, click OK, task out.  Back again later, it wants my CSD <strong>and</strong> my salutation.  I enter them, task out.  Task back, nothing is happening.  I click <code>Download All Free Updates</code> again.  I&#8217;m now back at step 1.</p>
<p>This time I babysit iTunes through all the steps in sequence, though this time there&#8217;s an extra step 4 in there (unsure how that happened).</p>
<h2>Ideas</h2>
<p>I know you have some <a href="http://en.wikipedia.org/wiki/User_experience_design">UX</a> guys working for you Apple;  Perhaps you could throw them at this problem for a while?  My thoughts:</p>
<ul>
<li>Make iTunes more responsive.  I kept tasking out because of the huge lag between clicking OK and actual things happening.</li>
<li>Keep my apps up to date, automatically, in the background.  At least make it an option.  And please, delta sync.</li>
<li>Get rid of the age restricted warnings.  Ask me once, per account (or even per app), and that&#8217;s it.  Never ask me again.</li>
<li>Remember where I am.  If the user happens to sit at the <code>Enter password to continue</code> box for 10 minutes, comes back, and clicks OK&#8230; <strong>continue with what they asked you to do 10 minutes ago</strong>, don&#8217;t just sit there.</li>
</ul>
<p>Its my sincere hope that somewhere deep in the bowels of Apple, there&#8217;s a skunkworks team that has spent years rewriting iTunes from the ground up.  Its responsive, easy to use, performs simple tasks with little to no effort, and doesn&#8217;t require holding down option to delete a song from within a smart playlist.  Any day now, it&#8217;ll drop.  <em>Please.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://curtistasker.com/blog/technology/579/itunes-frustrates-me/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

