<?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>MemoryMiner - Blog</title>
	<atom:link href="http://www.memoryminer.com/blog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.memoryminer.com/blog</link>
	<description>Musings by John Fox on the development of MemoryMiner</description>
	<lastBuildDate>Mon, 12 Jul 2010 05:55:40 +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>Adventures in Localizing a Cappuccino Application</title>
		<link>http://www.memoryminer.com/blog/?p=134</link>
		<comments>http://www.memoryminer.com/blog/?p=134#comments</comments>
		<pubDate>Thu, 08 Jul 2010 03:27:06 +0000</pubDate>
		<dc:creator>John Fox</dc:creator>
				<category><![CDATA[Cappuccino]]></category>
		<category><![CDATA[Developer]]></category>
		<category><![CDATA[MemoryMiner 2.0]]></category>

		<guid isPermaLink="false">http://www.memoryminer.com/blog/?p=134</guid>
		<description><![CDATA[How I managed to make the MemoryMiner web viewer support multiple localizations.]]></description>
			<content:encoded><![CDATA[<p>One of my favorite beta testers for MemoryMiner 2.x is a Czech language speaker named Marek. Shortly after the release of 2.1—with its greatly improved web viewer—he whispered in my ear (loudly!) about the need to create a localized version of the web viewer. As he put it in an email:</p>
<blockquote><p>&#8220;Just to explain: My MemoryMiner projects are focused on archival photographs and looking at a lot of mainly older people who can not even English &#8230;&#8221; [sic]</p></blockquote>
<p>Prior to the Cappuccino version of the web viewer, he customized the template by modifying an HTML file. The index.html file in the Cappuccino version is merely a shell: all the magic is performed in Obj-J, and a good chunk of the user interface is archived away in .cib files. In other words, there was no chance for him to do the work himself.</p>
<p>Last fall, while working on the MemoryMiner Web Application, I noticed that in all the code samples I&#8217;d seen, people were using hard-coded strings, which is a huge no-no. At the time, I was too busy exploring to care too much.  At some point, I innocently asked on the Cappuccino IRC channel to see if there was anything like NSLocalizedString() which is what one uses in Cocoa to work with localized strings in code. </p>
<p>Ask and you shall receive: I was pointed to this github gist created by Nicholas Small for CPLocalizedString():</p>
<p><a href="http://gist.github.com/152167" target="_blank">http://gist.github.com/152167</a></p>
<p>I tried it out, and it works as advertised, with only one problem: it only supports one localization at a time. It also doesn&#8217;t address the need for localized .cib files.</p>
<p>Not wanting to leave poor Marek in the lurch for too much longer, this week I decided to revisit the issue. The first task was to come up with a way of supporting multiple localizations while providing a mechanism to determine the best match for a given user. Since web browsers can tell you which language they&#8217;re using, I used that as a starting point. </p>
<p>Here&#8217;s how I&#8217;m getting the browser&#8217;s language:<br />
<script src="http://gist.github.com/469757.js?file=browserlanguage.j"></script></p>
<p>Using the language code (e.g &#8220;fr&#8221;), you can then enumerate a list of available localizations, each one identified by a key. To store the list of available localizations I added this key/value pair to the application&#8217;s Info.plist:</p>
<div class="codecolorer-container xml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>CPBundleLocalizedResourceKeys<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;array<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>en<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>cs<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>de<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/array<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></div></div>
<p>But, what if the user wants to use a language that&#8217;s different from the language they&#8217;ve set in their browser? This is particularly important since, for example, a French user might understand German better than English. To handle this case, I allow for a user language preference to be passed to the method that determines the locale to be used for the application:</p>
<p>Here&#8217;s the method I created:<br />
<script src="http://gist.github.com/469758.js?file=bundleLocale.j"></script></p>
<p>For now, I&#8217;m getting the user&#8217;s preferred language from a URL argument, (e.g. &#8220;&#8230;&#038;language=de&#8221;), but in the future it would be nice to create a graphical language picker and maybe store the preference in a cookie. </p>
<p>So, now that strings can be localized, here&#8217;s how you can (dare I say should) use them in code:</p>
<div class="codecolorer-container objc default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #002200;">&#91;</span>sharingWindow setTitle<span style="color: #002200;">:</span>CPLocalizedString<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;sharingOverlayWindowTitle&quot;</span>, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #bf1d1a;">&quot;Share this MemoryMiner Story&quot;</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;</div></div>
<p>If you read through the original gist, you&#8217;ll see that CPLocalizedString takes two arguments, the key, and the comment. On OS X, you can use a command line tool called genstrings which automatically generates strings files from your code. These files are given to a translator, a single entry for which looks like this:</p>
<div class="codecolorer-container objc default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #11740a; font-style: italic;">/* Formatter for creating labels like &quot;Item x of y&quot; in Person/Photo Picker */</span><br />
<span style="color: #bf1d1a;">&quot;itemCountFormat&quot;</span> <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">&quot;Item %i of %i&quot;</span>;</div></div>
<p>Again, noting the original gist, a final processing is used to convert the strings file into an XML property list. You could just as well hand the XML based property list to your translator (or better yet create an app for editing them!).</p>
<p>The end result? The images below show two different localizations, in German and Czech. You can click on either image to view the actual localized web viewer:</p>
<p><a href="http://gallery.memoryminer.com/viewer8/index.html?showPhoto=9fedffeb-6377-41be-a869-5ca04ad690f9&#038;feedURL=http://homepage.mac.com/j4johnfox/Sites/MM-Export-052610-20-19-15/index.rss&#038;language=de" target="_blank" border="0"><img src="/graphics/BlogPhotos/MMWeb-Filter-DE.jpg"/></a>
<p><a href="http://gallery.memoryminer.com/viewer8/index.html?showPhoto=9fedffeb-6377-41be-a869-5ca04ad690f9&#038;feedURL=http://homepage.mac.com/j4johnfox/Sites/MM-Export-052610-20-19-15/index.rss&#038;language=cs" target="_blank" border="0"><img src="/graphics/BlogPhotos/MMWeb-Filter-CS.jpg"/></a></p>
<p><b>What about localized .cib files?</b></p>
<p>I&#8217;ve mentioned several times in previous posts that the Cappuccino framework is improving at very fast clip. Anyone who&#8217;s started their project anytime within the last year or so surely has a bunch of code for programmatically creating UI elements and placing them within views. The <a href="http://280atlas.com" target="_blank">280 Atlas</a> application can radically reduce the amount of tedious coding to create your app&#8217;s UI since you work can work graphically with actual &#8220;freeze-dried&#8221; objects (e.g. windows, buttons, sliders, image views, etc.). </p>
<p>When localizing into certain languages (I&#8217;m looking at you German!) the length of a string translated from English can oftentimes be quite a bit longer. For this reason, the placement of text labels, or the size of your buttons may need to be adjusted. If you chose to create multiple cib files with different localizations, then it sure would be nice to have a standardized way to load them. </p>
<p>Here&#8217;s what I did:</p>
<p>* Create a simple convenience for getting the full path to a localized resource that would live in ~Resources/x.lproj where &#8220;x&#8221; is your language code such as &#8220;en&#8221;:</p>
<p>* Create a method for loading a localized cib file.</p>
<p>Here&#8217;s the code:<br />
<script src="http://gist.github.com/469146.js?file=localizedcib.j"></script></p>
<p>Now, in order to support localized .cib files, you simply create them in your language-specific *.lproj folders (e.g. ~Resources/fr.lproj/MainMenu.cib). Since the Atlas editor is pretty mature, I&#8217;m hard-pressed to return to creating my user interfaces in code, if I can at all avoid doing so. </p>
<p>A shortcoming of the localized .cib loading method at this point is that, unlike with Cocoa, it doesn&#8217;t gracefully recover if a localized .cib file is not found (i.e. it doesn&#8217;t load the default language .cib file). This could be done, but it&#8217;s a bit trickier. On the desktop, it&#8217;s fast, easy and cheap to determine if a resource is available on your local hard drive. To determine if a resource on the web is available is a bit more involved, but certainly doable in a future refinement.</p>
<p>Parenthetically, the topic of how best to localize .xib files in Cocoa applications has been much discussed. One very interesting approach is to programmatically localize at run-time, a practice used by the wildly popular Delicious Library software. The technique is discussed at length in this post by Wil Shipley:</p>
<p><a href="http://wilshipley.com/blog/2009/10/pimp-my-code-part-17-lost-in.html" target="_blank">http://wilshipley.com/blog/2009/10/pimp-my-code-part-17-lost-in.html</a>
</p>
<p>I&#8217;d love to see a similar approach in Cappuccino. In many cases, it&#8217;s possible to configure your user interface to handle even the longest strings used for labels, etc. In some cases, though, it can look rather awkward. As a developer who cares about having localized applications, and knowing full well what a lot of work it is to produce them, I&#8217;m happy to have as many options as possible to make the job as painless possible. Most importantly, I&#8217;d like to see proper official&#8221; localization be baked right into Atlas and the Cappuccino source code.  </p>
<p>I&#8217;m sure this will happen, but in the meantime, I&#8217;m happy to offer a complete gist with all the code and updated ReadMe, with the hope that it will be useful to others. Feedback and improvements are greatly appreciated:</p>
<p><a href="http://gist.github.com/466301" target="_blank">http://gist.github.com/466301</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.memoryminer.com/blog/?feed=rss2&amp;p=134</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>The road to MemoryMiner 2.1</title>
		<link>http://www.memoryminer.com/blog/?p=133</link>
		<comments>http://www.memoryminer.com/blog/?p=133#comments</comments>
		<pubDate>Fri, 04 Jun 2010 08:05:16 +0000</pubDate>
		<dc:creator>John Fox</dc:creator>
				<category><![CDATA[Cappuccino]]></category>
		<category><![CDATA[Developer]]></category>
		<category><![CDATA[MemoryMiner 2.0]]></category>

		<guid isPermaLink="false">http://www.memoryminer.com/blog/?p=133</guid>
		<description><![CDATA[I&#8217;m incredibly happy to report that MemoryMiner 2.1 is out the door. This release builds on hard-won learnings from the past six months, including a rather interesting project at Duke University which I&#8217;ll write about in a separate post. I had two major goals for this release. The first was a radical improvement in the [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m incredibly happy to report that MemoryMiner 2.1 is out the door. This release builds on hard-won learnings from the past six months, including a rather interesting project at Duke University which I&#8217;ll write about in a separate post. I had two major goals for this release. The first was a radical improvement in the Web Viewer to take advantage of the very latest in HTML5 technology. The second was the creation of a &#8220;soft landing&#8221; mechanism to help first-time users have a better &#8220;out of the box&#8221; experience with the application.</p>
<p><b>Web Viewer: Flash without the Flash</b></p>
<p>I&#8217;ve already written about <a href="http://www.memoryminer.com/blog/?p=131" target="_blank">using the Cappuccino framework</a> to create the current generation of the web viewer. One of the great benefits of using this framework is that I was able to concentrate on refining the user experience while spending a minimum of time worrying about the vagaries of different browsers. </p>
<p>My partner in crime for this effort was Marcello Luppi, of <a href="http://wrinklypea.com" target="_blank"> Wrinkly Pea Design</a>. Working with him was a pleasure. The general idea was to create a set of iconography and UI widgets that are clean and  unobtrusive so as to make the photo be the hero:</p>
<p><img src="/SWUpdate/2.1//MemoryMinerWebViewer.jpg" alt="New Web Viewer" border="0"/>
<p>Note how white dots are used to indicate the existence of annotation layers, such as maps, attachments and captions for each photo.</p>
<p><img src="/SWUpdate/2.1/MemoryMinerWebViewer-YouTube.jpg" alt="Embedded YouTube Video Playback" border="0"/></p>
<p>Note also how YouTube video is displayed using an overlay rather than in a separate browser window.</p>
<p>The great thing about the new web viewer is that just like on the desktop, you can pan &#038; zoom between the various selection markers used to highlight certain areas of a photo. On Safari, which has hardware accelerated CSS transitions, the pan &#038; zoom performance is equal to that of the desktop version of MemoryMiner. It&#8217;s absolutely better than anything I was able to do with Flash. In Firefox, the performance is not quite as good as using Flash, but quite good nonetheless. Hopefully, we&#8217;ll soon see hardware accelerated graphics in other browsers.</p>
<p>To see for yourself, click on the embedded photo shown below which opens a new window. When the first photo loads, click on it (or use the arrow keys). Click on the &#8220;i&#8221; button to view a short help text which highlights the keyboard and other shortcuts.</p>
<p><iframe width="350" height="325" src="http://gallery.memoryminer.com/embed?photouuid=9fedffeb-6377-41be-a869-5ca04ad690f9&#038;baseURL=http://homepage.mac.com/j4johnfox/Sites/MM-Export-052610-20-19-15&#038;title=Know Your Indie Developers" style="margin: 0; padding: 0; border: 0;"></iframe></p>
<p>In order to make sharing easier, there&#8217;s a new option to get HTML code which uses an iFrame to embed a graphical representation of a specific photo in your story, just like you see above. </p>
<p>I particularly love this then &#038; now picture-within-a-picture that I took of Steve â€œScottyâ€ Scott, the founder of the <a href="http://macdevnet.com" target=_"blank">Mac Developer Network</a>, who for more than a year now has been dumb enough to have me as his co-host on the <a href="http://www.mac-developer-network.com/shows/podcasts/mdnshow/" target=_"blank">MDN Show podcast</a>. </p>
<p><b>The “Soft Landing”: providing a warm welcome for first-time users</b></p>
<p>The biggest challenge I&#8217;ve faced in marketing MemoryMiner is how to give a sense of what the application is all about within the first few minutes of contact with a new user. Those who view one of the screen movies tend to get excited by the app and therefore have a frame of reference when they first start using it. Those who simply download the application and stare at an empty library can easily get lost and frustrated. </p>
<p>To solve this problem, I created a simple HTML page which is displayed in a window when the user first runs the application. It looks like this:</p>
<p><img src="/SWUpdate/2.1/MM-WelcomePanel.jpg" alt="MemoryMiner Welcome Panel" border="0"/></p>
<p>Users can now load a sample library which has a good number of carefully annotated photos, people, places and collections. As with a cooking demonstration, you want to give people an idea of what they&#8217;re trying to create. When loaded, the library looks like this:</p>
<p><img src="/SWUpdate/2.1/MM-DemoLibrary.jpg" alt="MemoryMiner Demo Library" border="0"/></p>
<p>I believe this library does a good job of showing how MemoryMiner&#8217;s core function is capturing memories for the purpose of telling stories. I tried to include a variety of distinct photo types, each with some backstory that wanted to be told. My favorites are in the &#8220;Know Your Indie Developers&#8221; collection which reveal some choice tidbits about the lives of my fellow Indie developers.</p>
<p>If you&#8217;re an existing MemoryMiner user, you can get the upgrade to 2.1 using the usual Sparkle update mechanism. If you&#8217;re new to MemoryMiner, give <a href="http://memoryminer.com/tools/get/click.php?id=16" target="_blank">version 2.1 a try</a>.</p>
<p>Be sure to let me know what you think.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.memoryminer.com/blog/?feed=rss2&amp;p=133</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Stepping Inside a Painting With MemoryMiner</title>
		<link>http://www.memoryminer.com/blog/?p=132</link>
		<comments>http://www.memoryminer.com/blog/?p=132#comments</comments>
		<pubDate>Thu, 01 Apr 2010 18:34:56 +0000</pubDate>
		<dc:creator>John Fox</dc:creator>
				<category><![CDATA[Developer]]></category>
		<category><![CDATA[MemoryMiner 2.0]]></category>

		<guid isPermaLink="false">http://www.memoryminer.com/blog/?p=132</guid>
		<description><![CDATA[Thoughts on using MemoryMiner to create physical museum exhibits that let users "step inside" printed artwork.]]></description>
			<content:encoded><![CDATA[<p>Readers of this blog will know that I&#8217;ve enjoyed a longstanding and fruitful collaboration with <a href="http://www.google.com/profiles/spagnoloacht#about" target=_blank>Francesco Spagnolo</a> from the <a href="http://magnes.org" target=_blank">Magnes Museum</a> in Berkeley. Recently, he sent me a small MemoryMiner library containing an annotated painting. He told me he had used the full-screen editing feature during some presentations in order to highlight the various people and objects portrayed within the painting. Such work is what MemoryMiner is all about, so I was happy to hear that my humble little creation was useful in this context. </p>
<p>Here&#8217;s the painting in question:</p>
<p><img src="/graphics/BlogPhotos/JustThePhoto.jpg"/></p>
<p>In addition to the people in it, there a several important, recurring objects that are worth noting, which of course is easy to do using selection markers with small captions. Here&#8217;s an example:</p>
<p><img src="/graphics/BlogPhotos/StepInsidePainting-ZoomedIn.jpg"/></p>
<p>When working on major new features in any software, it&#8217;s common practice to create a little &#8220;sandbox&#8221; application so that you test various features in a brand new, &#8220;clean&#8221; environmnent. While developing MemoryMiner 2, I created such an app which I called StepInside, and maybe one day I&#8217;ll officially release it. StepInside is somewhat like a &#8220;lite&#8221; version of MemoryMiner in that it simply lets you create annotations on photos. However, instead of storing the annotation data in a database, the annotations are stored in the photo files themselves using the most excellent <a href="http://www.adobe.com/products/xmp/" target=_blank">Adobe XMP</a> standard. You can seamlessly move photos between StepInside, MemoryMiner, and other XMP-savvy applications, and the all-important annotation work is preserved along the way. </p>
<p>This of course underlines one of the core ideas behind MemoryMiner which is that whatever annotation work you do, you should be able to take advantage of it as widely as possible. The Magnes has taken this idea to heart: MemoryMiner is used to create <a href="http://www.flickr.com/photos/magnesmuseum/collections/72157602107241226/" target=_blank>thoughtful collections of well-annotated photos and documents</a> which are then <a href="http://www.flickr.com/photos/magnesmuseum/2886356446/in/set-72157607478446537/" target=_blank>published to Flickr</a>, as well as to the <a href="http://memoryminer.com/UploadTest/john/MM-Export-020510-12-20-05" target=_blank>MemoryMiner Web Viewer</a>. This has been a great way for them (and other <a href="http://fcmdsc.wordpress.com/tag/memory-miner/" target=_blank>institutions</a> who have have been inspired by the Magnes&#8217; work) to expand their reach from physical museum spaces to virtual exhibits on the web.</p>
<p>By way of example, here&#8217;s the same annotated painting as it appears on Flickr:</p>
<p><a href="http://www.flickr.com/photos/magnesmuseum/4402841084/" target="_blank"><img src="/graphics/BlogPhotos/StepInsidePainting-Flickr-small.jpg"/></a></p>
<p>All this is great, but what about using MemoryMiner in physical gallery spaces? During a recent visit to the <a href="http://www.thecjm.org/" target=_blank>Contemporary Jewish Museum</a> in San Francisco, I noticed that one of the docents was passing around a magnifying glass so that people could get a better look at the pages exhibited in the extraordinary (and highly recommended) <a href="http://www.thecjm.org/index.php?option=com_ccevents&#038;scope=exbt&#038;task=detail&#038;oid=45" target=_blank>Our Struggle: Responding to Mein Kompf</a> exhibit. There were so many details to be seen in these pages, and indeed, many of the details themselves made reference to some cultural phenomena that may not be obvious to any given viewer. The discussions amongst the viewers in reaction to the exhibit were fascinating in their own right.</p>
<p>So, what if you could combine the expertise of museum docents and the sheer intimacy of seeing physical objects in the company of other human beings with the unlimited resources of the web? The technical aspects of this, i.e. selection markers on images, hyperlinks, attachments, audio/video recording, etc. is something I&#8217;ve been working on for a while now. </p>
<p>My imagination thus sparked, I recalled one of the interesting bits of R&#038;D I did last Summer  which was embedding a web server into the StepInside application. Why would I do this? To be able to remotely control the application of course! The idea is that you could use an inexpensive Mac Mini to drive a High Definition video projection system and allow people to step inside high-def imagery using a simple remote-control software. On the back-end, only a few commands are needed: essentially, show next/prior image and show next/prior marker and some type of &#8220;get info&#8221; about each image. The remote-control app could be written as a native iPhone app or even as a simple web page: it just needs to be able to locate the web server which is easy to do using the &#8220;Bonjour&#8221; networking technology that&#8217;s been around for a few years now.</p>
<p>When you launch StepInside, the web server starts up automatically. Safari on both Mac and Windows lets you easily find local network web servers that advertise themselves using Bonjour. On the Mac, here&#8217;s the menu item:</p>
<p><img src="/graphics/BlogPhotos/StepInside-RemoteServer.jpg"/></p>
<p>If you click on the book mark, a very simple web page appears, which has a series of hyperlinks which demonstrate the remote control of the StepInside application. To see it all working together, I&#8217;ve put together a quick and dirty screen movie (no audio):</p>
<p><object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/8z59D38i-gw&#038;hl=en_US&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/8z59D38i-gw&#038;hl=en_US&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object></p>
<p>I think it&#8217;s time to get this technology out of the lab and into some museums or other institutions. I have two projects underway, and am always looking for others. If you&#8217;re interested, please do get in touch: john at memoryminer dot com. </p>
<p>I look forward to seeing where this goes.</p>
<p>PS For more background on MemoryMiner at the Magnes, have a look at the video about the Memory Lab:</p>
<p><object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/eQU4Oqt9khQ&#038;hl=en_US&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/eQU4Oqt9khQ&#038;hl=en_US&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.memoryminer.com/blog/?feed=rss2&amp;p=132</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using Cappuccino to build the MemoryMiner Web Viewer</title>
		<link>http://www.memoryminer.com/blog/?p=131</link>
		<comments>http://www.memoryminer.com/blog/?p=131#comments</comments>
		<pubDate>Sat, 27 Feb 2010 00:59:01 +0000</pubDate>
		<dc:creator>John Fox</dc:creator>
				<category><![CDATA[Developer]]></category>
		<category><![CDATA[MemoryMiner 2.0]]></category>

		<guid isPermaLink="false">http://www.memoryminer.com/blog/?p=131</guid>
		<description><![CDATA[Perspectives on using the Cappuccino framework to build web apps from the perspective of a Cocoa desktop app developer.]]></description>
			<content:encoded><![CDATA[<p>When I first started working on MemoryMiner in December 2004, I had completely had it with building web applications. I&#8217;d spent the prior 8 years creating a sophisticated and completely web-based Digital Asset Management system using great server-side technology from NeXT/Apple called WebObjects. Being able to deploy our app from day one as a hosted-service was huge, but there was only so much you could do to make a web application come close to what was possible, user-experience wise, on the desktop. I was therefore utterly thrilled to work full-time with Cocoa, especially since I was completely familiar with its precursor from my days working on NeXTSTEP applications.</p>
<p>Still, the web is critically important for a project like MemoryMiner, and it has been this part of the adventure with which I&#8217;ve most struggled. From version 1.0 onwards, MemoryMiner for the Mac has been able to publish sets of annotated photos to the web using a self-contained story viewer. The first two versions were done in Flash (by someone else), and while they worked OK what amazed me was how much effort it took to do something that I thought should have been easy, namely to read an XML file with descriptive data about a bunch of photos and display them in a coherent, pleasing fashion.</p>
<p>Flash has its origins as tool for creating animated content. Tools for building applications using Flash came about much later in its evolution and weren&#8217;t available in 2005/2006. If you wanted to create 2D shapes and tween them about a stage, no problem. If you needed a scroll view to display a number of thumbnail images, then it was roll your own from scratch or license somebody else&#8217;s code. There were quite a number of different UI widget sets available, but all came with a different look and feel, and none of them really felt right compared to what one was used to on the desktop. Still, back in 2006, given the sorry state of Javascript performance in browsers and the lack of coherent libraries, Flash was the better choice. </p>
<p>Here&#8217;s an example of the Flash-based Web Wiewer:</p>
<p><a href="http://www.memoryminer.com/community/SashaFaith" target="_blank"><img src="/images/WebViewer-Flash.jpg" alt="MemoryMiner Web Viewer"/></a></p>
<p>Fast-forward a year and a half and the techniques of web development have improved dramatically as Javascript libraries such as Prototype and Scriptaculous came on the scene. I decided to try creating a new web viewer that didn&#8217;t need Flash. A big reason I wanted to ditch Flash was that the performance on the Mac was lousy. Prototype did a nice job of hiding some of the inconsistencies between the different browsers, while filling in a bunch of holes in the Javascript language. However, to do anything fancy UI wise, you have to devote a considerable amount of time learning the ins and outs of CSS. While indeed extremely powerful, it just wasn&#8217;t something that I, as a desktop application developer, ever really wanted to deal with. </p>
<p>Beyond styling, even basic behaviors such as having an image resize proportionally and remain anchored while the browser window is resized was maddening. Was I asking for too much? I could never get it to work consistently across IE/Firefox/WebKit, so I just gave up. On the plus side, the general performance was quite good (loading time, CPU usage). Still, it bugged the crap out of me that doing the most basic things proved so difficult.</p>
<p>Here&#8217;s an example of the  Javascript-based Web Wiewer:</p>
<p><a href="http://homepage.mac.com/j4johnfox/Sites/Nice-Trip/" target="_blank"><img src="/images/WebViewer-Javascript.jpg" alt="MemoryMiner Web Viewer"/></a></p>
<p>Fast-forward another year or so, and I hear about this web application called <a href="http://280slides.com" target="_blank">280Slides</a> and the <a href="http://cappuccino.org" target="_blank">Cappuccino</a> framework used to create it. Playing with that app the first time was a revelation. I almost wept the first time that I started looking under the hood: the APIs and code syntax were immediately familiar to me as a Cocoa developer. I knew I could leverage a lot of know-how, and maybe even some code.</p>
<p>As soon as Cappuccino was made available to the general public, I started experimenting. How do you display an image using Cappuccino? You create a CPImageView instance and call setImage: passing it your CPImage instance. Works for me (and probably causes &#8220;traditional&#8221; web developers to roll their eyes). As a first experiment, I made a test app with the idea of creating a simplified version of the image annotation view I use in MemoryMiner for the desktop. I actually just started copying and pasting Obj-C code into a text editor, changing the class prefixes (i.e. NSImage becomes CPImage) and getting rid of pointers (e.g. NSImage *myImage becomes var myImage). Pretty soon, I had a view that could display a photo as well as draw selection markers (ummmm, drawRect:). Amazingly enough when I resized the browser window, things just worked. I didn&#8217;t write a line of CSS, I didn&#8217;t have to do one thing in FF/WebKit and something else in IE. This is what I was looking for!</p>
<p>By late Spring of 2009, I was pretty addicted, so I kept going with my prototype, adding the ability to create and edit selection markers, add captions to them and persist my model objects via a RESTful Rails back end. Mapping? Easy. There&#8217;s <a href="http://blog.springenwerk.com/2009/09/mapkit-for-cappuccino.html" target="_blank">MapKit</a> for that, along with a growing selection of high-quality third party code. Community? Got that as well. Among Cappuccino developers, I&#8217;ve found the same willingness to help each other out as we all strive for excellence. </p>
<p>This past fall, by the time I had mostly finished the development of MemoryMiner 2 for Mac, I spent about 2 person weeks finishing up on the MemoryMiner web viewer. When I was done, the biggest problem I had was that the deployment footprint of a Cappuccino application is quite a bit bigger than using something like jQuery or other javascript libraries. This is largely due to the fact that Cappuccino is designed for creating Applications, so you get a ton of functionality such as Undo, Key-Value Observation, etc. along with sophisticated UI widgets that you may not need in a read-only viewer such as I was building. </p>
<p>In order to get the initial load time to where I needed it to be, I created a single application that I host on a small slicehost instance, with the web server configured to automatically compress all the .j (Objective-J) files in my application. Between the compression, and the image spiriting techniques that were introduced late last year, I&#8217;m pretty happy with the load speed. It could certainly be made faster by eliminating some of the unused code and image sprite data, and I&#8217;m confident that this, or other optimizations will be made. All you have to do is take note of the progress made by a tiny team in a rather short period of time.</p>
<p>Best of all, unlike the old system where each web viewer instance had all the code needed to display the content in the same folder as the content itself, the new system works by simply redirecting to the hosted web viewer app&#8217;s URL, passing the published RSS feed as a variable in the redirect URL. This means that once a user looks at their first published MemoryMiner viewer, any subsequent loading of any other story viewer will have the viewer code already in the browser&#8217;s local cache. Improvements made need only be made once in one place, just like in the &#8220;good old days&#8221; at my prior company.</p>
<p>Here&#8217;s an example of the Cappuccino-based web viewer:</p>
<p><a href="http://homepage.mac.com/j4johnfox/Sites/MM-Export-121409-11-40-26" target="_blank"><img src="/images/WebViewer-Nice.jpg" alt="MemoryMiner Web Viewer"/></a></p>
<p>While my first publicly shipping Cappuccino project is a read-only viewer, I&#8217;ve been working on a full-blown version of MemoryMiner for the web. It&#8217;s currently in early Alpha testing, and the feedback thus far has been extremely positive. The viewer and the app actually share a fair amount of code. Most importantly, both use the same Model View Controller design patterns we all know and love. My MMSSelectionMarker class in Cappuccino is virtually the same as its cousin on the desktop: the main difference is that one is persisted in a local sqlite database, the other in a web-service. Believe it or not, I&#8217;ve become pretty comfortable moving code back and forth between desktop and web. I implemented undo using Cappuccino before doing the same in Cocoa. </p>
<p>Still, compared to developing with Xcode &#038; Interface Builder, developing a Cappuccino app still feels a bit primitive Fortunately, as Cappuccino has matured, it has been getting better tools, such as <a href="http://280atlas.com" target="_blank">280Atlas</a> which lets you compose your UI layer graphically using real &#8220;freeze dried&#8221; objects that connect to each other using the familiar control-click and drag mechanism just like on the desktop It&#8217;s essentially IB and Xcode mixed together. </p>
<p>For whatever reason, people can easily get into flame-wars about web apps vs. desktop apps, and this toolkit vs. that toolkit. For my part, I really don&#8217;t care. I want MemoryMiner to be a person-centric application. Generally speaking, people want to interact their stuff on whatever device they happen to be using. I&#8217;ve found that Obj-C/Obj-J and Cocoa/Cappuccino give me lots of leverage because of the dynamic nature of the language, the richness of the frameworks and the availability of quality third party code. Others will say the same thing about Java/C#/Ruby/Python, etc. etc. To each their own, but if you&#8217;re a Cocoa developer and care at all about the web, you&#8217;d be crazy not to give Cappuccino a serious look. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.memoryminer.com/blog/?feed=rss2&amp;p=131</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Indie+Relief</title>
		<link>http://www.memoryminer.com/blog/?p=130</link>
		<comments>http://www.memoryminer.com/blog/?p=130#comments</comments>
		<pubDate>Wed, 20 Jan 2010 04:10:35 +0000</pubDate>
		<dc:creator>John Fox</dc:creator>
				<category><![CDATA[Developer]]></category>
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://www.memoryminer.com/blog/?p=130</guid>
		<description><![CDATA[Ask almost any indie Mac developer what the best thing about developing for the Mac is and they&#8217;ll tell you it&#8217;s the community of developers. I&#8217;ve found this to be the case ever since I started developing MemoryMiner back in 2005. In fact, there was a guy who named Justin Williams who early on gave [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://indierelief.com" border="0" target="_blank"><img src="http://www.indierelief.com/images/ir_500.png"/></a></p>
<p>Ask almost any indie Mac developer what the best thing about developing for the Mac is and they&#8217;ll tell you it&#8217;s the community of developers. I&#8217;ve found this to be the case ever since I started developing MemoryMiner back in 2005. In fact, there was a guy who named <a href="http://www.secondgearsoftware.com/about/" target="_blank">Justin Williams</a> who early on gave excellent and thorough UI feedback, and put me in touch with <a href="http://pixelimplosion.com/about/" target="_blank">Robert Anderson </a> who helped me enormously early on. I couldn&#8217;t believe that he took so much time to help someone whom he&#8217;d never even met. Amazingly enough, he was hardly the only one to have helped me along the way (check the About MemoryMiner for this long list of people).</p>
<p>Fast forward almost five years, and the same Justin Williams has, in conjunction, with <a href="http://garrettmurray.net/" target="_blank">Garrett Murray</a> put together an incredible project to raise money for the Haitian Earthquake relief efforts. The project is called <a href="http://indierelief.com" target="_blnak">Indie+Relief</a> and the concept is simple: over 200 indie Mac and iPhone developers have agreed to donate a day&#8217;s worth of their sales to a variety of respected relief agencies. </p>
<p>I&#8217;m enormously happy to participate in this effort and so will be donating 100% of gross sales from MemoryMiner for 24 hours day starting midnight PST on Jan 20th. I&#8217;ll be making my donation to <a href="http://doctorswithoutborders.org/" target="_blank">Doctors Without Borders</a> whose work I greatly respect.</p>
<p>So, I invite everyone to visit <a href="http://indierelief.com" target="_blnak">Indie+Relief</a>, buy some fantastic software, and in the process help ease the massive suffering going on right now in Haiti.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.memoryminer.com/blog/?feed=rss2&amp;p=130</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MemoryMiner 2.0.5 Now Released</title>
		<link>http://www.memoryminer.com/blog/?p=129</link>
		<comments>http://www.memoryminer.com/blog/?p=129#comments</comments>
		<pubDate>Wed, 13 Jan 2010 02:36:54 +0000</pubDate>
		<dc:creator>John Fox</dc:creator>
				<category><![CDATA[Developer]]></category>
		<category><![CDATA[MemoryMiner 2.0]]></category>

		<guid isPermaLink="false">http://www.memoryminer.com/blog/?p=129</guid>
		<description><![CDATA[Whenever you make a major release of software, you always worry that there will be bugs that weren&#8217;t found during testing. I&#8217;ve shipped enough software on enough platforms to know that there will always be problems that appear after you ship. This said, I&#8217;m happy to announce that version 2.0.5 is now available. It offers [...]]]></description>
			<content:encoded><![CDATA[<p>Whenever you make a major release of software, you always worry that there will be bugs that weren&#8217;t found during testing. I&#8217;ve shipped enough software on enough platforms to know that there will always be problems that appear after you ship. </p>
<p>This said, I&#8217;m happy to announce that version 2.0.5 is now available. It offers some important bug fixes. You can get the release by simply choosing &#8220;Check for Updates&#8221; from the MemoryMiner menu. Release notes here:</p>
<p><a href="http://memoryminer.com/SWUpdate/2.05/" target="_blank">http://memoryminer.com/SWUpdate/2.05</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.memoryminer.com/blog/?feed=rss2&amp;p=129</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MemoryMiner 2.0: One Week In</title>
		<link>http://www.memoryminer.com/blog/?p=128</link>
		<comments>http://www.memoryminer.com/blog/?p=128#comments</comments>
		<pubDate>Wed, 30 Dec 2009 23:52:50 +0000</pubDate>
		<dc:creator>John Fox</dc:creator>
				<category><![CDATA[MemoryMiner 2.0]]></category>
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://www.memoryminer.com/blog/?p=128</guid>
		<description><![CDATA[It&#8217;s been been just over a week since MemoryMiner 2.0 was released. This version was way too long coming, but such is the nature of software sometimes. As I&#8217;ve said many times on the MDN show (a podcast for indie Mac developers on which I&#8217;m a co-host) finished software does not a product make: you [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s been been just over a week since MemoryMiner 2.0 was released. This version was way too long coming, but such is the nature of software sometimes. As I&#8217;ve said many times on the <a href="http://www.mac-developer-network.com" target="_blank">MDN show </a> (a podcast for indie Mac developers on which I&#8217;m a co-host) finished software does not a product make: you need to put a serious effort into all the supporting parts such as a website, PR efforts, screen movies, etc. etc. Getting all this together is part of the reason why MM 2.0 took longer to get out than I would have liked. I think the new web site turned out quite nicely, so many thanks to Martin and Fabio at <a href="http://www.mcubedsw.com/design" target="_blank">MCubed Design</a> for their work. The old MemoryMiner website was getting long in the tooth, so I decided to strip it down then fill it in with new content. There&#8217;s still work to do here, but so far, so good.</p>
<p>Invariably, whenever you make a major new release, there will be a few bumps as brand new users discover things that even the most ardent beta testers can miss. For this, I&#8217;m incredibly grateful for the <a href="http://sparkle.andymatuschak.org/" target="_blank">Sparkle Framework</a>, and the <a href="http://clickontyler.com/blog/2009/08/shine-an-indie-mac-dashboard/" target="_blank">Shine</a> project for making it much easier to to create, release and track updates. </p>
<p>I&#8217;m pleased to report that the existing user base has been upgrading at a very swift rate, which I take to be a good sign. Releasing a consumer product late in the holiday season is always a challenge since people tend to be distracted. Slowly but surely, I hope to get the word out with some good coverage in the usual places. </p>
<p>In the meantime, I invite everyone to tell 50,000 of their closest friends about MemoryMiner 2.0!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.memoryminer.com/blog/?feed=rss2&amp;p=128</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Getting Attached to Video</title>
		<link>http://www.memoryminer.com/blog/?p=127</link>
		<comments>http://www.memoryminer.com/blog/?p=127#comments</comments>
		<pubDate>Wed, 11 Nov 2009 00:24:52 +0000</pubDate>
		<dc:creator>John Fox</dc:creator>
				<category><![CDATA[Developer]]></category>
		<category><![CDATA[MemoryMiner 2.0]]></category>

		<guid isPermaLink="false">http://www.memoryminer.com/blog/?p=127</guid>
		<description><![CDATA[One of the areas I&#8217;ve been refining in this last round of work on MemoryMiner 2.0 is the way that video is displayed in the attachment viewer. Most consumer point-and-shoot cameras take video, so I often shoot short videos that don&#8217;t need editing and attach them to photos. One of my favorites is of my [...]]]></description>
			<content:encoded><![CDATA[<p>One of the areas I&#8217;ve been refining in this last round of work on MemoryMiner 2.0 is the way that video is displayed in the attachment viewer. Most consumer point-and-shoot cameras take video, so I often shoot short videos that don&#8217;t need editing and attach them to photos. One of my favorites is of my son sending a bowl of oatmeal off the edge of his high chair when he was a toddler. </p>
<p>At any rate, the video I had shot was 640 X 480 pixels, and thus when viewed in the MemoryMiner 1.x attachment viewer (which uses a WebView to display all attachments) would have scrollers:</p>
<p><img src="/graphics/BlogPhotos/OldVideoAttachment.jpg"/>
<p>In order to see the playback controls you&#8217;d have to scroll. Ugly.</p>
<p>In 2.0 I wanted to fix this, so at first I thought I&#8217;d use a QTMovieView, thinking I could have better control over sizing and scaling. This turned out to be a bad solution for two reasons. First is that the video is scaled up in size as the view is resized: chunky ugly video sucks. Secondly, the playback controls aren&#8217;t nearly as slick looking as in the QuickTime web browser plugin. Have a look here:</p>
<p><img src="/graphics/BlogPhotos/UglyQTMovieViewControls.jpg"/></p>
<p>Since I was already using a WebView to display all attachments (because I&#8217;m lazy, and for the most part the WebView does a spectacular job of doing the right thing) I thought maybe I could make the HTML to display the video smarter. After some help from Schmichael Padullah (name changed to protect the guilty) I learned about the magic of the max-width/max-height CSS attribute. I created this HTML test:</p>
<p>&lt;html&gt;<br />
&lt;body style=&#8221;background-color: rgb(38,38,38);&#8221;&gt;<br />
    &lt;video controls=&#8221;" autoplay=&#8221;"<br />
    style=&#8221;margin: auto; position: absolute; top: 0; right: 0; bottom: 0; left: 0;<br />
    max-width:90%; max-height:90%;&#8221; name=&#8221;media&#8221; src=&#8221;file:///Users/johnfox/Movies/PieOatmeal.mov&#8221;&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</p>
<p>Works like a champ! So now, for video attachments I programmatically create an HTML string using NSString stringWithFormat so I can set the max-width, max-height and src values then load that into the WebView. The result?</p>
<p><img src="/graphics/BlogPhotos/FinishedAttachmentView.jpg"/></p></p>
]]></content:encoded>
			<wfw:commentRss>http://www.memoryminer.com/blog/?feed=rss2&amp;p=127</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>It&#8217;s About Time!</title>
		<link>http://www.memoryminer.com/blog/?p=126</link>
		<comments>http://www.memoryminer.com/blog/?p=126#comments</comments>
		<pubDate>Tue, 03 Nov 2009 17:46:47 +0000</pubDate>
		<dc:creator>John Fox</dc:creator>
				<category><![CDATA[Developer]]></category>
		<category><![CDATA[MemoryMiner 2.0]]></category>

		<guid isPermaLink="false">http://www.memoryminer.com/blog/?p=126</guid>
		<description><![CDATA[It&#8217;s been so long since I last posted, I&#8217;m truly embarrassed. However, it&#8217;s not without reason. I&#8217;ve been so heads down with getting MemoryMiner 2.0 ready for sale, that I&#8217;ve simply been ignoring the blog. Since MemoryMiner is very very nearly ready to ship (Fabio, you&#8217;re going to have that beautiful new web site ready [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s been so long since I last posted, I&#8217;m truly embarrassed. However, it&#8217;s not without reason. I&#8217;ve been so heads down with getting MemoryMiner 2.0 ready for sale, that I&#8217;ve simply been ignoring the blog. </p>
<p>Since MemoryMiner is very very nearly ready to ship (Fabio, you&#8217;re going to have that beautiful new web site ready for me, right?) I thought it would be nice to add another sneak preview, which is the totally revamped time slider. The time slider in the current 1.x version of MemoryMiner only allows you to search with a resolution of one month:</p>
<p><img src="/graphics/BlogPhotos/OldSearchSlider.jpg" alt="MM 1.x date range slider"/></p>
<p>The biggest problem with this time slider is that it doesn&#8217;t change resolution as the date range does (i.e. you want to see months and days for a time span of just a few months, or decades and years for a longer time span). Further, at a certain point, you can&#8217;t cram in all the markers on a traditional slider: the user never gets accurate results.</p>
<p>This is not an easy problem to solve, but I think I&#8217;ve come up with a pretty elegant solution. Behold the new multi-resolution time slider, shown here measuring in decades and years:</p>
<p><img src="/graphics/BlogPhotos/DecadesYearsDateRange.jpg" alt="MM 2.0 Decades/Years Date range slider"/></p>
<p>&#8230;shown here, measuring in years and months:</p>
<p><img src="/graphics/BlogPhotos/YearMonthDateRange" alt="MM 2.0 Years/Months Date range slider"/></p>
<p>&#8230;and shown here, measuring in months and days:</p>
<p><img src="/graphics/BlogPhotos/MonthDayRange.jpg" alt="MM 2.0 Years/Months Date range slider"/></p>
<p>It took a tremendous effort to get this all working correctly, and there&#8217;s a still a bit graphical tweaking to do, but it&#8217;s a world of improvement over the prior solution. </p>
<p>I have tons of ideas for new things to do with timelines, but first I have to ship 2.0, so back to the time machine (I mean coal mine).</p>
<p>PS Another excuse for the lack of blog posts is that I&#8217;ve been podcasting regularly on the Mac Developer Network (<a href="http://www.mac-developer-network.com/category/shows" target="_blank">http://www.mac-developer-network.com/category/shows/</a>). I even did two video podcasts, one of which can be seen here: <a href="http://www.pixelcorps.tv/mbkd_031" target="_blank">http://www.pixelcorps.tv/mbkd_031</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.memoryminer.com/blog/?feed=rss2&amp;p=126</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MDN Episode 4 Now Live</title>
		<link>http://www.memoryminer.com/blog/?p=125</link>
		<comments>http://www.memoryminer.com/blog/?p=125#comments</comments>
		<pubDate>Wed, 15 Jul 2009 19:05:15 +0000</pubDate>
		<dc:creator>John Fox</dc:creator>
				<category><![CDATA[Developer]]></category>
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://www.memoryminer.com/blog/?p=125</guid>
		<description><![CDATA[It&#8217;s Wednesday, so that can only mean one thing: Scotty has been lax about getting the latest MDN Show podcast edited and ready for the world. Complaints about the excess time needed to make my crummy audio sound good no longer hold water, since I went out and spent my son&#8217;s college education fund on [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s Wednesday, so that can only mean one thing: Scotty has been lax about getting the latest MDN Show podcast edited and ready for the world. </p>
<p>Complaints about the excess time needed to make my crummy audio sound good no longer hold water, since I went out and spent my son&#8217;s college education fund on a new mic. </p>
<p>Give a listen:</p>
<p><a href="http://www.mac-developer-network.com/shows/podcasts/mdnshow/mdn004/" target="_blank">MDN Show Episode 4</a></p>
<p>PS Don&#8217;t tell anyone that Borris&#8217; real name is Todor.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.memoryminer.com/blog/?feed=rss2&amp;p=125</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
