<?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: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-8696405790788556158</id><updated>2012-02-01T00:48:18.521Z</updated><category term='linux'/><category term='ruby'/><category term='scheme'/><category term='gtd'/><category term='screen'/><category term='squeak'/><category term='emacs'/><category term='erlang'/><category term='security'/><category term='lftp'/><category term='smalltalk'/><category term='latex'/><category term='perl'/><category term='genetic algorithms'/><category term='vector linux'/><category term='lisp'/><category term='git'/><category term='python'/><category term='rails'/><category term='zsh'/><category term='scp'/><category term='vim'/><category term='general programming'/><category term='Io'/><category term='mercurial'/><category term='mis cosas'/><title type='text'>puntoblogspot</title><subtitle type='html'>Raimon Grau landed on this blog to write random things from programming stuff, to drunk thoughts.  Expect anything...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default?start-index=101&amp;max-results=100'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>249</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-4592324647765818604</id><published>2012-01-28T23:46:00.004Z</published><updated>2012-01-29T12:47:32.363Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>Lisp and the web (probably part 1)</title><content type='html'>I've tried some lisp frameworks with different intensities and approaches, without settling with anyone of those.  Just looking around.&lt;br /&gt;&lt;br /&gt;As a first approach, I'm going for the minimalist frameworks.  &lt;a href="http://clacklisp.org/caveman/"&gt;Caveman&lt;/a&gt; (on top of &lt;a href="http://clacklisp.org/"&gt;Clack&lt;/a&gt;), and &lt;a href="http://restas.lisper.ru/en/"&gt;RESTAS&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;My first experience is with caveman, as I want something really simple, and known.  Not that I've worked with Sinatra/Rack nor Flask/WSGI, but at least, the architecture is more well known that with other fw like weblocks or RESTAS.&lt;br /&gt;&lt;br /&gt;With &lt;a href="http://areina.github.com/"&gt;Toni&lt;/a&gt;, we've been hacking a bit our way to do a super simple micro app.  And we stumbled upon a few WTFs, or undocumented Caveman spots, or just blockers for us due to our lisp newbieness.  Luckily, most of them are solved now :)&lt;br /&gt;&lt;ul&gt;&lt;li&gt;In GETs, (getf params :id) work, but in post POSTs, the symbols are presented in a different format (getf params :|id|).  As davazp pointed, this probably has some problems issues with CL never garbage collecting those interned symbols.&lt;/li&gt;&lt;li&gt; clsql:*default-database*.  clsql will use *default-database* database handler if you dont's specify any. This makes using clack's middleware for clsql transparent from caveman apps.&lt;/li&gt;&lt;li&gt;Getting caveman through quicklisp threw some erros during installation.  Installing newer version of sbcl just solved it.  (http://comments.gmane.org/gmane.lisp.steel-bank.announce/111)&lt;/li&gt;&lt;/ul&gt;&lt;pre&gt;     * new feature: SB-EXT:VALID-TYPE-SPECIFIER-P returns whether a given type&lt;br /&gt;specifier is valid where "valid" basically means "would be accepted as&lt;br /&gt;second argument of TYPEP".&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;cl-project doesn't create the link in ~/quickload/local-projects on new generated projects . If you create your projects under ~/quickload/local-projects, quicklisp will be able to quickload it, but if you put it somewhere else, you should create a link to your project.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt; I'm now struggling with form-builder, and widgets (no docs nor examples at all).  We'll see how it goes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-4592324647765818604?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/4592324647765818604/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=4592324647765818604' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/4592324647765818604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/4592324647765818604'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2012/01/lisp-and-web-probably-part-1.html' title='Lisp and the web (probably part 1)'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-4279332722765820072</id><published>2012-01-28T11:58:00.000Z</published><updated>2012-01-28T11:58:00.766Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><category scheme='http://www.blogger.com/atom/ns#' term='general programming'/><title type='text'>before forgetting them</title><content type='html'>A couple of amazing links for the weekend&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://wry.me/misc/peval.html"&gt;http://wry.me/misc/peval.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.multicians.org/mepap.html#secii"&gt;http://www.multicians.org/mepap.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-4279332722765820072?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/4279332722765820072/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=4279332722765820072' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/4279332722765820072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/4279332722765820072'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2012/01/before-forgetting-them.html' title='before forgetting them'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-5859551116281993279</id><published>2012-01-25T00:45:00.000Z</published><updated>2012-01-24T23:45:37.845Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><title type='text'>stylish ruby</title><content type='html'>Here you have a couple of style guides related to ruby, rails, and some tips on functional programming and a few not-so-trivial techniques like currying, TCO, or just using immutable structures.&lt;br /&gt;&lt;br /&gt;Apparently, all things explained in all those guides are obvious, or just a matter of taste, but you better read those guides a few times each to make those rules stick in your head, just to be sure :)&lt;br /&gt;&lt;br /&gt;First, a guide from bbastov (of emacs prelude fame), that's already in github and forked more than a hundred times, so we could say it's a community &lt;a href="https://github.com/bbatsov/ruby-style-guide"&gt;ruby style guide&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Second, another bbastov's &lt;a href="https://github.com/bbatsov/rails-style-guide"&gt;guide, this time on Rails&lt;/a&gt; 3.&lt;br /&gt;&lt;br /&gt;And last but not least, slides of a friend of a friend's workshop on &lt;a href="http://public.arnau-sanchez.com/ruby-functional/"&gt;Functional Ruby&lt;/a&gt;. Really nice, and full of nice tricks that deserve to be read and understood.&lt;br /&gt;&lt;br /&gt;That's all for now. Back to hacking&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-5859551116281993279?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/5859551116281993279/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=5859551116281993279' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/5859551116281993279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/5859551116281993279'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2012/01/stylish-ruby.html' title='stylish ruby'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-1503627779042456315</id><published>2012-01-20T18:53:00.007Z</published><updated>2012-01-22T08:54:22.682Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>XML &lt; JSON &lt; SEXPS</title><content type='html'>&lt;div&gt;Step by step, I keep getting more and more of what's lisp about.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Not just the syntax (huh?) or the core lib, but idioms, design decisions, and the vision.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One of the mottos of Lisp is the famous 'code is data, and data is code'.&lt;/div&gt;&lt;div&gt;For me, that's not 100% clear yet, but I get more insights every day.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One implication of this is when you look at s-exps and see them as a datastructure, not as code. That's the macro point of view.  If you want to know more about macros, I can only recommend you &lt;a href="http://www.paulgraham.com/onlisp.html"&gt;Paul Graham's OnLisp&lt;/a&gt;, and &lt;a href="http://letoverlambda.com/"&gt;Doug Hoyte's Let Over Lambda&lt;/a&gt;.  I'm now reading through the latter and I find it a perfect companion for OnLisp.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The other direction is 'data is code'.  To exemplify this side, here are a couple of links that really get to the point of this (at least one part of the point).&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://irreal.org/blog/?p=398"&gt;http://irreal.org/blog/?p=398&lt;/a&gt; &amp;lt;= One of a series of posts comparing xml to sexps. Quite long and insightful&lt;/li&gt;&lt;li&gt;&lt;a href="http://shinkirou.org/blog/2010/06/s-expressions-the-fat-free-alternative-to-json/"&gt;http://shinkirou.org/blog/2010/06/s-expressions-the-fat-free-alternative-to-json/&lt;/a&gt; =&amp;gt; xml-&amp;gt;json-&amp;gt;sexps.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Cya&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-1503627779042456315?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/1503627779042456315/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=1503627779042456315' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/1503627779042456315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/1503627779042456315'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2012/01/xml-json-sexps.html' title='XML &lt; JSON &lt; SEXPS'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-6643449649699271377</id><published>2011-12-29T20:20:00.000Z</published><updated>2011-12-30T00:25:09.656Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Invincible Perl</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/-arCWCWpycuE/Tv0ErwEr1MI/AAAAAAAAAdE/YDAfkQA8E4A/s1600/invincible_moose.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 383px; height: 400px;" src="http://2.bp.blogspot.com/-arCWCWpycuE/Tv0ErwEr1MI/AAAAAAAAAdE/YDAfkQA8E4A/s400/invincible_moose.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5691710653751612610" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;Have you seen the talk about DoSsing websites just using crafted data on forms (POST)? It's the trending topic of this week.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Well, here you have a couple of links related to this talk and some extra info.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.ocert.org/advisories/ocert-2011-003.html"&gt;http://www.ocert.org/advisories/ocert-2011-003.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://permalink.gmane.org/gmane.comp.security.full-disclosure/83694"&gt;http://permalink.gmane.org/gmane.comp.security.full-disclosure/83694&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://cryptanalysis.eu/blog/2011/12/28/effective-dos-attacks-against-web-application-plattforms-hashdos/"&gt;https://cryptanalysis.eu/blog/2011/12/28/effective-dos-attacks-against-web-application-plattforms-hashdos/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;The interesting thing that surprised me (or not so) on that article/talk is that the only language they tested that's not vulnerable to this attack is.... guess what? Perl.  Here's the extract of the article:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;Julian and Alexander did a great job with&lt;b&gt; checking many programming languages&lt;/b&gt; used for web applications for their hash table implementation and hash functions.&lt;b&gt; For all of them they checked, they managed to find a lot of keys mapping to the same output, except for Perl&lt;/b&gt;. Perl uses a randomized hash function, i.e. the hash doesn’t only depend on the key, but also on an additional value, that is chosen at startup of the application at random. All other languages also store the query parameters send in an HTTP GET or POST request in an hash table, so that a request with many query parameters all mapping to the same hash value will slowly fill such a hash table, before the first line of code written by the application programmer will be executed. Filling this hash table will usually take several minutes on a decent CPU, so that even a fast web server can be kept busy using a slow connection.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And here you have &lt;a href="http://news.ycombinator.com/item?id=3401900"&gt;HN comments &lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;+1 for Perl!&lt;/div&gt;&lt;div&gt;Between offtopic and related here's another &lt;a href="http://boingboing.net/2011/12/28/linguistics-turing-completene.html"&gt;nice talk&lt;/a&gt; from 28C3 that's having place these days in Berlin.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-6643449649699271377?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/6643449649699271377/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=6643449649699271377' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/6643449649699271377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/6643449649699271377'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/12/invincible-perl.html' title='Invincible Perl'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-arCWCWpycuE/Tv0ErwEr1MI/AAAAAAAAAdE/YDAfkQA8E4A/s72-c/invincible_moose.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-8706946095895803464</id><published>2011-12-27T20:18:00.009Z</published><updated>2011-12-30T09:30:16.734Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><title type='text'>Git, the stupid content tracker, or not so</title><content type='html'>&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After roughly a year of using git daily, one has already crossed the "WTF!?" side and now is in the "It's obvious" land.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After getting help from all coworkers I had last year, lots (I mean *LOTS*) of reading, and many moments of "Am I the only one in the world that doesn't get this?", all regular processes go without thinking now, and I know pretty much what is happening under the hood.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Some things are still a bit raw on the edges, but mostly because they aren't used so often (submodules, bisect...), but I digress...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Thing is that using and knowing git gives you extra power, not directly related to versioning code. As Linus said: "git is the stupid content tracker", it manages blobs of bytes.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;git grep: Probably faster than grep -ri, and more focused to what you surely want to search.  I've already integrated it with emacs, and try to use it more and more, instead of rgrep, or ack.&lt;/li&gt;&lt;li&gt;git ls: great for the kind of find-file-in-project functionality.&lt;/li&gt;&lt;li&gt;git log -Sfoo  : Search throughout the history&lt;/li&gt;&lt;li&gt;git log -p : modifications in context&lt;/li&gt;&lt;li&gt;git &lt;a href="http://git-annex.branchable.com/walkthrough/"&gt;annex&lt;/a&gt;: manage whatever content&lt;/li&gt;&lt;li&gt;using git to &lt;a href="http://www.babyl.ca/techblog/entry/git-deployment"&gt;deploy&lt;/a&gt;: There's &lt;a href="https://github.com/capistrano/capistrano/wiki"&gt;capistrano&lt;/a&gt;, and &lt;a href="http://puppetlabs.com/"&gt;puppet&lt;/a&gt;, and &lt;a href="http://wiki.opscode.com/display/chef/Getting+Started"&gt;chef&lt;/a&gt;, and... but git can handle it if configured properly.  Probably this can end in a mess if you need to trigger many things when deploying.  You know, there are hooks and everything, and you cand build your poor-man-capistrano.  It's just your choice.  But definately for mostly static sites, it's a nice thing to keep in mind.&lt;/li&gt;&lt;li&gt;Not really a git feature, but thanks to &lt;a href="http://philjackson.github.com/magit/"&gt;magit&lt;/a&gt;, or &lt;a href="https://github.com/tpope/vim-fugitive"&gt;fugitive&lt;/a&gt;, you can have a pretty painless integration with your workflow, so it's a win.  And you feel safer &lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Have more tricks? Comment!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-8706946095895803464?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/8706946095895803464/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=8706946095895803464' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/8706946095895803464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/8706946095895803464'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/12/git-dumb-content-tracker-or-not-so.html' title='Git, the stupid content tracker, or not so'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-2593208490541155155</id><published>2011-12-11T23:46:00.007Z</published><updated>2011-12-12T14:09:08.722Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='mis cosas'/><category scheme='http://www.blogger.com/atom/ns#' term='general programming'/><title type='text'>It's funny because it's true</title><content type='html'>&lt;a href="http://dl.dropbox.com/u/2594870/pplthinkofprogramming.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 120px; height: 400px;" src="http://1.bp.blogspot.com/-LNSKatA74bI/TuVEGKeVdWI/AAAAAAAAAcQ/1Wsuq_z1K1w/s400/pplthinkofprogramming.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5685024977306613090" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;meta equiv="content-type" content="text/html; charset=utf-8"&gt;A couple of hilarious images worth sharing:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://4.bp.blogspot.com/-4KIDuvgwC3g/TuVCgDaQm3I/AAAAAAAAAcA/mQmHlYyUp3M/s1600/wisdom_of_the_ancients.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 223px;" src="http://4.bp.blogspot.com/-4KIDuvgwC3g/TuVCgDaQm3I/AAAAAAAAAcA/mQmHlYyUp3M/s400/wisdom_of_the_ancients.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5685023223063812978" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;Y esto hoy, google ads clavándola...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-suRu_7ZiTkQ/TuYKwT6VMHI/AAAAAAAAAcc/57AC7t9Si5M/s1600/ipv6.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 246px;" src="http://3.bp.blogspot.com/-suRu_7ZiTkQ/TuYKwT6VMHI/AAAAAAAAAcc/57AC7t9Si5M/s400/ipv6.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5685243404696760434" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-2593208490541155155?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/2593208490541155155/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=2593208490541155155' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/2593208490541155155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/2593208490541155155'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/12/its-funny-because-its-true.html' title='It&apos;s funny because it&apos;s true'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-LNSKatA74bI/TuVEGKeVdWI/AAAAAAAAAcQ/1Wsuq_z1K1w/s72-c/pplthinkofprogramming.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-1219859399707101992</id><published>2011-11-22T23:19:00.004Z</published><updated>2011-11-22T23:37:45.511Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>tramp + shell = win</title><content type='html'>Did you ever notice that tramp is a great piece of elisp? I hope so.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The nice thing I discovered today is that it's highly tighted to the whole system, and if you just m-x shell when you're in a file opened through tramp, it'll open a shell in the remote system.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Super nice.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-1219859399707101992?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/1219859399707101992/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=1219859399707101992' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/1219859399707101992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/1219859399707101992'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/11/tramp-shell-win.html' title='tramp + shell = win'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-7577816224498037227</id><published>2011-11-20T13:52:00.010Z</published><updated>2012-01-22T08:53:11.650Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>Creating a simple common lisp application</title><content type='html'>After giving a further look at common lisp (a bit of &lt;a href="http://www.amazon.com/Paradigms-Artificial-Intelligence-Programming-Studies/dp/1558601910"&gt;PAIP&lt;/a&gt;, and &lt;a href="http://www.amazon.com/Practical-Common-Lisp-Peter-Seibel/dp/1590592395/ref=pd_bxgy_b_img_c/188-0942266-2637149"&gt;PCL&lt;/a&gt;), I've found a project that can be a nice 1st app for me.&lt;br /&gt;&lt;br /&gt;To develop a common lisp app, first you need to set up the environment and choose the toolchain.  These have been my decisions.  Tips are pretty appreciated.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Requirements&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The requirements are the bare minimum for common lisp.  I use SBCL myself, and don't know much of the differences between implementations. sbcl works just fine.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Editor&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I use emacs 24, with slime, paredit and autocomplete. Use whatever you feel like but notepad. Obviously, emacs is recommended :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Libs&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Use &lt;a href="http://www.quicklisp.org/"&gt;quickload &lt;/a&gt;to find and load libraries. It's surprisingly easy and straightforward to use.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;Project&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="https://github.com/xach/quickproject"&gt;quickproject&lt;/a&gt; to &lt;a href="http://xach.livejournal.com/278047.html?thread=674335"&gt;initialize&lt;/a&gt; the project is a nice way to avoid writting bolierplate, and to make sure your project will be loadable through ,load-system.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Tests&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I tried a couple of testing packages for common lisp, and decided to go with &lt;a href="http://www.cs.northwestern.edu/academics/courses/325/readings/lisp-unit.html"&gt;lisp-unit&lt;/a&gt; due to its simplicity and availability in ql repos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Code repository&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The code is being hosted in a private git repo in &lt;a href="https://bitbucket.org/"&gt;bitbucket&lt;/a&gt;. They give you unlimited public/private (*yes*, private) repos, using git/hg, with issue tracking and all, for free.  It seems a nice nice alternative to github. great to host projects in early stage where you don't feel like sharing the code to the world.&lt;br /&gt;&lt;br /&gt;That's it for now. There's no public code for the moment... There's nothing to see here :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-7577816224498037227?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/7577816224498037227/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=7577816224498037227' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/7577816224498037227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/7577816224498037227'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/11/creating-simple-lisp-application.html' title='Creating a simple common lisp application'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-3203212297522896065</id><published>2011-11-12T11:11:00.002Z</published><updated>2011-11-13T20:58:47.230Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>change emacs url-browser</title><content type='html'>When you click an url in emacs, it'll open a browser with that url.  That's fine.&lt;br /&gt;&lt;br /&gt;Problems arise when you have multiple browsers and they fight to be your preferred one.  In a coworker's box, it tries to open konqueror (WTF?!).&lt;br /&gt;&lt;br /&gt;One way to fix the issue is changing browse-url-browser-function. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(setq browse-url-browser-function 'browse-url-generic&lt;br /&gt;      browse-url-generic-program "chromium-browser")&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Not only that, but the nice thing would be that emacs reused a browser if you have one opened (firefox or chrome) and opened a new one (chrome) otherwise. &lt;br /&gt;&lt;br /&gt;I've been messing a bit with proced.el to find out how to list external processes programmatically, but had no luck. If I find out how, I 'll modify this post with new info.&lt;br /&gt;&lt;br /&gt;If you have related info, please, comment :)&lt;br /&gt;&lt;br /&gt;Thanks to Davazp that pointed me to list-system-processes function, I just wrote the code to use an already opened browser to open a given url.&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1362674.js?file=open-browser.el"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;A good quickreference to look for function signature differences between elisp, scheme and cl is &lt;a href="http://hyperpolyglot.org/lisp"&gt;here&lt;/a&gt;. It helps quite a lot&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-3203212297522896065?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/3203212297522896065/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=3203212297522896065' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/3203212297522896065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/3203212297522896065'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/11/change-emacs-url-browser.html' title='change emacs url-browser'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-5613303480118755714</id><published>2011-11-08T15:41:00.002Z</published><updated>2011-11-08T22:04:32.281Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='general programming'/><title type='text'>4 nice bugs</title><content type='html'>&lt;a href="https://lkml.org/lkml/2011/11/3/110"&gt;One&lt;/a&gt;, &lt;a href="https://bugs.launchpad.net/ubuntu/+source/cupsys/+bug/255161/comments/28"&gt;two&lt;/a&gt;, &lt;a href="http://s3.amazonaws.com/data.tumblr.com/tumblr_lu5iq71o8S1qdpqfoo1_1280.png"&gt;three&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-5613303480118755714?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/5613303480118755714/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=5613303480118755714' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/5613303480118755714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/5613303480118755714'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/11/3-nice-bugs.html' title='4 nice bugs'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-129050803575204847</id><published>2011-11-06T20:41:00.004Z</published><updated>2011-11-06T21:46:52.809Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='general programming'/><title type='text'>Metacircular game of life.W00t!</title><content type='html'>Here are a couple of links on game of life info.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First of all, a game of Life implemented in one line of &lt;a href="http://www.youtube.com/watch?v=a9xAKttWgP4"&gt;APL&lt;/a&gt;, explained, so you can even try to understand it.  Then, a&lt;a href="http://jeremykun.wordpress.com/2011/06/29/conways-game-of-life/"&gt; couple&lt;/a&gt; of &lt;a href="http://jeremykun.wordpress.com/2011/06/30/turing-machines-and-conways-dreams/"&gt;articles&lt;/a&gt; on &lt;a href="http://jeremykun.wordpress.com/2011/11/03/conways-game-of-life-in-conways-game-of-life/"&gt;cellular&lt;/a&gt; automatas, explaining game of life basics and not-so-basics.&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;And the really amazing stuff: Metacircular GoL&lt;br /&gt;&lt;iframe width="420" height="315" src="http://www.youtube.com/embed/QtJ77qsLrpw" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-129050803575204847?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/129050803575204847/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=129050803575204847' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/129050803575204847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/129050803575204847'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/11/metacircular-game-of-lifew00t.html' title='Metacircular game of life.W00t!'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/QtJ77qsLrpw/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-4532739194393396011</id><published>2011-10-23T15:36:00.003+01:00</published><updated>2011-10-23T17:54:43.605+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Introduction to (modern) Perl (course)</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/-tcZRUuvOJrg/TqQpRwEElQI/AAAAAAAAAbY/hscJsWfXAWs/s1600/curs_perl_2011_cartell.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 259px; height: 400px;" src="http://2.bp.blogspot.com/-tcZRUuvOJrg/TqQpRwEElQI/AAAAAAAAAbY/hscJsWfXAWs/s400/curs_perl_2011_cartell.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5666699616075420930" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;meta equiv="content-type" content="text/html; charset=utf-8"&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Barcelona Perl Mongers are organizing a 8 hours course on Perl intended for programmers that have no or little experience in Perl.  It's not an introductory course to programming. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The course will be on November 5th, at UPC (Barcelona). 25 Euros for the course, and an exclusive T-Shirt. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'll be there, maybe just listening, or helping answering questions.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;More info in: &lt;a href="http://barcelonapm.wordpress.com/2011/10/21/curs-dintroduccio-a-perl/"&gt;http://barcelonapm.wordpress.com/2011/10/21/curs-dintroduccio-a-perl/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-4532739194393396011?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/4532739194393396011/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=4532739194393396011' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/4532739194393396011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/4532739194393396011'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/10/introduction-to-perl-course.html' title='Introduction to (modern) Perl (course)'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-tcZRUuvOJrg/TqQpRwEElQI/AAAAAAAAAbY/hscJsWfXAWs/s72-c/curs_perl_2011_cartell.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-1272560668699970484</id><published>2011-10-22T16:05:00.003+01:00</published><updated>2011-10-22T16:44:05.590+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='general programming'/><title type='text'>Links about (mostly beautiful) code</title><content type='html'>C/C++&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="https://banu.com/blog/7/drawing-circles/"&gt;Drawing circles in C in and out&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cs.princeton.edu/courses/archive/spr09/cos333/beautiful.html"&gt;Basic regular expression matcher in 30 C lines&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://triptico.com/docs/c2cpp.htmlhttp://triptico.com/docs/c2cpp.html"&gt;From c to c++&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.oracle.com/ksplice/entry/the_ksplice_pointer_challenge"&gt;C pointer inners by example&lt;/a&gt;. (ksplice pointer challenge)&lt;/li&gt;&lt;/ol&gt;Javascript Patterns&lt;br /&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://addyosmani.com/largescalejavascript/"&gt;patterns for large apps&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://addyosmani.com/resources/essentialjsdesignpatterns/book/"&gt;Js patterns with examples&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://aboutcode.net/2011/10/04/efficient-encapsulation-of-javascript-objects.html"&gt;Encapsulation in js&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Python&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://www-inst.eecs.berkeley.edu/~cs61a/fa11/61a-python/content/www/index.html"&gt;SICP in python&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;General Bad practices to avoid&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://badprogrammer.infogami.com/"&gt;Signs that you're a bad programmer&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://thc.org/root/phun/unmaintain.html"&gt;How to write unmaintainable code&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-1272560668699970484?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/1272560668699970484/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=1272560668699970484' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/1272560668699970484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/1272560668699970484'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/10/links-about-mostly-beautiful-code.html' title='Links about (mostly beautiful) code'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-3376944431587967709</id><published>2011-10-22T11:44:00.001+01:00</published><updated>2011-10-22T11:46:47.647+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='general programming'/><title type='text'>What's WRONG with this?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-blZqDl0p2Yc/TqKexSCxAUI/AAAAAAAAAbQ/esX3V1XffkE/s1600/grep.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 104px;" src="http://3.bp.blogspot.com/-blZqDl0p2Yc/TqKexSCxAUI/AAAAAAAAAbQ/esX3V1XffkE/s400/grep.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5666265850679722306" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-I-4Fwd3jIIw/TqKexdJaTTI/AAAAAAAAAbA/uL9WfiOoOWg/s1600/each.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 105px;" src="http://4.bp.blogspot.com/-I-4Fwd3jIIw/TqKexdJaTTI/AAAAAAAAAbA/uL9WfiOoOWg/s400/each.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5666265853660384562" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Can you find it?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-3376944431587967709?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/3376944431587967709/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=3376944431587967709' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/3376944431587967709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/3376944431587967709'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/10/whats-wrong-with-this.html' title='What&apos;s WRONG with this?'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-blZqDl0p2Yc/TqKexSCxAUI/AAAAAAAAAbQ/esX3V1XffkE/s72-c/grep.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-293595667429409837</id><published>2011-10-14T18:01:00.003+01:00</published><updated>2011-10-14T18:14:20.067+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>I still think Perl</title><content type='html'>The other day, a friend asked how to split a string by commas, but only if they aren't inside a tag, say enclosed by '&lt;' and '&gt;'. I tried python, but somehow regexes are so hardwired in my head, that I can't work with languages that do not have regexen so hardwired in their heart. &lt;br /&gt;&lt;br /&gt;Here it is. Tiny, but gets the job done. And that's what perl is for. a regex with lookbehind stuffed into split. No problem sir! &lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1287703.js"&gt; &lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-293595667429409837?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/293595667429409837/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=293595667429409837' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/293595667429409837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/293595667429409837'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/10/i-still-think-perl.html' title='I still think Perl'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-2966689615951439378</id><published>2011-10-10T20:55:00.005+01:00</published><updated>2011-10-13T20:12:35.166+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mis cosas'/><category scheme='http://www.blogger.com/atom/ns#' term='general programming'/><title type='text'>steve, the web, and innovation.</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-Tm0yU4wDYII/TpNRTbhldUI/AAAAAAAAAa4/54kDouIJzF0/s1600/screen.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="http://4.bp.blogspot.com/-Tm0yU4wDYII/TpNRTbhldUI/AAAAAAAAAa4/54kDouIJzF0/s400/screen.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5661958550782833986" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's been less than a week a genius left us yada yada yada.....&lt;br /&gt;&lt;br /&gt;Since last October 5, I've been thinking a lot about Alan Kay and I was waiting to see some references from sites talking about MrJobs to Mr.Kay.&lt;br /&gt;&lt;br /&gt;Well, today I've seen it, and this post will be just a kudos to people knowing the real story, that Steve had great qualities, and was visionary in a very bright way, but he didn't invent the future.  You know...&lt;br /&gt;&lt;br /&gt;But the internetz has gone crazy on this, so I wanted to point out a couple of curiosities I've seen since then.&lt;br /&gt;&lt;br /&gt;- First, a HN screenshot I did the 'day of the facts'.&lt;br /&gt;- Then a post talking about &lt;a href="http://alt1040.com/2011/10/historia-de-la-tecnologia-alan-kay-padre-legitimo-de-la-computacion-personal?utm_source=self&amp;amp;utm_medium=nav&amp;amp;utm_campaign=Destacados%2BSide"&gt;Alan Kay&lt;/a&gt;, linked from a 'outstanding articles' widget, pairing with Steve.&lt;br /&gt;- Now a&lt;a href="http://www.gladwell.com/2011/2011_05_16_a_creationmyth.html"&gt; great and long post&lt;/a&gt; about great things that happened at XEROX PARC, and things Jobs saw there, and how he implemented then in Apple. He didn't invent the mouse, but simplified it (in fact, Xerox didn't invent it either), he didn't invent GUI, but adopted it, and he didn't invent the iPad, but 'implemented' it, in the exact moment there was market for it.&lt;br /&gt;&lt;br /&gt;Cya!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-W7Eu-Ipa4TA/TpNQk24b51I/AAAAAAAAAaw/X_jEl-iIdJg/s1600/kay.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 332px; height: 382px;" src="http://4.bp.blogspot.com/-W7Eu-Ipa4TA/TpNQk24b51I/AAAAAAAAAaw/X_jEl-iIdJg/s400/kay.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5661957750672582482" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Btw, if you wanna know more about Kay and friends, &lt;a href="http://puntoblogspot.blogspot.com/2011/08/back-to-future-xerox-parc-innovations.html"&gt;here&lt;/a&gt; is another post on this blog with amazing videos, or just check the internetz, or just download &lt;a href="http://www.pharo-project.org/home"&gt;pharo&lt;/a&gt;/&lt;a href="http://squeak.org/"&gt;squeak&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-2966689615951439378?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/2966689615951439378/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=2966689615951439378' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/2966689615951439378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/2966689615951439378'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/10/steve-web-and-innovation.html' title='steve, the web, and innovation.'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-Tm0yU4wDYII/TpNRTbhldUI/AAAAAAAAAa4/54kDouIJzF0/s72-c/screen.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-3148052409539092810</id><published>2011-10-10T09:15:00.004+01:00</published><updated>2011-10-10T12:16:54.464+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='general programming'/><title type='text'>Ready, set, Dart!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-CzEAUu2VXlE/TpKrDA9onKI/AAAAAAAAAao/wG4Ay2uuHos/s1600/ai.png"&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;Today there's been the first official press info and release of &lt;a href="http://www.dartlang.org/"&gt;Dart language&lt;/a&gt;.  A class-based language developed by google. &lt;br /&gt;&lt;br /&gt;Features: OOP, class-based, optionally typed, and thought for the web. It seems it'll have a client side debugger.  (Hello amber! :p )&lt;br /&gt;&lt;br /&gt;Lars Bak has been strongly involved in Dart, and given his smalltalk past life, it's sensible to say that we'll see some familiar things in there.&lt;br /&gt;&lt;br /&gt;Today is the first day of AI classes in the standford open course.  For the moment, browsing the notes of the first class...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-CzEAUu2VXlE/TpKrDA9onKI/AAAAAAAAAao/wG4Ay2uuHos/s1600/ai.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 358px; height: 400px;" src="http://1.bp.blogspot.com/-CzEAUu2VXlE/TpKrDA9onKI/AAAAAAAAAao/wG4Ay2uuHos/s400/ai.png" alt="" id="BLOGGER_PHOTO_ID_5661775749844606114" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;See the flash bar in the top?  :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-3148052409539092810?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/3148052409539092810/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=3148052409539092810' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/3148052409539092810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/3148052409539092810'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/10/ready-set-dart.html' title='Ready, set, Dart!'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-CzEAUu2VXlE/TpKrDA9onKI/AAAAAAAAAao/wG4Ay2uuHos/s72-c/ai.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-7264027342289447425</id><published>2011-10-09T23:21:00.003+01:00</published><updated>2011-11-14T17:38:40.295Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>Emacs 24 is frozen</title><content type='html'>Emacs 24 entered the feature freeze state a couple of weeks ago, so it's the moment to install it and start fiddling with its new features (I want to try the editable occur buffer, and some asynchronous goodies for gnus).&lt;br /&gt;&lt;br /&gt;There have been a couple of posts in planet emacsen that explain how easy is to install  it in debian or ubuntu (natty).&lt;br /&gt;&lt;br /&gt;The thing is that I use an older ubuntu version and I had to compile it myself.  Not very problematic, but here's the couple of libs that I had to install before being able to compile it.  Obviously, you'll need the usual binutils and dev tools. also you'll need these packages.&lt;br /&gt;&lt;br /&gt;apt-get install autoconf texinfo libxpm-dev libgif-dev libgtk2.0-dev xserver-xorg-dev xorg-dev libfontconfig-dev libfreetype-dev libxft-dev  # probably, not everything is needed, but once you warm up, apt-get is too easy.&lt;br /&gt;&lt;br /&gt;Then, just get the code from the repo, and configure install in proper directory:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;git clone https://github.com/emacsmirror/emacs.git &lt;br /&gt;cd emacs&lt;br /&gt;./autogen.sh&lt;br /&gt;./configure --prefix=~/emacs-24&lt;br /&gt;make install&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now you have your emacs in ~/emacs-24/bin/emacs, and hopefully, everything will work from the start.  I had to disable a couple of lines in my .emacs file, but just minor things.&lt;br /&gt;&lt;br /&gt;Now it's time to try emacs-starter-kit 2.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-7264027342289447425?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/7264027342289447425/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=7264027342289447425' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/7264027342289447425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/7264027342289447425'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/10/emacs-24-is-frozen.html' title='Emacs 24 is frozen'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-2304717789626547614</id><published>2011-10-04T19:39:00.010+01:00</published><updated>2011-10-05T09:26:14.552+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='general programming'/><title type='text'>Is it really that bad? Seems so</title><content type='html'>In the last couple of days there's been quite a lot of &lt;a href="https://plus.google.com/115094562986465477143/posts/Di6RwCNKCrf"&gt;ranting&lt;/a&gt; about &lt;a href="http://zackarymorris.tumblr.com/post/10973087527/the-state-of-the-art-is-terrible"&gt;overly complex software&lt;/a&gt; we have to manage daily.  It applies to software we use (super-complex UI and over-featured apps) and software we develop Does it really make sense to deal with so many layers of added complexity to deal with mostly simple (conceptually) problems.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In those texts, they talk about 'old friends' like boost, SDL, Xcode, Objective-C, never-ending-toolchains, and supercomplex interfaces to third party software (APIs, security layers, etc.).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In my opinion, and without having spent as many years as those guys (or&lt;a href="http://news.ycombinator.com/item?id=3067740"&gt; commenters at HN&lt;/a&gt;) on computers, it's true that the starting barrier to any new environment seems overly complex for the functionality we get.  Most of the times, external tools solve deficiences of languages.  Being a tool geek myself (probably, I have spent more hours than you trying and configuring window managers and editors), I have the feeling that entering most of new environments is more complex than it should be.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Want to do a rails app? no problem, you just have to handle a few technologies/tools:&lt;/div&gt;&lt;div&gt;ruby, rails, cucumber, rspec, rack, passenger, bundler, rvm, gems, html, js, ajax, css.  Then, keeping compatibility with Chrome, firefox, safari, opera and, God forbid, IE. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Not bad, eh?  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Well, if you want to write the views in a more confortable way, you can use haml, sass, compass, coffescript, that will compile to their ancestors, and will make you a happier person.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You see? &lt;span class="Apple-style-span"&gt;(I hope you get the sarcasm)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Every now and then I think about Dan Ingalls quote:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;blockquote&gt;"An operating system is a collection of things that don't fit into a language. There shouldn't be one"&lt;/blockquote&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;And drool when thinking about smalltalk.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-2304717789626547614?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/2304717789626547614/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=2304717789626547614' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/2304717789626547614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/2304717789626547614'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/10/is-it-really-that-bad-seems-so.html' title='Is it really that bad? Seems so'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-5514467892221397809</id><published>2011-09-27T23:51:00.004+01:00</published><updated>2011-09-28T00:02:46.663+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mis cosas'/><title type='text'>Bihain de uindou</title><content type='html'>&lt;div&gt;Demasiadas veces mirando por su ventana y quedándome en blanco.  veo&lt;/div&gt;&lt;div&gt;que algo se mueve ahé dentro, y veo la ventana mirándome, y la veo a&lt;/div&gt;&lt;div&gt;ella mirandome a través de la ventana.  A veces, incluso me veo a mi a&lt;/div&gt;&lt;div&gt;través de ella a través de la ventana.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Y aún no sé qué decir (me y le). Y te.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Señalar con el dedo y ver el nombre en verde.&lt;/div&gt;&lt;div&gt;Clicar.  Cerrar.  Clicar. Cerrar. Y repetir.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-5514467892221397809?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/5514467892221397809/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=5514467892221397809' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/5514467892221397809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/5514467892221397809'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/09/bihain-de-uindou.html' title='Bihain de uindou'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-7287737933567349083</id><published>2011-09-17T13:40:00.010+01:00</published><updated>2011-09-17T21:26:08.766+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='smalltalk'/><title type='text'>Amber language (former jtalk), digging deeper</title><content type='html'>&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;Lots of changes have happened in jtalk world since last week.  &lt;div&gt;&lt;ul&gt;&lt;li&gt;Jtalk is now Amber.  The project has changed its name when the 0.9 release happened.  That means that &lt;a href="https://github.com/NicolasPetton/amber/"&gt;the repo is now different&lt;/a&gt;, and the &lt;a href="http://amber-lang.net/"&gt;website too&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;JQuery bindings have been removed from the system.  Now we can access javascript objects directly, and use asJQuery in the same way, so there's no drawback, only the way to deal with jquery is more smalltalkish. &lt;b&gt; Counter new appendToJQuery: 'body' asJQuery &lt;/b&gt;works perfectly, so no problem.&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;Creating functions&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;If you want to know a bit more on amber, you have to keep in mind that it's a smalltalk, so you can explore everything in your IDE.  Let's try to find out a bit more on how the compilation from smalltalk to js works.  This will allow us to debug our in a lower level than usual, and find glitches in our codes, or detect where our closure is missing the variables (when interfacing with js, sometimes it's useful to see the whole js code, and make conclusions on js).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Let's create a new class Foo with a method that gets a block (callback) and executes it.  Now, to find out how it's compiled, we'll make amber print the compiled source of the method:&lt;/div&gt;&lt;meta equiv="content-type" content="text/html; charset=utf-8"&gt;&lt;div&gt;&lt;b&gt;(Foo methodDictionary at: 'get:') fn compiledSource "print it".&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;meta equiv="content-type" content="text/html; charset=utf-8"&gt;If we print it, the result will be the js source of the method&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;script src="https://gist.github.com/1224065.js?file=amber-compile.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can try variations like returning explicit values, try to pass instVars to the closure, and see what is the translation to js.  This helps sometimes to find out your way. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;  Can I inspect?&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;Inspector is there, but for the moment, it's in very early stage. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;  &lt;span class="Apple-style-span"&gt;Debugger&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Debugger is also there, also in early development.  You can see the stacktrace, and inspect the methods, but not changing values and so.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;NodeJS&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We can use amber for the server side, running the generated javascript on node.js.  Due to the hability of Amber to interoperate with plain js, we can use a shitload of libraries from amber.  Here follow a couple of examples of amber on node.js&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;Server&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Nicolas Petton wrote a fileserver meant to be used in the node.js side.  This allows us to commit changes to our files transparently without the need of webdav,python(&lt;a href="http://puntoblogspot.blogspot.com/2011/09/jtalk-tutorial-valid-until-end-of-this.html"&gt;see last post&lt;/a&gt;), or any external server. It's Amber all way down.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The usage is fairly easy.  Just cd to the root amber directory and run ./bin/server, that will run ./server/FileServer* things.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;  IRCBot&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;Trying the node.js part of amber, we can try to build a small program, and as no programming language is complete unless it has a IRC bot in it, let's solve this issue:) Btw, I hacked a &lt;a href="http://puntoblogspot.blogspot.com/2011/09/emacs-and-smalltalk-bit-closer.html"&gt;couple of emacs functions&lt;/a&gt; to deal with st files a bit better.&lt;/div&gt;&lt;script src="https://gist.github.com/1223973.js?file=IRCBot.st"&gt;&lt;/script&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-7287737933567349083?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/7287737933567349083/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=7287737933567349083' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/7287737933567349083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/7287737933567349083'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/09/amber-language-former-jtalk-digging.html' title='Amber language (former jtalk), digging deeper'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-5835474931006765153</id><published>2011-09-11T22:44:00.003+01:00</published><updated>2011-09-11T22:56:33.570+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>can your editor^W OS do this?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-nIhuntrlqyA/Tm0sdZBQmvI/AAAAAAAAAag/QE2a1zfwZ5U/s1600/real_programmers.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 219px;" src="http://1.bp.blogspot.com/-nIhuntrlqyA/Tm0sdZBQmvI/AAAAAAAAAag/QE2a1zfwZ5U/s400/real_programmers.png" alt="" id="BLOGGER_PHOTO_ID_5651221990863837938" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here is an emacs feature that it's hard to believe until you see it working.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;m-x butterfly&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Unbelievable, no?&lt;br /&gt;&lt;br /&gt;Well, let's link this amazing functionality to the gesturing strokes-mode.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;m-x strokes-mode&lt;br /&gt;m-x strokes-global-set-stroke&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Then, click in the buffer that appeared, and draw(drag) a circle with your mouse. when you end, press the right button.&lt;br /&gt;&lt;br /&gt;now emacs will ask you for a command.  Now it's the butterfly turn. write 'butterfly'.&lt;br /&gt;&lt;br /&gt;Ok, now you have configured and amazing mouse gesture that will flip bits on your hard drive only by reproducing the figure (circle) you just did before.&lt;br /&gt;&lt;br /&gt;in any buffer, press shift and draw a circle dragging the second mouse button (mouse wheel probably).&lt;br /&gt;&lt;br /&gt;ENJOY!&lt;br /&gt;&lt;br /&gt;PS: I've changed the shortcut from the second button to first, and now I can use my tablet to manage emacs.  And here's another great thing of the ubiquity of emacs:  You can use it to manage things related to irc,jabber,mail,text editing, playlist managing and even pdf reading.  neat.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-5835474931006765153?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/5835474931006765153/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=5835474931006765153' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/5835474931006765153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/5835474931006765153'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/09/can-your-editorw-os-do-this.html' title='can your editor^W OS do this?'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-nIhuntrlqyA/Tm0sdZBQmvI/AAAAAAAAAag/QE2a1zfwZ5U/s72-c/real_programmers.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-6320748699770281025</id><published>2011-09-09T01:09:00.003+01:00</published><updated>2011-09-09T01:16:11.578+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='smalltalk'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>emacs and smalltalk, a bit closer</title><content type='html'>Today I've been hacking around with jtalk. Implementing something for the node.js backend means that probably you'll be using your editor of choice.&lt;br /&gt;&lt;br /&gt;I've downloaded paolo bonzini's &lt;a href="https://gist.github.com/1205117"&gt;smalltalk-mode.el&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've hacked some shortcuts to navigate through classes using emacs narrowing feature.&lt;br /&gt;&lt;br /&gt;Here's the hack:&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1205117.js?file=jtalk.el"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-6320748699770281025?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/6320748699770281025/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=6320748699770281025' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/6320748699770281025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/6320748699770281025'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/09/emacs-and-smalltalk-bit-closer.html' title='emacs and smalltalk, a bit closer'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-3787407871000634085</id><published>2011-09-08T18:28:00.006+01:00</published><updated>2011-09-12T09:00:22.185+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='smalltalk'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='general programming'/><title type='text'>HN Frenzy</title><content type='html'>HackerNews is not in its greatest moments lately, but today, lots of diferent great articles/links appeared.  It's a bit overflow of info in just one moment, you open a handful of links and you face.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/fpletz/kernelroll/"&gt; Probably the greatest hello world on linux kernel module&lt;/a&gt;&lt;/li&gt;&lt;a href="http://pastie.org/2503222"&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.mahdiyusuf.com/post/9947002105/most-pressed-keys-and-programming-syntaxes"&gt;A funny study on most pressed keys on different languages.&lt;/a&gt;I'm thinking if that's possible to include it in jtalk.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.forthos.org/"&gt;http://www.forthos.org/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nfarina.com/post/9868516270/git-is-simpler"&gt;Another great tutorial on git explaining things in a very simple way.&lt;/a&gt;  The more I know about git, the better I rate git tutorials.  I'm probably suffering the "I don't understand until it's obvious" syndrome&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://ifttt.com/wtf"&gt;if this then that&lt;/a&gt;.  API comunication between most famous intertubez sites.  IT could be named THE INTERNETZ DBUS&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Not in HN but a &lt;a href="http://pastie.org/2503222"&gt;tiny example&lt;/a&gt; of how cool is the project that's driving some of smalltalkers to sleep 4 hours per night.&lt;a href="http://jtalk-project.org/"&gt;Jtalk&lt;/a&gt;. Credits on that go to Bromagosa&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-3787407871000634085?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/3787407871000634085/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=3787407871000634085' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/3787407871000634085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/3787407871000634085'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/09/hn-frenzy.html' title='HN Frenzy'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-6045249686547571493</id><published>2011-09-05T00:37:00.004+01:00</published><updated>2011-09-05T01:13:28.650+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>Routing tutorials in rails 2.X</title><content type='html'>For me, one of the most confusing things in Rails is routing.  The DSL, all those automagic methods, abuse of method_missing (it's starting to feel usual), and RESTful conventions, mixed with namespacing, &lt;br /&gt;&lt;br /&gt;I've found three detailed tutorials (well, series of tutorials) that seem to explain all what's needed to get into the routing thing. Here are the links to &lt;br /&gt;&lt;br /&gt;&lt;a href="http://weblog.jamisbuck.org/2006/10/2/under-the-hood-rails-routing-dsl"&gt;under-the-hood-rails-routing-dsl&lt;/a&gt;&lt;br /&gt;&lt;a href="http://weblog.jamisbuck.org/2006/10/4/under-the-hood-route-recognition-in-rails"&gt;under-the-hood-route-recognition-in-rails&lt;/a&gt;&lt;br /&gt;&lt;a href="http://weblog.jamisbuck.org/2006/10/16/under-the-hood-route-generation-in-rails"&gt;under-the-hood-route-generation-in-rails&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A couple of articles on extending routing system&lt;br /&gt;&lt;a href="http://weblog.jamisbuck.org/2006/10/20/monkey-patching-rails-extending-routes-1"&gt;monkey-patching-rails-extending-routes-1&lt;/a&gt;&lt;br /&gt;&lt;a href="http://weblog.jamisbuck.org/2006/10/26/monkey-patching-rails-extending-routes-2"&gt;monkey-patching-rails-extending-routes-2&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here's the starting point of a super-detailed explanation and hands on tutorial on rails 2.X routing.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://darynholmes.wordpress.com/2008/03/15/beginners-tutorial-routing-in-rails-20-with-rest-part-1-of-n"&gt;beginners-tutorial-routing-in-rails-20-with-rest-part-1-of-n&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There are 6 parts in this last tutorial.&lt;br /&gt;&lt;br /&gt;Btw, both blogs seem good sources of information.  Good explanation on different topics, always quite detailed, and well written.  For example, here's &lt;a href="http://darynholmes.wordpress.com/2008/04/02/ajax-fundamentals-part-1/"&gt;a series of posts on AJAX &lt;/a&gt;(from the bottom up).&lt;br /&gt;&lt;br /&gt;Bye!&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-6045249686547571493?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/6045249686547571493/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=6045249686547571493' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/6045249686547571493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/6045249686547571493'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/09/routing-tutorials-in-rails-2x.html' title='Routing tutorials in rails 2.X'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-1988239711245796813</id><published>2011-09-04T14:44:00.024+01:00</published><updated>2011-11-04T14:49:23.672Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='smalltalk'/><title type='text'>Jtalk tutorial.  (Valid until the end of this week)</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/-w4fk36uhk4E/TmOtLtDbjrI/AAAAAAAAAaQ/yjDZg3AAN8I/s1600/jtalk.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 203px;" src="http://3.bp.blogspot.com/-w4fk36uhk4E/TmOtLtDbjrI/AAAAAAAAAaQ/yjDZg3AAN8I/s400/jtalk.png" alt="" id="BLOGGER_PHOTO_ID_5648548774236884658" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;TL;DR&lt;br /&gt;write this in a workspace, select, and click 'DoIt'. Instant reward.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt; Counter new appendToJQuery: 'body' asJQuery&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You know Smalltalk, it is an object oriented programming language developed at Xerox PARC during the 70's by Alan Kay, Dan Ingalls and other brillant guys. It is known that Kay, and probably other members of the team, was born from the leg of Zeus.  Jtalk is an implementation of Smalltalk that runs on top of JavaScript, developed by Nicolas Petton. It allows the use of Smalltalk for client side applications. Even more, &lt;a href="http://jtalk-project.org/"&gt;Jtalk&lt;/a&gt; allows you to use the famous IDE from the Smalltalk world directly in your browser.  It compiles to JavaScript, and follows Pharo, a fork of the Squeak Smalltalk implementation.&lt;br /&gt;&lt;br /&gt;The canonical "Hello World" looks like this:&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1195625.js?file=HelloWorld.st"&gt;&lt;/script&gt;&lt;br /&gt;You create a subclass of Widget, and you implement the #renderOn: method. Jtalk will pass an HtmlCanvas instance that we call html in our code. This object provides some "brushes" allowing to "paint" into the html canvas by message passing. We created a div element by sending the div message to html. The div element has it's class and id attributes defined, and it contains a h1 element. Everything is performed by passing messages to the html object. Those familiar with the Seaside web framework will recognize the html canvas. After the HelloWorld class is&lt;br /&gt;defined, you can see it in the browser by appending an instance to the page's body using JQuery:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;&lt;pre&gt;HelloWorld new appendToJQuery: 'body' asJQuery&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A JQuery object is created by passing the #asJQuery message to the string object 'body'. Then we pass the #append message to the JQuery object, with an instance of HelloWorld as argument.  You can evaluate this expression in the Workspace and see it in action.&lt;br /&gt;&lt;br /&gt;Another way to do the same is going to JQuery class, and send the #body message.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Where is the Counter?&lt;/span&gt;&lt;br /&gt;If you know Seaside you'll want to look at the Counter example. I will reproduce the example from the Jtalk website, which you can find also with the IDE's class browser.  It is a good example because it shows how you can write stateful applications in Samalltalk, by simply using its object system as you would do in any application:&lt;br /&gt;&lt;script src="https://gist.github.com/1195625.js?file=Counter.st"&gt;&lt;/script&gt;&lt;br /&gt;As in Seaside, the button definition is beautiful. Since the object itself holds the state of the application, you simply bind a Smalltlak code block to the onclick event, and Jtalk will take it from there.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Interacting with the DOM with JQuery and JS evaluation&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As you can see, there is JQuery support provided by the JQuery class. We just used it for appending a piece of html to the body element of our page.  There is support for a good part of the JQuery api, as you can see by browsing the methods implemented in the JQuery class. You can do DOM insertion, css manipulation, event handling, etc.  If something you like is not implemented, you can evaluate JS code by enclosing it with the "&amp;lt;" and "&amp;gt;" characters. A wrapper for ajax is also available:&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1195625.js?file=simpleAjax.st"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Here we create an Ajax object and then we send some messages to it. As you can see, we use Samlltalk blocks as callbacks, this blocks are compiled to JavaScript anonymous functions for execution. There are other messages availables in an Ajax object, like #onCompleteDo. Dictionary like syntax is provided for passing additional settings to the Ajax object:&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1195625.js?file=ajaxWithExtraArgs.st"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;As test, I wrote a small HTTP service interfacing a CouchDb instance. I did it in Python using the small but cool Flask framework:&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1195625.js?file=simpleCouchy.py"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Please consider it almost pseudo code. You can note its very simple stuff. We serve the Jtalk DE at "/", and we provide access to the database in "/get/&amp;lt;doc_id&amp;gt;".  Now, we could build a small wrapper for accessing this service:&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1195625.js?file=Data.st"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;We provide a single method called get:onSuccess: allowing the client code to request a document and executing a callback block on the resulting data. Smalltalk blocks are constructed using brackets, and they are like anonymous functions. Temporary named arguments are declared with the :argName, and after the bar you can write any Smalltalk statement. Our onSuccessDo callback takes the data received form the Ajax request as argument. This data comes in JSON format, so we&lt;br /&gt;use an instance of the Smalltalk object to translate this to a Jtalk object, and then we pass that to the block provided by the client code, which we called "aBlock".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;An experiment using Rasta.js for data persistence&lt;/span&gt;&lt;br /&gt;&lt;a href="http://rastajs.errorjs.com/"&gt;&lt;br /&gt;Rasta.js&lt;/a&gt; is a very simple key/value storage service. It provides a REST API and a client library:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;script src="http://rastajs.errorjs.com/rasta.min.js" type="text/javascript"&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;We can use this for looking at how can we delegate execution to a JavaScript object and also for providing some data persistence to a static website.&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1195625.js?file=Rasta.st"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;That was easy. The Rasta class has one instance variable, called "rasta". Instance attributes are private in Smalltalk, you have to implement methods if you want to access them from the outside. But in this case, our rasta attribute is for internal use, we don't need the stinky accessors. The Rasta.js API  provides two simple JS functions:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Rasta.get('age', function(val){&lt;br /&gt;/* val == '100' */&lt;br /&gt;})&lt;br /&gt;&lt;br /&gt;Rasta.set('age','100', function(){&lt;br /&gt;/*      */&lt;br /&gt;})&lt;br /&gt;&lt;/pre&gt;Since they use an upper cased name, and in Smalltalk those are reserved for classes, we have to use a special trick. Jtalk will get confused if you try to evaluate "Rasta" directly.  This not happens with lower case JS names, which are available directly in the Jtalk IDE (you can try&lt;br /&gt;console log: 'fooBar' for an example in the Workspace.) So, we will use our "rasta" instance attribute for storing the JS object, we use the &amp;lt;jsobject&amp;gt; notation for getting a sort of proxy object which will delegate messages in the JS one, and we can access it under the "rasta"&lt;br /&gt;name in our messages. Now we can use the Rasta.js KISS service for our data storage:&lt;br /&gt;&lt;pre&gt;database := Rasta new.&lt;br /&gt;database get: 'aKey' onSuccess: [ :data | 'div#container' asJQuery append: data ].&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ok, usualy you will want to format the data. We can wrap this into a Widget subclass and implement a #renderOn: method. At this point we can put all these features together in our mind: you get a nice programming environment which promotes good code practices like layers and concerns separation, clean and readable syntax, testing facilities, and who knows&lt;br /&gt;what, with an IDE accessible directly from the browser.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;On code persistence&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I will just say it. If you press "F5" (or "r" if you are a hacker) you will lose your code.  The IDE features a "Commit category" button, which sends a PUT request with the compiled ST in the body. But as Jtalk is focused in client side coding, it is your responsability to handle the&lt;br /&gt;request and save the code into the "js/" folder, next to the Jtalk library.  I will show you the "almost pseudo code" thing again, with Flask and Python:&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1195625.js?file=commit.py"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Note that I used the secure_filename from werkzeug to sanitize the data, since I use it to build the path. You don't want to allow write to your .zshrc or similar.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Concluding&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Jtalk can help you to write heavy client side applications by taking advantage of the ancient wisdom from the Smalltalk world. It still has some sharp edges but it is there for you to try it. Allows you to write stateful client code easily, and to port known and tested patterns to&lt;br /&gt;the web browser, for great justice.  And there is a plus. Jtalk is part of a legendary story, the Smalltalk one. After all, I have told you, these guys came from the leg of a god.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;A moving target&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In the couple of days that Rodrigo Bistolfi and me have been experimenting with Jtalk and writing this article (In fact he wrote most of the article), a bunch of things changed already, or are going to change shortly.  For example, Capitalized Javascript objects are parsed now without problems in Jtalk.  On the JQuery side, Nicolas Petton recently said that JQuery binding is going to disappear from jtalk bundle.  It seems we'll be able to fetch DOM nodes directly with jtalk.  So better be up to date with the &lt;a href="https://github.com/NicolasPetton/jtalk"&gt;jtalk git repo&lt;/a&gt;, because jtalk is moving fast.&lt;br /&gt;&lt;br /&gt;Btw, there's a lot more related to Jtalk. Goran Krampe wrote jtalkc, that compiles jtalk code to js able to run in node.js.  I haven't digged on that yet, but seems it also opens a shitload of possibilities... :)&lt;br /&gt;&lt;br /&gt;Cya!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-1988239711245796813?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/1988239711245796813/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=1988239711245796813' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/1988239711245796813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/1988239711245796813'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/09/jtalk-tutorial-valid-until-end-of-this.html' title='Jtalk tutorial.  (Valid until the end of this week)'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-w4fk36uhk4E/TmOtLtDbjrI/AAAAAAAAAaQ/yjDZg3AAN8I/s72-c/jtalk.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-4612110112842064253</id><published>2011-09-01T00:41:00.003+01:00</published><updated>2011-09-01T00:59:46.076+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><title type='text'>more git workflows.  Getting closer to sanity</title><content type='html'>Toady, a new &lt;a href="http://scottchacon.com/2011/08/31/github-flow.html"&gt;article of git workflows&lt;/a&gt; appeared in HN.  The nice thing of it is that at my workplace, we use exactly the same workflow.  I just post it here for future reference&lt;br /&gt;&lt;br /&gt;And now that we're at it, I link &lt;a href="http://sandofsky.com/blog/git-workflow.html"&gt;another git workflow&lt;/a&gt; related post that talks about merge --squash.  A nice thing to make your history cleaner&lt;br /&gt;&lt;br /&gt;Btw, I recently discovered a couple of interesting git man pages: gittutorial and gitworkflows. Interesting information there too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-4612110112842064253?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/4612110112842064253/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=4612110112842064253' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/4612110112842064253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/4612110112842064253'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/09/more-git-workflows-getting-closer-to.html' title='more git workflows.  Getting closer to sanity'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-1041098035978862887</id><published>2011-08-23T16:38:00.011+01:00</published><updated>2011-08-30T22:01:12.612+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='smalltalk'/><title type='text'>ESUG in: 2011 on: Edinburgh</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-JF180zWN4qI/Tlwd1BCOIsI/AAAAAAAAAaI/gKJXIYS4pGo/s1600/Esug2011_logo_small.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 295px; height: 400px;" src="http://1.bp.blogspot.com/-JF180zWN4qI/Tlwd1BCOIsI/AAAAAAAAAaI/gKJXIYS4pGo/s400/Esug2011_logo_small.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5646420829463782082" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ESUG 2011 is over, and I'm back from my holidays, with a couple of interesting bits about the smalltalk world, and lots of energy.&lt;br /&gt;&lt;br /&gt;Here are the talks that impressed me most:&lt;br /&gt;&lt;br /&gt;- Martin McClure explained &lt;a href="http://www.esug.org/wiki/pier/Conferences/2011/Schedule-And-Talks/Call-Ruby"&gt;Maglev&lt;/a&gt; smalltalk to ruby ffi.  It seems maglev is more than a simple smalltalk vm.  In fact it runs ruby code and smalltalk code seamlessly (at least, that's what I understood).  Unfortunately, it only exist in 64-bit shape, so I couldn't try it myself.  The core of the presentation though was the nice FFI that VMWare guys (former GemStoners) prepared to run Ruby code from Smalltalk.&lt;br /&gt;&lt;br /&gt;As most of you know, Ruby is heavily influenced by smalltalk.  In fact, so much that Martin and friends were able to make one object for both worlds.  So String class is the same for ruby and smalltalk.  Objects are the same, but the names are different, so SmallInteger for smalltalk, is fixnum for Ruby. 'super' pointer is also different, enabling to build variations in hierarchies and supporting singleton classes for ruby.&lt;br /&gt;&lt;br /&gt;Lots of nice tricks that enable us to use ruby objects as smalltalk ones.&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://www.esug.org/wiki/pier/Conferences/2011/Schedule-And-Talks/Bifrost"&gt;Bifrost&lt;/a&gt;.  Jorge Ressia is implementing great improvements in the reflexivity side of Pharo.  Being able to treat data as code is one of the aims of bifrost. Not losing the link on logs and where a log entry comes from, or being able to hook on variable usage when debugging...  Thanks to Bernat I was able to try it in my own pharo image. (Bifrost is only the framework, you have to install the programs separately)&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://jtalk-project.org"&gt;Jtalk&lt;/a&gt;.  I think this was the killer talk of this ESUG.  Goran Krampe and Nicolas Petton presented their (mostly Nico's) smalltalk implementation in js.  Running smalltalk in browser is not only being able to write smalltalkish syntax.  It means you have a full stack smalltalk in your browser. Many firebug features will come for free in Jtalk. Goran showed some experiments he's doing with node.js and jtalk compiler to js. Yes, you're able to write smalltalk for the server side.  Probably I'll post more about jtalk, so keep tunned.&lt;br /&gt;&lt;br /&gt;There were a lot of other interesting presentations, like Gerardo and Javier live garbage collection tweaks(writing garbage collectors in smalltalk and rebinding garbage collector on your live system), redline (smalltalk in your jvm) and Coral (pharo for those who can type).&lt;br /&gt;&lt;br /&gt;It's great stuff all way down!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-1041098035978862887?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/1041098035978862887/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=1041098035978862887' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/1041098035978862887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/1041098035978862887'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/08/esug-in-2011-on-edimburgh.html' title='ESUG in: 2011 on: Edinburgh'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-JF180zWN4qI/Tlwd1BCOIsI/AAAAAAAAAaI/gKJXIYS4pGo/s72-c/Esug2011_logo_small.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-6903591712198230931</id><published>2011-08-21T23:06:00.005+01:00</published><updated>2011-08-22T10:21:00.922+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='general programming'/><title type='text'>Cellular automatas and me</title><content type='html'>2 weeks ago I started to read &lt;a href="http://www.amazon.com/Philosophy-Simulation-Emergence-Synthetic-Reason/dp/1441170286"&gt;Philosophy and simulation&lt;/a&gt; by Manuel DeLanda (thanks &lt;a href="https://github.com/eskerda"&gt;eskerda&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;About one month ago I watched jdelgado's talk at Campus Party talking about science in science fiction, and he talks a bit about cellular automata too:&lt;br /&gt;&lt;iframe width="560" height="345" src="http://www.youtube.com/embed/DwWsKgJVGoI" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;So I started to experiment a bit with cellular automatas myself, and implemented a Conway game of life in smalltalk.  At first I wanted to write a very flexible (1d,2d,...nd) cellular automata engine, but once I had the 2d Game of life implemented, I realized that doing 1d things is easier if you do it with strings, or just lists (lisp lists, for example).&lt;br /&gt;&lt;br /&gt;Well, so I implemented a 1d cellular automata in common lisp (nice exercise) and tried some interesting rules for the majority problem jdelgado mentions in his talk.&lt;br /&gt;&lt;br /&gt;At first I thought majority problem had a defined proper solution, but searching on the internetz, it seems it's not trivial at all, and I couldn't find anything that takes me further than rule 184, that splits the list in a group of 0's and 1's. &lt;br /&gt;&lt;br /&gt;If you want the implementation of the smalltalk GoL, ask for it (it's not that easy to paste smalltalk code on the web, you know...), or just download any already existent implementations on squeaksource, like &lt;a href="http://www.squeaksource.com/SGoL.html"&gt;Bernat's one&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1161271.js?file=cellular.lisp"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-6903591712198230931?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/6903591712198230931/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=6903591712198230931' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/6903591712198230931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/6903591712198230931'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/08/cellular-automatas.html' title='Cellular automatas and me'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/DwWsKgJVGoI/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-7750835013510240972</id><published>2011-08-16T18:01:00.003+01:00</published><updated>2011-08-16T18:23:47.362+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>git push -f to master and you're a dead man</title><content type='html'>Just came back from the half of my holidays, and came with a quite long TODO list.&lt;br /&gt;&lt;br /&gt;One item of the list was a wrapper for git that avoids pushing -f the master branch.&lt;br /&gt;&lt;br /&gt;At my new $job (yes, I changed again, you'll be noticed properly when I have more time to write), we use a minimal version of git-flow and we run tests on remote (personal) branches.&lt;br /&gt;&lt;br /&gt;That means that sometimes, you have to git push -f to your personal remote branch, and possibly delete history.  There's no problem if you do it in your personal branch, but as dumbans we err, and myself, being new to all this git fancy stuff, I was a bit worried about it.&lt;br /&gt;&lt;br /&gt;I've come with a solution that should work fairly well and transparently.   A wrapper for git that nops dangerous commands.&lt;br /&gt;&lt;br /&gt;It's perl, and here it is.&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1149594.js"&gt; &lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Despite being destructive, I like the equals method, kind of lispy, but using shift as a car/cdr solution.&lt;br /&gt;&lt;br /&gt;To make the wrapper work, rename it to 'git', make it executable, and put it somewhere in your path, before /usr/bin/git executable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-7750835013510240972?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/7750835013510240972/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=7750835013510240972' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/7750835013510240972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/7750835013510240972'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/08/git-push-f-to-master-and-youre-dead-man.html' title='git push -f to master and you&apos;re a dead man'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-2500931414869425801</id><published>2011-08-09T00:30:00.001+01:00</published><updated>2011-08-09T01:07:00.963+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='smalltalk'/><category scheme='http://www.blogger.com/atom/ns#' term='general programming'/><title type='text'>Back to the future. Xerox PARC innovations.</title><content type='html'>From time to time. I spend an afternoon doing some monographic research of a great Computer Scientist, or simply people I've seen some day in TED, and would like to know more about him/her.&lt;br /&gt;&lt;br /&gt;Sometimes it's Joe Armstrong, sometimes it's Guy Steele, but Alan Kay and friends take these afternoons more often than others.&lt;br /&gt;&lt;br /&gt;Here are 3 Conferences by Alan Kay and one from Dan Ingalls.   Those two men (and their collegues at Xerox PARC) have done probably more for our field than any other single group in the 70 years of history of CS (or call it tinkering, or computer tekne)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Alan Kay at TED talk, sharing his ideas about ideas. 2007&lt;br /&gt;&lt;object height="374" width="526"&gt; &lt;param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"&gt; &lt;param name="allowFullScreen" value="true"&gt; &lt;param name="allowScriptAccess" value="always"&gt; &lt;param name="wmode" value="transparent"&gt; &lt;param name="bgColor" value="#ffffff"&gt; &lt;param name="flashvars" value="vu=http://video.ted.com/talk/stream/2007/Blank/AlanKay_2007-320k.mp4&amp;amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/AlanKay-2007.embed_thumbnail.jpg&amp;amp;vw=512&amp;amp;vh=288&amp;amp;ap=0&amp;amp;ti=228&amp;amp;lang=eng&amp;amp;introDuration=15330&amp;amp;adDuration=4000&amp;amp;postAdDuration=830&amp;amp;adKeys=talk=alan_kay_shares_a_powerful_idea_about_ideas;year=2007;theme=numbers_at_play;theme=how_we_learn;theme=tales_of_invention;event=TED2007;tag=Design;tag=Technology;tag=children;tag=collaboration;tag=computers;tag=education;&amp;amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;"&gt; &lt;embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgcolor="#ffffff" allowfullscreen="true" allowscriptaccess="always" flashvars="vu=http://video.ted.com/talk/stream/2007/Blank/AlanKay_2007-320k.mp4&amp;amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/AlanKay-2007.embed_thumbnail.jpg&amp;amp;vw=512&amp;amp;vh=288&amp;amp;ap=0&amp;amp;ti=228&amp;amp;lang=eng&amp;amp;introDuration=15330&amp;amp;adDuration=4000&amp;amp;postAdDuration=830&amp;amp;adKeys=talk=alan_kay_shares_a_powerful_idea_about_ideas;year=2007;theme=numbers_at_play;theme=how_we_learn;theme=tales_of_invention;event=TED2007;tag=Design;tag=Technology;tag=children;tag=collaboration;tag=computers;tag=education;&amp;amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;" height="374" width="526"&gt;&lt;/embed&gt; &lt;/object&gt;&lt;a style="left: 0px ! important; top: -374px ! important;" title="Click here to block this object with Adblock Plus" class="ntwjjfnotmixfiavlbyi visible ontop" href="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you liked it (you SHOULD like it), here you can see a longer talk about Alan's last work (STEPS)&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.tele-task.de/de/archive/lecture/overview/5819/"&gt;http://www.tele-task.de/de/archive/lecture/overview/5819/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Here's Dan Ingalls talking about his work at PARC Place.  Great stuff too.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.infoq.com/presentations/Forty-Years-of-Fun-with-Computers"&gt;http://www.infoq.com/presentations/Forty-Years-of-Fun-with-Computers&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;And another Kay's talk about great innovations of the 60's and 70's. In XXI century, we haven't exploited many of these ideas yet.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://video.google.com/videoplay?docid=-533537336174204822"&gt;http://video.google.com/videoplay?docid=-533537336174204822&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;If you know of other related talks, please, put links in comments.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-2500931414869425801?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/2500931414869425801/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=2500931414869425801' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/2500931414869425801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/2500931414869425801'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/08/back-to-future-xerox-parc-innovations.html' title='Back to the future. Xerox PARC innovations.'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-5237906257476046360</id><published>2011-07-18T00:10:00.007+01:00</published><updated>2011-08-17T13:38:32.540+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><category scheme='http://www.blogger.com/atom/ns#' term='general programming'/><title type='text'>More presentation tools</title><content type='html'>A little reminder of a couple of tools I should try for my next presentation (tbh, I don't have any presentation in near future, but..)&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/eschulte/epresent"&gt;epresent&lt;/a&gt;.   Emacs plugin. WhatYouWriteIsWhatYouGet, almost.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://github.com/pepelsbey/shower"&gt;shower&lt;/a&gt;. Just appeared in HN. Seems a good template to do presentations.&lt;/li&gt;&lt;li&gt;&lt;a href="http://orgmode.org/worg/org-tutorials/org-beamer/tutorial.html"&gt;org-mode + beamer&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;We'll see when someone writes org-mode + shower helpers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-5237906257476046360?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/5237906257476046360/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=5237906257476046360' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/5237906257476046360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/5237906257476046360'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/07/more-presentation-tools.html' title='More presentation tools'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-4876779420425600769</id><published>2011-07-16T10:54:00.001+01:00</published><updated>2011-07-17T21:28:29.970+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>open rails files from console to $EDITOR</title><content type='html'>You're in the console, run rake test, and appear a bunch of file paths cluttered with line numbers, colons, and no spaces between them.  Well, lest turn the no-space-between them thing in a WIN for us.&lt;br /&gt;&lt;br /&gt;Errors and failures show in different formats when running tests (not a very *intelligent* thing if you ask me, but...).  Well, a simple regex and we have 'pe' , powered-emacslient, path-edit, or whatever.  In my shell, double click any of the two versions  and 'pe &lt;shift-ins&gt;', and you're sitting again on your editor. placed in the correct line.&lt;br /&gt;&lt;br /&gt;.. app/models/bar.rb:88:in ..&lt;br /&gt;.. [test/unit/foo_test.rb:9]: ..&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1084630.js"&gt; &lt;/script&gt;&lt;br /&gt;&lt;br /&gt;'e' is the original emacsclient script I use for other files. Unifying both scripts in one is left as exercise to the reader.&lt;br /&gt;&lt;br /&gt;I want to spend an afternoon hacking a urxvt plugin to fetch for strings ressembling paths, and be able to open them using just keyboard, but that's a thing for another day.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-4876779420425600769?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/4876779420425600769/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=4876779420425600769' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/4876779420425600769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/4876779420425600769'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/07/open-rails-files-from-console-to-editor.html' title='open rails files from console to $EDITOR'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-5091330569524970639</id><published>2011-07-14T18:11:00.005+01:00</published><updated>2011-07-15T08:29:36.317+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Sending links when you cannot send files.</title><content type='html'>I've been reviewing my ~/bin directory and felt like sharing some of the little scripts there.&lt;br /&gt;&lt;br /&gt;Today, here's a little Perl script that helps me when having to give a file (screenshot or something) to someone @work.  Most people do it by mail, or using jabber protocol.  Unfortunately, emacs-jabber does not allow sending nor receiving files, and opening mail client and attaching files is waaay to slow and boring.&lt;br /&gt;&lt;br /&gt;The way I work with this situation is having a simple http server in my computer, and moving the file there. then, I paste the link to my coworker, and he/she just has to click it and download.&lt;br /&gt;&lt;br /&gt;The http server lives inside emacs. Oh yeah, that's irrelevant. But I had to say it.&lt;br /&gt;&lt;br /&gt;Well, here's a script I wrote in 2 minutes.&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1082411.js"&gt; &lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Hashing the name is to avoid name guessing. I think I got this idea from a Mark Fowler's post that was doing something like this with dropbox.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-5091330569524970639?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/5091330569524970639/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=5091330569524970639' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/5091330569524970639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/5091330569524970639'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/07/sending-links-when-you-cannot-send.html' title='Sending links when you cannot send files.'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-1452577185258214570</id><published>2011-07-06T21:34:00.004+01:00</published><updated>2011-07-14T18:04:26.720+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><title type='text'>Snapshots motherf*cker, do you speak it?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-vNiQeLaesj4/ThYUP4zWwcI/AAAAAAAAAZU/_W5nT_920Ac/s1600/pulp-fiction.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 226px;" src="http://2.bp.blogspot.com/-vNiQeLaesj4/ThYUP4zWwcI/AAAAAAAAAZU/_W5nT_920Ac/s400/pulp-fiction.jpg" alt="" id="BLOGGER_PHOTO_ID_5626707047624393154" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Today, I'll just snap a recipe for a use case that starts to crop up when evolving from a total git beginner to not-so-noob-git-user. &lt;span style="font-weight: bold;"&gt;git reset&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here's the diagram:&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1064965.js?file=git-reset-diagram.ditaa"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Ok, now screw it.&lt;br /&gt;&lt;br /&gt;The main problem when thinking about how git works is thinking in the wrong way.  You've been told hundreds of times that git works differently from EVERY other versioning system around, and you keep forgetting these concepts every now and then.&lt;br /&gt;&lt;br /&gt;The diagram before is a diagram of where git moves your changes when you do a given reset command.  git reset --soft foo moves the changes from commit 'foo' till HEAD to the index.&lt;br /&gt;&lt;br /&gt;YOU'RE THINKING IT WRONG.&lt;br /&gt;&lt;br /&gt;Remeber that you've been told that git records only snapshots?  Well, think about it.  When you want to reset your repo to the past, if you have a clean working directory and index. HEAD,index and wd are all in the same state.  That means that All trees contain the same. THE SAME. If you are thinking that your wd has some files, that the index is empty (Delta is null) and same (or kind of) for the repo, you're thinking it WRONG again.&lt;br /&gt;&lt;br /&gt;Now, if you go and look git help reset, and this &lt;a href="http://blog.plover.com/prog/git-reset.html"&gt;MJD's post about git reset&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Then it's kind of easy to understand what it does, and in which state will leave your repo, index and ass.&lt;br /&gt;&lt;br /&gt;(take the italics notes as if you just reseted the most recent commit, if you reset to older ones, all changes are accumulated)&lt;br /&gt;&lt;ul&gt;&lt;li&gt;git reset --soft just updates your HEAD.  Changes are in the stage, ready to be commited without that nice 'fdsajflkdsajflkasdf' commit message.  &lt;span style="font-style: italic;"&gt;You're in the moment before you commited.&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;git reset --mixed updates your HEAD and your index accordingly.  That means that probably, if you're reseting to past commits all changes from the target commit till now will be only in your wd. &lt;span style="font-style: italic;"&gt;You're in the moment before you added files.&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;git reset --hard updates everything. &lt;span style="font-style: italic;"&gt;You're in the moment after you commited the commit (O RLY?) so you lost everything you did after the commit.&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Btw, Take all this post with a grain of salt.  I just had an 'AHA!' moment I had to share.  Probably it's not *very* technically accurate.  I haven't even tried what happens on detached heads and other bizarre situations... yeah, I'm a sucker.&lt;br /&gt;&lt;br /&gt;man git-reset contains lots of tables and info, but IMHO, naming the states of files A B C D lead to harder understanding that if they'd have been D C B A.&lt;br /&gt;&lt;br /&gt;And now, a doubt for the lazyweb:&lt;br /&gt;git reset hard does not allow you to recover your state. gitk --all does not show anything from HEAD on.  but git reflog does show it.  And I'd swear gitk --all worked 2 days ago....&lt;br /&gt;&lt;br /&gt;Addendum:  Here's a great &lt;a href="http://progit.org/2011/07/11/reset.html"&gt;article on git reset&lt;/a&gt; that appeared a week after my finding. Really well explained, with graphics, tables and everything.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-1452577185258214570?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/1452577185258214570/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=1452577185258214570' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/1452577185258214570'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/1452577185258214570'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/07/snapshots-motherfcker-do-you-speak-it.html' title='Snapshots motherf*cker, do you speak it?'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-vNiQeLaesj4/ThYUP4zWwcI/AAAAAAAAAZU/_W5nT_920Ac/s72-c/pulp-fiction.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-3686906793484850863</id><published>2011-07-03T15:48:00.007+01:00</published><updated>2011-07-16T18:29:31.445+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mis cosas'/><title type='text'>El trabajo del futuro</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-UzY30zXx0CU/ThCCDS3ElNI/AAAAAAAAAZI/i5MvbZir2NQ/s1600/oferta-empleo-google-plus.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 200px; height: 133px;" src="http://4.bp.blogspot.com/-UzY30zXx0CU/ThCCDS3ElNI/AAAAAAAAAZI/i5MvbZir2NQ/s200/oferta-empleo-google-plus.jpg" alt="" id="BLOGGER_PHOTO_ID_5625138927699793106" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Via RaulGB, veo que hay empresas tan avanzadas a su tiempo, que vienen del futuro, como la rubia de la lejia, o Levi Strauss con un Delorean, o H.G.Wells.&lt;br /&gt;&lt;br /&gt;Me guardo la oferta, espero 3 años, me pillo una time machine, que seguro que estaran inventadas por entonces, y vuelvo a por el curro.&lt;br /&gt;&lt;br /&gt;Esperad mi llamada el martes que viene. De vuestro tiempo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-3686906793484850863?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/3686906793484850863/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=3686906793484850863' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/3686906793484850863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/3686906793484850863'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/07/el-trabajo-del-futuro.html' title='El trabajo del futuro'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-UzY30zXx0CU/ThCCDS3ElNI/AAAAAAAAAZI/i5MvbZir2NQ/s72-c/oferta-empleo-google-plus.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-821884909792643415</id><published>2011-07-02T15:17:00.002+01:00</published><updated>2011-07-02T15:29:00.984+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>Resize window in emacs</title><content type='html'>I use emacs as much as I can. That's not really news, is it?&lt;br /&gt;&lt;br /&gt;One of my use cases for emacs is chatting with friends. I use erc for IRC, and emacs-jabber for everything else.&lt;br /&gt;&lt;br /&gt;One thing that annoys me a bit is that when my screen is split in two and want to shrink a bit one of the two windows.&lt;br /&gt;&lt;br /&gt;There's c-x - (shrink-window-if-larger-than-buffer) but it's only useful for a handful of situations (IMHO)&lt;br /&gt;&lt;br /&gt;Here is a little function I wrote to shrink a window to selected region.  I find it useful to narrow windows to functions, paragraphs, or just narrowing a chat window to just 5 or 10 lines.&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1055275.js"&gt; &lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Select a region, and run it. Then c-l to recenter accordingly.&lt;br /&gt;&lt;br /&gt;I mainly use it as a more visual narrow-to region.&lt;br /&gt;&lt;br /&gt;Have fun&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-821884909792643415?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/821884909792643415/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=821884909792643415' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/821884909792643415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/821884909792643415'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/07/resize-window-in-emacs.html' title='Resize window in emacs'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-6834171552333098883</id><published>2011-06-27T00:37:00.003+01:00</published><updated>2011-06-27T00:48:09.713+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mis cosas'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='general programming'/><title type='text'>read-only weekend</title><content type='html'>Pretty nice weekend: &lt;br /&gt;&lt;br /&gt;Thursday night, a '&lt;a href="http://www.youtube.com/watch?v=0LxMxi0418Y"&gt;Gifted&lt;/a&gt;' concert with many of our friends attending.&lt;br /&gt;Great St.Joan party.&lt;br /&gt;&lt;br /&gt;From Friday to Sunday I didn't program anything but read a couple of&lt;br /&gt;books.  Yes, two. It's true both were quite easy reads and not very long.&lt;br /&gt;&lt;br /&gt;One of them is OReilly's '&lt;a href="http://oreilly.com/catalog/9780596519544"&gt;The productive programmer'&lt;/a&gt;.  I found the&lt;br /&gt;book a really easy read, but maybe it's beacause I already knew most&lt;br /&gt;of the tricks.  In fact I already knew I'd already know most of the&lt;br /&gt;tricks.  The second part of the book, though was a bit more abstract,&lt;br /&gt;and I could make some use of the info there.&lt;br /&gt;&lt;br /&gt;Points I found most interesting:&lt;br /&gt;&lt;br /&gt;- Make a living doc. (From commit logs to wiki, for example)&lt;br /&gt;&lt;br /&gt;- Learn to FOCUS. (I'll search for csikszentmihalyi's books)&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://www.ibm.com/developerworks/java/library/j-eaed4/index.html"&gt;Composed Method and SLAP&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The other book I skimmed is more a long article than a book: &lt;a href="http://www-cs-students.stanford.edu/~blynn/gitmagic/"&gt;Git Magic&lt;/a&gt;, by Ben Lynn.&lt;br /&gt;&lt;br /&gt;It's a pretty nice source of info on git. Really concise and to the&lt;br /&gt;point.  Mostly beginner, but also contains some advanced tricks (with&lt;br /&gt;the use cases explained), and a chapter on the git low-level stuff&lt;br /&gt;(remember git from the bottom up?)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-6834171552333098883?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/6834171552333098883/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=6834171552333098883' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/6834171552333098883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/6834171552333098883'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/06/read-only-weekend.html' title='read-only weekend'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-7762028491766072823</id><published>2011-06-22T22:41:00.005+01:00</published><updated>2011-06-22T23:18:27.704+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>Don't quit emacs by accident</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-p5Mnut_sPu4/TgJlcBU6CrI/AAAAAAAAAYw/jowYkcIcCfo/s1600/global-unset-key.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 239px;" src="http://3.bp.blogspot.com/-p5Mnut_sPu4/TgJlcBU6CrI/AAAAAAAAAYw/jowYkcIcCfo/s320/global-unset-key.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5621166816978668210" /&gt;&lt;/a&gt;&lt;br /&gt;Today I read &lt;a href="http://tsengf.blogspot.com/2011/06/confirm-to-quit-when-editing-files-from.html"&gt;a blogpost&lt;/a&gt; by en emacser blogger (&lt;a href="http://www.blogger.com/profile/11780610202818263705"&gt;tsengf&lt;/a&gt;) about quitting emacs accidentally.&lt;br /&gt;&lt;br /&gt;He writes a function to avoid closing emacs by accident when there's an opened file that belongs to any of your projects.&lt;br /&gt;&lt;br /&gt;My approach is somewhat different:&lt;br /&gt;&lt;br /&gt;Usually, when I have emacs opened, I have some processes running within it. That makes emacs warn me when I press c-x c-c by accident, and asks for confirmation (the same way as if I had unsaved buffers)&lt;br /&gt;&lt;br /&gt;Anyway, sometimes my muscle memory screws everything, and presses 'y' without asking my conscious mind.&lt;br /&gt;&lt;br /&gt;Here are a couple of solutions that work to some extend.&lt;br /&gt;&lt;br /&gt;The first one is the radical one. Just do not shut up emacs. Yes, as strange as it seems, I rarely have to close emacs while my computer is on.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;global-unset-key c-x c-c&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Then you have to exit emacs with the name of the whole command save-buffers-kill-terminal&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As a not-so-radical solution, my bet is for &lt;a href="http://www.gnu.org/software/libtool/manual/emacs/Saving-Emacs-Sessions.html"&gt;desktop-save&lt;/a&gt; to save every session in your home directory. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(defun desktop-save-main ()&lt;br /&gt;  (desktop-save "~/"))&lt;br /&gt;(add-hook 'kill-emacs-hook 'desktop-save-main)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Then, if you want to recover the state of the previous session, you have to eval (desktop-read) or (desktop-read "~/") if you aren't on your home dir.&lt;br /&gt;&lt;br /&gt;If you had sql sessions, erc sessions, or any other comint buffer... well... you lost them.&lt;br /&gt;&lt;br /&gt;PS: If you happen to know how to make this blog/post appear on the emacsen planet, please comment, or mail me, or twitt it to some emacs aggregator.... or just twitt the post FEED ME MOAR RSS's!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-7762028491766072823?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/7762028491766072823/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=7762028491766072823' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/7762028491766072823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/7762028491766072823'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/06/dont-quit-emacs-by-accident.html' title='Don&apos;t quit emacs by accident'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-p5Mnut_sPu4/TgJlcBU6CrI/AAAAAAAAAYw/jowYkcIcCfo/s72-c/global-unset-key.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-1359659901601081888</id><published>2011-06-16T22:09:00.004+01:00</published><updated>2011-06-16T22:25:41.152+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='general programming'/><title type='text'>sleepsort for the lulz</title><content type='html'>Today I discovered a programmers' BBS on 4chan (It hit HN's front page).&lt;br /&gt;There was a post talking about a sorting algorithm that the author called it 'sleepsort'&lt;br /&gt;I couldn't believe I didn't thought of it before. In fact in &lt;a href="http://puntoblogspot.blogspot.com/2010/09/paralleliterator-independent-tasks-are.html"&gt;a past post&lt;/a&gt; talking about Parallel::Iterator, I played with timers too.... I was sooo close :)&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1030303.js?file=sleepsort.bash"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Lots of lols reading &lt;a href="http://dis.4chan.org/read/prog/1295544154/1-40"&gt;the full thread&lt;/a&gt;, with comments, optimizations, translations to other languages and puns there.&lt;br /&gt;&lt;br /&gt;For example:&lt;br /&gt;&lt;br /&gt;- complexity of the algo: O(highest_value_in_input)&lt;br /&gt;&lt;br /&gt;- 40: Someone email this to Knuth.&lt;br /&gt;- 41: &gt;&gt;40. Knuth doesn't do email anymore &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Have fun.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-1359659901601081888?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/1359659901601081888/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=1359659901601081888' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/1359659901601081888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/1359659901601081888'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/06/sleepsort-for-lulz.html' title='sleepsort for the lulz'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-7003358379189100977</id><published>2011-06-14T18:47:00.001+01:00</published><updated>2011-06-15T07:56:44.399+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>vim.orthogonality &gt; emacs.orthogonality</title><content type='html'>I already mentioned this same thing &lt;a href="http://puntoblogspot.blogspot.com/2011/04/what-you-cant-see-can-hurt-you-or-at.html"&gt;in other posts,&lt;/a&gt; but well, today I stumbled upon another example of it.&lt;br /&gt;&lt;br /&gt;Vim is like a unix commanline, lots of little commands you can combine one to each other. It has the &lt;a href="http://blog.vivekhaldar.com/post/3339907908/the-cognitive-style-of-unix"&gt;cognitive style of linux&lt;/a&gt; command line&lt;br /&gt;&lt;br /&gt;bufdo,argadd,argdo... These are the 'pipes' of vim. multiplicity enablers that add functionality,commands and power in an exponential way.&lt;br /&gt;&lt;br /&gt;When writing ReST docs to take notes at university, I used Vim, and I got used to underline titles with an add-hoc sequence I made up (yank line,paste,visual line, replace, char) . Vim doesn't need a specific command for it, because it's immediate, and like most vim combos, it's like talking to it in a funny slang.&lt;br /&gt;&lt;br /&gt;On the other corner, emacs: as part of emacs-goodies (ubuntu package with  a bundle of emacs plugins) There's under.el.  A plugin that exports 'underhat-region'. A function that underlines a region with caret characters.  The bad thing of underhat-region is that it's not parametrizable, but that's not the point. The fscking point is that in emacs you end up stumbling upon functionalities that are already there as commands, but probably sunken among zillions of other commands.&lt;br /&gt;&lt;br /&gt;I'm more a vim-style guy myself, but couldn't resist emacs+vimpulse combination.  I think I'm sold.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-UfdKmJAHgU0/TffJauwP1zI/AAAAAAAAAYo/qbkdx5PbC_4/s1600/yunovimemacs.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/-UfdKmJAHgU0/TffJauwP1zI/AAAAAAAAAYo/qbkdx5PbC_4/s320/yunovimemacs.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5618180521232160562" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-7003358379189100977?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/7003358379189100977/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=7003358379189100977' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/7003358379189100977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/7003358379189100977'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/06/vimorthogonality-emacsorthogonality.html' title='vim.orthogonality &gt; emacs.orthogonality'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-UfdKmJAHgU0/TffJauwP1zI/AAAAAAAAAYo/qbkdx5PbC_4/s72-c/yunovimemacs.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-5075822152460367201</id><published>2011-06-07T19:37:00.004+01:00</published><updated>2011-06-07T19:50:42.795+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>PAIP, special edition</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-C-qgEDd2_8Y/Te5ykIaCBvI/AAAAAAAAAYI/TU2KCyh1yBo/s1600/IMAG0117.jpg"&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/--BV5VqyUOSU/Te5yj4WNekI/AAAAAAAAAYA/F6aOShLybk4/s1600/IMAG0115.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 120px; height: 200px;" src="http://1.bp.blogspot.com/--BV5VqyUOSU/Te5yj4WNekI/AAAAAAAAAYA/F6aOShLybk4/s200/IMAG0115.jpg" alt="" id="BLOGGER_PHOTO_ID_5615551746124118594" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I recently bought a copy of PAIP in dead tree format (as usual, a used one). When I received it, I was a little worried about the state of the book (it was expensive enough to be worried about it).  I opened the package, glanced it and seemed pretty good.  Nearly unused.&lt;br /&gt;&lt;br /&gt;But when I opened it... OMG! The fist page contains a note from Peter Norvig!&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-C-qgEDd2_8Y/Te5ykIaCBvI/AAAAAAAAAYI/TU2KCyh1yBo/s1600/IMAG0117.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 120px; height: 200px;" src="http://3.bp.blogspot.com/-C-qgEDd2_8Y/Te5ykIaCBvI/AAAAAAAAAYI/TU2KCyh1yBo/s200/IMAG0117.jpg" alt="" id="BLOGGER_PHOTO_ID_5615551750435112690" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;FUCK YEAH!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-5075822152460367201?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/5075822152460367201/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=5075822152460367201' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/5075822152460367201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/5075822152460367201'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/06/paip-special-edition.html' title='PAIP, special edition'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/--BV5VqyUOSU/Te5yj4WNekI/AAAAAAAAAYA/F6aOShLybk4/s72-c/IMAG0115.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-243477161963068775</id><published>2011-06-06T22:59:00.005+01:00</published><updated>2011-06-06T23:19:47.336+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='general programming'/><title type='text'>js can be fun(ctional) too. A new hope</title><content type='html'>Reviewing my latest gists, I re-discovered one in which I copied a js snippet that implemented foldr, one of those great higher order functions.  As a proof of concept, I implemented some of the functions on 'Why functional programming matters' paper.  In fact, I reimplemented nearly all &lt;a href="https://github.com/kidd/hascheme/blob/master/script/builtins.scm"&gt;builtins.scm&lt;/a&gt; (from my Half Assed Scheme implementation)&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/943818.js?file=any.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;I recently took a quick look at &lt;a href="http://jashkenas.github.com/coffee-script/"&gt;coffeescript&lt;/a&gt;, and it seems very promising.  Unfortunately, I didn't even try it (just the online interpreter).  Maybe when I try &lt;a href="http://news.ycombinator.com/item?id=2442663"&gt;rails 3.1&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-243477161963068775?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/243477161963068775/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=243477161963068775' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/243477161963068775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/243477161963068775'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/06/js-can-be-functional-too-new-hope.html' title='js can be fun(ctional) too. A new hope'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-985864084628604905</id><published>2011-05-25T13:49:00.003+01:00</published><updated>2011-05-25T13:55:24.283+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>Undo layouts in emacs</title><content type='html'>Once you're used to being able to undo and redo window layouts in your windowmanager (hello ratpoison!), You feel the need to have this same feature everywhere.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;;;; winner-mode&lt;br /&gt;(winner-mode 1)&lt;br /&gt;(global-set-key (kbd "C-x 4 u") 'winner-undo)&lt;br /&gt;(global-set-key (kbd "C-x 4 r") 'winner-redo)&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-985864084628604905?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/985864084628604905/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=985864084628604905' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/985864084628604905'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/985864084628604905'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/05/undo-layouts-in-emacs.html' title='Undo layouts in emacs'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-182396085004103304</id><published>2011-05-24T22:20:00.002+01:00</published><updated>2011-05-24T22:37:31.606+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>Slime configuration for common lisp</title><content type='html'>I recently bought a dead tree copy of Norvig's Book PAIP, and plan to dig harder on common lisp environment. &lt;br /&gt;&lt;br /&gt;To set up a correct environment, there's emacs,slime and an implementation of common lisp. sbcl is my choice, for no big reason. It's just one of the free implementations.&lt;br /&gt;&lt;br /&gt;Slime configurations are endless, but here's a decent one that mostly works for me.  &lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/989614.js"&gt; &lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Ah, there's a surprise in the book.  I'll show you in a future post :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-182396085004103304?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/182396085004103304/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=182396085004103304' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/182396085004103304'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/182396085004103304'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/05/slime-configuration-for-common-lisp.html' title='Slime configuration for common lisp'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-6382016148491236471</id><published>2011-05-23T18:00:00.001+01:00</published><updated>2011-05-23T18:00:02.793+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='smalltalk'/><title type='text'>Smalltalk tutorial on IRC</title><content type='html'>Last week at  #emacs-es on Freenode I did a very-short-and-introductory-hands-on-workshop on smalltalk. Just in case you know spanish, here's the log, with names removed to protect the guilty. &lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/981787.js?file=st.txt"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-6382016148491236471?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/6382016148491236471/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=6382016148491236471' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/6382016148491236471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/6382016148491236471'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/05/smalltalk-tutorial-on-irc.html' title='Smalltalk tutorial on IRC'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-6363571139870034052</id><published>2011-05-17T18:30:00.001+01:00</published><updated>2011-05-17T19:29:10.923+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Ratpoison bindings without prefix key</title><content type='html'>My window manager of choice is ratpoison. It's a really minimalist tiling wm heavily inspired by gnu screen.  As such, it has a prefix key (c-t by default) and most of the bindings mimic screen ones.&lt;br /&gt;&lt;br /&gt;At work, I recently discovered that my boss uses ratpoison too (my project manager uses xmonad, great team, isn't it).  He uses ratpoison with a different configuration scheme, banishing prefix key, and using definekey at toplevel for every command.&lt;br /&gt;&lt;br /&gt;I'm not sure whether I like this configuration or not, but I'm going to try this for a few days, and see if it works ok or what. I've written some lines to enable toplevel bindings using the super key.&lt;br /&gt;&lt;br /&gt;Avoiding c-t as a prefix key has its advantages, but now, 'super' key chords are all clobbered by ratpoison. We'll see how it works out.&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/977057.js?file=.ratpoisonrc"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-6363571139870034052?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/6363571139870034052/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=6363571139870034052' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/6363571139870034052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/6363571139870034052'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/05/ratpoison-bindings-without-prefix-key.html' title='Ratpoison bindings without prefix key'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-4992561040250095997</id><published>2011-05-17T18:14:00.002+01:00</published><updated>2011-05-17T18:14:00.369+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mis cosas'/><category scheme='http://www.blogger.com/atom/ns#' term='general programming'/><title type='text'>Smoke Driven Development</title><content type='html'>&lt;blockquote&gt;He pensado que podríamos usar git&lt;br /&gt;Con un poco de scrum y si aprendo TDD lo tenemos hecho en dos semanas&lt;br /&gt;Un par de branches, un par de slots&lt;br /&gt;Dos cartas porahi, un coaching porallá&lt;br /&gt;Y despues, fiesta de final de proyecto, cardhú, putas y farlopa. Pago yo.&lt;br /&gt;&lt;/blockquote&gt; &lt;br /&gt;&lt;div style="text-align: right;"&gt;                       -- Alguno que yo me sé --&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-4992561040250095997?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/4992561040250095997/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=4992561040250095997' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/4992561040250095997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/4992561040250095997'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/05/smoke-driven-development.html' title='Smoke Driven Development'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-7941726158404319589</id><published>2011-05-10T18:03:00.002+01:00</published><updated>2011-05-10T18:03:00.123+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='latex'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>latex code listings in org-mode</title><content type='html'>I already talked about &lt;a href="http://puntoblogspot.blogspot.com/2009/10/insert-code-listings-in-latex.html"&gt;inserting code listings in latex&lt;/a&gt; some time ago.  At @work&lt;br /&gt;(in a ruby meaning, not a perl one), I try to write as much as I can&lt;br /&gt;in org, and then export it to html, or pdf.&lt;br /&gt;&lt;br /&gt;org-mode is fully capable of assisting you when writing code listings,&lt;br /&gt;and it will export them with fancy syntax highlighting. When exporting&lt;br /&gt;to html, it uses htmlize (emacs-goodies if you're in ubuntu). But when&lt;br /&gt;exporting to LaTeX, things are not so straightforward.  Of course,&lt;br /&gt;there's extensive documentation, but sometimes, you just don't want to&lt;br /&gt;read through hundreds of details. You just want something that&lt;br /&gt;'WorksForMe (c)'.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;(setq org-export-latex-listings t)&lt;br /&gt;(add-to-list 'org-export-latex-packages-alist '("" "listings"))&lt;br /&gt;(add-to-list 'org-export-latex-packages-alist '("" "color"))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I don't know if it's enough or there's another configuration related&lt;br /&gt;to this sunken in my .emacs (now 609 lines long), but you know... It&lt;br /&gt;WorksForMe.&lt;a href="http://1.bp.blogspot.com/-anGtKQub2ZA/TckKPaMsMSI/AAAAAAAAAXs/-8mL6acPr-w/s1600/works-on-my-machine-starburst_thumb2.png"&gt;&lt;img style="float: right; margin: 0pt 0pt 10px 10px; cursor: pointer; width: 200px; height: 193px;" src="http://1.bp.blogspot.com/-anGtKQub2ZA/TckKPaMsMSI/AAAAAAAAAXs/-8mL6acPr-w/s200/works-on-my-machine-starburst_thumb2.png" alt="" id="BLOGGER_PHOTO_ID_5605022471086158114" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-7941726158404319589?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/7941726158404319589/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=7941726158404319589' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/7941726158404319589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/7941726158404319589'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/05/latex-code-listings-in-org-mode.html' title='latex code listings in org-mode'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-anGtKQub2ZA/TckKPaMsMSI/AAAAAAAAAXs/-8mL6acPr-w/s72-c/works-on-my-machine-starburst_thumb2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-702221956936285495</id><published>2011-05-06T10:10:00.008+01:00</published><updated>2011-05-06T13:23:08.871+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mis cosas'/><title type='text'>Technologically impaired office</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-3Yqk5yyVCfQ/TcPFUwkG1NI/AAAAAAAAAXk/ZrP67gI1IoU/s1600/technologically-impaired-duck.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 400px;" src="http://3.bp.blogspot.com/-3Yqk5yyVCfQ/TcPFUwkG1NI/AAAAAAAAAXk/ZrP67gI1IoU/s400/technologically-impaired-duck.jpg" alt="" id="BLOGGER_PHOTO_ID_5603539321803429074" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ok, I've already spent too much time trying to write a doc in openoffice to acknowledge that most of general user-friendly apps are for total technologically impaired ducks.  It's not that there are no shortcuts for everything, its much more simple than that.&lt;br /&gt;&lt;br /&gt;Every single function has a button for it. You want to indent a paragraph, ok, there's a button for it, outdent, another button... The fscking problem is I'm not in the mood of looking through all the buttons of all toolbars until I find it.  And guess what? Selecting a paragraph and pressing tab, just blows you paragaph away and adds a tab.&lt;br /&gt;&lt;br /&gt;My Technologically impaired solution.&lt;br /&gt;foreach @line {press(tab,↓,←)}&lt;br /&gt;&lt;br /&gt;Popups are the root of all evil.  Well, openoffice will nag you when the cursor is on a table, a numeration, or god knows what.&lt;br /&gt;&lt;br /&gt;Nested enumerations with styles, another shitstorm....  Copypastable formatting, font, background highlight and all the unwanted persistency of a place-and-format.  You will get signs from the past &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;red bold &lt;/span&gt;letters that lived in the place you're editing 3 centuries ago.&lt;br /&gt;&lt;br /&gt;For this and much more, I declare myself technologically impaired.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-702221956936285495?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/702221956936285495/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=702221956936285495' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/702221956936285495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/702221956936285495'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/05/technologically-impaired-office.html' title='Technologically impaired office'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-3Yqk5yyVCfQ/TcPFUwkG1NI/AAAAAAAAAXk/ZrP67gI1IoU/s72-c/technologically-impaired-duck.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-4473723146274670459</id><published>2011-04-26T17:16:00.010+01:00</published><updated>2011-04-26T18:17:24.183+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Perl, paths, local::lib and why I got stuck for a week</title><content type='html'>When writting &lt;a href="https://github.com/kidd/Ratfinder2"&gt;ratfinder2&lt;/a&gt;, I started testing it in console, and when the main structure kind of worked (the plugin system is for Yet Another Post(tm) ), I wrote the gui stuff, and plugged alltogether.  Everything worked ok when run from console. but if the program is executed directly through a ratpoison binding, the script didn't work.&lt;br /&gt;&lt;br /&gt;After some debugging time, and nothing seeming to make sense, trying &amp;amp;&amp;amp; failing while(1..Inf);... the solution is here.&lt;br /&gt;&lt;br /&gt;The thing is that when executing the perl script directly, .zshrc doesn't get executed, so the path isn't added.  Be able to run the script we can use 'use lib "/home/rgrau/perl5/lib/perl5";', or otherwise call the script with the -I flag setting the appropiate path.&lt;br /&gt;&lt;br /&gt;I suppose if you bind an icon on gnome/kde/windows to a perl program, you should be aware of that, and bind the icon to the appropiate command.&lt;br /&gt;&lt;br /&gt;so now, my ratpoisonrc line is like&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;bind j exec perl -I/home/kidd/perl5/lib/perl5 ~/bin/rat-finder.pl&lt;br /&gt;bind C-j exec perl -I/home/kidd/perl5/lib/perl5 ~/bin/rat-finder.pl&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I know it seems obvious now, that you should tell your perl where the modules are, but once you forget about local::lib.... It can't be unforgotten :).  The opposite of &lt;a href="http://assets.cantbeunseen.com/hashed_silo_content/silo_content/18053/resized/tooth.jpg?1267073881"&gt;TH&lt;/a&gt;&lt;a href="http://assets.cantbeunseen.com/hashed_silo_content/silo_content/18150/resized/i_see_zombies.jpg?1267095803"&gt;I&lt;/a&gt;&lt;a href="http://assets.cantbeunseen.com/hashed_silo_content/silo_content/18053/resized/tooth.jpg?1267073881"&gt;S&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-4473723146274670459?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/4473723146274670459/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=4473723146274670459' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/4473723146274670459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/4473723146274670459'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/04/perl-paths-locallib-and-why-i-got-stuck.html' title='Perl, paths, local::lib and why I got stuck for a week'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-9131134730523115076</id><published>2011-04-19T23:08:00.005+01:00</published><updated>2011-04-19T23:38:10.133+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Open2 for dummies</title><content type='html'>Some days ago I started rewriting ratfinder, and I'm trying to make it cleaner, smarter, more extensible, and (why not) have more fun programming it.&lt;br /&gt;&lt;br /&gt;The language of choice is still Perl5, because I'd like to keep in touch with the language, and keep learning new tools and libs for it.  Ruby is ok, but honestly, if we're not talking about god's purity (those two old languages), Perl is my favourite bitch.&lt;br /&gt;&lt;br /&gt;The first design decision was to make it extensible via a plugin system, where you provide a couple of methods, consume a role (Moose, yeah), and ratfinder2 will do 'the right thing'(tm).&lt;br /&gt;&lt;br /&gt;I'll talk about the plugin system in another post, but today, I had a simpler problem (at least at first sight).&lt;br /&gt;&lt;br /&gt;One of the multiple ways to spawn new processes in perl, is using the super-duper-overpowered-open primitive, with a pipe attached into the name of the process.  I still remember One of &lt;a href="http://nereida.deioc.ull.es/~pp2/perlexamples/node12.html"&gt;Casiano's example on it&lt;/a&gt;.  Quite mindblowing when you first see it.&lt;br /&gt;&lt;br /&gt;But what happens when you want not only INput OR OUTput pipes but INput AND OUTput pipes for a process?&lt;br /&gt;&lt;br /&gt;Hey, it's Perl, you know man, TIMTOWTDI. &lt;a href="http://search.cpan.org/~toddr/IPC-Run-0.89/lib/IPC/Run.pm"&gt;IPC::Run&lt;/a&gt;, &lt;a href="http://search.cpan.org/dist/Capture-Tiny/"&gt;Capture::Tiny&lt;/a&gt;, &lt;a href="http://search.cpan.org/perldoc?IPC::Cmd"&gt;IPC::Cmd&lt;/a&gt;.... but the standard way is, for the moment, &lt;a href="http://perldoc.perl.org/IPC/Open2.html"&gt;IPC::Open2&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It's usage may be trivial for you, but for me, the doc is a bit behind the times, as it uses GLOBS for handles, and the examples didn't clarify much for me.&lt;br /&gt;&lt;br /&gt;The key concept for me is knowing that the whole thing works when your write pipe is closed (at least it seems so), so if you can't make &lt;a href="http://www.davioth.com/pp2/node151.html"&gt;your host process close it&lt;/a&gt;, you should &lt;a href="http://mike.kruckenberg.com/archives/2004/01/using_iohandle.html"&gt;close it by yourself&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here's the part of relevant code in my Dmenu.pm&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/929872.js?file=Dmenu.pm"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;As usual, everything is public, undocumented, buggy, and &lt;a href="https://github.com/kidd/Ratfinder2"&gt;it's on github&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-9131134730523115076?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/9131134730523115076/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=9131134730523115076' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/9131134730523115076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/9131134730523115076'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/04/open2-for-dummies.html' title='Open2 for dummies'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-5001735966556708820</id><published>2011-04-04T16:26:00.004+01:00</published><updated>2011-04-05T09:15:08.226+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>What you can't see CAN hurt you (or, at least, annoy you)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-xnsSIzL4Hvg/TZodzeNmT3I/AAAAAAAAAXU/PxxeFPXzM88/s1600/how-do-i-get-rid-of-this-white-space.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 360px; height: 360px;" src="http://4.bp.blogspot.com/-xnsSIzL4Hvg/TZodzeNmT3I/AAAAAAAAAXU/PxxeFPXzM88/s400/how-do-i-get-rid-of-this-white-space.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5591814657454526322" /&gt;&lt;/a&gt;&lt;br /&gt;  &lt;br /&gt;Most of the times, and programming in sane (cough, cough)&lt;br /&gt;  programming languages, things like whitespaces, tabs and newlines&lt;br /&gt;  won't do you much harm. they work as separators for tokens (unless&lt;br /&gt;  in a string).&lt;br /&gt;&lt;br /&gt;  But that doesn't mean that you can't get trapped into some gotchas&lt;br /&gt;  related to whitespaces or newlines.  One example everyone has dealt&lt;br /&gt;  is lineFeed vs carryReturns vs CRLF.&lt;br /&gt;&lt;br /&gt;  There's a funny article from fxn on O'Reilly site talking about&lt;br /&gt;  &lt;a href="http://onlamp.com/pub/a/onlamp/2006/08/17/understanding-newlines.html"&gt;the secrets and gotchas of newlines&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;  As a long time vim user, and nearly a year of using emacs (with&lt;br /&gt;  different intesities), I care a lot about my editor features, and&lt;br /&gt;  one feature that's really useful is the 'select paragraph'. Both&lt;br /&gt;  emacs and vim can do this out of the box, but there are some&lt;br /&gt;  problems when you aren't careful enough and leave apparently blank&lt;br /&gt;  lines that are full of spaces, tabs or any invisible characters.&lt;br /&gt;&lt;br /&gt;  In vim, you can delete all trailing whitespaces with a simple&lt;br /&gt;  regex. Of course, you can create a command to do it for you, or even&lt;br /&gt;  map some keybinding to execute %s/\s\+$// , but I'm ok with typing 10 chars for it.&lt;br /&gt;&lt;br /&gt;  In emacs, of course there's a command for deleting trailing whitespaces, and, guess what?&lt;br /&gt;  it's called delete-trailing-whitespaces :) .&lt;br /&gt;&lt;br /&gt;  If you want emacs to show trailing whitespaces, there's a buffer-local variable called&lt;br /&gt;  show-trailing-whitespace that you can set to true. Here's the &lt;a href=" http://www.gnu.org/software/emacs/manual/html_node/emacs/Useless-Whitespace.html"&gt;official emacs doc&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;  Emacs has a command called 'whitespace-cleanup' that bundles some sane (configurable) rules to clean most annoyances related to whitespaces.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-5001735966556708820?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/5001735966556708820/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=5001735966556708820' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/5001735966556708820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/5001735966556708820'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/04/what-you-cant-see-can-hurt-you-or-at.html' title='What you can&apos;t see CAN hurt you (or, at least, annoy you)'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-xnsSIzL4Hvg/TZodzeNmT3I/AAAAAAAAAXU/PxxeFPXzM88/s72-c/how-do-i-get-rid-of-this-white-space.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-1684673191800302512</id><published>2011-04-01T20:58:00.002+01:00</published><updated>2011-04-06T11:33:02.966+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Modern Perl Toolchain, dip your toe</title><content type='html'>&lt;p&gt;Yesterday, we had another &lt;a href="http://barcelona.pm.org/"&gt;Bcn PerlMongers&lt;/a&gt; meeting, and &lt;a href="http://claimid.com/alexm"&gt;AlexM&lt;/a&gt; &lt;a href="http://www.slideshare.net/group/barcelonapm"&gt;showed us&lt;/a&gt; some nifty tools he's using in a project he's into.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Basically these are what in the perlsphere is called Modern Perl Toolchain.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Forget about cpan asking tons of questions, forget about only one&lt;br /&gt;location for modules.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;With the help of:&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?cpanm"&gt;cpanm&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?perlbrew"&gt;App::Perlbrew&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?dzill"&gt;Dist::Zilla&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;And some plugins for dzilla, you get isolated perl instalations, with&lt;br /&gt;their own modules (@INC), and a trully easy maintenance of&lt;br /&gt;Boilerplate.  In fact, it's as easy as it can get, because, you don't&lt;br /&gt;have to do any dedicated maintenance for them.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I had tried some of the old ways to package apps, and so, and when I&lt;br /&gt;saw the power of these 3 modules (I had already used cpanm, but..), I&lt;br /&gt;felt we got an autoshaving yak.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Here are &lt;a href="http://www.slideshare.net/alex.muntada/modern-perl-toolchain"&gt;the slides&lt;/a&gt; that AlexM kindly uploaded today.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;During the talk, some modules arouse to the conversation, and I&lt;br /&gt;took a look at some of them:&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?lib::xi"&gt;lib::xi&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;similar to &lt;a href="http://search.cpan.org/~casiano/"&gt;Casiano&lt;/a&gt;'s &lt;a href="http://search.cpan.org/dist/Remote-Use/"&gt;Remote::Use&lt;/a&gt;, but probably easier in its usage. a big win.&lt;/p&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?Devel::REPL"&gt;Devel::REPL&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?Carp::REPL"&gt;Carp::REPL&lt;/a&gt;&lt;p&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;That's the killer one for me. It hooks on die signal, and spawns a&lt;br /&gt;REPL and you have then access to the whole environment.  Great great great.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;If you want to set 'breakpoints' you can hook warns instead of just exceptions.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;And another cool feature is that you use it just enabling it from the commandline&lt;/p&gt;&lt;br /&gt;&lt;p&gt;perl -MCarp::REPL&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-1684673191800302512?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/1684673191800302512/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=1684673191800302512' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/1684673191800302512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/1684673191800302512'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/04/modern-perl-toolchain-dip-your-toe.html' title='Modern Perl Toolchain, dip your toe'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-8190466988464570667</id><published>2011-03-22T19:35:00.000Z</published><updated>2011-03-23T07:27:35.491Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='general programming'/><title type='text'>Managing the unmanageable with git</title><content type='html'>After 2 months using git regularly, there are a couple of things that I'd like to comment here, just for further adding on other posts.&lt;br /&gt;&lt;br /&gt;Mostly, for me there's a first blocker that is understanding how the global thing works. To solve this, I can recommend &lt;a href="http://www.newartisans.com/2008/04/git-from-the-bottom-up.html"&gt;git from the bottom up&lt;/a&gt;. a great introduction to git written quite differently from most other docs that want to explain the same.  Understanding the low level stuff helps you getting intuition, and IMHO it's essential to get this kind of intuition when using such holistic systems. &lt;br /&gt;&lt;br /&gt;Most tutorials give you the essential syntactic information that you can get from man (btw, man git-whatever will give you lots of info), but for me, knowing the workflow and how-to think gittish (or thinkgit if you prefer) is what bothered me most of the time.&lt;br /&gt;&lt;br /&gt;You probably have heard about &lt;a href="http://nvie.com/posts/a-successful-git-branching-model/"&gt;nvie's git workflow&lt;/a&gt;.  I haven't tried it yet, and at work we use a simpler workflow based on a remote master branch, two local branches (master,working) and quite centralized flow.&lt;br /&gt;&lt;br /&gt;Not being a git power user (I'd say I'm just scratching the surface) I'm going to write a couple of posts that are what I'd have needed when I started with it seriously.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Checkout - what happens when you checkout &lt;br /&gt;Clean - oops, I think I messed something&lt;br /&gt;Stash - Smashing the stash for fun and profit&lt;br /&gt;Rebase - commit -am 'fdsda'&lt;br /&gt;Bisect - It's always been that way NOT!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If you have suggestions or something to add, I hope you will comment.  Remember, I'm learning as I write these posts, so you can and MUST collaborate!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-8190466988464570667?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/8190466988464570667/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=8190466988464570667' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/8190466988464570667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/8190466988464570667'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/02/managing-unmanageable-with-git.html' title='Managing the unmanageable with git'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-7636781270377988492</id><published>2011-03-07T21:16:00.005Z</published><updated>2011-03-08T00:38:40.727Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Perl Higher Order Functions</title><content type='html'>I've been chit-chatting with a friend who's learning Perl5, and has written some little apps for his own needs.  While reviewing his code (not that I'm a programming guru, but I help with what I can), I talked about Higher order functions, and we ended writting some throwaway code to explain the idea.&lt;br /&gt;&lt;br /&gt;To clarify the concepts, I wrote some trivial scheme functions-as-data munging in scheme, and translated them to Perl.&lt;br /&gt;&lt;br /&gt;What surprised me, was the "wow!" comments about concepts that aren't perl unique features, but general higher order procedures.  Certainly, Java and C++ are 'a bit' behind Perl, Ruby, or Lisp, but it's fun to remember how mind blowing are these concepts to newcomers.  I discover mind-blowing concepts quite frequently too.&lt;br /&gt;&lt;br /&gt;We had a good afternoon, reviewing code, Quines, concurrency, talking about GEB (The book I'd take to a desert island along with SICP)...&lt;br /&gt;&lt;br /&gt;Here's part of the code we've written (as a reminder).  Nothing useful, but tiny proof of concept of &lt;a href="http://hop.perl.plover.com/"&gt;HOP&lt;/a&gt;. Ah, btw, I recommened him to read &lt;a href="http://www.onyxneon.com/books/modern_perl/index.html"&gt;chromatic's Modern Perl book&lt;/a&gt;.  I recomend it to all of you in the Perlsphere.  Great book.&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/859295.js?file=HOPtest.pl"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-7636781270377988492?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/7636781270377988492/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=7636781270377988492' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/7636781270377988492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/7636781270377988492'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/03/perl-higher-order-functions.html' title='Perl Higher Order Functions'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-1609830016895499859</id><published>2011-03-06T23:06:00.008Z</published><updated>2011-03-07T16:25:28.995Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>Window navigation on Emacs</title><content type='html'>Last week I was talking about some emacs features with a coworker (while talking about General User Interfaces, &lt;a href="http://www.useit.com/papers/anti-mac.html"&gt;pros and cons of WIMP&lt;/a&gt;), and ended with the doubt whether there is a way for easier window navigation on Emacs, or c-x o is the only way to go.&lt;br /&gt;&lt;br /&gt;I talked about one of the greatest aid to frame/window navigation of &lt;a href="http://www.gnu.org/software/screen/"&gt;screen&lt;/a&gt; and &lt;a href="http://ratpoison.nongnu.org/"&gt;ratpoison&lt;/a&gt;, that is window numbering, and being able to switch to random windows instead of just sequentially.&lt;br /&gt;&lt;br /&gt;Well, today I spent some time thinking about possible solutions, and searching for already implemented modes.&lt;br /&gt;&lt;br /&gt;Guess what? There are a couple of ways already implemented (in default emacs, or as an extra downloadable package).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.emacswiki.org/emacs/WindMove"&gt;&lt;span style="font-weight: bold;"&gt;Windmove&lt;/span&gt;&lt;/a&gt; comes bundled with emacs since 21-dot-something, and in fact is what vimpulse uses for the c-w [hjkl] emulation.&lt;br /&gt;&lt;pre&gt;(windmove-default-keybindings) ; enable shift-arrow&lt;br /&gt;&lt;/pre&gt;Expanding the concept further, there's also &lt;a href="http://www.emacswiki.org/emacs/FrameMove"&gt;&lt;span style="font-weight: bold;"&gt;FrameMove&lt;/span&gt;&lt;/a&gt;, that integrates seamlessly with windmove. &lt;a href="http://trey-jackson.blogspot.com/2010/02/emacs-tip-35-framemove.html"&gt;Here&lt;/a&gt;'s a little extra info about it.&lt;br /&gt;&lt;br /&gt;I found a couple of more esoteric plugins to navigate windows, but haven't tried them.&lt;br /&gt;http://blog.lathi.net/articles/2007/11/07/jumping-to-specific-windows-in-emacs explains how to jump to windows by title. I suppose like ido-mode or anything-buffers.&lt;br /&gt;&lt;br /&gt;There's also&lt;a href="https://github.com/dimitri/switch-window"&gt; https://github.com/dimitri/switch-window&lt;/a&gt; , that seems to bring ratpoison's numbering of frames to emacs' windows.  Nice idea.  Here follows a screenshot of switch-window from it's homepage.&lt;br /&gt;&lt;a href="http://tapoueh.org/images/emacs-switch-window.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 406px; height: 578px;" src="http://tapoueh.org/images/emacs-switch-window.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-1609830016895499859?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/1609830016895499859/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=1609830016895499859' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/1609830016895499859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/1609830016895499859'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/03/window-navigation-on-emas.html' title='Window navigation on Emacs'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-408606431594567833</id><published>2011-02-28T14:42:00.007Z</published><updated>2011-02-28T19:39:28.080Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='general programming'/><title type='text'>Programmer problem solving sequence</title><content type='html'>&lt;p&gt;2010 developer’s problem solving sequence:&lt;/p&gt; &lt;ol&gt;&lt;li&gt;Google&lt;/li&gt;&lt;li&gt;Coworkers&lt;/li&gt;&lt;li&gt;StackOverflow&lt;/li&gt;&lt;li&gt;RTFM&lt;/li&gt;&lt;li&gt;Think&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;It's funny because it's true.&lt;br /&gt;&lt;br /&gt;Via HN -&gt; &lt;a href="http://www.johndcook.com/blog/2010/10/22/programmer-problem-solving-sequence/"&gt;JCook&lt;/a&gt; -&gt; &lt;a href="http://twitter.com/activa/status/27926735875"&gt;Philippe Leybaert&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-408606431594567833?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/408606431594567833/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=408606431594567833' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/408606431594567833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/408606431594567833'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/02/programmer-problem-solving-sequence.html' title='Programmer problem solving sequence'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-8548038047631667669</id><published>2011-02-21T22:12:00.008Z</published><updated>2011-03-07T23:48:20.946Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>run interactive applications inside emacs</title><content type='html'>While implementing a more decent repl for &lt;a href="https://github.com/kidd/hascheme"&gt;HAScheme&lt;/a&gt;, I stumbled upon a nifty emacs feature: comint.&lt;br /&gt;&lt;br /&gt;To run an interactive shell, get history for free, and completion (at least hippie-expand if you teach your emacs to use it), you just have to use make-comint.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(defun run-has ()&lt;br /&gt; (interactive)&lt;br /&gt; (make-comint "has" "/path/to/hascheme/script/lis.pl" nil "/path/to/hascheme/script/builtins.scm"))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;the last parameter is the argv, you can fill it with whatever you want. In my case, the scheme file with some builtins.&lt;br /&gt;&lt;br /&gt;On the hascheme side, I've been experimenting with tail call optimitzation, an improved repl with multiline support and with some cool debugging features.  You'll know shortly about them if you follow this little blog of mine.&lt;br /&gt;&lt;br /&gt;Well, and here's a screenshot of the comint buffer on hascheme. note the completion thing on the minibuffer.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-Nlx4PpY5e6Q/TWLqnGRd-iI/AAAAAAAAAW4/6POpOghjY3s/s1600/screen.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 234px;" src="http://2.bp.blogspot.com/-Nlx4PpY5e6Q/TWLqnGRd-iI/AAAAAAAAAW4/6POpOghjY3s/s400/screen.jpg" alt="" id="BLOGGER_PHOTO_ID_5576277246057773602" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-8548038047631667669?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/8548038047631667669/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=8548038047631667669' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/8548038047631667669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/8548038047631667669'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/02/run-interactive-applications-inside.html' title='run interactive applications inside emacs'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-Nlx4PpY5e6Q/TWLqnGRd-iI/AAAAAAAAAW4/6POpOghjY3s/s72-c/screen.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-479631974518306985</id><published>2011-02-08T19:55:00.006Z</published><updated>2011-02-09T00:19:42.563Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><title type='text'>(let ((there be)) lisp)</title><content type='html'>&lt;p&gt;I keep having lots of fun with hascheme.  In the last couple of&lt;br /&gt;days, I implemented quite a few things.  Mostly they are syntax&lt;br /&gt;sugar for things you could already do in HAS, or useful procedures&lt;br /&gt;needed for my basic interpreter testing.&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Perl side&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;(define (fun args) body)&lt;/b&gt; is now accepted as an alternative way&lt;br /&gt;to declare procedures.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;(let)&lt;/span&gt; implemented. These bindings  for local vars are just sintactic sugar for&lt;br /&gt;what you'd write in perl:&lt;br /&gt;sub { my $a=shift; … }-&amp;gt;(initial&lt;sub&gt;val&lt;/sub&gt;)&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="https://github.com/kidd/hascheme/blob/master/script/builtins.scm"&gt;Scheme side&lt;/a&gt;&lt;br /&gt;Reread the '&lt;a href="http://www.cs.kent.ac.uk/people/staff/dat/miranda/"&gt;Why functional programming matters&lt;/a&gt;' paper, and implemented:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;make-counter, foldr&lt;/b&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;append, sum-list, length, map&lt;/b&gt; . All are specific cases of the previous&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;Reading chapter 4 of our MIT beloved book, I saw the next step, making a lazy&lt;br /&gt;interpreter from this Half Assed one.&lt;/p&gt;&lt;p&gt;Ah, the &lt;a href="https://github.com/kidd/hascheme"&gt;repo&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-479631974518306985?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/479631974518306985/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=479631974518306985' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/479631974518306985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/479631974518306985'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/02/let-there-be-lisp.html' title='(let ((there be)) lisp)'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-8703614841820358371</id><published>2011-02-07T18:43:00.000Z</published><updated>2011-02-07T18:43:00.063Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>Put more vim into your emacs</title><content type='html'>&lt;p&gt;&lt;br /&gt;I'm a vim editing model fan, but emacs is slowly crawling into my&lt;br /&gt;life.  emacs had viper (vi emulator) for ages, but it falls short if&lt;br /&gt;you're a vim power user.  Vi is not Vim.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;For some time there's been vimpulse package that tried to narrow the&lt;br /&gt;difference, adding Visual mode, and some other goodies.  Recently,&lt;br /&gt;&lt;a href="http://gitorious.org/vimpulse"&gt;vimpulse&lt;/a&gt; got reactivated, and now, we get text objects, and many&lt;br /&gt;other features from our beloved text editor.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;You can even use map, imap, vmap and the like;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;the first thing I tried was mapping jk to esc, but the tip in the&lt;br /&gt;vimpulse wiki didn't work. I managed to make it work with this line&lt;br /&gt;in my .emacs file.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;(vimpulse-imap "jk" 'viper-exit-insert-state)&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Now, there's no need to reach the far escape key.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-8703614841820358371?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/8703614841820358371/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=8703614841820358371' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/8703614841820358371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/8703614841820358371'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/02/put-more-vim-into-your-emacs.html' title='Put more vim into your emacs'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-5770639678876822367</id><published>2011-02-04T18:20:00.002Z</published><updated>2011-02-04T18:38:05.519Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><title type='text'>QuasiQuine</title><content type='html'>&lt;p&gt;Little updates to Hascheme, I finally implemented cons, car, cdr,&lt;br /&gt;and list as primitives, After implementing the prove that you can&lt;br /&gt;have datastructures in a language without no more ground than&lt;br /&gt;lambdas, I went for a bit more of efficiency (not that hascheme is&lt;br /&gt;going to be in production &lt;b&gt;ever&lt;/b&gt;, but you know&amp;hellip;) &lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Another motivation to implement lists as primitives is that this&lt;br /&gt;way, I can get a kind of homoiconicity.  If conses are implemented&lt;br /&gt;in the implemented language (scheme), a list will never be similar&lt;br /&gt;to code, because Perl never sees the datastructure as something it&lt;br /&gt;can deal with.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;And what's the ultimate motivation for having all this stuff&lt;br /&gt;working? &lt;i&gt;fun&lt;/i&gt;.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;I used a very common lisp quine to test that code and data are&lt;br /&gt;implemented internally the same way.  That gave a good testbed for&lt;br /&gt;quote too.  Unfortunately, using Perl Data::Dump* modules, I can't&lt;br /&gt;tune how lists are printed, and the final nil gets printed too.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Well, here's the proof that Half Assed Scheme can do Half Assed&lt;br /&gt;Quines.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/810500.js?file=quasiquine"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Next step, testing that closures work. (I'm afraid they don't work quite well)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-5770639678876822367?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/5770639678876822367/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=5770639678876822367' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/5770639678876822367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/5770639678876822367'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/02/quasiquine.html' title='QuasiQuine'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-5178777869647901731</id><published>2011-01-25T22:29:00.007Z</published><updated>2011-01-25T23:41:15.404Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><title type='text'>(cadr has)</title><content type='html'>&lt;p&gt;I've been hacking on HAS a bit more, to push forward its functionality.&lt;br /&gt;Mostly what's been achieved by now:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Perl side&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;(repl)&lt;/b&gt; primitive implemented. it acts as a debugger in some way,&lt;br /&gt;because it gives you the environment in the state of the moment&lt;br /&gt;when you executed it.  I couldn't implement it in scheme itself&lt;br /&gt;because I have no eval available from scheme.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Read plain files&lt;/b&gt;. As I started implementing some functionality&lt;br /&gt;in scheme, A scheme file must be loaded at start. just enter the&lt;br /&gt;file name as a parameter. Last sexp should be (repl) to have&lt;br /&gt;your repl available.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Comments&lt;/b&gt;. ';' is the comment marker&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;=&lt;/b&gt; operator&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;nil&lt;/b&gt;. transformed to 0.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;list&lt;/b&gt;. yeah. As HAScheme can't understand variable length&lt;br /&gt;arguments, I implemented it to make it more confortable to build&lt;br /&gt;lists.  It's built on an ugly hack. More on that later.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Scheme side&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;cons, car, cdr&lt;/b&gt;. Implemented basic structures. Implemented as&lt;br /&gt;lambdas. as in SICP, somewhere in chapter 2 IIRC. Simple though&lt;br /&gt;impressive  IMHO (and inefficient, but…)&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;print_list&lt;/b&gt;. conses down a list and prints each element in a&lt;br /&gt;line&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I run it using builtins.scm as the first parameter, and then, repl is&lt;br /&gt;yours, with lists and conses available for you.&lt;br /&gt;&lt;/p&gt;&lt;h3 id="sec-2"&gt;Now the not-so-beautiful parts &lt;/h3&gt;&lt;p&gt;&lt;br /&gt;If I want lists, I just have to nest conses, but who doesn't want a&lt;br /&gt;litte luxury?.&lt;br /&gt;&lt;/p&gt;To implement list, I've thought 3 possible solutions (haven't read&lt;br /&gt;&lt;p&gt;about how to implement them correctly, just brainstorming):&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Variable actual arguments. If I could implement the dot (.) syntax&lt;br /&gt;for variable number of arguments, I could implement list as a&lt;br /&gt;simple scheme function.  Problem is that I need lists to stash&lt;br /&gt;the resting parameters (hascheme lists, not Perl ), and I haven't thought how to bootstrap.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Write a new primitive (on the perl side) that builds the correct&lt;br /&gt;cons structures, on the perl side.  Mind you, that list is &lt;b&gt;VERY&lt;/b&gt;&lt;br /&gt;coupled to cons implementation. And quite fuzzy on the perl side&lt;br /&gt;too.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Substitute list for the appropiate number of conses (as a string),&lt;br /&gt;and let the already written parser do the job. That's the one I implemented.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Probably, I'll start from the scratch building another scheme interpreter, following BillHails book.  Or at least, I'll go as far as my motivation and brain allow me.&lt;br /&gt;&lt;br /&gt;That's all for now. Here's my &lt;a href="http://puntoblogspot.blogspot.com/2011/01/i-can-has-has-half-assed-scheme.html"&gt;other post about Hascheme&lt;/a&gt;, and the &lt;a href="https://github.com/kidd/hascheme"&gt;github repo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Byez.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-5178777869647901731?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/5178777869647901731/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=5178777869647901731' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/5178777869647901731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/5178777869647901731'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/01/cdr-has.html' title='(cadr has)'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-5107040753158752488</id><published>2011-01-23T18:31:00.005Z</published><updated>2011-04-27T11:42:36.798+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><title type='text'>I can has HAS (Half Assed Scheme)</title><content type='html'>&lt;p&gt;&lt;br /&gt;If you've been reading along these bloglines, you already know I'm on&lt;br /&gt;my way to learn lisp, and given that a typical exercise on the lispers&lt;br /&gt;path is writing a scheme interpreter, I decided to try to impement a&lt;br /&gt;scheme interpreter in perl.  I had a great guidance of &lt;a href="http://norvig.com/lispy.html"&gt;Peter Norvig's lispy&lt;/a&gt; tutorial, and more thoughtful explanations from &lt;a href="http://billhails.net/Book/"&gt;Bill Hails' book&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;I can't say I wrote it as quick as I thought I would, and it could&lt;br /&gt;definately be clearer (OOP in such small projects is clearly&lt;br /&gt;overengineering), but in the end, it works, and given the fact that I&lt;br /&gt;hadn't been programming perl at work for 2 months, it's been a good exercice.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;The relevant code is in 4 files,&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt; script/lis.pl (REPL and primitives),&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt; lib/hascheme/Reader.pm (Parsing)&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt; lib/hascheme/Env.pm (environment, a tree structure built on hashes)&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt; lib/hascheme/Evaluator.pm (special operators are treated here, and overall evaluation)&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Anyway, here you are, the code is in a &lt;a href="https://github.com/kidd/hascheme"&gt;github repo&lt;/a&gt;. For now, It's&lt;br /&gt;called half assed scheme, or hascheme, or HAS.&lt;br /&gt;&lt;/p&gt;Related article:&lt;a href="http://puntoblogspot.blogspot.com/2011/01/cdr-has.html"&gt; next post on HAS&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Now, you can has HAS too.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-5107040753158752488?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/5107040753158752488/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=5107040753158752488' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/5107040753158752488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/5107040753158752488'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/01/i-can-has-has-half-assed-scheme.html' title='I can has HAS (Half Assed Scheme)'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-5616525565714959484</id><published>2011-01-06T02:20:00.005Z</published><updated>2011-01-06T15:01:32.790Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>generate Moose classes from CLI</title><content type='html'>It seems I've been a bit out of Perl lately (last 2 or 3 weeks), but that's not completely true.&lt;br /&gt;&lt;br /&gt;I have a couple of projects in mind (one bigger than the other, but both interesting nonetheless), but I have not been in my best moods to program... difficulties to focus.  At work, I do exactly 0% perl :(, so I have to push myself to use it...&lt;br /&gt;&lt;br /&gt;In one of my projects I'm using OOP intensively (maybe overengineering?, we'll see), and I always tend to forget how to correctly set up a bare Moose class.&lt;br /&gt;&lt;br /&gt;So here's what I've written:&lt;br /&gt;&lt;script src="https://gist.github.com/767409.js?file=genclass.pl"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Just a simple script that generates scaffolds for Moose classes and gives a couple of hints on attributes' properties.  A good friend of the &lt;a href="http://puntoblogspot.blogspot.com/2009/05/last-week-on-perl-programming.html"&gt;script template&lt;/a&gt; I did some time ago&lt;br /&gt;&lt;br /&gt;I've tried to make it work the most DWIM-Y way, so you call it like "genclass.pl lib/My/App/Entity" , and generates My::App::Entity class in the appropiate path and with appropiate namespace.&lt;br /&gt;&lt;br /&gt;SeeYapp! ;p&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-5616525565714959484?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/5616525565714959484/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=5616525565714959484' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/5616525565714959484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/5616525565714959484'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/01/generate-moose-classes-from-cli.html' title='generate Moose classes from CLI'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-5717272295332204017</id><published>2011-01-04T07:50:00.007Z</published><updated>2011-01-05T13:32:45.974Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><title type='text'>If you want a thing done well ....</title><content type='html'>...and continuously, and consistent way, let the computer do it for you.&lt;br /&gt;&lt;br /&gt;gem install ZenTest&lt;br /&gt;gem install autotest-rails&lt;br /&gt;gem install redgreen&lt;br /&gt;&lt;br /&gt;If you're on MAC:&lt;br /&gt;&lt;br /&gt;gem install autotest-fsevent&lt;br /&gt;echo "require 'autotest/fsevent'\nrequire 'redgreen'" &gt;&gt; ~/.autotest&lt;br /&gt;&lt;br /&gt;If you're on GNU/Linux&lt;br /&gt;&lt;br /&gt;gem install autotest-inotify&lt;br /&gt;echo "require 'autotest/inotiny'\nrequire 'redgreen'" &gt;&gt; ~/.autotest&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;just run 'autotest' from your project root directory, and it will run the relevant tests on your modified files.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-5717272295332204017?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/5717272295332204017/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=5717272295332204017' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/5717272295332204017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/5717272295332204017'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/01/if-you-want-thing-done-well_04.html' title='If you want a thing done well ....'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-9070282019499664291</id><published>2011-01-02T18:38:00.003Z</published><updated>2011-01-02T18:52:15.548Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><title type='text'>git, now it's your time!</title><content type='html'>At work, we're using git as our VCS.  I am still on the process of fully understanding it.&lt;br /&gt;&lt;br /&gt;Well, digging a bit on git workflows, I found a couple of posts that helped me to understand git a bit more.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://object.io/site/2010/12/hack-and-ship/"&gt;Git hack and ship scripts&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://nvie.com/posts/a-successful-git-branching-model/"&gt;nvie git branching model&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And now, &lt;a href="https://github.com/michaeldv/pit"&gt;pit&lt;/a&gt; a project I recently saw on github, that integrates git commits with task and ticketing systems. Everything, in &lt;a href="http://puntoblogspot.blogspot.com/2010/12/text-driven-xyz.html"&gt;Text Driven Development&lt;/a&gt;, you know :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-9070282019499664291?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/9070282019499664291/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=9070282019499664291' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/9070282019499664291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/9070282019499664291'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2011/01/git-now-its-your-time.html' title='git, now it&apos;s your time!'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-7645238154572241130</id><published>2011-01-02T13:32:00.000Z</published><updated>2011-01-02T18:37:35.277Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='general programming'/><title type='text'>The best 'The best  X of 2010' of 2010</title><content type='html'>Here you have a bunch of rankings about best * (whatever) of 2010.&lt;br /&gt;&lt;br /&gt;&lt;a href=" http://blog.fogus.me/2010/12/30/the-best-things-in-2010/"&gt;&lt;br /&gt;fogus' best things of 2010&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.switched.com/2010/12/30/best-technology-writing-of-2010/"&gt;switched.com best-technology-writing-of-2010/&lt;/a&gt;&lt;br /&gt;&lt;a href=" http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis"&gt;&lt;br /&gt;review comparing most successful oodb of 2010&lt;/a&gt;&lt;br /&gt;&lt;a href=" http://11011110.livejournal.com/211518.html"&gt;Top ten algorithm preprints of 2010&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jeffhuang.com/best_paper_awards.html"&gt;great papers from 2010, and before :)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=" http://www.r-statistics.com/2011/01/r-bloggers-in-2010-top-14-r-posts-site-statistics-and-invitation-for-sponsors/"&gt;&lt;br /&gt;14 R posts, with statistics and datamining  stuff inside&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bye, and see you in next posts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-7645238154572241130?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/7645238154572241130/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=7645238154572241130' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/7645238154572241130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/7645238154572241130'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2010/12/best-best-x-of-2010-of-2010.html' title='The best &apos;The best  X of 2010&apos; of 2010'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-70367351106803567</id><published>2010-12-20T15:42:00.005Z</published><updated>2010-12-20T23:58:53.112Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='mis cosas'/><category scheme='http://www.blogger.com/atom/ns#' term='general programming'/><title type='text'>PLOP Loops Over PLOP</title><content type='html'>Quines, like JAPHS, are great hobbies for us, little riddle-solvers.&lt;br /&gt;Here are the 3 most amazing quines I found lately.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.sigfpe.com/2008/02/third-order-quine-in-three-languages.html"&gt;third order quine&lt;/a&gt; . And here's a &lt;a href="http://stackoverflow.com/questions/1347578/any-idea-about-constructing-a-higher-order-quine-program"&gt;SO post&lt;/a&gt; discussing a bit about it&lt;br /&gt;&lt;br /&gt;&lt;a href="http://mamememo.blogspot.com/2010/09/qlobe.html"&gt;ruby rotating earth quine&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://d.hatena.ne.jp/ku-ma-me/20090916"&gt;The new kid on the block&lt;/a&gt;. Judge yourself.  &lt;br /&gt;&lt;br /&gt;For those who didn't bother to google or wikisearch, here's a &lt;a href="http://www.madore.org/~david/computers/quine.html"&gt;quine guide&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And here, a lisp quine that shows the greatness of simplicity.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;((lambda (x) (list x (list 'quote x))) &lt;br /&gt; '(lambda (x) (list x (list 'quote x))))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;PS: This post is under 'mis cosas' (personal) tag, because there's much more than programming involved in the mind process to understand these things. So yes, quines are a cool concept even IRL.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-70367351106803567?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/70367351106803567/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=70367351106803567' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/70367351106803567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/70367351106803567'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2010/12/plop-loops-over-plop.html' title='PLOP Loops Over PLOP'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-4023198192243327923</id><published>2010-12-18T12:32:00.006Z</published><updated>2010-12-20T07:40:17.273Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='smalltalk'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><category scheme='http://www.blogger.com/atom/ns#' term='general programming'/><title type='text'>Text Driven Development</title><content type='html'>As I already posted, I got a new job in Barcelona, doing mostly apps in &lt;a href="http://rubyonrails.org/"&gt;Rails&lt;/a&gt; (particularly &lt;a href="http://www.ubiquo.me/"&gt;ubiquo&lt;/a&gt;, cms)&lt;br /&gt;&lt;br /&gt;Luckily, the company is pro-gnu, so I can use linux with all my usual configs.  Using ratpoison in a double screen is an awesome experience.&lt;br /&gt;&lt;br /&gt;For the moment I lived between the two worlds (gnome vs ratpoison) because I'm continuously asking things to more experienced people, and they usually want to use the mouse when they are on my computer. And I haven't &lt;a href="http://blog.leroygardner.com/ruby-on-rails-development-on-ubuntu-1010-with"&gt;configured everything&lt;/a&gt; yet.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Outlines&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Last week, I was assigned a project and was given a 100+ pages document with the functional analysis of the project.  First thing to do was reading it and making good outlines of it to create a mental model of the program.&lt;br /&gt;&lt;br /&gt;I decided to use &lt;a href="http://www.blogger.com/www.gnu.org/software/emacs/"&gt;emacs&lt;/a&gt; &lt;a href="http://orgmode.org/"&gt;org-mode&lt;/a&gt; to do the outlinings, and probably the TODOs and Schedules.  IT's pretty neat, and doing everything with text files gives me a kind of relief, that everything is under control.  In fact, that's one of the things that gets on my nerves about pharo.  Being able to use your well known tools in a synergic way is great (IMHO)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;UML&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;After that, I created an UML class diagram. &lt;br /&gt;"We use argouml" someone said.  Well, argouml has improved amazingly since the last time I tried it, but honestly, for me it doesn't cut.  It has some kind of code generator (for java) and some design-critics, that seem cool enough to use it, but given that the web development constrains you to use minimal oop features, I could not listen to the design-lint.&lt;br /&gt;&lt;br /&gt;After finishing the damn UML, I looked for other tools that could do pretty UML diagrams from ascii.  And &lt;a href="http://modeling-languages.com/blog/content/uml-tools-textual-notations-define-uml-models"&gt;they do exist&lt;/a&gt;. Great! I'll try to use them the next time.  I think &lt;a href="http://plantuml.sourceforge.net/"&gt;plantuml&lt;/a&gt; is a fairly good option and, guess what? you can integrate it in &lt;a href="http://zhangweize.wordpress.com/2010/08/25/creating-uml-images-by-using-plantuml-and-org-babel-in-emacs/"&gt;emacs&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Slides&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;On the other side, on wednesday, I did a talk at &lt;a href="http://www.smalltalk.cat/"&gt;smalltalk.cat&lt;/a&gt; about pharo regexes.  The slides where presented in a terminal, in plain ASCII, using a small app borrowed from fxn.  Btw, the talk went pretty well.  Very informal and kind of simple for people versed in regexes (smalltalk regexes do not have any special unique feature but the opposite, a bit simple IMO), but I think maybe 30% of the people didn't know about regexes and used them just copypasting, so I extended my talk to touch some more theoric side, and in the end, I think everyone learned something.&lt;br /&gt;&lt;br /&gt;Btw, if you feel like implementing a regex engine for smalltalk, you can get ideas from &lt;a href="http://swtch.com/~rsc/regexp/regexp1.html"&gt;this paper&lt;/a&gt;. A good read IMHO&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-4023198192243327923?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/4023198192243327923/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=4023198192243327923' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/4023198192243327923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/4023198192243327923'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2010/12/text-driven-xyz.html' title='Text Driven Development'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-223309884845966543</id><published>2010-12-02T19:53:00.007Z</published><updated>2010-12-02T21:05:23.855Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><title type='text'>HAHA! You're not regular anymore!1</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_aRXkF2maASc/TPgIdEgvdXI/AAAAAAAAAWA/eKY35ciZAzI/s1600/regularExprNot.jpeg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 287px;" src="http://2.bp.blogspot.com/_aRXkF2maASc/TPgIdEgvdXI/AAAAAAAAAWA/eKY35ciZAzI/s400/regularExprNot.jpeg" border="0" alt=""id="BLOGGER_PHOTO_ID_5546192236627064178" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Via HN I saw praprog released another magazine, this one fully dedicated to ruby (What a coincidence! :) )&lt;br /&gt;&lt;br /&gt;I skimmmed all the articles but paying more attention to a couple of them:&lt;br /&gt;&lt;br /&gt;One of them talk about &lt;a href="http://pragprog.com/magazines/2010-12/whats-new-in-ruby-"&gt;new features of Ruby 1.9.2&lt;/a&gt;.  It seems ruby is getting faster and faster on every release (a good thing since speed is one of the major 'problems' I had read about ruby). &lt;br /&gt;&lt;br /&gt;Another place where it has improved is on the regex side.  Now ruby regexes allow named captures (feature added to perl in 5.10 IIRC), and recursive regexes (The not-so-regular regexes are here) there are some flags like /x /g and /k, that let you reference captures more easily than plain old \1, \2 ... &lt;br /&gt;&lt;br /&gt;All in all, quite cool stuff that makes me feel a bit more at (perl) home.&lt;br /&gt;&lt;br /&gt;Unfortunately, I couldn't practice with rails yet.  I did some progress on ruby koans though.  A busy week in Tenerife.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-223309884845966543?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/223309884845966543/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=223309884845966543' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/223309884845966543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/223309884845966543'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2010/12/haha-youre-not-regular-anymore1.html' title='HAHA! You&apos;re not regular anymore!1'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_aRXkF2maASc/TPgIdEgvdXI/AAAAAAAAAWA/eKY35ciZAzI/s72-c/regularExprNot.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-4003736525731017790</id><published>2010-11-20T22:46:00.002Z</published><updated>2010-12-03T16:38:50.077Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><title type='text'>I'm a LOL programmer (wannabie)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_aRXkF2maASc/TOG4ugZ3gFI/AAAAAAAAAV4/vYnAWt4CkgE/s1600/ROR.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 302px; height: 400px;" src="http://1.bp.blogspot.com/_aRXkF2maASc/TOG4ugZ3gFI/AAAAAAAAAV4/vYnAWt4CkgE/s400/ROR.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5539912125754343506" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In my new job, it seems I'll be writing ruby (on rails).&lt;br /&gt;&lt;br /&gt;I've been trying the language in my spare time, and it seems a fairly good compromise between Perl and Smalltalk.&lt;br /&gt;&lt;br /&gt;Except a couple of features or idioms I saw, everything else was quite intuitive or easy to understand (at least coming from Perl/Smalltalk).&lt;br /&gt;&lt;br /&gt;+ Sigils do exist, but denote scope oposed to type.&lt;br /&gt;+ __DATA__&lt;br /&gt;+ '=' can be part of a method name. And there's some magic involved there. def method=(attr) can be used as an assignment (sintactically) as parens are optional.&lt;br /&gt;+ Integer class can be expanded or subclassed.&lt;br /&gt;&lt;br /&gt;Here are the codes I wrote to grasp the language.  These are the usual examples I write in every language I try to learn:&lt;br /&gt;&lt;br /&gt;- a program to center paragraphs.&lt;br /&gt;- guessing number &lt;br /&gt;- Network with hosts that pass messages one to the other.&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/676192.js"&gt; &lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Here is a link that I found useful about ruby patterns and idioms.&lt;br /&gt;http://scriptlandia.blogspot.com/2009/02/design-patterns-in-ruby.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-4003736525731017790?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/4003736525731017790/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=4003736525731017790' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/4003736525731017790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/4003736525731017790'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2010/11/im-lol-programmer-wannabie.html' title='I&apos;m a LOL programmer (wannabie)'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_aRXkF2maASc/TOG4ugZ3gFI/AAAAAAAAAV4/vYnAWt4CkgE/s72-c/ROR.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-3744382757087079140</id><published>2010-11-15T21:00:00.009Z</published><updated>2010-11-15T22:34:05.983Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='mis cosas'/><category scheme='http://www.blogger.com/atom/ns#' term='general programming'/><title type='text'>Last but not least</title><content type='html'>I'm leaving my current $work, and changing to another one.  Being the first one I'm starting not as an university student but a 'professional' one feels strange, and I'm somewhat thrilled.  Will I be good enough for the job? I hope so :)&lt;br /&gt;&lt;br /&gt;These last days I'm reviewing some of my old code with the guy who will inherit my codes.  A cool programmer, with lots of knowledge I wouldn't expect from an average young programmer (it's actually a bit older than me but, you know... not everyone reads 'refactoring', code complete, and GoF just for fun :) ).  We've had good times.  Transfering info would be quite more difficult without such a good learner.  In little less than a week, he also explained me some ins and outs about some agile methodologies, or good programming practices (some cool refactorings, Log4X modules, etc...). We both learned quite a lot from each other.&lt;br /&gt;&lt;br /&gt;Some of the neat advices that I liked.&lt;br /&gt;&lt;br /&gt;- use &lt;a href="http://search.cpan.org/perldoc?Log::Log4perl"&gt;Logging&lt;/a&gt; modules. They pay off. And they are quite easy to set up (opposed to what I thought)&lt;br /&gt;- refactor any piece of code that is repeated more than 1 time (if it's easy to do).  calling a simple join(',' , @array) three times in the same function can be refactored into a meaningful name sub. You get the name explaining what your code does, and if you want to change ',' to ':', only one change does it.&lt;br /&gt;- Codes that you write separated by 2 newlines, like paragraphs, and start with a comment that explains what that snippet does, are screaming for a new function. You can use the first words of the comment as a hint for the function name.&lt;br /&gt;- Take a look at AOP, it's cool. a really cool thing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-3744382757087079140?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/3744382757087079140/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=3744382757087079140' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/3744382757087079140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/3744382757087079140'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2010/11/last-but-not-least.html' title='Last but not least'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-6914829247547924406</id><published>2010-11-04T11:12:00.004Z</published><updated>2010-11-04T20:14:03.674Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>I'm in ur shell, watching your repos</title><content type='html'>I'm using more and more a little script that &lt;a href="http://c9s.blogspot.com/2010/09/cpans-bash-version.html"&gt;Cornelius&lt;/a&gt; called  cpans.sh (for cpan search)&lt;br /&gt;&lt;br /&gt;It's dead simple, but great anyway, and, it lets me use ratfinder to browse cpan modules. And to give credit where the credit is due, I'll just embed his gist.&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/564945.js?file=cpans.sh"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Simple idea, neatly used. curl, file tests, zgrep and some bash bits.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-6914829247547924406?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/6914829247547924406/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=6914829247547924406' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/6914829247547924406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/6914829247547924406'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2010/11/im-in-ur-shell-watching-your-repos.html' title='I&apos;m in ur shell, watching your repos'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-441438804205299877</id><published>2010-10-18T12:09:00.006+01:00</published><updated>2010-10-19T11:46:53.291+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='general programming'/><title type='text'>Courier new WTF (or, monospaced is not enough)</title><content type='html'>Via &lt;a href="http://www.reddit.com"&gt;reddit&lt;/a&gt; , I found &lt;a href="http://www.reddit.com/r/programming/comments/drsd3/seriously_who_the_fuck_is_responsible_for_this/"&gt;this pearl&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_aRXkF2maASc/TLwr8F_Y0iI/AAAAAAAAAVs/y07oNhY-6lc/s1600/courierNewWTF.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 215px;" src="http://3.bp.blogspot.com/_aRXkF2maASc/TLwr8F_Y0iI/AAAAAAAAAVs/y07oNhY-6lc/s400/courierNewWTF.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5529342753904316962" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;From &lt;a href="http://en.wikipedia.org/wiki/Courier_(typeface)"&gt;wikipedia&lt;/a&gt;:&lt;br /&gt;Courier New is used extensively in programming. For example, online forums, such as phpBB, SMF, and vBulletin, will use Courier New for &amp;lt;code&amp;gt; blocks; on Microsoft Windows it is a default monospaced font for a variety of applications, such as Notepad, Visual Studio (although the Consolas font family is provided as an alternative&lt;br /&gt;&lt;br /&gt;Seriously, if you have to write code, go and get a font that doesn't &lt;a href="http://i.huffpost.com/gen/185094/COMIC-SANS.jpg"&gt;suck&lt;/a&gt;. Monospaced is not enough.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-441438804205299877?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/441438804205299877/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=441438804205299877' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/441438804205299877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/441438804205299877'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2010/10/courier-new-wtf-or-monospaced-is-not.html' title='Courier new WTF (or, monospaced is not enough)'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_aRXkF2maASc/TLwr8F_Y0iI/AAAAAAAAAVs/y07oNhY-6lc/s72-c/courierNewWTF.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-7222505309423709528</id><published>2010-10-15T08:24:00.012+01:00</published><updated>2010-10-25T11:12:58.808+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='general programming'/><title type='text'>ubigraph: an interactive 3D graph creator</title><content type='html'>A few days ago I read &lt;a href="http://jkkramer.wordpress.com/2010/08/27/fun-with-clojure%C2%A0turning-cats-into-dogs-in-hanoi/"&gt;a funny post&lt;/a&gt; on HN.  A guy was presenting some clojure code that used &lt;a href="http://ubietylab.net/ubigraph/"&gt;ubigraph&lt;/a&gt;to produce 3d navigable graphs.&lt;br /&gt;&lt;br /&gt;To make  ubigraph portable and interoperable with many languages, they present the app as an independent window (embedable, I hope) with its own process that acts as a XML-RPC server, so if you don't have an specific API for your language, you can use plain XML-RPC calls.&lt;br /&gt;&lt;br /&gt;I've written a simple fibonacci function with a callback that draws the flow of the calculations.&lt;br /&gt;Here's the code, and a (static) image of the graph.&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/611451.js?file=ubigraph.pl"&gt;&lt;/script&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_aRXkF2maASc/TLgMDFYsmpI/AAAAAAAAAVY/ENQ0syCgAbE/s1600/screen.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://3.bp.blogspot.com/_aRXkF2maASc/TLgMDFYsmpI/AAAAAAAAAVY/ENQ0syCgAbE/s400/screen.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5528181789722188434" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To See how memoizing works, I've modified the code a bit using &lt;a href="http://search.cpan.org/perldoc?Memoize"&gt;Memoize&lt;/a&gt; and a normalizer function and now we see how the number of steps is O(n).&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/627816.js?file=memofib.pl"&gt;&lt;/script&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_aRXkF2maASc/TLgK0JuPIjI/AAAAAAAAAVQ/SH0pMl3LO08/s1600/screen.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 248px;" src="http://2.bp.blogspot.com/_aRXkF2maASc/TLgK0JuPIjI/AAAAAAAAAVQ/SH0pMl3LO08/s400/screen.jpg" alt="" id="BLOGGER_PHOTO_ID_5528180433676608050" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-7222505309423709528?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/7222505309423709528/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=7222505309423709528' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/7222505309423709528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/7222505309423709528'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2010/10/ubigraph-interactive-3d-graph-creator.html' title='ubigraph: an interactive 3D graph creator'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_aRXkF2maASc/TLgMDFYsmpI/AAAAAAAAAVY/ENQ0syCgAbE/s72-c/screen.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-6584556381889099965</id><published>2010-09-19T21:16:00.005+01:00</published><updated>2010-09-28T09:57:41.619+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='smalltalk'/><title type='text'>ESUG 2010: It's awesomeness all way down</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.a3aan.st/esug2010/index.php/view/2/02+Camp+Smalltalk/IMG_1698.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 600px;" src="http://www.a3aan.st/esug2010/index.php/image/800x600/02+Camp+Smalltalk/IMG_1698.JPG" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ESUG 2010 was held at Barcelona (well, technically, Cornellà).  For people that don't know what's ESUG, it's one of the most important smalltalk events worldwide.&lt;br /&gt;&lt;br /&gt;A week full of talks, great fun, hours of hacking and chatting with other smalltalkers.&lt;br /&gt;&lt;br /&gt;The weekend before the conference, citilab was open to all smalltalkers who wanted to participate in the SmalltalkCamp.  Two days of coding and meeting with other smalltalkers.  I started rereading the seaside book and got &lt;a href="http://www.a3aan.st/esug2010/index.php/view/9/02+Camp+Smalltalk/IMG_1722.JPG"&gt;some help from Bernat&lt;/a&gt;.  It was fun to see the creators of what I was trying to understand (seaside) walking and coding around.  Another nice curiosity was when someone entered the SmalltalkCamp with an OOPSLA t-shirt.  It was like: "wow, important people around!" :)&lt;br /&gt;&lt;br /&gt;Monday, at 9:00 the conference started officially, but by then, I had already met some great smalltalkers.&lt;a href="http://www.esug.org/wiki/pier/Conferences/2010/SchedulePDF?_s=M2Oaf8uZbHiwmtKL&amp;amp;_k=nCu6ik8gYjI36xvM&amp;amp;view=PRDownloadView&amp;amp;_n&amp;amp;27"&gt; Here is the schedule&lt;/a&gt; of the whole esug.&lt;br /&gt;&lt;br /&gt;90% of the talks where amazing, I mean, good contents, with an accurate dose of humour, and talks given by people with nice speech skills.&lt;br /&gt;&lt;br /&gt;Xtreams (Martin Kobetic), Design decisions behing Patagonia(Hernán Wilkinson), All Esteban Lorenzano's talks (mars and reef), Helvetia (Lukas Renggli), Stephane Ducasse's talks, Richie and ..... too many good ones to remember the name of all.&lt;br /&gt;&lt;br /&gt;Citilab made a great job organizing it all, and we, the local group had very little to do (thanks to volunteers too).  Myself I just had to help some people with maps, subways and take some smalltalkers to 'visit' Barcelona. :)&lt;br /&gt;&lt;br /&gt;I bought a special edition of the seaside book and got it signed by Ducasse and Renggli. WOW!&lt;br /&gt;&lt;br /&gt;Well, it's been a short and late post, but I can't write a post with all cool things I learned there, so it's more a "I've survived" post than a "hey, look what they showed us".&lt;br /&gt;&lt;br /&gt;Soon, citilab will make the recordings of &lt;span style="font-weight: bold;"&gt;ALL&lt;/span&gt; the talks available on the web.  I think they'll be hosted in cincom's servers.  I'll post about that when it effectively happens.&lt;br /&gt;&lt;br /&gt;I met many people and had lots of fun talking not only about smalltak but technology in general, and life, universe and everything.  Mostly argentinians but not only them. Gabriel, Gabriela, &lt;a href="http://objectmodels.blogspot.com/"&gt;Hernán Wilkinson&lt;/a&gt;, Leandro, &lt;a href="http://wiki.squeak.org:8080/squeak/1762"&gt;Richie&lt;/a&gt;, Javi, &lt;a href="http://nicopaez.wordpress.com/"&gt;Nico&lt;/a&gt;, Ricardo, Esteban Lorenzano,... Great people.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://picasaweb.google.com/hernan.wilkinson/Barcelona2010SocialEvent#5517418241272145458"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 640px; height: 480px;" src="http://lh3.ggpht.com/_MFPZ3JVsnfE/TJHOqGxJZjI/AAAAAAAAHyc/Ci7ax1s-UrQ/s640/DSCN3434.JPG" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-6584556381889099965?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/6584556381889099965/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=6584556381889099965' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/6584556381889099965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/6584556381889099965'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2010/09/esug-2010-its-awesomeness-all-way-down.html' title='ESUG 2010: It&apos;s awesomeness all way down'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_MFPZ3JVsnfE/TJHOqGxJZjI/AAAAAAAAHyc/Ci7ax1s-UrQ/s72-c/DSCN3434.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-535974960045639</id><published>2010-09-07T11:42:00.016+01:00</published><updated>2010-09-08T21:58:19.028+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Capture the flag with Moose</title><content type='html'>In today's post, I'll show some ways to get program options via flags (--flags) I discovered recently.&lt;br /&gt;&lt;br /&gt;CPAN is crowded with Getopt::* modules, but I'm going to explore the Moose universe.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;a href="http://search.cpan.org/perldoc?Moose"&gt;Moose&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;At $work, we often have write commandline apps that end with lots of parameters and flags, and 'shift @ARGV' is not an elegant nor flexible solution.  I've been using GetOpt::Long for years, but now, using Moose, I discovered an extension Called MooseX::Getopt.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;a href="http://search.cpan.org/perldoc?MooseX::Getopt"&gt;MooseX::Getopt&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This Moose eXtension allows you to fill attributes of an object directly from commandline.&lt;br /&gt;&lt;script src="http://gist.github.com/570131.js?file=Person.pm"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;We just have to use MooseX::Getopt in our Class, and change the creation of the object from Foo-&gt;new to Foo-&gt;new_with_options.&lt;br /&gt;&lt;br /&gt;Tada!&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/570137.js?file=Person.pm"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Now, our program can get all Foo's attributes through the commandline.  Note that if you try an invalid flag, it will output the accepted ones.&lt;br /&gt;&lt;br /&gt;- But wait, I do not want to allow users initialize all attrs.&lt;br /&gt;&lt;br /&gt;Ok, then we should hide the attr under a name beginning with underscore, and set the accessor to our desired name.  MooseX::Getopt will understand you don't want it to be accessible through command line options.&lt;br /&gt;&lt;script src="http://gist.github.com/570139.js?file=Person.pm"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;a href="http://search.cpan.org/perldoc?MooseX::SimpleConfig"&gt;MooseX::SimpleConfig&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The summum of DWIM is you can also exploit the same introspection capabilities to enable configuration files to setup the execution of the files.  And it costs you just one line.&lt;br /&gt;&lt;pre&gt;with 'MooseX::SimpleConfig';&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/570141.js?file=Person.pm"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;The code above will activate an extra flag (--configfile) where you can indicate where to reach the configuration file.&lt;br /&gt;&lt;br /&gt;There are more goodies you can add on top of these modules, but for now, I think it's enough for me. :)&lt;br /&gt;&lt;br /&gt;From these findings, you can see, Moose is not only a great OOP platform for perl but a higher level base for perl hackers to put stuff on.&lt;br /&gt;&lt;br /&gt;Thanks Perl community.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-535974960045639?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/535974960045639/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=535974960045639' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/535974960045639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/535974960045639'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2010/09/capture-flag-with-moose.html' title='Capture the flag with Moose'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-2994504590851053459</id><published>2010-09-03T08:09:00.004+01:00</published><updated>2010-09-03T08:41:14.351+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Parallel::Iterator.  Independent tasks are independent</title><content type='html'>OH HAI!&lt;br /&gt;&lt;br /&gt;Today's module is Andy Armstrong &lt;a href="http://search.cpan.org/perldoc?Parallel::Iterator"&gt;Parallel::Iterator&lt;/a&gt;.  I discovered it through &lt;a href="http://www.dagolden.com/index.php/935/parallel-map-with-paralleliterator/"&gt;Dagolden's blog&lt;/a&gt;, and tried it by myself that same day.&lt;br /&gt;&lt;br /&gt;The idea is simple.  You may have many slow tasks to do that don't have dependencies between each other.  A typical example is fetching for webs using lwp, but I can think of lots of processes doing similar things, for exmple,  ssh-ing some command to many different servers.&lt;br /&gt;&lt;br /&gt;So it's like an autothreading map.  Well sort of. &lt;br /&gt;&lt;br /&gt;As tasks are not guaranteed to end in order, and you probably want to know which source procuded each result, the function you'll apply to each element will have to take not one but two parameters, the first being just an index that you can throw away.  At least it seems so.  I'm not sure I understand it fully, but for the moment that's what I gathered.&lt;br /&gt;&lt;br /&gt;The module provides two sets of functions, iterate, and iterate_as_(array|hash), iterate returning tuples ($index, $result), and the others returning the wanted structure.&lt;br /&gt;&lt;br /&gt;But what puzzles me is that I cannot easily migrate a normal map to this parallel::iterator because functions sent to map have to accept an extra parameter (just to throw it away?).  Two days ago I read &lt;a href="http://perl-howto.de/2010/08/paralleliterator-mehrere-tasks-parallel-ausfuehren.html"&gt;another post related to it&lt;/a&gt; but it didn't comment anything about that 'strange' use of it.&lt;br /&gt;&lt;br /&gt;So I hacked a higher order function that mimics map signature but uses parallel::iterator.  I'm probably missing something because it's strange the author didn't provide something like that in the module. Anyway, here it is:&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/563529.js?file=parit.pl"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;I'm using the iterate_as_array because I want to mimic map signature, so the array to iterate can't be lazy built.  That's another feature of Parallel-Iterator : not only the evaluation of the method can be lazy but also the generation of the list.&lt;br /&gt;&lt;br /&gt;Ideas? Suggestions? Insults?  Go on and comment :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-2994504590851053459?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/2994504590851053459/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=2994504590851053459' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/2994504590851053459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/2994504590851053459'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2010/09/paralleliterator-independent-tasks-are.html' title='Parallel::Iterator.  Independent tasks are independent'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-7356296039837869411</id><published>2010-08-25T09:40:00.004+01:00</published><updated>2010-09-01T09:53:30.894+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Io'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Using AUTOLOAD to build html code</title><content type='html'>Last week I found a &lt;a href="http://discoveringio.blogspot.com/"&gt;new blog about Io&lt;/a&gt;.  It's been a long time since I used Io, but maybe this blog will make me look at &lt;a href="http://www.iolanguage.com/"&gt;Io Language&lt;/a&gt; again.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In his &lt;a href="http://discoveringio.blogspot.com/2010/08/why-yown-is-funny-so-you-can-laugh-too.html"&gt;last post&lt;/a&gt;, Dennis Ferron comments on _why's web server &lt;a href="http://github.com/whymirror/yown"&gt;yown&lt;/a&gt; written in Io.  One thing he comments is the slot 'forward'.&lt;br /&gt;&lt;br /&gt;As he says, forward is a kind of catch that gets called when a message has been sent to an object and that object didn't have a selector with that name.  _why exploits this feature to write an html builder based on that.&lt;br /&gt;&lt;br /&gt;What he doesn't mention (I think he's leaving this for another post) is about lazyness.  The way _why wrote forward method.&lt;br /&gt;&lt;br /&gt;If you define a method without arguments but you call it with some, you can still access them, but with the difference that they won't be evaluated by default.  That's called lazyness, and allows you to define the evaluation order of things.&lt;br /&gt;&lt;br /&gt;So in the code &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;html(&lt;br /&gt;  title("O HAI")&lt;br /&gt;  strong("KTHXBYE")&lt;br /&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;forward will trap html message before title or strong.&lt;br /&gt;&lt;br /&gt;In Perl, there's a 'lightning rod' function too, called AUTOLOAD. You can do pretty much the same, but the difference is that perl will ALWAYS evaluate parameters sent to a function before calling it, so the same code would trigger AUTOLOAD on the 'title' call, then 'strong', and last, 'html' and you have to fill the string from the inner tag to the most generic one.&lt;br /&gt;&lt;br /&gt;Here's a gist code that emulates Yown Builder.io in Perl 5.&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/547384.js?file=AutoBuild.pl"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Good luck Dennis with your new blog!&lt;br /&gt;&lt;br /&gt;-- &lt;br /&gt;raig&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-7356296039837869411?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/7356296039837869411/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=7356296039837869411' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/7356296039837869411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/7356296039837869411'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2010/08/using-autoload-to-build-html-code.html' title='Using AUTOLOAD to build html code'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-4661766901926540237</id><published>2010-08-16T15:19:00.008+01:00</published><updated>2010-08-24T10:45:52.904+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><title type='text'>Memoizer in common lisp</title><content type='html'>Last weekend I finished a fast-read of Ansi Common Lisp.  I didn't do the exercices but I did pay attention to code examples (those are what make me really understand things).&lt;br /&gt;&lt;br /&gt;Overall I find it pretty good, but a bit simple provided you already know something related to the lisp world.&lt;br /&gt;&lt;br /&gt;After finishing it, I tried a couple of tricks in lisp, and was surprised how easy it was to come with working codes of a memoized function. Once you have a memoized function, why not convert it to a memoizer function?&lt;br /&gt;&lt;br /&gt;Here it is. (If you're reading it on google reader you won't be able to see it, better read blogposts from the &lt;a href="http://puntoblogspot.blogspot.com/2010/08/memoizer-in-common-lisp.html"&gt;original site&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/527110.js?file=memoizer.lisp"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(setf memofib (memoizer #'fib))&lt;br /&gt;(funcall memofib 10)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And you have now a faster fib than before.&lt;br /&gt;&lt;br /&gt;Question: how should I change it to make a generic memoizer that memoizes not only unary functions. &lt;br /&gt;In perl I'd have to just pass @_, I suppose changing arg to '&amp;rest arg' and change funcall to apply would do the trick...  I have to try it.  Later.&lt;br /&gt;&lt;br /&gt;More readings:  Scheme R5RS.&lt;br /&gt;I read the part I hadn't read before.  I have to say even the scheme spec is minimalist, well written, and didactic.  Following the language philosophy even at docs level. :)&lt;br /&gt;&lt;br /&gt;And a bit more: A paper on &lt;a href="ftp://ftp.cs.indiana.edu/pub/scheme-repository/doc/prop/macinsch.ps.gz"&gt;Scheme macros&lt;/a&gt;.  I think I get them, but I don't see much use for them.  I suppose I'm still an average blub programmer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-4661766901926540237?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/4661766901926540237/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=4661766901926540237' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/4661766901926540237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/4661766901926540237'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2010/08/memoizer-in-common-lisp.html' title='Memoizer in common lisp'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-1126252699836436436</id><published>2010-08-12T21:35:00.005+01:00</published><updated>2010-08-12T22:27:20.488+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mis cosas'/><category scheme='http://www.blogger.com/atom/ns#' term='general programming'/><title type='text'>Sharing interests with others</title><content type='html'>Here's another of those shitty trackback posts that add nothing to the original post:&lt;br /&gt;&lt;br /&gt;I've read &lt;a href="http://www.blogger.com/%20http://www.renaebair.com/2010/08/11/my-husband-is-a-programmer-i-have-no-idea-what-that-means/"&gt;a blog entry&lt;/a&gt; that explains  what I think about sharing interests with others better than I could ever have written.&lt;br /&gt;&lt;br /&gt;I found it in HN, so it talks about sharing prorgamming interests with your partner.&lt;br /&gt;&lt;br /&gt;Another funny post of the same kind, in  a &lt;a href="https://bugzilla.gnome.org/show_bug.cgi?id=626593"&gt;Bug report &lt;/a&gt;format.  Hilarious too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-1126252699836436436?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/1126252699836436436/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=1126252699836436436' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/1126252699836436436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/1126252699836436436'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2010/08/sharing-interests-with-others.html' title='Sharing interests with others'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-1379592296251956190</id><published>2010-07-27T10:00:00.003+01:00</published><updated>2010-07-27T11:26:34.552+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Rakudo * is next door</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.perl6.org/camelia-logo.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 261px; height: 243px;" src="http://www.perl6.org/camelia-logo.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Yes.&lt;br /&gt;&lt;a href="http://rakudo.org/"&gt;Rakudo *&lt;/a&gt;, the first official distribution of stable (yet incomplete) &lt;a href="http://perl6.org/"&gt;perl6&lt;/a&gt; interpreter rakudo.  Devs haven't focused on optimizations but features, and it's quite useful as it is IMHO.  It brings lots of the crazy Perl 6 features announced in the synopsis like hyperoperators, metaoperators, lazyness, junctions, introspectable OOP, and regex and grammars as first class citizens in the language.  That last thing means you can plug a new parser for your program in lexical scope.  Welcome DSL world.  Early adopters, language geeks, perl hackers, you have no excuse now not to try rakudo :) .&lt;br /&gt;&lt;br /&gt;Myself I haven't toyed enough with Perl 6 to do anything useful, but I have done quite a few conceptual tests, and, although I'm still baby-talking Perl 6, it's quite nice to hang around at #perl6 and see perl6 heroes stressing rakudo's features till the unthought limits.&lt;br /&gt;&lt;br /&gt;More good news:  Audrey Tang appeared a few days ago on #perl6 (I think thanks to &lt;a href="http://use.perl.org/%7Emasak/journal/40451"&gt;masak's post&lt;/a&gt;), and started hacking on niecza (sorear's perl6 implementation focused on compiler and interpreter optimization techniques).&lt;br /&gt;&lt;br /&gt;I tried to solve one of moritz's perl6 Challenge, &lt;a href="http://perlgeek.de/blog-en/perl-6/contribute-now-Str-trans.html"&gt;implementing Str.trans&lt;/a&gt; (á la p5 tr// ) in perl6. Mine, is the (really incomplete babyperly) submitted on a gist pastie.  I &lt;a href="http://perlgeek.de/blog-en/perl-6/contribute-now-lottery.html"&gt;didn't win&lt;/a&gt; the rakudo T-shirt.&lt;br /&gt;&lt;br /&gt;More on Perl6.  A couple of perl6 related posts reached HN and reddit top page and stayed more than 1 day there.  buzz buzz buzz buzz :)&lt;br /&gt;&lt;br /&gt;And last but not least, Barcelona Perl Mongers are &lt;a href="http://perl.cat/blog/2010/07/celebrem-perl-6-amb-un-menu-complet.html"&gt;living a celebration&lt;/a&gt;, on July 29th of July, the R* Day (and being the last thursday of the month, which is the usual meeting day) will join at UPC Campus Nord, and &lt;a href="http://claimid.com/alexm"&gt;Alex Muntada&lt;/a&gt; will give a Perl6 introductory talk.  Of course, you're all invited. Unfortunately, I won't be able to be there as I'll be in Malta. O HAI Holidays!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-1379592296251956190?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/1379592296251956190/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=1379592296251956190' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/1379592296251956190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/1379592296251956190'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2010/07/rakudo-is-next-door.html' title='Rakudo * is next door'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-6499931881249856613</id><published>2010-07-27T09:52:00.004+01:00</published><updated>2010-07-27T09:59:55.410+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mis cosas'/><title type='text'>Happy 1st anniversary</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_aRXkF2maASc/TE6fopyAvgI/AAAAAAAAAUI/pwcHKKod5JM/s1600/ralph.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_aRXkF2maASc/TE6fopyAvgI/AAAAAAAAAUI/pwcHKKod5JM/s400/ralph.jpg" alt="" id="BLOGGER_PHOTO_ID_5498507715825155586" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/_r7ZF9uUs6E&amp;amp;hl=en_US&amp;amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/_r7ZF9uUs6E&amp;amp;hl=en_US&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-6499931881249856613?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/6499931881249856613/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=6499931881249856613' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/6499931881249856613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/6499931881249856613'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2010/07/happy-1st-anniversary.html' title='Happy 1st anniversary'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_aRXkF2maASc/TE6fopyAvgI/AAAAAAAAAUI/pwcHKKod5JM/s72-c/ralph.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-3636575296111325538</id><published>2010-07-13T00:17:00.006+01:00</published><updated>2010-07-13T10:40:55.521+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='smalltalk'/><category scheme='http://www.blogger.com/atom/ns#' term='mis cosas'/><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><category scheme='http://www.blogger.com/atom/ns#' term='general programming'/><title type='text'>Back to the future?</title><content type='html'>&lt;span style="font-weight:bold;"&gt;9:00&lt;/span&gt;&lt;br /&gt;Llego al currele, y mientras estoy haciendo mi navegacion de&lt;br /&gt;reconocimiento, encuentro porahí un link interesante: &lt;a href="http://www.nytimes.com/2010/07/12/technology/12google.html?_r=1"&gt;Google’s&lt;br /&gt;Do-It-Yourself App Creation Software&lt;/a&gt;.  Alguna frikada de google&lt;br /&gt;labs... ya verás.  Total, que empiezo el articulo y leo que el&lt;br /&gt;proyecto esta liderado por un tal "Harold Abelson".  H.Abelson en&lt;br /&gt;google? (pues se ve que se ha pillao un sabático del MIT).  Bueno, el&lt;br /&gt;proyecto va encaminado a que todo el mundo pueda ser programador de&lt;br /&gt;sus miniaplicaciones.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;17:00&lt;/span&gt;&lt;br /&gt;Recibo un mail en una maillist Que pone "&lt;a href="http://www.youtube.com/watch?v=8ADwPLSFeY8"&gt;se nos acabóo el trabajo&lt;/a&gt;".&lt;br /&gt;Coño! Esto es scratch!!!&lt;br /&gt;Reflexión:  Los Schemers chupando de smalltalk? Bueno, puede ser,&lt;br /&gt;entre comunidades pioneras... pero en google, hacen algo en&lt;br /&gt;scheme/smalltalk? Bueno, de hecho, scratch tambien sale del MIT, creo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;17:30&lt;/span&gt;&lt;br /&gt;Llego a la &lt;a href="http://appinventor.googlelabs.com/about/"&gt;pagina oficial del proyecto&lt;/a&gt; y efectivamente al final de la pagina.&lt;br /&gt;(...) Open Blocks visual programming is closely related to the Scratch&lt;br /&gt;programming language, a project of the MIT Media Laboratory's Lifelong&lt;br /&gt;Kindergarten Group.&lt;br /&gt;&lt;br /&gt;The compiler that translates the visual blocks language for&lt;br /&gt;implementation on Android uses the Kawa Language Framework and Kawa's&lt;br /&gt;dialect of the Scheme programming language, developed by Per Bothner&lt;br /&gt;and distributed as part of the Gnu Operating System by the Free&lt;br /&gt;Software Foundation. (...)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;18:00&lt;/span&gt;&lt;br /&gt;Me pregunto si contestar al mail de la maillist contando de donde&lt;br /&gt;viene todo esto, quien es Abelson, y entro en otra&lt;br /&gt;batalla épica?  Respondo con un : "joer, estos de google son la ostia,&lt;br /&gt;estas cosas, solo las pueden inventar ellos...", me callo?.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;En fin... Esta claro que poco a poco van alcanzándonos,  pero la&lt;br /&gt;verdad es que me encanta estar en este mundillo (pionero después de&lt;br /&gt;casi 30 años), y estas aproximaciones que hacen 'los grandes' le dan a&lt;br /&gt;uno la confirmación de la sospecha: "yeah, voy un paso por delante,&lt;br /&gt;que se jodan"  :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-3636575296111325538?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/3636575296111325538/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=3636575296111325538' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/3636575296111325538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/3636575296111325538'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2010/07/back-to-future.html' title='Back to the future?'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-2924455368016398725</id><published>2010-07-12T09:14:00.005+01:00</published><updated>2010-07-17T12:35:56.529+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Wasn't there a command to do XYZ?...</title><content type='html'>At $work, many times I'm asked about ways to optimize little annoying processes of other people (I'm a kind of &lt;a href="http://puntoblogspot.blogspot.com/2009/12/programmers-improving-productivity-and.html"&gt;office&lt;/a&gt; &lt;a href="http://puntoblogspot.blogspot.com/2009/08/new-projects-old-projects-and-eoh.html"&gt;enabler&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;There's a typical dialog of some $coworker, and $self.&lt;br /&gt;&lt;br /&gt;- Hey Rai, I've got a little question for you.&lt;br /&gt;- Ok, go on.&lt;br /&gt;- Wasn't there a linux command to put lines of two files in one file, one line after the other? Like a columnwise join.&lt;br /&gt;- M... yeah... I think so. Was it 'join'? Nah, man doesn't seem to say anything about it... Well, you can use Perl, you know, the swiss knife.&lt;br /&gt;- Yeah, but I don't think a script is needed, For now, I'm doing it with excel, you can copypaste each file in different columns, and then save as CSV, then you just have to remove the commas, using vim.&lt;br /&gt;- ¬_¬ .... Gimme 30 secs.&lt;br /&gt;&lt;br /&gt;echo 'a' &gt;a&lt;br /&gt;echo 'a' &gt;&gt;a&lt;br /&gt;echo 'a' &gt;&gt;a&lt;br /&gt;echo 'b' &gt;b&lt;br /&gt;echo 'b' &gt;&gt;b&lt;br /&gt;echo 'b' &gt;&gt;b&lt;br /&gt;perl -e 'open $a,shift;open $b,shift; while(chomp($_=&lt;$a&gt;)){print  $_, scalar(&lt;$b&gt;)}' a b&lt;br /&gt;&lt;br /&gt;output:&lt;br /&gt;ab&lt;br /&gt;ab&lt;br /&gt;ab&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-2924455368016398725?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/2924455368016398725/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=2924455368016398725' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/2924455368016398725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/2924455368016398725'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2010/07/wasnt-there-command-to-do-xyz.html' title='Wasn&apos;t there a command to do XYZ?...'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-3037495583512652150</id><published>2010-06-30T12:53:00.008+01:00</published><updated>2010-08-13T13:03:17.469+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Redirect STDOUT to file in Perl 5</title><content type='html'>Every now and then, I need to write little scripts (or not so little) that output *lots* of lines of text.  Those lines belong to a single file, so my common idiom is printing the output to STDOUT, and tell the user to redirect the output to a file if he wants it toasted into a file.&lt;br /&gt;&lt;br /&gt;But there's a more elegant way to do it that doesn't rely on shells, and works more consistently.  In fact TIMTOWTDI.&lt;br /&gt;&lt;br /&gt;One way is fill the code with:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;if ($outputInFile) { print $file "foo";}&lt;br /&gt;else{print "foo"}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;/me shivers ...&lt;br /&gt;&lt;br /&gt;I found a way to do it quite elegantly redirecting a file handler where I'll be printing to STDOUT, using Typeglobs.  I'm not too confident managing typeglobs, but it seems to work :)&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/458526.js?file=fileOrSTDOUT1.pl"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;I asked at #barcelona.pm and &lt;a href="http://www.alexm.org/"&gt;alexm&lt;/a&gt; (O HAI! president) told me I could think it the other way around, and overwrite STDOUT to an opened filehandle in case I needed the redirection.  I didn't know I could handle STDOUT like any other fh.  It's nice to know it.&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/458528.js?file=fileOrSTDOUT2.pl"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;I think &lt;a href="http://search.cpan.org/%7Ecasiano/"&gt;Casiano&lt;/a&gt; taught me (back in university times) another way to do it (maybe it was using tee, or some IO::Handle funky stuff).&lt;br /&gt;&lt;br /&gt;Is there any cpan module that does that kind of Stdout vs file output?  I haven't found it, but it MUST be there.   Or maybe the code to do it is so small it doesn't make sense writing a module for that&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-3037495583512652150?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/3037495583512652150/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=3037495583512652150' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/3037495583512652150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/3037495583512652150'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2010/06/redirect-stdout-to-file-in-perl-5.html' title='Redirect STDOUT to file in Perl 5'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-4446359726386504541</id><published>2010-06-23T00:40:00.000+01:00</published><updated>2010-06-23T00:41:03.355+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mis cosas'/><title type='text'>Algo pasa...</title><content type='html'>Cuando tu bandeja de entrada esta llena del mismo nombre.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-4446359726386504541?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/4446359726386504541/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=4446359726386504541' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/4446359726386504541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/4446359726386504541'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2010/06/algo-pasa.html' title='Algo pasa...'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-7145830352346426147</id><published>2010-06-21T12:50:00.010+01:00</published><updated>2010-06-21T16:21:14.636+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>Kill Buffers Illustrated (emacs)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_aRXkF2maASc/TB9UX8fsqeI/AAAAAAAAATo/IW5jXkdeUJs/s1600/kill-bill-2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 269px; height: 400px;" src="http://1.bp.blogspot.com/_aRXkF2maASc/TB9UX8fsqeI/AAAAAAAAATo/IW5jXkdeUJs/s400/kill-bill-2.jpg" alt="" id="BLOGGER_PHOTO_ID_5485195641513355746" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;A side effect of using emacs intensively is that you end with lots (I mean *LOTS*) of open buffers scattered on your emacs.&lt;br /&gt;&lt;br /&gt;This is not necessarily a problem (provided you use ido/iswitchb/icicles modes), but it kind of gets on my nerves having 30+ buffers opened knowing that I don't need them anymore.  Most of them are temporary buffers like dired-mode ones, or perldoc ones.  Like most things in emacs world, someone has already thought of it and there is already a function to do what you want.&lt;br /&gt;&lt;br /&gt;For example, scattered dired-mode buffers.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(defun kill-all-dired-buffers()&lt;br /&gt; "Kill all dired buffers."&lt;br /&gt; (interactive)&lt;br /&gt; (save-excursion&lt;br /&gt;   (let((count 0))&lt;br /&gt;     (dolist(buffer (buffer-list))&lt;br /&gt;       (set-buffer buffer)&lt;br /&gt;       (when (equal major-mode 'dired-mode)&lt;br /&gt;         (setq count (1+ count))&lt;br /&gt;         (kill-buffer buffer)))&lt;br /&gt;     (message "Killed %i dired buffer(s)." count ))))&lt;br /&gt;&lt;/pre&gt;And you're done.&lt;br /&gt;&lt;br /&gt;great, isn't it?&lt;br /&gt;&lt;br /&gt;What if you want to purge some buffers, that have no name in common, nor mode?  You can kill them one at a time with kill-buffer (c-x k) but if you want to do it faster, you can use Buffer List buffer.&lt;br /&gt;&lt;br /&gt;c-x c-b will open a buffer with a list of all buffers.  That's not a normal (Fundamental) buffer, but a 'Buffer Menu' buffer.  If you press 'd', the buffer that has the point (cursor) will be marked for deletion.  Once you have the list of buffers to kill, just press 'x', and buffers will be killed.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_aRXkF2maASc/TB97oljfZkI/AAAAAAAAATw/PjjkOF_dNKM/s1600/screen.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 234px;" src="http://3.bp.blogspot.com/_aRXkF2maASc/TB97oljfZkI/AAAAAAAAATw/PjjkOF_dNKM/s400/screen.jpg" alt="" id="BLOGGER_PHOTO_ID_5485238808366507586" border="0" /&gt;&lt;/a&gt;If you press '&lt;a href="http://www.youtube.com/watch?v=OO-0MwIqE18"&gt;x&lt;/a&gt;', 3 erc buffers will be killed.  Mnd you, once a buffer has been killed, it cannot be unkilled. :)&lt;br /&gt;&lt;br /&gt;That's all for now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-7145830352346426147?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/7145830352346426147/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=7145830352346426147' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/7145830352346426147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/7145830352346426147'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2010/06/kill-buffers-illustrated-emacs.html' title='Kill Buffers Illustrated (emacs)'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_aRXkF2maASc/TB9UX8fsqeI/AAAAAAAAATo/IW5jXkdeUJs/s72-c/kill-bill-2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-7817489196385483274</id><published>2010-06-11T09:37:00.015+01:00</published><updated>2010-06-14T19:55:08.085+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='general programming'/><title type='text'>I ♡ TITS (TIAS)</title><content type='html'>There's a (sadly too common) practice consisting of asking about something before having tried anything related to it.  I mean, if you're working on nuclear fision, better ask first, but if you're trying a software library, or want to know which advantage gives you using this db vs that other one, just &lt;a href="http://www.urbandictionary.com/define.php?term=TIAS"&gt;TIAS&lt;/a&gt; (or its NSFW version &lt;a href="http://www.perlmonks.org/?node_id=545998"&gt;TITS&lt;/a&gt; The link is SFW, don't worry).  This will give you a fairly good overview of what does this language/lib/anything can do for you, and how easy/difficult is FOR YOU to use it.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.tryerlang.org/"&gt;erlang&lt;/a&gt;&lt;br /&gt;&lt;a href="http://tryhaskell.org/"&gt;haskell&lt;/a&gt;&lt;br /&gt;&lt;a href="http://try.redis-db.com/"&gt;redis&lt;/a&gt;&lt;br /&gt;&lt;a href="http://try.mongodb.org/"&gt;mongodb&lt;/a&gt;&lt;br /&gt;&lt;a href="http://tryclj.licenser.net/"&gt;clojure&lt;/a&gt;&lt;br /&gt;&lt;a href="http://tryscheme.sourceforge.net/"&gt;scheme&lt;/a&gt;&lt;br /&gt;&lt;a href="http://try-python.mired.org/"&gt;python&lt;/a&gt; (or &lt;a href="http://www.trypython.org/"&gt;this&lt;/a&gt; if you have MS Silverlight)&lt;br /&gt;&lt;br /&gt;Btw, combo pun for the ones that came to the last&lt;a href="https://dl.dropbox.com/u/2594870/IloveTITS.JPG"&gt; Festa&lt;/a&gt;&lt;a href="http://www.fib.upc.edu/fib/noticies/noticias/0119/imatge/1.jpg"&gt;FIB '10&lt;/a&gt;. A pun on a pun on a pun on "I love ..." T-shirts .&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-7817489196385483274?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/7817489196385483274/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=7817489196385483274' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/7817489196385483274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/7817489196385483274'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2010/06/i-tits-or-tias.html' title='I ♡ TITS (TIAS)'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-8078101144447615132</id><published>2010-06-10T10:53:00.007+01:00</published><updated>2010-07-15T09:46:50.809+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='general programming'/><title type='text'>Talk talk talk</title><content type='html'>A new conference was born 3 months ago. It's called &lt;a href="http://emerginglangs.com/"&gt;Emerging languages&lt;/a&gt;, and it will take place this summer.  It'll be full of language designers, talks about innovative programming languages, and *lots* of enlightening ideas (I'm sure). There will be talks about lots of langs all by the language designers.  Myself, I'm particularly interested in Io, Ioke , Newspeak, Factor and Clojure.  &lt;br /&gt;&lt;br /&gt;The bad thing is that it's going to be held in OSCON 2010, so It's a bit far from me... Let's hope there will be recorded talks after summer.&lt;br /&gt;&lt;br /&gt;It seems this summer I'm not going to YAPC::EU neither, so I'll have to take my conference dose from somewhere else.&lt;br /&gt;&lt;br /&gt;Luckily, there are lots of good &lt;a href="http://www.lyricsfreak.com/k/king+crimson/elephant+talk_20078581.html"&gt;talks&lt;/a&gt; already recorded .&lt;br /&gt;&lt;br /&gt;&lt;a href=" http://www.vimeo.com/user2191865/albums"&gt;&lt;br /&gt;Erlang and haskell&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://groups.google.com/group/plt-scheme/browse_thread/thread/eea3b96bd0fd397a/4a6e0078485b073d?lnk=gst&amp;q=Lectures+on+iTunes&amp;pli=1"&gt;scheme talks&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/events/io/2010/sessions.html"&gt;Google Io sessions&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And lots of good papers to read:&lt;br /&gt;&lt;a href="http://web.archive.org/web/20080704034627/http://zafar.se/bkz/Articles/ClassicCompScienceTexts"&gt;ClassicCompScienceTexts&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Any other suggestions are very welcome.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-8078101144447615132?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/8078101144447615132/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=8078101144447615132' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/8078101144447615132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/8078101144447615132'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2010/06/talk-talk-talk.html' title='Talk talk talk'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-7314505650623830640</id><published>2010-05-12T09:38:00.012+01:00</published><updated>2011-01-08T22:22:13.736Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>You can stay at $HOME, Perl                         :)</title><content type='html'>Evolution is the way to keep up with times, and lots of things are happening in the perlsphere lately:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.perl.org/"&gt;Perl&lt;/a&gt; 5.12 went stable on April 2010, with lots of fixes, and a few new features. See the &lt;a href="http://search.cpan.org/%7Ejesse/perl-5.12.0/pod/perl5120delta.pod"&gt;deltas&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://rakudo.org/"&gt;Rakudo&lt;/a&gt; is making progress at a good rate, with new contributors, and it's getting faster and more complete every day.  Parrot guys are doing a great job there too.&lt;/li&gt;&lt;li&gt;&lt;a href="http://search.cpan.org/%7Emiyagawa/App-cpanminus-1.0003/"&gt;cpanminus&lt;/a&gt; seems to be the next big thing of the language, and it's a perfect companion of &lt;a href="http://search.cpan.org/%7Emstrout/local-lib-1.006000/lib/local/lib.pm"&gt;local::lib&lt;/a&gt; and even &lt;a href="http://search.cpan.org/dist/App-perlbrew/"&gt;perlbrew&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;Cpanminus is &lt;a href="http://search.cpan.org/%7Emiyagawa/"&gt;miyagawa&lt;/a&gt;'s (quite successful) attempt to simplify CPAN.pm, in a DWMI-Y way.  by default, it follows dependecies, uses your prefered path to install modules (it knows about local::lib) , and will just install and get out of your way.  It's better for perl newbies (and pseudo-newbies like me) and speeds up the installation of the whole environment.&lt;br /&gt;&lt;br /&gt;local::lib is one of the wizard &lt;a href="http://search.cpan.org/%7EMSTROUT/"&gt;mst&lt;/a&gt;'s magic spells to enable local repositories of libs per project.  That means you can attach cpan libs to your apps, and then control the exact version you ship with each app.&lt;br /&gt;&lt;br /&gt;the complete install process of the environment is the following:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mkdir ~/myperltmp&lt;br /&gt;cd ~/myperltmp&lt;br /&gt;wget cpanmin.us&lt;br /&gt;chmod +x cpanm&lt;br /&gt;wget http://search.cpan.org/CPAN/authors/id/M/MS/MSTROUT/local-lib-1.006000.tar.gz&lt;br /&gt;tar zxvf  local-lib-1.006000.tar.gz&lt;br /&gt;cd local-lib-1.006000&lt;br /&gt;perl Makefile.PL --bootstrap&lt;br /&gt;make test &amp;amp;&amp;amp; make install&lt;br /&gt;echo 'eval $(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)' &gt;&gt;~/.bashrc&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And now you're ready to go.&lt;br /&gt;./cpanm DBIx::Class&lt;br /&gt;./cpanm Moose&lt;br /&gt;&lt;br /&gt;And with 0 questions, you'll have DBIx::Class  and Moose in your ~/perl5 directory.&lt;br /&gt;&lt;br /&gt;If you added the last line to your .bashrc, then everything should work.  You can &lt;span style="font-style: italic;"&gt;use local::lib "~otherpath"&lt;/span&gt;; to have multiple scenarios to try your modules/apps on.  Next thing to try is perlbrew, but that's for another day.&lt;br /&gt;&lt;br /&gt;Mainly I extracted the info from &lt;a href="http://scratching.psybermonkey.net/2010/03/20/perl-how-to-install-perl-module-without-root-or-super-user/"&gt;here&lt;/a&gt; and &lt;a href="http://perl.jonallen.info/writing/articles/install-perl-modules-without-root"&gt;here&lt;/a&gt; (and perldocs, of course)&lt;br /&gt;&lt;br /&gt;Before leaving, let me leave you with a great talk by mst.  Full of info, and full of lolz, and nearly no swearing (Wow! surprise!)&lt;br /&gt;&lt;br /&gt;&lt;embed src="http://blip.tv/play/hYJVgb_yeQI%2Em4v" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="300" width="480"&gt;&lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-7314505650623830640?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/7314505650623830640/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=7314505650623830640' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/7314505650623830640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/7314505650623830640'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2010/05/you-can-stay-at-home-perl.html' title='You can stay at $HOME, Perl                         :)'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-1310309078296913813</id><published>2010-05-05T12:13:00.009+01:00</published><updated>2011-02-08T16:54:10.346Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>Comparing functions.  How similar are we?</title><content type='html'>Sometimes I have two functions, maybe in different subclasses, and I would like to do a diff on them, because they look very similar but not the same.  Most of the times, they are come from a past copypaste, so variables have the same names.&lt;br /&gt;&lt;br /&gt;What I want to know then is what has really changed, or if they changed at all.&lt;br /&gt;&lt;pre&gt;#in file foo/bar.pm&lt;br /&gt;sub normalize {&lt;br /&gt;my ($self) = shift;&lt;br /&gt;$self-&gt;attr($self-&gt;attr / $self-&gt;total);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#in file foo/baz.pm&lt;br /&gt;sub normalize {&lt;br /&gt;my ($self) = shift;&lt;br /&gt;$self-&gt;attr($self-&gt;attr / $self-&gt;total +1);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Emacs comes to rescue!&lt;br /&gt;&lt;br /&gt;We'll use two great emacs features, narrow and ediff.&lt;br /&gt;&lt;br /&gt;narrow lets us hide uninteresting parts of a given buffer. It's usage is pretty simple: Mark a region, m-x narrow-to-region  (or c-x n n).   There's also a shorctut, and there are predefined narrowings, like narrow-to-defun... you know, emacs butterflies.&lt;br /&gt;&lt;br /&gt;Once you narrowed two buffers to the interesting regions, you can use ediff (m-x ediff-buffers) and select the two buffers you want to narrow.&lt;br /&gt;&lt;br /&gt;To widen the narrowed buffers, you can 'm-x widen' (or c-x n w) to see the complete buffers again.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Tip for ratpoison users &lt;/span&gt;(or any other tiling wm user): (setq ediff-window-setup-function 'ediff-setup-windows-plain) in your .emacs will tell emacs to open the ediff window in a different window, but not opening a new frame.  (window and frame have inverse meanings in emacs world than in the rest of the world)&lt;br /&gt;&lt;br /&gt;theese would be the steps:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;open bar.pm&lt;/li&gt;&lt;li&gt;go to normalize function.&lt;/li&gt;&lt;li&gt;c-m-h  (mark-defun)&lt;/li&gt;&lt;li&gt;c-x n n&lt;br /&gt;&lt;/li&gt;&lt;li&gt;open baz.pm&lt;/li&gt;&lt;li&gt;(steps 2-4)&lt;/li&gt;&lt;li&gt;m-x ediff-buffers&lt;/li&gt;&lt;li&gt;select both buffers (emacs will suggest them already)&lt;/li&gt;&lt;li&gt;check diffs&lt;/li&gt;&lt;li&gt;q (quit ediff-mode)&lt;/li&gt;&lt;li&gt;c-x n w (widen)&lt;/li&gt;&lt;li&gt;go to the other file, and widen again.&lt;/li&gt;&lt;li&gt;You're done&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_aRXkF2maASc/S-Fs9e_NapI/AAAAAAAAARM/F_j152h4SPY/s1600/screen.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 234px;" src="http://2.bp.blogspot.com/_aRXkF2maASc/S-Fs9e_NapI/AAAAAAAAARM/F_j152h4SPY/s400/screen.jpg" alt="" id="BLOGGER_PHOTO_ID_5467771226150496914" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Endnote:  Although being a big fan of vim myself and having used it for 5 years, these features available in emacs by default, are not (at least easily) doable in vim.  emacs, the kitchen sink, and m-x butterflies DO have their uses :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-1310309078296913813?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/1310309078296913813/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=1310309078296913813' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/1310309078296913813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/1310309078296913813'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2010/05/comparing-functions-how-similar-are-we.html' title='Comparing functions.  How similar are we?'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_aRXkF2maASc/S-Fs9e_NapI/AAAAAAAAARM/F_j152h4SPY/s72-c/screen.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-482382110251785646</id><published>2010-04-30T18:23:00.007+01:00</published><updated>2010-04-30T19:13:11.187+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mis cosas'/><title type='text'>Fiuchar is nau</title><content type='html'>Es acojonante interactuar con el mundo.  Unas veces ganas, otras no, pero interactuas.  Y eso mola, no me jodas.&lt;br /&gt;&lt;br /&gt;Lo que recientemente me sucede, y me doy cuenta, es que el futuro esta íntimamente relacionado con el presente, y aunque eso parezca una trivialidad, no siempre soy consciente de ello.&lt;br /&gt;&lt;br /&gt;En la historia que no sale en los libros, la del día a día, la mía, y seguramente la tuya, uno mismo es el prota de su película, y si no esperas nada más de ella que ir pasandolo bien minuto a minuto, pues no importa mucho a donde te lleve el proximo capítulo. Carpe Diem.&lt;br /&gt;&lt;br /&gt;Pero no hace falta tener previsiones a años vista para ver que tus pasos no son gratis.  Cada movimiento es un turno, y eso ya no vuelve. Y la jugada que empiezas ahora, te condiciona tu siguiente turno. Y pasar no entra en las reglas del juego.  Llamémos a este epsilon de tiempo, "el proximo turno".&lt;br /&gt;&lt;br /&gt;Una entrevista de trabajo mal llevada, te cierra puertas a currar, a dejar el curro, o a cambiar de ciudad.&lt;br /&gt;&lt;br /&gt;Un policía que casi te pilla, te podía haber jodido tu expediente, o tu carnet.  Y tu estabas jugando en el juego.  Un borracho que por la calle te pega un puñetazo porque ha ganado su equipo, te deja, a parte de en el suelo, te deja pensando en que cojones haces viviendo un día a día, que no te lleva a ningun lado, porque simplemente apuntas a media altura, apuntas a mañana. al proximo turno, pero solo con llegar ya te basta.&lt;br /&gt;&lt;br /&gt;Un paso mal dado, te puede dejar cojo, y no poder irte de viaje, aunque ya hayas pagado tu billete.  Pero esto no es como Dallas, donde te puedes inventar que la muerte de JR era un sueño.  Los turnos pasan, y cada jugada es una opción de encarrilar, o cagarla.&lt;br /&gt;&lt;br /&gt;Este próximo turno (futuro immediato) se crea a partir de esta gran bola de mierda que es el presente, y que va ladera abajo, llevandose por delante todo lo que pilla. Y es tan grande y gorda, que uno no la puede parar conscientemente.  Digamos que es una version del S.XXI del concepto del "&lt;a href="http://www.virtualschool.edu/mon/Quality/"&gt;train of knowledge&lt;/a&gt;"(al final) y  &lt;a href="http://en.wikipedia.org/wiki/Quality_%28philosophy%29"&gt;Quality&lt;/a&gt; que conocí en &lt;a href="http://en.wikipedia.org/wiki/Zen_and_the_Art_of_Motorcycle_Maintenance"&gt;Pirsig&lt;/a&gt;, paralelismo del tren, pero remasterizada, actualizada, y con 7 segundos inéditos.    Los del puñetazo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-482382110251785646?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/482382110251785646/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=482382110251785646' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/482382110251785646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/482382110251785646'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2010/04/fiuchar-is-nau.html' title='Fiuchar is nau'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-6577580933051858348</id><published>2010-04-30T12:29:00.011+01:00</published><updated>2010-04-30T16:55:51.029+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>DOCS or GTFO</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_aRXkF2maASc/S9rDWsnleUI/AAAAAAAAARA/LLZQUidFUe0/s1600/docs_or_gtfo.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 265px; height: 400px;" src="http://4.bp.blogspot.com/_aRXkF2maASc/S9rDWsnleUI/AAAAAAAAARA/LLZQUidFUe0/s400/docs_or_gtfo.jpeg" alt="" id="BLOGGER_PHOTO_ID_5465895892469250370" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ok, you hate documenting.  But it's part of the deal.&lt;br /&gt;&lt;br /&gt;As you may know, there are tools that generate browseable documentation provided you document your code in a proper way.&lt;br /&gt;&lt;br /&gt;Perl is no exception, and you can convert POD documentation to html, formatted plain text, LaTeX, etc...&lt;br /&gt;&lt;br /&gt;To ensure you documented (at least, put the boilerplate) every non private function in your code, there's a module called &lt;a href="http://search.cpan.org/dist/Pod-Coverage/"&gt;Pod::Coverage&lt;/a&gt; that checks for undocumented functions, parsing your code, parsing your pod, and doing the match, and the diff.&lt;br /&gt;&lt;br /&gt;Once that we're at it, we can bundle the check as a test for our application, and, in fact, there's &lt;a href="http://search.cpan.org/dist/Test-Pod-Coverage/"&gt;Test::Pod::Coverage&lt;/a&gt;, that is exactly what we're looking for.&lt;br /&gt;&lt;br /&gt;Ok, let's write a minimal module (BankAccount will do), using the right tools for each job.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;module-starter --module=BankAccount --author="Raimon Grau" --email=raimonster@gmail.com --builder="Module::Install"&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;This will generate all the boilerplate and the directory scaffold needed, and it will include (at least if you have both packages installed).&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/385370.js?file=BankAccount.pm"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;This code will fail the pod coverage test, because the method withdraw is not documented.&lt;br /&gt;&lt;br /&gt;Well, we have a new tool in our toolbox, that makes sure at least every method has its associated POD documentation.  The module won't force you to document subs starting with underscore (thank god for DWIM).  There's also other modules that build on this, like the one RJBS explains &lt;a href="http://advent.rjbs.manxome.org/2009-12-04.html"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-6577580933051858348?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/6577580933051858348/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=6577580933051858348' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/6577580933051858348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/6577580933051858348'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2010/04/docs-or-gtfo.html' title='DOCS or GTFO'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_aRXkF2maASc/S9rDWsnleUI/AAAAAAAAARA/LLZQUidFUe0/s72-c/docs_or_gtfo.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-6380459827046100478</id><published>2010-04-26T10:53:00.008+01:00</published><updated>2010-04-26T22:41:32.492+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Iterator::Simple, as simple as it gets</title><content type='html'>We're all feeling spring is coming again. That's not new though, so you could have guessed that after winter, spring was about to come.. ¬¬&lt;br /&gt;&lt;br /&gt;We could build a circular list to retrieve a list of consecutive seasons, but as I discovered&lt;br /&gt;&lt;a href="http://search.cpan.org/~rintaro/Iterator-Simple-0.05/lib/Iterator/Simple.pm"&gt;Iterator::Simple&lt;/a&gt;, Here follows a stupid example of its usage.&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/379201.js?file=seasonIterator.pl"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;We can also wrap an iterator, "á la" stream (I'm reading the &lt;a href="http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-24.html#%_sec_3.5"&gt;stream chapter in SICP&lt;/a&gt;, and nowadays, I can only think in streams :p ), delaying the evaluation of the wrapping until the given elements are needed using imap. We also have ifilter, igrep, and so.&lt;br /&gt;&lt;br /&gt;Here's a code that wraps (or decorates, in python slang IIRC) our iterator modifying the string returned, and it limits the iterator to 6 seasons.&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/379212.js?file=seasonImapIterator.pl"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-6380459827046100478?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/6380459827046100478/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=6380459827046100478' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/6380459827046100478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/6380459827046100478'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2010/04/iteratorsimple-as-simple-as-it-gets.html' title='Iterator::Simple, as simple as it gets'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-3466772611411563871</id><published>2010-04-14T20:01:00.005+01:00</published><updated>2010-04-14T22:24:45.285+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='smalltalk'/><category scheme='http://www.blogger.com/atom/ns#' term='squeak'/><title type='text'>Versioning in squeak/pharo using Monticello</title><content type='html'>Lately I've been working on a simple website I'm doing in smalltalk.  It's not a complex thing, but it's someway new being my first serious website I've done.&lt;br /&gt;&lt;br /&gt;To build it I'm using pier and seaside.  And it's mostly fantastic.  But sometimes, all of the sudden, some unknown error occurs and my image freezes.  And my last codes are lost.  No way to recover it even using the recovery tool.&lt;br /&gt;&lt;br /&gt;So I remembered something Mr. Ducasse said in the course he did in UPC.  The idea is you could throw away your image every day, and start with a fresh new one, EVERY DAY.&lt;br /&gt;&lt;br /&gt;One option is fileOuts and fileIns, and in fact, it's simple, reliable and it just works (tm), but you cannot store different versions, and if you did the manual filename juggling, the versions would not have any relationship between them.&lt;br /&gt;&lt;br /&gt;Then, here comes monticello.  A kind of apt-get + launchpad.  It's a package browser and installer (no dependency tracking AFAIK), where repos can be lots of different places, from local directories, to squeaksource remotes, or ftp, or ....&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 320px;" src="http://1.bp.blogspot.com/_aRXkF2maASc/S8YV6hmaS6I/AAAAAAAAAQU/5o1rnts9QH4/s400/screenMB.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5460075693429377954" /&gt;&lt;br /&gt;The trick is opening a create a new package (+package button) with the name of the category you want to save.  Then, it will appear in the left panel of monticello browser.  After that, create a new repository (+Repository button) and add a directory where you want to save it. Then just press the save button.&lt;br /&gt;&lt;br /&gt;When you open a new image and want to load the package, open monticello browser, open the repository (+Repository again), click it, and browse.  There you'll be able to load the package, and once it's loaded, it will appear in the left panel of the main Monticello Browser.&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 320px;" src="http://2.bp.blogspot.com/_aRXkF2maASc/S8YV60MGdiI/AAAAAAAAAQc/SMy-SGmY37I/s400/screen.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5460075698419299874" /&gt;In the second screenshot you see top left, the different repository types. on the right, the main Monticello screen with the two panels.  My advise is to play a bit with it, selecting and unselecting items to get the feeling of it. &lt;br /&gt;&lt;br /&gt;Btw, there's a new project related to source maintaining and versioning called &lt;a href="http://code.google.com/p/metacello/"&gt;Metacello&lt;/a&gt; that seems to be the next iteration of monticello, or "monticello done right", adding full support for package managing, being aware of versions and so.  I'm just guessing as I'm a newbie in both projects and I just skimmed the docs, so please, correct me if I'm wrong.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-3466772611411563871?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/3466772611411563871/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=3466772611411563871' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/3466772611411563871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/3466772611411563871'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2010/04/versioning-in-squeakpharo-using.html' title='Versioning in squeak/pharo using Monticello'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_aRXkF2maASc/S8YV6hmaS6I/AAAAAAAAAQU/5o1rnts9QH4/s72-c/screenMB.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-4097710542442183378</id><published>2010-04-12T12:56:00.008+01:00</published><updated>2010-04-21T12:25:47.995+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mis cosas'/><title type='text'>MP3 fail</title><content type='html'>Me compré un mp3 y ha ido conmigo a todas partes.  Y con él comparto momentos en los que él pone la banda sonora a mis accions, y a las situaciones en las que me veo envuelto.&lt;br /&gt;&lt;br /&gt;Es capaz de potenciar una situación, o apartarme del mundo.  Un perfecto aliado.  Hasta he ido a discotecas a escuchar mi mp3 (HAI TENERIFE).  Y a pasear a las 5AM.  Me ha hecho conocer gente, y ha dormido en casas ajenas, siempre como una extension mía, como un embajador.&lt;br /&gt;&lt;br /&gt;Lo habrán escuchado unas 100 personas distintas.&lt;br /&gt;&lt;br /&gt;Me lo compré el 12 de Abril de 2008, lo cargué de música, y no la cambié jamás.  A medida que lo escuchaba más y más, me recordaba a cada una de estas 100 personas.  Pues el 10 de abril de 2010 dejó de funcionar.  Kaput. 2 años menos 2 dias.  Con las mismas 2 Gigas.&lt;br /&gt;&lt;br /&gt;La pregunta es:  Debo llenar mi nuevo mp3 con la misma música?&lt;br /&gt;&lt;br /&gt;Portishead, Fat Boy Slim, Michel Camilo, Pearl Jam, Mama ladilla, Janis Joplin, Rare Earth, Ten years after, Zuco 103.&lt;br /&gt;&lt;br /&gt;Ya veremos si os vuelvo a ver en mi bolsillo...o os cambio por Mika ;).&lt;br /&gt;&lt;br /&gt;Si cambio, una que cae seguro va a ser &lt;a href="http://www.youtube.com/watch?v=8-cUE-dxy4c"&gt;move to the city.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Parece un cutre-post (y seguramente lo es), pero mi compi de viajes se merece una mencion. ¿no?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-4097710542442183378?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/4097710542442183378/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=4097710542442183378' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/4097710542442183378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/4097710542442183378'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2010/04/mp3-fail.html' title='MP3 fail'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8696405790788556158.post-2071292341994833912</id><published>2010-04-01T11:09:00.007+01:00</published><updated>2010-04-03T16:49:56.197+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mis cosas'/><title type='text'>First step to Zurich</title><content type='html'>Many of you know that I've been skimming job-hunting sites.  I'm not to change unless I find a cool job.&lt;br /&gt;&lt;br /&gt;Well, after talking to a good friend and wise advisor, he told me to go hunting myself.  Real good jobs have to be &lt;a href="http://www.fravia.com/"&gt;seeked&lt;/a&gt; in a smart way.&lt;br /&gt;&lt;br /&gt;So I did, and I send a few CVs to cool companies where I would really love to work.  And one of those, is (yeah, you guessed) Big Bro^WGoogle.&lt;br /&gt;&lt;br /&gt;The surprising thing is that they answered me, and told me They'll contact me further, explaining the process of the interviews and so.  I don't know if I'll be able to talk further about it, so...&lt;br /&gt;&lt;br /&gt;I'm extremely excited, but today, being the April 1st, I thought for a moment, it could be an April Fools' Day joke.  I hope not...but you never know...  Google acts in mysterious ways :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: right; font-style: italic;"&gt;A journey of a thousand miles begins with a single step.&lt;br /&gt;Lao-tzu&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8696405790788556158-2071292341994833912?l=puntoblogspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://puntoblogspot.blogspot.com/feeds/2071292341994833912/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8696405790788556158&amp;postID=2071292341994833912' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/2071292341994833912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8696405790788556158/posts/default/2071292341994833912'/><link rel='alternate' type='text/html' href='http://puntoblogspot.blogspot.com/2010/04/first-step-to-zurich.html' title='First step to Zurich'/><author><name>Raimon Grau</name><uri>http://www.blogger.com/profile/15545476302081532235</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
