<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3285197066205497695</id><updated>2025-08-13T02:33:01.160-04:00</updated><category term="Programming"/><category term="PHP"/><category term="linux"/><category term="Python"/><category term="google"/><category term="Chrome"/><category term="CloudComputing"/><category term="Erlang"/><category term="networking"/><category term="Design-Patterns"/><category term="communication"/><category term="last.fm"/><category term="Javascript"/><category term="PEAR"/><category term="mindmap"/><category term="rhythmbox"/><category term="Amazon"/><category term="AppEngine"/><category term="Architecture"/><category term="MediaWiki"/><category term="YahooPipes"/><category term="dbus"/><category term="mindmeister"/><category term="Cloud"/><category term="Del.icio.us"/><category term="Gliffy"/><category term="Message-Bus"/><category term="NPAPI"/><category term="Phidgets"/><category term="Software"/><category term="System"/><category term="firefox"/><category term="gadgets"/><category term="musicbrainz music python"/><category term="trick"/><category term="web"/><category term="Amazon S3"/><category term="Apache"/><category term="Azure"/><category term="C/C++"/><category term="Data-Centre"/><category term="Eclipse"/><category term="FeedBurner"/><category term="Gnome"/><category term="Green"/><category term="Hacking"/><category term="Hadoop"/><category term="IBM"/><category term="Icons"/><category term="Java"/><category term="Microsoft"/><category term="MySQL"/><category term="OSX"/><category term="Ohloh"/><category term="Projects"/><category term="Skype"/><category term="Social Networking"/><category term="Subclipse"/><category term="Subversion"/><category term="Twitter"/><category term="VPS"/><category term="Web-Services"/><category term="Zend"/><category term="bookmarklet"/><category term="collaboration"/><category term="ejabberd"/><category term="freemind"/><category term="functional-programming"/><category term="greasemonkey"/><category term="itunes"/><category term="music"/><category term="musicbrainz"/><category term="social"/><category term="systemical"/><category term="wave"/><title type='text'>Jean-Lou Dupont&#39;s WEBlog</title><subtitle type='html'>Notes on Cloud Computing, Telecommunications &amp;amp; Software</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jldupont.blogspot.com/feeds/posts/full'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/full'/><link rel='alternate' type='text/html' href='http://jldupont.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/full?start-index=26&amp;max-results=25'/><author><name>Jean-Lou Dupont</name><uri>http://www.blogger.com/profile/00409924945516479600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>89</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3285197066205497695.post-8288623405029874625</id><published>2012-09-08T14:32:00.001-04:00</published><updated>2012-09-14T05:52:11.413-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Hadoop"/><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><title type='text'>Notes on Hadoop on Amazon Elastic MapReduce</title><content type='html'>I am on a project which requires Hadoop for crunching millions of documents. Being new to Hadoop, I was faced with a learning curve. &amp;nbsp;Here are a couple of notes on the experience.&lt;br /&gt;
&lt;h2&gt;
Hadoop Streaming&lt;/h2&gt;
Working with streaming jobs on Hadoop is straightforward enough, except when it comes to controlling how Hadoop treats the input files. &lt;br /&gt;
&lt;br /&gt;
The input files I needed to process were large (100&#39;s MB). Hadoop insisted on chunking those to smaller size but unfortunately the default splitting wasn&#39;t compatible with my file type. &amp;nbsp;I ended up fooling Hadoop in accepting bigger minimum split size:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;-D mapred.min.split.size=10737418240&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Hadoop with Custom JAR&lt;/h2&gt;
Although one has full control of Hadoop when using custom JAR jobs, I must say I had quite a rocky ride getting my stuff to work.&lt;br /&gt;
&lt;br /&gt;
First off, I needed a a way to package the dependent JAR librairies inside the main JAR. &amp;nbsp;I was forced to write a custom ANT build file to do this.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;php&quot; name=&quot;code&quot;&gt;  
&lt;target depends=&quot;compile&quot; description=&quot;generate the distribution&quot; name=&quot;emr&quot;&gt;
   &lt;delete&gt;
    &lt;fileset dir=&quot;${build.dir}&quot; includes=&quot;*.jar&quot;&gt;
   &lt;/fileset&gt;&lt;/delete&gt;   
      &lt;jar basedir=&quot;${build.dir}&quot; jarfile=&quot;${dist.dir}/mrlda-${version}.jar&quot;&gt;
    &lt;zipfileset dir=&quot;./lib&quot; excludes=&quot;hadoop*.*&quot; includes=&quot;**.jar&quot; prefix=&quot;lib&quot;&gt;
      &lt;/zipfileset&gt;&lt;/jar&gt;
  &lt;/target&gt;
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
The trick is to get the dependent jars in the directory&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt; ./lib&lt;/span&gt; for Hadoop EMR (I don&#39;t know about the standard Hadoop, sorry) to be able to include those in the Java classpath.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Second, I wanted to use Amazon S3 as both input and output for files. &amp;nbsp;The trick there is to grab &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;FileSystem&lt;/span&gt; objects based on the URI scheme of the files.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; Path opath=new Path(outputPath);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; FileSystem ofs=opath.getFileSystem(conf);&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Forget a single of those and the whole job crashes and you end up paying Amazon for nothing... $100&#39;s of dollars down the drain ironing up this one.&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jldupont.blogspot.com/feeds/8288623405029874625/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jldupont.blogspot.com/2012/09/notes-on-hadoop-on-amazon-elastic.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/8288623405029874625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/8288623405029874625'/><link rel='alternate' type='text/html' href='http://jldupont.blogspot.com/2012/09/notes-on-hadoop-on-amazon-elastic.html' title='Notes on Hadoop on Amazon Elastic MapReduce'/><author><name>Jean-Lou Dupont</name><uri>http://www.blogger.com/profile/00409924945516479600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3285197066205497695.post-8139094950109312597</id><published>2012-02-22T09:08:00.000-05:00</published><updated>2012-02-22T09:08:02.142-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Architecture"/><category scheme="http://www.blogger.com/atom/ns#" term="Cloud"/><category scheme="http://www.blogger.com/atom/ns#" term="CloudComputing"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><title type='text'>Lego Style Software Design</title><content type='html'>My company recently got the chance to work on a very interesting project (which unfortunately I can&#39;t divulge at the moment). &amp;nbsp;What made the project fun to work on, aside from the product level challenges, was the fact that we were given much more architectural flexibility than usual.&lt;br /&gt;
&lt;br /&gt;
Amongst the work emerged the following:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen=&quot;true&quot; frameborder=&quot;0&quot; height=&quot;749&quot; mozallowfullscreen=&quot;true&quot; src=&quot;https://docs.google.com/presentation/embed?id=1H4ml0O5nqrh-2eRWHxLr4I2A8Zn6eZ1m2dBuO-m6Vsc&amp;amp;start=false&amp;amp;loop=false&amp;amp;delayms=3000&quot; webkitallowfullscreen=&quot;true&quot; width=&quot;100%&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://jldupont.blogspot.com/feeds/8139094950109312597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jldupont.blogspot.com/2012/02/lego-style-software-design.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/8139094950109312597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/8139094950109312597'/><link rel='alternate' type='text/html' href='http://jldupont.blogspot.com/2012/02/lego-style-software-design.html' title='Lego Style Software Design'/><author><name>Jean-Lou Dupont</name><uri>http://www.blogger.com/profile/00409924945516479600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3285197066205497695.post-1431805449456412745</id><published>2012-02-05T19:44:00.001-05:00</published><updated>2012-02-22T08:54:23.220-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Erlang"/><category scheme="http://www.blogger.com/atom/ns#" term="functional-programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Python"/><title type='text'>Python Functional Tools</title><content type='html'>I got the chance to come by a pretty cool project recently: Python &lt;a href=&quot;https://github.com/phzbox/Moka&quot; target=&quot;_blank&quot;&gt;Moka&lt;/a&gt;. &amp;nbsp;It consists of functional programming friendly implementations of standard Python dictionary and list classes. &amp;nbsp;Then it struck me: &amp;nbsp;wouldn&#39;t be nice to have Erlang-ish pattern matching functionality to Python?&lt;br /&gt;
&lt;br /&gt;
So I crafted a small Python package scratching an itch I have had for way too long: &amp;nbsp;function dispatching based on pattern matching. &amp;nbsp;For those interested, here are the relevant links:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Project on &lt;a href=&quot;https://github.com/jldupont/pyfnc&quot; target=&quot;_blank&quot;&gt;Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Main page on &lt;a href=&quot;http://www.systemical.com/doc/opensource/pyfnc&quot; target=&quot;_blank&quot;&gt;Systemical&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Feedback welcome :)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jldupont.blogspot.com/feeds/1431805449456412745/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jldupont.blogspot.com/2012/02/python-functional-tools.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/1431805449456412745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/1431805449456412745'/><link rel='alternate' type='text/html' href='http://jldupont.blogspot.com/2012/02/python-functional-tools.html' title='Python Functional Tools'/><author><name>Jean-Lou Dupont</name><uri>http://www.blogger.com/profile/00409924945516479600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3285197066205497695.post-1927472304263098625</id><published>2012-02-02T22:11:00.001-05:00</published><updated>2012-02-02T22:11:28.298-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Amazon"/><category scheme="http://www.blogger.com/atom/ns#" term="Architecture"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><title type='text'>EC2 architecture notes</title><content type='html'>I&#39;ve updated the home page of &lt;a href=&quot;http://www.systemical.com/&quot; target=&quot;_blank&quot;&gt;Systemical&lt;/a&gt;: you&#39;ll find a bunch of useful links to documents:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.systemical.com/notes/ec2-arch&quot; target=&quot;_blank&quot;&gt;An EC2 architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.systemical.com/doc/system/election-protocol&quot; target=&quot;_blank&quot;&gt;Distributed Leader Election Protocol&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.systemical.com/notes/data-flow-ec2&quot; target=&quot;_blank&quot;&gt;Data-Flow based EC2 architecture&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Enjoy :)&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jldupont.blogspot.com/feeds/1927472304263098625/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jldupont.blogspot.com/2012/02/ec2-architecture-notes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/1927472304263098625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/1927472304263098625'/><link rel='alternate' type='text/html' href='http://jldupont.blogspot.com/2012/02/ec2-architecture-notes.html' title='EC2 architecture notes'/><author><name>Jean-Lou Dupont</name><uri>http://www.blogger.com/profile/00409924945516479600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3285197066205497695.post-5395322670203499623</id><published>2012-01-20T16:01:00.000-05:00</published><updated>2012-01-20T16:01:00.105-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Amazon"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="Python"/><title type='text'>Amazon AWS tools - jldaws</title><content type='html'>Today I am open-sourcing yet another project. &amp;nbsp;It consists in a collection of Linux scripts related to Amazon Web Services (AWS).&lt;br /&gt;
&lt;br /&gt;
The project&#39;s home page can be found &lt;a href=&quot;http://www.systemical.com/doc/opensource/jldaws&quot;&gt;here&lt;/a&gt; whilst the code repository is &lt;a href=&quot;https://github.com/jldupont/jldaws&quot; target=&quot;_blank&quot;&gt;there&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://jldupont.blogspot.com/feeds/5395322670203499623/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jldupont.blogspot.com/2012/01/amazon-aws-tools-jldaws.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/5395322670203499623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/5395322670203499623'/><link rel='alternate' type='text/html' href='http://jldupont.blogspot.com/2012/01/amazon-aws-tools-jldaws.html' title='Amazon AWS tools - jldaws'/><author><name>Jean-Lou Dupont</name><uri>http://www.blogger.com/profile/00409924945516479600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3285197066205497695.post-7257930702905343216</id><published>2011-12-08T14:27:00.001-05:00</published><updated>2011-12-08T14:53:50.759-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Cloud"/><category scheme="http://www.blogger.com/atom/ns#" term="CloudComputing"/><category scheme="http://www.blogger.com/atom/ns#" term="google"/><title type='text'>My life in the Cloud</title><content type='html'>I am pretty much 100% in the Cloud now.  Here&#39;s how I do it.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;Services&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Email: &amp;nbsp;Google GMAIL (with &quot;Tasks&quot;)&lt;/li&gt;
&lt;li&gt;Calendar: &amp;nbsp;Google Calendar&lt;/li&gt;
&lt;li&gt;Documents: &amp;nbsp;Google Docs (with a sprinkle of DropBox, going away soon enough)&lt;/li&gt;
&lt;li&gt;Music: combination of &lt;a href=&quot;http://www.rdio.com/#/people/dupontjl/&quot; target=&quot;_blank&quot;&gt;Rdio&lt;/a&gt; and &lt;a href=&quot;http://grooveshark.com/&quot; target=&quot;_blank&quot;&gt;Grooveshark&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Movies: Netflix &amp;nbsp;(on my Android devices, Apple TV and MacBook Pro)&lt;/li&gt;
&lt;li&gt;Code: &lt;a href=&quot;https://github.com/jldupont&quot; target=&quot;_blank&quot;&gt;Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Project Issue Tracker: &amp;nbsp;&lt;a href=&quot;http://lighthouseapp.com/&quot; target=&quot;_blank&quot;&gt;Lighthouse&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
What I gain:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Mobility&lt;/li&gt;
&lt;li&gt;Availability&lt;/li&gt;
&lt;li&gt;Persistence&lt;/li&gt;
&lt;li&gt;Version Control&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
I don&#39;t need to worry about loosing / forgetting my laptop for work: &amp;nbsp;I just grab a spare one at work. Hence, business continuity is greatly improved over the traditional Microsoft &quot;stack&quot;.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
So, on my Linux/OSX PCs, I only need the following installed software:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Google Chrome &amp;nbsp;(the auto-sync feature for bookmarks, extensions etc. is way cool :)&lt;/li&gt;
&lt;li&gt;Eclipse (with PyDev, Google Plugin, Egit)&lt;/li&gt;
&lt;li&gt;git&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
When it comes time to setting-up a complete working environment, I can turnaround one in under &lt;b&gt;1/2 hour&lt;/b&gt;!&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;Security&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
The first reaction I get when I expose my workflow: &amp;nbsp;is this Cloud stuff secure? &amp;nbsp;To which I respond with a combination of the following:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;I would rather trust Google and their army of sysadmins than me when it comes to external security threats&lt;/li&gt;
&lt;li&gt;I never write down passwords nor credit card numbers in documents. Period.&lt;/li&gt;
&lt;li&gt;Doing business comes down to trust - being part of society requires trust&lt;/li&gt;
&lt;li&gt;My data is more secure located in the Cloud than on my laptop / desktop : those are too easy to lift&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;Availability&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
Another common reaction is about availability. I don&#39;t know about you guys, but Internet Access is pretty available nowadays and certainly Google is. For those of you worried about this dimension, consider:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;I have access through my Android mobile devices (carrier #1)&lt;/li&gt;
&lt;li&gt;I have access&amp;nbsp;through my 3G dongle (carrier #2)&lt;/li&gt;
&lt;li&gt;I have access through my Cable Modem (carrier #3)&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Yes I subscribe to 3 different carriers - I don&#39;t remember the last time I lost connectivity and was out of commission, business wise.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jldupont.blogspot.com/feeds/7257930702905343216/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jldupont.blogspot.com/2011/12/my-life-in-cloud.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/7257930702905343216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/7257930702905343216'/><link rel='alternate' type='text/html' href='http://jldupont.blogspot.com/2011/12/my-life-in-cloud.html' title='My life in the Cloud'/><author><name>Jean-Lou Dupont</name><uri>http://www.blogger.com/profile/00409924945516479600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3285197066205497695.post-5044266316753254820</id><published>2011-10-29T21:59:00.001-04:00</published><updated>2012-02-22T09:07:11.749-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Message-Bus"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><category scheme="http://www.blogger.com/atom/ns#" term="System"/><title type='text'>Software based Message Switch</title><content type='html'>&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen=&quot;true&quot; frameborder=&quot;0&quot; height=&quot;750&quot; src=&quot;https://docs.google.com/presentation/embed?id=1_2VEkOGLK7z8nfUDLKSTZXbnvgLWaL7ffMDCz01MVLs&amp;amp;start=false&amp;amp;loop=false&amp;amp;delayms=3000&quot; webkitallowfullscreen=&quot;true&quot; width=&quot;100%&quot;&gt;&lt;/iframe&gt;</content><link rel='replies' type='application/atom+xml' href='http://jldupont.blogspot.com/feeds/5044266316753254820/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jldupont.blogspot.com/2011/10/software-based-message-switch.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/5044266316753254820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/5044266316753254820'/><link rel='alternate' type='text/html' href='http://jldupont.blogspot.com/2011/10/software-based-message-switch.html' title='Software based Message Switch'/><author><name>Jean-Lou Dupont</name><uri>http://www.blogger.com/profile/00409924945516479600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3285197066205497695.post-5223122855056729915</id><published>2011-08-14T09:03:00.002-04:00</published><updated>2011-08-14T09:03:31.484-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Chrome"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="OSX"/><category scheme="http://www.blogger.com/atom/ns#" term="Python"/><title type='text'>Media-Keys over Web-Socket</title><content type='html'>My newest open-source project is a Media-Keys over Web-Socket application. &amp;nbsp;The project&#39;s details can be found &lt;a href=&quot;https://sites.google.com/a/systemical.com/v1/doc/opensource/mediakeysserver&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Application&lt;/b&gt;&lt;br /&gt;
The main use-case I wanted to address with this component is the ability to control music playback of web-sites such as &lt;a href=&quot;http://grooveshark.com/&quot;&gt;GrooveShark&lt;/a&gt; and &lt;a href=&quot;http://www.rdio.com/&quot;&gt;Rdio&lt;/a&gt; through the keyboard media-keys.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Usage&lt;/b&gt;&lt;br /&gt;
A Google Chrome extension will follow shortly.&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://jldupont.blogspot.com/feeds/5223122855056729915/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jldupont.blogspot.com/2011/08/media-keys-over-web-socket.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/5223122855056729915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/5223122855056729915'/><link rel='alternate' type='text/html' href='http://jldupont.blogspot.com/2011/08/media-keys-over-web-socket.html' title='Media-Keys over Web-Socket'/><author><name>Jean-Lou Dupont</name><uri>http://www.blogger.com/profile/00409924945516479600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3285197066205497695.post-3182961897544993567</id><published>2011-05-18T13:17:00.000-04:00</published><updated>2011-05-18T13:17:30.386-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AppEngine"/><category scheme="http://www.blogger.com/atom/ns#" term="google"/><title type='text'>Using Google Sites as Content Management System</title><content type='html'>I recently had to build a new web site from ground-up. &amp;nbsp;One thing I didn&#39;t want to do is go off installing Wordpress / Drupal etc. on a virtual machine. &amp;nbsp;As much as I love technology, I can&#39;t be bothered anymore with administrative tasks such as backups.&lt;br /&gt;
I decided to give Google Sites another go but I quickly was confronted with the limitations of this platform. That&#39;s when I decided to couple to great Google products: &amp;nbsp;Sites and AppEngine.&lt;br /&gt;
&lt;br /&gt;
View the &lt;a href=&quot;http://www.systemical.com/doc/cms&quot;&gt;presentation&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://jldupont.blogspot.com/feeds/3182961897544993567/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jldupont.blogspot.com/2011/05/using-google-sites-as-content.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/3182961897544993567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/3182961897544993567'/><link rel='alternate' type='text/html' href='http://jldupont.blogspot.com/2011/05/using-google-sites-as-content.html' title='Using Google Sites as Content Management System'/><author><name>Jean-Lou Dupont</name><uri>http://www.blogger.com/profile/00409924945516479600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3285197066205497695.post-6222145167072715148</id><published>2011-04-15T19:33:00.000-04:00</published><updated>2011-04-15T19:33:56.920-04:00</updated><title type='text'>A Service Registration Web-Service API</title><content type='html'>It&#39;s been a while since I have last blogged... been very busy with my company &lt;a href=&quot;http://www.data-tester.com/&quot;&gt;Data-Tester Inc.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
I have the pleasure to announce the immediate availability of another Web-Service hosted on &lt;a href=&quot;http://www.systemical.com/&quot;&gt;Systemical&lt;/a&gt; : &lt;a href=&quot;http://www.systemical.com/web-services/ipreg&quot;&gt;ipreg&lt;/a&gt;. &amp;nbsp;This service allows, for example, mobile devices (such as Android) to &quot;discover&quot; available LAN services). &lt;br /&gt;
&lt;b&gt;Why is this useful at all you might ask?&lt;/b&gt; &amp;nbsp;For the curious: &amp;nbsp;it boils down to limitations related to multicast support in mobile devices. &amp;nbsp;For more details, read the details &lt;a href=&quot;http://www.systemical.com/web-services/ipreg&quot;&gt;here&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://jldupont.blogspot.com/feeds/6222145167072715148/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jldupont.blogspot.com/2011/04/service-registration-web-service-api.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/6222145167072715148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/6222145167072715148'/><link rel='alternate' type='text/html' href='http://jldupont.blogspot.com/2011/04/service-registration-web-service-api.html' title='A Service Registration Web-Service API'/><author><name>Jean-Lou Dupont</name><uri>http://www.blogger.com/profile/00409924945516479600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3285197066205497695.post-565829535622028679</id><published>2010-10-11T20:52:00.000-04:00</published><updated>2010-10-11T20:52:37.117-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="itunes"/><category scheme="http://www.blogger.com/atom/ns#" term="last.fm"/><category scheme="http://www.blogger.com/atom/ns#" term="Python"/><title type='text'>iTunes playcount updater script</title><content type='html'>I am pretty busy these days with my new job ( I am heading a start-up in the telecommunications market ) but I took a couple of hours to craft a couple of scripts.&lt;br /&gt;
&lt;br /&gt;
The first script (&lt;i&gt;lastfm_gettracks&lt;/i&gt;) downloads all of a user&#39;s song track information from &lt;a href=&quot;http://last.fm/&quot;&gt;Last.fm&lt;/a&gt;. It can be found on Pypi &lt;a href=&quot;http://pypi.python.org/pypi/jld_scripts&quot;&gt;here&lt;/a&gt;.&amp;nbsp; More information can be perused &lt;a href=&quot;http://www.systemical.com/doc/opensource/jld_scripts&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
The second script takes as input the file generated by the former script and updates the iTunes database on an OSX machine (sorry, I don&#39;t do windozes). Documentation for this script can be found &lt;a href=&quot;http://www.systemical.com/doc/opensource/itunes_update_playcount&quot;&gt;here&lt;/a&gt; whilst package details can be found on Pypi &lt;a href=&quot;http://pypi.python.org/pypi/jld_osx&quot;&gt;here&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://jldupont.blogspot.com/feeds/565829535622028679/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jldupont.blogspot.com/2010/10/itunes-playcount-updater-script.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/565829535622028679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/565829535622028679'/><link rel='alternate' type='text/html' href='http://jldupont.blogspot.com/2010/10/itunes-playcount-updater-script.html' title='iTunes playcount updater script'/><author><name>Jean-Lou Dupont</name><uri>http://www.blogger.com/profile/00409924945516479600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3285197066205497695.post-1626519652746417930</id><published>2010-09-09T15:34:00.001-04:00</published><updated>2010-09-09T15:34:40.516-04:00</updated><title type='text'>Logo contest</title><content type='html'>Help me choose a logo for my new company. &amp;nbsp;The logo contest on &lt;a href=&quot;http://99designs.com/&quot;&gt;99designs&lt;/a&gt; has ended and it is now time to vote!&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://99designs.com/logo-design/vote-b48bii&quot;&gt;VOTE HERE&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;Thanks!&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jldupont.blogspot.com/feeds/1626519652746417930/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jldupont.blogspot.com/2010/09/logo-contest.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/1626519652746417930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/1626519652746417930'/><link rel='alternate' type='text/html' href='http://jldupont.blogspot.com/2010/09/logo-contest.html' title='Logo contest'/><author><name>Jean-Lou Dupont</name><uri>http://www.blogger.com/profile/00409924945516479600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3285197066205497695.post-2602261530746495805</id><published>2010-09-05T09:08:00.000-04:00</published><updated>2010-09-05T09:08:49.623-04:00</updated><title type='text'>Chrome Framed extension</title><content type='html'>I have just published my latest Google Chrome extension: &amp;nbsp;&lt;a href=&quot;http://www.systemical.com/doc/opensource/chrome-framed&quot;&gt;Chrome-Framed&lt;/a&gt;. &amp;nbsp;The extension allows opening a tab with 2 columns &#39;frame&#39;. &amp;nbsp; This functionality enables a user 2 pages side-by-side in the same chrome window.&lt;br /&gt;
&lt;br /&gt;
Enjoy!</content><link rel='replies' type='application/atom+xml' href='http://jldupont.blogspot.com/feeds/2602261530746495805/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jldupont.blogspot.com/2010/09/chrome-framed-extension.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/2602261530746495805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/2602261530746495805'/><link rel='alternate' type='text/html' href='http://jldupont.blogspot.com/2010/09/chrome-framed-extension.html' title='Chrome Framed extension'/><author><name>Jean-Lou Dupont</name><uri>http://www.blogger.com/profile/00409924945516479600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3285197066205497695.post-8233249110488685457</id><published>2010-08-17T20:21:00.001-04:00</published><updated>2010-08-17T20:52:53.098-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="last.fm"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="music"/><category scheme="http://www.blogger.com/atom/ns#" term="musicbrainz"/><category scheme="http://www.blogger.com/atom/ns#" term="Python"/><title type='text'>Musicbrainz and Last.fm proxies updated</title><content type='html'>Just a quick note to let users of &lt;b&gt;&lt;a href=&quot;http://www.systemical.com/doc/opensource/musicbrainz-proxy-dbus&quot;&gt;musicbrainz-proxy-dbus&lt;/a&gt;&lt;/b&gt; &amp;amp; &lt;b&gt;&lt;a href=&quot;http://www.systemical.com/doc/opensource/lastfm-proxy-dbus&quot;&gt;lastfm-proxy-dbus&lt;/a&gt;&lt;/b&gt; applications that new versions are available on my &lt;a href=&quot;https://launchpad.net/~jldupont/+archive/jldupont&quot;&gt;PPA&lt;/a&gt;. &amp;nbsp;Notable changes include:&lt;br /&gt;
&lt;br /&gt;
- Tray icon support: the main application window can now be closed and a tray icon can control them&lt;br /&gt;
- Help button linking to a web accessible page</content><link rel='replies' type='application/atom+xml' href='http://jldupont.blogspot.com/feeds/8233249110488685457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jldupont.blogspot.com/2010/08/musicbrainz-and-lastfm-proxies-updated.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/8233249110488685457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/8233249110488685457'/><link rel='alternate' type='text/html' href='http://jldupont.blogspot.com/2010/08/musicbrainz-and-lastfm-proxies-updated.html' title='Musicbrainz and Last.fm proxies updated'/><author><name>Jean-Lou Dupont</name><uri>http://www.blogger.com/profile/00409924945516479600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3285197066205497695.post-6009507945311920543</id><published>2010-06-20T21:33:00.001-04:00</published><updated>2010-06-20T21:33:39.503-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AppEngine"/><category scheme="http://www.blogger.com/atom/ns#" term="systemical"/><category scheme="http://www.blogger.com/atom/ns#" term="Web-Services"/><title type='text'>Web Services available on Systemical.com</title><content type='html'>I&#39;ve decided to open access to some web services I built. &amp;nbsp;These services are hosted on &lt;a href=&quot;http://code.google.com/appengine/&quot;&gt;Google AppEngine&lt;/a&gt; and the documentation can be found &lt;a href=&quot;http://www.systemical.com/web-services&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Google Moderator: an RSS feed for a &quot;series&quot;&lt;/li&gt;
&lt;li&gt;Stackoverflow: an RSS feed for a user&#39;s statistics on &lt;a href=&quot;http://stackoverflow.com/&quot;&gt;http://stackoverflow.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Github: an RSS feed for a user&#39;s statistics on &lt;a href=&quot;http://github.com/&quot;&gt;http://github.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;I will be opening access to more services so stay tuned!</content><link rel='replies' type='application/atom+xml' href='http://jldupont.blogspot.com/feeds/6009507945311920543/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jldupont.blogspot.com/2010/06/web-services-available-on-systemicalcom.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/6009507945311920543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/6009507945311920543'/><link rel='alternate' type='text/html' href='http://jldupont.blogspot.com/2010/06/web-services-available-on-systemicalcom.html' title='Web Services available on Systemical.com'/><author><name>Jean-Lou Dupont</name><uri>http://www.blogger.com/profile/00409924945516479600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3285197066205497695.post-8559966559270356513</id><published>2010-06-17T09:00:00.000-04:00</published><updated>2010-06-17T09:00:33.354-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dbus"/><category scheme="http://www.blogger.com/atom/ns#" term="last.fm"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="rhythmbox"/><title type='text'>Last.fm Proxy with DBus interface</title><content type='html'>I just realized I haven&#39;t made a public announcement regarding an application that constitutes a critical piece of my &lt;a href=&quot;http://jldupont.blogspot.com/2010/06/rhythmbox-synclastfm-plugin.html&quot;&gt;Rhythmbox arsenal&lt;/a&gt;: &amp;nbsp;&quot; lastfm-proxy-dbus &quot;.&lt;br /&gt;
&lt;br /&gt;
This Linux Gnome application serves as &quot;proxy&quot; to a Last.fm user&#39;s scrobbling history. The data collected through this proxy serves to populate the &quot;playcount&quot; field of Rhythmbox&#39;s database.&lt;br /&gt;
&lt;br /&gt;
More information can be found &lt;a href=&quot;http://www.systemical.com/doc/opensource/lastfm-proxy-dbus&quot;&gt;here&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://jldupont.blogspot.com/feeds/8559966559270356513/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jldupont.blogspot.com/2010/06/lastfm-proxy-with-dbus-interface.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/8559966559270356513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/8559966559270356513'/><link rel='alternate' type='text/html' href='http://jldupont.blogspot.com/2010/06/lastfm-proxy-with-dbus-interface.html' title='Last.fm Proxy with DBus interface'/><author><name>Jean-Lou Dupont</name><uri>http://www.blogger.com/profile/00409924945516479600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3285197066205497695.post-761243621021035389</id><published>2010-06-15T15:13:00.003-04:00</published><updated>2010-06-15T15:48:38.299-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="musicbrainz music python"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="rhythmbox"/><title type='text'>Rhythmbox Synclastfm plugin</title><content type='html'>Today I announce the availability of a brand new version (2.02) of my Rhythmbox plugin &quot;Synclastfm&quot; (see &lt;a href=&quot;http://jldupont.blogspot.com/2010/01/rhythmbox-plugin-syncing-with-lastfm.html&quot;&gt;previous post&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
This version packs the much anticipated &quot;batch update&quot; feature i.e. the plugin will walk the user&#39;s history on Last.fm in order to update Rhythmbox tracks &#39;playcount&#39; field.&lt;br /&gt;
&lt;br /&gt;
More information can be found &lt;a href=&quot;http://www.systemical.com/doc/opensource/rb-synclastfm&quot;&gt;here&lt;/a&gt;. &amp;nbsp;Have fun and don&#39;t forget to provide feedback!</content><link rel='replies' type='application/atom+xml' href='http://jldupont.blogspot.com/feeds/761243621021035389/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jldupont.blogspot.com/2010/06/rhythmbox-synclastfm-plugin.html#comment-form' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/761243621021035389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/761243621021035389'/><link rel='alternate' type='text/html' href='http://jldupont.blogspot.com/2010/06/rhythmbox-synclastfm-plugin.html' title='Rhythmbox Synclastfm plugin'/><author><name>Jean-Lou Dupont</name><uri>http://www.blogger.com/profile/00409924945516479600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3285197066205497695.post-3345823644982565015</id><published>2010-05-30T23:28:00.002-04:00</published><updated>2010-06-10T08:44:02.356-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="musicbrainz music python"/><title type='text'>Musicbrainz Proxy service over DBus</title><content type='html'>I have just finished another building block on my quest to taming my music library: a Linux based application serving as &#39;proxy&#39; (with caching of course) to Musicbrainz webservice. &amp;nbsp;The service is exposed through DBus.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Why?&lt;/b&gt;&lt;br /&gt;
Correlating music tracks across disparate applications / services can be daunting. For example, suppose one &amp;nbsp;&lt;i&gt;scrobbles&lt;/i&gt;&amp;nbsp;his/her tracks to &lt;a href=&quot;http://last.fm/&quot;&gt;Last.fm&lt;/a&gt;. Furthermore, let&#39;s say one wishes to keep his/her favorite Music Player in &lt;i&gt;sync&lt;/i&gt;&amp;nbsp;with his/her Last.fm profile. &amp;nbsp;This goal appears, on the surface, to be an easy one but as it turns out, support for finding &amp;amp; cataloging music tracks coherently across various applications / services remains elusive at the moment.&lt;br /&gt;
&lt;br /&gt;
Also worth noting: &amp;nbsp;access to Musicbrainz&#39;s webservice is monitored. &amp;nbsp;Webservice API access is limited to 1call/sec: if many applications make uncoordinated access to the service, the user&#39;s machine might get blacklisted. &amp;nbsp;As I intend to make the &lt;i&gt;track mbid&lt;/i&gt;&amp;nbsp;a central piece of information for correlating my music tracks, I needed to address this issue.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Solution&lt;/b&gt;&lt;br /&gt;
With this application, it will be easier to integrate the various other building blocks of my music management arsenal. See the other project &lt;a href=&quot;http://jldupont.blogspot.com/2010/01/rhythmbox-plugin-syncing-with-lastfm.html&quot;&gt;SyncLastfm&lt;/a&gt; that will benefit from this addition.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Project&lt;/b&gt;&lt;br /&gt;
The project&#39;s home page can be found &lt;a href=&quot;http://github.com/jldupont/musicbrainz-proxy-dbus&quot;&gt;here&lt;/a&gt;. &amp;nbsp;The associated &lt;a href=&quot;http://ohloh.net/&quot;&gt;Ohloh&lt;/a&gt; page can be found &lt;a href=&quot;https://www.ohloh.net/p/musicbrainz-proxy-dbus&quot;&gt;there&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Update:&lt;/b&gt;&amp;nbsp;&amp;nbsp;the application will be installed under &lt;i&gt;Applications / Other.&lt;/i&gt;&lt;br /&gt;
&lt;b&gt;Update2:&lt;/b&gt;&amp;nbsp;more information is accessible &lt;a href=&quot;http://www.systemical.com/doc/opensource/musicbrainz-proxy-dbus&quot;&gt;here&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://jldupont.blogspot.com/feeds/3345823644982565015/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jldupont.blogspot.com/2010/05/musicbrainz-proxy-service-over-dbus.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/3345823644982565015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/3345823644982565015'/><link rel='alternate' type='text/html' href='http://jldupont.blogspot.com/2010/05/musicbrainz-proxy-service-over-dbus.html' title='Musicbrainz Proxy service over DBus'/><author><name>Jean-Lou Dupont</name><uri>http://www.blogger.com/profile/00409924945516479600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3285197066205497695.post-2547633816358967303</id><published>2010-05-10T13:26:00.001-04:00</published><updated>2010-05-10T13:26:18.018-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="gadgets"/><category scheme="http://www.blogger.com/atom/ns#" term="google"/><category scheme="http://www.blogger.com/atom/ns#" term="Skype"/><category scheme="http://www.blogger.com/atom/ns#" term="Social Networking"/><category scheme="http://www.blogger.com/atom/ns#" term="Twitter"/><title type='text'>Some Google Gadgets</title><content type='html'>I am in the process of building up my &lt;a href=&quot;http://www.systemical.com/&quot;&gt;company website&lt;/a&gt;&amp;nbsp;based on Google Apps, I need some Google Gadgets to embed but as I am unsure about the majority of the gadgets listed in the &lt;a href=&quot;http://www.google.com/ig/directory&quot;&gt;directory&lt;/a&gt;, I have created &amp;nbsp;some of my own.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Skype Account Information&lt;/li&gt;
&lt;li&gt;Ohloh Profile Flair&lt;/li&gt;
&lt;li&gt;Stackoverflow Profile Flair&lt;/li&gt;
&lt;li&gt;Twitter Profile Flair with latest tweets&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;Links to the relevant gadgets are provided on my &lt;a href=&quot;http://jldupont.blogspot.com/2009/09/mindmap-of-my-projects.html&quot;&gt;projects page&lt;/a&gt;. &amp;nbsp;I would rather not duplicate them here as I am most likely to forget to update them whereas on the project page they&#39;ll get my attention.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;zemanta-pixie&quot; style=&quot;height: 15px; margin-top: 10px;&quot;&gt;&lt;a class=&quot;zemanta-pixie-a&quot; href=&quot;http://reblog.zemanta.com/zemified/958ac04f-d3b7-4971-8fd8-41c76a776deb/&quot; title=&quot;Reblog this post [with Zemanta]&quot;&gt;&lt;img alt=&quot;Reblog this post [with Zemanta]&quot; class=&quot;zemanta-pixie-img&quot; src=&quot;http://img.zemanta.com/reblog_e.png?x-id=958ac04f-d3b7-4971-8fd8-41c76a776deb&quot; style=&quot;border: none; float: right;&quot; /&gt;&lt;/a&gt;&lt;span class=&quot;zem-script more-related pretty-attribution&quot;&gt;&lt;script defer=&quot;defer&quot; src=&quot;http://static.zemanta.com/readside/loader.js&quot; type=&quot;text/javascript&quot;&gt;
&lt;/script&gt;&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jldupont.blogspot.com/feeds/2547633816358967303/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jldupont.blogspot.com/2010/05/some-google-gadgets.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/2547633816358967303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/2547633816358967303'/><link rel='alternate' type='text/html' href='http://jldupont.blogspot.com/2010/05/some-google-gadgets.html' title='Some Google Gadgets'/><author><name>Jean-Lou Dupont</name><uri>http://www.blogger.com/profile/00409924945516479600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3285197066205497695.post-1817421326447632395</id><published>2010-02-08T09:20:00.005-05:00</published><updated>2010-02-08T09:26:21.082-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dbus"/><category scheme="http://www.blogger.com/atom/ns#" term="last.fm"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><title type='text'>Last.fm Web Service desktop interface through DBus</title><content type='html'>Not too long ago, I started my &lt;i&gt;quest to Music Library Faiyland&lt;/i&gt; (my daughter would love this quote). On this journey, I have completed a couple of intermediate steps ( &lt;a href=&quot;http://jldupont.blogspot.com/2010/01/rhythmbox-plugin-syncing-with-lastfm.html&quot;&gt;Rhythmbox plugin - Syncing with Last.fm&lt;/a&gt; and &lt;a href=&quot;http://jldupont.blogspot.com/2010/01/rhythmbox-plugin-for-lastfm-desktop.html&quot;&gt;Rhythmbox plugin for Last.fm desktop client&lt;/a&gt; ) and now I am happy to announce another milestone: a DBus accessible interface to &lt;a href=&quot;http://last.fm/&quot;&gt;Last.fm&lt;/a&gt;&#39;s Web Service API.&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: x-large;&quot;&gt;API&lt;/span&gt;&lt;br /&gt;
The current DBus interface is rudimentary but can be easily extended ( I have abstracted Last.fm&#39;s API to a manageable degree ). I will certainly be expanding the &lt;i&gt;methods&lt;/i&gt; in the near future based on my needs and &quot;customer feedback&quot; ;-) Below is a non-exhaustive list of the API:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Account related:&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;get/set Username&lt;/li&gt;
&lt;li&gt;getAuthUrl : retrieve a URL for authenticating the service against a user&lt;/li&gt;
&lt;li&gt;setApiKey , setSecretKey&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Track related&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;track.addTags&lt;/li&gt;
&lt;li&gt;track.getTags&lt;/li&gt;
&lt;li&gt;track.removeTag&lt;/li&gt;
&lt;/ul&gt;&lt;/ul&gt;&lt;br /&gt;
I have only implemented these &lt;i&gt;methods&lt;/i&gt; because they get me what I need at the moment: the possibility to &quot;rate&quot; my music tracks through a &lt;i&gt;hack&lt;/i&gt;&amp;nbsp;using the tags to hold the rating for a track. E.g. a 5 stars track would get &quot;R5&quot; as tag.&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: x-large;&quot;&gt;Message Based Design Technique&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
In this project, I have further experimented with a design technique based on &quot;Message Passing&quot;. I have made &lt;a href=&quot;http://jldupont.blogspot.com/2010/01/notes-on-message-passing-design.html&quot;&gt;some notes on the subject here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: x-large;&quot;&gt;Project&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
The home page of this project can be found on &lt;a href=&quot;http://github.com/jldupont/dbus_lastfm&quot;&gt;my Github repository&lt;/a&gt;. &amp;nbsp;A Debian package can be found on &lt;a href=&quot;https://launchpad.net/~jldupont/+archive/jldupont&quot;&gt;my Launchpad PPA&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://jldupont.blogspot.com/feeds/1817421326447632395/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jldupont.blogspot.com/2010/02/lastfm-web-service-desktop-interface.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/1817421326447632395'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/1817421326447632395'/><link rel='alternate' type='text/html' href='http://jldupont.blogspot.com/2010/02/lastfm-web-service-desktop-interface.html' title='Last.fm Web Service desktop interface through DBus'/><author><name>Jean-Lou Dupont</name><uri>http://www.blogger.com/profile/00409924945516479600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3285197066205497695.post-1298002102580442885</id><published>2010-01-29T17:36:00.001-05:00</published><updated>2010-01-29T17:39:29.890-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Architecture"/><category scheme="http://www.blogger.com/atom/ns#" term="Design-Patterns"/><category scheme="http://www.blogger.com/atom/ns#" term="Message-Bus"/><title type='text'>Notes on a Message Passing design</title><content type='html'>I am an avid supporter of &quot;message based&quot; systems. I took the time to perform a quick &quot;brain dump&quot; of some of my thoughts on the subject.&lt;br /&gt;
&lt;br /&gt;
&lt;iframe src=&quot;http://docs.google.com/present/embed?id=dgstxrxv_453cgxxmjc2&amp;size=m&quot; frameborder=&quot;0&quot; width=&quot;555&quot; height=&quot;451&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
Follows a simple Python based implementation.&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;http://gist.github.com/288887.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
I will very likely make other contributions to my blog along the same lines.</content><link rel='replies' type='application/atom+xml' href='http://jldupont.blogspot.com/feeds/1298002102580442885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jldupont.blogspot.com/2010/01/notes-on-message-passing-design.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/1298002102580442885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/1298002102580442885'/><link rel='alternate' type='text/html' href='http://jldupont.blogspot.com/2010/01/notes-on-message-passing-design.html' title='Notes on a Message Passing design'/><author><name>Jean-Lou Dupont</name><uri>http://www.blogger.com/profile/00409924945516479600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3285197066205497695.post-9131277153153946625</id><published>2010-01-21T20:04:00.017-05:00</published><updated>2010-01-21T20:30:11.090-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Gnome"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="Python"/><title type='text'>Message Bus for Gnome Object based Python projects</title><content type='html'>Whilst developing my latest software project (&lt;a href=&quot;http://jldupont.blogspot.com/2010/01/rhythmbox-plugin-syncing-with-lastfm.html&quot;&gt;Rhythmbox plugin Last.fm sync&lt;/a&gt;), I have crafted a &quot;Message Bus&quot; based on Gnome GObject. Since I didn&#39;t have any experience at all with Gnome GObject previously, it took me sometimes to work out the details of the architecture. &amp;nbsp;For an example usage, please refer to my &lt;a href=&quot;http://github.com/jldupont/rb_synclastfm&quot;&gt;Git Repository&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;python&quot; name=&quot;code&quot;&gt;&quot;&quot;&quot; 
    GObject based &quot;Message Bus&quot;
    
    @author: Jean-Lou Dupont
&quot;&quot;&quot;

import gobject #@UnresolvedImport

class Signals(gobject.GObject):
    &quot;&quot;&quot;
    List of the application level signals
    &quot;&quot;&quot;
    __gsignals__ = {

         ## NOTE: customization required here
         ## =================================
         ## Announces changes in the user&#39;s Last.fm properties
        &quot;lastfm_username_changed&quot;:  (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (gobject.TYPE_STRING,)) 
        ,&#39;lastfm_password_changed&#39;: (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (gobject.TYPE_STRING,))

        ## Used to signal a change in the currently playing track
        ,&quot;playing_song_changed&quot;:    (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (gobject.TYPE_OBJECT,))
        
        ## Used to report a failure when accessing Last.fm web service
        ,&#39;lastfm_request_failed&#39;:   (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ())
        
        ## Used for distributing the results of the query against the Last.fm web service
        ,&quot;user_track_info&quot;:         (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (gobject.TYPE_OBJECT,))
        
        ## Used to pass around the &quot;shell&quot; global object
        ,&quot;rb_shell&quot;:                (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (gobject.TYPE_OBJECT,))              
    }

    def __init__(self):
        gobject.GObject.__init__(self)
        
        
class Bus(object):
    &quot;&quot;&quot;
    Message Bus
    
    Borg Pattern
    &quot;&quot;&quot;
    _signals=Signals()

    @classmethod
    def emit(cls, name, *pa, **kwa):
        cls._signals.emit(name, *pa, **kwa)

    @classmethod
    def add_emission_hook(cls, name, callback):
        gobject.add_emission_hook(cls._signals, name, callback)
    
mbus=Bus()

## =============================================================== Tests

if __name__==&quot;__main__&quot;:

    def callback(signal, data):
        print &quot;callback: signal=%s, data=%s&quot; % (signal, data)
    
    Bus.add_emission_hook(&quot;lastfm_username_changed&quot;, callback)
    
    Bus.emit(&quot;lastfm_username_changed&quot;, &quot;jldupont&quot;)
&lt;/pre&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: x-large;&quot;&gt;Relevant Stackoverflow posts&lt;/span&gt;&lt;br /&gt;
Here are two Stackoverflow posts in relation with my exercise: &lt;a href=&quot;http://stackoverflow.com/questions/2074372/connecting-signals-in-gtk-anonymous-way&quot;&gt;question 1&lt;/a&gt;, &lt;a href=&quot;http://stackoverflow.com/questions/2088451/gobject-addemissionhook-usage&quot;&gt;question 2&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://jldupont.blogspot.com/feeds/9131277153153946625/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jldupont.blogspot.com/2010/01/message-bus-for-gnome-object-based_21.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/9131277153153946625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/9131277153153946625'/><link rel='alternate' type='text/html' href='http://jldupont.blogspot.com/2010/01/message-bus-for-gnome-object-based_21.html' title='Message Bus for Gnome Object based Python projects'/><author><name>Jean-Lou Dupont</name><uri>http://www.blogger.com/profile/00409924945516479600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3285197066205497695.post-751196183465310357</id><published>2010-01-21T19:13:00.001-05:00</published><updated>2010-06-15T15:15:47.523-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="last.fm"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="rhythmbox"/><title type='text'>Rhythmbox plugin - Syncing with Last.fm</title><content type='html'>In my quest to manage my music collection seamlessly between media players, I&#39;ve decided to use &lt;a href=&quot;http://www.last.fm/&quot;&gt;Last.Fm&lt;/a&gt; as my main database. Last.Fm provides ways to store:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;History of played tracks&lt;/li&gt;
&lt;li&gt;Playcount associated with played tracks&lt;/li&gt;
&lt;li&gt;Tags associated with tracks&lt;/li&gt;
&lt;li&gt;Playlists&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;Through their API (see &lt;a href=&quot;https://www.mindmeister.com/maps/show/39035072&quot;&gt;mindmap&lt;/a&gt;), it is possible to have access to all this information (and much more).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: x-large;&quot;&gt;Rhythmbox&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;My music collection is currently organized through Rhythmbox - it wasn&#39;t my first choice at the time I&#39;ve moved from my Windows desktop to my Linux Ubuntu one but it has proven very useful. RB can be extended with Python scripts quite painlessly.&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: x-large;&quot;&gt;Last.Fm Syncing&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;The plugin I have developed this time supports the following features:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;When a track is played, it downloads the corresponding information from the user&#39;s Last.Fm account and updates the following fields of the Rhythmbox database:&lt;/li&gt;

&lt;ul&gt;&lt;li&gt;Playcount: if the &quot;last.fm playcount&quot; associated with the track is greater than 0, the local playcount of RB is updated with it&lt;/li&gt;
&lt;li&gt;Rating: if the &quot;last.fm love&quot; field is set for the track, the local &quot;rating&quot; field of the track is set to 5.0 (5 stars)&lt;/li&gt;
&lt;/ul&gt;&lt;/ul&gt;&lt;div&gt;With this functionality, it is easier to update a local Rhythmbox media player database with information stored on a user&#39;s account on Last.fm. &amp;nbsp;The standard Last.Fm plugin of Rhythmbox must be enabled and configured correctly.&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: x-large;&quot;&gt;Installation&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;The plugin can be installed by following the procedure found at the &lt;a href=&quot;http://github.com/jldupont/rb_synclastfm&quot;&gt;project&#39;s home page&lt;/a&gt;. A direct link to the plugin Debian/Ubuntu repository is &lt;a href=&quot;https://launchpad.net/~jldupont/+archive/jldupont&quot;&gt;provided here&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: x-large;&quot;&gt;Future&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;The project is far from being completed - I have many other features in the pipeline. Stay tuned!&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: x-large;&quot;&gt;Related project&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;There is a related project to this one: &lt;a href=&quot;http://jldupont.blogspot.com/2010/01/rhythmbox-plugin-for-lastfm-desktop.html&quot;&gt;Rhythmbox - Last.Fm Desktop Client plugin&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Feedback is very welcome!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;b&gt;&lt;u&gt;UPDATE:&lt;/u&gt;&lt;/b&gt; see &lt;a href=&quot;http://jldupont.blogspot.com/2010/06/rhythmbox-synclastfm-plugin.html&quot;&gt;here&lt;/a&gt; for details on the new release.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jldupont.blogspot.com/feeds/751196183465310357/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jldupont.blogspot.com/2010/01/rhythmbox-plugin-syncing-with-lastfm.html#comment-form' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/751196183465310357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/751196183465310357'/><link rel='alternate' type='text/html' href='http://jldupont.blogspot.com/2010/01/rhythmbox-plugin-syncing-with-lastfm.html' title='Rhythmbox plugin - Syncing with Last.fm'/><author><name>Jean-Lou Dupont</name><uri>http://www.blogger.com/profile/00409924945516479600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3285197066205497695.post-2111438814908239674</id><published>2010-01-11T16:50:00.018-05:00</published><updated>2010-01-11T20:29:00.746-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="last.fm"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="rhythmbox"/><title type='text'>Rhythmbox plugin for Last.fm desktop client</title><content type='html'>I&#39;ve recently lost my music database to the hands of Banshee (actually, the Sqlite3 database file is still somewhat salvageable). I have longed for an application that would make my life easy in managing my music collection (which is pretty extensive) and do this day haven&#39;t found one. The recent event pushed me to the edge: I am embarking on a quest to &lt;i&gt;scratch my itch on this matter.&lt;/i&gt;&lt;br /&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:large;&quot;&gt;&lt;b&gt;First step&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;The first step consisted in getting acquainted with &lt;a href=&quot;http://projects.gnome.org/rhythmbox/&quot;&gt;Rhythmbox&lt;/a&gt;, my new music media player. Why Rhythmbox? because it supports a Python based extension system (compared to Banshee&#39;s C# based on) and I happen to really enjoy writing software using Python.&lt;/div&gt;&lt;div&gt;To this effect, I have crafted a plugin that sends the current playing state (START/PAUSED/RESUMED) of Rhythmbox to &lt;a href=&quot;http://www.last.fm/download&quot;&gt;Last.fm&#39;s Desktop Client&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:large;&quot;&gt;&lt;b&gt;Plugin&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;The project is located on &lt;a href=&quot;http://github.com/jldupont/rb_lastfmdk&quot;&gt;Github&lt;/a&gt;. &lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;Project&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;I intend to make several other contributions focused on media players. My goal is to be able to synchronize my music collection seamlessly between Rhythmbox, Last.fm and iTunes (with possibly also &lt;a href=&quot;http://musicbrainz.org/&quot;&gt;Musicbrainz&lt;/a&gt;).  Stay tuned!&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jldupont.blogspot.com/feeds/2111438814908239674/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jldupont.blogspot.com/2010/01/rhythmbox-plugin-for-lastfm-desktop.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/2111438814908239674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/2111438814908239674'/><link rel='alternate' type='text/html' href='http://jldupont.blogspot.com/2010/01/rhythmbox-plugin-for-lastfm-desktop.html' title='Rhythmbox plugin for Last.fm desktop client'/><author><name>Jean-Lou Dupont</name><uri>http://www.blogger.com/profile/00409924945516479600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3285197066205497695.post-2977764760126654942</id><published>2010-01-06T20:35:00.002-05:00</published><updated>2010-01-06T20:36:37.244-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="google"/><category scheme="http://www.blogger.com/atom/ns#" term="wave"/><title type='text'>Google Wave Invites</title><content type='html'>I&#39;ve got some Google Wave invites left... first come, first served!&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jldupont.blogspot.com/feeds/2977764760126654942/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jldupont.blogspot.com/2010/01/google-wave-invites.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/2977764760126654942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3285197066205497695/posts/default/2977764760126654942'/><link rel='alternate' type='text/html' href='http://jldupont.blogspot.com/2010/01/google-wave-invites.html' title='Google Wave Invites'/><author><name>Jean-Lou Dupont</name><uri>http://www.blogger.com/profile/00409924945516479600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>