12
Mar 14

APK and Jar Signing problems (Mac OS X 10.9)

Today I spent about an hour trying to create a release version of an app I’m working on. The whole Maven build completed successfully but when I tried to install the APK on a device ADB showed me the following error message:
Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]

The problem was that I changed my JAVA_HOME a few weeks ago to point to my Java7 installation. It seems that something is wrong with that installation (or with the way the Maven jarsigner plugin works). After I changed JAVA_HOME back to Java6 everything worked again.


16
Dec 12

Django-userena: Fehlende deutsche Übersetzungen

Bei einem aktuellen Projekt ist mir aufgefallen, dass die Aktivierungsmails von Userena eine lustige Mischung aus deutschen und englischen Sätzen waren. Nachdem ich gecheckt hatte, dass in meiner Anwendung die Internationalisierung vernünftig funktioniert, hab ich mal den Code von Userena auf GitHub geclont und festgestellt, dass tatsächlich einige Strings nicht übersetzt waren und einige andere als fuzzy gekennzeichnet waren. Also hab ich die schnell mal übersetzt und als Pull Request an Userena zurückgegeben. Solange bis mein Pull Request akzeptiert wurde, könnt ihr euch meinen Fork mit einer kompletten deutschen Übersetzung unter https://github.com/StevenMohr/django-userena clonen.

Update 21.12.12: Mein Pull request wurde akzeptiert, meine Übersetzungen sind jetzt im master von userena.

English abstract
If you found that django-userena misses some translations for German, checkout my fork at https://github.com/StevenMohr/django-userena . I’ve added the missing ones.

Update 12/21/12: My pull request was accepted. You can find them now in userena’s master branch.


06
Sep 12

CI mit Team Foundation Server 2010

Langsam aber sicher erreichen die Projekte unserer Teams eine Größe, bei der es Sinn macht Continuous Integration einzuführen. Also habe ich diese Woche mal (neben dem Scrum-Mastern) geguckt, was sich da mit unserer Visual Studio plus Team Foundation Server in dieser Richtung so hergibt. Und, wie erwartet, liefert es das, was wir brauchen :-) . Ich beschreibe hier, was man als Entwickler dafür machen muss; um die Konfiguration des TFS (sprich Erstellung von Build-Controllern oder Konfiguration der Build-Slaves) sollte sich der Admin eures Vertrauens kümmern.

Was ist Continuous Integration (CI) eigentlich?

Passend zum Schreiben dieses Posts hab ich auf einer Mailingliste folgenden Artikel zum Thema CI gefunden. Der Artikel ist zwar ein paar Tage älter, beschreibt aber sehr unterhaltsam, was der Sinn von CI ist und warum es ein Prozess ist, der adaptiert werden muss, und nicht nur ein Tool, das man einfach installiert. Es passiert schließlich sehr schnell, dass ein schlecht gepflegter CI-Server vom Team nicht mehr beachtet wird, da “der Build ja nie klappt, weil es da den einen Test gibt, der immer fehlschlägt”. Und schon ist ein roter Build kein Alarmzeichen mehr, sondern Normalität. Und wenn dann weitere Tests fehlschlagen, bekommt es niemand mehr mit und man ist in der BUILD-HÖLLE!

Neuen Job anlegen

Um einen neuen Job anzulegen, braucht man als erstes eine neue Build-Definition. Hierfür klickt man im Team-Explorer rechts auf den Builds-Punkt.

Nun öffnet sich der Konfigurationsdialog. Schnell ein Name für den Build eingetragen und weiter zu den Triggern:
Hier folgt nun die Qual der Wahl: Bei welchem Event soll ein Build gestartet werden? Am Besten nimmt man den manuellen Build oder die Fortlaufende Integration (ich liebe deutsche Übersetzungen). Nun weiter zum Build-Standardzeug: Hier müssen wir nur angeben, dass unser Build Dateien speichern möchte und dann noch ein passendes Verzeichnis wählen, dass für uns beschreibbar ist (am Besten den Admin fragen :-) ). Als letztes sollten wir unseren Prozess anpassen: Da wir oftmals nicht die ganze Solution bauen wollen, sondern nur einzelne Teile (das Hauptprojekt und passende Testprojekte) können wir hier in Punkt eins auswählen, welche Projekte gebaut werden sollen. Nun sind wir auch schon fertig. Mit einem Rechtsklick auf unsere neu angelegte Build-Definition können wir sie zur Warteschlange hinzufügen.

Integration von StyleCop ins CI

Wie ich ja letzte Woche schon geschrieben habe, lässt sich StyleCop in den CI-Prozess einbinden. Für unser Projekt werden wir die einfachere, dafür potenziell dreckigere Methode des Einbindens in die Projektdateien wählen. Diese ist auf Setting Up StyleCop MSBuild Integration sehr gut beschrieben. Wer sich für etwas aufwendigere, aber dafür saubere Methode über Build-Konfigurationen benutzten möchte, sei dieser StackOverFlow-Eintrag empfohlen.

Quellen


29
Aug 12

Entwickler zu ihrem Glück zwingen – Styleguides durchsetzen mit StyleCop

Nachdem letzte Woche unserem Projekt die Lasttest vorgestellt wurden, die sie diese und nächste Woche adaptieren sollen, kommen dieses mal ein Stylechecker für den C#-Teil dran. Wenn jemand Erfahrungen mit etwas ähnlichem für ActionScript kennt, würde ich mich über einen Kommentar freuen. Nun aber ran ans Thema.

Wofür braucht man eigentlich einen Style-Guide?

Das ist eine beliebte Frage: Ich könnte doch einfach so schreiben wie ich will und man meinen Code kann man eh verstehen und außerdem in Buch X steht, dass man das alles nicht braucht. Das mag sein, aber der größte Vorteil eines gemeinsamen Styles ist das Verschwinden von Programmierergrenzen. Was ich damit sagen will, ist das man dem Code nicht mehr ansieht, wer ihn geschrieben hat und man sich beim Einarbeiten nicht mit verschiedenen Stilen rumschlagen muss. Zudem interpretiert man unter Umständen Dinge in den Code, die man versucht aus den verschiedenen Stilen abzuleiten. Neben diesen Gründen gibt es aber auch ganz pragmatische Gründe, sich um die Einhaltung des Codestyles zu kümmern: Oftmals gibt die Firma, der Kunde oder (wie bei uns) der Dozent einen Stil vor, den es einzuhalten gilt. Und genau hierbei hilft (auf jeden Fall für C#) StyleCop.

Was ist eigentlich StyleCop?

StyleCop ist ein Tool, um die Einhaltung von C#-Codestyles zu überwachen. Hierbei integriert es sich u.a. ins Visual Studio und den Team Foundation Server (TFS). Besonders die Integration in den TFS ist schön, um Entwickler zu ärgern. Denn in Zusammenspiel mit “Gated Check-Ins” kann man Check-Ins verhindern, die Code enthalten, die den Styleregeln widersprechen.

Wie installiere ich StyleCop?

Das ist wieder relativ einfach: Einfach im Download-Bereich den MSI-Installer runterladen und (am Besten bei geschlossenem Visual Studio) installieren. Wenn man nun VS wieder startet, findet sich Kontextmenü der Projekte drei neue Einträge: Run StyleCop, Run StyleCop, (Rescan All) und die Style Cop Settings.

Run StyleCop und Run StyleCop (Rescan All) sind eigentlich selbsterklärend: Sie führen die konfigurierten Styletests auf dem Projekt durch. Auch die Konfiguration des Styles ist einfach. Hierfür gibt es einen Dialog, in dem einzelne Regeln ein- und ausgeschaltet werden können.

Wie gestalte ich die Einstellungen effektiv?

Das StyleCop die Einstellungen per Projekt verwaltet, scheint auf jeden ersten Blick etwas hinderlich, insbesondere im Hinblick auf größere Softwareprojekte, die sich in viele Visual Studio-Projekte innerhalb einer Solution gliedern. Hierbei hat StyleCop allerdings einen sehr netten Mechanismus: Als erstes wird die StyleCops-Settingsdatei im Wurzelverzeichnis der Solution ausgelesen, danach weitere Dateien im Pfad oberhalb des aktuellen Projektes. Hierbei werden die Einstellung des Wurzelverzeichnisses von den Einstellungen in den tieferen Verzeichnisebenen überschrieben. Hiermit können die Styleregeln für die untergeordneten Projekte entweder entschärft oder verstärkt werden.


21
Aug 12

Lasttests mit Visual Studio 2010 Ultimate – Einrichtung

Für die Serverkomponenten unser beiden Spieleserver sollen Lasttests erstellt werden. So als Facebook-Social-Game wäre es sicherlich sehr vorteilhaft, wenn das ganze nicht schon bei 10 gleichzeitigen Spielern zusammenbricht :-) Zwar wird das ganze später auf der Windows Azure-Plattform laufen, aber trotzdem ist das keine Ausrede für inperformanten Code. Also gucken wir mal, was VS 2010 so zum Thema Lasttests bietet.

Für unser Gebiet sind vor allem zwei der angebotenen Testtypen interessant, der Webtest und der normale Komponententest.

Web-Test

WebTests funktionieren, ähnlich wie von Testtools wie Selenium bekannt, mit Hilfe eines Recorders. Dabei werden die Anfragen an den Server aufgezeichnet und im späteren Test wieder abgespielt. Hierbei können die einzelnen Abfragen mit Hilfe von Datenbankabfragen, CSV- oder XML-Dateien parametrisiert werden.

Komponententests

Komponententests können auch einfach eingebunden werden. Dabei ist natürlich darauf zu achten, dass es sich nicht um klassische Unit-Tests handelt, sondern welche, die schon die Web-Schnittstelle (in unserem Fall die REST-API) über Netzwerk testen.

Wie legt man es nun einen Lasttest an? 

Das ist erstaunlich einfach. Man wählt einfach im Test-Menü den “Neuer Test …”-Punkt aus und wählt dann den Lasttest:

Nach der Auswahl des Auslastungstests, Angabe eines griffigen Namens und des richtigen Testprojekts kommt man auf die nächste Konfigurationsseite, auf der der Lasttest konfiguriert wird.

Hier können wir direkt zum Punkt “Szenario” gehen und dem ganzen einen aussagekräftigen Titel geben.

Nun geht es langsam zum interessanten Teil des Lasttests über, in dem die Konfiguration auch Einfluss auf die Ergebnisse hat. Der nächste Schritt ist die Einstellung, ob die Applikation mit einer konstanten Anzahl von Benutzern belastet werden soll oder ob es eine kontinuierlichen Anstieg der Nutzer gibt. Der erste Teil ist also eher dafür geeignet, um die Grundlast der Applikation zu testen, während der zweite Teil sich um Spitzenlasten kümmert.

Im nächsten Schritt werden die Tests ausgewählt, die im aktuellen Test bzw. Szenario ausgeführt werden sollen. Zudem wird hier noch die Verteilung der Tests angegeben, also wie häufig wird der entsprechende Test innerhalb der Testdauer aufgerufen.

Im Punkt “Netzwerkmischung” können verschiedene Bandbreiten der Testclients eingestellt werden. So kann z.B. eine langsame GSM-Verbidnung emuliert werden, die den Server länger beschäftigt als performante Verbindungen.

Der letzte Punkt erlaubt festzulegen, wie lange der Lasttest ausgeführt wird. Hierzu kann man entweder die Zeit in Minuten bzw. Stunden angeben oder die Anzahl der Testiterationen.

Hiernach ist der Lasttest fertig konfiguriert und kann gestarten werden. Unsere Erfahrungen mit den Lasttest werden nächste Woche folgen.

Literatur

Lasttests mit Visualstudio (dotnetpro.de PDF)

 

 


19
May 12

Hibachi war ein guter Mann

Vor gut 2 Wochen habe ich mir in einer relativ spontanen Aktionen einen Son Of Hibachi-Grill zugelegt. Über Google Plus hatte ich n paar Fotos von dem Ding in Aktion gesehen und er sah nach einem vernünftigen Stadtgrill aus. Als ich mir auf Amazon die Beschreibung angeguckt habe, war ich allerdings etwas skeptisch: Selbstreinigung? Grill fertig in 10 min? Feuerfeste Tasche, mit der man den Grill nach 30 min einfach einpacken kann? Klang gut, aber eher etwas nach Marketing-Blabla :-)

Also war es Zeit beim ersten Grillen mal die Visionen der Herstellers gegen die Realität zu testen. Also fangen wir mal mit dem Nach-10-Minuten-Grillen-Versprechen an. Ja, es dauert wirklich nicht länger. Und im Gegensatz zu einem “normalen” Grill macht man, während der Zeit auch nix. Naja, außer vielleicht ein Bierchen trinken. Nachdem die Kohle unter den Grillrosten eingeklemmt ist, wird aus dem Grill kurzerhand ein Kamin und die Grillanzünder feuern die Kohle so richtig durch. Im gleichen Gang wird dann auch noch die letzten Reste vom letzten Mal vom Grillrost entfernt und es gibt nicht viel, was rotglühenden Kohlen trotzen kann :-) (Unter Umständen bleiben die verkohlten Reste noch etwas dran haften, aber einmal mit der Grillzange rüber und es fällt in die Glut.

Zum Grillerlebnis selbst kann nicht viel sagen, außer es klappt einfach. Der Grill wird gleichmäßig heiß und verpasst dem Fleisch ein schönes Muster. Alles wie es sein soll.

Zum letzten Teil, der Tragetasche, kann ich noch nicht viel sagen… ich packe den Grill meistens nach 15 min in die Tasche und alles ist gut. Allerdings habe ich noch nicht im Park gegrillt und dann den Grill im Bus nach Hause gebracht. Mal gucken, wie das wird :-)


29
Apr 12

Blueberry-Oatmeal-Pancakes

Einer der riesigen Vorteile des WG-Lebens ist es, dass man praktisch einen eigenen Supermarkt in der Vorratskammer hat. Als wir gestern Abend über amerikanisches Essen, insbesondere Pancakes und Oatmeal, geredet haben, wurde klar, was heute zum Frühstück gibt und noch besser, dass es im WG-Supermarkt auch noch alles gab, was man braucht, plus Blueberries :-) . Also mal schnell gegooglet, was man so braucht und ich bin zu einem Rezept auf Chefkoch.de gekommen. Allerdings fehlten da noch die Blueberrys, die wir noch gefroren mit in den Teig gerührt haben. Zudem war uns der Teig etwas zu flüssig, so dass wir noch 3 EL Mehl hinzugefügt haben und das ist das Ergebnis:


22
Apr 12

Spinat mit Paneer

Hier kommt nun auch das Rezept für den Spinat mit Paneer. Die Basis für das Rezept stammt aus dem Jamie Oliver Magazin 2/2011, allerdings habe ich es im Laufe der Zeit etwas angepasst :-) . Also beginnen wie, wie immer, mit den Zutaten:

  • 150 g Paneer oder Ricotta
  • Öl zum Braten des Käses (Erdnuss- oder Sesamöl)
  • 1 El Kreuzkümmel (als ganze Samen oder gemahlen)
  • 2 Knoblauchzehen
  • 1 Chilischote (frisch oder getrocknet)
  • 2 Schalotten (in Scheiben)
  • 500g TK-Spinat
  • 250 ml Schlagsahne

Die erste Entscheidung, die man trifft, ist, ob man Paneer oder Ricotta nimmt: Mit dem Paneer hat man “echte” Käsestücken drin, die dann beim Anbraten auch schön goldgelb werden, dafür macht der Ricotta das Gericht insgesamt cremiger. Ist also ganz Geschmackssache und ob man Paneer zur Hand hat oder nicht.  Also los geht’s:

  1. Den Käse im Öl schön anbraten, dann beiseite stellen
  2. Kreuzkümmel, Knoblauch, Chili und Schalotten 5 min bei schwacher Hitze anbraten, so dass die Schalotten glasig werden, aber nicht braun werden
  3. Hitze erhöhen und den Spinat und die Schlagsahne hinzufügen. Zudem noch 100-200ml Wasser (beim Paneer eher etwas weniger Wasser)
  4. Das Ganze köcheln lassen, bis der Spinat komplett aufgetaut ist und der Großteil des Wassers verdunstet ist
  5. Nun den Käse unterheben und mit Reis servieren
  6. Fertig!

Man kann den Reis auch in Schritt 3 mit hinzugeben und den Reis dann im Schmelzwasser garen. Evtl. muss man dann noch etwas mehr Wasser hinzugeben, wenn man sieht, dass es zum Reiskochen nicht reicht. Auf diese Weise nimmt der Reis die Aromen des Chilis und des Kreuzkümmels an und wird viel intensiver (wenn man denn möchte, dass das Gericht noch intensiver wird … ;-) )

 


18
Apr 12

Selbstgemachter Paneer

Ja, ein Bild sagt mehr als tausend Worte… Also heute Abend habe ich endlich mal Paneer gemacht, nachdem ich das ganze vor Jahren (so 8 oder so) mal in Jamie Olivers Show gesehen hab, hab ich mir n Rezept gesucht und bin bei diesem gelandet. Die Zubereitung ist super einfach, man braucht nur einen Liter Vollmilch und 1,5 Zitronen. Einfach die Milch aufkochen und dann den Zitronensaft hinzufügen. Die Hitze etwas reduzieren und dann köcheln, bis sich die Milch gut getrennt hat. Als letztes alles durch ein Tuch abseihen, n bisschen ausdrücken und dann etwa eine Stunde abtropfen lassen. Das Ergebnis sieht dann wie auf dem Foto aus.

Das Ganze dient der Vorbereitung für morgen, da wird es dann indischen Spinat mit Paneer geben (und diesmal endlich mit Paneer und nicht mit Ricotta, wie bisher!) Und spätestens morgen Abend gibt es dann das Rezept dazu!


01
Apr 12

Lecker äthiopisch essen

Wie versprochen, gibt es jetzt auch mal Posts über was anderes als Rezepte. Allerdings kann ich mich noch nicht ganz vom Thema Essen befreien, aber es ist wohl ein Schritt in die richtige Richtung.

Am Freitag war ich im Bejte Ethiopia und es war großartig. Bestellt haben wir eine große Platte für 4 Personen mit allerlei verschiedenen Gerichten, die jeweils auf meinem Bett aus Sauerteigfladen lagen. Im Prinzip kann man sich wie beim Inder vorstellen, wo man sein Gericht in einer leckeren Sauce bekommt und es dann mit Reis isst. Hier nimmt man sich eine dieser Fladen in die Hand und greift dann beherzt in die Sauce. Dazu gab es DjuDju-Bier, ein sehr leckeres leichtes Bier, im meinem Fall mit Mangogeschmack. Ein perfektes Sommer-Strand-Bier, mal sehen, wo man es so kaufen kann.

Und neben dem extrem leckeren Essen hatte der Laden auch noch angenehm günstige Preise: Die Platte für 4 Personen (die wir leider nicht komplett geschafft haben) kostete 40 Euro. Und das am Abend und nicht als Mittagsangebot oder so. Sehr lecker und nur empfehlenswert!