aleix's blog

How to fix your wife's Nexus 5

1 May 2015 8:32 PM (android)

DISCLAIMER: I'm not responsible for what happens to your phone if you decide to proceed with the instructions below.

Are you experiencing:

  • Boot loop with Lollipop (Android 5.x).

  • Have downgraded to Kitkat (Andorid 4.x) and there's no service, camera crashes, google play store crashes, google earth tells you it needs SD internal storage and crashes.

At this point the phone seems practically unusable except wifi and only with Kitkat, Lollipop doesn't even boot.

It might be that the /persist partition is corrupted. So, don't despair, here's how I fixed it after looking around a bit:

  • Download adb and fastboot. On Ubuntu this is:

    $ sudo apt-get install android-tools-adb android-tools-fastboot
  • Power off your phone.

  • Connect your phone to your computer through USB.

  • Boot into the bootloader by pressing volume down and power buttons at the same time.

  • Unlock it:

    $ fastboot oem unlock
  • On the phone you must select the option to wipe everything. WARNING: This will wipe all contents on the device.

  • Download TWRP (an improved recovery mode).

  • Flash it:

    $ fastboot flash recovery openrecovery-twrp-
  • Reboot again into the bootloader.

  • Once in the bootloader, choose the Recovery mode. It will then start TWRP.

  • On your computer you now type:

    $ adb shell

    If everything went well this should give you a root prompt.

  • Fix /persist partition.

    # e2fsck -y /dev/block/platform/msm_sdcc.1/by-name/persist
  • Re-create /persist file system.

    # make_ext4fs /dev/block/platform/msm_sdcc.1/by-name/persist
  • Exit the adb shell.

  • Download the latest Nexus 5 factory image and untar it.

  • Finally,inside the untared directory run:

    $ ./
  • Your phone should be fixed!

  • As a last step you might want to lock it again. So, go into the booatloader again and this time run:

    $ fastboot oem lock

Good luck!

These are the couple of websites I used. Thank you to the guys who wrote it!

Tweak your Guile REPL

1 May 2013 0:31 AM (scheme | guile)

If you are new to Guile and start the REPL right away you will find yourself with no history, no completions, no colors and even the cursor keys not working as expected.

Fortunately, all these problems can be solved by loading a couple of modules.

The first one is to enable readline support. This will enable command history, completions (pressing TAB), cursors will work properly, you will have parenthesis matching, Emacs key bindings support and more.

Simply put this in ~/.guile:

(use-modules (ice-9 readline))

To colorize the REPL there is also an awesome new module, nala-repl. This module doesn't come with Guile yet, so you have to clone the repository and install it yourself:

$ git clone git://
$ cd nala-repl
$ sudo make install

And, as before, add the following lines to your ~/.guile:

(use-modules (nala colorized))

nala-repl provides some more nice modules, make sure to read the README file.

Now, go and enjoy the Guile REPL!

32-bit and 64-bit return values in OS X

25 April 2013 2:01 AM (c | mac os x)

I've spent a couple of days with a silly compiler problem. I have to admit that it was my fault but, at least, I learned something in the process. To make a long story short: do not forget to include header files and enable all warnings (-Wall).

In C, you can use a function without including its header file. Then, depending on how you set the compiler flags, it might not complain as long as it can find the function at linking time.

Imagine you have this function (defined in foo.h and implemented in foo.c) :

unsigned long foo_add (void);

and you use it in another module bar.c without including the foo.h header:

//#include "foo.h"

unsigned long bar_add (void)
  return foo_add () + foo_add ();

Compile with: gcc -c -O2 bar.c (we just missed -Wall)

If we disassemble the code of bar.o we get:

$ otool -tV bar.o
(__TEXT,__text) section
000000000000000b callq _foo_add
0000000000000010 movl  %eax, %ebx
0000000000000024 ret

Now, let's try to include the header foo.h and disassemble again:

$ otool -tV bar.o
(__TEXT,__text) section
0000000000000009 callq _foo_add
000000000000000e movq  %rax, %rbx
000000000000001f ret

Note how the compiler uses two different instructions: movl (32-bit) in the first case, when it really doesn't know anything about the foo_add function, and movq (64-bit) when it knows that foo_add returns a 64-bit value.

This can lead to unexpected behavior as I have found in the code I was working on. And actually, I have only found this in OS X.

So, please do not forget to include header files and enable -Wall. It will save you from some headaches.

add1, sub1 and + recursive process

13 April 2013 4:56 PM (scheme | guile)

In The Little Schemer you are asked to write the function + using the functions zero?, add1 and sub1, such as the result of (+ 46 12) is 58.

(define add1
  (lambda (n) (+ n 1)))

(define sub1
  (lambda (n) (- n 1)))

The solution given is:

(define o+
  (lambda (n m)
      ((zero? m) n)
      (else (add1 (o+ n (sub1 m)))))))

which is correct but has a little problem.

If you are like me (hopefully not), you might have read twenty times the first chapters of SICP (and haven't gone any further). Remember about recursive and iterative processes and recursive procedures? In our o+ case we have a recursive procedure that generates a recursive process, as the process generates a chain of deferred add1 operations.

With a recursive process we can easily blow our stack:

scheme@(guile-user)> (o+ 10 100000)
While executing meta-command:
ERROR: Throw to key `vm-error' with args `(vm-run "VM: Stack overflow" ())'.

This is because this will generate:

(add1 (add1 (add1 (add1 .... (add1 10)))))

with as many add1 as m.

So, how to improve this? With a recursive procedure that generates an iterative process:

(define o+
  (lambda (n m)
      ((zero? m) n)
      (else (o+ (add1 n) (sub1 m))))))

which will generate:

(o+ 11 99999)
(o+ 12 99998)
(o+ 100010 0)

and doesn't overflow the stack.

scheme@(guile-user)> (o+ 10 100000)
$1 = 100010

Yes, this is a tail-recursive function.

The Law of Car

10 April 2013 8:18 AM (scheme | guile)

In The Little Schemer, The Law of Car is defined as:

The primitive car is defined only for non-empty lists.

In the implementation given for (firsts l), it seems to me that the law is broken:

(define firsts
  (lambda (l)
      ((null? l) '())
      (else (cons (car (car l))
                  (firsts (cdr l)))))))

As (firsts '()) is '(). So, this would actually fail (in guile):

$ (firsts '((a b) () (e f)))
In procedure firsts:
In procedure car: Wrong type argument in position 1 (expecting pair): ()

I think a correct implementation would be (note that there's no need to write the second cond as the first cond could take multiple clauses):

(define (firsts l)
   ((null? l) '())
   (else (cond
          ((null? (car l)) (firsts (cdr l)))
           (cons (car (car l))
                 (firsts (cdr l))))))))

in which we take care of the non-empty list before getting the first typical element (car (car l)). This would result in:

$ (firsts '((a b) () (e f)))
(a e)