<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
   >
<channel>
    <title>Jay Tuley</title>
    <link>http://jay.tuley.name/</link>
    <description>.Net Programmer by Day / Mac Programmer by Night</description>
    <dc:language>en</dc:language>
    <generator>Serendipity 1.2.1 - http://www.s9y.org/</generator>
    <pubDate>Tue, 23 Feb 2010 04:11:54 GMT</pubDate>

    <image>
        <url>http://jay.tuley.name/templates/default/img/s9y_banner_small.png</url>
        <title>RSS: Jay Tuley - .Net Programmer by Day / Mac Programmer by Night</title>
        <link>http://jay.tuley.name/</link>
        <width>100</width>
        <height>21</height>
    </image>

<item>
    <title>Cache Details are Important.</title>
    <link>http://jay.tuley.name/archives/2010/02/23/Cache-Details-are-Important.</link>
    
    <comments>http://jay.tuley.name/archives/2010/02/23/Cache-Details-are-Important.#comments</comments>
    <wfw:comment>http://jay.tuley.name/wfwcomment.php?cid=815</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://jay.tuley.name/rss.php?version=2.0&amp;type=comments&amp;cid=815</wfw:commentRss>
    

    <author>nospam@example.com (Jay)</author>
    <content:encoded>
    	&lt;p&gt;So again I&amp;#8217;m trying to get back in the habit of blogging. I typically stick to blogging about Mac programming, however I do so much more .&lt;span class=&quot;caps&quot;&gt;NET&lt;/span&gt; programming these days, and I come across a lot of interesting issues when .&lt;span class=&quot;caps&quot;&gt;NET&lt;/span&gt; programming that I&amp;#8217;m not going to stick to strictly Mac topics anymore.&lt;/p&gt;

	&lt;p&gt;So at work our website is a mini content management system, built with &lt;span class=&quot;caps&quot;&gt;ASP&lt;/span&gt;.&lt;span class=&quot;caps&quot;&gt;NET&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;MVC&lt;/span&gt; and SQLite.  From this &lt;span class=&quot;caps&quot;&gt;CMS&lt;/span&gt; system we have built in support to link to other web applications. I had been doing this with just a plain redirect if a content page is marked as a link content page.  However, these web apps were running on our own server, now we have a very minor app from a vendor that is hosted on their server. They provide sufficient branding customization except for the url of course. So I added url masking as a new option to our &lt;span class=&quot;caps&quot;&gt;CMS&lt;/span&gt; system. &lt;span class=&quot;caps&quot;&gt;MVC&lt;/span&gt; made this easy, I just added another database field, a new view template that provided the frameset for the url mask and a quick check in the view action.&lt;/p&gt;

	&lt;p&gt;That part went fine, however I needed to add another feature, this url I was masking used &lt;span class=&quot;caps&quot;&gt;SSL&lt;/span&gt;, so I needed the frameset to be sent over &lt;span class=&quot;caps&quot;&gt;SSL&lt;/span&gt; too so the user would get a lock. Not a big issue, I just needed to make sure if the user typed in the address and it defaulted to http that it would automatically redirect to https. So I add a check in the view action to check if the requested scheme was not https and content required https and then redirected to https. And this would redirect to the https masked url the first time but the second time it would stay http, it was totally weird. A little debugging discovered that the action wasn&amp;#8217;t being called the second time. OutputCache!! Since it&amp;#8217;s a &lt;span class=&quot;caps&quot;&gt;CMS&lt;/span&gt; I use to OutputCache to get serious performance benefit without worry (typically) of outdated content since the &lt;span class=&quot;caps&quot;&gt;CMS&lt;/span&gt; is interactively updated it&amp;#8217;s cache is interactively invalidated.&lt;/p&gt;

	&lt;p&gt;So where did I go wrong here. Well my mental model of OutputCache missed 2 details, first that redirects aren&amp;#8217;t cached by the OutputCache, and second that OutputCache does not vary by the full url (sans query string). Once I figured what was going on my ultimate solution was quite easy I just need to ensure that the cache varied by url protocol as well. I first looked for a http request header that might differ between a http and https request, however I couldn&amp;#8217;t find one and it didn&amp;#8217;t seem reasonable that one would exist, so I used Microsoft&amp;#8217;s convenient varyByCustom attribute for the OutputCache.&lt;/p&gt;

&lt;pre&gt;
public override string GetVaryByCustomString(HttpContext context, string custom){
	if(custom == &amp;#34;scheme&amp;#34;){
		return context.Request.Url.Scheme;
	}return null;
}
&lt;/pre&gt;

	&lt;p&gt;One simple if statement and my cache varies by protocol and then my code worked as it should, and now I have a better mental model of the &lt;span class=&quot;caps&quot;&gt;ASP&lt;/span&gt;.&lt;span class=&quot;caps&quot;&gt;NET&lt;/span&gt; OutputCache.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Tue, 23 Feb 2010 04:08:15 +0000</pubDate>
    <guid isPermaLink="false">http://jay.tuley.name/archives/2010/02/23/815</guid>
    <category>.net</category>
<category>asp.net mvc</category>
<category>outputcache</category>

</item>
<item>
    <title>Coding 4 Charities</title>
    <link>http://jay.tuley.name/archives/2009/10/14/Coding-4-Charities</link>
    
    <comments>http://jay.tuley.name/archives/2009/10/14/Coding-4-Charities#comments</comments>
    <wfw:comment>http://jay.tuley.name/wfwcomment.php?cid=814</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://jay.tuley.name/rss.php?version=2.0&amp;type=comments&amp;cid=814</wfw:commentRss>
    

    <author>nospam@example.com (Jay)</author>
    <content:encoded>
    	&lt;p&gt;I need to get back in the habit of posting to my blog. I&amp;#8217;m doing &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/c4c-stl.org&#039;);&quot;  href=&quot;http://c4c-stl.org&quot; title=&quot;Coding 4 Charities&quot;&gt; Coding 4 Charities &lt;/a&gt; this weekend, which in lock in style will have facilities open 24&amp;#215;3  (but you can leave and come back at any time unlike a lock in) to work on completing, mainly websites, but other various technology projects needs for St. Louis Charities that can be completed in one weekend. I think it will be fun, I met with my team tonight, and our team leader, &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/geekswithblogs.net/NewThingsILearned/Default.aspx&#039;);&quot;  href=&quot;http://geekswithblogs.net/NewThingsILearned/Default.aspx&quot;&gt;Muljadi Budiman&lt;/a&gt;, gave us a pretty good general idea of what our charity&amp;#8217;s website (Turning Point Shelter) will need to do. Anyway it sounds like Coding 4 Charities still needs people, of both developers and graphic designers so if you are one of these and in st. louis area consider volunteering and signing up on their website. Although their website says .net &amp;amp; java developers, at our meeting it was brought up that &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/en.wikipedia.org/wiki/LAMP_(software_bundle)&#039;);&quot;  href=&quot;http://en.wikipedia.org/wiki/LAMP_(software_bundle)&quot;&gt;LAMP&lt;/a&gt; is on the table so don&amp;#8217;t let that stop you php guys.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Wed, 14 Oct 2009 05:26:19 +0100</pubDate>
    <guid isPermaLink="false">http://jay.tuley.name/archives/2009/10/14/814</guid>
    
</item>
<item>
    <title>WOVSuite 0.51</title>
    <link>http://jay.tuley.name/archives/2008/06/01/WOVSuite-0.51</link>
    
    <comments>http://jay.tuley.name/archives/2008/06/01/WOVSuite-0.51#comments</comments>
    <wfw:comment>http://jay.tuley.name/wfwcomment.php?cid=813</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://jay.tuley.name/rss.php?version=2.0&amp;type=comments&amp;cid=813</wfw:commentRss>
    

    <author>nospam@example.com (Jay)</author>
    <content:encoded>
    	&lt;h2&gt;What Is WOV&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#fn15965319574b972eeee46f0&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;?&lt;/h2&gt;

	&lt;p&gt;&lt;span class=&quot;caps&quot;&gt;WOV&lt;/span&gt; pronounced &amp;#8220;wahhv&amp;#8221;, stands for Wrapper Of Video, its a Mac OS X package format that contains both a non quicktime video source and a pre-parsed QuickTime reference movie and is QuickLook compatible.&lt;/p&gt;

	&lt;h2&gt;What&amp;#8217;s &lt;span class=&quot;caps&quot;&gt;WOV&lt;/span&gt; Got to Do With It&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#fn10489317154b972eeee52a5&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;?&lt;/h2&gt;

	&lt;p&gt;If you have ever had a large Window Media File you want to open with &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/flip4mac.com&#039;);&quot;  href=&quot;http://flip4mac.com&quot;&gt;WMVPlayer&lt;/a&gt; plugin for QuickTime, you may have noticed it&amp;#8217;s really really slow. Same goes with &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/perian.org&#039;);&quot;  href=&quot;http://perian.org&quot;&gt;Perian&lt;/a&gt; and MKV&amp;#8217;s, though not nearly as bad. Since they are converting to a QuickTime movie format in memory its possible to save that file and have much quicker load times with subsequent opens. However you must be careful, because these plugins can (and have in the past) changed they way they work such that imported quicktime movies can be broken with updates, so it&amp;#8217;s imperative that you don&amp;#8217;t save self contained movies only reference movies external to the original file. So thats what &lt;span class=&quot;caps&quot;&gt;WOV&lt;/span&gt; does, it keeps a reference movie which is really small and the original file combined into its package format, that makes it easy to organize these pairs, repair the reference movie if necessary in the future, and completely undo the &lt;span class=&quot;caps&quot;&gt;WOV&lt;/span&gt; container and restore it to the original files (if you so desire).&lt;/p&gt;

	&lt;h2&gt;&lt;span class=&quot;caps&quot;&gt;WOV&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;WOV&lt;/span&gt; WOV&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#fn3625409074b972eeee98ee&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;.&lt;/h2&gt;

	&lt;p&gt;So early on playing around with the idea of &lt;span class=&quot;caps&quot;&gt;WOV&lt;/span&gt;, I soon realized it was a good format for simple non destructive QuickTime edits, so I chose one I though was particularly useful which is joining files. So there exists an option, when converting a batch of files in &lt;span class=&quot;caps&quot;&gt;WOV&lt;/span&gt; Converter, to combine multiple files into a single &lt;span class=&quot;caps&quot;&gt;WOV&lt;/span&gt; file. That resulting package contains a chapter-ized reference movie, the original files, and an M3U playlist of the original files. Thus when trying to open the &lt;span class=&quot;caps&quot;&gt;WOV&lt;/span&gt; file in a non native QuickTime App it will try and open the M3U file, I choose M3U since it is so simple it&amp;#8217;s likely to be supported in most apps (it is supported in &lt;span class=&quot;caps&quot;&gt;VLC&lt;/span&gt; specifically).&lt;/p&gt;

	&lt;h2&gt;Tainted WOV&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#fn3994121784b972eeeea4a4&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;.&lt;/h2&gt;

	&lt;p&gt;There are decent possibilities for caveats with this format, which is why I am putting it out in this early beta and not integrating into NicePlayer right away. One of the obvious caveats is that the original type is masked, which makes it hard to tell if a non native quicktime app is going to be able to open a &lt;span class=&quot;caps&quot;&gt;WOV&lt;/span&gt; file ahead of time. I&amp;#8217;m not sure if that will be a big deal, but I need people to use WOVConverter &amp;amp; WOVOpener to get feedback to figure out stuff like that.&lt;/p&gt;

	&lt;p&gt;It should be noted that there is also major issues with using WMVPlayer with WOVConverter. WMVPlayer version 2.2 must have the preference &amp;#8220;Open Local Files Immediately&amp;#8221; unchecked, or alternatively you must downgrade to version 2.1 to work properly with WOVConverter.&lt;/p&gt;

	&lt;h2&gt;The Book of WOV&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#fn10751791294b972eeeeb05d&quot;&gt;5&lt;/a&gt;&lt;/sup&gt;. &lt;/h2&gt;

	&lt;p&gt;&lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/code.google.com/p/wovsuite&#039;);&quot;  href=&quot;http://code.google.com/p/wovsuite&quot;&gt;WOVSuite&lt;/a&gt; &amp;#8212; entirely open source, licensed: MPL/LGPL/&lt;span class=&quot;caps&quot;&gt;GPL&lt;/span&gt; &lt;/p&gt;

	&lt;p&gt;has a few parts:&lt;/p&gt;

	&lt;ul&gt;
		&lt;li&gt;&lt;span class=&quot;caps&quot;&gt;WOV&lt;/span&gt; Opener &amp;#8212; Utility that opens &lt;span class=&quot;caps&quot;&gt;WOV&lt;/span&gt; files. You set the actually program you want to open the video and whether that program supports quicktime files natively. &lt;b&gt;Supported on 10.4 &amp;amp; 10.5&lt;/b&gt;&lt;/li&gt;
		&lt;li&gt;&lt;span class=&quot;caps&quot;&gt;WOV&lt;/span&gt; Coverter &amp;#8212; Utility that converts any quicktime importable file into &lt;span class=&quot;caps&quot;&gt;WOV&lt;/span&gt; files, repairs broken &lt;span class=&quot;caps&quot;&gt;WOV&lt;/span&gt; files, and unwraps original files from &lt;span class=&quot;caps&quot;&gt;WOV&lt;/span&gt; files too.  &lt;b&gt;Supported on 10.5 Only&lt;/b&gt;&lt;/li&gt;
		&lt;li&gt;WrapperOfVideo.framework &amp;#8212; Framework to make it easy for other cocoa applications to support &lt;span class=&quot;caps&quot;&gt;WOV&lt;/span&gt; packages without &lt;span class=&quot;caps&quot;&gt;WOV&lt;/span&gt; opener. &lt;b&gt;Supported on 10.4 &amp;amp; 10.5&lt;/b&gt;&lt;/li&gt;
	&lt;/ul&gt;

	&lt;h2&gt;Fun Footnotes&lt;/h2&gt;

	&lt;p id=&quot;fn15965319574b972eeee46f0&quot; class=&quot;footnote&quot;&gt;&lt;sup&gt;1&lt;/sup&gt; &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/phobos.apple.com/WebObjects/MZStore.woa/wa/viewAlbum?i=261662788&amp;amp;#38;id=261662747&amp;amp;#38;s=143441&#039;);&quot;  href=&quot;http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewAlbum?i=261662788&amp;#38;id=261662747&amp;#38;s=143441&quot;&gt;What Is Love&lt;/a&gt;&lt;/p&gt;

	&lt;p id=&quot;fn10489317154b972eeee52a5&quot; class=&quot;footnote&quot;&gt;&lt;sup&gt;2&lt;/sup&gt; &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/phobos.apple.com/WebObjects/MZStore.woa/wa/viewAlbum?i=713143&amp;amp;#38;id=713299&amp;amp;#38;s=143441&#039;);&quot;  href=&quot;http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewAlbum?i=713143&amp;#38;id=713299&amp;#38;s=143441&quot;&gt;What&amp;#8217;s Love Go to Do With It&lt;/a&gt;&lt;/p&gt;

	&lt;p id=&quot;fn3625409074b972eeee98ee&quot; class=&quot;footnote&quot;&gt;&lt;sup&gt;3&lt;/sup&gt; &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/www.youtube.com/watch?v=rLxTpsIVzzo&#039;);&quot;  href=&quot;http://www.youtube.com/watch?v=rLxTpsIVzzo&quot;&gt;All You Need Is Love&lt;/a&gt;&lt;/p&gt;

	&lt;p id=&quot;fn3994121784b972eeeea4a4&quot; class=&quot;footnote&quot;&gt;&lt;sup&gt;4&lt;/sup&gt; &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/phobos.apple.com/WebObjects/MZStore.woa/wa/viewAlbum?i=256268961&amp;amp;#38;id=256268877&amp;amp;#38;s=143441&#039;);&quot;  href=&quot;http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewAlbum?i=256268961&amp;#38;id=256268877&amp;#38;s=143441&quot;&gt;Tainted Love&lt;/a&gt;&lt;/p&gt;

	&lt;p id=&quot;fn10751791294b972eeeeb05d&quot; class=&quot;footnote&quot;&gt;&lt;sup&gt;5&lt;/sup&gt; &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/phobos.apple.com/WebObjects/MZStore.woa/wa/viewAlbum?i=118109894&amp;amp;#38;id=118110074&amp;amp;#38;s=143441&#039;);&quot;  href=&quot;http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewAlbum?i=118109894&amp;#38;id=118110074&amp;#38;s=143441&quot;&gt;The Book of Love&lt;/a&gt;&lt;/p&gt; 
    </content:encoded>

    <pubDate>Sun, 01 Jun 2008 06:31:37 +0100</pubDate>
    <guid isPermaLink="false">http://jay.tuley.name/archives/2008/06/01/813</guid>
    <category>WOV</category>
<category>niceplayer</category>
<category>programming</category>
<category>rubycocoa</category>

</item>
<item>
    <title>NicePlayer Preview Builds</title>
    <link>http://jay.tuley.name/archives/2008/03/27/NicePlayer-Preview-Builds</link>
    
    <comments>http://jay.tuley.name/archives/2008/03/27/NicePlayer-Preview-Builds#comments</comments>
    <wfw:comment>http://jay.tuley.name/wfwcomment.php?cid=812</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://jay.tuley.name/rss.php?version=2.0&amp;type=comments&amp;cid=812</wfw:commentRss>
    

    <author>nospam@example.com (Jay)</author>
    <content:encoded>
    	&lt;p&gt;While NicePlayer is pre-1.0, I strive to make each release solid enough for general mass consumption. However it&amp;#8217;s not easy, it involves testing on different processors, os&amp;#8217;s, migrating localizations, updating readme&amp;#8217;s and documentation&amp;#8212;it&amp;#8217;s a long laundry list of things. And we need more help on testing. NicePlayer is open source and the source can be checked out and built prior to release for anyone to try out features and bug fixes, but I don&amp;#8217;t think that is accessible enough to get the feedback necessary to for quality releases. So I created a Preview builds page where I can easily upload preview builds of NicePlayer.&lt;/p&gt;

	&lt;p&gt;&lt;a href=&quot;http://jay.tuley.name/build/&quot;&gt;http://jay.tuley.name/build/&lt;/a&gt;&lt;/p&gt;

	&lt;p&gt;These releases aren&amp;#8217;t ready for mass consumption, but are solid enough for enthusiasts to try out. Anyone is welcome to try them, but please only link to the build page and not the actual download. Also be forewarned that the download links changes every 5 minutes so if you try to link to the actual download it will stop working quick (so no unauthorized MacUpdate posts!).  On the build page I add what&amp;#8217;s changed and what I need tested to the description of each build. The description will also show up in the preview appcast that NicePlayer autoupdates from, so you can keep up to date on this bleeding edge track.&lt;/p&gt;

 
    </content:encoded>

    <pubDate>Thu, 27 Mar 2008 02:21:51 +0000</pubDate>
    <guid isPermaLink="false">http://jay.tuley.name/archives/2008/03/27/812</guid>
    <category>niceplayer</category>

</item>
<item>
    <title>jay.tuley.name back online!</title>
    <link>http://jay.tuley.name/archives/2008/03/02/jay.tuley.name-back-online!</link>
    
    <comments>http://jay.tuley.name/archives/2008/03/02/jay.tuley.name-back-online!#comments</comments>
    <wfw:comment>http://jay.tuley.name/wfwcomment.php?cid=811</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://jay.tuley.name/rss.php?version=2.0&amp;type=comments&amp;cid=811</wfw:commentRss>
    

    <author>nospam@example.com (Jay)</author>
    <content:encoded>
    	&lt;p&gt;So my blog is back online finally, gave up on &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/typosphere.org&#039;);&quot;  href=&quot;http://typosphere.org&quot;&gt;Typo&lt;/a&gt; and &lt;a href=&quot;www.rubyonrails.org&quot;&gt;Rails&lt;/a&gt;. It was just too hard to keep running, so I&amp;#8217;m back to good old &lt;span class=&quot;caps&quot;&gt;PHP&lt;/span&gt;.&lt;/p&gt;

	&lt;p&gt;The blog software I chose to replace typo is &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/s9y.org&#039;);&quot;  href=&quot;http://s9y.org&quot;&gt;Serendipity&lt;/a&gt;, mainly because it supports &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/sqlite.org&#039;);&quot;  href=&quot;http://sqlite.org&quot;&gt;sqlite&lt;/a&gt; and since i was using sqilte with typo to make the migration easier. &lt;/p&gt;

	&lt;p&gt;The first hurdle faced was that php&amp;#8217;s sqlite is sqlite version 2 instead of 3 and it&amp;#8217;s hard to find a program that will version 2 let alone both, however looking through Serendipity&amp;#8217;s source and found that it had sqlite3 support and googling a function call in that source let me to the php module used for sqlite3 support, &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/php-sqlite3.sourceforge.net&#039;);&quot;  href=&quot;http://php-sqlite3.sourceforge.net&quot;&gt;php-sqlite3&lt;/a&gt;. &lt;/p&gt;

	&lt;p&gt;Unfortunately there isn&amp;#8217;t a gentoo package for it, and I am not familar with php modules so it took a little bit of effort to get it installed, but i did.&lt;/p&gt;

	&lt;p&gt;Finally i used &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/sourceforge.net/project/showfiles.php?group_id=189610&#039;);&quot;  href=&quot;https://sourceforge.net/project/showfiles.php?group_id=189610&quot;&gt;sqliteman&lt;/a&gt; to map the columns from the old blog engine to the new.&lt;/p&gt;

	&lt;p&gt;Here is the sql I used below.&lt;/p&gt;

	&lt;p&gt;Content:&lt;br /&gt;
&lt;pre&gt;
INSERT INTO 
		s9y_entries
	SELECT
		contents.id as id,
		contents.title as title,
		STRFTIME(&amp;#39;%s&amp;#39;,contents.published_at) AS timestamp,
		contents.body AS body,
		COUNT(feedback.type) AS comments,
		contents.extended AS extended,
		0 AS trackbacks,
		0 AS exflag,
		contents.author AS author,
		contents.user_id AS authorid,
		CASE
			WHEN contents.state=&amp;#39;draft&amp;#39;
			THEN &amp;#39;true&amp;#39; 
			ELSE &amp;#39;false&amp;#39; 
			END AS isdraft,
		&amp;#39;true&amp;#39; AS allow_comments,
		STRFTIME(&amp;#39;%s&amp;#39;,contents.updated_at) AS last_modified,
		&amp;#39;false&amp;#39; AS moderate_comments
	FROM
			contents
		LEFT JOIN
				feedback
			ON feedback.article_id = contents.id
	GROUP BY contents.id
&lt;/pre&gt;&lt;/p&gt;

	&lt;p&gt;Feedback:&lt;br /&gt;
&lt;pre&gt;
INSERT INTO
		s9y_comments 
	SELECT
		id,
		article_id AS entry_id,
		0,
		STRFTIME(&amp;#39;%s&amp;#39;,published_at) AS timestamp,
		title AS title,
		author AS author,
		email AS email,
		url AS url,
		ip AS ip,
		body AS body,
		&amp;#34;NORMAL&amp;#34; AS type,
		0 AS subscribed,
		&amp;#34;approved&amp;#34; AS status,
		null
	FROM
		feedback
&lt;/pre&gt;&lt;/p&gt;

	&lt;p&gt;Categories (note, I cheated on categories because i didn&amp;#8217;t like how i did them originally and planned on manually tagging articles, so I made them all 0, i am not sure if that was necessary but i did it.): &lt;br /&gt;
&lt;pre&gt;
INSERT INTO
		s9y_entrycat 
	SELECT 
		id,
		0 AS categoryid
	FROM
		contents
	WHERE
		state &amp;#60;&amp;#62; &amp;#39;draft&amp;#39;
&lt;/pre&gt;&lt;/p&gt;

	&lt;p&gt;The last thing i did was permalinks, i was hoping if I did this i could map the old link scheme, however this didn&amp;#8217;t work so I wouldn&amp;#8217;t recommend doing this last sql command but I ran it so I&amp;#8217;m posting it as well anyway.&lt;br /&gt;
&lt;pre&gt;
INSERT INTO 
  s9y_permalinks(permalink,entry_id,type) 
 SELECT
  &amp;#34;articles/&amp;#34;
  ||strftime(&amp;#39;%Y/%m/%d&amp;#39;,published_at)
  ||&amp;#34;/&amp;#34;
  ||trim(
    replace(
     replace(
      replace(
       replace(
        replace(
         replace(
          replace(
	      replace(
		  replace(
		   replace(
		    replace(
			replace(
			 replace(
			  replace(
			   replace(
                  lower(title)
				,&amp;#39; &amp;#39;,&amp;#39;-&amp;#39;)
			   ,&amp;#39;,&amp;#39;,&amp;#39;-&amp;#39;)
               ,&amp;#39;!&amp;#39;,&amp;#39;-&amp;#39;)
              ,&amp;#34;&amp;#39;&amp;#34;,&amp;#39;-&amp;#39;)
             ,&amp;#39;/&amp;#39;,&amp;#39;-&amp;#39;)
		  ,&amp;#39;?&amp;#39;,&amp;#39;-&amp;#39;)
		,&amp;#39;:&amp;#39;,&amp;#39;-&amp;#39;)
        ,&amp;#39;(&amp;#39;,&amp;#39;-&amp;#39;)
       ,&amp;#39;)&amp;#39;,&amp;#39;-&amp;#39;)
	 ,&amp;#39;&amp;#34;&amp;#39;,&amp;#39;-&amp;#39;)
	,&amp;#39;&amp;#62;&amp;#39;,&amp;#39;-&amp;#39;)
    ,&amp;#39;*&amp;#39;,&amp;#39;-&amp;#39;)
   ,&amp;#39;----&amp;#39;,&amp;#39;-&amp;#39;)
  ,&amp;#39;---&amp;#39;,&amp;#39;-&amp;#39;)
,&amp;#39;--&amp;#39;,&amp;#39;-&amp;#39;)
,&amp;#39;-&amp;#39;)
    AS permalink,
  id,
  &amp;#39;entry&amp;#39; as type
   FROM contents
   WHERE state &amp;#60;&amp;#62; &amp;#39;draft&amp;#39;
&lt;/pre&gt;&lt;/p&gt; 
    </content:encoded>

    <pubDate>Sun, 02 Mar 2008 03:09:14 +0000</pubDate>
    <guid isPermaLink="false">http://jay.tuley.name/archives/2008/03/02/811</guid>
    <category>sqilte</category>

</item>
<item>
    <title>NicePlayer 0.96.X the Early Leopard</title>
    <link>http://jay.tuley.name/archives/2007/11/17/NicePlayer-0.96.X-the-Early-Leopard</link>
    
    <comments>http://jay.tuley.name/archives/2007/11/17/NicePlayer-0.96.X-the-Early-Leopard#comments</comments>
    <wfw:comment>http://jay.tuley.name/wfwcomment.php?cid=810</wfw:comment>

    <slash:comments>1</slash:comments>
    <wfw:commentRss>http://jay.tuley.name/rss.php?version=2.0&amp;type=comments&amp;cid=810</wfw:commentRss>
    

    <author>nospam@example.com (Jay)</author>
    <content:encoded>
    	&lt;h3&gt;The First Release&lt;/h3&gt;

	&lt;p&gt;So the first released was 0.96.0 in the wee hours of the A.M. of October 26th a last ditch effort to release something that actually worked on Leopard combined with a few bug fixes from 0.95 and some minor features I had started working on prior.&lt;/p&gt;

	&lt;p&gt;&lt;b&gt;Version 0.96 (v543)&lt;/b&gt;&lt;br /&gt;
• Basic Leopard compatibility &lt;br /&gt;
• Progressive movie loading progress in scrubbing area &lt;br /&gt;
• Chapters expand in playlist drawer. &lt;br /&gt;
• New Playlist and Volume menus &lt;br /&gt;
• Fixed subtitle bugs involving parsing commas in &lt;span class=&quot;caps&quot;&gt;SSA&lt;/span&gt;, and foreign encodings. &lt;br /&gt;
• Using Sparkle for future updates &lt;br /&gt;
• Fixed Transparency behavior in regards to correctly representing opacity and transparency&lt;/p&gt;

	&lt;p&gt;Something, I just found out is that, my pre-sparkle method of updating actually broke on Leopard so users didn&amp;#8217;t get this update notification, however since 0.95 doesn&amp;#8217;t work at all on Leopard, I&amp;#8217;m sure such users have found the update since then who needed it, so it&amp;#8217;s a good thing I&amp;#8217;ve switched to sparkle on this release. &lt;/p&gt;

	&lt;h3&gt;The Second Release&lt;/h3&gt;

	&lt;p&gt;I got to fully test the sparkle update method by releasing, two weeks later, 0.96.1, which contained a few bugs that were introduced in 0.96.0&amp;#8217;s haste (whoops), but also I got to try out some fun Leopard stuff.&lt;/p&gt;

	&lt;p&gt;&lt;b&gt;Version 0.96.1 (v573) &lt;/b&gt;&lt;br /&gt;
• Fixed playlist delete bug &amp;#8211; introduced 0.96.0 &lt;br /&gt;
• Fixed playlist drag and drop bug &amp;#8211; introduced 0.96.0 &lt;br /&gt;
• Added Leopard Sized Icons &lt;br /&gt;
• Added Sparkle Preference Pane &lt;br /&gt;
• Fixed preference bug that ignored preference changes &amp;#8211; introduced 0.96.0 &lt;br /&gt;
• Code signed &lt;br /&gt;
• Resolution Independent &lt;span class=&quot;caps&quot;&gt;GUI&lt;/span&gt; (Glitchy in Tiger, works pretty good in Leopard) &lt;br /&gt;
• New and Updated AppleScripts for the Script Menu&lt;/p&gt;

	&lt;p&gt;I added code signing as a build stage, however I haven&amp;#8217;t figured out if being signed actually does anything. I thought it was supposed to reduce warning messages when downloading updates, however I tested downloading two copies of the same code signed NicePlayer and they both had the same warning dialog. Oh well. Sparkle updates don&amp;#8217;t seem to cause warning messages, but i think that is not dependent on the code signing.&lt;/p&gt;

	&lt;p&gt;I also added new 512px icons, they are fun, the main app icon looks like glass in coverflow.&lt;/p&gt;

	&lt;p&gt;&lt;img src=&quot;http://jay.tuley.name/files/CoverFlowNicePlayer.jpg&quot; alt=&quot;&quot; width=&quot;337&quot; height=&quot;302&quot; /&gt;&lt;/p&gt;

	&lt;p&gt;It&amp;#8217;s great.&lt;/p&gt;

	&lt;p&gt;I updated quite a few of the default AppleScripts for the script menu. Since Leopard made setting the default dvd player scriptable, I&amp;#8217;ve updated my script that previous did the same with laborious UI scripting (but still falls back for tiger). Also I&amp;#8217;ve fixed the fullscreen behavior of the aspect ratio scripts so that by default they rescale to fit the screen after change the ratio. Finally, the most interesting to me of the default scripts changes, is that I added a pair of scripts to set the UI resolution for just NicePlayer.  This means that if you want to set the scale of NicePlayers interface to 300% you can, with out using Quartz Debug and without effecting any other applications. The ideal usage of this feature in my mind is if you have a large screen and a wireless mouse and you want to control it from across the room. But I&amp;#8217;m sure it helps with 30 inch screens upclose as well, I&amp;#8217;m sure there are other uses, it&amp;#8217;s always interesting to find out the creative things people use NicePlayer for.&lt;/p&gt;

	&lt;p&gt;Here is a picture at 300%, although it&amp;#8217;s on my macbook so screen the size isn&amp;#8217;t large enough to contain the menus but you get the idea.&lt;/p&gt;

	&lt;p&gt;&lt;a href=&quot;http://jay.tuley.name/files/NicePlayer300Percent.jpg&quot;&gt;&lt;img src=&quot;http://jay.tuley.name/files/NicePlayer300Percent.jpg&quot; width=&quot;640&quot; height=&quot;400&quot;&gt;&lt;/a&gt;&lt;/p&gt;

	&lt;p&gt;I&amp;#8217;m very excited to get resolution independence working on NicePlayer, it&amp;#8217;s something I tried to do on Tiger but I wasn&amp;#8217;t having success, but with the new Leopard docs I finally figured it out. Although the changes I made work for resolution independence on Tiger, there are some weird glitchy bugs in windowing behavior such that I don&amp;#8217;t recommend using it on Tiger.&lt;/p&gt;

	&lt;h3&gt;The Third Release?&lt;/h3&gt;

	&lt;p&gt;So there appear to be two significant bugs in 0.96 that have been reported. The first is that NicePlayer and Leopard Spaces aren&amp;#8217;t friends, I have some ideas of where to look to figure out what is going on, so I&amp;#8217;m hopeful, and if i do figure out I&amp;#8217;ll just release another small update 0.96.3 rather than waiting for 0.97. The other bug I&amp;#8217;d like to fix, but It&amp;#8217;s only been reported twice and I can&amp;#8217;t reproduce it, is that on Tiger some people have reported that the Volume icon shows up over the video and stays there on open and doesn&amp;#8217;t disapear, since I can&amp;#8217;t reproduced it, even though I have a Tiger install, it makes it kind of difficult. So if anyone has any clues to reproducing it, send preferences files or whatever, I&amp;#8217;d appreciate it.&lt;/p&gt;

 &lt;br /&gt;&lt;a href=&quot;http://jay.tuley.name/archives/2007/11/17/NicePlayer-0.96.X-the-Early-Leopard#extended&quot;&gt;Continue reading &quot;NicePlayer 0.96.X the Early Leopard&quot;&lt;/a&gt;
    </content:encoded>

    <pubDate>Sat, 17 Nov 2007 08:48:00 +0000</pubDate>
    <guid isPermaLink="false">http://jay.tuley.name/archives/2007/11/17/810</guid>
    <category>niceplayer</category>

</item>
<item>
    <title>&gt; cd to ... version 2.1.1 (just a little update)</title>
    <link>http://jay.tuley.name/archives/2007/02/25/cd-to-...-version-2.1.1-just-a-little-update</link>
    
    <comments>http://jay.tuley.name/archives/2007/02/25/cd-to-...-version-2.1.1-just-a-little-update#comments</comments>
    <wfw:comment>http://jay.tuley.name/wfwcomment.php?cid=808</wfw:comment>

    <slash:comments>9</slash:comments>
    <wfw:commentRss>http://jay.tuley.name/rss.php?version=2.0&amp;type=comments&amp;cid=808</wfw:commentRss>
    

    <author>nospam@example.com (Jay)</author>
    <content:encoded>
    	&lt;p&gt;So 2.1.1 fixes a bug when you have an apostrophe in the path for  Terminal.app and iTerm plugins. Just a little shell script whoops.  Therfore I recommend updating.&lt;/p&gt;

	&lt;p&gt;Also, for 2.1.1, a big thanks to Brian Koponen who contributed a plugin that enables support for PathFinder.  So now &amp;#8220;&gt;cd to &amp;#8230;&amp;#8221; can work exactly like &amp;#8220;Reveal in PathFinder&amp;#8221;,which is an applescript that is bundled with pathfinder but obvoiusly &amp;#8220;&gt;cd to&amp;#8221; is a &lt;span class=&quot;caps&quot;&gt;TON&lt;/span&gt; faster.&lt;/p&gt;

	&lt;p&gt;&lt;strong&gt;update:&lt;/strong&gt; Little bug in the build, the info plist didn&amp;#8217;t have the excutable name macro replaced, which made launch services upset, and wasn&amp;#8217;t noticeable from the Xcode since it would launch from the actual executable rather than the bundle. There is a new build out now.&lt;/p&gt; &lt;br /&gt;&lt;a href=&quot;http://jay.tuley.name/archives/2007/02/25/cd-to-...-version-2.1.1-just-a-little-update#extended&quot;&gt;Continue reading &quot;&amp;gt; cd to ... version 2.1.1 (just a little update)&quot;&lt;/a&gt;
    </content:encoded>

    <pubDate>Sun, 25 Feb 2007 02:37:00 +0000</pubDate>
    <guid isPermaLink="false">http://jay.tuley.name/archives/2007/02/25/808</guid>
    <category>cd to</category>

</item>
<item>
    <title>&gt; cd to ... version 2.1 (so soon?)</title>
    <link>http://jay.tuley.name/archives/2007/02/19/cd-to-...-version-2.1-so-soon</link>
    
    <comments>http://jay.tuley.name/archives/2007/02/19/cd-to-...-version-2.1-so-soon#comments</comments>
    <wfw:comment>http://jay.tuley.name/wfwcomment.php?cid=799</wfw:comment>

    <slash:comments>1</slash:comments>
    <wfw:commentRss>http://jay.tuley.name/rss.php?version=2.0&amp;type=comments&amp;cid=799</wfw:commentRss>
    

    <author>nospam@example.com (Jay)</author>
    <content:encoded>
    	&lt;p&gt;&lt;img src=&quot;http://jay.tuley.name/files/FlySketchWorkflow-2007.02.18_23.39.13.png&quot; align=&quot;right&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

	&lt;p&gt;So I had a few requests for &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/iterm.sourceforge.net/&#039;);&quot;  href=&quot;http://iterm.sourceforge.net/&quot;&gt;iTerm&lt;/a&gt; support, one request for &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/dickey.his.com/xterm/&#039;);&quot;  href=&quot;http://dickey.his.com/xterm/&quot;&gt;xterm&lt;/a&gt; support, and one request for &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/www.pollet.net/GLterm/&#039;);&quot;  href=&quot;http://www.pollet.net/GLterm/&quot;&gt;glterm&lt;/a&gt; support. And I thought about it, it would probably be easy, but I didn&amp;#8217;t want to add preferences to my little one click mini application&amp;#8212;it&amp;#8217;s a little gratuitous. I also didn&amp;#8217;t want to make a bunch of versions of the same program. However&amp;#8230;&lt;/p&gt;

	&lt;p&gt;I then remembered there is a user interface in the get info window for enabling &amp;amp; disabling plugins inside a app package. So I thought it would be fun to create a use case in which someone actually would have a need to utilize this user interface in addition to fixing my issues with adding this features.&lt;/p&gt;

	&lt;p&gt;I created a very simple plugin interface, and &amp;#8220;&gt;cd to&amp;#8230;&amp;#8221; only checks the built in plugin folder  (as that is the only directory that get info deals with &amp;#8212; it also means that duplicate copies can have different behaviors enabled). So to get support for iterm or xterm you just have to enable the correct plugin while disabling the others (&lt;span class=&quot;caps&quot;&gt;FYI&lt;/span&gt; though, if you have more than one plugin enabled it will open windows in each enabled plugin)&lt;/p&gt;

	&lt;p&gt;GLterm doesn&amp;#8217;t look supportable for any automated directory change, at least as far as I can tell, so that&amp;#8217;s why I only added xterm and iterm support.&lt;/p&gt;

	&lt;p&gt;Another small detail to note, about my xterm/X11 plugin, is that the script to launch the terminal is inside the X11_xterm.bundle&amp;#8217;s resource folder. So you can add xterm flags or even change the X11 terminal without recompiling. &lt;/p&gt;

	&lt;p&gt;&lt;strong&gt;v 2.1&lt;/strong&gt;
	&lt;ul&gt;
		&lt;li&gt;Plugin archtexture allowing support for other terminals&lt;/li&gt;
		&lt;li&gt;Default plugins for iTerm &amp;amp; X11/xterm&lt;/li&gt;
		&lt;li&gt;Terminal plugin will try to avoid opening two windows on terminal.app&amp;#8217;s launch&lt;/li&gt;
	&lt;/ul&gt;&lt;/p&gt; &lt;br /&gt;&lt;a href=&quot;http://jay.tuley.name/archives/2007/02/19/cd-to-...-version-2.1-so-soon#extended&quot;&gt;Continue reading &quot;&amp;gt; cd to ... version 2.1 (so soon?)&quot;&lt;/a&gt;
    </content:encoded>

    <pubDate>Mon, 19 Feb 2007 05:41:00 +0000</pubDate>
    <guid isPermaLink="false">http://jay.tuley.name/archives/2007/02/19/799</guid>
    <category>cd to</category>

</item>
<item>
    <title>&gt; cd to ... version 2.0 (ported to objective-c)</title>
    <link>http://jay.tuley.name/archives/2007/02/17/cd-to-...-version-2.0-ported-to-objective-c</link>
    
    <comments>http://jay.tuley.name/archives/2007/02/17/cd-to-...-version-2.0-ported-to-objective-c#comments</comments>
    <wfw:comment>http://jay.tuley.name/wfwcomment.php?cid=743</wfw:comment>

    <slash:comments>3</slash:comments>
    <wfw:commentRss>http://jay.tuley.name/rss.php?version=2.0&amp;type=comments&amp;cid=743</wfw:commentRss>
    

    <author>nospam@example.com (Jay)</author>
    <content:encoded>
    	&lt;p&gt;So I had this applescript, I wrote a long time ago, that i used for open a terminal window from the finder. It was a compiled applet that you could launch from the finder toolbar. The biggest problem (especially on my intel laptop) is that it&amp;#8217;s kind of slow to launch before it executes. &lt;/p&gt;

	&lt;p&gt;We&amp;#8217;ll now with version 2.0, it is super fast, because it&amp;#8217;s been ported to objective-c and sends apple-events by utilizing the &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/trac.macosforge.org/projects/appscript/&#039;);&quot;  href=&quot;http://trac.macosforge.org/projects/appscript/&quot;&gt;appscript bridge&lt;/a&gt; on macforge by &lt;span class=&quot;caps&quot;&gt;HAS&lt;/span&gt;.&lt;/p&gt;

	&lt;p&gt;I have a compiled universal binary and source of this application on &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/code.google.com/p/cdto/&#039;);&quot;  href=&quot;http://code.google.com/p/cdto/&quot;&gt;google code&lt;/a&gt; it&amp;#8217;s &lt;span class=&quot;caps&quot;&gt;MIT&lt;/span&gt; licensed, just to keep things simpler since the appscript framework is &lt;span class=&quot;caps&quot;&gt;MIT&lt;/span&gt; licensed, and my code is less than 20 lines so I&amp;#8217;m not concerned that it&amp;#8217;s not a copyleft licensed.&lt;/p&gt; &lt;br /&gt;&lt;a href=&quot;http://jay.tuley.name/archives/2007/02/17/cd-to-...-version-2.0-ported-to-objective-c#extended&quot;&gt;Continue reading &quot;&amp;gt; cd to ... version 2.0 (ported to objective-c)&quot;&lt;/a&gt;
    </content:encoded>

    <pubDate>Sat, 17 Feb 2007 07:25:16 +0000</pubDate>
    <guid isPermaLink="false">http://jay.tuley.name/archives/2007/02/17/743</guid>
    <category>cd to</category>

</item>
<item>
    <title>NicePlayer 0.95 the Shiny Penguin</title>
    <link>http://jay.tuley.name/archives/2007/02/05/NicePlayer-0.95-the-Shiny-Penguin</link>
    
    <comments>http://jay.tuley.name/archives/2007/02/05/NicePlayer-0.95-the-Shiny-Penguin#comments</comments>
    <wfw:comment>http://jay.tuley.name/wfwcomment.php?cid=732</wfw:comment>

    <slash:comments>9</slash:comments>
    <wfw:commentRss>http://jay.tuley.name/rss.php?version=2.0&amp;type=comments&amp;cid=732</wfw:commentRss>
    

    <author>nospam@example.com (Jay)</author>
    <content:encoded>
    	&lt;p&gt;Although NicePlayer is still Mac OS X only and will probably stay that way, it&amp;#8217;s now open source and what better animal than a penguin represent open source (even though it suggests linux)...plus NicePlayer&amp;#8217;s icon and widgets are shinier (they literally have a sheen now) so that&amp;#8217;s why this release is the Shiny Penguin&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#fn14067940884b972eef1a875&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;. &lt;/p&gt;

	&lt;p id=&quot;fn14067940884b972eef1a875&quot; class=&quot;footnote&quot;&gt;&lt;sup&gt;1&lt;/sup&gt; Previous releases were the Dark Horse and the Bad Wolf. &lt;/p&gt;

	&lt;h2&gt;Open Source&lt;/h2&gt;

	&lt;p&gt;NicePlayer is tri-licensed under the &lt;span class=&quot;caps&quot;&gt;MPL&lt;/span&gt;, &lt;span class=&quot;caps&quot;&gt;LGPL&lt;/span&gt;, &lt;span class=&quot;caps&quot;&gt;GPL&lt;/span&gt;. They are all copyleft licenses, &lt;span class=&quot;caps&quot;&gt;MPL&lt;/span&gt; (Mozilla Public Licenses)  is the least restrictive it terms of reuse. &lt;span class=&quot;caps&quot;&gt;MPL&lt;/span&gt; is not what &amp;#8220;GPL-haters&amp;#8221; like to call viral as it only pertains to the licensed code that you are modifying and not the rest of your projects code that is incorporating it.&lt;/p&gt;

	&lt;h2&gt;Shiny Controls&lt;/h2&gt;

	&lt;p&gt;I gave the controls sheen, they extend across the movie bounds continuously when the video is black it&amp;#8217;s more obvious that they are controls and not strange floating symbols.&lt;/p&gt;

	&lt;h2&gt;Subtitles&lt;/h2&gt;

	&lt;p&gt;I&amp;#8217;ve also added basic external subtitle support, it was something I wrote simple parsers for a year ago, but never added a renderer, I kept on putting it off, so finally decided to put it in this release get some feedback.&lt;/p&gt;

	&lt;p&gt;It&amp;#8217;s already been reported that I don&amp;#8217;t allow the encodings to be set for subtitles. When this was reported I figured it&amp;#8217;d automatically work with UTF-8, but it actually automatically treats it as a c string unless a &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/unicode.org/unicode/faq/utf_bom.html#25&#039;);&quot;  href=&quot;http://unicode.org/unicode/faq/utf_bom.html#25&quot;&gt;Byte Order Mark&lt;/a&gt; is at the front of the file. This typically doesn&amp;#8217;t get added for UTF-8 because it can mess things up for some kinds of files (though it does not in this case).&lt;/p&gt;

	&lt;p&gt;So the next version I will change it to the 10.4 api&amp;#8217;s, which have been improved for dealing with encodings. We probably will stick to making UTF-8 and UTF-16 the only guaranteed way of your encodings working (with out &lt;span class=&quot;caps&quot;&gt;BOM&lt;/span&gt; being necessary for UTF-8), because even if most subtitles out there aren&amp;#8217;t Unicode they should be, and it&amp;#8217;s not hard to convert (we may include a simple converter next release too), and that is preferable to adding a huge list of encodings in the preferences.&lt;/p&gt;

	&lt;h2&gt;Perian&lt;/h2&gt;

	&lt;p&gt;&lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/perian.org&#039;);&quot;  href=&quot;http://perian.org&quot;&gt;Perian&lt;/a&gt; has helped shape some of the features for this release. I&amp;#8217;ve been compiling from source seeing what is in store for version 1.0, such as matroska support. My test file had chapters,subtitles, and alternate audio all show up in QuickTime Player. So I added menus so they can be used with the CoreVideo engine in NicePlayer too. Also the current version of Perian has &lt;span class=&quot;caps&quot;&gt;FLV&lt;/span&gt; support, so we added an association for that file type so you can opened by double click.&lt;/p&gt;

	&lt;h2&gt;Virtual DVDs&lt;/h2&gt;

	&lt;p&gt;Another program that inspired a feature was &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/www.versiontracker.com/dyn/moreinfo/macosx/29968&#039;);&quot;  href=&quot;http://www.versiontracker.com/dyn/moreinfo/macosx/29968&quot;&gt;Virtual DVDs&lt;/a&gt;. Virtual DVDs allows you to wrap a VIDEO_TS folder in a bundle with the extension .vdvd which makes it double clickable from the finder to open in &lt;span class=&quot;caps&quot;&gt;DVD&lt;/span&gt; Player. So I adopted their convention so you that can double click one of those same .vdvd bundles to open in NicePlayer as well.&lt;/p&gt;

	&lt;h2&gt;Scary Transparency&lt;/h2&gt;

	&lt;p&gt;Finally last feature I&amp;#8217;d like to note is that we&amp;#8217;ve made it possible to make movie windows transparent. I&amp;#8217;m not sure there&amp;#8217;s a good reason for it (beyond a couple people asking for it), but then again it only can be invoked via applescript (so it doesn&amp;#8217;t clutter up the &lt;span class=&quot;caps&quot;&gt;GUI&lt;/span&gt;). We have a default script under the heading &amp;#8220;Just For Fun&amp;#8221;.&lt;/p&gt;

	&lt;h2&gt;Rundown&lt;/h2&gt;

	&lt;p&gt;Here&amp;#8217;s the official change list for 0.95:&lt;/p&gt;

	&lt;ul&gt;
		&lt;li&gt;100% Open Source (MPL/LGPL/&lt;span class=&quot;caps&quot;&gt;GPL&lt;/span&gt;)&lt;/li&gt;
		&lt;li&gt;Added support for Chapters, and enabling extra Audio and Video tracks for the Core * Video engine&lt;/li&gt;
		&lt;li&gt;Added basic support for external subtitle files
	&lt;ul&gt;
		&lt;li&gt;.ssa substation alpha,&lt;/li&gt;
		&lt;li&gt;.srt SubRip,&lt;/li&gt;
		&lt;li&gt;.sub MicroDVD&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
		&lt;li&gt;Added file type extension recognition for
	&lt;ul&gt;
		&lt;li&gt;.divx,&lt;/li&gt;
		&lt;li&gt;.vdvd (package around VIDEO_TS ala &amp;#8220;VIrtual DVDs&amp;#8221;),&lt;/li&gt;
		&lt;li&gt;.mkv (Matroska added in anticipation for future Perian support),&lt;/li&gt;
		&lt;li&gt;.ogg( for Theora/Ogg support provided by the xiph components),&lt;/li&gt;
		&lt;li&gt;.flv (for current perian support)&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
		&lt;li&gt;New fresh look&lt;/li&gt;
		&lt;li&gt;Added AppleScript-able Transparency, with a default script for applying it&lt;/li&gt;
		&lt;li&gt;Added preference for volume memory on creation of new windows&lt;/li&gt;
		&lt;li&gt;Added AppleScript vocabulary for determining full screen&lt;/li&gt;
		&lt;li&gt;Fixed bug that caused niceplayer to hang on quit after watching a &lt;span class=&quot;caps&quot;&gt;DVD&lt;/span&gt; on a Core2Duo Macbook&lt;/li&gt;
		&lt;li&gt;Fixed bug involving not being able to unmute&lt;/li&gt;
		&lt;li&gt;Fixed bug involving changing window level in fullscreen&lt;/li&gt;
		&lt;li&gt;Fixed bug in auto dvd launching script&lt;/li&gt;
		&lt;li&gt;Fixed bug that sometimes would cause movies to show up black when opened off a removable disk&lt;/li&gt;
		&lt;li&gt;Fixed various crashes&lt;/li&gt;
	&lt;/ul&gt;

 &lt;br /&gt;&lt;a href=&quot;http://jay.tuley.name/archives/2007/02/05/NicePlayer-0.95-the-Shiny-Penguin#extended&quot;&gt;Continue reading &quot;NicePlayer 0.95 the Shiny Penguin&quot;&lt;/a&gt;
    </content:encoded>

    <pubDate>Mon, 05 Feb 2007 04:00:00 +0000</pubDate>
    <guid isPermaLink="false">http://jay.tuley.name/archives/2007/02/05/732</guid>
    <category>niceplayer</category>
<category>open source</category>

</item>
<item>
    <title>STL-CocoaHeads Meeting (4/29) 2pm CST - Topics: Quartz * HUD * LLVM</title>
    <link>http://jay.tuley.name/archives/2006/04/26/STL-CocoaHeads-Meeting-429-2pm-CST-Topics-Quartz-HUD-LLVM</link>
    
    <comments>http://jay.tuley.name/archives/2006/04/26/STL-CocoaHeads-Meeting-429-2pm-CST-Topics-Quartz-HUD-LLVM#comments</comments>
    <wfw:comment>http://jay.tuley.name/wfwcomment.php?cid=129</wfw:comment>

    <slash:comments>2</slash:comments>
    <wfw:commentRss>http://jay.tuley.name/rss.php?version=2.0&amp;type=comments&amp;cid=129</wfw:commentRss>
    

    <author>nospam@example.com (Jay)</author>
    <content:encoded>
    	&lt;p&gt;&lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/cocoaheads.org/us/StLouisMissouri/index.html&#039;);&quot;  href=&quot;http://cocoaheads.org/us/StLouisMissouri/index.html&quot;&gt;Saint Louis CocoaHeads&lt;/a&gt; Meeting 4/29/06 2pm &lt;span class=&quot;caps&quot;&gt;CST&lt;/span&gt; @ &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/local.google.com/maps?f=q&amp;amp;amp;hl=en&amp;amp;amp;q=st.+louis+bread+company,10740+Sunset+Plaza&amp;amp;amp;cid=38627222,-90197778,5695931821771157128&amp;amp;amp;li=lmd&#039;);&quot;  href=&quot;http://local.google.com/maps?f=q&amp;amp;hl=en&amp;amp;q=st.+louis+bread+company,10740+Sunset+Plaza&amp;amp;cid=38627222,-90197778,5695931821771157128&amp;amp;li=lmd&quot;&gt;St. Louis Bread Company, 10740 Sunset Plaza, 63127 &lt;/a&gt;&lt;/p&gt;

	&lt;p&gt;Meetings are casual and we don&amp;#8217;t have to stick to topics, but here are some:&lt;/p&gt;

	&lt;p&gt;&lt;b&gt;* Programing with Quartz.&lt;/b&gt; I&amp;#8217;ll be bringing my copy of the book to show, it&amp;#8217;s a very good book. Although it&amp;#8217;s focused mainly on C, it&amp;#8217;s good to know what&amp;#8217;s going on behind the cocoa drawing classes, plus you can always use C directly in Objective-C, and the concepts directly transfer.&lt;br /&gt;
See Also: &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/www.elsevier.com/wps/find/bookdescription.cws_home/706409/description#description&#039;);&quot;  href=&quot;http://www.elsevier.com/wps/find/bookdescription.cws_home/706409/description#description&quot;&gt;Programing with Quartz by Gelphman and Laden&lt;/a&gt;&lt;/p&gt;

	&lt;p&gt;&lt;b&gt;* Resolution Independence.&lt;/b&gt; This is a hot topic these days with both higher dpi  and larger &lt;span class=&quot;caps&quot;&gt;LCD&lt;/span&gt; screens becoming more and more prevalent. Tiger has apis to support it, although most applications aren&amp;#8217;t ready for it. Cocoa gets a lot of support for free, but there are a few gotchas.  Also lately there have been several interesting post in Surfin Safari about the need to deal with High &lt;span class=&quot;caps&quot;&gt;DPI&lt;/span&gt; in web design and the ideas behind it transfer between that and cocoa ui design, not to mention as of Tiger your seeing more and more UI designed with &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt;.&lt;br /&gt;
See Also: &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/webkit.opendarwin.org/blog/&#039;);&quot;  href=&quot;http://webkit.opendarwin.org/blog/&quot;&gt;Surfin Safari&lt;/a&gt;&lt;/p&gt;

	&lt;p&gt;&lt;b&gt;* OpenHUD.&lt;/b&gt;&lt;br /&gt;
The &lt;span class=&quot;caps&quot;&gt;HUD&lt;/span&gt; user interface debuted in Motion, then showed up in iPhoto, and now is in nightly builds of Safari, IWeb and is starting to show up in closed source shareware apps. St. Louisan Andy Matuschak started an open source project to provide an open &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; for this must have &lt;span class=&quot;caps&quot;&gt;GUI&lt;/span&gt; style. Andy may or may not be able to come to the meeting this month, so we might just gloss over this topic and save it for another month.&lt;br /&gt;
See Also: &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/www.andymatuschak.org/articles/2006/03/21/opening-openhud&#039;);&quot;  href=&quot;http://www.andymatuschak.org/articles/2006/03/21/opening-openhud&quot;&gt;OpenHUD Intro&lt;/a&gt;&lt;/p&gt;

	&lt;p&gt;&lt;b&gt;* Real Universal Binary!&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
So I haven&amp;#8217;t seen this mentioned anywhere but the &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/www.LLVM.org&#039;);&quot;  href=&quot;http://www.LLVM.org&quot;&gt;LLVM&lt;/a&gt; project website, The Low Level Virtual Machine, released a new &lt;span class=&quot;caps&quot;&gt;GCC&lt;/span&gt; 4.0 frontend that currently only works on Mac OS X (Both &lt;span class=&quot;caps&quot;&gt;PPC&lt;/span&gt; &amp;amp; X86) and supports Objective-C/C++. If your unfamiliar with &lt;span class=&quot;caps&quot;&gt;LLVM&lt;/span&gt; it can compile C to a bytecode representation about the same size a x86 binary (includes a &lt;span class=&quot;caps&quot;&gt;JIT&lt;/span&gt; compiler too), the main goal of this project was to provide runtime optimizations and transformations, but there have been other extensions to this project such as providing memory safety for C programs. The implications of  adding memory safety to Objective-C would be mean it could overcome one of it&amp;#8217;s the biggest shortcomings compared to other modern programing languages. There are of lot of interesting potentials from this project and since Apple hired the lead developer last year, and now with the addition of objective-c support 4 months before the leopard preview, I think it&amp;#8217;s not a bad bet to assume Apple is targeting Leopard Objective-C features based on LLVM?&lt;/p&gt;

	&lt;p&gt;&lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/llvm.org/docs/ReleaseNotes.html#whatsnew&#039;);&quot;  href=&quot;http://llvm.org/docs/ReleaseNotes.html#whatsnew&quot;&gt;From the Release Notes &lt;/a&gt;:&lt;br /&gt;
&lt;blockquote&gt;&lt;span class=&quot;caps&quot;&gt;LVM&lt;/span&gt; 1.7 includes a brand new llvm-gcc, based on &lt;span class=&quot;caps&quot;&gt;GCC&lt;/span&gt; 4.0.1. This version of llvm-gcc solves many serious long-standing problems with llvm-gcc, including all of those blocked by the llvm-gcc 4 meta bug. In addition, llvm-gcc4 implements support for many new features, including &lt;span class=&quot;caps&quot;&gt;GCC&lt;/span&gt; inline assembly, generic vector support, &lt;span class=&quot;caps&quot;&gt;SSE&lt;/span&gt; and Altivec intrinsics, and several new &lt;span class=&quot;caps&quot;&gt;GCC&lt;/span&gt; attributes. Finally, llvm-gcc4 is significantly faster than llvm-gcc3, respects -O options, its -c/-S options correspond to GCC&amp;#8217;s (they emit native code), supports Objective C/C++, and it has debugging support well underway.&lt;/blockquote&gt;&lt;/p&gt; &lt;br /&gt;&lt;a href=&quot;http://jay.tuley.name/archives/2006/04/26/STL-CocoaHeads-Meeting-429-2pm-CST-Topics-Quartz-HUD-LLVM#extended&quot;&gt;Continue reading &quot;STL-CocoaHeads Meeting (4/29) 2pm CST - Topics: Quartz * HUD * LLVM&quot;&lt;/a&gt;
    </content:encoded>

    <pubDate>Wed, 26 Apr 2006 21:38:44 +0100</pubDate>
    <guid isPermaLink="false">http://jay.tuley.name/archives/2006/04/26/129</guid>
    <category>cocoaheads</category>

</item>
<item>
    <title>5 reasons not to choose a Creative Commons license for code</title>
    <link>http://jay.tuley.name/archives/2006/03/27/5-reasons-not-to-choose-a-Creative-Commons-license-for-code</link>
    
    <comments>http://jay.tuley.name/archives/2006/03/27/5-reasons-not-to-choose-a-Creative-Commons-license-for-code#comments</comments>
    <wfw:comment>http://jay.tuley.name/wfwcomment.php?cid=125</wfw:comment>

    <slash:comments>8</slash:comments>
    <wfw:commentRss>http://jay.tuley.name/rss.php?version=2.0&amp;type=comments&amp;cid=125</wfw:commentRss>
    

    <author>nospam@example.com (Jay)</author>
    <content:encoded>
    	&lt;p&gt;Although Creative Commons licenses are fine for many types of content, you should probably think twice before using it for code, and here are my top 5 reason why:&lt;/p&gt;

	&lt;p&gt;&lt;b&gt;5. Creative Commons has summaries for actual software licenses as well. &lt;/b&gt; &amp;#8212; It may only be &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/creativecommons.org/licenses/GPL/2.0/&#039;);&quot;  href=&quot;http://creativecommons.org/licenses/GPL/2.0/&quot;&gt;GPL&lt;/a&gt; and &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/creativecommons.org/licenses/LGPL/2.1/&#039;);&quot;  href=&quot;http://creativecommons.org/licenses/LGPL/2.1/&quot;&gt;LGPL&lt;/a&gt;, however, if the summary feature attracted you to Creative Commons and you liked the &lt;span class=&quot;caps&quot;&gt;GPL&lt;/span&gt; or &lt;span class=&quot;caps&quot;&gt;LGPL&lt;/span&gt; license but thought they were too long for the average person to read; it&amp;#8217;s not a bad reason to switch from Creative Commons. &lt;/p&gt;

	&lt;p&gt;&lt;b&gt;4. Creative Commons is pretty plainly &lt;span class=&quot;caps&quot;&gt;GPL&lt;/span&gt; incompatible. &lt;/b&gt; &amp;#8212; Even the least restrictive Creative Commons version has a clause that allows the original author to remove the original copyright notice from derivative works. This is a restriction beyond those offered in the &lt;span class=&quot;caps&quot;&gt;GPL&lt;/span&gt; thus you can&amp;#8217;t combine Creative Commons code with &lt;span class=&quot;caps&quot;&gt;GPL&lt;/span&gt;. This shrinks your Open Source target audience in the area of code reuse and contributions, but that&amp;#8217;s your decision. &lt;b&gt;See also&lt;/b&gt; &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/people.debian.org/~evan/ccsummary.html&#039;);&quot;  href=&quot;http://people.debian.org/~evan/ccsummary.html&quot;&gt;Debian-Legal Creative Commons Summary&lt;/a&gt;.  &lt;/p&gt;

	&lt;p&gt;&lt;b&gt;3. While the &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/creativecommons.org/licenses/by/2.5/&#039;);&quot;  href=&quot;http://creativecommons.org/licenses/by/2.5/&quot;&gt;Creative Commons Attibution summary&lt;/a&gt; reads like the new &lt;span class=&quot;caps&quot;&gt;BSD&lt;/span&gt; license, it&amp;#8217;s a summary, not a license, read the &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/creativecommons.org/licenses/by/2.5/legalcode&#039;);&quot;  href=&quot;http://creativecommons.org/licenses/by/2.5/legalcode&quot;&gt;actual license&lt;/a&gt; you may not like it.&lt;/b&gt; &amp;#8212; If it turns out all you liked was the summary, you should have used the &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/www.opensource.org/licenses/bsd-license.php&#039;);&quot;  href=&quot;http://www.opensource.org/licenses/bsd-license.php&quot;&gt;new &lt;span class=&quot;caps&quot;&gt;BSD&lt;/span&gt; license&lt;/a&gt;, the &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/www.opensource.org/licenses/mit-license.php&#039;);&quot;  href=&quot;http://www.opensource.org/licenses/mit-license.php&quot;&gt;&lt;span class=&quot;caps&quot;&gt;MIT&lt;/span&gt; license&lt;/a&gt;, or the&lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/www.opensource.org/licenses/UoI-NCSA.php&#039;);&quot;  href=&quot;http://www.opensource.org/licenses/UoI-NCSA.php&quot;&gt; U of I license&lt;/a&gt;, they are all pretty much the same and you don&amp;#8217;t have to worry about summaries (they are easy to read).  &lt;/p&gt;

	&lt;p&gt;&lt;b&gt;2. Not &lt;span class=&quot;caps&quot;&gt;OSI&lt;/span&gt; approved, and for good reason.&lt;/b&gt; &amp;#8212; Nothing in the license sounds remotely like it could apply to software, and it&amp;#8217;s not very neutral in it&amp;#8217;s description of covered works. Sure if you change a word here and there, maybe it could apply to software, but if you have to change words around to make it work, it&amp;#8217;s a pretty poor choice for your open source software. &lt;b&gt;See also&lt;/b&gt; &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/www.opensource.org/docs/definition.php&#039;);&quot;  href=&quot;http://www.opensource.org/docs/definition.php&quot;&gt;Open Source Definition&lt;/a&gt;. &lt;b&gt;See also &lt;/b&gt;&lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/www.opensource.org/licenses/&#039;);&quot;  href=&quot;http://www.opensource.org/licenses/&quot;&gt;list of &lt;span class=&quot;caps&quot;&gt;OSI&lt;/span&gt; approved licenses&lt;/a&gt;. &lt;/p&gt;

	&lt;p&gt;&lt;b&gt;1. The &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/creativecommons.org/faq#Can_I_use_a_Creative_Commons_license_for_software?&#039;);&quot;  href=&quot;http://creativecommons.org/faq#Can_I_use_a_Creative_Commons_license_for_software?&quot;&gt;Creative Commons F.A.Q.&lt;/a&gt; tells you not to use it for software.&lt;/b&gt; &amp;#8212; And I can&amp;#8217;t think of a better reason than that.&lt;/p&gt; &lt;br /&gt;&lt;a href=&quot;http://jay.tuley.name/archives/2006/03/27/5-reasons-not-to-choose-a-Creative-Commons-license-for-code#extended&quot;&gt;Continue reading &quot;5 reasons not to choose a Creative Commons license for code&quot;&lt;/a&gt;
    </content:encoded>

    <pubDate>Mon, 27 Mar 2006 20:53:52 +0100</pubDate>
    <guid isPermaLink="false">http://jay.tuley.name/archives/2006/03/27/125</guid>
    <category>open source</category>

</item>
<item>
    <title>Class Clusters</title>
    <link>http://jay.tuley.name/archives/2006/03/08/Class-Clusters</link>
    
    <comments>http://jay.tuley.name/archives/2006/03/08/Class-Clusters#comments</comments>
    <wfw:comment>http://jay.tuley.name/wfwcomment.php?cid=124</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://jay.tuley.name/rss.php?version=2.0&amp;type=comments&amp;cid=124</wfw:commentRss>
    

    <author>nospam@example.com (Jay)</author>
    <content:encoded>
    &lt;h4&gt;Recently Elsewhere&lt;/h4&gt;

	&lt;p&gt;&lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/mooseyard.com/Jens/2006/03/cocoa-collection-subclassing&#039;);&quot;  href=&quot;http://mooseyard.com/Jens/2006/03/cocoa-collection-subclassing&quot;&gt;Cocoa collection subclassing | Jens/Log&lt;/a&gt;  disagrees &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/borkware.com/rants/agentm/collection-subclassing/&#039;);&quot;  href=&quot;http://borkware.com/rants/agentm/collection-subclassing/&quot;&gt;Faux Collection Class Subclassing | AgentM&lt;/a&gt; and both have some bits on class clusters. AgentM&amp;#8217;s is a rant about not being able to easily subclass collections, which I am sympathetic too recalling the joy of programing in smalltalk with its rich collection hierarchy. Jen&amp;#8217;s is basically a response saying Class Clusters can be frustrating but their okay, just drink the koolade AgemtM. If you explain Class Clusters to someone, they makes sense, but when you try to use Apple&amp;#8217;s or don&amp;#8217;t know they are there, frustrating things can happen, and I don&amp;#8217;t think that it&amp;#8217;s really the class clusters fault. Making a composite class by wrapping or forwarding messages isn&amp;#8217;t that much of a hassle, subclassing anything requires some knowledge of the class and Apple does document approaches to subclass class clusters, so I&amp;#8217;m on the koolade camp on AgentM&amp;#8217;s rant. However, I believe there are some bugs in the implementation of a few of Apple&amp;#8217;s class clusters that cause many to think that all Class Clusters are evil.&lt;br /&gt;
&lt;h4&gt;FUD&lt;/h4&gt;&lt;/p&gt;

	&lt;p&gt;I think there&amp;#8217;s a lot of fear, uncertainty, and doubt in regards to class clusters. There really shouldn&amp;#8217;t be though, Apple has a nice page describing the benefits of Class Clusters &amp;#8212; &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/developer.apple.com/documentation/Cocoa/Conceptual/CocoaObjects/Articles/ClassClusters.html&#039;);&quot;  href=&quot;http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaObjects/Articles/ClassClusters.html&quot;&gt;Cocoa Objects: Class Clusters&lt;/a&gt;&lt;/p&gt;

	&lt;p&gt;See a class cluster really is really just a sneaky use of a Factory Method (&lt;span class=&quot;caps&quot;&gt;GOF&lt;/span&gt; 107) to instantiate a subclass from an abstract superclass. It&amp;#8217;s sneaky because its hides it all. &lt;i&gt;alloc&lt;/i&gt;, rather than actually allocating, returns a Creator (probably a singleton) and &lt;i&gt;init&lt;/i&gt; actually allocates your real product and returns it. As demonstrated here:&lt;/p&gt;

&lt;pre lang=&quot;objc&quot;&gt;
int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    id obj =[NSArray alloc];
    NSLog(NSStringFromClass([obj class]));
    NSLog(NSStringFromClass([[obj init] class]));
    [pool release];
    return 0;
}
&lt;/pre&gt;

&lt;pre&gt;
2006-03-17 22:55:15.100 TestDataTypes[6105] NSPlaceholderArray
2006-03-17 22:55:15.101 TestDataTypes[6105] NSCFArray
&lt;/pre&gt;

	&lt;p&gt;This is all good, because the classes returned are all subclasses and being the good little object oriented programers we are, we never check what a class actually is. Instead, when need to runtime type check it&amp;#8217;s only to determine if it&amp;#8217;s a subclass or if it responds to a method or protocol and that should be just fine with class clusters.&lt;/p&gt;

	&lt;p&gt;If only using standard best practices when runtime type checking would keep us safe, unfortunately a few of Apple&amp;#8217;s class clusters, mainly collection classes,  are implemented in such a way that they break expected inheritance and expected polymorphism by advertising the wrong public interface for the returned private subclass (I don&amp;#8217;t know if this was the case for NeXT or not, but I suspect it wasn&amp;#8217;t). I&amp;#8217;ll continue with some examples of where this implementation goes wrong.&lt;/p&gt;

&lt;h4&gt; Dumb Responses from Class Clusters with Multiple Public Superclasses&lt;/h4&gt;

	&lt;p&gt;Here&amp;#8217;s a Pop Quiz: What should this statement return? &lt;/p&gt;

&lt;pre lang=&quot;objc&quot;&gt;
[[NSArray array] isKindOfClass:[NSMutableArray class]];
&lt;/pre&gt;

	&lt;p&gt;Ideally it should return &lt;b&gt;false&lt;/b&gt; because when we see the documentation on these public abstract classes, NSMutableArray inherits from NSArray.&lt;/p&gt;

	&lt;p&gt;&lt;img src=&#039;http://indyjt.com/img/FlySketchWorkflow-2006.03.17%2023.11.03.jpg&#039; /&gt;&lt;/p&gt;

	&lt;p&gt;However, actually this statement returns &lt;b&gt;true&lt;/b&gt; because the private subclasses returned for both public abstract superclasses are the same class inherited from NSMutableArray known as NSCFArray.&lt;/p&gt;

	&lt;p&gt;&lt;img src=&#039;http://indyjt.com/img/FlySketchWorkflow-2006.03.17%2023.12.09.jpg&#039; /&gt;&lt;/p&gt;

	&lt;p&gt;Okay so the purpose of having the same class is for easy toll free bridging with Core Foundation, but you know, as long as the instance variables are the same, is Core Foundation really going to care about new methods or a different hierarchy in obj-c land? I&amp;#8217;m thinking no in theory, but I&amp;#8217;ve not tested and I&amp;#8217;m much happier not digging into the C-ness of Obj-C and someone can prove me wrong or right if they wish. However, if you really really wanted to keep the same private class type between the two interfaces, you can always fake the expected hierarchy by making &lt;i&gt;isKindOfClass:&lt;/i&gt; call &lt;i&gt;isSubclassOfClass:&lt;/i&gt; on the appropriate abstract superclass&amp;#8217;s metaclass, and really no one would be the wiser, Core Foundation or otherwise.&lt;/p&gt;

	&lt;p&gt;That was problem #1, and so you might be thinking to yourself well I don&amp;#8217;t test for inheritance with cocoa programing often, most of the time I&amp;#8217;ll test for specific methods out of habit, because cocoa programers tend to use informal protocols rather than having deep hierarchies anyway, so it&amp;#8217;s not that big of a deal.&lt;/p&gt;

	&lt;p&gt;So our second pop quiz: What is the result of this statement?&lt;/p&gt;

&lt;pre lang=&quot;objc&quot;&gt;
[[NSArray array] respondsToSelector:@selector(addObject:)];
&lt;/pre&gt;

	&lt;p&gt;NSArray is not supposed to respond to &lt;i&gt;addObject:&lt;/i&gt;. I know that, you know that, but a program is generally going to believe &lt;i&gt;respondsToSelector:&lt;/i&gt; over what we think, and &lt;i&gt;respondsToSelector:&lt;/i&gt; says true. Of course if you run this line:&lt;/p&gt;

&lt;pre lang=&quot;objc&quot;&gt;
[[NSArray array] addObject:@&amp;#8220;test&amp;#8221;];
&lt;/pre&gt;

	&lt;p&gt;you get an exception. Think about when you have a bunch of objects in a collection with various types, some may respond to &lt;i&gt;addObject:&lt;/i&gt;, some don&amp;#8217;t, and you want to use runtime checking to manipulate them appropriately. How are you suppose to take advantage of polymorphism of this method in this case without being able to trust &lt;i&gt;respondsToSelector:&lt;/i&gt;.&lt;/p&gt;

	&lt;p&gt;There are simple work arounds to these problems, because they are only a handful of classes, but this is clearly a poor implementation of a class cluster, and I haven&amp;#8217;t tested every class but I think all Mutable-NonMutable class hierarchies in Foundation on OS X suffer from this bug (Although &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/GSArray.m?rev=22472&amp;amp;view=markup&#039;);&quot;  href=&quot;http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/GSArray.m?rev=22472&amp;view=markup&quot;&gt;GNUStep&lt;/a&gt; is &lt;span class=&quot;caps&quot;&gt;A-OK&lt;/span&gt; from looking at the source), and I don&amp;#8217;t think there&amp;#8217;s a reason not to fix it, being that they are class clusters, all apple needs to modify are the private subclasses and people aren&amp;#8217;t going to be using those methods currently because they return the wrong values that aren&amp;#8217;t useful when wrong.&lt;/p&gt;

&lt;h4&gt;Demonstration of Problem and Fixability&lt;/h4&gt;

	&lt;p&gt;I did write a few Unit Tests to clearly demonstrate this problem with NSArray. It also has a second target called ProperClassCluster that overrides some NSCFArray methods (using categories) to fix responses in inheritance &amp;amp; method testing. In that target I also swizzled the &lt;i&gt;addObject:&lt;/i&gt; method to provide an example of returning the correct exception when calling a method that doesn&amp;#8217;t exist on an NSArray. A real fix wouldn&amp;#8217;t require these hacks, but this works for demonstration purposes. Download &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/indyjt.com/shoebox/ProperClassCluster.zip&#039;);&quot;  href=&quot;http://indyjt.com/shoebox/ProperClassCluster.zip&quot;&gt;ProperClassCluster.zip&lt;/a&gt; (20k)&lt;/p&gt; &lt;br /&gt;&lt;a href=&quot;http://jay.tuley.name/archives/2006/03/08/Class-Clusters#extended&quot;&gt;Continue reading &quot;Class Clusters&quot;&lt;/a&gt;
    </content:encoded>

    <pubDate>Wed, 08 Mar 2006 14:25:00 +0000</pubDate>
    <guid isPermaLink="false">http://jay.tuley.name/archives/2006/03/08/124</guid>
    <category>cocoa</category>
<category>object oriented design</category>
<category>programming</category>

</item>
<item>
    <title>Yojimbo &quot;Your effortless, reliable information organizer...&quot;</title>
    <link>http://jay.tuley.name/archives/2006/01/31/Yojimbo-Your-effortless,-reliable-information-organizer...</link>
    
    <comments>http://jay.tuley.name/archives/2006/01/31/Yojimbo-Your-effortless,-reliable-information-organizer...#comments</comments>
    <wfw:comment>http://jay.tuley.name/wfwcomment.php?cid=123</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://jay.tuley.name/rss.php?version=2.0&amp;type=comments&amp;cid=123</wfw:commentRss>
    

    <author>nospam@example.com (Jay)</author>
    <content:encoded>
    &lt;p&gt;&lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/www.gusmueller.com/blog/archives/2006/1/23.html#1419&#039;);&quot;  href=&quot;http://www.gusmueller.com/blog/archives/2006/1/23.html#1419&quot;&gt;Yojimbo &amp;#8220;Your effortless, reliable information organizer&amp;#8230;&lt;/a&gt;: &amp;#8220;&lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/barebones.com/products/yojimbo/&#039;);&quot;  href=&quot;http://barebones.com/products/yojimbo/&quot;&gt;Yojimbo&lt;/a&gt; &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;(Via &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/www.gusmueller.com/blog/&#039;);&quot;  href=&quot;http://www.gusmueller.com/blog/&quot;&gt;[GusMueller blog]&lt;/a&gt;.)&lt;/p&gt;

	&lt;p&gt;So Yojimbo seems to be just what I&amp;#8217;m looking for and I&amp;#8217;m glad Gus pointed it out. However, I&amp;#8217;m not sure if it really is a competing product with VoodooPad as he suggests. YoJimbo seems more like shoe box where you stash stuff while VoodooPad is more of a notebook, something you are constantly changing, revising, scratching out, rather than just storing for later use. I could really really use Yojimbo, I like to stash stuff, but the reason I&amp;#8217;m not going to buy it is that it has zero Automator or AppleScript support, WTF! What I really want to be able to do is store my &lt;span class=&quot;caps&quot;&gt;PDF&lt;/span&gt; web Receipts and Categorize them in on step from the print to pdf menu. Oh well I guess I can wait, as it&amp;#8217;s only version 1.0.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Tue, 31 Jan 2006 21:59:24 +0000</pubDate>
    <guid isPermaLink="false">http://jay.tuley.name/archives/2006/01/31/123</guid>
    
</item>
<item>
    <title>Music Brainz: Picard and libtunepimp</title>
    <link>http://jay.tuley.name/archives/2006/01/29/Music-Brainz-Picard-and-libtunepimp</link>
    
    <comments>http://jay.tuley.name/archives/2006/01/29/Music-Brainz-Picard-and-libtunepimp#comments</comments>
    <wfw:comment>http://jay.tuley.name/wfwcomment.php?cid=118</wfw:comment>

    <slash:comments>4</slash:comments>
    <wfw:commentRss>http://jay.tuley.name/rss.php?version=2.0&amp;type=comments&amp;cid=118</wfw:commentRss>
    

    <author>nospam@example.com (Jay)</author>
    <content:encoded>
    &lt;p&gt;&lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/blog.musicbrainz.org/archives/2006/01/releases_picard_2.html&#039;);&quot;  href=&quot;http://blog.musicbrainz.org/archives/2006/01/releases_picard_2.html&quot;&gt;Releases: Picard and libtunepimp&lt;/a&gt;: &amp;#8220;We released the 0.6.0 version of Picard today &amp;#8212; this release fixes many bugs and adds the much anticipated mp4, mpc and wma plugins! Also included in this release are support for generating cuesheets, M3U, &lt;span class=&quot;caps&quot;&gt;PLS&lt;/span&gt; and &lt;span class=&quot;caps&quot;&gt;XSPF&lt;/span&gt; playlists&amp;#8230;.&amp;#8221;&lt;/p&gt;

&lt;p&gt;(Via &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/blog.musicbrainz.org/&#039;);&quot;  href=&quot;http://blog.musicbrainz.org/&quot;&gt;MusicBrainz Blog&lt;/a&gt;.)&lt;/p&gt;

	&lt;p&gt;So it looks like official MusicBrainz client has mp4 support now, unfortunately the change log doesn&amp;#8217;t mention any of the OS X problems being resolved. These problems are &lt;span class=&quot;caps&quot;&gt;GUI&lt;/span&gt; related though, and otherwise the application Picard (python) and backend libtunepimp (c++) should otherwise work for OS X as far as the last time I tested. A Cocoa gui via the &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/pyobjc.sourceforge.net/&#039;);&quot;  href=&quot;http://pyobjc.sourceforge.net/&quot;&gt;PyObjc&lt;/a&gt; Bridge might be a good option for some one out there wanting a full MusicBrainz client. iEatBrainz is a bit beyond resurrecting code wise (It does still work, but changes by Apple or MusicBrainz will certainly break someday in the future), while parts of it could be harvested, I&amp;#8217;d suggest to anyone thinking about it to strongly consider a cocoa gui for Picard as it has a lot more features and with MusicBrainz fingerprinting up in the air it&amp;#8217;s a much safer approach.&lt;/p&gt; &lt;br /&gt;&lt;a href=&quot;http://jay.tuley.name/archives/2006/01/29/Music-Brainz-Picard-and-libtunepimp#extended&quot;&gt;Continue reading &quot;Music Brainz: Picard and libtunepimp&quot;&lt;/a&gt;
    </content:encoded>

    <pubDate>Sun, 29 Jan 2006 15:01:09 +0000</pubDate>
    <guid isPermaLink="false">http://jay.tuley.name/archives/2006/01/29/118</guid>
    <category>ieatbrainz</category>
<category>mac</category>
<category>musicbrainz</category>

</item>

</channel>
</rss>