<?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/"
	xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
	xmlns:media="http://search.yahoo.com/mrss/"
>

<channel>
	<title>Software As She's Developed &#187; Announcement</title>
	<atom:link href="http://softwareas.com/tag/announcement/feed" rel="self" type="application/rss+xml" />
	<link>http://softwareas.com</link>
	<description>Mahemoff's Podcast/Blog - Web, Programming, Usability from the Author of 'Ajax Design Patterns' (AjaxPatterns.org)</description>
	<lastBuildDate>Mon, 26 Jul 2010 16:52:27 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<!-- podcast_generator="podPress/8.8" - maintenance_release="8.8.4" -->
		<copyright>Copyright &amp;#xA9; Software As She's Developed 2010 </copyright>
		<managingEditor>michael@mahemoff.com (Software As She's Developed)</managingEditor>
		<webMaster>michael@mahemoff.com (Software As She's Developed)</webMaster>
		<category>posts</category>
		<ttl>1440</ttl>
		<itunes:keywords></itunes:keywords>
		<itunes:subtitle></itunes:subtitle>
		<itunes:summary>Mahemoff's Podcast/Blog - Web, Programming, Usability from the Author of 'Ajax Design Patterns' (AjaxPatterns.org)</itunes:summary>
		<itunes:author>Software As She's Developed</itunes:author>
		<itunes:category text="Society &amp; Culture"/>
		<itunes:owner>
			<itunes:name>Software As She's Developed</itunes:name>
			<itunes:email>michael@mahemoff.com</itunes:email>
		</itunes:owner>
		<itunes:block>No</itunes:block>
		<itunes:explicit>no</itunes:explicit>
		<itunes:image href="http://softwareas.com/wp-content/plugins/podpress/images/powered_by_podpress_large.jpg" />
		<image>
			<url>http://softwareas.com/wp-content/plugins/podpress/images/powered_by_podpress.jpg</url>
			<title>Software As She's Developed</title>
			<link>http://softwareas.com</link>
			<width>144</width>
			<height>144</height>
		</image>
		<item>
		<title>WebWait Two Point Oh</title>
		<link>http://softwareas.com/webwait-two-point-oh</link>
		<comments>http://softwareas.com/webwait-two-point-oh#comments</comments>
		<pubDate>Sat, 25 Jul 2009 00:39:15 +0000</pubDate>
		<dc:creator>mahemoff</dc:creator>
				<category><![CDATA[SoftwareDev]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Announcement]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Project]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[WebWait]]></category>

		<guid isPermaLink="false">http://softwareas.com/?p=560</guid>
		<description><![CDATA[I&#8217;m pleased to announce a major upgrade to WebWait, the first big upgrade since I launched the site 2.5 years ago. It&#8217;s based on watching how people are using it, talking about it, and sending me direct feedback about it. Thanks to all who have provided feedback.



The new features are:


  Multiple sites You can [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m pleased to announce a major upgrade to <a href="http://webwait.com">WebWait</a>, the first big upgrade since I <a href="http://softwareas.com/time-your-website-with-webwaitcom">launched the site</a> 2.5 years ago. It&#8217;s based on watching how people are using it, <a href="http://softwareas.com/webwait-in-the-wild ">talking about it</a>, and sending me direct feedback about it. Thanks to all who have provided feedback.</p>

<p><a href="http://img.skitch.com/20090725-85m6maa9b4geumcrtjb92i4m57.jpg"><img style="width: 400px;" src="http://img.skitch.com/20090725-85m6maa9b4geumcrtjb92i4m57.jpg" /></a></p>

<p>The new features are:</p>

<ul>
  <li><strong>Multiple sites</strong> You can keep typing in new URLs and hitting &#8220;Add&#8221;. This will put them in a queue of sites to eventually be benchmarked. (I decided against a big textarea where you could type in all URLs at once; this would be confusing to the majority of WebWait users, who are casual visitors wanting to check out the time for their own site.)</li>
  <li><strong>Stats</strong> Average, median, and standard deviation for each website, in a summary table. Indeed, the summary table is the cultural centre for all these new features &#8211; when you queue up a site, it&#8217;s immediately added to the table.</li>
  <li><strong>Export</strong> The export feature seems to be popular in <a href="http://listoftweets.com">List Of Tweets</a>. I took the same UI concept and applied it here, so you can export data in plain text, HTML, and CSV format. The CSV is especially interesting as one of the people who&#8217;ve given me feedback is a statistician who&#8217;s planning to run analysis on some data.</li>
  <li><strong>Call Data</strong> View times for each individual call.</li>
  <li><strong>Expand/Collapse Call Data</strong> You can choose whether to show call data or not. Collapsing call data gives you a neat overview of stats for each domain.</li>
  <li><strong>Delete</strong> You can delete individual call data, or delete an entire website record. This is useful for outlier data; for example, you can see how fast the site loads from your browser cache, by turning browser cache on and deleting just the first call in the sequence.</li>
  <li><strong>Stats</strong> Average, median, and standard deviation for each website.</li>
  <li><strong>Browser compatibility.</strong> WebWait didn&#8217;t work upon launch in Safari, but it does now work in recent versions of Safari (I think a change in 3.0 made it work again <img src='http://softwareas.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ), and works fine in Chrome too. This is important for users testing how their website loads in different browsers.</li>
</ul>

<p>Thanks for reading. As always, let us know what you think of the site and anything else you&#8217;d like to see.</p>

<p>Table with expanded results:</p>

<p><img src="http://img.skitch.com/20090725-871fne1hgd8m3ek7ui2rcgn2xj.jpg" style="width:400px;" /></p>

<p>Table with collapsed results:</p>

<p><img src="http://img.skitch.com/20090725-c7mhdcpg3gctmu9a8p9ji4yk9y.jpg" style="width:400px;" /></p>

<p>Export results data (text):</p>

<p><img src="http://img.skitch.com/20090725-dty5ik9incfaw66c71fwppg1g2.jpg" style="width:400px;" /></p>

<p>Export results data (HTML):</p>

<p><img src="http://img.skitch.com/20090725-q61r6iwcwahpeeke97efjts7hh.jpg" style="width:400px;" 
/></p>

<p>Export results data (CSV):</p>

<p><img src="http://img.skitch.com/20090725-q53xx18mf2b42bq3a39371gbqi.jpg" style="width:400px;" /></p>
]]></content:encoded>
			<wfw:commentRss>http://softwareas.com/webwait-two-point-oh/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Instalicious: Push Delicious &#8220;ToRead&#8221; Items Into Instapaper</title>
		<link>http://softwareas.com/instalicious-push-delicious-toread-items-into-instapaper</link>
		<comments>http://softwareas.com/instalicious-push-delicious-toread-items-into-instapaper#comments</comments>
		<pubDate>Tue, 14 Jul 2009 22:44:31 +0000</pubDate>
		<dc:creator>mahemoff</dc:creator>
				<category><![CDATA[SoftwareDev]]></category>
		<category><![CDATA[Announcement]]></category>
		<category><![CDATA[delicious]]></category>
		<category><![CDATA[instapaper]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[Mashup]]></category>
		<category><![CDATA[Project]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://softwareas.com/?p=556</guid>
		<description><![CDATA[Update: Moved intalicious to GitHub. The main change I made since posting this was to stop items reappearing in Instapaper once you&#8217;ve deleted them; the sync process was causing them to be pushed from Delicious again. The script now changes the &#8220;toread&#8221; tag to &#8220;instaliciousd&#8221; (configurable name), so &#8220;toread&#8221; items will only be pushed once.



Instapaper [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Update:</strong> Moved intalicious to <a href="http://github.com/mahemoff/Instalicious/tree/master">GitHub</a>. The main change I made since posting this was to stop items reappearing in Instapaper once you&#8217;ve deleted them; the sync process was causing them to be pushed from Delicious again. The script now changes the &#8220;toread&#8221; tag to &#8220;instaliciousd&#8221; (configurable name), so &#8220;toread&#8221; items will only be pushed once.</p>

<p><img src="http://picupper.com/2009/07/14/instapaper_shot2.png"/></p>

<p><a href="http://instapaper.com">Instapaper</a> lets me read stuff later &#8211; I hit a bookmarklet when I&#8217;m reading it and I can see it later on my browser or in iphone, or print articles in a newspaper format. The problem is, I&#8217;d rather add that stuff to my Delicious stream so I have a permanent record, others can see it, and it plays nicely with in mashups.</p>

<p>So I decided I want a way to bookmark things in Delicious as normal, but still have them appear in Instapaper. Here&#8217;s the script repo:</p>

<p><strong><a href="http://github.com/mahemoff/Instalicious/tree/master">Instalicious repository at GitHub</a></strong></p>

<p>Instalicious is a little Python script that plucks out items tagged &#8220;toread&#8221; &#8211; or some other configurable tag &#8211; and pushes them to Instapaper. Fortunately, both services have easy APIs (<a href="http://blog.instapaper.com/post/73123968/read-later-api">Instapaper API</a>; <a href="http://delicious.com/help/api">Delicious API</a>), and in the case of Delicious, there was even a pleasant <a href="http://www.michael-noll.com/wiki/Del.icio.us_Python_API">Python binding to the API</a>. Also, the Instapaper API happily doesn&#8217;t create duplicates when you send it something you&#8217;ve already sent&#8230;so Instalicious doesn&#8217;t have to remember what it sent. It just dumbly polls Delicious and sends it over to Instapaper.</p>

<p>Now you can <a href="http://softwareas.com/designing-like-a-pollyanna-have-your-cake-and-eat-it-too">have your cake and eat it</a> <img src='http://softwareas.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://softwareas.com/instalicious-push-delicious-toread-items-into-instapaper/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>List Of Tweets</title>
		<link>http://softwareas.com/list-of-tweets</link>
		<comments>http://softwareas.com/list-of-tweets#comments</comments>
		<pubDate>Wed, 08 Jul 2009 07:45:00 +0000</pubDate>
		<dc:creator>mahemoff</dc:creator>
				<category><![CDATA[SoftwareDev]]></category>
		<category><![CDATA[Announcement]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[ListOfTweets]]></category>
		<category><![CDATA[Tool]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[URLTrail]]></category>

		<guid isPermaLink="false">http://softwareas.com/?p=554</guid>
		<description><![CDATA[

ListOfTweets.com is a little twitter mashup I made to organise tweets. The tool lets you build up a list of tweets from search results, which you can convert to HTML or text. The list doesn&#8217;t empty unless you clear it, so you can keep running searches and adding to the list. You can easily rearrange [...]]]></description>
			<content:encoded><![CDATA[<p><a id="shotLink" href="http://listoftweets.com/shot.jpg"><img style="width:425px;" src="http://listoftweets.com/smallshot.jpg" /></a></p>

<p><a href="http://listoftweets.com">ListOfTweets.com</a> is a little twitter mashup I made to organise tweets. The tool lets you build up a list of tweets from search results, which you can convert to HTML or text. The list doesn&#8217;t empty unless you clear it, so you can keep running searches and adding to the list. You can easily rearrange tweets with drag-and-drop.</p>

<p>By the way, List Of Tweets is another example of a <a href="http://softwareas.com/as-we-may-think-url-trails">URL Trail</a>. Thanks to the simplicity of the Twitter API and the elegance of JQuery, it was possible to build a raw version in a couple of hours. <a href="http://softwareas.com/as-t-zero">t is approaching zero</a>. Only after tweeting about it and discovering people found it useful did I decide to flesh it out some more.</p>

<p>A future upgrade might involve saving the list at a unique URL. It would be nice if any of the pastebins provided some support for this via a JSON API (admittedly with relatively short URLs &#8211; only up to 2000 characters could be reliably posted). But I will probably build my own, or just start a new frame and post into a pastebin.</p>

<p>I originally wanted this as I&#8217;ve been thinking about podcasting again and wanted to pull out some highlights from my recent tweets, to act as a schedule, and something I could publish as a playlist at the end. However, a colleague suggested a far more useful scenario, which is to find tweets matching a keyword, hence I added the search keyword parameter, which I now use much more often than the tweeter parameter. <a href="http://eups20.wordpress.com/2009/07/08/interesting-results-of-twitter-discussion/">Here&#8217;s an example of someone using it</a> in their blog to archive tweets about a hashtag.</p>

<p>I&#8217;ve already let people know about the tool via Twitter, but it feels incomplete until I blog about it. Done!</p>

<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/Qn6wp2cMoc8&#038;hl=en&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/Qn6wp2cMoc8&#038;hl=en&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://softwareas.com/list-of-tweets/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Scrumptious: Conversations About Websites (and other resources)</title>
		<link>http://softwareas.com/scrumptious-conversations-about-websites-and-other-resources</link>
		<comments>http://softwareas.com/scrumptious-conversations-about-websites-and-other-resources#comments</comments>
		<pubDate>Thu, 11 Jun 2009 00:22:53 +0000</pubDate>
		<dc:creator>mahemoff</dc:creator>
				<category><![CDATA[HumansAndTech]]></category>
		<category><![CDATA[SoftwareDev]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Announcement]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Osmosoft]]></category>
		<category><![CDATA[Scrumptious]]></category>
		<category><![CDATA[tiddlyweb]]></category>
		<category><![CDATA[TiddlyWiki]]></category>

		<guid isPermaLink="false">http://softwareas.com/?p=541</guid>
		<description><![CDATA[Scrumptious is a web framework I&#8217;ve begun working on at Osmosoft. It&#8217;s a web app and web service for sharing bookmarks and comments about websites, and pretty much anything else with a unique URL. Things it is related to: Delicious (bookmarking), Digg (threaded comments), JS-Kit and Disqus (embedded comments with common identity across multiple sites).



Scrumptious [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://scrumptious.tv">Scrumptious</a> is a web framework I&#8217;ve begun working on at Osmosoft. It&#8217;s a web app and web service for sharing bookmarks and comments about websites, and pretty much anything else with a unique URL. Things it is related to: Delicious (bookmarking), Digg (threaded comments), JS-Kit and Disqus (embedded comments with common identity across multiple sites).</p>

<p><a href="http://img.skitch.com/20090610-bdeahfs32jq8htgabh4nb9ubyu.jpg"><img src="http://img.skitch.com/20090610-bdeahfs32jq8htgabh4nb9ubyu.jpg" style="width:400px;"/></a></p>

<p>Scrumptious is open source, under the BSD license (meaning you can do just about anything you like with it). There are already <a href="http://3spots.blogspot.com/2006/05/delicious-digg-clones-and-open-source.html">many open-source clones</a> of this sort of thing, so why make a new one? There are a few reasons:</p>

<ul>
  <li>Adherence to RESTful principles &#8211; Scrumptious is backed by <a href="http://tiddlyweb.com">TiddlyWeb</a>, a RESTful data service.</li>
  <li>A non-TiddlyWiki TiddlyWeb client &#8211; So far, people who have used TiddlyWeb as a server have used TiddlyWiki as a client. They do play nicely together, but TiddlyWeb is a powerful RESTful framework on its own. Part of the motivation for Scrumptious was to port the <a href="http://tiddlywiki.mahemoff.com/CommentsPlugin.html">TiddlyWiki nest comments plugin</a> to a generic JQuery plugin that could be used on any web page. (Comments are indeed implemented as a plugin right now, but more work needs to be done to extract it into something truly modular and reusable; for example, the plugin right now assumes comments are about a web page; also, they are tied to TiddlyWeb. Nevertheless, the app still does achieve the main purpose of demonstrating TiddlyWeb is a fine data service for generic web apps.)</li>
  <li>Demonstrating the power of URLs &#8211; In evangelising web standards, a very practical piece of advice is simply to associate a unique URL with each distinct resource. That&#8217;s REST 101, but it&#8217;s something lacking in many web apps. With a tool like Scrumptious, you get a comment system &#8220;for free&#8221; as long as each resource in your system has a unique URL. We&#8217;ll be developing a similar framework for <a href="http://softwareas.com/as-we-may-think-url-trails">URL Trails</a> in the future, and the same principle applies: use unique URLs, and people can put your stuff in trails &#8220;for free&#8221;.</li>
  <li>Flexible security model &#8211; Again, TiddlyWeb offers flexible permissioning, so you can use the app in different ways. e.g. a private conversation between colleagues; a public conversation (as with the demo), a publicly readable conversation where only certain individuals can contribute, etc. Likewise, TiddlyWeb offers flexible authentication, so you could hook into an organisation&#8217;s LDAP system, use open ID, simple user-password pairs, or any other form of authentication you wish to use.
</li></ul>

<p>Scrumptious is still at an early stage. Future work includes:</p>

<ul>
  <li>Bookmarking &#8211; for now, there is only commenting rather than social bookmarking per se.</li>
  <li>Nested comments UI needs work to give it the same kind of UI as in the TiddlyWiki comments UI. e.g. show info like creator and creation data, and use suitable rendering and indenting.</li>
  <li>Graceful degradation &#8211; It would be possible to provide a basic system not requiring Javascript. This would be probably be done using TiddlyWeb plugins, though I&#8217;d also be interested in running the JQuery-powered web app on the server, using server-side Javascript.</li>
  <li>TiddlyWiki comments plugin harmonisation &#8211; As TiddlyWiki now ships with JQuery, it would be ideal if there was a single code base for the comments plugin, running in and out of TiddlyWiki. Indeed, I hope TiddlyWiki moves towards a general microkernel architecture, in which all plugins are useful outside TiddlyWiki. This is certainly becoming the case, with generic JQuery plugins being extracted for core activities like file saving, CSS applying, and wikifying.</li>
  <li>Browser extensions &#8211; instead of a bookmarklet, use a browser extension to show, for each page, if comments are available, as well as bookmarking info. (Similar to the StumbleUpon or Delicious Firefox extensions.) A good opportunity to get my hands dirty with <a href="https://jetpack.mozillalabs.com/">JetPack</a>.</li>
  <li>Login and identity management &#8211; while TiddlyWeb already provides the security and permissioning model, work is required to handle this at the UI level. For example, let anonymous users enter their email address and homepage, and/or register.</li>
  <li>User admin &#8211; for situations where users must be authenticated, some form of user management would be handy. Again, TiddlyWeb provides a good model for this &#8211; a &#8220;bag&#8221; of tiddlers has its permission specified in JSON, which may include a list of users for each access type, so you simply need to PUT and GET this if you are sufficiently permissioned (ie an admin). What&#8217;s missing right now is a UI (in TiddlyWiki too, let alone standalone web apps).</li>
</ul>

<p>Scrumptious Screencast:</p>

<p><object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=5079811&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=5079811&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object></p>

<p>&lt;</p>

<p>p><a href="http://vimeo.com/5079811">Scrumptious</a> from <a href="http://vimeo.com/user960717">Michael Mahemoff</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://softwareas.com/scrumptious-conversations-about-websites-and-other-resources/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>A Contact Form</title>
		<link>http://softwareas.com/a-contact-form</link>
		<comments>http://softwareas.com/a-contact-form#comments</comments>
		<pubDate>Tue, 15 Jul 2008 11:03:01 +0000</pubDate>
		<dc:creator>mahemoff</dc:creator>
				<category><![CDATA[HumansAndTech]]></category>
		<category><![CDATA[SoftwareDev]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Announcement]]></category>
		<category><![CDATA[Captcha]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Project]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://softwareas.com/?p=460</guid>
		<description><![CDATA[I recently got fed up of spam. Well, that happened a long time ago. What bothered me recently, enough to take action, was false positives, i.e. real email that fell into my spam folder. My primary email address, michael@mahemoff.com, gets about 3000 mails a day&#8230;so what goes in my spam folder, stays in my spam [...]]]></description>
			<content:encoded><![CDATA[<p>I recently got fed up of spam. Well, that happened a long time ago. What bothered me recently, enough to take action, was false positives, i.e. real email that fell into my spam folder. My primary email address, michael@mahemoff.com, gets about 3000 mails a day&#8230;so what goes in my spam folder, stays in my spam folder. There&#8217;s no way known I will ever fish it out.</p>

<p>People I know usually get through to me okay, but of course I also receive mails from people I don&#8217;t know &#8211; who found my mail from my blog, websites, writings, or offline meetings. For them, there&#8217;s a good chance of being marked as spam, especially if they use a subject line like &#8220;hello&#8221; which is a perfectly natural thing to do when you&#8217;re just checking in with someone you&#8217;ve met at a conference, for example, so you can keep each other&#8217;s contact details. (Incidentally, I still find it astonishing how many people maintain blogs &#8211; many of them meticulous, comprehensive, and full of goodness &#8211; but include zero contact info.)</p>

<p>So I finally bit the bullet and <a href="http://contact.mahemoff.com">made a little PHP/Javascript contact form</a>. It&#8217;s been working great for several months now. This kind of form is nothing new, of course. Mail forms were once ubiquitous in every book on CGI. But there were a few modern twists worth mentioning.</p>

<p>The form looks as follows:</p>

<p><a href="http://contact.mahemoff.com"><img src="http://picupper.com/2008/07/14/contact.png" width="98%" /></a></p>

<p>The gnarly twists:</p>

<ul>
<li>Captcha. Or, really, <a href="http://recaptcha.org">ReCaptcha</a>. Actually, I prefer Captcha to ReCaptcha &#8211; I think the benefit of scanning books is great, but can&#8217;t justify the usability cost of having to enter two words instead of one (for no extra security benefit). Still, I wanted to try out ReCaptcha, and I also like the way its a popular, centralised, service, which means it should be better at detecting evil clients than a standalone library installation. <a href="http://recaptcha.net/plugins/php/">The PHP plugin and instructions</a> turned out to be incredibly easy to follow. A pleasant surprise that meant spam prevention took about 20 minutes to set up in total.</li>
<li>SMS option. Instead of email, you can send the message as SMS (text message to my phone). I need to improve the UI here a bit, ideally creating separate tabs for SMS and email. Anyway, the way this works is via everybody&#8217;s favourite micro-blogging service, Twitter. On the Twitter website, I set preferences so direct messages are routed to my phone as SMS messages. Ideally, I would then send a direct message to myself each time someone wants to SMS me. But unfortunately Twitter doesn&#8217;t let you send messages to yourself (silly!), so I created a secondary account (the venerable &#8220;mahemoff1&#8243;). Each time someone submits a SMS, I use the Twitter API to end a direct message from the secondary account to the primary account. This gets me a text message several seconds after the form is submitted. I also receive a copy in my Twitter account, as a bonus. (For all the talk about Twitter&#8217;s unreliability, its text messaging is lightning fast. It shows up on my phone long before it shows up on Air clients, which only poll once a minute or so. Ideally I&#8217;d upload a video if I had the time, to show how quick it is.)
</li><li><a href="https://chat.mahemoff.com">A web chat facility</a>. Everyone should have it, to avoid making people install AIM etc just to chat with you one time! I installed <a href="https://blueimp.net/ajax/">an open-source chat client</a> so anyone can talk to me. In an ideal world, browsers would notify me when someone is trying to chat, but for now, it requires pre-arrangement. I would like to enhance the app so it uses the same SMS mechanism to tell me each time someone enters the chat room. 
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://softwareas.com/a-contact-form/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Music As She&#8217;s Developed</title>
		<link>http://softwareas.com/music-as-shes-developed</link>
		<comments>http://softwareas.com/music-as-shes-developed#comments</comments>
		<pubDate>Tue, 15 Apr 2008 07:44:28 +0000</pubDate>
		<dc:creator>mahemoff</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[HumansAndTech]]></category>
		<category><![CDATA[SoftwareDev]]></category>
		<category><![CDATA[Announcement]]></category>
		<category><![CDATA[Last.FM]]></category>
		<category><![CDATA[Mashup]]></category>
		<category><![CDATA[Music]]></category>
		<category><![CDATA[Navel-Gazing]]></category>
		<category><![CDATA[Widgets]]></category>

		<guid isPermaLink="false">http://softwareas.com/?p=436</guid>
		<description><![CDATA[I made a little music mashup you might enjoy using.

A Little Music

As I was playing around with the new layout of this blog, I added a Last.FM widget to the sidebar. It looks like this:

table.lfmWidgetradio_eef448421daa7cdb759397e5f8ea67f8 td {margin:0 !important;padding:0 !important;border:0 !important;}table.lfmWidgetradio_eef448421daa7cdb759397e5f8ea67f8 tr.lfmHead a:hover {background:url(http://cdn.last.fm/widgets/images/en/header/radio/mini_red.png) no-repeat 0 0 !important;}table.lfmWidgetradio_eef448421daa7cdb759397e5f8ea67f8 tr.lfmEmbed object {float:left;}table.lfmWidgetradio_eef448421daa7cdb759397e5f8ea67f8 tr.lfmFoot td.lfmConfig a:hover {background:url(http://cdn.last.fm/widgets/images/en/footer/red.png) no-repeat [...]]]></description>
			<content:encoded><![CDATA[<p>I made a little music mashup you might enjoy using.</p>

<h3>A Little Music</h3>

<p>As I was playing around with the new layout of this blog, I added a <a href="http://last.fm">Last.FM</a> widget to the sidebar. It looks like this:</p>

<p><style type="text/css">table.lfmWidgetradio_eef448421daa7cdb759397e5f8ea67f8 td {margin:0 !important;padding:0 !important;border:0 !important;}table.lfmWidgetradio_eef448421daa7cdb759397e5f8ea67f8 tr.lfmHead a:hover {background:url(http://cdn.last.fm/widgets/images/en/header/radio/mini_red.png) no-repeat 0 0 !important;}table.lfmWidgetradio_eef448421daa7cdb759397e5f8ea67f8 tr.lfmEmbed object {float:left;}table.lfmWidgetradio_eef448421daa7cdb759397e5f8ea67f8 tr.lfmFoot td.lfmConfig a:hover {background:url(http://cdn.last.fm/widgets/images/en/footer/red.png) no-repeat 0px 0 !important;;}table.lfmWidgetradio_eef448421daa7cdb759397e5f8ea67f8 tr.lfmFoot td.lfmView a:hover {background:url(http://cdn.last.fm/widgets/images/en/footer/red.png) no-repeat -85px 0 !important;}table.lfmWidgetradio_eef448421daa7cdb759397e5f8ea67f8 tr.lfmFoot td.lfmPopup a:hover {background:url(http://cdn.last.fm/widgets/images/en/footer/red.png) no-repeat -159px 0 !important;}</style></p>

<table class="lfmWidgetradio_eef448421daa7cdb759397e5f8ea67f8" cellpadding="0" cellspacing="0" border="0" style="width:110px;"><tr class="lfmHead"><td><a title="Music tagged trance " href="http://www.last.fm/listen/globaltags/trance" target="_blank" style="display:block;overflow:hidden;height:20px;width:110px;background:url(http://cdn.last.fm/widgets/images/en/header/radio/mini_red.png) no-repeat 0 -20px;text-decoration:none;border:0;"></a></td></tr><tr class="lfmEmbed"><td><object type="application/x-shockwave-flash" data="http://cdn.last.fm/widgets/radio/25.swf" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0" width="110" height="140" > <param name="movie" value="http://cdn.last.fm/widgets/radio/25.swf" /> <param name="flashvars" value="lfmMode=radio&amp;radioURL=globaltags%2Ftrance&amp;title=Music+tagged+trance+&amp;theme=red&amp;lang=en&amp;widget_id=radio_eef448421daa7cdb759397e5f8ea67f8" /> <param name="bgcolor" value="d01f3c" /> <param name="quality" value="high" /> <param name="allowScriptAccess" value="always" /> <param name="allowNetworking" value="all" /> </object></td></tr><tr class="lfmFoot"><td style="background:url(http://cdn.last.fm/widgets/images/footer_bg/red.png) repeat-x 0 0;text-align:right;"><table cellspacing="0" cellpadding="0" border="0" style="width:110px;"><tr><td class="lfmConfig"><a href="http://www.last.fm/widgets/?url=globaltags%2Ftrance&amp;colour=red&amp;size=mini&amp;autostart=0&amp;from=code&amp;widget=radio" title="Get your own widget" target="_blank" style="display:block;overflow:hidden;width:85px;height:20px;float:right;background:url(http://cdn.last.fm/widgets/images/en/footer/red.png) no-repeat 0px -20px;text-decoration:none;border:0;"></a></td><td class="lfmPopup"style="width:25px;"><a href="http://www.last.fm/widgets/popup/?url=globaltags%2Ftrance&amp;colour=red&amp;size=mini&amp;autostart=0&amp;from=code&amp;widget=radio&amp;resize=1" title="Load this radio in a pop up" target="_blank" style="display:block;overflow:hidden;width:25px;height:20px;background:url(http://cdn.last.fm/widgets/images/en/footer/red.png) no-repeat -159px -20px;text-decoration:none;border:0;" onclick="window.open(this.href + '&amp;resize=0','lfm_popup','height=240,width=160,resizable=yes,scrollbars=yes'); return false;"></a></td></tr></table></td></tr></table>

<p>(May not render if you're reading this from a feed reader.)</p>

<p>Great. Now I can listen to trance from the blog. Trance is good for coding. So that's ace. But I couldn't stop there, could I?</p>

<h3>Widgets, Widgets, Everywhere!</h3>

<p>I made <a href="http://softwareas.com/my-music">this page</a> with 30+ gadgets in all sorts of genres. This is good for those times when I'm not coding and want to listen to something else. Being in the cloud, it means I can easily listen to whatever I feel like when I'm in an internet cafe or the such like.  So even more ace.</p>

<p><a href="http://softwareas.com/my-music"><img src="http://img292.imageshack.us/img292/6863/blogmusicem1.png"/></a></p>

<h3>Make Your Own Jukebox</h3>

<p>In the spirit of sharing, you can easily make a page containing your own favourite music. The URL for the default music page resolves to something with a ridiculously long list of genres:</p>

<div class="igBar"><span id="lhtml-2"><a href="#" onclick="javascript:showPlainTxt('html-2'); return false;">PLAIN TEXT</a></span></div>

<div class="syntax_hilite"><span class="langName">HTML:</span><br /><div id="html-2">
<div class="html"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">http://softwareas.com/music?tags=trance,ambient,meditation,triphop,funk,randb,rap,hiphop,metalrap,latin,salsa,reggaeton,rock,pop,retro,alternative,metal,punk,aussie,britpop,europop,world,bhangra,arabic,70s,80s,90s,house,techno,electro,acid,garage,psychedelic,jazz,swing,lindyhop,classical,instrumental,orchestral </div></li></ol></div>
</div></div>

<p><br />
... which means you can hack the URL and make your own jukebox with your own genres and bookmark it and it will work and live on in the cloud and you too will be able to listen to your favourite music anywhere you go.</p>

<p>For example, you might be a more passionate fan of contemporary Japanese music than myself, in which case you would concoct the following URL and save it to your delicious bookmark manager to enjoy many years of musical gratification:</p>

<p><a href="http://softwareas.com/music?tags=j-ska,j-pop,j-punk,j-hop,j-rap,anime">http://softwareas.com/music?tags=j-ska,j-pop,j-punk,j-hop,j-rap,anime</a></p>

<h3>Add A Player on the Fly</h3>

<p>One other feature is that you can add a new player on the fly. This again is great for travelling around  as it will let me easily listen to any genre I care for without even having to edit the URL.</p>

<p><a href="http://softwareas.com/my-music"><img src="http://img246.imageshack.us/img246/7753/blogmusicaddhw3.png"/></a></p>

<p>(Unamusing trivia: I actually caused a bug at first by using "gray" as the colour name here. I'm used to working with American spelling for programming of course, but then last.fm is a UK company and the name you want is actually British spelling, i.e. "grey".)</p>

<h3>Obligatory Wishlist I'll Not Really Get Around to Implementing But it's Cathartic to Braindump it Anyway</h3>

<p>If I was going to do more work on this, I would:</p>

<ul>
<li>Make it into a widget-like portal which lets you add/remove/layout etc and save settings within a hackable URL (using <a href="http://ajaxpatterns.org/Unique_URL">Unique URL</a>. You could argue the whole thing is useless as you could achieve the same thing in iGoogle/Shindig, but sometimes a specialised interface, tucked neatly inside a separate tab, works best.</li>
<li>Provide more flexibility on layout</li>
<li>Add support for bands, not just tags</li>
<li>Run it on a separate page without the blog layout</li>
<li>Keep the loldog</li>
</ul>

<p><a href="http://softwareas.com/my-music"><img src="http://img337.imageshack.us/img337/3082/dogmusictb4.png"/></a></p>
]]></content:encoded>
			<wfw:commentRss>http://softwareas.com/music-as-shes-developed/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
