<?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>Noodlings &#187; Software</title>
	<atom:link href="http://www.noodlesoft.com/blog/category/software/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.noodlesoft.com/blog</link>
	<description>On Mac OS X programming</description>
	<lastBuildDate>Mon, 12 Sep 2011 17:07:09 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Hazel 3.0 beta</title>
		<link>http://www.noodlesoft.com/blog/2011/09/12/hazel-3-0-beta/</link>
		<comments>http://www.noodlesoft.com/blog/2011/09/12/hazel-3-0-beta/#comments</comments>
		<pubDate>Mon, 12 Sep 2011 17:07:08 +0000</pubDate>
		<dc:creator>mr_noodle</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Downloads]]></category>
		<category><![CDATA[Hazel]]></category>
		<category><![CDATA[Noodlesoft]]></category>
		<category><![CDATA[OS X]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.noodlesoft.com/blog/?p=332</guid>
		<description><![CDATA[After all the delays, dead ends, procrastination, wool gathering, futzing around and some actual hard work, Hazel 3 is finally open for beta testing. There&#8217;s no set duration for the beta period; it ships when it&#8217;s done.
If you&#8217;re feeling lucky, you can get the details from this forum article (you need to register for a [...]]]></description>
			<content:encoded><![CDATA[<p>After all the delays, dead ends, procrastination, wool gathering, futzing around and some actual hard work, Hazel 3 is finally open for beta testing. There&#8217;s no set duration for the beta period; it ships when it&#8217;s done.</p>
<p>If you&#8217;re feeling lucky, you can get the details from this <a href="http://www.noodlesoft.com/forums/viewtopic.php?f=5&amp;t=1219" target="_blank">forum article</a> (you need to register for a forum account if you haven&#8217;t already). By the way, I hear <a href="http://support.apple.com/kb/ht1427" target="_blank">Time Machine</a> is pretty cool.</p>
<p> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.noodlesoft.com/blog/2011/09/12/hazel-3-0-beta/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hazel is 5!</title>
		<link>http://www.noodlesoft.com/blog/2011/09/05/hazel-is-5/</link>
		<comments>http://www.noodlesoft.com/blog/2011/09/05/hazel-is-5/#comments</comments>
		<pubDate>Tue, 06 Sep 2011 04:02:39 +0000</pubDate>
		<dc:creator>mr_noodle</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Hazel]]></category>
		<category><![CDATA[Noodlesoft]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.noodlesoft.com/blog/?p=330</guid>
		<description><![CDATA[Five years ago today, I shipped Hazel 1.0.
Hazel started as a personal project that I wrote for my own use but over time I realized that this might be useful to others. Sometimes you just have to dive in. I quit my job to work on Hazel full-time and some months later, I finally shipped my [...]]]></description>
			<content:encoded><![CDATA[<p>Five years ago today, I shipped Hazel 1.0.</p>
<p>Hazel started as a personal project that I wrote for my own use but over time I realized that this might be useful to others. Sometimes you just have to dive in. I quit my job to work on Hazel full-time and some months later, I finally shipped my 1.0. Sales were modest at first but over the years it&#8217;s paid off. It was a lot of work but it was worth it. If anything, I&#8217;ve clocked in more hours over the past few years working pantsless in my home office than over my entire career previous in various other offices.</p>
<p>This blog has been quiet for a while mainly because I&#8217;m still at it. Hazel 3 is nearing the testing stage (expect a beta release and more details soon). It&#8217;s a bit overdue; I was hoping to release before <a href="http://en.wikipedia.org/wiki/Duke_Nukem_Forever" target="_blank">Duke Nukem Forever</a> but then again, they had bit of a head start. With each new version, I feel like Hazel is fulfilling the vision I had when I first released it five years ago, and then some. Of course, I could never predict the new and interesting ways you have used Hazel over the years and hopefully you, the users, will help shape the product for many years to come.</p>
<p>Enough about the future. It&#8217;s Hazel&#8217;s birthday today and in celebration, you can get 20% off until midnight tonight (Tues, Sep. 6, Eastern time). Just use <a href="https://www.noodlesoft.com/store?promo=HAZEL5YEAR">this link</a>. Most of you reading this probably have a copy already but I&#8217;m sure you have a friend/relative/corporation with deep pockets that could use a copy (or twenty) so send the link along to them. Or buy an extra copy for yourself because you&#8217;re just crazy like that. And while you&#8217;re at it, have a drink on Hazel&#8217;s behalf, or even better, have a drink (or five) before you hit that order page. I hear you <del>save more money</del> have more fun that way.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.noodlesoft.com/blog/2011/09/05/hazel-is-5/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Yet Another Way to Mimic the Artwork Column in Cocoa</title>
		<link>http://www.noodlesoft.com/blog/2009/10/20/yet-another-way-to-mimic-the-artwork-column-in-cocoa/</link>
		<comments>http://www.noodlesoft.com/blog/2009/10/20/yet-another-way-to-mimic-the-artwork-column-in-cocoa/#comments</comments>
		<pubDate>Wed, 21 Oct 2009 01:14:36 +0000</pubDate>
		<dc:creator>mr_noodle</dc:creator>
				<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Downloads]]></category>
		<category><![CDATA[OS X]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[User Interface]]></category>

		<guid isPermaLink="false">http://www.noodlesoft.com/blog/?p=252</guid>
		<description><![CDATA[I was just turned on to a post from Jesper of Waffle Software entitled How to Mimic the Artwork Column in Cocoa. There he approaches the problem of implementing cells in an NSTableView that can span multiple rows. This spurred on Jacob Xiao at Like Thought to tackle the problem in a different manner. I [...]]]></description>
			<content:encoded><![CDATA[<p>I was just turned on to a post from Jesper of <a href="http://wafflesoftware.net/" target="_blank">Waffle Software</a> entitled <a href="http://waffle.wootest.net/2009/10/04/artwork-column-in-cocoa/" target="_blank">How to Mimic the Artwork Column in Cocoa</a>. There he approaches the problem of implementing cells in an NSTableView that can span multiple rows. This spurred on Jacob Xiao at <a href="http://likethought.com/" target="_blank">Like Thought</a> to <a href="http://likethought.com/lockfocus/2009/10/another-way-to-mimic-the-artwork-column-in-cocoa/" target="_blank">tackle the problem</a> in a different manner. I suggest reading both of the above to get a sense of the problem and the possible approaches.</p>
<p>With NSTableView still on my mind from my last <a href="http://www.noodlesoft.com/blog/2009/09/25/sticky-section-headers-in-nstableview/" target="_blank">diversion</a>, this got me thinking about the problem and I decided to try my own hand at it. I preferred Jacob&#8217;s approach as I think it should be all contained within NSTableView if at all possible. I liked the notion of &#8220;slicing&#8221; up the cell instead of using another view. Playing with it, I came up with a generalized solution. Here are some of the interesting aspects:</p>
<ul>
<li>It can support any NSCell subclass. I do this by using a special wrapper cell. It draws the &#8220;full&#8221; version of the cell then draws out the slices for each row into the tableview.</li>
<li>It determines the spans by finding contiguous rows that have the same object value for the column in question.</li>
<li>The above two points are exploited to do some caching such that the &#8220;full&#8221; cell is only drawn once and the parts composited in place as needed.</li>
<li>If the first column is set to span rows, it will only draw the grid for the last row in a span.</li>
<li>You can designate multiple columns to do this. In the example project, if you click on the &#8220;Album&#8221; column, it will toggle between span and non-span mode. The &#8220;Artwork&#8221; column doesn&#8217;t do this because it looks cruddy in non-span mode. <del datetime="2009-10-21T18:51:28+00:00">I haven&#8217;t tested it</del> (see update below) but theoretically, the spans do not have to line up between different columns.</li>
</ul>
<p>To use it, for any columns you want to have this row-spanning behavior, set the table column class to NoodleRowSpanningTableColumn. Also, it might help to get rid of any intercell spacing in your tableview (at least  in the vertical direction). There are probably a few bugs. I do know that reordering columns may cause some grid drawing funniness but for the most part, it seems to work pretty well. Let me know if you find otherwise.</p>
<p>You can check the code for other implementation tidbits. I&#8217;ve included a self-contained project below but I&#8217;ll eventually polish it a bit and add it to my <a href="http://github.com/MrNoodle/NoodleKit" target="_blank">NoodleKit repository</a> where it can join the rest of my goodies.</p>
<p>Many thanks for Jesper and Jacob for the inspiration and laying down the groundwork for this.</p>
<p><b>Update (Oct. 21, 2009):</b> I observed odd behavior in that the program would get into a re-drawing frenzy eating up a bit of CPU. This was non-blocking in that I was still able to manipulate the UI (which is why I didn&#8217;t notice it at first). I finally figured out that it was the <code>-drawGridInClipRect</code> implementation. I was drawing the grid selectively by changing the grid mask and then calling super on subregions. Unfortunately, changing the grid mask queued up a redraw which started a loop (albeit one that didn&#8217;t tie up the event loop). Seeing as I needed to fix the grid-drawing logic anyways, I reworked the whole thing.</p>
<p>The new grid code should now be able to handle multiple spanning columns rearranged in whatever way you want. Here&#8217;s contrived example of having multiple spanning columns that don&#8217;t necessarily line up:</p>
<div style="text-align:center;"><img src="http://www.noodlesoft.com/blog/wp-content/uploads/2009/10/row-spanning-table.png" alt="row-spanning-table.png" border="0" width="485" height="440" /></div>
<p>I also made some other fixes and improvements so it&#8217;s worth re-downloading the project even if you already did so before (I bumped this version to 0.37).</p>
<p>As for integration with the rest of NoodleKit, I still need to decide whether I want to merge this with my sticky row tableview to make some über-tableview. Problem is is that I can&#8217;t think of how the two features would interact so maybe it&#8217;s best to keep them separate. Thoughts on this are welcome.</p>
<p><b>Update (Oct. 23, 2009):</b> I&#8217;ve just updated the project to version 0.68. There was a crasher when you would click on a non-span row and then move into a spanning cell. Also, the span cells were highlighting when you clicked on a non-span row. Both of these have been fixed. Thanks for Jesper for finding the crasher and Jacob for helping with the fix.</p>
<p><b>Update (Oct. 25, 2009):</b> I&#8217;ve consolidated this functionality along with my previous sticky row header code into a single NoodleTableView class. You can find it in the <a href="http://github.com/MrNoodle/NoodleKit" target="_blank">NoodleKit repository</a>. Future updates to this will be posted there from here on out.</p>
<p>Download <a href="http://www.noodlesoft.com/blog/wp-content/uploads/2009/10/NoodleRowSpanningTableViewTest.zip" title="NoodleRowSpanningTableViewTest.zip">NoodleRowSpanningTableViewTest.zip</a><br />
[This project is no longer being updated here. You can get the latest in the <a href="http://github.com/MrNoodle/NoodleKit" target="_blank">NoodleKit repo</a>]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.noodlesoft.com/blog/2009/10/20/yet-another-way-to-mimic-the-artwork-column-in-cocoa/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Hazel 2.3 is out</title>
		<link>http://www.noodlesoft.com/blog/2009/07/13/hazel-23-is-out/</link>
		<comments>http://www.noodlesoft.com/blog/2009/07/13/hazel-23-is-out/#comments</comments>
		<pubDate>Mon, 13 Jul 2009 18:16:25 +0000</pubDate>
		<dc:creator>mr_noodle</dc:creator>
				<category><![CDATA[Hazel]]></category>
		<category><![CDATA[Noodlesoft]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.noodlesoft.com/blog/?p=225</guid>
		<description><![CDATA[Seems like forever since I&#8217;ve done a release. There have been odd setbacks here and there but Hazel 2.3 is out at last.
For those that share your machine with others, you&#8217;ll find that the App Sweep feature now allows everyone on a machine to have their support files thrown away when someone throws away an [...]]]></description>
			<content:encoded><![CDATA[<p>Seems like forever since I&#8217;ve done a release. There have been odd setbacks here and there but <a href="http://www.noodlesoft.com/hazel" target="_blank">Hazel 2.3</a> is out at last.</p>
<p>For those that share your machine with others, you&#8217;ll find that the App Sweep feature now allows everyone on a machine to have their support files thrown away when someone throws away an app. Everyone that wants to participate has to enable the feature (look in the &#8220;Trash&#8221; pane). I would have made this not an option but I had visions of people complaining about others being able to see what apps they are throwing away. So, now there&#8217;s a checkbox which personally I&#8217;d rather not have.</p>
<p>The feature I&#8217;m most excited about is, of course, the one that most of my users probably won&#8217;t care about or notice. But, this being a developer blog, I&#8217;m sure some of you would be interested. In version 2.2, I added an embedded script editor. The AppleScript editor had syntax highlighting because, well, Apple gives that to you. In 2.3, I&#8217;ve added syntax highlighting to the regular shell script editor. Of course, it&#8217;s not just for shell scripts. Just set the interpreter you want and if it&#8217;s one that Hazel knows about (currently, it&#8217;s bash, Perl, Python, Ruby and awk), then Hazel will color your code appropriately. Give it a spin and let me know what you think.</p>
<p>Oh, and I didn&#8217;t add any UI to configure the highlight colors. If you really hate the color scheme it uses, you can take your XCode color theme and copy/symbolically link it as ~/Library/Application Support/Hazel/Hazel.xccolortheme. I thought about making Hazel just use whatever is set in XCode but I got the feeling that people weren&#8217;t using XCode to edit their non-Objective-C stuff. I may change my mind on this in a future release. Feedback welcome.</p>
<p>And of course, there are a bunch of other new features, improvements, and fixes (and probably bugs).</p>
<p>As for the roadmap, there will definitely be another (free) update of some sort before 3.0. Snow Leopard is coming out in a couple months and I need to make Hazel compatible. If you are running Snow Leopard and would like to test, definitely drop me a <a href="http://www.noodlesoft.com/about.php" target="_blank">line</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.noodlesoft.com/blog/2009/07/13/hazel-23-is-out/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Positional Sound in User Interfaces</title>
		<link>http://www.noodlesoft.com/blog/2008/10/23/positional-sound-in-user-interfaces/</link>
		<comments>http://www.noodlesoft.com/blog/2008/10/23/positional-sound-in-user-interfaces/#comments</comments>
		<pubDate>Thu, 23 Oct 2008 20:50:14 +0000</pubDate>
		<dc:creator>mr_noodle</dc:creator>
				<category><![CDATA[Downloads]]></category>
		<category><![CDATA[OS X]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[User Interface]]></category>

		<guid isPermaLink="false">http://www.noodlesoft.com/blog/?p=154</guid>
		<description><![CDATA[Video games are on the forefront of what kinds of rich interactions people can have with computers. In the past decade, there&#8217;s been a push for more and more immersive virtual environments resulting in more advanced APIs and hardware to provide things such as super-fast 3D rendering. In recent years, OS X has leveraged these [...]]]></description>
			<content:encoded><![CDATA[<p>Video games are on the forefront of what kinds of rich interactions people can have with computers. In the past decade, there&#8217;s been a push for more and more immersive virtual environments resulting in more advanced APIs and hardware to provide things such as super-fast 3D rendering. In recent years, OS X has leveraged these advances in the predominantly 2D world of user interfaces, often in brilliant ways as seen with QuartzGL, CoreAnimation and CoreImage.</p>
<p>In video games, it&#8217;s quite common to exploit stereo output or even better, surround sound, to provide positional audio cues. Just as graphics can simulate a 3D space, so can sounds be placed positionally in the same space. If you, super-genetically-modified-mutant-soldier, are running around on the virtual battlefield and there is some big-bad-alien-Nazi-demon-zombie dude shooting at you from the side, you will hear it coming from that direction and react accordingly. Directional audio cues can supplement visual cues or even supplant them if visual ones cannot be shown (i.e. something requiring attention outside your field of view).</p>
<p>On OS X, sound is used rather sparingly in the interface, which is probably a good thing. But for those cases where it&#8217;s use is warranted, why not take advantage of technology available? Just as animation can be used to guide the user&#8217;s focus, why not sound? OS X does ship with <a href="http://connect.creativelabs.com/openal/default.aspx" target="_blank">OpenAL</a>, which is to sound what OpenGL is to graphics, providing a way to render sounds in a 3D space.</p>
<p>I&#8217;ve put together a quick proof of concept app (download link near the end of the article). Move the window around the screen and click the button to make a sound. Based on the window&#8217;s position, the sound will appear to come from the different sides, which, for the most part is left/right, most sound output systems not being designed to articulate things in the up/down direction. The program itself basically maps the window position to a point in the 3D sound space. Right now, it doesn&#8217;t really use the z-axis (the axis that goes into your screen) but conceivably you can do things like make the sound appear further away based on window ordering. Try using headphones if the effect is not as apparent using speakers.</p>
<p>There is a significant technical issue, though. You can&#8217;t really know the actual physical dimensions and layout of a user&#8217;s screens. In addition, the position of the speakers relative to the screens is also not known. While you can get screen resolutions and relative positions of the screens, these are mostly hints at the actual layout. In my demo program,  it is assumed that the screens are relatively close to each other forming one gigantic screen. It is also assumed that the speakers produce a soundstage roughly centered on the primary display (the one with the menubar). It assumes a model like this (the circle is the user and the thin slabs are the monitors, from a top-down view):</p>
<div style="text-align:center;"><img src="http://www.noodlesoft.com/blog/wp-content/uploads/2008/10/screen-setup1.png" alt="screen-setup1.png" border="0" width="251" height="72" /></div>
<p>In reality, it&#8217;s probably more likely the user would have a setup like the following:</p>
<div style="text-align:center;"><img src="http://www.noodlesoft.com/blog/wp-content/uploads/2008/10/screen-setup2.png" alt="screen-setup2.png" border="0" width="215" height="104" /></div>
<p>But who knows, it could possibly be something like this:</p>
<div style="text-align:center;"><img src="http://www.noodlesoft.com/blog/wp-content/uploads/2008/10/screen-setup3.png" alt="screen-setup3.png" border="0" width="178" height="141" /></div>
<p>The point here is that the effectiveness of this is dependent on the user&#8217;s setup. A particular idealized model would have to be chosen that hopefully works well enough for most people. While pinpoint accuracy is not really feasible, it probably isn&#8217;t required either. Human hearing is imprecise, otherwise ventriloquists would never be able to pick up a paycheck. Just an indication of left, right or center is probably enough for these purposes.</p>
<p>Where would this be useful? Well, this all came up yesterday when I received an IM (via <a href="http://www.adiumx.com/" target="_blank">Adium</a>). I had my IM windows split up across two screens so I had to scan around a bit to find out which window had the new message. Though the window was on the screen to the left, the audio alert made me look at the main screen since the sound was centered straight ahead. It would be great to see an idea like this implemented in Adium and I&#8217;ve filed a feature request with them for their consideration. It&#8217;s ticket #11292 so you don&#8217;t go and submit a duplicate request.</p>
<p>It would be interesting to see more use of this in user interfaces out there. I don&#8217;t want to encourage people to add sounds to their apps if they weren&#8217;t already using them but for those that are, it&#8217;s something to consider. Overall, the effect is quite subtle but with some tweaking, it can be quite effective.</p>
<p>The link to download the demo program is below. Sorry, no source is provided this time. The code is a hacked together mess of stuff copied and pasted from an Apple example as I have never used OpenAL before. This can probably also be implemented in CoreAudio by adjusting the balance between the channels. If you are considering implementing something like this, <a href="http://www.noodlesoft.com/about.php" target="_blank">email me</a> and I&#8217;d be happy to discuss details as long as they don&#8217;t involve audio APIs since, well, I don&#8217;t know them particularly well.</p>
<p>Download <a href="http://www.noodlesoft.com/blog/wp-content/uploads/2008/10/positionalaudioalerttest.zip" title="PositionalAudioAlertTest.zip">PositionalAudioAlertTest.zip</a> (Leopard only)</p>
<p>Thanks to <a href="http://www.mikeash.com/?page=pyblog/" target="_blank">Mike Ashe</a> and <a href="http://www.supermegaultragroovy.com/blog/" target="_blank">Chris Liscio</a> for advice on CoreAudio, which I ended up not needing as <a href="http://www.red-sweater.com/blog/" target="_blank">Daniel Jalkut</a> suggested I use OpenAL instead which made things easier.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.noodlesoft.com/blog/2008/10/23/positional-sound-in-user-interfaces/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Passenger On Board</title>
		<link>http://www.noodlesoft.com/blog/2008/07/22/passenger-on-board/</link>
		<comments>http://www.noodlesoft.com/blog/2008/07/22/passenger-on-board/#comments</comments>
		<pubDate>Wed, 23 Jul 2008 00:47:16 +0000</pubDate>
		<dc:creator>mr_noodle</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[System Administration]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.noodlesoft.com/blog/?p=133</guid>
		<description><![CDATA[I just switched PotionStore to use Phusion Passenger. Also known as mod_rails, Passenger is an Apache module that allows you to run Rails with Apache. Unlike other Apache plugins like mod_php, your application is still run in separate processes. Previously, I had been using Apache as a proxy to a mongrel cluster. On the surface, [...]]]></description>
			<content:encoded><![CDATA[<p>I just switched <a href="http://www.potionfactory.com/potionstore/" target="_blank">PotionStore</a> to use <a href="http://www.modrails.com/" target="_blank">Phusion Passenger</a>. Also known as mod_rails, Passenger is an Apache module that allows you to run Rails with Apache. Unlike other Apache plugins like mod_php, your application is still run in separate processes. Previously, I had been using Apache as a proxy to a mongrel cluster. On the surface, this doesn&#8217;t sound much different but Passenger does give you a couple things:</p>
<ul>
<li>It maintains the pool of Ruby processes for you. It can adjust the pool dynamically as needed in case you want to reclaim memory when it is not busy, for example. You don&#8217;t have to worry about setting up and maintaining a separate set of servers like you do with mongrel. It gets restarted with Apache and you can also trigger it to restart just the Ruby stuff. One less thing to administer and monitor.</li>
<li>Lower memory footprint if you use <a href="http://www.rubyenterpriseedition.com/" target="_blank">Enterprise Ruby</a> (also made by Phusion). It will share resources between the Ruby processes.</li>
</ul>
<p>Luckily, <a href="http://www.potionfactory.com/" target="_blank">Andy Kim</a> already played guinea pig and tried it out to make sure it worked. Many thanks to him for that (and for the whole PotionStore thing to begin with, of course).</p>
<p>While the setup was fairly simple, I ran into a couple odd issues. For one, the Enterprise Ruby installer seemed to screw up the permissions of some of its files. All of its <code>.so</code> files and a directory or Ruby file here and there were set to be only readable by the owner. Make sure to check this before deploying. Note also that it installs as a totally separate Ruby installation so run its version of <code>gem</code> to make sure your Ruby packages match what you had on &#8220;regular&#8221; Ruby. For those of you are running PotionStore, make sure to do a <code>rake rails:update</code> otherwise it&#8217;ll bomb and log a message telling you to do so.</p>
<p>Unfortunately, I didn&#8217;t record the memory usage beforehand so I don&#8217;t know the exact gain. Based on my recollection, it does seem like I have maybe 20M or so more than I did before (for two Ruby processes). One odd thing I&#8217;ve noticed in my graphs is that my interrupts and context switches plummeted immediately. Not sure why that is but it seems like a good thing to me.</p>
<p>While this doesn&#8217;t remove Rails&#8217; lack of thread-safety problem (resulting in a separate process per request), it does at least make the deployment much, much easier and with the memory savings, a bit more scalable as you take less of a memory hit with each extra Ruby process. Especially for those of you that have not deployed yet, this will save you a bit of a headache in configuration (no proxy and mongrel setup). It&#8217;s only been up for a couple days so it may be too early to tell but so far it&#8217;s been running fine.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.noodlesoft.com/blog/2008/07/22/passenger-on-board/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New Tool On The Block: The LLVM/Clang Static Analyzer</title>
		<link>http://www.noodlesoft.com/blog/2008/07/07/new-tool-on-the-block-the-llvmclang-static-analyzer/</link>
		<comments>http://www.noodlesoft.com/blog/2008/07/07/new-tool-on-the-block-the-llvmclang-static-analyzer/#comments</comments>
		<pubDate>Tue, 08 Jul 2008 03:30:16 +0000</pubDate>
		<dc:creator>mr_noodle</dc:creator>
				<category><![CDATA[Debugging]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://www.noodlesoft.com/blog/?p=132</guid>
		<description><![CDATA[Over the weekend, Gus Mueller turned me on to the LLVM/Clang static analyzer. And just in time, too, as I was polishing up my 2.2 release (which went up earlier today).
It&#8217;s an offshoot of the LLVM and Clang projects (read the respective pages on what they are if you don&#8217;t know already). The static analyzer [...]]]></description>
			<content:encoded><![CDATA[<p>Over the weekend, <a href="http://gusmueller.com/blog/" target="_blank">Gus Mueller</a> turned me on to the <a href="http://clang.llvm.org/StaticAnalysis.html" target="_blank">LLVM/Clang static analyzer</a>. And just in time, too, as I was polishing up my 2.2 release (<a href="http://www.noodlesoft.com/blog/2008/07/07/hazel-22/" target="_blank">which went up earlier today</a>).</p>
<p>It&#8217;s an offshoot of the <a href="http://llvm.org/" target="_blank">LLVM</a> and <a href="http://clang.llvm.org/index.html" target="_blank">Clang</a> projects (read the respective pages on what they are if you don&#8217;t know already). The static analyzer analyzes your code and looks for problems, focusing mainly on memory allocation patterns, in this case, including Objective-C/Cocoa (retain/release/autorelease) and CF (CFRetain/CFRelease) semantics.</p>
<p>Take this contrived example for instance:</p>
<pre>
  id foo()
  {
      NSArray       *array = [[NSArray alloc] init];

      if ([array count] > 0)
      {
        return nil;
      }
      return [array autorelease];
  }
</pre>
<p>The example above will get you a report like this (it generates html):<br />
<center><img src="http://www.noodlesoft.com/blog/wp-content/uploads/2008/07/checker1.png" alt="checker1.png" border="0" width="423" height="222" /></center></p>
<p>Drilling down you get this (still in html):<br/><br />
<center><a href="http://www.noodlesoft.com/blog/wp-content/uploads/2008/07/checker2.png"><br />
<img src="http://www.noodlesoft.com/blog/wp-content/uploads/2008/07/checker2-150x150.png" alt="checker2.png" border="0" width="150" height="150" /><br/><br />
(click to enlarge)</a></center></p>
<p>Here you can see it pointing out [1] where the object was allocated [2] the branch it took and [3] the point where you leaked it. Pretty neat. It tries to follow every possible branch finding paths where you may have leaked an object. It also finds what it calls &#8220;dead stores&#8221; (when you assign a value to a variable but never use it again) and missing <code>dealloc</code> methods</p>
<p>As the project page says, it is very early in development. You&#8217;ll find that it does turn up a lot of false positives, especially with the missing deallocs. False positives for memory leaks seem to occur when you release something in a different scope than where you created it. For instance, I have this chunk of Apple code that wraps <code>CFRelease()</code> with it&#8217;s own function that checks for <code>NULL</code> first. The checker complained about this every time. Nonetheless, it did turn up some real leaks for me.</p>
<p>Aside from reducing the number of false positives, I&#8217;d also like to see the entries grouped by source file (it&#8217;s annoying jumping around between files) as well as some way to bring up the original source file by clicking on its name in the source code view. You will also see multiple entries for the same leak when the code traverses multiple paths that end up with the same leak which can be annoying.</p>
<p>In any case, I recommend downloading it and giving it a try. I&#8217;m not sure how thorough it is (i.e. whether it can supplant running your program through MallocDebug/Instruments/leaks) but it makes a great additional tool to add to your arsenal. Chances are it will look at some code path that you don&#8217;t test. Oh, and a couple tips:</p>
<ul>
<li>Make sure you do a clean build on your project first. The checker only runs on files that would normally be compiled (it sits in as your compiler). If your project is already built, then no files will be compiled/analyzed.</li>
<li>Use the <code>-V</code> option, which will pop open a browser with the analysis page when done. Normally, it sticks the files somewhere under <code>/tmp</code> but only shows the actual path when you start the run. Needless to say, that bit of text scrolls off pretty quickly.</li>
<li>While the tool does come up with false positives, you&#8217;ll find that sometimes it finds something subtle that you may blow off as a false positive on first glance. Make sure you understand what it is flagging, even if it ends up being wrong.</li>
</ul>
<p>I haven&#8217;t used it with a garbage collected program so I don&#8217;t know if it uses different techniques in such a case or is just plain unnecessary. Maybe the dead store detection becomes more important. Reports from anyone using this with GC are welcome.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.noodlesoft.com/blog/2008/07/07/new-tool-on-the-block-the-llvmclang-static-analyzer/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Hazel 2.2</title>
		<link>http://www.noodlesoft.com/blog/2008/07/07/hazel-22/</link>
		<comments>http://www.noodlesoft.com/blog/2008/07/07/hazel-22/#comments</comments>
		<pubDate>Mon, 07 Jul 2008 20:04:56 +0000</pubDate>
		<dc:creator>mr_noodle</dc:creator>
				<category><![CDATA[Hazel]]></category>
		<category><![CDATA[Noodlesoft]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.noodlesoft.com/blog/?p=129</guid>
		<description><![CDATA[Yes, it&#8217;s finally out. Hazel 2.2 is what I consider the &#8220;power user&#8221; release. It adds advanced features such as pattern matching and custom tokens (basically, a more accessible form of regular expression matching and substitution, for you programmer types out there), inline scripts and ways for AppleScripts to control the rule flow. There are [...]]]></description>
			<content:encoded><![CDATA[<p>Yes, it&#8217;s finally out. Hazel 2.2 is what I consider the &#8220;power user&#8221; release. It adds advanced features such as pattern matching and custom tokens (basically, a more accessible form of regular expression matching and substitution, for you programmer types out there), inline scripts and ways for AppleScripts to control the rule flow. There are a bunch of smaller things tucked away in there, some of them subtle in their own ways. Make sure to read the release notes.</p>
<p>Thanks to all the beta testers who found all the bugs there were to find (you guys did find them all, right?) and all the users who have sent in the great comments that motivate me to keep working on this thing. Download it and give it a spin.</p>
<p>As for the future, I&#8217;m thinking of 3.0 though I&#8217;m not sure what will be in it yet or when it will happen. I also have been mulling over other projects so we&#8217;ll see. In the meantime, I look forward to your comments.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.noodlesoft.com/blog/2008/07/07/hazel-22/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>On Software Bundles</title>
		<link>http://www.noodlesoft.com/blog/2008/06/17/on-software-bundles/</link>
		<comments>http://www.noodlesoft.com/blog/2008/06/17/on-software-bundles/#comments</comments>
		<pubDate>Tue, 17 Jun 2008 23:01:49 +0000</pubDate>
		<dc:creator>mr_noodle</dc:creator>
				<category><![CDATA[Hazel]]></category>
		<category><![CDATA[Noodlesoft]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.noodlesoft.com/blog/2008/06/17/on-software-bundles/</guid>
		<description><![CDATA[It occurred to me that it&#8217;s been about a month since I did the MacUpdate bundle in April. Now that things have settled down I figured I&#8217;d share my experiences with it.
Now, there has been some controversy concerning the bundles, boiling down to whether it is a good deal for the developers. After all this, [...]]]></description>
			<content:encoded><![CDATA[<p>It occurred to me that it&#8217;s been about a month since I did the <a href="http://www.noodlesoft.com/blog/2008/04/16/macupdate-bundle/" target="_blank">MacUpdate bundle</a> in April. Now that things have settled down I figured I&#8217;d share my experiences with it.</p>
<p>Now, there has been some controversy concerning the bundles, boiling down to whether it is a good deal for the developers. After all this, I can&#8217;t say that the issue has been fully resolved in my mind but I&#8217;ll try to at least clarify the real issues at stake. I want this to be useful to other devs who are considering participating in bundle promotions without resorting to any demagoguery.</p>
<h3>Why Did I Do it?</h3>
<p>Hazel was included in the bundle with 9 other apps, the main one being Parallels. This was the anchor app that would be the big draw for most users. For me, this was a key thing. Not so much because of the potential sales as much as being associated with some larger name apps. Some people may have considered the bundle a bit boring as a lot of the apps were a bit &#8220;mainstream.&#8221; But then again, we&#8217;re talking apps that you actually see on the shelf in a store. It&#8217;s a whole level of distribution and exposure than online. What many people online don&#8217;t realize is that a vast segment of the potential user base does not scour the net for software reviews. They&#8217;ve never heard of any of your favorite Mac sites. They don&#8217;t know and don&#8217;t care about the latest Mac scandals, memes and fads. They go buy their software at an Apple store, or maybe on Amazon. Our only chance to get noticed by these users is in the oddball case when they click on that &#8220;Mac OS X Software&#8221; item in the Apple menu. The point is that for us smaller ISVs without a physical boxed product, it&#8217;s an untapped market for us. So, to be able to be associated with a couple apps from that &#8220;realm&#8221; I felt was an opportunity.</p>
<p>MacUpdate did run full-page spreads in MacWorld and MacLife, not something I would have been able to do myself. There is something nice about seeing your icon next to some bigger names in print. I don&#8217;t know how effective they were. The problem with print, of course, is that it&#8217;s hard to track. But again, I felt that the association would be helpful.</p>
<p>Now, I&#8217;m not going to give specific details concerning the money but I will say that it was a percentage-type deal. The more copies sold, the more money I got. Contrast this with a flat amount that does not vary no matter how well it sells. That said, the amount I got per bundle is way below what my product costs. So why do it? Some reasons:</p>
<ol>
<li>Volume. They will sell over an order of magnitude more copies than you will during that time period. The hope is that the volume makes up for the huge discount. The hope is more money in total.</li>
<li>Not everyone is buying the bundle for your app. Especially if you are one of the smaller fish, you are probably piggybacking on the anchor app. One way to look at it is that you are getting part of someone else&#8217;s sale.</li>
<li>Exposure. Yes, that nebulous thing that is bandied about. It&#8217;s hard to make any concrete claims on this one so I think it&#8217;s best to not base your decision on this factor alone. You hope your product gets more recognition in the long run but it&#8217;s hard to measure that.</li>
<li>Userbase. By building up a large userbase, you have more people to get upgrade revenue from when the next big version comes out. Not having done a paid upgrade yet, I don&#8217;t know if this is all that it&#8217;s cracked up to be. Anyone with firsthand experience with this is invited to comment.</li>
</ol>
<p>And of course, what&#8217;s bad about doing it?</p>
<ol>
<li>Cheapening your software. The notion here is that if you are selling your software at rock-bottom prices, people get the perception that it is not worth much. I feel this is valid but I also don&#8217;t think doing it every now and then is a big problem. I think the issue is if your product is sold at a discount often enough that people will start to expect it, waiting for the next promo to buy it. Like exposure, it is hard to quantify and so I have a hard time basing any argument on this alone.</li>
<li>Support. Yes, taking on thousands of new customers in a short amount of time will probably result in an increased support load.</li>
<li>Allowing promoters to exploit you. This is more of an ego/sense of justice issue. Fact is, these bundles are pulling in a lot of money. It is unclear whether the developers are getting a big enough slice of that pie. No one likes to be ripped off.</li>
</ol>
<h3>What Happened?</h3>
<p>How did it go? Well, the bundle sold 15K copies. From what I can tell, that seems ok. Part of me expected more considering that a big name app (Parallels) was anchoring the thing. Also, it seemed like the unlocking thresholds backfired resulting in lags in the sales rate at certain points in the promotion. Personally, I&#8217;m not big on gimmicks but I leave the promotion to the promoters. I did sense a general fatigue amongst consumers with these bundles, though.</p>
<p>As far as the money issue goes, I got a decent chunk. If you look at it solely from a per-copy basis, then yes, it sucked. But the way I look at it is this: My revenue per month is at some amount A. I sell in a burst and rake in something like 3-4x A. Afterwards, revenue goes back to  A. Now the last bit is important as it implies, to me, that I didn&#8217;t cannibalize (i.e. sold at a discount to a lot of people that would have purchased it anyways at full price) or otherwise negatively impact sales.</p>
<p>Now, while my sales were fine after the promotion, they didn&#8217;t shoot up (as some people may expect). This would seem to indicate the lack of effectiveness of the &#8220;exposure&#8221; element. It&#8217;s only been a month so we&#8217;ll see how it goes but at the moment, it&#8217;s like it never happened.</p>
<p>The question here now is what was lost. I&#8217;ll start with the more tangible cost which is support. Now, I had to deal with a support nightmare because the integration of my licensing with MacUpdate was less than ideal. I had to deal with a ton of emails with getting the program registered. Now, I&#8217;ll admit my licensing scheme was the odd-man out but I don&#8217;t get these issues with my own store. So, in this instance, the support cost to me was a bit high. That said, it was very annoying because I felt it could have been easily prevented or rectified. Outside of the registration snafu, support was not too bad. A moderate burst during the promotion and that&#8217;s it.</p>
<p>The other thing to consider is opportunity cost. This is the cannibalization I referred to earlier. Were you losing money to people that would have bought at full price? It&#8217;s not a question that can be definitively answered but as I mentioned, I use sales after the promotion as a gauge for this type of thing. If there&#8217;s a sales dip right afterwards, that implies to me that a lot of people that were going to buy your product anyways bought earlier to get the deal. In my case, sales were not negatively affected so I do not consider it a significant issue in this case.</p>
<h3>Was It Worth It and Will I Do It Again?</h3>
<p>I&#8217;d say it was worth it, but not in the way people would expect. It was worth it to me in that I got a nice check afterwards without having my sales adversely affected. As for exposure, there may be better ways to get people to know about your app without practically giving it to them. I don&#8217;t have a paid upgrade planned out yet so that was not even a consideration for me. For me to do it again, I think I would have to be offered a good deal, percentage-wise. My sense is that these promotions are more effective in the short term than long term.</p>
<p>Now, that doesn&#8217;t mean that it is totally ineffective in creating exposure for your app. I have seen signs that people have been turned on to Hazel who had never heard of it before. The issue here is that it has not translated into increased sales (at least so far). Maybe it will help in the long term but since it&#8217;s near impossible to quantify, it&#8217;s not a prime motivation for me when doing these types of promotions.</p>
<h3>Did I Get Ripped Off?</h3>
<p>To address the big controversy, no, I do not think I was ripped off though I could&#8217;ve done better. Let me start off by saying that I feel that promoters do provide a valuable service. I&#8217;ve seen some developers band together with their own bundles with less than stellar results. Fact is, not anyone can just throw their stuff up and expect to sell any large volume. There is skill and work involved in getting people&#8217;s attention. Doing it yourself is, well, just doing it yourself. If you already have the pull to get tons of people to pay attention to you, then you probably don&#8217;t need to do special promotions for your apps.</p>
<p>Now, I haven&#8217;t seen the books for any of these promotions plus the deals probably vary greatly depending on who does them so it may be unfair to lump them all together. But it seems to me that the promoters are getting quite a large chunk and that they can afford to cut the devs a better deal. I&#8217;ve seen arguments along the lines of &#8220;How can you criticize them? They are getting sales for developers/exposure for their software/donating money to charity/yadda yadda.&#8221; This is a logical fallacy. Yes, maybe they are doing some good things, but that doesn&#8217;t mean it justifies the bad things. There is nothing that has indicated to me that they can&#8217;t do all the good things they already do while providing a more equitable split. Again, I haven&#8217;t seen the books but my sense is that there is some leeway there.</p>
<p>I want to make it clear, though, that I have no complaints about my deal with MacUpdate. In the end, it was my deal to negotiate. For me, this was an experiment and knowing what I do now will help in assessing future promotions.</p>
<p>And of course, this is just my experience and your mileage may vary. Especially if you are just starting out, it&#8217;s possible the exposure element will be more helpful. I&#8217;m not sure how useful the exposure is for the more well-known apps but I suspect that they, having more leverage, negotiated higher percentages. In the end, you have to assess whether it fits with where you and your app are, marketwise.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.noodlesoft.com/blog/2008/06/17/on-software-bundles/feed/</wfw:commentRss>
		<slash:comments>32</slash:comments>
		</item>
		<item>
		<title>MacSanta is back in town</title>
		<link>http://www.noodlesoft.com/blog/2007/12/07/macsanta-is-back-in-town/</link>
		<comments>http://www.noodlesoft.com/blog/2007/12/07/macsanta-is-back-in-town/#comments</comments>
		<pubDate>Fri, 07 Dec 2007 05:05:32 +0000</pubDate>
		<dc:creator>mr_noodle</dc:creator>
				<category><![CDATA[Hazel]]></category>
		<category><![CDATA[Noodlesoft]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.noodlesoft.com/blog/2007/12/07/macsanta-is-back-in-town/</guid>
		<description><![CDATA[
It&#8217;s that time of year again. MacSanta is here, providing discounts on all sorts of Mac software for the month of December. I couldn&#8217;t get my act together last year but this year Noodlesoft is participating.
Today, Hazel is one of the apps being featured. That means you can get 20% off Hazel for today and [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.macsantadeals.com/" target="_blank"><img src=http://www.macsantadeals.com/images/badges/macsanta125.png align="right" /></a><br />
It&#8217;s that time of year again. MacSanta is here, providing discounts on all sorts of Mac software for the month of December. I couldn&#8217;t get my act together last year but this year Noodlesoft is participating.</p>
<p>Today, Hazel is one of the apps being featured. That means you can get 20% off Hazel for today and 10% off for the rest of the month. Just saunter on over to the <a href="http://www.macsantadeals.com/" target="_blank">MacSanta</a> site for the coupon codes to get your discount on Hazel as well as some other great software.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.noodlesoft.com/blog/2007/12/07/macsanta-is-back-in-town/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

