<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
 
 <title>I'm a lumberjaph</title>
 
 <link href="http://lumberjaph.net/" />
 <updated>2012-02-17T06:44:12-08:00</updated>
 <id>http://lumberjaph.net/</id>
 <author>
   <name>franck cuny</name>
   <email>franck@lumberjaph.net</email>
 </author>

 
 <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/ImALumberjaph" /><feedburner:info uri="imalumberjaph" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
   <title>The state of HTTP's libraries in Python</title>
   <link href="http://feedproxy.google.com/~r/ImALumberjaph/~3/s6XShbGTs2g/HTTP_requests_with_python.html" />
   <updated>2012-02-17T00:00:00-08:00</updated>
   <id>http://lumberjaph.net/python/2012/02/17/HTTP_requests_with_python</id>
   <content type="html">&lt;h2&gt;Hey! I&amp;#8217;m alive!&lt;/h2&gt;
&lt;p&gt;I&amp;#8217;ve started to write some Python for work, and since I&amp;#8217;m new at the game, I&amp;#8217;ve decided to start using it for some personal project too.&lt;/p&gt;
&lt;p&gt;Most of what I do is related to web stuff: writing &lt;span class="caps"&gt;API&lt;/span&gt;, &lt;span class="caps"&gt;API&lt;/span&gt; client, web framweork, etc. At &lt;a href="http://www.saymedia.com/"&gt;&lt;span class="caps"&gt;SAY&lt;/span&gt;:&lt;/a&gt; I&amp;#8217;m working on our platform.  Nothing fancy, but really interesting (at least to me) and challenging work (and we&amp;#8217;re recruting, drop me a mail if you want to know more).&lt;/p&gt;
&lt;h2&gt;Writing &lt;span class="caps"&gt;HTTP&lt;/span&gt; requests with Python&lt;/h2&gt;
&lt;h3&gt;httplib&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://docs.python.org/library/httplib.html"&gt;httplib&lt;/a&gt; is part of the standard library. The documentation says: &amp;#8220;It is normally not used directly&amp;#8221;. And when you look at the &lt;span class="caps"&gt;API&lt;/span&gt; you understand why: it&amp;#8217;s very low-level. It uses the HTTPMessage library (not documented, and not easily accessible). It will return an HTTPResponse object, but again, no documentation, and poor interface.&lt;/p&gt;
&lt;h3&gt;httplib2&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://code.google.com/p/httplib2/"&gt;httplib2&lt;/a&gt; is a very popular library for writing &lt;span class="caps"&gt;HTTP&lt;/span&gt; request with Python. It&amp;#8217;s the one used by Google for it&amp;#8217;s &lt;a href="http://code.google.com/p/google-api-python-client/"&gt;google-api-python-client&lt;/a&gt; library. There&amp;#8217;s absolutly nothing in common between httplib&amp;#8217;s &lt;span class="caps"&gt;API&lt;/span&gt; and this one.&lt;/p&gt;
&lt;p&gt;I dont like it&amp;#8217;s &lt;span class="caps"&gt;API&lt;/span&gt;: the way the library handles the &lt;strong&gt;Response&lt;/strong&gt; object seems wrong to me. You should get one object for the response, not a tuple with the response and the content. The request should also be an object. Also, The status code is considered as a header, and you lose the message that comes with the status.&lt;/p&gt;
&lt;p&gt;There is also an important issue with httplib2 that we discovered at work. In some case, if there is an error, httplib2 will retry the request. That means, in the case of a &lt;span class="caps"&gt;POST&lt;/span&gt; request, it will send twice the payload. There is &lt;a href="http://code.google.com/p/httplib2/issues/detail?id=124"&gt;a ticket that ask to fix that&lt;/a&gt;, marked as &lt;strong&gt;won&amp;#8217;t fix&lt;/strong&gt;. &lt;a href="http://codereview.appspot.com/4365054/"&gt;Even when there is a perfectly acceptable patch for this issue.&lt;/a&gt; (it&amp;#8217;s a &amp;#8220;&lt;a href="https://www.destroyallsoftware.com/talks/wat"&gt;&lt;span class="caps"&gt;WAT&lt;/span&gt;&lt;/a&gt;&amp;#8221; moment). I&amp;#8217;m really curious to know what was the motiviation behind this, because it doesn&amp;#8217;nt makes sense at all. Why would you want your client to retry twice your request if it fails ?&lt;/p&gt;
&lt;h3&gt;urllib&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://docs.python.org/library/urllib.html"&gt;urllib&lt;/a&gt; is also part of the standard library. I was suprised, because given the name, I was expecting a lib to &lt;strong&gt;manipulate&lt;/strong&gt; an &lt;span class="caps"&gt;URL&lt;/span&gt;. And indeed, it also does that! This library mix too many different things.&lt;/p&gt;
&lt;h3&gt;urllib2&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://docs.python.org/library/urllib2.html"&gt;urllib2&lt;/a&gt;. And because 2 is not enough, also &amp;#8230;&lt;/p&gt;
&lt;h3&gt;urllib3&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://code.google.com/p/urllib3/"&gt;urllib3&lt;/a&gt;. I thought for a moment that, maybe, the number number was related to the version of Python. I&amp;#8217;ll spare you the suspense, it&amp;#8217;s not the case. Now I would have expected them to be related to each other (sharing some common &lt;span class="caps"&gt;API&lt;/span&gt;, the number being just a way to provides a better &lt;span class="caps"&gt;API&lt;/span&gt; than the previous version). Sadly it&amp;#8217;s not the case, they all implement different &lt;span class="caps"&gt;API&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;At least, urllib3 has some interesting features:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Thread-safe connection pooling and re-using with &lt;span class="caps"&gt;HTTP&lt;/span&gt;/1.1 keep-alive&lt;/li&gt;
	&lt;li&gt;&lt;span class="caps"&gt;HTTP&lt;/span&gt; and &lt;span class="caps"&gt;HTTPS&lt;/span&gt; (&lt;span class="caps"&gt;SSL&lt;/span&gt;) support&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;request&lt;/h3&gt;
&lt;p&gt;A few persons pointed me to &lt;a href="http://pypi.python.org/pypi/requests"&gt;requests&lt;/a&gt;. And indeed, this one is the nicest of all. Still, not exactly what *I*&amp;#8217;m looking for. This library looks like &lt;a href="https://metacpan.org/module/LWP::Simple"&gt;&lt;span class="caps"&gt;LWP&lt;/span&gt;::Simple&lt;/a&gt;, a library build on top of various &lt;span class="caps"&gt;HTTP&lt;/span&gt; components to help you for the common case. For most of the developers it will be fine and do the work as intented.&lt;/p&gt;
&lt;h2&gt;What I want&lt;/h2&gt;
&lt;p&gt;Since I&amp;#8217;m primarly a Perl developer (here is were 99% of the readers are leaving the page), I&amp;#8217;ve been using &lt;a href="https://metacpan.org/module/LWP"&gt;&lt;span class="caps"&gt;LWP&lt;/span&gt;&lt;/a&gt; and &lt;span class="caps"&gt;HTTP&lt;/span&gt;::Messages for more than 8 years.  &lt;span class="caps"&gt;LWP&lt;/span&gt; is an awesome library. It&amp;#8217;s 16 years old, and it&amp;#8217;s still actively developed by it&amp;#8217;s original author &lt;a href="https://metacpan.org/author/GAAS"&gt;Gisle Aas&lt;/a&gt;. He deserves a lot of respect for his dedication.&lt;/p&gt;
&lt;p&gt;There is a few other library in Perl to do &lt;span class="caps"&gt;HTTP&lt;/span&gt; request, like:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="https://metacpan.org/module/AnyEvent::HTTP"&gt;AnyEvent::&lt;span class="caps"&gt;HTTP&lt;/span&gt;&lt;/a&gt; : if you need to do asynchronous call&lt;/li&gt;
	&lt;li&gt;&lt;a href="https://metacpan.org/module/Furl"&gt;Furl&lt;/a&gt; : by Tokuhiro and his yakuza gang&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;but most of the time, you end up using &lt;span class="caps"&gt;LWP&lt;/span&gt; with &lt;span class="caps"&gt;HTTP&lt;/span&gt;::Messages.&lt;/p&gt;
&lt;p&gt;One of the reason this couple is so popular is because it provides the right abstraction:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;a user-agent is provided by &lt;span class="caps"&gt;LWP&lt;/span&gt;::UserAgent (that you can easily extends to build some custom useragent)&lt;/li&gt;
	&lt;li&gt;a Response class to encapsulates &lt;span class="caps"&gt;HTTP&lt;/span&gt; style responses, provided by &lt;span class="caps"&gt;HTTP&lt;/span&gt;::Message&lt;/li&gt;
	&lt;li&gt;a Request class to encapsulates &lt;span class="caps"&gt;HTTP&lt;/span&gt; style request, provided by &lt;span class="caps"&gt;HTTP&lt;/span&gt;::Message&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The response and request objects use &lt;span class="caps"&gt;HTTP&lt;/span&gt;::Headers and &lt;span class="caps"&gt;HTTP&lt;/span&gt;::Cookies. This way, even if your building a web framework and not a &lt;span class="caps"&gt;HTTP&lt;/span&gt; client, you&amp;#8217;ll endup using &lt;span class="caps"&gt;HTTP&lt;/span&gt;::Headers and &lt;span class="caps"&gt;HTTP&lt;/span&gt;::Cookies since they provide the right &lt;span class="caps"&gt;API&lt;/span&gt;, they&amp;#8217;re well tested, and you only have to learn one &lt;span class="caps"&gt;API&lt;/span&gt;, wether you&amp;#8217;re in an &lt;span class="caps"&gt;HTTP&lt;/span&gt; client or a web framework.&lt;/p&gt;
&lt;h2&gt;http&lt;/h2&gt;
&lt;p&gt;So now you start seeing where I&amp;#8217;m going. And you&amp;#8217;re saying &amp;#8220;ho no, don&amp;#8217;t tell me you&amp;#8217;re writing &lt;strong&gt;another&lt;/strong&gt; &lt;span class="caps"&gt;HTTP&lt;/span&gt; library&amp;#8221;. Hell yeah, I am (sorry, Masa).  But to be honest, I doubt you&amp;#8217;ll ever use it. It&amp;#8217;s doing the job &lt;strong&gt;I&lt;/strong&gt; want, the way &lt;strong&gt;I&lt;/strong&gt; want. And it&amp;#8217;s probably not what you&amp;#8217;re expecting.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/franckcuny/httpclient/"&gt;http&lt;/a&gt;&lt;/strong&gt; is providing an abstraction for the following things:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;http.headers&lt;/li&gt;
	&lt;li&gt;http.request&lt;/li&gt;
	&lt;li&gt;http.response&lt;/li&gt;
	&lt;li&gt;http.date&lt;/li&gt;
	&lt;li&gt;http.url (by my good old friend &lt;a href="https://github.com/bl0b"&gt;bl0b&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I could have named it &lt;strong&gt;httplib3&lt;/strong&gt;, but &lt;strong&gt;http&lt;/strong&gt; seems a better choice: it&amp;#8217;s a library that deals with the &lt;span class="caps"&gt;HTTP&lt;/span&gt; protocol and provide abstraction on top of it.&lt;/p&gt;
&lt;p&gt;You can found the &lt;a href="http://http.readthedocs.org/en/latest/index.html"&gt;documentation here&lt;/a&gt; and install it from &lt;a href="http://pypi.python.org/pypi/http/"&gt;PyPI&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;examples&lt;/h3&gt;
&lt;p&gt;A few examples&lt;/p&gt;
&lt;script src="https://gist.github.com/1659656.js?file=gistfile1.py"&gt;&lt;/script&gt;&lt;script src="https://gist.github.com/1659656.js?file=headers"&gt;&lt;/script&gt;&lt;h3&gt;a client&lt;/h3&gt;
&lt;p&gt;With this, you can easily build a very simple client combining thoses classes, or a more complex one. Or maybe you want to build a web framework, or a framework to test &lt;span class="caps"&gt;HTTP&lt;/span&gt; stuff, and you need a class to manipulate &lt;span class="caps"&gt;HTTP&lt;/span&gt; headers. Then you can use http.headers. The same if you need to create some &lt;span class="caps"&gt;HTTP&lt;/span&gt; responses: http.response.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve started to write &lt;strong&gt;&lt;a href="https://github.com/franckcuny/httpclient/"&gt;httpclient&lt;/a&gt;&lt;/strong&gt; based on this library that will mimic LWP&amp;#8217;s &lt;span class="caps"&gt;API&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve started &lt;a href="http://httpclient.readthedocs.org/en/latest/index.html"&gt;to document this library&lt;/a&gt; and I hope to put something on PyPI soon.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ImALumberjaph/~4/s6XShbGTs2g" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://lumberjaph.net/python/2012/02/17/HTTP_requests_with_python.html</feedburner:origLink></entry>
 
 <entry>
   <title>Weekly Review - 2012-06</title>
   <link href="http://feedproxy.google.com/~r/ImALumberjaph/~3/kc8la_WZ4OI/weekly_review.html" />
   <updated>2012-02-12T00:00:00-08:00</updated>
   <id>http://lumberjaph.net/weekly/2012/02/12/weekly_review</id>
   <content type="html">&lt;p&gt;Lot of documentation for &lt;a href="http://http.readthedocs.org/en/latest/index.html"&gt;http&lt;/a&gt; and &lt;a href="http://httpclient.readthedocs.org/en/latest/index.html"&gt;httpclient&lt;/a&gt; this week, and the first release (with some help from &lt;a href="https://github.com/JNRowe"&gt;James Rowe&lt;/a&gt;) for `http` on &lt;a href="http://pypi.python.org/pypi/http/0.02"&gt;PyPI&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve started to play with google app engine, I&amp;#8217;ll probably push two applications with their code soon.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ImALumberjaph/~4/kc8la_WZ4OI" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://lumberjaph.net/weekly/2012/02/12/weekly_review.html</feedburner:origLink></entry>
 
 <entry>
   <title>Weekly Review - 2012-05</title>
   <link href="http://feedproxy.google.com/~r/ImALumberjaph/~3/ku-oh8pHjAE/weekly_review.html" />
   <updated>2012-02-05T00:00:00-08:00</updated>
   <id>http://lumberjaph.net/weekly/2012/02/05/weekly_review</id>
   <content type="html">&lt;p&gt;Managed to get some work done on the Spore implementation for Python and http.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="https://github.com/franckcuny/httpclient/issues/2"&gt;closed gh-2 on httpclient&lt;/a&gt;: added a new client (&lt;strong&gt;httpclient.simple&lt;/strong&gt;, equivalent to &lt;strong&gt;&lt;span class="caps"&gt;LWP&lt;/span&gt;::Simple&lt;/strong&gt;)&lt;/li&gt;
	&lt;li&gt;&lt;a href="https://github.com/franckcuny/http/issues/23"&gt;closed gh-23 on http&lt;/a&gt;: fix a bug with `append` on Url.Path&lt;/li&gt;
	&lt;li&gt;&lt;a href="https://github.com/franckcuny/http/issues/21"&gt;closed gh-21 on http&lt;/a&gt;: add a setter for `content` on Response&lt;/li&gt;
	&lt;li&gt;&lt;a href="https://github.com/franckcuny/http/issues/24"&gt;closed gh-24 on http&lt;/a&gt;: when the path is empty, set it to &amp;#8216;/&amp;#8217; so the final url is `http://foo.com/` instead of `http://foo.com`&lt;/li&gt;
	&lt;li&gt;&lt;a href="https://github.com/franckcuny/http/issues/22"&gt;closed gh-22 on http&lt;/a&gt;: small bug on the Url class. When the path was unicode, we splitted on each character instead of the default separator&lt;/li&gt;
	&lt;li&gt;&lt;a href="https://github.com/bl0b/spyre/issues/17"&gt;closed gh-17 on spyre&lt;/a&gt;: simplified the interface to create a new client&lt;/li&gt;
	&lt;li&gt;&lt;a href="https://github.com/bl0b/spyre/issues/14"&gt;closed gh-14 and gh-13 on spyre&lt;/a&gt;: switched to `http` and `httpclient` for spyre!&lt;/li&gt;
	&lt;li&gt;&lt;a href="https://github.com/bl0b/spyre/issues/18"&gt;closed gh-18 on spyre&lt;/a&gt;: since we&amp;#8217;re using `http`, we don&amp;#8217;t need a custom &lt;strong&gt;Response&lt;/strong&gt; class anymore&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Also, some code cleanup in bot projects, added a few tests, and created a few tickets for some future tasks.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ImALumberjaph/~4/ku-oh8pHjAE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://lumberjaph.net/weekly/2012/02/05/weekly_review.html</feedburner:origLink></entry>
 
 <entry>
   <title>Weekly Review - 2012-04</title>
   <link href="http://feedproxy.google.com/~r/ImALumberjaph/~3/zy-POk8rs64/weekly_review.html" />
   <updated>2012-01-29T00:00:00-08:00</updated>
   <id>http://lumberjaph.net/weekly/2012/01/29/weekly_review</id>
   <content type="html">&lt;p&gt;Nada. Shame on me :(&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ImALumberjaph/~4/zy-POk8rs64" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://lumberjaph.net/weekly/2012/01/29/weekly_review.html</feedburner:origLink></entry>
 
 <entry>
   <title>Weekly Review - 2012-03</title>
   <link href="http://feedproxy.google.com/~r/ImALumberjaph/~3/8F4WrAFAaB4/weekly_review.html" />
   <updated>2012-01-22T00:00:00-08:00</updated>
   <id>http://lumberjaph.net/weekly/2012/01/22/weekly_review</id>
   <content type="html">&lt;p&gt;Mostly worked on &lt;a href="https://github.com/franckcuny/http"&gt;http&lt;/a&gt; and &lt;a href="https://github.com/franckcuny/http"&gt;httpclient&lt;/a&gt; this week, and started to work on some Java project (lost two days to learn how to use Maven and eclipse, not very proud here &amp;#8230;)&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="https://github.com/franckcuny/http/issues/19"&gt;closed gh-19 on http&lt;/a&gt;: added the setup.py&lt;/li&gt;
	&lt;li&gt;&lt;a href="https://github.com/franckcuny/http/issues/18"&gt;closed gh-18 on http&lt;/a&gt;: added the license file (&lt;span class="caps"&gt;MIT&lt;/span&gt;)&lt;/li&gt;
	&lt;li&gt;&lt;a href="https://github.com/franckcuny/http/issues/18"&gt;closed gh-17 on http&lt;/a&gt;: use http.Url when an Url is used&lt;/li&gt;
	&lt;li&gt;&lt;a href="https://github.com/franckcuny/http/issues/12"&gt;closed gh-12 on http&lt;/a&gt;: merged the code for fluffyurl inside http&amp;#8217;s repository&lt;/li&gt;
	&lt;li&gt;&lt;a href="https://github.com/franckcuny/http/issues/11"&gt;closed gh-11 on http&lt;/a&gt;: created a new dist (httpclient) for the client&amp;#8217;s code&lt;/li&gt;
	&lt;li&gt;&lt;a href="https://github.com/franckcuny/httpclient/issues/5"&gt;closed gh-5 on * httpclient&lt;/a&gt; added the license file (&lt;span class="caps"&gt;MIT&lt;/span&gt;)&lt;/li&gt;
	&lt;li&gt;some documentations for http and httpclient&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/ImALumberjaph/~4/8F4WrAFAaB4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://lumberjaph.net/weekly/2012/01/22/weekly_review.html</feedburner:origLink></entry>
 
 <entry>
   <title>Weekly Review - 2012-02</title>
   <link href="http://feedproxy.google.com/~r/ImALumberjaph/~3/tGaYpsHv6aA/weekly_review.html" />
   <updated>2012-01-15T00:00:00-08:00</updated>
   <id>http://lumberjaph.net/weekly/2012/01/15/weekly_review</id>
   <content type="html">&lt;p&gt;I didn&amp;#8217;t do much this week. Here is a quick list:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="https://github.com/saymedia/AnyEvent-Peer39"&gt;published an AnyEvent client for Peer39&amp;#8217;s &lt;span class="caps"&gt;API&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="https://github.com/bl0b/spyre/issues?sort=created&amp;amp;direction=desc&amp;amp;state=open"&gt;created a bunch of tickets for Spyre&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="https://github.com/franckcuny/fluffyhttp/issues/6"&gt;closed gh-6 on fluffyhttp&lt;/a&gt;: renamed fluffyhttp to http&lt;/li&gt;
	&lt;li&gt;&amp;#8220;closed gh-9 on&lt;/li&gt;
	&lt;li&gt;fluffyhttp&amp;quot;:https://github.com/franckcuny/fluffyhttp/issues/9: Now some headers (like &lt;strong&gt;Last-Modified&lt;/strong&gt;) can store datetime object and are properties. If called as a property they will return the object, if they&amp;#8217;re called via the &lt;strong&gt;get&lt;/strong&gt; method from the Header object, they will return a string.&lt;/li&gt;
	&lt;li&gt;start documenting fluffyurl&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I should be able to do more work next week (and Monday is an holiday, I&amp;#8217;ll try to put more work on Spyre).&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ImALumberjaph/~4/tGaYpsHv6aA" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://lumberjaph.net/weekly/2012/01/15/weekly_review.html</feedburner:origLink></entry>
 
 <entry>
   <title>Weekly Review - 2012-01</title>
   <link href="http://feedproxy.google.com/~r/ImALumberjaph/~3/O8OMN9zWqcM/weekly_review.html" />
   <updated>2012-01-08T00:00:00-08:00</updated>
   <id>http://lumberjaph.net/weekly/2012/01/08/weekly_review</id>
   <content type="html">&lt;p&gt;What I&amp;#8217;ve done this week:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="https://github.com/franckcuny/net-http-spore/pull/11"&gt;applied Brian&amp;#8217;s patches for Net::&lt;span class="caps"&gt;HTTP&lt;/span&gt;::Spore&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="https://github.com/franckcuny/net-http-spore/commit/d41d8b640be7a0a364fefd30355081df69cc5cf0"&gt;remove a useless regex in Net::&lt;span class="caps"&gt;HTTP&lt;/span&gt;::Spore&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="htps://github.com/franckcuny/fluffyhttp/issues/2"&gt;rewrite&lt;/a&gt; the way Headers are handled withing `http&amp;#8217;&lt;/li&gt;
	&lt;li&gt;some documentation for `http&amp;#8217; * (&lt;a href="https://github.com/franckcuny/fluffyhttp/issues/4"&gt;Response&lt;/a&gt; objects)&lt;/li&gt;
	&lt;li&gt;&lt;a href="https://github.com/franckcuny/fluffyhttp/issues/7"&gt;refactoring&lt;/a&gt; of the Header class to add some properties when required&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/ImALumberjaph/~4/O8OMN9zWqcM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://lumberjaph.net/weekly/2012/01/08/weekly_review.html</feedburner:origLink></entry>
 
 <entry>
   <title>StarGit</title>
   <link href="http://feedproxy.google.com/~r/ImALumberjaph/~3/ZPWLg2Dt3_g/stargit.html" />
   <updated>2011-06-20T00:00:00-07:00</updated>
   <id>http://lumberjaph.net/community/2011/06/20/stargit</id>
   <content type="html">&lt;p&gt;Last year I did a &lt;a href="http://lumberjaph.net/graph/2010/03/25/github-explorer.html"&gt;small exploration of GitHub&lt;/a&gt; to show the various communities using &lt;a href="http://github.com"&gt;GitHub&lt;/a&gt; and how they work. I wanted to do it again this year, but I was lacking time and motivation to start over. A couple of months ago, I got a message from &lt;a href="https://twitter.com/#!/mojombo"&gt;mojombo&lt;/a&gt; asking me if I was planning to do a new poster. This triggered the motivation to work on it again.&lt;/p&gt;
&lt;p&gt;This time I got help from &lt;a href="https://twitter.com/#!/jacomyal"&gt;Alexis&lt;/a&gt; to provide you with an awesome tool: &lt;a href="http://www.stargit.net"&gt;a real explorer of your graph&lt;/a&gt;, but more on this later ;)&lt;/p&gt;
&lt;p&gt;&lt;img class="img_center" src="/static/imgs/stargit.png" title="StarGit" /&gt;&lt;/p&gt;
&lt;p&gt;And of course, &lt;a href="http://labs.linkfluence.net"&gt;the poster&lt;/a&gt;. Feel free to print it yourself, the size of the poster is A1.&lt;/p&gt;
&lt;p&gt;&lt;img class="img_center" src="/static/imgs/github-poster-v2.png" title="GitHub Poster" /&gt;&lt;/p&gt;
&lt;h2&gt;The data&lt;/h2&gt;
&lt;p&gt;All the data are available! Last year I got some mails asking me for the dataset. So this time I asked first if I could release the &lt;a href="http://maps.startigt.net/dump/github.tgz"&gt;data&lt;/a&gt; with the &lt;a href="https://github.com/franckcuny/StarGit"&gt;code&lt;/a&gt; and the poster, and the anwser is yes! So if you&amp;#8217;re intereseted, you can download it.&lt;/p&gt;
&lt;p&gt;The data are stored in mongodb, so I provide the dump which you can easily use:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;code&gt;wget http://maps.stargit.net/dump/github.tgz&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;tar xvzf github.tgz&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;cd github&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;mongorestore -d github .&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now you can use mongodb to browse the imported database. There is 5 collections: profiles / repositories / relations / contributions / edges.&lt;/p&gt;
&lt;h2&gt;Methodology&lt;/h2&gt;
&lt;p&gt;Last year I did a simple &amp;#8220;follower/following&amp;#8221; graph. It was already interesting, but it was also &lt;strong&gt;really&lt;/strong&gt; too simple. This time I wanted to go deeper in the exploration.&lt;/p&gt;
&lt;p&gt;The various step to process all this data are:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;using the GitHub &lt;span class="caps"&gt;API&lt;/span&gt;, fetch informations from the profiles.&lt;/li&gt;
	&lt;li&gt;when all the profiles are collected, informations about the repositories are fetched. Only forked repositories are kept.&lt;/li&gt;
	&lt;li&gt;&amp;#8220;simple&amp;#8221; relations (followers/following) are kept and used later to add weight to relations.&lt;/li&gt;
	&lt;li&gt;tag user with the main programming language they use. Using the GitHub &lt;span class="caps"&gt;API&lt;/span&gt;, I was able to categorize ~40k profiles (about 1/3 of my whole dataset).&lt;/li&gt;
	&lt;li&gt;using the GeoNames &lt;span class="caps"&gt;API&lt;/span&gt;, extract the name of the country the user is in. This time, about 55k profiles were tagged.&lt;/li&gt;
	&lt;li&gt;fetch contributions for each repositories&lt;/li&gt;
	&lt;li&gt;compute a score between the author of the contribution and the owner of the repo&lt;/li&gt;
	&lt;li&gt;add a weight to each edges, using the computed score and &amp;#8220;+1&amp;#8221; if the developer follow the other developer&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For all the graphs, I&amp;#8217;ve used the following colors for:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;span style="color:#C40C0F"&gt;Ruby&lt;/span&gt;&lt;/li&gt;
	&lt;li&gt;&lt;span style="color:#4C9E97"&gt;JavaScript&lt;/span&gt;&lt;/li&gt;
	&lt;li&gt;&lt;span style="color:#3F9E16"&gt;Python&lt;/span&gt;&lt;/li&gt;
	&lt;li&gt;&lt;span style="color:#8431C4"&gt;C (C++, C#)&lt;/span&gt;&lt;/li&gt;
	&lt;li&gt;&lt;span style="color:#29519E"&gt;Perl&lt;/span&gt;&lt;/li&gt;
	&lt;li&gt;&lt;span style="color:#9D61C4"&gt;&lt;span class="caps"&gt;PHP&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
	&lt;li&gt;&lt;span style="color:#C4B646"&gt;&lt;span class="caps"&gt;JVM&lt;/span&gt; (Java, Clojure, Scala)&lt;/span&gt;&lt;/li&gt;
	&lt;li&gt;&lt;span style="color:#90C480"&gt;Lisp (Emacs Lisp, Common Lisp)&lt;/span&gt;&lt;/li&gt;
	&lt;li&gt;&lt;span style="color:#9C9E9C"&gt;Other&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Exploring&lt;/h2&gt;
&lt;p&gt;Feel free to do your own analysis in the comments :) For each map, you&amp;#8217;ll find a &lt;span class="caps"&gt;PDF&lt;/span&gt; of the map, and the graph to explore using gephi (in &lt;span class="caps"&gt;GEXF&lt;/span&gt; or &lt;span class="caps"&gt;GDF&lt;/span&gt; format).&lt;/p&gt;
&lt;h3&gt;but first, some numbers&lt;/h3&gt;
&lt;p&gt;I&amp;#8217;ve collected:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;123 562 profiles&lt;/li&gt;
	&lt;li&gt;2 730 organizations&lt;/li&gt;
	&lt;li&gt;40 807 repositories&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This took me about a month in order to collect the data and to build the adapted tools.&lt;/p&gt;
&lt;h4&gt;Accounts creations&lt;/h4&gt;
&lt;p&gt;The following chart show the number of account created by month. &amp;#8220;Everyone&amp;#8221; means the total of accounts created. You can also see the numbers for each communities.&lt;/p&gt;
&lt;p&gt;On the &amp;#8220;Everyone&amp;#8221; graph, you can see a huge pick around April 2008, that&amp;#8217;s the date GitHub &lt;a href="https://github.com/blog/40-we-launched"&gt;was launched&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For most of the communities, the number of created accounts start to decrease since 2010. I think the reason is that most of the developers from those communities are now on GitHub.&lt;/p&gt;
&lt;script language="javascript" type="text/javascript" src="/static/js/jquery.js"&gt;&lt;/script&gt;&lt;script language="javascript" type="text/javascript" src="/static/js/jquery.flot.js"&gt;&lt;/script&gt;
&lt;div id="placeholder" style="width:800px;height:300px;"&gt;&lt;/div&gt; 
&lt;ul class="actions"&gt;
  &lt;li class="minibutton"&gt;&lt;input class="fetchSeries" type="button" value="Everyone" href="/static/json/global.json"&gt;&lt;/li&gt;
  &lt;li class="minibutton"&gt;&lt;input class="fetchSeries" type="button" value="C" href="/static/json/C.json"&gt;&lt;/li&gt;
  &lt;li class="minibutton"&gt;&lt;input class="fetchSeries" type="button" value="JVM" href="/static/json/JVM.json"&gt;&lt;/li&gt;
  &lt;li class="minibutton"&gt;&lt;input class="fetchSeries" type="button" value="JS" href="/static/json/JavaScript.json"&gt;&lt;/li&gt;
  &lt;li class="minibutton"&gt;&lt;input class="fetchSeries" type="button" value="Lisp" href="/static/json/Lisp.json"&gt;&lt;/li&gt;
  &lt;li class="minibutton"&gt;&lt;input class="fetchSeries" type="button" value="Perl" href="/static/json/Perl.json"&gt;&lt;/li&gt;
  &lt;li class="minibutton"&gt;&lt;input class="fetchSeries" type="button" value="PHP" href="/static/json/PHP.json"&gt;&lt;/li&gt;
  &lt;li class="minibutton"&gt;&lt;input class="fetchSeries" type="button" value="Python" href="/static/json/Python.json"&gt;&lt;/li&gt;
  &lt;li class="minibutton"&gt;&lt;input class="fetchSeries" type="button" value="Ruby" href="/static/json/Ruby.json"&gt;&lt;/li&gt;
  &lt;li class="minibutton"&gt;&lt;input class="fetchSeries" type="button" value="Uncategorized users" href="/static/json/Other.json"&gt;&lt;/li&gt;
  &lt;li class="minibutton"&gt;&lt;input class="resetSeries" type="button" value="reset"&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;script type="text/javascript"&gt; 
$(function () {
    var options = {
        lines: { show: true },
        points: { show: true },
        xaxis: { mode:"time" }
    };
    var data = [];
    var placeholder = $("#placeholder");
    
    $.plot(placeholder, data, options);
 
    // fetch one series, adding to what we got
    var alreadyFetched = {};

    $("input.resetSeries").click(function() {
        alreadyFetched = {};
        data = [];
        $.plot(placeholder, data, options);
    });
    
    $("input.fetchSeries").click(function () {
        var button = $(this);
        
        // find the URL in the link right next to us 
        var dataurl = button.attr('href');
 
        // then fetch the data with jQuery
        function onDataReceived(series) {
            // extract the first coordinate pair so you can see that
            // data is now an ordinary Javascript object
            var firstcoordinate = '(' + series.data[0][0] + ', ' + series.data[0][1] + ')';
 
            // let's add it to our current data
            if (!alreadyFetched[series.label]) {
                alreadyFetched[series.label] = true;
                data.push(series);
            }
            
            // and plot all we got
            $.plot(placeholder, data, options);
         }
        
        $.ajax({
            url: dataurl,
            method: 'GET',
            dataType: 'json',
            success: onDataReceived
        });
    });
});
&lt;/script&gt;
&lt;h4&gt;languages&lt;/h4&gt;
&lt;p&gt;(Keep in mind that these numbers are coming from the profiles I was able to tag, roughly 40k)&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Ruby: 10046 (28%)&lt;/li&gt;
	&lt;li&gt;Python: 5403 (15%)&lt;/li&gt;
	&lt;li&gt;JavaScript: 5282 (15%) (JavaScript + CoffeeScript)&lt;/li&gt;
	&lt;li&gt;C: 5093 (14%) (C, C++, C#)&lt;/li&gt;
	&lt;li&gt;&lt;span class="caps"&gt;PHP&lt;/span&gt;: 3933 (11%)&lt;/li&gt;
	&lt;li&gt;&lt;span class="caps"&gt;JVM&lt;/span&gt;: 3790 (10%) (Java, Clojure, Scala, Groovy)&lt;/li&gt;
	&lt;li&gt;Perl: 1215 (3%)&lt;/li&gt;
	&lt;li&gt;Lisp: 348 (0%) (Emacs Lisp, Common Lisp)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Those numbers doesn&amp;#8217;t really match &lt;a href="https://github.com/languages"&gt;what GitHub gave&lt;/a&gt;, but it could be explained by the way I&amp;#8217;ve selected my users.&lt;/p&gt;
&lt;h4&gt;country&lt;/h4&gt;
&lt;ol&gt;
	&lt;li&gt;United States: 19861 (36%)&lt;/li&gt;
	&lt;li&gt;United Kingdom: 3533 (6%)&lt;/li&gt;
	&lt;li&gt;Germany: 3009 (5%)&lt;/li&gt;
	&lt;li&gt;Canada: 2657 (4%)&lt;/li&gt;
	&lt;li&gt;Brazil: 2454 (4%)&lt;/li&gt;
	&lt;li&gt;France: 1833 (3%)&lt;/li&gt;
	&lt;li&gt;Japan: 1799 (3%)&lt;/li&gt;
	&lt;li&gt;Russia: 1604 (2%)&lt;/li&gt;
	&lt;li&gt;Australia: 1441 (2%)&lt;/li&gt;
	&lt;li&gt;China: 1159 (2%)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The United States are still the main country represented on GitHub, no suprise here.&lt;/p&gt;
&lt;p&gt;If you are interested in the &amp;#8220;geography&amp;#8221; of Open Source, you should read these two articles: &lt;a href="http://takhteyev.org/dissertation/"&gt;Coding Places&lt;/a&gt; and &lt;a href="http://takhteyev.org/papers/Takhteyev-Hilts-2010.pdf"&gt;Investigating the Geography of Open Source Software through Github&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;companies&lt;/h4&gt;
&lt;p&gt;Looking at the &amp;#8220;company&amp;#8221; field on user&amp;#8217;s profile, here are some stats about which companies has employees using GitHub:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;ThoughtWorks: 102&lt;/li&gt;
	&lt;li&gt;Google: 66&lt;/li&gt;
	&lt;li&gt;Mozilla: 65&lt;/li&gt;
	&lt;li&gt;Yahoo!: 65&lt;/li&gt;
	&lt;li&gt;Red Hat: 64&lt;/li&gt;
	&lt;li&gt;Globo.com: 55&lt;/li&gt;
	&lt;li&gt;Twitter: 53&lt;/li&gt;
	&lt;li&gt;Facebook: 45&lt;/li&gt;
	&lt;li&gt;Yandex: 43&lt;/li&gt;
	&lt;li&gt;Intridea: 34&lt;/li&gt;
	&lt;li&gt;Microsoft: 33&lt;/li&gt;
	&lt;li&gt;Engine Yard: 32&lt;/li&gt;
	&lt;li&gt;Pivotal Labs: 29&lt;/li&gt;
	&lt;li&gt;&lt;span class="caps"&gt;MIT&lt;/span&gt;: 28&lt;/li&gt;
	&lt;li&gt;Rackspace: 27&lt;/li&gt;
	&lt;li&gt;&lt;span class="caps"&gt;IBM&lt;/span&gt;: 24&lt;/li&gt;
	&lt;li&gt;Caelum: 23&lt;/li&gt;
	&lt;li&gt;Novell: 22&lt;/li&gt;
	&lt;li&gt;GitHub: 22&lt;/li&gt;
	&lt;li&gt;VMware: 22&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I didn&amp;#8217;t knew the first company, ThoughtWorks, and I was expecting to see FaceBook or Twitter as the company with most developpers on GitHub. It&amp;#8217;s also interesting to see Yandex here.&lt;/p&gt;
&lt;h3&gt;Global graph (1628 nodes, 9826 edges)&lt;/h3&gt;
&lt;p&gt;(&lt;a href="http://maps.stargit.net/global/global.pdf"&gt;download &lt;span class="caps"&gt;PDF&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://maps.stargit.net/global/global.gdf"&gt;download &lt;span class="caps"&gt;GDF&lt;/span&gt;&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;The main difference with last year, is the android / modders community. They&amp;#8217;re developing mostly in C and Java. The poster has been created from this map.&lt;/p&gt;
&lt;h3&gt;Ruby (1968 nodes, 9662 edges)&lt;/h3&gt;
&lt;p&gt;(&lt;a href="http://maps.stargit.net/ruby/ruby.pdf"&gt;download &lt;span class="caps"&gt;PDF&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://maps.stargit.net/ruby/ruby.gdf"&gt;download &lt;span class="caps"&gt;GDF&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://maps.stargit.net/ruby/ruby.gexf"&gt;download &lt;span class="caps"&gt;GEXF&lt;/span&gt;&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;This is still the main community on GitHub, even if JavaScript is now &lt;a href="https://github.com/languages/JavaScript"&gt;the most popular language&lt;/a&gt;. This graph is really dense, it&amp;#8217;s not easy to read, since there is no real cluster in this one.&lt;/p&gt;
&lt;h3&gt;Python (1062 nodes, 2631 edges)&lt;/h3&gt;
&lt;p&gt;(&lt;a href="http://maps.stargit.net/python/python.pdf"&gt;download &lt;span class="caps"&gt;PDF&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://maps.stargit.net/python/python.gdf"&gt;download &lt;span class="caps"&gt;GDF&lt;/span&gt;&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Here we have some clusters. I&amp;#8217;m not familiar with the Python community, so I can&amp;#8217;t really give any insight.&lt;/p&gt;
&lt;h3&gt;Perl (608 nodes, 2967 edges)&lt;/h3&gt;
&lt;p&gt;(&lt;a href="http://maps.stargit.net/perl/perl.pdf"&gt;download &lt;span class="caps"&gt;PDF&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://maps.stargit.net/perl/perl.gdf"&gt;download &lt;span class="caps"&gt;GDF&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://maps.stargit.net/perl/perl.gexf"&gt;download &lt;span class="caps"&gt;GEXF&lt;/span&gt;&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;I really like this graph since it show (in my opinion) one of the real strength of this community: everybody works with everybody. People working on a webframework will collaborate with people working on Moose, or an &lt;span class="caps"&gt;ORM&lt;/span&gt;, or other tools. It shows that in this community, people are competent in more than one field.&lt;/p&gt;
&lt;p&gt;The Perl community is about the same size as last year. However, we can extract the following informations:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;the Japaneses Perl Hackers are still a cluster by themselves&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://github.com/miyagawa"&gt;miyagawa&lt;/a&gt; is still the glue between the Japanese community and the &amp;#8220;rest of the world&amp;#8221;&lt;/li&gt;
	&lt;li&gt;other leaders are: Florian Ragwitz (&lt;a href="http://github.com/rafl"&gt;rafl&lt;/a&gt;), Andy Amstrong (&lt;a href="http://github.com/andya"&gt;AndyA&lt;/a&gt;), Dave Rolsky (&lt;a href="http://github.com/autarch"&gt;autarch&lt;/a&gt;)&lt;/li&gt;
	&lt;li&gt;some clusters exists for the following projects:
	&lt;ul&gt;
		&lt;li&gt;Moose&lt;/li&gt;
		&lt;li&gt;Dancer&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As we can see on the previous charts, the number of created accounts for the Perl developpers is stalling.&lt;/p&gt;
&lt;h3&gt;United States (2646 nodes, 11344 edges)&lt;/h3&gt;
&lt;p&gt;(&lt;a href="http://maps.startgit.net/unitedstates/unitedstates.pdf"&gt;download &lt;span class="caps"&gt;PDF&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://maps.startgit.net/unitedstates/unitedstates.gdf"&gt;download &lt;span class="caps"&gt;GDF&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://maps.startgit.net/unitedstates/unitedstates.gexf"&gt;download &lt;span class="caps"&gt;GEXF&lt;/span&gt;&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;This one is really nice. We can clearly see all the communities. There is something interesting:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;C and Ruby are on the opposite side (C on the left, Ruby on the right)&lt;/li&gt;
	&lt;li&gt;Python and Perl are also opposed (Perl at the bottom and Python at the top)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I&amp;#8217;ll let you take some conclusion by yourself on this one ;)&lt;/p&gt;
&lt;h3&gt;France (706 nodes, 1059 edges)&lt;/h3&gt;
&lt;p&gt;(&lt;a href="http://maps.stargit.net/france/france.pdf"&gt;download &lt;span class="caps"&gt;PDF&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://maps.stargit.net/france/france.gdf"&gt;download &lt;span class="caps"&gt;GDF&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://maps.stargit.net/france/france.gexf"&gt;download &lt;span class="caps"&gt;GEXF&lt;/span&gt;&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;We have a lot of small clusters on this one, and some very big authorities.&lt;/p&gt;
&lt;h3&gt;Japan (464 nodes, 1091 edges)&lt;/h3&gt;
&lt;p&gt;(&lt;a href="http://maps.stargit.net/japan/japan.pdf"&gt;download &lt;span class="caps"&gt;PDF&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://maps.stargit.net/japan/japan.gdf"&gt;download &lt;span class="caps"&gt;GDF&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://maps.stargit.net/japan/japan.gexf"&gt;download &lt;span class="caps"&gt;GEXF&lt;/span&gt;&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;There is three dominants clusters on this one:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Ruby&lt;/li&gt;
	&lt;li&gt;Perl&lt;/li&gt;
	&lt;li&gt;C&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The Ruby and Perl one are well connected. There is a lot of japanese hacker on &lt;span class="caps"&gt;CPAN&lt;/span&gt; using both languages.&lt;/p&gt;
&lt;h2&gt;StarGit&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://stargit.net"&gt;StarGit&lt;/a&gt; is a great tool we built with Alexis to let you explore &lt;strong&gt;your&lt;/strong&gt; community on GitHub. You can read more about the application on &lt;a href="http://ofnodesandedges.com/2011/06/20/stargit.html"&gt;Alexis&amp;#8217; blog&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s hosted on &lt;a href="http://dotcloud.com"&gt;dotcloud&lt;/a&gt; (I&amp;#8217;m still amazed at how easy it was to deploy the code &amp;#8230;), using the Perl &lt;a href="http://perldancer.org"&gt;Dancer web framework&lt;/a&gt;, MongoDB to store the data, and Redis to do some caching.&lt;/p&gt;
&lt;h2&gt;Credits&lt;/h2&gt;
&lt;p&gt;I would like to thanks the whole GitHub team for being interested in the previous poster and to ask another one this year :)&lt;/p&gt;
&lt;p&gt;A &lt;strong&gt;huge&lt;/strong&gt; thanks to Alexis for his help on building the awesome StarGit. Another big thanks to Antonin for his work on the poster.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ImALumberjaph/~4/ZPWLg2Dt3_g" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://lumberjaph.net/community/2011/06/20/stargit.html</feedburner:origLink></entry>
 
 <entry>
   <title>French Perl Workshop 2011</title>
   <link href="http://feedproxy.google.com/~r/ImALumberjaph/~3/vAeLp5NddR0/french_perl_workshop.html" />
   <updated>2011-05-08T00:00:00-07:00</updated>
   <id>http://lumberjaph.net/perl/2011/05/08/french_perl_workshop</id>
   <content type="html">&lt;p&gt;The call for paper for the &lt;a href="http://journeesperl.fr/fpw2011/"&gt;French Perl Workshop&lt;/a&gt; is open. This event will be held the 24th and 25th of June in Paris. As always, this is a free conference.&lt;/p&gt;
&lt;p&gt;&lt;img class="img_center" src="http://franck.lumberjaph.net/blog/misc/affiche_fpw11.jpg" /&gt;&lt;/p&gt;
&lt;h2&gt;Where&lt;/h2&gt;
&lt;p&gt;The workshop will take place in Cité des Sciences in Paris. This is the same place as for last year &lt;span class="caps"&gt;OSDC&lt;/span&gt;.fr. The venue is easy to access using the subway (line 7), and there is a nice park to take a break or take a lunch.&lt;/p&gt;
&lt;h2&gt;Talks&lt;/h2&gt;
&lt;p&gt;Yes, we need more talks :) We&amp;#8217;ve already &lt;a href="http://journeesperl.fr/fpw2011/talks"&gt;accepted&lt;/a&gt; a little bit more than 10 talks, but we need &lt;strong&gt;more&lt;/strong&gt; talks to fill the schedule. An introduction to Perl will also be organized in addition to the talks. We&amp;#8217;re also looking for some talks about Perl&amp;#8217;s success in entreprise. If you&amp;#8217;re using Perl at work, please, come to share with a captive audiance how you use it and how it&amp;#8217;s helpful.&lt;/p&gt;
&lt;h2&gt;What&lt;/h2&gt;
&lt;p&gt;We will organize two dinners, one the thursday night, and a second the friday night. You should check the &lt;a href="http://journeesperl.fr/fpw2011/wiki"&gt;wiki&lt;/a&gt; to find more informations. (BooK is also looking for some people to join him to a concert :))&lt;/p&gt;
&lt;h2&gt;Who&lt;/h2&gt;
&lt;p&gt;You! of course. This event will be nothing without you, your talk, and your presence. The whole organizers team is working hard to make this event a great conference. I also want to thank Laurent Boivin for all his efforts and pushing us to do our tasks.&lt;/p&gt;
&lt;p&gt;If you happen to be in Paris next week during &lt;a href="http://www.solutionslinux.fr/?lg=en"&gt;Solution Linux&lt;/a&gt;, please, stop by to the French Mongueurs booth.&lt;/p&gt;
&lt;p&gt;So, what are you waiting to register ?&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ImALumberjaph/~4/vAeLp5NddR0" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://lumberjaph.net/perl/2011/05/08/french_perl_workshop.html</feedburner:origLink></entry>
 
 <entry>
   <title>new job</title>
   <link href="http://feedproxy.google.com/~r/ImALumberjaph/~3/iR4CGDKq_TA/new_job.html" />
   <updated>2011-04-22T00:00:00-07:00</updated>
   <id>http://lumberjaph.net/misc/2011/04/22/new_job</id>
   <content type="html">&lt;p&gt;I&amp;#8217;ve worked for nearly four years at &lt;a href="http://linkfluence.net/"&gt;Linkfluence&lt;/a&gt;.  From this summer on, I&amp;#8217;m switching to a new job at &lt;a href="http://saymedia.com/"&gt;Say Media&lt;/a&gt;, San Francisco.&lt;/p&gt;
&lt;p&gt;Working at Linkfluence has been an awesome experience for me. I&amp;#8217;ve learned a lot of things, worked on really interesting projects, and worked with an awesome team.&lt;/p&gt;
&lt;h2&gt;Linkfluence is hiring&lt;/h2&gt;
&lt;p&gt;Linkfluence is always looking for developers to join the team. If you want a Perl job in France, and want to work on interesting topics such as:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;social media monitoring&lt;/li&gt;
	&lt;li&gt;web crawling&lt;/li&gt;
	&lt;li&gt;data indexation&lt;/li&gt;
	&lt;li&gt;data visualization&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Linkfluence is the company you want to join. If you&amp;#8217;re interested, send your CV to Camille Maussang (&lt;span class="caps"&gt;CTO&lt;/span&gt; at Linkfluence): camille.maussang at linkfluence.net.&lt;/p&gt;
&lt;h3&gt;Technologies at Linkfluence&lt;/h3&gt;
&lt;p&gt;We&amp;#8217;re typically using the following technologies to solve our various problems:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Solr and ElasticSearch to index the contents of various social media (blogs, tweeter, etc)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://labs.linkfluence.net/nosql/2011/03/07/moving_from_couchdb_to_riak.html"&gt;Riak&lt;/a&gt; to store the contents&lt;/li&gt;
	&lt;li&gt;a &lt;strong&gt;lot&lt;/strong&gt; of Perl (and not the Perl of your (dear) grandmother, but Catalyst, Moose, DBIx::Class, Dancer, perl-5.12, &amp;#8230;)&lt;/li&gt;
	&lt;li&gt;Redis&lt;/li&gt;
	&lt;li&gt;PostgreSQL&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://gephi.org/"&gt;Gephi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Open Source at Linkfluence&lt;/h3&gt;
&lt;p&gt;Developers here are encouraged to contribute to open source projects, to publish code on GitHub, and talk about the things they do.&lt;/p&gt;
&lt;p&gt;The company also sends the developers to various open source conferences:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;span class="caps"&gt;YAPC&lt;/span&gt;::Europe&lt;/li&gt;
	&lt;li&gt;&lt;span class="caps"&gt;FOSDEM&lt;/span&gt;&lt;/li&gt;
	&lt;li&gt;Belgium Perl Workshop&lt;/li&gt;
	&lt;li&gt;French Perl Workshop&lt;/li&gt;
	&lt;li&gt;&lt;span class="caps"&gt;OSDC&lt;/span&gt;.fr&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You&amp;#8217;re encouraged to talk at those conferences, and you can prepare your talks during work time. Linkfluence is also working closely with the French Perl Mongueurs, and tries to organize events with them (technical meetings, Dancer hackaton, etc).&lt;/p&gt;
&lt;h3&gt;Science at Linkfluence&lt;/h3&gt;
&lt;p&gt;Most of the developers in the company are coming from a scientific background (but this is not a requirement). Some of them do publish scientific papers on topics like social media and graphs analysis.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="www.liafa.jussieu.fr/~prieur/Publis/TSI2444-RauxPrieurV2.pdf"&gt;Stabilité globale et diversité globale dans la dynamique des commentaires de Flickr&lt;/a&gt; (Raux, Prieur, 2011)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.icwsm.org/2011/index.php"&gt;Describing the Web in less than 140 characters&lt;/a&gt; (Raux, Grunwald, Prieur, 2011)&lt;/li&gt;
	&lt;li&gt;Essai de géographie de la blogosphère politique française (Cardon, Fouetillou, Lerondeau, Prieur 2011)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.icwsm.org/2011/index.php"&gt;Two paths of glory &amp;#8211; Structural positions and trajectories of websites within their topical territory&lt;/a&gt; (Cardon, Fouetillou, Roth 2011)&lt;/li&gt;
	&lt;li&gt;&lt;a href="linkinghub.elsevier.com/retrieve/pii/S0167865510000413"&gt;Clustering based on random graph model embedding vertex features&lt;/a&gt; (Zanghi, Volant, Ambroise)&lt;/li&gt;
	&lt;li&gt;&lt;a href="lbbe.univ-lyon1.fr/annexes/franck.../SSB-RR-14-online-estimation.pdf"&gt;Strategies for Online Inference of Network Mixture&lt;/a&gt; (Zanghi, Picard, Miele, Ambroise)&lt;/li&gt;
	&lt;li&gt;Approches modèles pour la structuration du Web vu comme un graphe (Zanghi)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you want to work with smart people on interesting topics like graphs, and help them to implement solutions or experiment with some algorithm, you&amp;#8217;ll feel at home there.&lt;/p&gt;
&lt;h2&gt;My future&lt;/h2&gt;
&lt;p&gt;I&amp;#8217;ll move to San Francisco this summer to start my new job at Say. I have a lot to do before moving, but I&amp;#8217;m very excited with this new opportunity. Sadly, I&amp;#8217;ll probably miss &lt;span class="caps"&gt;YAPC&lt;/span&gt;::EU, but I should do &lt;span class="caps"&gt;YAPC&lt;/span&gt;::NA next year \o/.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ImALumberjaph/~4/iR4CGDKq_TA" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://lumberjaph.net/misc/2011/04/22/new_job.html</feedburner:origLink></entry>
 
 
</feed>

