Create a tarball from a specific git commit

I have this code I’m working on that is needs to be deployed remotely (Fabric makes this SO easy) and I’m using git as my version control system. Well, I was creating tarballs for this, but I was basically doing them as similar as I could to what git had in the tree (ignoring the same files, etc.), so it was kind of repetitive and, boring. Well, git to the rescue!!!


git archive --format=tar HEAD | gzip > myproject.tar.gz

And you have a nice clean zipped tarball of your code as is on HEAD, without tears :)

Git is awesome!

Chrome type ahead

Don’t you wish you just could type the text of a link and then press enter to follow it on a web page? It would save tons of time! Well, there is a chrome extension that allows you to do that. My favorite extension to date by far.

Chrome type ahead

Enjoy

Performance of in operator using list and set

I had this use case where I have to check which elements of a list of words where available in another list of words. So I decided to use the operator in. Just for further reference a tried the following:

# common code for all test
base_list = [...]
query_list = [...]
  1. Pretty simple method:
    for word in query_list:
      if word in base_list:
        # do something

    For a list of 4284 elements against a list of 107 it took 9 seconds. Using simple lists, this method is the most straight forward of all, and also the slowest one.

  2. Sorting things:
    base_list.sort()
    for word in query_list:
      if word in base_list:
        # do something

    After sorting the list, guess what? Yeap, nothing changed, same 9 seconds

  3. What about sets?
    bs = set(base_list)
    for word in query_list:
      if word in bs:
        # do something

    Using sets this is another history, 0.6 seconds for the same amount of data; but… if this could be achived turning one of lists into a set, what if…

  4. Using more sets
    bs = set(base_list)
    qs = set(query_list)
    solution = bs.intersection(qs)

    0.02 seconds.

Well, as you can see, sets are great.

Changes in the website

I’m sure you have noticed the fact that this website has changed (if not, welcome!). Well, there was some issues with the previous one and after fixing the code I was completely unable to make it work again, there was some problems with python + django + mysql, very very weird (process forking, memory issues and alike), so I sadly ended giving up and installing the only blogging system made in php (or in some other language) that I would change for the one made by myself: wordpress. I have to say that it’s really nice in it’s latest incarnation :)

I’ll try to update my blog a little bit more often, so stay tunned.

Awesome 3.4-rc* and default floating layout

I think awesome wm is, well awesome. I tried the last rc but I found that all the tags were set to the floating layout by default, so digging through the internet I found these bug that is exactly what was happening to me:

For the lazy ones, here is the solution:

Change:
tags[s] = awful.tag({ 1, 2, 3, 4, 5, 6, 7, 8, 9 }, s)

to:
tags[s] = awful.tag({ 1, 2, 3, 4, 5, 6, 7, 8, 9 }, s, layouts[1])

taken shamelessly from the ticket.

Emacs 23 released!

Read the announce and new features here

Problems shuting down Gentoo with kernel 2.6.29

I updated my laptop a few days ago and suddenly it failed to shutdown correctly, it powered down but without finishing the shutdown process. Today, while reading the spanish users mailing list I found the solution.

In /etc/conf.d/alsasound, set:

UNLOAD_ON_STOP=”no”

KILLPROC_ON_STOP=”no”

This fixed the problem. Here is the original thread

What did I do the past 3 months?

Well, I’ve been doing an internship at a known internet company and it has been an awesome experience. I’ve learned quite a lot, I had an amazing host and a very supportive team. Now I’m on my way back home, and there’s nothing like a couple of hours in an airport to raise the blogging enthusiasm.

I worked with java, that language that I didn’t like too much because, as on of my friends at work said, there is too much plumbing needed to do anything. But, now I feel more respectful to the java camp, and definitely I’m going to keep writing some code in java, after all, if you consider that skills are based on real production code written, java would be my “main” language. (Although is hard to admit)

I did practice some elisp, and I realized tahat even with cool IDE’s with pretty nice features, nothing beats emacs at manipulating text files. Changing editors is a very hard topic, you have to deal with muscle memory and such, and then you found thos little things you take for granted as… how to move.

Well now is time to go back, to my girlfriend and my family!

Do you want to show off emacs?

Take a look at this screencast. Just amazing, I found it while reading the emacs wiki page of cedet.

Elisp func to create a dummy admin.py

While writing a django app, I faced the tedious task of updating the corresponding admin.py file for the models I was writing. Because I didn’t want to customize any of the admin options just yet all I had to do is insert new register entries on the file (one for model). I grew tired of this pretty soon so I wrote this elisp function to update an admin.py file easily. Hope this helps somebody

(defun rl/django-admin-all-models()
(interactive)
(let ((content " "))
  (with-temp-buffer
    (insert "from models import *\n")
    (insert "from django.contrib import admin\n\n")
    (let ((text-start (point)))
  (insert-file-contents "models.py")
  (keep-lines "^class.*$" text-start (point-max))
  (while (re-search-forward "^class \\(\\w+\\).*" nil t)
    (replace-match "admin.site.register(\\1)"))
  (write-file "admin.py" nil)))))

A word of warning: this will override your current admin.py