Fedora giving FOSS graphics driver “nouveau” a try

The free and open-source graphics driver for Nvidia graphics cards “nouveau” is going to be tested in the Fedora distribution. I have to say that, as a user, I have some troubles with Fedora right now but this move makes me happy. Even of I do not have this kind of graphics boards in use any more. :-)

Yeah, you heard right: I don’t use Nvidia hardware and I find it great that Fedora is trying ‘nouveau’. I even read the development’ teams status updates and was anticipating the day some distribution would make their support official (I know it is in Debian as well).

Let me use this nice news to point to a big adversity that is coming to the embedded Linux world (or is already there). The PowerVR SGX is a graphics chip for embedded use. It is very powerfull but requires not much power to run. :-) It is also contained in many of the new embedded CPUs like OMAP3/4, i.MX51 etc. Soon many consumer devices running a Linux-based OS will be delivered to users (e.g. the new Nokia internet tablet and the Touch Book). If you own an Intel Atom-based system with a ‘Poulsbo’ graphics chipset you already have an SGX implementation. The new Qt version already has a GL widget which can be driven by the SGX.

And this is where the shit hits the fan: At this time the OpenGL ES drivers for the SGX are proprietary and can only be distributed through your particular vendor. It is also like when asking about Jazelle things. Everyone is extremely close-lipped. I doubt that this has something to do with a possible move towards free software (*curses NDAs*).

I can’t do anything about this but I can utter my discontent. If you are affected by the above situation you may do so, too.

My BeagleBoard also contains an SGX. :|

Shark bites ARM

No this post is not about a tragic accident.

It is about the half-way successful attempt to get the Shark JIT compiler, which is funded by Red Hat and developed by Gary Benson as part of the Zero (assembler) port of the Hotspot Java VM, running on devices equipped with ARM processors. If this catches your interest then you won’t be dissappointed.

The state of the union is this:

  root@beagleboard:~# ./azureus
  1       java.lang.String::equals (88 bytes)
  2       java.lang.String::hashCode (60 bytes)
  3       java.lang.String::indexOf (151 bytes)
file:/usr/share/java/Azureus2.jar ; file:/usr/share/java/swt-gtk-3.4.jar ; file:/home/root/
  4  !    sun.nio.cs.US_ASCII$Encoder::encodeArrayLoop (279 bytes)
  5       java.lang.String::lastIndexOf (156 bytes)
  6       java.lang.String::charAt (33 bytes)
  7       java.util.Properties$LineReader::readLine (452 bytes)
  8       java.util.Properties::loadConvert (505 bytes)
  9       java.lang.Object::<init> (1 bytes)
 10       java.io.UnixFileSystem::normalize (75 bytes)
 11       java.lang.String::replace (142 bytes)
 12       java.lang.String::indexOf (166 bytes)
 13       sun.net.www.ParseUtil::encodePath (336 bytes)
 14       java.lang.String::startsWith (78 bytes)
 15       java.util.jar.Manifest$FastInputStream::readLine (167 bytes)
 16  !    java.io.BufferedReader::readLine (304 bytes)
 17  !    sun.nio.cs.US_ASCII$Decoder::decodeArrayLoop (241 bytes)
 18       java.lang.String::getChars (66 bytes)
 19       sun.misc.MetaIndex::mayContain (51 bytes)
 20       java.lang.CharacterData::of (120 bytes)
 21       java.lang.CharacterDataLatin1::getProperties (11 bytes)
 22       java.lang.Math::min (11 bytes)
 23       java.util.HashMap::indexFor (6 bytes)
 24       java.lang.String::startsWith (7 bytes)
 25       java.lang.String::<init> (20 bytes)
 26       sun.misc.URLClassPath::getResource (74 bytes)
 27       java.lang.AbstractStringBuilder::append (60 bytes)
 28  !    sun.nio.cs.ISO_8859_1$Encoder::encodeArrayLoop (356 bytes)
 29       org.gudy.azureus2.core3.util.ByteArrayHashMap::hash (29 bytes)
 30       java.util.HashMap::hash (23 bytes)
 31  !    sun.nio.cs.ISO_8859_1$Decoder::decodeArrayLoop (263 bytes)
 32       java.nio.Buffer::position (42 bytes)
 33       java.nio.charset.CoderResult::isUnderflow (13 bytes)
 34  !    java.net.URL::<init> (543 bytes)
 35       java.util.HashMap::put (126 bytes)
 36       java.util.HashMap::transfer (83 bytes)
 37       java.util.HashMap::get (79 bytes)
 38       java.lang.Character::toLowerCase (9 bytes)
 39       java.lang.CharacterDataLatin1::toLowerCase (39 bytes)
 40       java.lang.String::toLowerCase (436 bytes)
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  Internal Error (os_linux_zero.cpp:223), pid=1728, tid=1762903184
#  Error: caught unhandled signal 11
#
# Java VM: OpenJDK Shark VM (14.0-b08 mixed mode linux-arm )
# Distribution: Built on Debian GNU/Linux unstable (sid)
# An error report file with more information is saved as:
# /home/root/hs_err_pid1728.log
#
# If you would like to submit a bug report, please include
# instructions how to reproduce the bug and visit:
#   http://icedtea.classpath.org/bugzilla
#

This may look terrible to you, but is actually much much more than what we had the weeks before. Lets tell the story from the beginning.

As you may have read on the BugLabs blog tarent was contracted to get OpenJDK running on the Bugs. Since BugLabs uses a variant of OpenEmbedded named Poky this meant getting OpenJDK cross-compiled. This alone was an interesting and complicated thing but was eventually finished and I did a presentation at FOSDEM 2009 about this work (slides: PDF ODF).

The work on OpenJDK contained three parts:

  • get it running with the Zero port
  • get it running with Cacao as the VM
  • get as far as possible with Zero and the Shark JIT compiler

The first two items where completed in time and showed good results. Back in February the cross-compiled Shark was based on LLVM 2.4 and could barely display “Hello World” and then crashed abruptly. In the following weeks I had no time to look at this problem. However at FOSDEM I met Xerxes Ranby who is also interested in getting OpenJDK (through IcedTea) running on his ARM devices.

This is what HelloWorld looked like:

root@beagleboard:~# java HelloWorld
Hello World!
java:
/home/rob/oe/beagle/tmp/work/armv7a-angstrom-linux-gnueabi/llvm-2.4-r0/llvm-2.4/include/llvm/CodeGen/MachineOperand.h:251:
int64_t llvm::MachineOperand::getImm() const: Assertion `isImm() &&
"Wrong MachineOperand accessor"' failed.
Aborted

Things started moving again last monday (23rd). Efforts to find out what is wrong with LLVM 2.4 eventually culminated in using the next release 2.5 since the method in which the error occured was already removed.

To my pleasure the update had the immediate result that the major Java enterprise application (aka HelloWorld) worked flawlessly:

root@beagleboard:~# java -XX:+PrintCompilation HelloWorld
  1       java.lang.String::equals (88 bytes)
Hello World!

The line above “Hello World!” indicates that Shark has compiled a method and run it. Nice!

Yet, lesser known Java applications like Azureus had a little trouble:

root@beagleboard:~# ./azureus
  1       java.lang.String::equals (88 bytes)
  2       java.lang.String::hashCode (60 bytes)
  3       java.lang.String::indexOf (151 bytes)
file:/usr/share/java/Azureus2.jar ; file:/usr/share/java/swt-gtk-3.4.jar
;   4file:/home/root/
  !    sun.nio.cs.US_ASCII$Encoder::encodeArrayLoop (279 bytes)
  5       java.lang.String::lastIndexOf (156 bytes)
  6       java.lang.String::charAt (33 bytes)
  7       java.util.Properties$LineReader::readLine (452 bytes)
  8       java.util.Properties::loadConvert (505 bytes)
Cannot yet select: 0x8ed18: i32,ch = AtomicCmpSwap 0x8e2f4, 0x8ea70,
0x8eeb0, 0xdf2a8 <0x11844c:0> <volatile> alignment=4
Aborted

This time the reason is to be found in the last line. It tells you that it cannot generate machine code for “AtomicCmpSwap”.

At first I tried my luck getting this support into LLVM. However I am not the compiler guy and had my difficulties understanding how that should be done. I am sure that someone with the neccessary knowledge could do it in a few minutes … :|

Nevertheless Xerxes Ranby had the cool idea to try something different. The use of the “AtomicCmpSwap” comes from the Shark implementation itself. The function is a built-in or intrinsic in LLVM and really can be considered to be like a function. Xerxes’ idea now was to replace the use of “AtomicCmpSwap” with a call to a function that does exactly the same and is implemented within Zero. When I came home today Xerxes already had a patch for me to try out. I rebuilt Shark and after installing it on my Beagleboard started Azureus. The result is what I called the state of the union above.

Since it is clear we are on a winning streak work on this is continuing right now. For all the mentioned experiments we where using IcedTea 1.4 and 1.4.1 which are more than 4 weeks old. In the meantime a lot of changes have been applied to Shark. Keep your fingers crossed that I can soon show you some nice screenshots of a Java app running on Shark. :-)

PS: LLVM’s MIPS backend is also missing atomic operations support and our approach to it, will work there as well.

Comments on latest post on OpenJDK

Hi,

there have been interesting questions in the comments sections of my last post. I take the time to answer them here:

Mark Wielaard asked: Finally, do you have any speed comparisons of the hotspot/zero and cacao on arm ?

Unfortunately not. Subjective it feels as if the SwingSet2 demo runs better with Cacao. The Freerunner and its software are also not in a good shape to make performance tests. Even native C applications show unacceptable slow behavior.

Xerxes Rånby said: Your combined effort have provided the key to unlock the possibility to run OpenJDK on all embedded Linux NAS storage devices, home routers and more )

Indeed and I very much welcome people to try compiling the recipes for their MIPS devices as well. I also wonder if OpenJDK can be compiled against uClibc and uClibc++. If that is the case then we can also have OpenJDK+Hotspot/Zero on AVR32 (though a few more patches to the build system will be needed for this). )

Andrew John Hughes wrote: What version of IcedTea did you use? I think some issues have changed/been fixed. Certainly –with-openjdk-src-dir isn’t broken any more )

I used the latest from the stable release: 1.3.1. Good to hear that some issues are already fixed. I am looking forward to integrate some patches after Xmas.

Eric Herman wrote: My sense is that Java is not truly Free if I can not bootstrap it from C, and I was of the impression that I still needed a working Java in order to build Java. I look forward to learning more about the excellent work you’ve been doing.

Actually with OpenEmbedded this is the case: OpenJDK is bootstrapped without the need for a pre-installed Java runtime. What I left out in my explanation is that all of this builds on top of my previous work on a completely self-hosting Java^H^H^H^HJava-like toolchain based on GNU Classpath, JamVM/Cacao, ECJ and eventually Jikes. I have written down the gory details of this in the OE wiki to make it possible that anyone can pick up my work enhance it or re-use it in another build environment.

Finally Wladimir Mutul asked: Why not use Scratchbox(.org) for your cross-compilation ?

Before starting with OpenEmbedded Jalimo was only targeting the Nokia Internet tablets and as such we build our stuff with Scratchbox. First of all: I really like the Debian-way of packaging things (all of the Java related recipes in OE resemble Debian conventions for instance). However three points were most important when deciding to leave the Scratchbox path:

  • At the time we worked with SB it was not possible to either get JamVM or Cacao working reliably inside SB. So we had to use Jikes as a Java compiler. GNU Classpath adopting Java 1.5 syntax would have made it neccessary to use ECJ instead which needs a Java runtime.
  • OpenMoko appeared on the scene and we wanted to provide binaries for this platform. Additionally we had an Irex Iliad (an Ebook reader) and wanted to support it, too. OpenEmbedded built for those out of the box and it turned out that with little work OE could be modified to support Maemo as well.
  • Last but not least with SB a lot of manual work was involved when integrating a new patch or updating to a new version. With OE it is a matter of renaming a recipe and checking which patches are still needed. Gentoo packagers do it in the same way.

It should go without saying that I miss things that would be available by basing everything on Debian. E.g. source packages, direct support for Ant builds, many many tried and tested packages and of course GCJ. Furthermore it isn’t all bright and shiny with OE either. For instance the project is an extremelyfast moving target. People add new stuff to it everyday. Some things have effects on your recipes and may cause build problems. However this is why projects like Poky exists which make stable release on top of OE snapshots.

I hope my explanations cleared things up a bit.

Happy holidays!

Serving cross-compiled OpenJDK with IcedTea

As Ken and Sebastian have already announced it OpenJDK integration into Jalimo was finished. However there was a bit of work to do to not only compile OpenJDK but to also package it nicely. This work is now also completed.

Additionally – and this was not told anywhere else yet – we can now also offer Cacao+OpenJDK. So anyone who is in need of a decent JIT for its target platform can now build this combination, too.

Those who do not know OpenEmbedded may wonder what is so special about the work I have done in the last weeks. Well, the special thing is that we are cross-compiling the OpenJDK. That means the machine on which the JDK is built is of a different kind than the one on which we want to run it later on. The difficulty stems from the fact that the OpenJDK build system is not designed for this (in contrast to the one used by PhoneME btw).

Before I will tell you about the guts of cross-compiling OpenJDK lets enjoy some screenshots:

jtunermetalworks fontdemo netx - warningnetx - aboutjdiskreportswingset2 (openjdk at freerunner)

People may have seen these apps on their desktops and as such they are not very exciting. However for me they have a special meaning: As a contributor to GNU Classpath it was always my wish to be able to run any Java (=J2SE) program on any device running a Free operating system. I was contributing to the Free Swing implementation and together with the enormous work done by Roman, Thomas, Lillian and many others we were able to run a few Swing and AWT programs. Still performance, completeness and correctness of our implementation where limited in many places and would require more years of dedicated effort. Thanks to Sun releasing Java as free software and the important work done by the IcedTea team we can now have the real thing on our devices and suddenly get 100% compatibility. :-)

Now on to the cross-compilation guts:

First of all compared to the work that would have been required with plain OpenJDK IcedTea made the effort of cross-compiling the thing a breeze. The best thing that IcedTea provides is the ability to use a GNU Classpath-based toolchain to build OpenJDK. On the major distros GCJ is used as a runtime and ECJ as the bootstrap Java compiler. In OpenEmbedded we have JamVM, Cacao and plain GNU Classpath as runtime options which work equally well. JamVM does not understand some of the “-X”options so I had to patch their use away.

Although IcedTea is a nice environment I had to patch a few things to get things started. E.g. IcedTea requires you to point to a GCJ home directory. It will then create symlinks to libraries and headers files contained within them. The problems with IcedTea are: When cross-compiling the libraries provided by your system’s GCJ do not make sense for your target (e.g. your system GCJ has AMD64 binaries while your target requires those for ARM). Secondly in a cross-compilation environment like OpenEmbedded you do not want to rely on stuff outside the environment. As such I had to modify this behavior to link to header files (jni.h and likes) which are provided by the OE-built GNU Classpath.

There where other problems like IcedTea not respecting the –with-openjdk-src-dir option. It will still try to download the OpenJDK sources itself (which is not allowed in OE, because this is done through the environment).

All in all I collected my changes in patches which I called ‘build hacks’. I consider these hacks fixable and will work together with the IcedTeam team to resolve those for future releases in order to make cross-compiling OpenJDK even easier in the future.

Besides IcedTea I had to patch OpenJDK itself to get things compiled properly. The first thing that causes trouble is that you cannot chose the compiler being used. OpenJDK contains some complicated makefiles that check your system environment and then decide which compiler to use. I used good old sed to replace the respective part of the makefile. I believe this behavior can be added to IcedTea without causing any harm to the other IcedTea users.

The next problem is the sanitizing step. This one will compile a few binaries (for the target platform!), run them (impossible) and decide on their output whether the build can continue. These checks are done for CUPS and Alsa. The fix is to patch them away. I think an optional –disable-sanity-checks would be OK for IcedTea.

The final big problem with OpenJDK’s build system is that it uses the result of ‘uname -m’ for its decision. This is troublesome because ‘uname -m’ will only tell you the architecture of your build machine not the target one. I solved this by replacing all these calls with a variable and allowed IcedTea’s makefile to provide a value for this.

The remaining issues where minor: Some unsuitable paths here, a sizer.32 binary that I had to take from a previous non-cross build there.

Apropos non-cross build. This was the really ambitious undertaking. But before I explain this here are some cross-compilation basics that I learned in the years contributing to OpenEmbedded:

Non-cross compilation aware projects are troublesome when they create binaries whose output is going to be used directly in the build. The general approach to this problem is that you first compile this particular binary for your build system and use it in the cross-build. In OpenEmbedded this will often result in a separate build recipe. If your project is cross-compilation aware it will allow you to specify the location of such binaries. E.g. Cacao 0.99.x has the –with-cacaoh option to point to the location of the non-cross-compiled header generator. In non-cross-compilation aware projects you need to patch the makefiles accordingly.

The IcedTea build normally consists of two builds of the JDK. The first one creates a bootstrap JDK. This one is heavily patched, stripped down and can be build using GNU Classpath-based software. In the second step the bootstrap JDK’s java, javac and a few other binaries are run to build the final JDK. For our cross-compilation effort this means we need to get this bootstrap JDK built for the build machine and as said above this is where things get troublesome.

The reason for this is that OpenJDK depends on a few libraries like CUPS, Alsa, libjpeg and giflib which I either had to provide in their native (= for the build system) form or patch their use away. Remember that I cannot just take e.g. Debian’s libcupsys-dev because that would be outside the OpenEmbedded build environment (and would make people unhappy who use OE on a different distro).

I decided to go the way of patching the bootstrap JDK build since printing and sound would not be needed for bootstrap purposes anyway. Originally I also disabled most of the AWT (and as such the libxt, xproto dependencies). However it turned out that at one point the OpenJDK build converts a bunch of GIF pictures into Java byte array source code using javax.imageio which requires the headless variant of the AWT.

A few lines above I told you that the bootstrap JDK is compiled separately for the build machine. In a simple project we could now skip this part from the cross-compilation build. However the bootstrap JDK build also creates libraries (for the target machine) to which the final JDK links against. That is why we cannot skip this part.

So cross-compiling OpenJDK consists of the major steps:

  • build a GNU Classpath-based toolchain (gjar, gjavah), ECJ and Ant
  • build the bootstrap JDK for the build machine (’make icedtea-against-ecj’)
  • build the bootstrap JDK for the target machine
  • replace the binaries in bootstrap/icedtea/bin with those of your native boostrap JDK
  • build the final JDK

and as I have written in the first part of this posting: You need to patch everything heavily to get some problems out of the way which stem from the fact that OpenJDK is not cross-compilation aware.

Finally a screenshot showing Cacao+OpenJDK:

cacao + openjdk

The next step will be integrating Hotspot-Shark into OpenEmbedded and of course getting as many of my patches upstream as possible.

Compared to GNU Classpath + Cacao/JamVM the OpenJDK packages are ~6 times larger. I am curious to see how the modularization efforts of Java7 works out. With the work done now it will be much easier to follow those developments. :-)

Edit: Fixed images links.

Even more PhoneME Advanced stuff

The support for PhoneME Advanced in Jalimo (and thus in OpenEmbedded) is getting better every day. Apart from upgrading to build 87 I took Ken Gillmers recipe for PMEA with the personal profile (think AWT support) and adjusted it a bit. A test build for the BeagleBoard went so smooth that I decided to put it into OE’s repository immediately.

Mandatory screenshot:PhoneME Advanced Personal - big

That image shows two instances of PMEA running the “personal” and “basis” demo (top left and top right). For added fun I also started the ‘basis’ demo with Cacao 0.99.2 (with some fixes for hardfloat) and GNU Classpath 0.97.2.

Suffice to say this recipe is now not only available for the BeagleBoard but also for OpenMoko, Maemo/IT OS, Gumstix, BugLabs BUGs and the plethora of other devices supported by OpenEmbedded.

Have fun!

PhoneME for Jalimo – continued

We all love it: Screenshot time!

This is PhoneME running on an N800 with the Chinook/Maemo 4.0/OS 2008 distribution. Since the differences between Maemo’s Chinook and Diablo distribution releases are minimal you should be able to use the same packages on both. More on that later.


And here we have the same app (= jalimo-swt-example) running on OpenMoko’s Freerunner.

Needless to say that startup and runtime performance of PhoneME simply rock: The small SWT-based UI appears within 4 to 5 seconds on both devices.

If you have any of the two devices (or an N810) you can now install the JVM through Jalimo’s repositories. Get them while they are hot. ;-)

PhoneME Advanced Foundation (with JIT) at Jalimo

This was a big pile of work but now it is a nice achievement for Jalimo: The most complicated issues have been sorted out and we can now build Sun’s PhoneME Advanced (Foundation profile) with the JIT compiler enabled for all our little ARM devices (And not only we can do this but everyone because the recipes are in the repository).

The first device for which I could build the runtime was the BeagleBoard. You can see the full log of the first bits of CVM-goodness on that device here. What is important to note is that the JIT compiler is enabled:

CVM_JIT=true

When compiling the source with the JIT the build gets a bit more complicated: Some Java programs will be compiled and run on certain sources. What  is nice that these helper programs actually run on a GNU Classpath-powered VM. See, this code is still does usefull things for us. :-)

Buglabs recently did a comparison of Cacao, JamVM and PhoneME Advanced (interpreted only) on ARM systems. Surprisingly (or not :-) ) JamVM does a very good job!

While we are at it: JamVM seems to be the only (free!) Java virtual machine that can run on the AVR32 architecture. The port is not yet included in the upstream repository but is nevertheless quite interesting: The guys doing the port are making use of the Java hardware acceleration (whose specification can be obtained freely).

Finally the other day I wrote down everything about the Java support in OpenEmbedded to the shiny new OE wiki. I hope that with this information people will quickly be able to customize their OE-based distribution. Furthermore the pages describe the quite complex bootstrap process and each of the packages that belongs to it.

Next stop: OpenJDK ;-)

breiPott: Free (as in Freedom) music party in Berlin

Now this is cool!

Yesterday I learned about a club in my city that exclusivly plays CreativeCommons-licensed music. According to their website they also make sure that only those variants of the CC-licenses are used that free software people would identify as ‘free’ :-)

Tommorrow there will be a party where they celebrate the adaption of the latest CC-BY-SA (version 3.0) to the German jurisdiction. They use a CC-BY-SA licensed excerpt from OpenStreetMap on their flyer:

Damn, I find it so cool when people combine all those free as in freedom things! In my opinion this is exactly the goal we wanted to achieve with the free software movement and which many of its naysayers and opponents did not get. :-)

And while talking about OpenStreetMap. Here are two examples from OSM which shows that this effort has so much potentiality in being vastly superior than existing proprietary map data.

The first screenshot is from the area around the city train station Ostkreuz (some 500m from my home):

Noticed those crossed quads connected by grey lines which start in the west of the Lenbachplatz? Those are overhead power lines. So imagine if you want to move within Berlin and want to avoid living besides those, just scan the area with OSM first. :-)

The next example is from the Teufelsberg (a hill) which lies within the Grunewald forest:

Some really hard-working people (perhaps its just one who knows) have mapped all the footways in the forest surrounding the hill. If you look up the same spot on the proprietary Google Maps you will only see a large green area with no ways drawn in.

Well done OpenStreetMap!

Now imagine every place on the planet would have such incredible accuracy and you do not need to sign a contract with anyone to use that data in any way you want: This is what we mean with “free as in freedom”.

Invasion of the low power devices

Thanks to TI and the drawing they did at LinuxTag 2008 I got a BeagleBoard Rev. B4. When the package arrived I started getting the necessary serial cable.

This board is unbelievable small. You get in a small box together with a mini USB cable:

And now on to my favorite: The OMAP3 on the board runs at 500 MHz. As you see it is not dangerous to put a finger on the running CPU :-)

Some other CPU manufacturers should better work on being as efficient as this one instead of wasting money with delusive marketing campaigns.

Despite
there are not many Beagleboards in the wild the community around it is
quite active. Without doubt Koen Kooi is ahead of everyone else: He is
fixing kernel, gcc and mplayer problems altogether. Thanks to this work,
people will have it a lot easier when the board can finally be bought
in shops.

Jalimo on
the Beagleboard is currently blocked by libtool 2.2 and/or GNU
Classpath issues. I have a workaround but am waiting for answers from
the libtool developers about a real solution.

She got me again

Looking carefully at the posts from GNU Classpath members you realize that a lot of them play an instrument. Years ago I took (acoustic) guitar lessons but did not continue this after moving.

One thing that bothered me over the years is that when I heard a nice song and started finding out how the (guitar) melody is played either I was not skilled enough or it just does not sound good on the acoustic guitar.

Three weeks ago I put and end to this situation and decided to take guitar lessons again. This time I will learn to play the electric guitar which I think is the instrument I like more. I am a big fan of indie rock and brit pop music. Listening to Johnossi and the Blood Red Shoes as well as visiting the Immergut festival (where both bands played) certainly had a great impact on my latest decision.

Just one note: If deep in your mind the idea that one day you start learning to play an instrument is buried, do not wait any longer and start learning today! I think the worst thing that can happen is that you realize that you have a little bit of talent since this means you wasted time and could have started earlier …

After a week of practicing the pick I got with OpenMoko’s Neo1973 broke :-)


 

Will try harder