Fast am Ziel

Nachdem ich letzte Woche auf die neuen powerSpeed Tarife der Energie AG für Privatkunden hingewiesen wurde (hier zu finden), habe ich wieder Mal bei der Energie AG angerufen und um einem solchen Anschluss gebeten.

Der freundliche Herr am Telefon hat mir versprochen sich meine Situation anzusehen und sich wieder zu melden. Diese Woche läutete dann das Telefon und der selbe Herr war dran. Ich habe mich schon auf die nächste Absage eingestellt, doch zu meiner Überraschung und großen Freude, hat er mir mitgeteilt dass ich einen Glasfaseranschluss von der Energie AG bekomme.

Er hat mir dann auch erklärt wie das ablaufen wird. Das hat gezeigt, dass er sich die örtlichen Gegebenheiten schon genau angeschaut hat. Die notwendigen Grabungsarbeiten sollen im März stattfinden. Ich habe dann auch noch sofort einen Vertrag per email erhalten, unterschrieben, gescannt und zurückgesendet.

Das ganze ist für mich ein schönes Weihnachtsgeschenk. Endlich bekomme ich genau den Internetzugang für den ich schon lange gekämpft habe  (fiber to the home). Hoffentlich kommt da nichts mehr dazwischen *fingers crossed*

In diesem Sinne frohe Weihnachten!

Österreich unter den Verlierern beim Ausbau des Glasfasernetzes

Wer mich und meinen Blog kennt, der weiß dass, ich mich hier schon das eine oder das andere mal über den miserablen Zustand der österreichischen Internetzugänge beschwert habe. Heute bin ich auf einen Spiegel Artikel von Sascha Lobo mit dem Titel Ein digitalpolitisches Armutszeugnis gestossen. Darin geht es um verschieden Versäumnisse der deutschen Bundesregierung im Bereich Digitalisierung und es kommt under anderem folgender Punkt vor:

die dramatisch vernachlässigte Infrastruktur. Während andere Länder zweistellige Milliardenförderungen in Glasfasernetze pumpen, ignoriert die Bundesregierung, dass die Unternehmen allein niemals die ungeheuren Investitionen stemmen könnten – und wenn, dann nur mit schädlichen Hilfsmitteln wie der Aufgabe der Netzneutralität oder fatalen Drosselungsdummheiten. Das Resultat: Die Auflistung der 22 europäischen Volkswirtschaften mit den meisten Glasfaseranschlüssen beinhaltet Deutschland gar nicht erst. Weil die Darstellungsgrenze bei einem Prozent liegt. Das klitzekleine Russland kommt auf 14 Prozent Haushalte mit Glasfaser, das superreiche Bulgarien auf 17 Prozent, und in Litauen verfügen mehr als doppelt so viele Haushalte über Glasfaser wie in Deutschland. Und zwar in absoluten Zahlen.

Wenn man sich die Auflistung in dem Bericht “Winners and losers emerge in Europe’s race to a fibre future” ansieht sucht man Österreich unter den Top 22 beim Glasfaserausbau Europas natürlich auch vergeblich. 

Auch der Aspekt der morgen anstehenden Nationalratswahl macht mich nicht zuversichtlich dass sich hier mit der nächsten Regierung viel tun wird.

Named access on the Window object in Safari

downloadThis week we noticed that the user administration of our time tracking app timr behaved different on Safari.

I debugged into that issue and found out that a condition in JavaScript behaved different than in other browsers:

if (assignedGroupTable) ...

The variable assignedGroupTable was defined some lines before with

var assignedGroupTable;

and the condition should be false on the first call of that function, but in Safari it was true. The debugger showed that the value of assignedGroupTable seemed to be a DIV – there was a DIV in the page with an ID assignedGroupTable, but it had never been assigned to that variable. It seemed like Safari automatically assigned the DIV, with the ID, that was equal to the variable name, to the variable.

After a quick search, I came to this article about DOM Element References as Global Variables and I was really surprised, about what I read there. It seems like all modern browser implement the Named access on the Window object, which allows you to access elements via the ID or NAME attribute, simply by using it like a variable in JavaScript.

So why did our code behave different in Safari? I adapted the example the article uses to find the difference in the behaviour of Safari.

<html>
 <head></head>
 <body> 
  <button id="bar">Button</button>
  <script>
   console.log(bar);
  </script>
 </body>
</html>

On modern browsers (Chrome 29, Safari 6, Firefox 22, IE 10) this logs the button element to the console. But when making a small change the browsers behave different:

<html>
 <head></head>
 <body> 
  <button id="bar">Button</button>
  <script>
   var bar;
   console.log(bar);
  </script>
 </body>
</html>

In Chrome, Firefox and IE this logs undefined to the console, only Safari still logs the button element!

There were two ways to fix our problem:

  1. rename the ID of the DIV or the variable so that they differ
  2. define the variable in the JavaScript with
    var assignedGroupTable = null;

    setting the value explicitly to null

Wo decided to do the second because it required fewer changes.

Erstes Treffen der Softwerkskammer Linz

Letzten Mittwoch fand in Linz das erste Treffen der Softwerkskammer Linz im Daxbau statt. Die Softwarkskammer ist:

… ein Zusammenschluss von Communities of Professionals, die über den ganzen deutschsprachigen Raum verteilt sind. Uns geht es darum, gute Software zu entwickeln, und zwar im Hinblick auf alle Aspekte.

Wir möchten

  • voneinander lernen und Erfahrungen austauschen
  • die Software erstellen, die der Kunde wirklich braucht
  • sicherstellen, dass unsere Ergebnisse eine hohe interne und externe Qualität besitzen
  • flexible, leicht änderbare Software herstellen

Kurz: Wir wollen die richtige Software entwickeln, und wir wollen die Software richtig entwickeln.

Grundsätzlich wird bei den Treffen praktisch gearbeitet werden, also keine Frontalvorträge gemacht. Beispiel für solche Aktivitäten der Softwerkskammer:

Hört sich interessant an, weil mir die Aussicht gefällt, mal gemeinsam mit einem Entwickler, aus einem ganz anderen Umfeld (Firma, Programmiersprache, …), eine Aufgabe zu lösen und neue Sichtweisen zu bekommen.

Ich habe ja schon mal gebloggt (siehe hier und hier) dass ich es ziemlich cool finde welche Gruppen und Events sich in den letzten Monaten in Linz ergeben haben:

Für mich bieten alle diese Gruppen interessante Themen (und auch Themenüberschneidungen) und ich muss mir wirklich überlegen welche Treffen ich besuche, wenn mehrere in eine Woche zusammenfallen. Bin schon gespannt wie sich diese Treffen weiter entwickeln.

PS: Am Dienstag den 6.8.2013 findet das nächste Technologieplauscherl bei Neturals statt.

Grails 2.2.x and the problem with inner classes

We have been using Grails 2.2.x in some of our projects since it came out last year. Last week when I tried to upgrade another project because it was time to develop some new features I ran into a strange problem after upgrading from 2.1.3 to 2.2.1:

org.codehaus.groovy.grails.web.pages.exceptions.GroovyPagesException: Error processing GroovyPageView: Error executing tag : Error executing tag : java.lang.VerifyError: (class: com/troii/project/tags/SomeTag$Info, method: getSession signature: ()Ljavax/servlet/http/HttpSession;) Incompatible object argument for function call
	at com.googlecode.psiprobe.Tomcat70AgentValve.invoke(Tomcat70AgentValve.java:38)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:722)
Caused by: org.codehaus.groovy.grails.web.taglib.exceptions.GrailsTagException: Error executing tag : Error executing tag : java.lang.VerifyError: (class: com/troii/project/tags/SomeTag$Info, method: getSession signature: ()Ljavax/servlet/http/HttpSession;) Incompatible object argument for function call

I had never seen a java.lang.VerifyError exception before and the second strange thing was that the exception only occured when deploying the war in a tomcat not when starting the app with grails run-app.

Searching the web brought up some JIRA issues:

GRAILS-9627 inner class or enum in domain class breaks unit/integration testing
GRAILS-9784 Using an anonymous inner class in Controller causes VerifyError
GRAILS-10068 inner class in controller class breaks unit testing

and a blog post from someone who experienced the same issue.

Seems like with the update from Groovy 2.0.6 to 2.1.0 caused a compilation problem for inner classes. I had no chance to test with Grails 2.2.2 which was release three days ago but it seems the only workaround currently is to move the inner classe to external ones.

UPDATE: Seems Grails 2.2.2 improved a lot, at least for our project it works.

Java Bean Getters/Setters

Many Java developers think they know everything about Java Beans and the correct getter/setter styles, but there are some hidden traps ;-)

Let’s do a little quiz!

How should the correct and getter/setter for a property with the following field look like?

private String name;

This is an easy one:

public String getName() {
  return name;
}

public void setName(String name) {
  this.name = name;
}

Notice that the first letter of the field was made uppercase.

Here is a different one:

private String URL;

The correct getter/setter methods would look like:

public String getURL() {
  return URL;
}

public void setURL(String URL) {
  this.URL = URL;
}

In this example the field was already uppercase so nothing was changed in the getter/setter.

So what’s about a field like this:

private String iMessageId;

This one is a little bit tricky – could you guess the correct getter/setter?

public String getiMessageId() {
  return iMessageId;
}

public void setiMessageId(String iMessageId) {
  this.iMessageId = iMessageId;
}

It is important that the case was not changed – like for the URL field. This happens when the second letter of the field name is already uppercase. The reason for this is the method java.beans.Introspector.decapitalize:

/**
 * Utility method to take a string and convert it to normal Java variable
 * name capitalization.  This normally means converting the first
 * character from upper case to lower case, but in the (unusual) special
 * case when there is more than one character and both the first and
 * second characters are upper case, we leave it alone.
 * 

* Thus "FooBah" becomes "fooBah" and "X" becomes "x", but "URL" stays * as "URL". * * @param name The string to be decapitalized. * @return The decapitalized version of the string. */ public static String decapitalize(String name) { if (name == null || name.length() == 0) { return name; } if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) && Character.isUpperCase(name.charAt(0))){ return name; } char chars[] = name.toCharArray(); chars[0] = Character.toLowerCase(chars[0]); return new String(chars); }

I guess this one was new to some of you, wasn’t it?

The last example applies to boolean properties. We know that the getter/setter for

private boolean active;

may look like

public boolean isActive() {
  return active;
}

public void setActive(boolean active) {
  this.active = active;
}

or

public boolean getActive() {
  return active;
}

public void setActive(boolean active) {
  this.active = active;
}

But not everybody knows that the getter/setter for a property of the type Boolean:

private Boolean closed;

must look like

public Boolean getClosed() {
  return closed;
}

public void setClosed(Boolean closed) {
  this.closed = closed;
}

the getter isClosed() would not be recognized.

Not to long ago even Eclipse code generators made mistakes with those edge cases – I checked today and both IntelliJ and Eclipse generated everything correct. If you want to look into the specification you can do this here.

Deutsche Telekom erdrosselt Internet

Wenn ich so lese was die Deutsche Telekom mit ihren beschränkten neuen Tarifen so plant wird mir ganz heiß. Da fällt es mir schwer die richtigen Worte zu finden. Es zeigt einfach wieder, dass sich beim Thema “Internetanbindung” alles in die falsche Richtung entwickelt – die Anbindungen werden eher schlechter als besser. Ich habe ja hier schon des öfteren darüber geschrieben in welcher Situation ich mich selbst hier in Österreich befinde, aber zumindest kann ich mit meiner zur Verfügung stehenden Bandbreite noch machen was ich will.

http://drossl.de/ zeigt sehr schön was die Auswirkung dieses Vorhabens ist – wenn ich in ca. 7 Stunden schon mein ganzes Datenvolumen ausschöpfen kann und dann ein funktional kaputtes Netz habe dann ist so eine Internetanbindung wertlos.

Es geht um Netzneutralität! Ein Internetserviceprovider sollte eine dumme Röhre mit einem gewissen Durchmesser zur Verfügung stellen und den Inhalt der durchläuft nicht unterschiedlich nach der Art bewerten – andernfalls entstehen solche Dinge wie dass ein Provider Skype verbietet oder Torrent Downloads blockiert. Die Niederlande machen es vor wie es geht: Netzneutralität im Gesetz verankern!

 

A fresh start

Today I deleted my blog – not intentionally, it happened. I tried to upgrade MySQL from 5.1 to 5.5, it did not work as expected. I tried varios things and somewhere in between I issued the wrong rm command. I deleted both the backup directory and the tgz of the mysql database directory I made before the update.

After a short heat flash I thought: ok, know I have to import the database again from the SQL dump I have on my Amazon S3. A script copies it there every night. After extracting the tgz from S3 I was shocked that the sql file had a zero byte file size. It turned out that the backup script used an old password for the mysqldump command so it was not able to backup for over a year and I do not have any older backup file.

I am starting to accept that I lost most of the blog content I created since June 2005 (!!) though I can not fully accept it at the moment. There is something in me that thinks that there has to be another backup somewhere …

Some of the content could be restored from the web archive or Google cache and I think I will do that within the next weeks.

Seems like this is another hard lessons to learn, more backups in the future, better checks of those backups to make sure they work and being more careful with the rm command.

Signing Android APK files under JDK7

We are using maven to build our Android applications in Jenkins for testing and for publishing them to the Play Store. Recently I started to have problems with the Play Store saying that the APK files were not signed or not aligned so I upgraded the Android Maven plugin and adapted the pom.xml files. Finally I was able to submit the signed and aligned APK files again to the Play Store – everything fine again, at least I thought so.

An hour later I got the first mail from a user telling me that he hat troubles installing the update of the app from the Play Store. The error message said something about the certificate so I tried it myself and got the message

INSTALL_PARSE_FAILED_NO_CERTIFICATES

when trying to install the app on my device. I was confused because the app was signed, it contained the certificate information in the META-INF directory and the MANIFEST file and the Play Store validated it as signed.

Some research brought up this article about Android’s Problem with JDK7 and I remembered that I recently installed JDK7 on my MacBook. It turns out that there is a difference in JDK7 regarding signature algorithms and ant has a problem with it too. So to get APK files that are signed correct I had to configure the signature and digest algorithm the maven-jarsigner-plugin uses as described here:

<arguments>
  <argument>-sigalg</argument><argument>MD5withRSA</argument>
  <argument>-digestalg</argument><argument>SHA1</argument>
</arguments>

Conclusion: Always test APK files after signing!