Planet Banshee http://planet.banshee.fm Planet Banshee - http://planet.banshee.fm The Banshee Blog: Banshee 1.7.5 Released http://banshee.fm/2010/09/01/banshee-1-7-5-released/ <a href="http://banshee-project.org/download/archives/1.7.5/">Banshee 1.7.5</a>, part of the active-development 1.7 series leading to 1.8, has been released. Read the <a href="http://banshee-project.org/download/archives/1.7.5/">release notes</a> for more info. <a href="http://banshee-project.org/download">Get it now!</a> 2010-09-01T22:29:22+00:00 Paul Cutler: GNOME Journal Issue 21 is out! http://feedproxy.google.com/~r/pcutler/~3/lbfepGW0CRQ/ <p>The <a href="http://www.gnomejournal.org">GNOME Journal team has released the latest issue</a>, featuring five brand new articles.</p> <p>We have three articles based on talks and experiences at GUADEC 2010 in The Hague and two interviews.</p> <ul> <li><a href="http://www.gnomejournal.org/article/106/writing-simple-real-time-games-for-gnome">Writing simple, real-time games</a> by Chris Lord</li> <li><a href="http://www.gnomejournal.org/article/104/should-i-get-involved">Should I get involved?</a> by William Carlson (aka Williamfromtexas)</li> <li><a href="http://www.gnomejournal.org/article/102/behind-the-scenes-with-joanmarie-diggs">Behind the Scenes with Joanmarie Diggs</a></li> <li><a href="http://www.gnomejournal.org/article/103/grilo-integrating-multimedia-content-in-your-application">Grilo: Integrating multimedia content in your application</a> by Iago Toral</li> <li><a href="http://www.gnomejournal.org/article/105/interview-with-bradley-kuhn-of-the-gnome-advisory-board">GNOME Advisory Board interview with Bradley Kuhn</a> by Stormy Peters</li> </ul> <p>What are you waiting for? <a href="http://www.gnomejournal.org">Go read it</a>!</p> <p>GNOME Journal is licensed under a <a href="http://creativecommons.org/licenses/by-sa/3.0/">CC-BY-SA 3.0 license</a>. Translate it, podcast it, share it!</p> <img src="http://feeds.feedburner.com/~r/pcutler/~4/lbfepGW0CRQ" height="1" width="1" /> 2010-09-01T15:43:43+00:00 Paul Cutler Alex Launi: Gudev-sharp and GKeyfile-sharp have moved http://www.lamalex.net/2010/08/gudev-sharp-and-gkeyfile-sharp-have-moved/ <p>They&#8217;re now both hosted on github with the rest of Mono. Check it out! <a href="http://github.com/mono/gudev-sharp">http://github.com/mono/gudev-sharp</a> and <a href="http://github.com/mono/gkeyfile-sharp">http://github.com/mono/gkeyfile-sharp</a>.</p> 2010-08-31T18:36:03+00:00 Paul Cutler: Taking Snowy for a Walk Issue #1 http://feedproxy.google.com/~r/pcutler/~3/4_H684ezA5Y/ <p>“<em>I steal from every movie ever made</em>.” &#8211; Quentin Tarantino</p> <p>Like Quentin, I&#8217;m stealing from <a href="http://www.0d.be/2010/08/25/shell-yes-1/">Frederic Peters&#8217; recent &#8220;Shell Yes!&#8221; blog post</a> and am going to try and bring you, our loyal reader, semi-regular updates on what&#8217;s going on in the world of Snowy development as we work towards launching Tomboy Online.</p> <p><a href="http://www.digitalprognosis.com/">Jeff Schroeder</a> patched Snowy this week using, as he puts it, &#8220;Shiney django admin stuff&#8221; to not allow users who are not in the upcoming alpha and beta to sync their notes. Users will instead see something similar to this:</p> <p><img src="http://bugzilla-attachments.gnome.org/attachment.cgi?id=168608" alt="Snowy Sad Face" /></p> <p>Snowy could use some design love, so <a href="http://www.paulcutler.org/blog/?p=1413">we blogged about that</a> and created a <a href="http://live.gnome.org/Snowy/DesignerPlayground">Designer Playground on the wiki</a>. Add your mockups and we&#8217;re looking for help if you can make those mockups come to life!</p> <p>We created a <a href="http://mail.gnome.org/mailman/listinfo/tomboy-online-list">mailing list</a> that users can opt-in to for Tomboy Online news, release announcements and non-development type stuff.</p> <p>OpenID support for creating accounts and logging in received some love. When completed, it will look similar to what <a href="https://bitbucket.org/account/signin/">bitbucket</a> uses from a UI perspective.</p> <p>We&#8217;re also working on <a href="http://mail.gnome.org/archives/snowy-list/2010-August/msg00012.html">creating a proposal to send to the GNOME Board to have a Snowy hackfest</a>. We are discussing the goals of what we want to accomplish, who can come, where to have it and when. If you&#8217;re interested, join the mailing list, now is a great time to get involved!</p> <p>Lastly, we&#8217;re hoping to launch the Snowy alpha test with a handful (and I really mean a handful) of testers on September 13th. For more information, <a href="http://live.gnome.org/Snowy/FAQ">we wrote a FAQ</a> on the upcoming alpha test, which is required reading &#8211; there will be a test next time! After the first invites go out, we hope to add more participants weekly as we work towards an open beta. Alpha testers will be expected to file bugs, give feedback and <del datetime="2010-08-26T21:00:12+00:00">pay to be in the beta</del>.</p> <p><em>Did you know? <a href="http://en.wikipedia.org/wiki/Tintin_(character)">TinTin</a> was <a href="http://www.oreillynet.com/network/2004/10/18/graphics/tomboy-recent.jpg">Tomboy&#8217;s first icon / logo</a> in GNOME on the panel.</em></p> <img src="http://feeds.feedburner.com/~r/pcutler/~4/4_H684ezA5Y" height="1" width="1" /> 2010-08-26T21:34:39+00:00 Paul Cutler Chris Howie: OpenVP has landed http://www.chrishowie.com/2010/08/20/openvp-has-landed/ <p>Well, if you&#8217;ve been waiting for some kind of stable release of OpenVP for Banshee, you will love this. <a href="http://mail.gnome.org/archives/banshee-list/2010-August/msg00072.html">OpenVP is part of the Banshee Community Extensions 1.7.4 release!</a> <a href="http://download.banshee.fm/banshee-community-extensions/1.7.4/">Go get it</a>, and be sure to <a href="http://code.google.com/p/openvisualizationplatform/issues/list">file any bugs</a> you come across.</p> 2010-08-20T17:53:26+00:00 Paul Cutler: Wanted: Rocking Web Design http://feedproxy.google.com/~r/pcutler/~3/C_Fl2qN3WO4/ <p>The Tomboy Online / Snowy team needs your help! We have an alpha instance of Tomboy Online up and running thanks to the wonderful GNOME Sysadmin team and we even have some new contributors helping with Snowy&#8217;s code (hi Jeff!).</p> <p>But we need help! We need help with the web design for Tomboy Online and we&#8217;ll need help implementing it.</p> <p>First, the design. Here&#8217;s what we have today:</p> <p><a href="http://www.flickr.com/photos/silwenae/4904106271/" title="tomboy-online by pcutler, on Flickr"><img src="http://farm5.static.flickr.com/4075/4904106271_a32eaa2940.jpg" width="500" height="434" alt="tomboy-online" /></a></p> <p>(<em>Click through to see a larger screenshot</em>).</p> <p>And that&#8217;s just the home page after you log in. We need help with how to display a note, your list of notes, and editing notes. (Hope I&#8217;m not scaring you away yet!) And that&#8217;s just off the top of my head &#8211; I&#8217;m sure there&#8217;s more that I&#8217;m missing. (Update: <a href="http://automorphic.blogspot.com/2009/05/tomboy-0151-release-brings-new-online.html"> Sandy&#8217;s blog post shows some more screenshots</a>, including a page with a list of notes).</p> <p>Do you have wicked web design skills? Have some time to put together some mockups? Are you able to take feedback well? Then we&#8217;re looking for <strong>YOU</strong>. I don&#8217;t even care about workflow right now. You can join the Snowy mailing list, you can email me with questions, you can join us in IRC in #snowy on irc.gimpnet.org, you can blog it about it and let us know &#8211; we&#8217;d just love to see some mockups so we can then go <del datetime="2010-08-18T14:37:07+00:00">hunting for a sucker</del> looking for a volunteer to bring your design to life. </p> <p>Manuel started <a href="http://manuel-uewwy.posterous.com/mockups-for-tomboy-snowy-tomboy-online">work on this potential design</a> last year and we&#8217;re looking for help to build on that or for something new. But we need help in building iterations of it and moving forward.</p> <p>Tomboy Online, <a href="http://live.gnome.org/Snowy">powered by Snowy</a>, will be one of <a href="http://www.gnome.org">GNOME</a>&#8216;s first web services with application integration. Get the <a href="http://git.gnome.org/cgit/snowy">code here</a>, learn more about our <a href="http://live.gnome.org/Snowy/FAQ">upcoming alpha here</a> or <a href="http://mail.gnome.org/mailman/listinfo/snowy-list">join our mailing list here</a>. You will be able to sync your Tomboy notes to the web using GNOME&#8217;s Tomboy Online service or your own server running Snowy. Snowy is free software licensed under the <a href="http://www.gnu.org/licenses/agpl.html">AGPL</a>.</p> <p>And thank you in advance for your help!</p> <img src="http://feeds.feedburner.com/~r/pcutler/~4/C_Fl2qN3WO4" height="1" width="1" /> 2010-08-18T15:09:38+00:00 Paul Cutler Gabriel Burt: Use Bugzilla Like a Champ http://gburt.blogspot.com/2010/08/use-bugzilla-like-champ.html <p>Things that can eat up way too much time: <ul><li> Given a bug id #, going to its URL</li> <li> Searching bugzilla</li></ul></p> <p>To save time, frustration, and get more done (since it's no longer time-consuming and frustrating), I added a few, special bookmarks. They contain a keyword, which you can type in the URL bar to go to the bookmark, and a <em>%s</em>, which is replaced by whatever you type after the keyword in the URL bar. In Firefox, you can right click a bookmark and edit its Properties to add a keyword.</p> <center><a href="http://www.flickr.com/photos/matthewfch/1589168522/"><img src="http://3.bp.blogspot.com/_MXUP18ra1ik/TGmEuioZehI/AAAAAAAAA_8/BD6cOMUp0KM/s800/fast-bug.jpg" alt="" /></a></center> <p>Here are the ones I use most, and examples of what you can type in the URL/Awesome bar: <ul><li> Go to a bug: <a href="https://bugzilla.gnome.org/show_bug.cgi?id=%s">bgoid</a><br /> bgoid 585112</li> <li> Search BGO: <a href="http://bugzilla.gnome.org/buglist.cgi?query=%s">bgo</a><br /> bgo product:banshee os:windows<br /> bgo product:hyena status:needinfo<br /> <a href="https://bugzilla.gnome.org/page.cgi?id=quicksearchhack.html">Other search fields you can use</a></li> <li> Search Banshee bugs by summary: <a href="https://bugzilla.gnome.org/buglist.cgi?query=product%3Abanshee%20summary%3A%s">bbug</a><br /> bbug startup crash<br /> bbug metadata</li></ul></p> <p>Enjoy!</p><div class="blogger-post-footer"><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/33979271-4896559176009052496?l=gburt.blogspot.com" alt="" /></div> 2010-08-16T19:35:10+00:00 Gabriel Burt Alex Launi: OMG that’s so 2009 http://www.lamalex.net/2010/08/omg-thats-so-2009/ <p><a href="http://git.gnome.org/browse/banshee/commit/?id=a3dc5844e08c9e010e8ddfc9004d2fe1a215496f">Yesterday it finally landed</a>. Gabriel Burt, one of Banshee&#8217;s maintainers, merged in the GIO/udev hardware backend that Alan McGovern and I have been working on. This is awesome for everyone. Here&#8217;s why it&#8217;s awesome for you.</p> <p><span><strong>Are you a user?</strong></span></p> <ul> <li><span>More reliable device detection (maybe, we hope at least!)</span></li> <li><span>More devices supported, including your iPhone or iPod touch!</span></li> </ul> <p><span><strong>Are you a distribution?</strong></span></p> <ul> <li><span>No more HAL dependency! You can finally <em>actually</em> drop HAL from your iso <em>and</em> ship the best media player Gnome has to offer (sorry Rhythmbox- we just rule <strong>really</strong> hard).</span></li> </ul> <p>Want to check it out? Banshee 1.7.5 will be <a href="http://banshee.fm/about/calendar/">released on September 1</a>, or you get get it now from Banshee <a href="http://git.gnome.org/browse/banshee/log/">git master</a>. There are a few new dependencies you&#8217;ll need- here they are.</p> <ul> <li>gio-sharp: git://gitorious.org/gio-sharp/mainline.git</li> <li>libgpod-sharp:  git://gtkpod.git.sourceforge.net/gitroot/gtkpod/libgpod</li> <li>gudev-sharp: git://gitorious.org/gudev-sharp/gudev-sharp.git</li> <li>gkeyfile-sharp: git://gitorious.org/gkeyfile-sharp/gkeyfile-sharp.git</li> </ul> <p>I recommend building with the &#8211;disable-hal flag, that&#8217;s how you really get the creamy goodness of our work. Now go git r done! Please test, break, hack, and caress. We&#8217;ve tested with iPods, iPhones, Mtp devices, Android phones, and maybe some other crap, but I&#8217;m sure you have something weird we&#8217;ve never tried. We want it to work- nay- we <em>need </em>it to work. We get off on it working.</p> <p>And here&#8217;s the screenshot you read all of that bullshit just to see&#8230;</p> <p><a href="http://www.lamalex.net/wp-content/uploads/2010/08/look-ma-no-hal.png"><img class="aligncenter size-large wp-image-133" title="look-ma-no-hal" src="http://www.lamalex.net/wp-content/uploads/2010/08/look-ma-no-hal-1024x640.png" alt="" width="640" height="400" /></a></p> 2010-08-14T16:19:00+00:00 Paul Cutler: Help Needed http://feedproxy.google.com/~r/pcutler/~3/Hcq5NLWT2D8/ <p>I need some help! I&#8217;m looking for pictures from last year&#8217;s Boston Summit. They can be anything &#8211; hallway conversations, speakers, shooting pool after the talks. Anyone have any links or photos they can share? Flickr and Google didn&#8217;t turn up a lot of results.</p> <p>Thanks!</p> <img src="http://feeds.feedburner.com/~r/pcutler/~4/Hcq5NLWT2D8" height="1" width="1" /> 2010-08-12T16:55:53+00:00 Paul Cutler Scott Peterson: Disoriented http://themonkeysgrinder.blogspot.com/2010/08/tyranny-of-terminology-would-have-us.html The Tyranny of Terminology would have us discussing Object Orientation and Functional Programming, calling our code by its Patterns and Paradigms. I am going to plead ignorance of these epistemologies and just show you some&nbsp;C#. Feel free to know for yourself what it Really Means.<br /><br />Code like this was written for Mono.Upnp. Expect news there soon.<br /><br />Our story begins here:<br /><br /><span class="Apple-style-span"><span class="Apple-style-span">abstract class</span> <span class="Apple-style-span">ContentDirectory</span></span><br /><br />"ContentDirectory" is UPnP parlance for a directory of content. (See the <a href="http://www.upnp.org/specs/av/UPnP-av-ContentDirectory-v1-Service.pdf">ContentDirectory:1 service template PDF</a>. Or better still, don't.) The CD is a hierarchy of objects. Objects have descriptive class names like <span class="Apple-style-span"><span class="Apple-style-span">"object.item.audioItem.musicTrack"</span></span> and <span class="Apple-style-span"><span class="Apple-style-span">"object.container.systemFolder"</span></span>. That gives you some idea, yes?<br /><br />The CD has methods like <span class="Apple-style-span">Browse</span> and <span class="Apple-style-span">Search</span>. Here is the signature for <span class="Apple-style-span">Search</span>:<br /><br /><span class="Apple-style-span"><span class="Apple-style-span">string</span> Search (<span class="Apple-style-span">string</span> containerId,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Apple-style-span">string</span> searchCriteria,<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span class="Apple-style-span">int</span> startIndex,<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span class="Apple-style-span">int</span> requestCount,<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span class="Apple-style-span">out</span> <span class="Apple-style-span">int</span> numberedReturned,<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span class="Apple-style-span">out</span> <span class="Apple-style-span">int</span> totalMatches)</span><br /><br />I will pause to explain the return value: it is a string of XML describing the result set.<br /><br />Now, in a source file not far away...<br /><br /><span class="Apple-style-span"><span class="Apple-style-span">class</span> <span class="Apple-style-span">InMemoryContentDirectory</span> : <span class="Apple-style-span">ContentDirectory</span></span><br /><br />It may not shock you to learn that an&nbsp;<span class="Apple-style-span"><span class="Apple-style-span">InMemoryContentDirectory</span></span> keeps an in-memory collection of its object hierarchy. It has a method called <span class="Apple-style-span">GetChildren</span>. Here is the signature:<br /><br /><span class="Apple-style-span"><span class="Apple-style-span">IEnumerable&lt;CDObject&gt;</span> GetChildren (<span class="Apple-style-span">string</span> containerId)</span><br /><br />Explanatory&nbsp;pause #2: <span class="Apple-style-span"><span class="Apple-style-span">CDObject</span></span> is short for "Content Directory Object"; it is the root type of objects in the CD.<br /><br />If you were me, then this is how you would implement&nbsp;<span class="Apple-style-span"><span class="Apple-style-span">InMemoryContentDirectory</span>.Search</span>:<br /><br /><span class="Apple-style-span">totalMatches = 0;</span><br /><span class="Apple-style-span"><span class="Apple-style-span">var</span> results = <span class="Apple-style-span">new</span> <span class="Apple-style-span">List&lt;CDObject&gt;</span> (requestCount);</span><br /><span class="Apple-style-span"><span class="Apple-style-span">foreach</span> (<span class="Apple-style-span">var</span> child <span class="Apple-style-span">in</span>&nbsp;</span><span class="Apple-style-span">GetChildren (containerId)) {</span><br /><span class="Apple-style-span"><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;if</span> (IsMatch (child, searchCriteria)) {</span><br /><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;totalMatches++;</span><br /><span class="Apple-style-span"><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if</span> (totalMatches &gt; startIndex &amp;&amp;</span><br /><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;results.Count &lt; requestCount)</span><br /><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span><br /><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;results.Add (child);</span><br /><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><br /><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;}</span><br /><span class="Apple-style-span">}</span><br /><span class="Apple-style-span">numberReturned = results.Count;</span><br /><span class="Apple-style-span"><span class="Apple-style-span">return</span> Serialize (results);</span><br /><br />I may or may not have promised a theory-free post — I don't really remember now — but in any event, this is standard Object Oriented Programing fare. To state the obvious:<br /><ul><li><span class="Apple-style-span">You create a list to hold the results.</span></li><li><span class="Apple-style-span">You iterate through the children of the subject container.</span></li><li>For each match, you increment <span class="Apple-style-span">totalMatches</span>.</li><li>If you have not reached the <span class="Apple-style-span">startIndex</span>, you keep going.</li><li>Otherwise unless you have reached the <span class="Apple-style-span">requestCount</span>, you add the matching object to the results list.</li><li>You return the serialized results list.</li><ul><li><span class="Apple-style-span">Which iterates through the list</span> and serializes each object to XML, returning the whole XML string.</li></ul></ul><div>I have highlighted the problems with your solution in salmon. You are allocating a new <span class="Apple-style-span"><span class="Apple-style-span">List&lt;CDObject&gt;</span></span> to hold objects which already exist in a collection somewhere. Also, you are iterating through the results twice: first in your pass through the container's children and then again to serialize them.<br /><br />If you were still me then this just won't do. LINQ should come to mind but have I got a fun surprise for you: Mono.Upnp targets the .NET 2.0 profile. So how might you Query the Language without fancy INtegration?<br /><br /><span class="Apple-style-span"><span class="Apple-style-span">IEnumerable&lt;CDObject&gt;</span> Search (<br /><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;string</span> containerId,</span><br /><span class="Apple-style-span"><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;string</span> searchCriteria,</span><br /><span class="Apple-style-span"><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;int</span> startIndex,</span><br /><span class="Apple-style-span"><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;int</span> requestCount)</span><br /><span class="Apple-style-span">{</span><br /><span class="Apple-style-span"><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;var</span> count = 0;</span><br /><span class="Apple-style-span"><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;foreach</span> (<span class="Apple-style-span">var</span> child <span class="Apple-style-span">in</span> GetChildren (containerId)) {</span><br /><span class="Apple-style-span"><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if</span> (IsMatch (child, searchCriteria)) {</span><br /><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count++;</span><br /><span class="Apple-style-span"><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if</span> (count &gt; startIndex &amp;&amp;</span><br /><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count - startIndex &lt; requestCount)</span><br /><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span><br /><span class="Apple-style-span"><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yield return</span> child;</span><br /><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><br /><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><br /><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;}</span><br /><span class="Apple-style-span">}</span><br /><span class="Apple-style-span"><br /></span><br /><span class="Apple-style-span"><span class="Apple-style-span">string</span>&nbsp;Search (<span class="Apple-style-span">string</span>&nbsp;containerId,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Apple-style-span">string</span>&nbsp;searchCriteria,<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span class="Apple-style-span">int</span>&nbsp;startIndex,<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span class="Apple-style-span">int</span>&nbsp;requestCount,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Apple-style-span">out</span>&nbsp;<span class="Apple-style-span">int</span>&nbsp;numberedReturned,<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span class="Apple-style-span">out</span>&nbsp;<span class="Apple-style-span">int</span>&nbsp;totalMatches)</span><br /><span class="Apple-style-span">{</span><br /><span class="Apple-style-span"><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;var</span> serializer = <span class="Apple-style-span">new</span> Serializer ();</span><br /><span class="Apple-style-span"><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;var</span> results = Search (</span><br /><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;containerId, searchCriteria,</span><br /><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;startIndex, requestCount);</span><br /><span class="Apple-style-span"><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;var</span> xml = serializer.Serialize (results);</span><br /><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;numberReturned = serializer.NumberReturned;</span><br /><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;totalMatches = 0;</span><br /><span class="Apple-style-span"></span><span class="Apple-style-span"><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;return</span> xml;</span><br /><span class="Apple-style-span">}</span></div><ul></ul>No more <span class="Apple-style-span"><span class="Apple-style-span">List&lt;CDObject&gt;</span></span> and we only iterate through the results once (during <span class="Apple-style-span"><span class="Apple-style-span">Serializer</span>.Serialize</span>). The serializer counts the results for us during its iteration and exposes <span class="Apple-style-span"><span class="Apple-style-span">Serializer</span>.</span><span class="Apple-style-span">NumberReturned</span>.<br /><br />There is one big problem: <span class="Apple-style-span">totalMatches</span> will always be 0. We know what the correct value should be (it is the <span class="Apple-style-span">count</span> variable in our generator), but we have no way to get it out: generator methods cannot have by-reference parameters (a.k.a. "out" parameters).<br /><br />To make this solution work, we could return something fancier than plain old <span class="Apple-style-span"><span class="Apple-style-span">IEnumerable&lt;CDObject&gt;</span></span> which would expose <span class="Apple-style-span">count</span> through a property; let's call it&nbsp;<span class="Apple-style-span">TotalMatchesCount</span>. But we could not use generators; we would have to implement <span class="Apple-style-span"><span class="Apple-style-span">IEnumerator&lt;CDObject&gt;</span></span> by hand just like'n Ye Olde Days.<br /><br />A final caveat:&nbsp;<span class="Apple-style-span">TotalMatchesCount</span>&nbsp;would only have the correct value <i>after</i>&nbsp;we iterate through the results in <span class="Apple-style-span"><span class="Apple-style-span">Serializer</span>.Serialize</span>, just as with <span class="Apple-style-span"><span class="Apple-style-span">Serializer</span>.NumberReturned</span>.<br /><br />This approach frankly sucks. Alright you/me, show me your teeth!<br /><br /><span class="Apple-style-span"><span class="Apple-style-span">abstract</span> <span class="Apple-style-span">void</span> VisitChildren (<span class="Apple-style-span">string</span> containerId,</span><br /><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Apple-style-span">Action&lt;CDObject&gt;</span> visitor);</span><br /><br /><div><span class="Apple-style-span"><span class="Apple-style-span">string</span>&nbsp;Search (<span class="Apple-style-span">string</span>&nbsp;containerId,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Apple-style-span">string</span>&nbsp;searchCriteria,<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span class="Apple-style-span">int</span>&nbsp;startIndex,<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span class="Apple-style-span">int</span>&nbsp;requestCount,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Apple-style-span">out</span>&nbsp;<span class="Apple-style-span">int</span>&nbsp;numberedReturned,<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span class="Apple-style-span">out</span>&nbsp;<span class="Apple-style-span">int</span>&nbsp;totalMatches)</span></div><div><span class="Apple-style-span">{</span></div><span class="Apple-style-span"><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;var</span>&nbsp;total =&nbsp;<span class="Apple-style-span">0</span>;</span><br /><div><span class="Apple-style-span"><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;var</span>&nbsp;count =&nbsp;<span class="Apple-style-span">0</span>;</span></div><div><span class="Apple-style-span"><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;var</span>&nbsp;serializer = new Serializer ();</span></div><div><span class="Apple-style-span">&nbsp;&nbsp; &nbsp;VisitChildren (containerId, child =&gt; {</span><br /><span class="Apple-style-span"><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if</span> (IsMatch (child, searchCriteria) {</span><br /><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total++;</span><br /><span class="Apple-style-span"><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if</span> (total &gt; startingIndex &amp;&amp;</span><br /><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count &lt; requestCount)</span><br /><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span><br /><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;serializer.OnResult (child);</span><br /><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count++;</span><br /><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><br /><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><br /><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;});</span><br /><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;numberReturned = count;</span><br /><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;totalMatches = total;</span><br /><span class="Apple-style-span"><span class="Apple-style-span">&nbsp;&nbsp;&nbsp;&nbsp;return</span> serializer.OnDone ();</span></div><div><span class="Apple-style-span">}</span></div><br />No more <span class="Apple-style-span"><span class="Apple-style-span">IEnumerable&lt;CDObject&gt;</span> GetChildren</span>, and the implementation lives in the abstract <span class="Apple-style-span"><span class="Apple-style-span">ContentDirectory</span></span> class where it works with any sort of subclass: in-memory, db-backed, web service, &amp;c.<br /><br />As an exercise I want you to invent a name for this pattern which rhymes with neither "shmisitor" nor "shmobserver." Bonus points for double entendres. Then I want you to imagine a world without return values. Get back to me when your mind is blown.<div class="blogger-post-footer"><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/3573606178901893990-289001157383866465?l=themonkeysgrinder.blogspot.com" alt="" /></div> 2010-08-12T13:29:46+00:00 Scott The Banshee Blog: Banshee 1.7.4 Released http://banshee.fm/2010/08/11/banshee-1-7-4-released/ <a href="http://banshee-project.org/download/archives/1.7.4/">Banshee 1.7.4</a>, part of the active-development 1.7 series leading to 1.8, has been released. Read the <a href="http://banshee-project.org/download/archives/1.7.4/">release notes</a> for more info. <a href="http://banshee-project.org/download">Get it now!</a> 2010-08-11T20:33:53+00:00 Aaron Bockover: Real American Heroes: Toilet Trouble http://abock.org/2010/08/06/real-american-heroes-toilet-trouble <p>Friends, in these tough economic times, we're all expected to go above and beyond the usual call of duty. My very dear friend <a href="http://tirania.org/blog">Miguel</a> regularly executes on this mantra and today was no exception.</p> <p>This afternoon, he was spotted tending to a <a href="http://amzn.to/cpmnzC">toilet emergency</a>. Miguel went above and beyond, demonstrating his fearless leadership and improvisational skills. He has declined to comment on the matter however.</p> <p align="center"><a href="http://amzn.to/cpmnzC"><img border="0" src="http://abock.org/blog-images/toilet-miguel-stops-a-toilet-th.jpg" alt="Miguel stops an overflowing toilet" /></a><br /><em>Miguel stopping an overflowing toilet <br />at the Novell Cambridge office.</em></p> <p>We've yet to generate any leads in this case of back<em>log</em>, but we will be setting up an anonymous tip-line. Stay tuned.</p> <p align="center"><a href="http://amzn.to/cpmnzC"><img border="0" src="http://abock.org/blog-images/toilet-miguel-wades-through-toilet-water-th.jpg" alt="Miguel wading through toilet water" /></a><br /><em>Miguel wading through toilet water in his boots <br />after the overflow was stopped. Bless him.</em></p> <p>VP of developer platform &amp; visionary by day, plumber by... day as well.</p> 2010-08-07T03:30:11+00:00 Paul Cutler: Make a smart playlist to see your Amazon purchases in Banshee http://feedproxy.google.com/~r/pcutler/~3/eZRV6qnw45A/ <p><a href="http://castrojo.tumblr.com/">Jorge Castro</a> and I were talking this morning in #banshee as Jorge asked if it was possible to create a smart playlist to see your music purchases.</p> <p>And it is!</p> <p>Jorge&#8217;s idea was for the UbuntuOne music store from 7digital.com. I don&#8217;t use Ubuntu, but I do buy (too many) songs from Amazon.</p> <p>Amazon adds a comment in the metadata of each song you buy, such as: Amazon.com Song ID: 216030141 (If you&#8217;re curious, it&#8217;s the song <em>Drunk Girls</em> by <a href="http://www.amazon.com/dp/B003HY3530/ref=nosim?tag=gnomestore-20&linkCode=sb1&camp=212353&creative=380549">LCD Soundsystem</a> that I bought this morning for only $5!)</p> <p>Create a smart playlist in Banshee by choosing from the menu Media -> New Smart Playlist.</p> <p>Name your playlist (I used &#8220;Amazon&#8221;) and select &#8220;<code>Match all of the following</code>&#8221; and</p> <p>&#8220;<code>Comment</code>&#8221; &#8220;<code>contains</code>&#8221; and enter &#8220;<code>Amazon.com Song ID:</code>&#8221; and press &#8220;<code>Save</code>&#8220;.</p> <p>Voila! One smart playlist is created that shows all of your Amazon purchases. And since it&#8217;s so smart, when you buy new music it automatically updates the playlist (Yes, I bought another album this morning, don&#8217;t tell my wife). You can do the same for the UbuntuOne store using &#8220;Purchased from 7digital.com&#8221; instead of the Amazon Song ID: in the smart playlist comment.</p> <p><img src="http://people.gnome.org/~pcutler/screenshots/playlist.png" alt="Amazon Smart Playlist Screenshot in Banshee" /></p> <img src="http://feeds.feedburner.com/~r/pcutler/~4/eZRV6qnw45A" height="1" width="1" /> 2010-08-06T15:44:04+00:00 Paul Cutler Paul Cutler: Write for GNOME Journal! http://feedproxy.google.com/~r/pcutler/~3/fjhaZ6ZTJXM/ <p>With GUADEC having just ended, we&#8217;re looking for some GUADEC related stories for GNOME Journal.</p> <p>Here&#8217;s a few examples:</p> <ul> <li>Was it your first time at GUADEC? Share some thoughts about what you liked, saw or who you met.</li> <li>Did you give a talk at GUADEC? Write it up as an article! Or, we&#8217;re happy to do an interview with you about your talk. Here&#8217;s a <a href="http://gnomejournal.org/article/78/putting-the-network-back-into-gnome---an-interview-with-john-palmieri">great example with J5</a> after last year&#8217;s GUADEC.</li> <li>Did you see a new application or new technology that gets you excited? We&#8217;re always looking for app reviews. Write it up and we&#8217;ll include it!</li> </ul> <p>If any of these interest you, please drop me an email at pcutler at gnome dot org. Don&#8217;t be shy &#8211; if you want a member of the GJ team to interview you, just ask!</p> <img src="http://feeds.feedburner.com/~r/pcutler/~4/fjhaZ6ZTJXM" height="1" width="1" /> 2010-08-03T11:46:25+00:00 Paul Cutler Aaron Bockover: Banshee, GNOME, & Amazon MP3 http://abock.org/2010/08/02/banshee-gnome-amazon-mp3 <p><img border="0" align="right" src="http://abock.org/blog-images/gnomelovelogo-th.png" alt="GNOME Love!" /><a href="http://banshee.fm"><img border="0" align="right" src="http://abock.org/blog-images/new-banshee-logo.png" alt="The Banshee logo" /></a> During Gabriel's talk at GUADEC, after working with members of the GNOME Foundation board, we were very excited to announce that the Amazon MP3 Store in Banshee would begin using an Amazon Affiliate ID, and that <em><strong>100% of all revenue generated through this affiliate ID will go to the GNOME Foundation!</strong></em></p> <p>This means that any time you purchase MP3s through <a href="http://abock.org/2010/07/23/announcing-banshee-1-7-3">Banshee's integrated Amazon MP3 Store</a>, you are helping the GNOME Foundation help others.</p> <p>These funds can be used in a number of creative ways that ultimately better Free &amp; Open Source software and its communities.</p> <p>We look forward to the future around this initiative, and hope that your purchases will help with things like sponsoring participants at conferences, organizing hackfests, and so on.</p> <p>So what are you waiting for? <strong><em><a href="http://integrated-services.banshee.fm/amz">Go buy some music</a>!</em></strong></p> 2010-08-02T22:40:10+00:00 Paul Cutler: GUADEC Closing Ceremony today at 17:15 in Paris http://feedproxy.google.com/~r/pcutler/~3/PzYYPVxa0Qs/ <p>Don&#8217;t forget to come to the Paris room at 17:15 for the closing ceremony at GUADEC.</p> <p>Why? You&#8217;ll want to find out where the Desktop Summit next year is!</p> <p>See you there!</p> <img src="http://feeds.feedburner.com/~r/pcutler/~4/PzYYPVxa0Qs" height="1" width="1" /> 2010-07-30T13:46:59+00:00 Paul Cutler Paul Cutler: At GUADEC http://feedproxy.google.com/~r/pcutler/~3/xXpXZZV4SDc/ <p>I&#8217;m a bad blogger &#8211; for the last two weeks I&#8217;ve been telling myself to write a nice &#8220;I&#8217;m going to GUADEC&#8221; post on my blog, but here I am already at GUADEC with only excuses why I didn&#8217;t. I blame Vincent!</p> <p>But I&#8217;m here at GUADEC and we had a good Board meeting &#8211; it was good to see some faces I haven&#8217;t seen in a while and meet new ones. I spent most of today (had to leave a bit early to fix my phone) in the Open Desktop Day learning about large deployments of GNOME around the world. </p> <p>Last year was my first GUADEC, which still is mostly a blur. I&#8217;m looking forward to seeing everyone again and would love to chat &#8211; just grab me (assuming I&#8217;m not already talking to somebody!) and I&#8217;d love to hear your thoughts about how GNOME is doing, what you&#8217;re working (or I&#8217;m working on!), GNOME 3.0 or anything that else comes to mind.</p> <img src="http://feeds.feedburner.com/~r/pcutler/~4/xXpXZZV4SDc" height="1" width="1" /> 2010-07-26T16:04:37+00:00 Paul Cutler Alex Launi: Anyone want to do a couple early morning pre-guadec rides? http://www.lamalex.net/2010/07/anyone-want-to-do-a-couple-early-morning-pre-guadec-rides/ <p>I know there are some other cyclists in the GNOME community who are probably bummed that they&#8217;re spending a week away from their bikes, so if anyone else is feeling withdraw symptoms from not riding I am planning to find a bike shop in Den Haag where I can rent a road bike and do some early morning rides before guadec starts. If you&#8217;re interested in some early morning pain and suffering grab me at guadec and let&#8217;s figure out a route.</p> <div class="wp-caption aligncenter"><a href="http://demoncats.phanfare.com/4754251_5279536#imageID=105383772"><img src="http://cdn-2-service.phanfare.com/images/5396178_4754251_105383772_WebSmall_3/Image-5396178-105383772-2-WebSmall_0_c851206470ca48736d859eccb6c423ae_1" alt="" width="531" height="575" /></a><p class="wp-caption-text">(C) 2010 Demoncats photography</p></div> <p></p> 2010-07-25T09:18:51+00:00 Aaron Bockover: Announcing Banshee 1.7.3 http://abock.org/2010/07/23/announcing-banshee-1-7-3 <p><a href="http://banshee.fm"><img border="0" align="right" src="http://abock.org/blog-images/new-banshee-logo.png" alt="The Banshee logo" /></a> We're very proud to announce the release of <a href="http://banshee.fm/download/archives/1.7.3/">Banshee 1.7.3</a>, which brings some much anticipated WebKit goodness: the Amazon MP3 Store and the Miro Podcast Directory integration. Amazon MP3 downloading is fully supported, separate from the integrated store itself. There are also a handful of other smaller new features and enhancements, and a good deal of bug fixing as well.</p> <p><a href="http://banshee.fm/download"><img border="0" title="Download the latest Banshee!" src="http://banshee.fm/theme/css/images/download-button.png" alt="Download Now" /></a></p> <h4>Amazon MP3 Store</h4> <p>This new extension provides a source from which users can <strong><em>browse, search, preview, purchase, and download</em></strong> music from the Amazon MP3 store in all countries where it is offered: <a href="http://integrated-services.banshee.fm/amz/redirect.do/US">United States</a>, <a href="http://integrated-services.banshee.fm/amz/redirect.do/UK">United Kingdom</a>, <a href="http://integrated-services.banshee.fm/amz/redirect.do/FR">France</a>, <a href="http://integrated-services.banshee.fm/amz/redirect.do/DE">Germany</a>, <a href="http://integrated-services.banshee.fm/amz/redirect.do/DE">Austria</a>, <a href="http://integrated-services.banshee.fm/amz/redirect.do/DE">Switzerland</a>, and <a href="http://integrated-services.banshee.fm/amz/redirect.do/JP">Japan</a>.</p> <p align="center"><a href="http://bit.ly/cLHCYP"><img border="0" src="http://abock.org/blog-images/amazon-mp3-store-purchase-th.png" alt="Amazon MP3 Store in Banshee" title="Click to view the screencast!" /></a><br /><em>Watch the Banshee Amazon MP3 Store Screencast!</em></p> <p>Music that is purchased through the new integrated Amazon MP3 store will automatically begin downloading and importing into the Banshee music library.</p> <p>When previewing music on the Amazon MP3 store in Banshee, the previews will play through Banshee, showing up in the header, and not through Flash.</p> <h4>Amazon MP3 Downloader</h4> <p>The support for Amazon MP3 is not limited just to the store. If you decide to purchase music through your regular web browser, Amazon MP3 will provide a <strong>.amz</strong> file, a sort of playlist that indicates how the MP3s can be downloaded.</p> <p>Banshee now associates itself with these .amz files and will download and import the MP3s referenced in them.</p> <p align="center"><img border="0" alt="Banshee Amazon MP3 support" src="http://abock.org/blog-images/banshee-amz-support-diagram.png" /></p> <p>The Amazon MP3 <em>Store</em> and <em>Downloader</em> extensions are entirely separate. This allows you to pick your preferred user experience for purchasing music through Amazon MP3. The Amazon MP3 Store extension can be <em>disabled</em> if desired and the downloader will still work with an external web browser.</p> <p>Other ways to download .amz files include opening manually with your operating system's file manager, the <em>Import Media</em> dialog available through the <strong>Media &rarr; Import</strong> menu, or the command line client distributed with Banshee: <em>$ bamz foo.amz</em>. Bamz will download the .amz contents in the current directory, and will <em>not</em> import the MP3s into the Banshee library automatically.</p> <p>For more information on the Amazon MP3 integration in Banshee 1.7.3, read my previous blog posts on the two separate extensions:</p> <ul> <li><em><a href="http://abock.org/2010/07/08/amazon-mp3-downloader-support-in-banshee">Amazon MP3 Downloader Support in Banshee</a></em></li> <li><em><a href="http://abock.org/2010/07/13/amazon-mp3-store-in-banshee">Amazon MP3 Store in Banshee</a></em></li> </ul> <h4>Miro Podcast Directory</h4> <p align="center"><a href="http://abock.org/blog-images/miro-guide.png"><img border="0" src="http://abock.org/blog-images/miro-guide-th.png" alt="Miro Guide Screenshot" /></a></p> <p>Building on the same new WebKit integration in Banshee 1.7.3 as the Amazon MP3 Store, a new Miro Podcast Directory extension has been implemented. The source integrates with <a href="http://miroguide.com">miroguide.com</a>, allowing users to discover, stream, and subscribe to podcasts in a way never before possible in Banshee.</p> <p>Much more work for tighter integration with the Miro Podcast Directory will come in future releases.</p> <h4>Bulk Metadata Fixup Extension</h4> <p>A new tool is available from the <strong>Tools &rarr; Fix Music Metadata</strong> menu item that allows for bulk metadata fixing. This feature proposes to merge artists and albums that vary only by case, <em>&amp;</em> vs <em>and</em>, etc.</p> <h4>Other Enhancements</h4> <ul> <li>Visual separators were added in the source view between categories of sources: special (Now Playing, Play Queue), local media, and online services.</li> <li>Item counts in the status bar are now culturally formatted (e.g. in en_US show <em>1,000</em> instead of <em>1000</em>).</li> <li>Improved downloading and visual refreshing of new cover art.</li> <li>Visual tweaks to the grid view album artwork hover effect.</li> <li><em>Developers:</em>new Banshee.WebBrowser API for creating embedded WebKit web browsers and sources. Currently used by the new Amazon MP3 store, Miro Guide, and the Wikipedia context pane.</li> <li><em>Developers:</em>new Hyena.Downloader API for performing downloads and easy HTTP operations: HttpFileDownloader, HttpStringDownloader, etc.</li> <li><em>Distributors:</em>the webkit-sharp dependency was dropped, and instead we now take a dependency directly on libwebkit 1.2.2+ for the new Banshee.WebBrowser API.</li> </ul> 2010-07-23T16:29:08+00:00 Aaron Bockover: Tarballs – Why? http://abock.org/2010/07/22/tarballs-why <p>More and more I begin to wonder why we generate tarballs at all these days. Is it just because it's easy - a function of "make distcheck"? There's certainly value in the actual distcheck process to ensure you have a sane build, but why actually distribute the tarball? What's the meaningful difference between a tarball and a git tag?</p> <p>Now, I won't even touch on the subject of how badly I want to throw autotools in the trash, but we're so entrenched in its ways, and are comfortable with its quirks that energy is better spent on actual improvements, so for now the distcheck process is here to stay. For now.</p> <p>So I ask a very serious question, others have asked as well - why publish tarballs? Most users get their packages in binary form from their distribution. Most users who build from source I would argue are using git already, or have git installed on their system, or can easily do so. Providing instructions on cloning/checkout out the tag/building using autogen/autoreconf/etc can be provided easily and clearly.</p> <p>I migrated Banshee to Linode and consequently from Apache to lighttpd about a month ago. The logs start on June 20, 2010:</p> <pre> $ grep -E 'banshee-1.+\.tar\.(gz|bz2)' \ download.banshee.fm.access.log | wc -l <strong>7066</strong></pre> <p>So in one month, we've only had 7066 tarball downloads, and that accounts for any and all released versions of Banshee over the past 5 years. Certainly the bulk of those downloads would be version 1.6.1, since that was the newest available tarball over the last month. 284 of those downloads were <a href="http://banshee.fm/download/archives/1.7.3/">version 1.7.3, released less than 24 hours ago</a>. I could generate better statistics, but that's not the point here. The point is that number is pretty small compared to the reach of the distributions.</p> <p>I roughly estimate the average size of a Banshee tarball (bzip2) is 3MB. Eliminating tarballs would save us 20GB/mo in bandwidth - and that's during a quiet time in development when the servers are less active (1.6.1 was released in May). We'll be seeing a spike I'll be monitoring around 1.7.3.</p> <p>So, if we ditched tarballs, how would you be affected? Would you care?</p> <p><strong>Update:</strong> to clarify a few things, you would still build and install like normal. For instance: <pre>$ ./autogen.sh --prefix=$HOME/local --disable-whatever \ &amp;&amp; make &amp;&amp; make install</pre> </p><p>Packagers would however have an additional minor burden. If their package system (e.g. rpm) requires an archive (e.g. can't build directly from git), then the packager would be responsible for creating an archive. They could either just archive the git clone directory, or actually run their own "make distcheck" from their clone. It would be up to the packager to best integrate the git clone into whatever system they are using.</p> 2010-07-22T16:46:59+00:00 Gabriel Burt: GUADEC 2010 http://gburt.blogspot.com/2010/07/guadec-2010.html <p><b>Business</b><br /> I'm giving <a href="http://guadec.org/index.php/guadec/2010/paper/view/95">a talk</a> on <a href="http://guadec.org/index.php/guadec/2010/schedConf/program">Friday, July 30 at 10:15am</a>. I intend it for people who want to start hacking on FOSS and GNOME projects but haven't found a way in yet, and those of all experience levels who want to learn more about hacking on Banshee in particular. Of course I'll talk a lot about the state of the project, and some of our cool new features too.</p> <p><b>Pleasure</b><br /> If you want to meet up in Amsterdam sometime Wednesday through Saturday, or in The Hague after that, <a href="mailto:gabriel.burt@gmail.com">send me an e-mail</a>. I arrive in AMS early Wednesday with no plans.</p> <p>Finally, a lazyweb request: if you have advice on prepaid data SIM cards in the Netherlands, I'd love to hear it.</p> <p><i>Update</i><br /> After taking the train to Amsterdam Central, I went to <a href="http://maps.google.com/maps?f=q&hl=en&q=vodafone&ie=UTF8&om=1&sll=52.374329,4.895825&sspn=0.006229,0.014377&split=1&rq=1&ev=p&radius=0.36&hq=vodafone&hnear=&ll=52.375468,4.896169&spn=0.006229,0.014377&z=17&iwloc=A">this Vodafone store</a> and got a €7.50 sim card, €5 of call/txt credit (incoming is free, outgoing is 30 cents/min and 19 cents/txt) and a 50% off €10 30 days of data — so all told, €17.50. The guy spent 10 min or so fiddling with my G1 (dev phone) to get it activated, and then I goggled the APN info you need to enter manually: live.vodafone.com with username and password 'Vodafone'. Seems to be working great!<div class="blogger-post-footer"><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/33979271-6721668934549015832?l=gburt.blogspot.com" alt="" /></div></p> 2010-07-21T15:00:29+00:00 Gabriel Burt The Banshee Blog: Banshee 1.7.3 Released http://banshee.fm/2010/07/21/banshee-1-7-3-released/ <a href="http://banshee-project.org/download/archives/1-7-3/">Banshee 1.7.3</a>, part of the active-development 1.7 series leading to 1.8, has been released. Read the <a href="http://banshee-project.org/download/archives/1-7-3/">release notes</a> for more info. <a href="http://banshee-project.org/download">Get it now!</a> 2010-07-21T11:40:32+00:00 Aaron Bockover: Eclipse & Android SDK on openSUSE http://abock.org/2010/07/19/eclipse-android-sdk-on-opensuse I woke up at 6 this morning with the urge to investigate writing an Android application. I have been a <em>mostly</em> satisfied user of Android ever since the G1 was first launched. I even switched to T-Mobile to get one from AT&amp;T. The sales person at the time was confused as to why I would switch carriers to get that phone. Fast forward to this fine morning where I'll make my first attempt at putting my own pixels on my Android device, now a Nexus One. Unfortunately, Eclipse in openSUSE seems to be a bit out of date. However, the Android ADT Eclipse Plugin is known to not work on 3.6 anyway, so for now I am just sticking with Eclipse 3.4. Additionally, there does seem to be a packaging issue as well that you'll need to resolve. <ul> <li><code>sudo zypper in eclipse java-1_6_0-sun-devel</code></li> <li><code>sudo chgrp -Rc users /usr/share/eclipse</code></li> <li><code>sudo chmod -Rc g+w /usr/share/eclipse</code></li> </ul> Note that I explicitly select the Sun Java devel package because Eclipse is allegedly faster using this Java implementation. If you prefer not to taint your system with proprietary software, the default-selected java-1_6_0-openjdk-devel should work just fine. The permissions fixing against <code>/usr/share/eclipse</code> is to make sure that Eclipse software updates work properly. Start Eclipse, and go to <strong>Help &rarr; Software Updates</strong> and then select the <strong>Available Software</strong> tab and finally <strong>Add Site</strong>. Add the two following sites: <ul> <li>http://download.eclipse.org/releases/ganymede/</li> <li>https://dl-ssl.google.com/android/eclipse/</li> </ul> When both sites show up (are no longer "Pending"), check the top-level check box for the Android site to select all Android plugins, then click <strong>Install</strong> and walk through the installation wizard. With the installation complete, quit and restart Eclipse. Go to <strong>Window &rarr; Preferences</strong> and choose the <strong>Android</strong> section. Here you need to set up your SDK. <a href="http://developer.android.com/sdk">I'm assuming you've already installed it</a>. Now you can go to <strong>Window &rarr; Android SDK and AVD Manager</strong>. Select <strong>Available Packages</strong> and install the SDKs, documentation, and samples packages that interest you. I'm sticking to the 1.6 SDK I guess for now, since not many people seem to have the 2.2 goodness yet. After you install an SDK, you can then create a virtual device that targets it. Good luck! 2010-07-19T12:49:36+00:00 Aaron Bockover: Amazon MP3 Store in Banshee http://abock.org/2010/07/13/amazon-mp3-store-in-banshee <p><a href="http://banshee.fm"><img border="0" align="right" src="http://abock.org/blog-images/new-banshee-logo.png" alt="The Banshee logo" /></a> I've landed a new extension in Banshee -- an integrated Amazon MP3 Store source. This source allows you to <em>browse, search, preview, <strong>purchase</strong>, and <strong>download</strong></em> music from the Amazon MP3 web site.</p> <p><a href="http://abock.org/2010/07/08/amazon-mp3-downloader-support-in-banshee">Building on last week's announcement of the Amazon MP3 downloader extension</a>, the Amazon MP3 Store extension allows for tighter integration and a better user experience -- music can be explored and purchased all from within Banshee.</p> <p align="center"><a href="http://bit.ly/cLHCYP"><img border="0" src="http://abock.org/blog-images/amazon-mp3-store-purchase-th.png" alt="Amazon MP3 Store in Banshee" title="Click to view the screencast!" /></a><br /><em>Watch the Banshee Amazon MP3 Store Screencast!</em></p> <p>I employ no gimmicks. The extension is very simple, just embedding a WebKit GTK web browser, and integrates with a few hooks:</p> <ul> <li><p>Intercepts <em>audio/x-mpegurl</em> content, to stream previews. This provides natively integrated music previews that play in Banshee, not in the web page via Flash.</p></li> <li><p>Intercepts <em>audio/x-amzxml</em> content, the playlist (or "download queue") that Amazon provides after a purchase, and load through the Amazon MP3 downloader extension to immediately begin downloading the newly purchased music. This eliminates the need for Amazon's external downloader. Everything happens from within Banshee.</p></li> <li><p>Set a cookie ahead of time so that the Amazon MP3 web site is aware that a downloader is installed (Banshee), making the purchasing experience faster and less confusing.</p></li> <li><p>Search the Amazon MP3 store from the usual Banshee search box.</p></li> <li><p>Provide basic web-browser navigation controls: back, forward, refresh, home.</p></li> </ul> <p><img border="0" src="http://abock.org/blog-images/amazon-mp3-source-row.png" alt="Amazon MP3 Source" align="right" />As simple and obvious as this approach may be, the reality is that this integrated experience was previously unseen on the Linux Desktop. This approach levels the music purchasing playing field -- no extra software to install, no browsers, file managers, or mime systems to configure, and no more manually importing externally downloaded music. Just click, buy, and enjoy.</p> <p>The code is all committed and available for immediate use in Banshee's git master branch. It will be available in the next release for packaging: 1.7.3.</p> <p>Remember, Amazon MP3 music is all DRM-free, and there is tons of free content on Amazon as well for you to try the extension out if you're not up for purchasing more music just now.</p> 2010-07-13T19:35:32+00:00 Alexander Kojevnikov: Spek 0.6 Released http://versia.com/2010/07/13/spek-0-6-release/ <p>I&#8217;m happy to announce the release of <a href="http://www.spek-project.org/">Spek 0.6</a> &ndash; a multi-platform acoustic spectrum analyser.</p> <p>This version is about 3 times faster than 0.5 thanks to the lightning-fast <a href="http://versia.com/2010/07/04/gstreamer-ffmpeg-and-spek/">FFmpeg decoders</a> and the new multi-threaded analysis algorithm. </p> <p>Spek 0.6 also features dramatically reduced size of the Windows installer (from 17.1 MiB to 9.8 MiB) and OS X bundle (from 10.5 MiB to 6.1 MiB)</p> <p>Read the <a href="http://gitorious.org/spek/spek/blobs/0.6/NEWS">NEWS</a> file for a complete change log.</p> <br /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/kojevnikov.wordpress.com/412/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/kojevnikov.wordpress.com/412/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/kojevnikov.wordpress.com/412/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/kojevnikov.wordpress.com/412/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/kojevnikov.wordpress.com/412/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/kojevnikov.wordpress.com/412/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/kojevnikov.wordpress.com/412/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/kojevnikov.wordpress.com/412/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/kojevnikov.wordpress.com/412/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/kojevnikov.wordpress.com/412/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/kojevnikov.wordpress.com/412/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/kojevnikov.wordpress.com/412/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/kojevnikov.wordpress.com/412/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/kojevnikov.wordpress.com/412/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=versia.com&blog=9336498&post=412&subd=kojevnikov&ref=&feed=1" width="1" height="1" /> 2010-07-13T14:16:18+00:00 Alexander Kojevnikov Aaron Bockover: Government Security System http://abock.org/2010/07/09/government-security-system <p><a href="http://abock.org/2010/07/09/government-security-system/government-security-system" rel="attachment wp-att-406"><img border="0" src="http://abock.org/blog-images/wordpress/2010/07/government-security-system-450x600.jpg" alt="High security in Boston" title="Government Security System" /></a></p> <p>As seen near the Boston Common.</p> 2010-07-09T15:12:46+00:00 Aaron Bockover: Banshee on Linode http://abock.org/2010/07/08/banshee-on-linode <p><a href="http://banshee.fm"><img border="0" align="right" src="http://abock.org/blog-images/new-banshee-logo.png" alt="The Banshee logo" /></a> I recently migrated all of the Banshee web server stuffs to a <a href="http://www.linode.com/?r=5ea2a167caa5bec58b16800303350173e3dd0946">Linode 768</a>. We were previously running on an incredibly slow, unreliable, and expensive dedicated co-lo machine that once hosted a number of Novell community projects. As part of the migration, go-oo (Novell's edition of OpenOffice) has migrated to openSUSE infrastructure, and I've taken F-Spot with me to Linode.</p> <p>The performance and reliability so far has skyrocketed, and the flexibility we now have is very welcome. The Banshee web site is powered by openSUSE 11.2, lighttpd, MySQL, and WordPress. The new Linode backup service is a huge relief, which we are using in addition to daily cron-based on-system backups. I've been a huge and loyal fan of Linode since 2005, and am happy to bring Banshee along!</p> <p>I'm also excited to note that I've switched our "main" domain name to <a href="http://banshee.fm">banshee.fm</a>, a domain I've owned for Banshee for about a year but have done nothing with. A number of people seem to love the new domain name, much preferred to the old <a href="http://banshee-project.org">banshee-project.org</a>. What do you think?</p> <p align="center"><a href="http://www.linode.com/?r=5ea2a167caa5bec58b16800303350173e3dd0946"><img border="0" src="http://abock.org/blog-images/linode_logo-lvs3.png" alt="Linode - Linux Virtual Servers" /></a></p> <p>If you are thinking of signing up for a Linode (and if not, you should be), you can <a href="http://www.linode.com/?r=5ea2a167caa5bec58b16800303350173e3dd0946">help the Banshee Project out by signing up using our referral code</a>: <code>5ea2a167caa5bec58b16800303350173e3dd094</code></p> <p>Three cheers for Linode, and for better web performance for Banshee!</p> 2010-07-08T10:00:14+00:00 Aaron Bockover: Amazon MP3 downloader support in Banshee http://abock.org/2010/07/08/amazon-mp3-downloader-support-in-banshee <p><a href="http://banshee.fm"><img border="0" align="right" src="http://abock.org/blog-images/new-banshee-logo.png" alt="The Banshee logo" /></a> I'm very excited to announce I have just landed support for downloading and importing your Amazon MP3 purchases into Banshee.</p> <p>It is a simple extension that understands the download queue file that Amazon delivers after a purchase is made. Linux Desktop integration is provided so that your web and file browsers associate Banshee with the download queue file.</p> <p align="center"><img border="0" alt="Banshee Amazon MP3 support" src="http://abock.org/blog-images/banshee-amz-support-diagram.png" /></p> <p>Further improvements are on the way, but I've downloaded many albums in Banshee at this point (and subsequently burned a decent amount of money!) Of course, there are a number of free downloads that Amazon offers, which were good for testing. Unfortunately, I didn't think to look for these until I had finished the feature.</p> <p>In addition to the integrated Banshee extension, there is a command line client called <em>bamz</em>. It requires Banshee to be installed for support libraries, but does not integrate with your Banshee library in case you are into that sort of thing. By default, bamz downloads the tracks into your current working directory with the following structure: <code>$PWD/&lt;Artist Name&gt;/&lt;Album Title&gt;/NN. Track Title.mp3</code>.</p> <p align="center"><img border="0" alt="bamz command line client" src="http://abock.org/blog-images/bamz.png" /></p> <p>I will be merging the Amazon MP3 support into the 1.6 stable series, and it is currently available in Banshee's git master branch. Enjoy!</p> 2010-07-08T05:22:16+00:00 Alexander Kojevnikov: GStreamer, FFmpeg and Spek http://versia.com/2010/07/04/gstreamer-ffmpeg-and-spek/ <p>Next version of <a href="http://www.spek-project.org/">Spek</a> will use <a href="http://ffmpeg.org/">FFmpeg</a> libraries to decode audio files. There are several reasons for the switch from <a href="http://gstreamer.freedesktop.org/">GStreamer</a>:</p> <p>GStreamer is a fantastic framework for building complex multimedia pipelines, however what Spek really needs is a simple decoder and FFmpeg&#8217;s libavformat and libavcodec do just that.</p> <p>To handle some audio formats (e.g. APE and DTS), GStreamer relies on FFmpeg anyway, so the switch will result in lesser dependencies. It doesn&#8217;t matter too much on GNU/Linux, but this will reduce the size of the Windows and Mac OS X installers.</p> <p>Spek used GStreamer&#8217;s <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good-plugins/html/gst-plugins-good-plugins-spectrum.html">spectrum</a> plugin to perform the actual spectral analysis, with FFmpeg I had to implement it myself. The code I ended up with is very compact and gives room for a lot of experimentation, from using different window functions (it&#8217;s still Hamming) and working on performance optimisations to switching to a faster FFT library.</p> <p>The last bit is actually done, Spek now uses <a href="http://www.fftw.org/">FFTW</a> which in my tests is 1.5x to 2x faster than <a href="http://kissfft.sourceforge.net/">Kiss FFT</a> used by GStreamer. Apart from that, FFTW can scale to multiple threads with near linear performance increase, future versions of Spek will take advantage of this.</p> <p><em>UPDATE: As one of commenters pointed out, FFTs on small number of samples are not very parallelisable and my benchmarks confirm this. Also, I switched from FFTW to <a href="http://cekirdek.pardus.org.tr/~ismail/ffmpeg-docs/avfft_8h-source.html">avfft</a> which is built into FFmpeg. It&#8217;s a little bit faster than FFTW for my particular use case. Lastly, 1.5x to 2x speed up was actually caused by a faster decoder, not by a faster FFT library.</em></p> <p>Another thing that would be hard with GStreamer is static cross-compilation using <a href="http://www.nongnu.org/mingw-cross-env/">mingw-cross-env</a> to produce a single Windows executable. Because FFmpeg doesn&#8217;t employ a plugin architecture, static linking is not an issue.</p> <p>Last, but not least, the whole experience was very educational. I now remember why I loved C back in the days, the trick is to not even attempt to write any GObject code with it, that&#8217;s what Vala is for. Fast Fourier Transform and the maths behind it is much fun, and <a href="http://www.nrbook.com/a/bookcpdf.php">NR</a> was very helpful here.</p> <p>For the curious, the code is merged to git master and pushed to <a href="http://gitorious.org/spek">Gitorious</a>. The next version of Spek will be released sometime in July.</p> <br /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/kojevnikov.wordpress.com/388/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/kojevnikov.wordpress.com/388/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/kojevnikov.wordpress.com/388/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/kojevnikov.wordpress.com/388/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/kojevnikov.wordpress.com/388/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/kojevnikov.wordpress.com/388/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/kojevnikov.wordpress.com/388/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/kojevnikov.wordpress.com/388/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/kojevnikov.wordpress.com/388/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/kojevnikov.wordpress.com/388/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/kojevnikov.wordpress.com/388/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/kojevnikov.wordpress.com/388/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/kojevnikov.wordpress.com/388/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/kojevnikov.wordpress.com/388/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=versia.com&blog=9336498&post=388&subd=kojevnikov&ref=&feed=1" width="1" height="1" /> 2010-07-07T06:07:53+00:00 Alexander Kojevnikov Alex Launi: I need a floor in Amsterdam! Does anyone have a dutch floor?? http://www.lamalex.net/2010/07/i-need-a-floor-in-amsterdam-does-anyone-have-a-dutch-floor/ <p>Dear Dutch foss community,</p> <p>A friend and I are attending GUADEC this year, but we have plane tickets to fly into Amsterdam on the 24th of July. The problem? GUADEC isn&#8217;t until the 26th! Neither of us have ever been to Holland, and while 2 days is certainly not enough time to enjoy Amsterdam, we want to try. If anyone has a bed/couch/floor/stable/etc. that the two of us could sleep in/on/under the night of the 24th we&#8217;d be super appreciative, and of course you&#8217;d always have a place to stay wherever it is that I&#8217;m living when you need a place to stay (at the moment Philadelphia- <strong>a really great town if you want to come visit, seriously Philly rules!</strong>).</p> <p>Of course we&#8217;ll take you out, or cook you a nice dinner in return for your hospitality, and promise not to make a mess.</p> <p>If you have a floor or whatever that we can sleep on, feel free to either leave a comment or send me an email alex.launi@gmail.com!</p> 2010-07-06T17:52:12+00:00