<?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>Joe Song &#187; josephsong</title> <atom:link href="http://joesong.com/author/josephsong/feed/" rel="self" type="application/rss+xml" /><link>http://joesong.com</link> <description>Development, music.</description> <lastBuildDate>Tue, 22 Jun 2010 04:37:09 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.0</generator> <item><title>Finding the Lala.com Replacement</title><link>http://joesong.com/2010/06/finding-the-lala-com-replacement/</link> <comments>http://joesong.com/2010/06/finding-the-lala-com-replacement/#comments</comments> <pubDate>Tue, 22 Jun 2010 04:37:09 +0000</pubDate> <dc:creator>josephsong</dc:creator> <category><![CDATA[Music]]></category> <category><![CDATA[Reviews]]></category> <category><![CDATA[apple]]></category> <category><![CDATA[audiobox.fm]]></category> <category><![CDATA[Grooveshark.com]]></category> <category><![CDATA[lala.com]]></category> <category><![CDATA[maestro.fm]]></category> <category><![CDATA[mp3tunes.com]]></category> <category><![CDATA[mSpot.com]]></category> <category><![CDATA[musicplayer.fm]]></category> <category><![CDATA[psonar.com]]></category><guid
isPermaLink="false">http://joesong.com/?p=1012</guid> <description><![CDATA[A review of streaming music library sites as seen on a quest to replace lala.com.]]></description> <content:encoded><![CDATA[<p>As you know, Apple recently pulled the lala.com rug out from underneath our feet. They&#8217;ve yet to even mention a replacement, so I went looking elsewhere. <a
onclick="alert('I ended up with AudioBox.fm');return false;" href="#">Click here to cut to the chase.</a></p><p>I was a pretty big lala evangelist; I told just about everyone I thought would care all about it. I really liked their approach to music, especially:</p><ol
class="default_list"><li>Unlimited space and streaming. You could upload and listen to as much as you like.</li><li>The music matcher. You didn&#8217;t have to upload every file you had. It would scan your files and match them to ones existing on the server. This saved you from having to upload GBs of music and had the added benefit of making the service better the more that people used it.</li><li>Listening to any track once for free. I&#8217;ve never listened to more new releases (or bought more) than I did through lala.</li><li>Web-only songs. 10 cents bought you the right to play a song as much as you wanted to but only through the web. I usually have an Internet connection wherever I&#8217;m listening, so that was just great. Would I have bought Looking Glass&#8217; &#8220;Brandy (You&#8217;re a Fine Girl)&#8221; for more than 10 cents?</li></ol><p>There were some drawbacks, of course:</p><ol
class="default_list"><li>The music matcher sometimes mismatched. I have some artists in my collection that have extensive live catalogs (if you know what I mean) and often, trying to play the studio version of the song, I would get the live version instead. Nothing to do about it.</li><li>The player itself was Flash-based. So, absolutely no mobile support on iPhone or Android.</li><li>Limited catalog. There were plenty of songs that were available on iTunes or Amazon MP3 store that just couldn&#8217;t be bought from lala. Of course, you could upload them after you bought them elsewhere.</li></ol><p>Anyway, Steve Jobs said, &#8220;Enough of people not buying music through iTunes!&#8221; and here we are without lala. What&#8217;s the criteria for its replacement?</p><ol
class="default_list"><li>Enough space. I have a lot of music. Around 90GB worth. Though, a lot of that pretty much never gets listened to.</li><li>Price. Lala was free to use and had cheap rates on songs if you wanted to buy some.</li><li>Interface. I&#8217;m a developer, so it had to have a well tuned and usable interface.</li><li>Mobile support. I don&#8217;t travel as much as I would like, but I do get out of town. I wanted something that would play my music over 3G (or 4 when it comes to town).</li><li>Ability to upload my own songs. They just don&#8217;t have enough <a
href="http://kgw.me" target="_blank">Kleenex Girl Wonder</a> on Rhapsody.</li></ol><p>Here&#8217;s my thoughts on what I saw in my search for a site that would stream my music. I&#8217;m going to list them in what I think is the chronological order I tried them in.</p><p>First of all, some overall notes:</p><ul
class="default_list"><li>Nobody else has the web-only song agreement with the record companies. Just get that out of your hopes bucket right now. It ain&#8217;t happening (at least not yet).</li><li>Nobody seems to have worked out the &#8220;start loading the next song as the last one ends&#8221; thing that let the lala player roll through songs continuously. Must be a bandwidth thing, but it seems like something someone could figure out.</li><li>Nobody&#8217;s going to give it all to you for free anymore. Take your lumps.</li><li>None of the services have a store attached to them at this point. You&#8217;ll have to go back to iTunes or Amazon.</li></ul><h3><a
href="http://Maestro.fm" target="_blank">Maestro.fm</a></h3><p><a
href="http://joesong.com/wp-content/uploads/2010/06/meastrofm.png"><img
class="alignright size-medium wp-image-1013" title="meastrofm" src="http://joesong.com/wp-content/uploads/2010/06/meastrofm-300x138.png" alt="" width="300" height="138" /></a>Maestro.fm is a service that allows you to stream your music from your home library to another machine. Meaning, it doesn&#8217;t keep copies of them and if your home computer or home Internet connection is down, your music is unavailable. Or, if your home connection is slow or spotty, so is your stream.</p><p>That said, there are no space limitations and it is free to use. But, my upstream connection is not that reliable and, really, that seems un-green to have my machine on all the time just to serve songs.</p><p>It has some interesting ideas and some cool social networking built in. The player is pretty good and there is a iPhone app.</p><h3><a
href="http://MusicPlayer.fm" target="_blank">MusicPlayer.fm</a></h3><p>Don&#8217;t bother. #underconstruction</p><h3><a
href="http://www.mspot.com/" target="_blank">mSpot.com</a></h3><p><a
href="http://joesong.com/wp-content/uploads/2010/06/mspotcom.png"><img
class="alignright size-medium wp-image-1014" title="mspotcom" src="http://joesong.com/wp-content/uploads/2010/06/mspotcom-300x105.png" alt="" width="300" height="105" /></a>The new guys, mSpot was featured at Google I/O this year. Seems like a promising service, but the don&#8217;t have a lot of the site working yet or even the service levels set, so I&#8217;m going to have to come back to it. For now, it is for beta testers <em>only</em>. It is hard to tell if Google is behind them or just cheering them on, but hopefully the big G comes up with music service or gets on board with one. Especially since they had eyes for lala before Apple did.</p><p>The player is OK, but could use a little Information Architecture and a little more contrast. They do have an Android app, which is nice.</p><p>The installable uploader and the web player have a trick, which is that the system only uploads songs you have requested. So, you can see your whole library, but the first time you try to play a particular song it will have to be uploaded (automatically) from your home machine. This paradigm could be nice since you have only a little space right now (2-4GB) and, theoretically, it would just keep the top 2-4GB or songs you have played recently. You know what, I haven&#8217;t made up my mind about this feature(?) yet.</p><h3><a
href="http://www.mp3tunes.com" target="_blank">mp3tunes.com</a></h3><p><a
href="http://joesong.com/wp-content/uploads/2010/06/mp3tunescom.png"><img
class="alignright size-medium wp-image-1015" title="mp3tunescom" src="http://joesong.com/wp-content/uploads/2010/06/mp3tunescom-300x271.png" alt="" width="300" height="271" /></a>The old guys, these guys have been around for a while: Five years. But I&#8217;m not sure if that serves them well or not. I stuck with this fairly long, like two weeks, and I mostly liked it. It has the ability to upload video and stream that back, which feels like a great idea but I never used it.</p><p>The default player wastes absolutely acres of space with too-big fonts and too much padding. It is hard to see much once you have more than a few artists in there. They make a nice effort by having several player skins (well, they&#8217;re more complex than skins, really) but they kind of all have this whitespace problem. I mean, I&#8217;m not using the site for readability—I want to see the lists. And, if I started and stopped too much it quit queuing songs.</p><p>They do have mobile apps and an installable uploader which is nice. Plus, 10GB of space for free holds a pretty fair amount of music, or you can upgrade 50GB for $40 per year.</p><h3><a
href="http://grooveshark.com" target="_blank">Grooveshark.com</a></h3><p><a
href="http://joesong.com/wp-content/uploads/2010/06/groovesharkcom.png"><img
class="alignright size-medium wp-image-1016" title="groovesharkcom" src="http://joesong.com/wp-content/uploads/2010/06/groovesharkcom-300x244.png" alt="" width="300" height="244" /></a>This one&#8217;s got some press, too, and it is pretty good. The player and queuing system is solid but, like mp3tunes, the designers got to take too much control of this one and there is lots and lots of wasted space. So much that if you have a smaller monitor you can&#8217;t read the full names of songs. They claim that this particular problem is fixed for VIPs (paid customers) but I had a hard time believing that them based on my free account.</p><p>They have apps for most mobile platforms, but only for VIPs. The uploader is a java applet that needs a little more work, especially when getting music off a network share.</p><h3><a
href="http://psonar.com" target="_blank">Psonar.com</a></h3><p>I can&#8217;t remember why I left them. And, now their site is erroring to MySpace. Maybe they are connected. Oh, wait, I remembered. No mobile streaming support. If that isn&#8217;t important to you, it seems like a promising service. The player needs a lot a work and a little double-click-ability.</p><h3><a
href="http://audiobox.fm" target="_blank">AudioBox.fm</a></h3><p><a
href="http://joesong.com/wp-content/uploads/2010/06/audioboxcom.png"><img
class="alignright size-medium wp-image-1017" title="audioboxcom" src="http://joesong.com/wp-content/uploads/2010/06/audioboxcom-300x247.png" alt="" width="300" height="247" /></a>And now, the moment you&#8217;ve all been waiting for: an acceptable service. First off, it ain&#8217;t free, like I said it wouldn&#8217;t be. Well, there is a free 1GB plan, but that&#8217;s not really enough, is it?</p><p>First off: no Flash. This mother is HTML 5 though and through and therefore after my own heart. It is just getting started, feature-wise, but seems to actually be in development (which not all of the others are). The marketplace may or may not ever be coming as wells as the installable uploader. For now, you have to upload a folder at a time (which is a real pain). But the reliability of the the player, the layout of the the library, the editablity of tracks all make up for it for me. Especially after all the other sites.</p><p>It needs a viewable queue and a real uploader / syncronizer. But it has an Android streaming app that is pretty usable. It also has a full API so if you are an enterprising iPhone app developer you could make one.</p><p>The plan prices are pretty reasonable with the Basic at just $4 a month.</p><h2>In the end&#8230;</h2><p>I&#8217;m still looking but more slowly. I&#8217;m pretty happy with audiobox.fm at this point and don&#8217;t feel like I need to keep the full-on search.</p><style>.tblGenFixed td {padding:0 3px;overflow:hidden;white-space:normal;letter-spacing:0;word-spacing:0;background-color:#fff;z-index:1;border-top:0px none;border-left:0px none;border-bottom:1px solid #CCC;border-right:1px solid #CCC;} .dn {display:none} .tblGenFixed td.s0 {background-color:white;font-family:arial,sans,sans-serif;font-size:100.0%;font-weight:normal;font-style:normal;color:#000000;text-decoration:none;text-align:left;vertical-align:bottom;white-space:normal;overflow:hidden;text-indent:0px;padding-left:3px;border-top:1px solid #CCC;border-right:1px solid #CCC;border-bottom:1px solid #CCC;border-left:1px solid #CCC;} .tblGenFixed td.s2 {background-color:white;font-family:arial,sans,sans-serif;font-size:100.0%;font-weight:normal;font-style:normal;color:#000000;text-decoration:none;text-align:left;vertical-align:bottom;white-space:normal;overflow:hidden;text-indent:0px;padding-left:3px;border-right:1px solid #CCC;border-bottom:1px solid #CCC;border-left:1px solid #CCC;} .tblGenFixed td.s1 {background-color:white;font-family:arial,sans,sans-serif;font-size:100.0%;font-weight:normal;font-style:normal;color:#000000;text-decoration:none;text-align:left;vertical-align:bottom;white-space:normal;overflow:hidden;text-indent:0px;padding-left:3px;border-top:1px solid #CCC;border-right:1px solid #CCC;border-bottom:1px solid #CCC;} .tblGenFixed td.s3 {background-color:white;font-family:arial,sans,sans-serif;font-size:100.0%;font-weight:normal;font-style:normal;color:#000000;text-decoration:none;text-align:left;vertical-align:bottom;white-space:normal;overflow:hidden;text-indent:0px;padding-left:3px;border-right:1px solid #CCC;border-bottom:1px solid #CCC;}</style><table
id="tblMain" border="0" cellspacing="0" cellpadding="0"><tbody><tr><td><table
id="tblMain_0" class="tblGenFixed" border="0" cellspacing="0" cellpadding="0"><tbody><tr
class="rShim"><td
class="rShim" style="width: 0;"></td><td
class="rShim" style="width: 120px;"></td><td
class="rShim" style="width: 120px;"></td><td
class="rShim" style="width: 120px;"></td><td
class="rShim" style="width: 120px;"></td><td
class="rShim" style="width: 120px;"></td><td
class="rShim" style="width: 120px;"></td><td
class="rShim" style="width: 120px;"></td><td
class="rShim" style="width: 120px;"></td></tr><tr><td
class="hd"><p
style="height: 16px;">.</p></td><td
class="s0">Site</td><td
class="s1">Space</td><td
class="s1">Price</td><td
class="s1">Interface</td><td
class="s1">Mobile</td><td
class="s1">Own Songs</td><td
class="s1">Method of Upload</td><td
class="s1">Edit track info</td></tr><tr><td
class="hd"><p
style="height: 16px;">.</p></td><td
class="s2">Maestro.fm</td><td
class="s3">Unlimited</td><td
class="s3">Free</td><td
class="s3">Decent</td><td
class="s3">iPhone</td><td
class="s3">Yes</td><td
class="s3">Stream from Home Computer</td><td
class="s3">Yes, but you are editing your home library tracks</td></tr><tr><td
class="hd"><p
style="height: 16px;">.</p></td><td
class="s2">mSpot.com</td><td
class="s3">2-4GBs currently, larger accounts coming</td><td
class="s3">Free, larger accounts will have a price</td><td
class="s3">Decent, admittedly in beta</td><td
class="s3">Android 2.1</td><td
class="s3">Yes</td><td
class="s3">Installable uploader.</td><td
class="s3">No</td></tr><tr><td
class="hd"><p
style="height: 16px;">.</p></td><td
class="s2">mp3tunes.com</td><td
class="s3">2GB &#8211; 50GB</td><td
class="s3">2GB free, 50GB for $40/year</td><td
class="s3">Pretty good</td><td
class="s3">iPhone, Android</td><td
class="s3">Yes</td><td
class="s3">Installable uploader.</td><td
class="s3">Yes, but a little flaky</td></tr><tr><td
class="hd"><p
style="height: 16px;">.</p></td><td
class="s2">grooveshark.com</td><td
class="s3">500 songs upgradable to 5000</td><td
class="s3">500 songs free, 5000 for $30/year</td><td
class="s3">Pretty good</td><td
class="s3">iPhone, Android, Palm, Blackberry</td><td
class="s3">Yes</td><td
class="s3">In-brower Java Applet</td><td
class="s3">No</td></tr><tr><td
class="hd"><p
style="height: 16px;">.</p></td><td
class="s2">audiobox.fm</td><td
class="s3">1GB &#8211; 151GB</td><td
class="s3">1GB free, plans at $4 &#8211; $10/month</td><td
class="s3">Nice</td><td
class="s3">Android app, might just work on iPhone</td><td
class="s3">Yes</td><td
class="s3">Folder-by-folder in-browser</td><td
class="s3">Yes</td></tr></tbody></table></td></tr></tbody></table> ]]></content:encoded> <wfw:commentRss>http://joesong.com/2010/06/finding-the-lala-com-replacement/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Evo 4G</title><link>http://joesong.com/2010/06/evo-4g/</link> <comments>http://joesong.com/2010/06/evo-4g/#comments</comments> <pubDate>Thu, 03 Jun 2010 20:07:59 +0000</pubDate> <dc:creator>josephsong</dc:creator> <category><![CDATA[Uncategorized]]></category> <category><![CDATA[Evo 4G]]></category> <category><![CDATA[Sprint]]></category><guid
isPermaLink="false">http://joesong.com/?p=1005</guid> <description><![CDATA[I&#8217;m getting an Evo 4G tomorrow and I&#8217;m pretty excited. Radio Shack called to tell me it is in.]]></description> <content:encoded><![CDATA[<p><img
class="alignright size-medium wp-image-1006" title="EVO" src="http://joesong.com/wp-content/uploads/2010/06/EVO-300x208.jpg" alt="" width="300" height="208" />I&#8217;m getting an Evo 4G tomorrow and I&#8217;m pretty excited.</p><p>Radio Shack called to tell me it is in.</p><p><object
classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="100%" height="64" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param
name="data" value="https://clients4.google.com/voice/embed/embedPlayer" /><param
name="wmode" value="transparent" /><param
name="FlashVars" value="u=14559365378916643001&amp;k=AHwOX_BX1P29w4OfC1AUzFEfPFXOcaMahWDY59ibzB9Zd3p2iTqqnL8d-UTjqdgCU_vl85CaZlXzNkkr903KG_ONtHYgeygcma6-pTxF5_JBoW9v3NVNwueuQf4KtU_yk37aStul2owtqWlfGjKD-v6dNHh1bFPgymZzDxwbiZceaSuxz8Z-98w&amp;baseurl=https://clients4.google.com/voice&amp;autoPlay=false" /><param
name="src" value="https://clients4.google.com/voice/embed/embedPlayer" /><param
name="flashvars" value="u=14559365378916643001&amp;k=AHwOX_BX1P29w4OfC1AUzFEfPFXOcaMahWDY59ibzB9Zd3p2iTqqnL8d-UTjqdgCU_vl85CaZlXzNkkr903KG_ONtHYgeygcma6-pTxF5_JBoW9v3NVNwueuQf4KtU_yk37aStul2owtqWlfGjKD-v6dNHh1bFPgymZzDxwbiZceaSuxz8Z-98w&amp;baseurl=https://clients4.google.com/voice&amp;autoPlay=false" /><embed
type="application/x-shockwave-flash" width="100%" height="64" src="https://clients4.google.com/voice/embed/embedPlayer" flashvars="u=14559365378916643001&amp;k=AHwOX_BX1P29w4OfC1AUzFEfPFXOcaMahWDY59ibzB9Zd3p2iTqqnL8d-UTjqdgCU_vl85CaZlXzNkkr903KG_ONtHYgeygcma6-pTxF5_JBoW9v3NVNwueuQf4KtU_yk37aStul2owtqWlfGjKD-v6dNHh1bFPgymZzDxwbiZceaSuxz8Z-98w&amp;baseurl=https://clients4.google.com/voice&amp;autoPlay=false" wmode="transparent" data="https://clients4.google.com/voice/embed/embedPlayer"></embed></object></p> ]]></content:encoded> <wfw:commentRss>http://joesong.com/2010/06/evo-4g/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Damocles Song</title><link>http://joesong.com/2010/03/damocles-song/</link> <comments>http://joesong.com/2010/03/damocles-song/#comments</comments> <pubDate>Wed, 31 Mar 2010 14:50:31 +0000</pubDate> <dc:creator>josephsong</dc:creator> <category><![CDATA[Portraits]]></category> <category><![CDATA[flash]]></category> <category><![CDATA[html5]]></category><guid
isPermaLink="false">http://joesong.com/?p=995</guid> <description><![CDATA[On HTML 5 v. Flash and Dionysius v. Damocles.]]></description> <content:encoded><![CDATA[<p>At work, we were talking about HTML 5 vs Flash, video specifically, and I said, &#8220;I agree, of course, that HTML 5 is on the way up and is a sort of <strong><a
href="http://en.wikipedia.org/wiki/Damocles" target="_blank">sword of Damocles</a></strong> for a lot of what we know now about building sites. But, keep in mind that by most counts the majority of visitors are still on IE, those poor suckers. IE9 _might_ support this video sort of thing but until everyone gets up to IE9, which if released in 2011, might be the baseline of our a-grade browsers by 2018, we are going to have to offer our content in parallel paths. This will get easier, of course, but I don&#8217;t think the Adobe execs are mainlining Ambien yet. Well, maybe recreationally.&#8221;</p><p>So, <a
href="http://twitter.com/worldclassgeek" target="_blank">@worldclassgeek</a> made me this picture.</p><p><a
href="http://joesong.com/wp-content/uploads/2010/03/king-joe-song.jpg"><img
class="alignnone size-medium wp-image-996" title="Damocles Song" src="http://joesong.com/wp-content/uploads/2010/03/king-joe-song-235x300.jpg" alt="Damocles Song" width="235" height="300" /></a></p> ]]></content:encoded> <wfw:commentRss>http://joesong.com/2010/03/damocles-song/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Overriding Drupal Login Form Messages via Localization</title><link>http://joesong.com/2010/03/overriding-drupal-login-form-messages-via-localization/</link> <comments>http://joesong.com/2010/03/overriding-drupal-login-form-messages-via-localization/#comments</comments> <pubDate>Fri, 19 Mar 2010 16:22:32 +0000</pubDate> <dc:creator>josephsong</dc:creator> <category><![CDATA[Development]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[drupal]]></category> <category><![CDATA[drupal 6]]></category> <category><![CDATA[forms]]></category> <category><![CDATA[localization]]></category> <category><![CDATA[programming]]></category><guid
isPermaLink="false">http://joesong.com/?p=991</guid> <description><![CDATA[Altering form messages in Drupal via i10n.]]></description> <content:encoded><![CDATA[<h3>Sx</h3><p>We want something besides the default messaging for user forms in Drupal. They are still in English, but just custom to our application. Also, we don&#8217;t need to override all of them, just a few. And, we are using Drupal 6.</p><h3>Dx</h3><p>Drupal is set up to automatically translate form messaging. Using this mechanism, we can cleanly alter the messages to appear just as we would like them to appear. We create a custom language and set it as the default. We only make the few translations that we need and Drupal falls back on the default English for stuff we don&#8217;t translate.</p><p>To setup the custom language:</p><ol
class="default_list"><li>Make sure the Locale module is enabled and that you have permissions to use it (both to Administer Languages and for the Translate Interface)</li><li>Go to Site Configuration -&gt; Languages -&gt; Add Language</li><li>Open the Custom Language form</li><li>Fill in the form with something like:<br
/> Language code: en-MySite<br
/> Language name in English: MySite<br
/> Native language name: MySite<br
/> Path prefix: mysite (this is only a placeholder and won&#8217;t be needed later)<br
/> Language domain: [blank]<br
/> Direction: Left to right</li><li>Click the Add custom language</li><li>Go to Site Configuration -&gt; Languages and choose en-MySite as the default language, click Save Configuration</li></ol><p>To make the faux translations:</p><ol
class="default_list"><li>Go to Site Building -&gt; Translate Interface -&gt; Search</li><li>Search for a particular string by something it contains, say, &#8220;username&#8221;.</li><li>Find your string in the search results and click edit. Enter your translation and submit it.</li><li>Repeat for other strings as necessary.</li></ol><h3>Tx</h3><p>So, we end up with a clean faux translation of the default strings into your application-specific copy.</p> ]]></content:encoded> <wfw:commentRss>http://joesong.com/2010/03/overriding-drupal-login-form-messages-via-localization/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Changing The WAMP Icons</title><link>http://joesong.com/2010/02/changing-the-wamp-icons/</link> <comments>http://joesong.com/2010/02/changing-the-wamp-icons/#comments</comments> <pubDate>Fri, 26 Feb 2010 15:54:02 +0000</pubDate> <dc:creator>josephsong</dc:creator> <category><![CDATA[Development]]></category><guid
isPermaLink="false">http://joesong.com/?p=982</guid> <description><![CDATA[How to give WAMP different, alternative, better tray icons.]]></description> <content:encoded><![CDATA[<p>It has kind of bugged me that the <a
href="http://www.wampserver.com/" target="_blank">WAMP</a> status tray icons are all pretty similar to each other. It gets annoying especially because the &#8216;some services running&#8217; and the &#8216;all services running&#8217; are yellow and white, respectively. When you are trying to make and test changes to one of the services those colors look really similar.</p><p>So, I changed which icons it shows and used the better, alternative ones. They are already there in the icon bar in c:\wamp\images_on.bmp and c:\wamp\images_off.bmp. We just have to change the mapping.</p><p>In c:\wamp\wampmanager.tpl change lines 10 &#8211; 12 from</p><pre class="brush: plain;">
TrayIconAllRunning=16
TrayIconSomeRunning=17
TrayIconNoneRunning=18
</pre><p>to</p><pre class="brush: plain;">
TrayIconAllRunning=9
TrayIconSomeRunning=10
TrayIconNoneRunning=11
</pre><p>The downsides: there is no difference between the icons for offline and online modes, the new icons seem meant to be used elsewhere (but I never see them, or at least not nearly as much as I see the tray icons).</p> ]]></content:encoded> <wfw:commentRss>http://joesong.com/2010/02/changing-the-wamp-icons/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Showing in-page and inline content in Lightbox2</title><link>http://joesong.com/2010/02/showing-in-page-and-inline-content-in-lightbox2/</link> <comments>http://joesong.com/2010/02/showing-in-page-and-inline-content-in-lightbox2/#comments</comments> <pubDate>Thu, 25 Feb 2010 18:02:28 +0000</pubDate> <dc:creator>josephsong</dc:creator> <category><![CDATA[Development]]></category> <category><![CDATA[JavaScript]]></category><guid
isPermaLink="false">http://joesong.com/?p=954</guid> <description><![CDATA[Lightbox2 allows you to load in same-domain content without an iframe using rel="lightmodal". What it doesn't allow you do is use that same mechanism for content already in the page.]]></description> <content:encoded><![CDATA[<p>Lightbox2 allows you to load in same-domain content without an iframe using rel=&#8221;lightmodal&#8221;. What it doesn&#8217;t allow you do is use that same mechanism for content already in the page.</p><p>I&#8217;m working on a project that loads (and hides) content meant for lightbox in the markup of the main page. We are doing this in order to have quick reactions to the users&#8217; clicks and optimize the content for SEO. With the existing mechanism, Lightbox2 will reload the page content if the trigger points to an in-page anchor.  For instance,</p><pre class="brush: xml;">&lt;a href=&quot;#anchors-aweigh&quot;&gt;Load existing content&lt;/a&gt;</pre><p>will cause Lightbox2 to reload the current page even thought the content is already available in-page. This kills the quick reaction time and adds ticks on the tracking calls and increases server load.</p><p>Taking a note from <a
href="http://www.erikhedin.com/web-design/drupal-tips/Easy-Ajax-Nodes-Lightbox-Content" target="_blank">Erik Hedin</a> on how to focus Lightbox on an anchor after (re)loading the page, I rewrote the the modalContainer&#8217;s load instructions to check against the current url and see if the target content is already existing on the page. So, the line</p><pre class="brush: jscript;">$(&quot;#modalContainer&quot;).load(src);</pre><p>in lightbox.js becomes</p><pre class="brush: jscript;">
/* HERE'S THE RUB */

/*
	if already in the page, load in the content
	test by comparing src and window.location without hashes (anchors)
	and then finding the src's hash in the DOM

	if either are false, fall back and load the old way
*/
var srcHash = src.replace(/.*(#.*)/, '$1');
if ((window.location.toString().replace(/#.*/, '') == src.replace(/#.*/, '') ||
			// src.replace(/#.*/, '') will be blank for some IE versions if the href is just a hash
			src.replace(/#.*/, '') == '') &amp;&amp;
			srcHash &amp;&amp; $(srcHash)) {

	// clone the referenced node and alter the clone's ID, then insert it into lightbox
	$(&quot;#modalContainer&quot;).html($(srcHash).clone().attr('id', srcHash.replace('#', '') + '-clone'));

} else {

	$(&quot;#modalContainer&quot;).load(src);

}

/* THE RUB STOPS HERE */
</pre><p>But but but but but but, we&#8217;re not done.</p><p>In Erik&#8217;s post he advises changing the lightbox.js script in the Drupal module. I don&#8217;t like changing other people&#8217;s code; I&#8217;d rather overwrite it for my application. Instead of digging inside the module, I have included another script that overwrites the offending Lightbox.showData method. This way, if the modules is updated by its devs, I don&#8217;t have to go digging again. Plus, our Drupal project is instanced over several machines and a dev and a staging and a production site, so changing the module is hard to maintain.</p><p>So, in the end, my application-specific script looks like,</p><pre class="brush: jscript;">
Lightbox.showData = function(){
    $('#loading').hide();

    if (Lightbox.isLightframe || Lightbox.isVideo || Lightbox.isModal) {
        Lightbox.updateDetails();
        if (Lightbox.isLightframe) {
            $('#frameContainer').show();
            if ($.browser.safari) {
                $('#lightboxFrame').css({
                    'zIndex': '10500'
                }).show();
            } else {
                $('#lightboxFrame').css({
                    'zIndex': '10500'
                }).fadeIn(Lightbox.fadeInSpeed);
            }
        } else {
            if (Lightbox.isVideo) {
                $(&quot;#modalContainer&quot;).html(Lightbox.modalHTML);
                $(&quot;#modalContainer&quot;).click(function(){
                    return false;
                });
            } else {
                var src = unescape(Lightbox.imageArray[Lightbox.activeImage][0]);
                if (Lightbox.imageArray[Lightbox.activeImage][4]) {
                    $(src).appendTo(&quot;#modalContainer&quot;);
                } else {

					/* HERE'S THE RUB */

					/*
						if already in the page, load in the content
						test by comparing src and window.location without hashes (anchors)
						and then finding the src's hash in the DOM

						if either are false, fall back and load the old way
					*/
					var srcHash = src.replace(/.*(#.*)/, '$1');
					if ((window.location.toString().replace(/#.*/, '') == src.replace(/#.*/, '') ||
								// src.replace(/#.*/, '') will be blank for some IE versions if the href is just a hash
								src.replace(/#.*/, '') == '') &amp;&amp;
							srcHash &amp;&amp; $(srcHash)) {

						// clone the referenced node and alter the clone's ID, then insert it into lightbox
						$(&quot;#modalContainer&quot;).html($(srcHash).clone().attr('id', srcHash.replace('#', '') + '-clone'));

					} else {

						$(&quot;#modalContainer&quot;).load(src);

					}

					/* THE RUB STOPS HERE */
                }
                $('#modalContainer').unbind('click');
            }
            $('#modalContainer').css({
                'zIndex': '10500'
            }).show();
        }
    }    // Handle display of image content.
    else {
        $('#imageContainer').show();
        if ($.browser.safari) {
            $('#lightboxImage').css({
                'zIndex': '10500'
            }).show();
        } else {
            $('#lightboxImage').css({
                'zIndex': '10500'
            }).fadeIn(Lightbox.fadeInSpeed);
        }
        Lightbox.updateDetails();
        this.preloadNeighborImages();
    }
    Lightbox.inprogress = false;

    // Slideshow specific stuff.
    if (Lightbox.isSlideshow) {
        if (!Lightbox.loopSlides &amp;&amp; Lightbox.activeImage == (Lightbox.total - 1)) {
            if (Lightbox.autoExit) {
                Lightbox.slideIdArray[Lightbox.slideIdCount++] = setTimeout(function(){
                    Lightbox.end('slideshow');
                }, Lightbox.slideInterval);
            }
        } else {
            if (!Lightbox.isPaused &amp;&amp; Lightbox.total &gt; 1) {
                Lightbox.slideIdArray[Lightbox.slideIdCount++] = setTimeout(function(){
                    Lightbox.changeData(Lightbox.activeImage + 1);
                }, Lightbox.slideInterval);
            }
        }
        if (Lightbox.showPlayPause &amp;&amp; Lightbox.total &gt; 1 &amp;&amp; !Lightbox.isPaused) {
            $('#lightshowPause').show();
            $('#lightshowPlay').hide();
        } else
            if (Lightbox.showPlayPause &amp;&amp; Lightbox.total &gt; 1) {
                $('#lightshowPause').hide();
                $('#lightshowPlay').show();
            }
    }

    // Adjust the page overlay size.
    var arrayPageSize = Lightbox.getPageSize();
    var arrayPageScroll = Lightbox.getPageScroll();
    var pageHeight = arrayPageSize[1];
    if (Lightbox.isZoomedIn &amp;&amp; arrayPageSize[1] &gt; arrayPageSize[3]) {
        var lightboxTop = (Lightbox.topPosition == '' ? (arrayPageSize[3] / 10) : Lightbox.topPosition) * 1;
        pageHeight = pageHeight + arrayPageScroll[1] + lightboxTop;
    }
    $('#overlay').css({
        'height': pageHeight + 'px',
        'width': arrayPageSize[0] + 'px'
    });

    // Gecko browsers (e.g. Firefox, SeaMonkey, etc) don't handle pdfs as
    // expected.
    if ($.browser.mozilla) {
        if (Lightbox.imageArray[Lightbox.activeImage][0].indexOf(&quot;.pdf&quot;) != -1) {
            setTimeout(function(){
                document.getElementById(&quot;lightboxFrame&quot;).src = Lightbox.imageArray[Lightbox.activeImage][0];
            }, 1000);
        }
    }
};
</pre>]]></content:encoded> <wfw:commentRss>http://joesong.com/2010/02/showing-in-page-and-inline-content-in-lightbox2/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>I&#8217;ve always wanted to be an Aerobic instructor.</title><link>http://joesong.com/2010/02/ive-always-wanted-to-be-an-aerobic-instructor/</link> <comments>http://joesong.com/2010/02/ive-always-wanted-to-be-an-aerobic-instructor/#comments</comments> <pubDate>Tue, 23 Feb 2010 23:13:24 +0000</pubDate> <dc:creator>josephsong</dc:creator> <category><![CDATA[Advertising]]></category> <category><![CDATA[Portraits]]></category><guid
isPermaLink="false">http://joesong.com/?p=935</guid> <description><![CDATA[The magic of video has brought my dream to some sort of life.]]></description> <content:encoded><![CDATA[<p><img
class="alignright size-medium wp-image-936" title="oterns_video_poster" src="http://joesong.com/wp-content/uploads/2010/02/oterns_video_poster-300x203.jpg" alt="" width="300" height="203" />But, I&#8217;ve never been in shape enough for it.</p><p>Thankfully, the magic of video has brought my dream to some sort of life. And, we launched the new OLSON O-Terns blog in the process.</p><p><a
href="http://www.olsonoterns.com/" target="_blank">http://www.olsonoterns.com/</a></p><p>It&#8217;s a good thing I&#8217;ve done a bit of acting before because this is going to win an award and how embarrassing would it be for other actors if this was the first thing I was ever in.</p><p>#veryembarrassingforotheractors</p> ]]></content:encoded> <wfw:commentRss>http://joesong.com/2010/02/ive-always-wanted-to-be-an-aerobic-instructor/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>HTML and CSS Development Guidelines</title><link>http://joesong.com/2010/02/html-and-css-development-guidelines/</link> <comments>http://joesong.com/2010/02/html-and-css-development-guidelines/#comments</comments> <pubDate>Thu, 18 Feb 2010 17:23:29 +0000</pubDate> <dc:creator>josephsong</dc:creator> <category><![CDATA[CSS]]></category> <category><![CDATA[Development]]></category> <category><![CDATA[HTML]]></category> <category><![CDATA[html]]></category> <category><![CDATA[optimization]]></category> <category><![CDATA[performance]]></category> <category><![CDATA[programming]]></category> <category><![CDATA[progressive enhancement]]></category><guid
isPermaLink="false">http://joesong.com/?p=925</guid> <description><![CDATA[Some rules for HTML and CSS development based on success in the field.]]></description> <content:encoded><![CDATA[<p>*NOTE &#8211; Feb 18, 2010: this is a work in progress. Very likely, there are points not yet included.</p><h2>Philosophical Approach</h2><p>The approach can be summed up in two points:</p><ol
class="default_list"><li>Write enough markup and style definitions to make it clear to other developers what is happening.</li><li>Write as little markup and style definitions as possible.</li></ol><p>Let’s talk about what these mean.</p><h5>Write enough markup and style definitions to make it clear to other developers what is happening.</h5><p>We follow the principles of semantic web development which involves using markup to describe the data or content of a web page. In practice, this means things like using <code>ol</code> and <code>ul</code> tags to make lists of items instead of text delineated with <code>br</code> tags, and giving page elements class names that describe their function (eg “<code>article-wrapper</code>”) instead of class names that describe their appearance (eg “<code>blue-background</code>”).</p><h5>Write as little markup and as few style definitions as possible.</h5><p>Small file size and shallow markup heirarchy make the site faster to load and easier to maintain. To that end, we write as little markup and as few style as possible to make the page appear and function as necessary. In practice, this means things like using <code>padding</code> and <code>margin</code> to create space between elements instead of using <code>br</code> or empty <code>p</code> tags, and writing reusable CSS classes that add common traits (eg <code>background-color</code>) and can be used in conjunction with other reusable CSS classes that provide other common traits (eg <code>font-size</code>).</p><h2>Rules</h2><p>We have a few easy-to-follow rules for HTML and CSS development that have evolved from years of experience.</p><h5>Rules for writing HTML</h5><ul
class="default_list"><li>Block-level elements      are  never be self-closing, even      when empty.<br
/> <code>&lt;div /&gt;</code> should always be written as <code>&lt;div&gt;&lt;/div&gt;</code>, but but <code>&lt;img /&gt;</code> or <code>&lt;span /&gt;</code> is proper.</li><li>Markup always validates      unless there is a very good reason (eg for cross-browser support or CMS      limitations).<br
/> There are many validators but W3C’s is preferred: <a
href="http://validator.w3.org/">http://validator.w3.org/</a></li><li>Documents are written for      HTML 5.<br
/> Documents should use the the <code>&lt;!DOCTYPE html&gt;</code> declaration.</li><li>Tables are used only for      tabular data, not for layout.</li><li>Stylesheets are included      in the <code>&lt;head&gt;</code> of the page.</li><li>Stylesheets are included      using <code>&lt;link /&gt;</code> tags, not <code>@import</code> statements.<br
/> It is permissable, however, to use <code>@import</code> statements within an external stylesheet.</li><li>Markup should be indented      using tabs, not spaces, so that the indentation matches the markup      heirarchy.</li><li>CSS and JavaScript are      included in external files, not written inline in the page.</li><li>External JavaScript files      are included at the bottom of the page just before the <code>&lt;/body&gt;</code>.</li></ul><h5>Rules for writing CSS</h5><ul
class="default_list"><li>CSS is written a compact      format characterized by the selector and all definitions on one line.<br
/> Use <a
href="http://www.codebeautifier.com/">http://www.codebeautifier.com/</a> to switch between formats; the format described here is called ‘High’ compression.<br
/> <strong><em>Improper:<br
/> </em></strong></p><pre class="brush: css;">.my-class {
	width: 300px;
	height: 300px;
}</pre><p><strong><em>Proper:</em></strong></p><pre class="brush: css;">.my-class { width: 300px; height: 300px; }</pre></li><li>Selectors use hyphens to      delineate words, not camel case or underscores.<br
/> Improper: <code>.myClass</code> or <code>#my_element</code>.      Proper: <code>.better-class</code></li><li>Hacks to make pages work      correctly in Internet Explorer are included in a separate IE-specific      stylesheet and included on the page using conditional comments.</li><li>During development, sites      use a global stylesheet for universal definitions and separate sheets for      independent areas or features of the site.</li><li>Use of style attributes in markup is avoided.</li><li>When possible (that is,      when specific instances are known), <code>.png</code> transparency should be fixed for      specific elements using the IE-6 specific stylesheet instead of using an <code>.htc</code> file as a behavior.<br
/> <strong><em>Improper:</em></strong></p><pre class="brush: css;">a { behavior: url(iepngfix.htc); }</pre><p><strong><em>Proper:<br
/> </em></strong></p><pre class="brush: css;">a#button { background: none; filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true,      sizingMethod=crop, src='../images/button.png'); }</pre></li><li>The default font size is      declared in pixels for the <code>&lt;body&gt;</code> and      the declared for other elements as percentages.<pre class="brush: css;">body { font-size: 13px; }
h1 { font-size: 125%; }</pre></li></ul> ]]></content:encoded> <wfw:commentRss>http://joesong.com/2010/02/html-and-css-development-guidelines/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>He-Man Song</title><link>http://joesong.com/2010/02/he-man-song/</link> <comments>http://joesong.com/2010/02/he-man-song/#comments</comments> <pubDate>Tue, 16 Feb 2010 16:57:43 +0000</pubDate> <dc:creator>josephsong</dc:creator> <category><![CDATA[Portraits]]></category><guid
isPermaLink="false">http://joesong.com/?p=917</guid> <description><![CDATA[@jeffreyisham does it again. I thought I hadn&#8217;t uploaded this photo I took of myself, but he must have found it somewhere.]]></description> <content:encoded><![CDATA[<p><a
href="http://jeffreyisham.com" target="_blank">@jeffreyisham</a> does it again. I thought I hadn&#8217;t uploaded this photo I took of myself, but he must have found it somewhere.</p><p><a
href="http://joesong.com/wp-content/uploads/2010/02/he-song.jpg"><img
class="size-full wp-image-918 alignnone" title="he-song" src="http://joesong.com/wp-content/uploads/2010/02/he-song.jpg" alt="" width="269" height="462" /></a></p> ]]></content:encoded> <wfw:commentRss>http://joesong.com/2010/02/he-man-song/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Who will play the half-time show in 30 years?</title><link>http://joesong.com/2010/02/who-will-play-the-half-time-show-in-30-years/</link> <comments>http://joesong.com/2010/02/who-will-play-the-half-time-show-in-30-years/#comments</comments> <pubDate>Mon, 08 Feb 2010 16:43:10 +0000</pubDate> <dc:creator>josephsong</dc:creator> <category><![CDATA[Entertainment]]></category><guid
isPermaLink="false">http://joesong.com/?p=670</guid> <description><![CDATA[The elderly men who used to be the Who were adorable with their 40-year-old songs last night at the Super Bowl half-time show.]]></description> <content:encoded><![CDATA[<p>Well, the elderly men who used to be the Who were adorable with their 40-year-old songs last night at the Super Bowl half-time show. Afterwards, <a
href="http://stevenlang.net" target="_blank">Steve Lang</a> and I were wondering, &#8220;Who will be playing the half-time show in 30 or 40 years from now?&#8221;</p><p>Seems like the criteria are:</p><ul
class="default_list"><li>Several quickly-recognizable hits</li><li>A dedicated fan base</li><li>A generally upbeat catalog</li><li>Inoffensive music</li><li>At least half the members still living</li></ul><p>My best guess: the Dave Matthews Band</p><p>Steve said: Hootie &amp; the Blowfish</p><p>What do you think?</p> ]]></content:encoded> <wfw:commentRss>http://joesong.com/2010/02/who-will-play-the-half-time-show-in-30-years/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> </channel> </rss>
<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk
Page Caching using disk (enhanced) (user agent is rejected)

Served from: joesong.com @ 2010-07-31 09:29:34 -->