Blog

  • Gemütlich wieder anlaufen

    Die Grippe hat mich 3.5 Tage ans Bett gefesselt und leider hat es auch danach noch ein paar Tage gedauert, bis ich mich wieder fit fühle, um in dieser Kälte laufen zu gehen. Im Trainingsplan klar zurück, aber hey, was soll ich machen. Der Weg ist das Ziel.

    Bei Mondschein habe ich heute ganz genüsslich und vor allem auch gemütlich einer paar Kilometer zurückgelegt. Wenn es nicht so kalt gewesen wäre, wäre noch fast ein bisschen Romantik zwischen dem Mond und mir aufgekommen. Schade, am 7. Juni ist fast kein Mond zu sehen, wahrscheinlich werde ich da auch andere Probleme haben.

    8.7 km, 1h

    20130126-205850.jpg

    Der Bart ist eigentlich ein "Kampf-Bart", aber der eignet sich auch bestens als Kälteschutz.

     

  • Armstrong knappert Doping, ich pushe mich mit Doterra Öl

    Und schon bin ich 20km im Rückstand in meinem Trainingsplan. Eine fiese Erkältung fesselt mich ans Bett. Nach der desaströsen Runde auf dem Laufband am Mittwoch limitierten sich meine Schritt vom Bett auf die Toilette und vom Bett zum Sofa. Nicht gerade die Vorbereitung um 100 km zu laufen.

    1.5 Tage im Bett sind dfinitiv genug. Langsam weiss ich schon gar nicht mehr wie liegen, aber rumlaufen geht auch nicht wirklich. Einziges Ziel ist jetzt: "Gesund werden". Das hat sich wohl Lance Armstrong bei der Tour de France auch gesagt: Einziges Ziel: "Gewinnen". Nur, sieht sein Doping wohl ein kleines bisschen anders aus.

    Tee, Hustenbonbons, Orange, Heisse Zitrone, Gummibärlis, alles bereits ausprobiert. Letztes Mittel: Doterra Öl, das neue Allheilmittel. Und nein ich gebe mich nicht mit der "light" Version zufrieden: Oregano Öl und zwar schlucken. Leider führen wir keine Kapseln, um das Öl dort einzufüllen: Ich bin ein Mann, kann ich pur schlucken.

    doterra

    Zwei Tropfen in einer grossen Tasse Tee verdünnt wird für einen Mann bestimmt reichen… falsch gedacht. Das Zeugs ist pures Gift! Dank Internet dann gelesen, dass es sich mit Olivenöl verdünnt schlucken lässt. Auch das… starke Sache. Fishermens Friends sind der reinste Kinderkram dagegen.

    So, morgen ist alles wieder gesund und am Montag werde ich mich dran machen, die verlorenen Kilometer wieder aufzuholen.

  • Kalt aber trocken

    6:45 Achtung fertig los. Temperatur -1 Grad. Das lässt sich noch gut aushalten und nach 4 km kann ich auch meine Hände aus den Tiefen der Jackenärmel hervornehmen. Herzogenbuchsee – Zuchwil, 13 km. Irgendwie läufts heute nicht so gut, Beine sind schwer und ich bin doch eher langsam unterwegs. Dann kommts mir in den Sinn: nach dem Aufstehen habe ich gar nichts getrunken. Nein, nicht gut. Brunnen gibts auch keinen und wenn dann hätte ich Angst dass mir der Mund anfriert. Aber etwas gelernt: regelmässig trinken.

    Training: 1 h 21, 13,3 km

    Das war gestern. Heute lacht die Sonne, kalt ist es immer noch aber zusätzlich liegt noch Schnee. Die warmen Kleider werden von Stinkwolken befreit, daher kommen die Sommer Sachen mit und das Laufband muss hinhalten. Schon auf den 60 Stufen zum Laufband merke ich, dass etwas nicht koscher ist. Leicht Halsschmerzen und allgemeines nicht sehr fit sein. Das Resultat war auch entsprechend: Aus dem geplanten 1 h intensiv Fährtenspiel wurde eine 30 minütige Waschlappenshow, nach der ich fast länger unter der Dusche stand. Morgen ist auch noch ein Tag.

    Training: 31 m, 5 km … ich hätte auch walken können.

  • 100 km von Biel – Disclaimer

    Ich habe mich durchgerungen: die 100 km von Biel sind in meiner Agenda fest eingeplant. Ich würde mich nicht als Ultrathlet bezeichnen, überhaupt nicht, aber ein ganz unbeschriebenes Blatt bin ich auch nicht. Ziel ist nicht der neue Streckenrekord sondern Ziel ist das Ziel, nach 100 km anzukommen.

    Outlook Eintrag
    100 KM von Biel sind im Kalender eingetragen

    Mein Blog war bis anhin vor allem Hafen für alle möglichen technischen Geschichten und Erfahrungen… Jetzt wirds halt ein bisschen schweissiger 😉 dafür gibts jetzt auch kein Zurück mehr 🙁
    An alle Geeks. Ja, auch wir können Sport machen und das Klischee vom Geek in einem dunklen Raum, dicke Brillengläser und fettige Haare ist definitiv nur ein Klischee. Insofern eine Warnung an alle Sporthasser… vielleicht besser den RSS Feed entfernen, an alle anderen: Ich freue mich auf Feedback.

    So, jetzt ists draussen und es gibt kein Zurück mehr.

  • Projekt Dashboard Tool

    Mehrere Projekte zu tracken ist nicht immer gerade einfach und wenn noch mehrere Projektmanager im Spiel sind wird es noch schwieriger. Eigentlich wollten wir zuerst eine Tafel mit Zettelchen machen. Leider sind nicht alle Leute vor Ort, daher ist eine digitale Lösung schon fast ein Muss.

    Anforderungen sind auch denkbar einfach:

    • Einfach
    • Schnell
    • Übersichtlich

    Eigentlich haben Management Tools immer diese Anforderungen und doch werden sie kaum von einem Tool erfüllt. Zu viele Features zu umständlich oder einfach zu kompliziert.

    Daher: Simple Kanban. Eine Demo gibt es auch (allerdings ohne Persistenzmodus). Übers Design kann man streiten und sicher ist es noch nicht das letzte Wort, aber auf der anderen Seite soll es eben auch nicht verschnörkelt und vergoldet sein, sondern die wichtigen Dinge darstellen.

    Feedback, Inputs? Würde mich freuen.

    Screenshot

  • Alles ist mobil, Titanium, Corona, Phonagapp und Co

    So, ich habe in den vergangenen Wochen mit der mobilen Welt gespielt und dabei einiges Ausprobiert:

    • Kurzer Blick in XCode.
    • Eine Test App mit Phonegapp
    • Ein Blick auf Corona
    • Schlussendlich bei Titanium gelandet

    XCode

    Ich habe keinen Mac und daher kein XCode. Zudem möchte ich die Möglichkeit haben, auch für andere Geräte (z.B. Android) zu entwickeln. Von daher: No-go.

    Phonegapp

    Super einfach. Bisschen HTML, CSS und Javascript und JQuery Mobile und fertig ist die App. Mit build.phonegap.com gibt es auch noch einen Cloud Service um das ganze für verschiedene Plattformen zu verpacken.

    Das Endresultat… naja. Sicher ein guter Start, aber dann doch irgendwie nicht wirklich befriedigend. UI ist ein bisschen träge. Es sieht zwar native aus, verhält sich jedoch nicht native, es funktioniert aber dann wieder gibts manchmal komische Aussetzer. Wahrscheinlich eine gute Lösung, je nachdem, was man machen möchte.

    Corona

    Windows and Mac only, zudem Lizenzkosten von 350 $ und einer neuen Programmiersprache Lua. Sieht zwar hübsch aus und sieht auch vielversprechend aus, aber im Moment gerade nicht.

    Appcelerator Titanium

    Da bin ich schlussendlich angelangt. Entwicklung in Javascript aber mit Unterstützung für natives GUI. Perfekt. Unterstützung von Android und iOS, funktioniert sogar ganz gut. Sicher bin ich noch nicht in die Tiefen vorgestossen, aber doch habe ich einen kleinen Einblick bekommen. Anscheinend gibt es z.T. Probleme mit Memory Leaks (zumind. in < V2), davon habe ich bisher jedoch noch nichts mitbekommen.

    Bin daran eine kleine "Daten App" zu schreiben, mit einem Drupal Backend, welche als REST Server dient. … more Details to come soon.

  • Co-Browsing wird kommen

    Zufällig heute auf Twitter gelesen:

    https://twitter.com/wysseier/status/266535045420941313

    Da bin ich gleich aufmerksam geworden. Vor fast 4 Jahren habe ich meine Masterarbeit mit dem Titel "Ein Co-Browsing System für das Reisebüro der Zukunft". Sehr passend aber anscheinend wurde das Thema dann nie verwirklicht und es blieb beim Prototypen (basierend auf Drupal 5).

    Schön zu sehen, dass jemand die Idee aufgenommen und weiterentwickelt hat. Wer interesse hat, kann die Arbeit gerne lesen:

    Master Thesis: Ein Co-Browsing System für das Reisebüro der Zukunft
    (bei Interesse, bei mir melden)
    Research Paper: From Telesales to Tele-Advisory Services in Travel Agencies

  • PHP Deployment via Git

    Source Code

    Source Code verwalte ich in Bitbucket. Ja, Bitbucket und nicht Github. Auf Bitbucket kann ich eine unbegrenzte Anzahl an privaten Projekten haben. Für meine privaten Sachen perfekt geeignet. Auf Github wiederum habe ich meine öffentlichen Projekte.

    Entwicklung

    Selbstverständliche entwickle ich den ganzen Code lokal auf meinem Desktop Rechner. Dazu hätte ich noch einen kleinen Homeserver, den ich eigentlich zum Testen einsetzen könnte, doch der ist aktuell noch nicht im Einsatz.

    In meinem Git Repository habe ich einen Entwicklungs Branch. Dort wird entwickelt und gemacht. Ist ein Feature fertig, dann merge ich Entwicklungs Branch und Master.

    Deployment

    Bitbucket bietet sogenannte Services an:

    Bitbucket offers integration with external services via a set of service brokers that run when certain events happen. These brokers are simple Python scripts, that receive information about the event and then take action. For example, there is a broker for sending email messages, another for posting information to an arbitrary URL, and another for posting updates to a Twitter account.

    Bei mir sieht das im Konkreten wie folgt aus:

    - Push to Bitbucket
    - Trigger Post request nach http://www.sample.com/deploy.php
    - Das PHP Script überprüft, ob es eine Änderung im Master Branch gegeben hat. Falls ja, dann wird eine Datei leere Datei "dodeploy.true" auf dem Webserver geschrieben
    - Ein Cron überprüft im Minutentakt, ob diese Datei vorhanden ist
    - Falls dodeploy.true vorhanden ist, wird Deployment Script ausgeführt.
    

    That's it.

    Das Deployment Script

    #!/bin/bash
    
    # check if there is new code in the repository
    if [ -f /var/www/deployment/deploy-wordpress.true ]
    then
    
    DATE=`date +%m-%d-%y-%H:%M:%S`
    #echo "Backup Database"
    /home/ubuntu/deployments/backup-db.sh
    
    git clone [email protected]:rapsli/wordpress.git /home/ubuntu/deployments/wordpress/wordpress-$DATE
    
    rm -Rf /home/ubuntu/deployments/wordpress/wordpress-$DATE/.git
    
    # copy the config file, since this doesn't get deployed
    cp /home/ubuntu/deployments/wp-config.php /home/ubuntu/deployments/wordpress/wordpress-$DATE/wp-config.php
    
    # remove old installations
    rm -Rf /home/ubuntu/deployments/wordpress/wordpress-old
    
    # rename currently working folder, as it will become the older 
    # folder -- this will break the site now
    mv /home/ubuntu/deployments/wordpress/wordpress /home/ubuntu/deployments/wordpress/wordpress-old
    
    # we make the new wordpress active
    mv /home/ubuntu/deployments/wordpress/wordpress-$DATE /home/ubuntu/deployments/wordpress/wordpress
    
    # symlinking the userdata in
    ln -s /home/ubuntu/userdata/uploads/ /home/ubuntu/deployments/wordpress/wordpress/wp-content/uploads
    ln -s /home/ubuntu/userdata/cache/ /home/ubuntu/deployments/wordpress/wordpress/wp-content/cache
    ln -s /home/ubuntu/userdata/blogs.dir/ /home/ubuntu/deployments/wordpress/wordpress/wp-content/blogs.dir
    
    # make sure the symlink here is active
    ln -nsf /home/ubuntu/deployments/wordpress/wordpress/ /var/www/wordpress
    
    # and finally make sure the next cron run doesn't execute the deployment script again
    rm -f /var/www/deployment/deploy-wordpress.true
    
    fi
    

    Ist eigentlich ziemlich trivial und sogar gut kommentiert. Falls fragen sind, einfach einen Kommentar posten.

    Zwei Bemerkungen

    Symlink und Apache ist problematisch. Nach einem Deployment kann es ab und zu mal vorkommen, dass die Seite hängt. Ich vermute, dass dies damit zu tun hat, dass ich einen Apache Worker habe, der noch irgendwie in der alten Version hängt. Ein /etc/init.d/apache2 restart verhilft da jeweils immer Abhilfe. Nein, das ist noch nicht perfekt und ich überlege mir, ob ich einfach komplett auf die Symlinks verzichten soll und einfach mit mv arbeiten soll.

    Der Umweg über diese deploy-wordpress.true Datei ist aus folgendem Grund notwendig. Der Request von Bitbucket kommt mit dem www User rein. Dieser hat jedoch nicht die entsprechenden Schreibrechte im home Verzeichnis und kann daher den Clone Befehl dort nicht ausführen. Daher wird lediglich signalisiert, dass es etwas Neues gibt und dann kann der normale User das Deployment durchführen.

    Ich finde diesen Ansatz gar nicht mal übel, da er doch auch eine gewisse Sicherheit bringt.

    Die Zukunft

    Wahrscheinlich wird dieses Script noch ein bisschen wachsen. Das ist das Schöne am Web, es gibt immer etwas Neues und Besseres, aber es ist ein riesiger Schritt nach vorne… die FTP Upload Zeiten sind definitiv vorbei!

    Ich bin gespannt zu hören, wie du das Deployment machst. Let me know.

  • Wasserfall als Scrum verpackt

    Geld ist fertig, Projekt auch, das Resultat jedoch ist überhaupt nicht befriedigend. Von den 10 Requirements, wurden 5 Umgesetzt, 3 verlegt und 2 sind unter den Tisch gefallen. Von den 5 Umgesetzten sind 4 nicht reif genug für die Produktion und eines wird gar nicht mehr benötigt. Typisches Wasserfallproblem und dennoch mein tägliches Brot. In der heutigen Agilen Zeit eigentlich erstaunlich und dennoch wahr. Das Projekt wurde zwar unter der Aufschrift "Agil" vertrieben und betrieben, aber in Realität ist es ein klarer Wasserfall.

    Ich habe gelernt, dass ein Sprint alleine Scrum nicht ausmacht. Es ist zwar ein gutes Gefühl, wenn der Entwickler nach 3 Wochen sagen kann, dass es fertig ist, aber wem nützt das dann, wenn es nicht auf einem Testsystem ist. Immerhin, der Statusreport ist grün. Und schon kommt der nächste Sprint, was die Situation nicht besser macht. Done ist done, wenn der Product Owner sagt und nicht vorher.

    Daraus ergeben sich zwei wichtige Erkenntnisse:

    • Requirements
    • Done, is Done

    Requirements

    User Stories erzählen eine Geschichte. Eine Geschichte kann nachgespielt werden. Eine Geschichte lässt jedoch auch viel technischen Freiraum. Für mich als Enduser ist vor allem wichtig, dass ich ein Ziel erreichen kann, wie ist mir egal:

    Untrainierter Nutzer X kann eine neue Site anlegen, um dadurch unabhängig von Abteilung X zu sein.

    Daraus ergeben sich dann entsprechende Tasks:

    • Neuer Button hier
    • Vereinfachte Settings
    • usw.

    Bisher bin ich immer gleich in die resultierenden Tasks gegangen und habe diese spezifiziert. Das führt dazu, dass der grosse Kontext fehlt, was das High level Testing erschwert.

    Done, is Done

    Meine zweite Erkenntnis. Done und der Highlevel Test im Voraus definieren. Wenn ein User Story vorhanden ist, ist das auch denkbar einfach. Unsere vorherige Userstory lässt sich ganz einfach mit folgendem Test testen: "Ein normaler Nutzer kann eine neue Site erstellen". Das lässt sich dann auch wunderbar in einem Sprint Review testen und der Entwickler muss nicht einen Excel Status anzeigen, und frech das Requirement auf grün setzen, dabei ist es vielleicht höchstens dunkel gelb.

    Ach und übrigens: Eine kleine Demo auf dem Entwicklungsrechner ist nicht gut genug! Es wird dort garantiert laufen, aber wie sieht es hinter der Firewall, auf einem anderen Rechner aus?

  • Das Drupal Biest

    Heute Abend, oder Nacht, habe ich doch mal wieder ein paar Zeilen Code für Drupal geschrieben. Ich brauche einen JSON REST Server und da scheint Drupal optimal dafür geeignet zu sein:

    • Das Datenmodell kann über Fields gemacht werden
    • Services Modul stellt die Schnittstelle her

      • Gratis dazu mit Authentication falls gewünscht
      • Nicht nur Get funktioniert, sondern auch Put (wird sich noch zeigen)
    • Gibt auch gleich noch eine Benutzerverwaltung

    Und all das mit ein paar wenigen Klicks, aber Achtung, Drupal ist und bleibt ein Biest: Ganze 48 Tabelle hatte ich nach der Installation und dann noch ein paar Fields Module angeschalten und schon sind wir auf 60 Tabellen gesprungen! (Im Vergleich dazu: Meine WordPress Multisite mit 8 verschiedenen Seiten braucht 92 Tabellen). Wenn ich ein Query machen möchte um, ein Imagefield rauszuholen, dann muss ich über zwei Tabellen joinen. Und ich weiss jetzt auch warum der Upgrade Path von einem Major Release jeweils so schwierig ist… all diese Tabellen unter Kontrolle zu halten ist nicht ganz trivial.

    In der Einfachheit liegt Macht

    Ja ja ich weiss. Sicher ist es sauberer und skaliert besser und performt besser und und und nur vielleicht ist es manchmal auch besser nicht alles zu normalisieren? In der Einfachheit liegt Macht.

    Gerade wenn Drupal auch als Framework auftreten will ist es wichtig überflüssigen Ballast abzuwerfen und wirklich nur Grundlagen zu bieten:

    • User Verwaltung
    • Content Verwaltung
    • Schnittstellen

    Ich weiss nicht genau, was der Stand von Drupal 8 ist und wie es dieser Small Core Bewegung geht… aber ich würde das auf jeden Fall sehr begrüssen.

    Und zu guter Letzt: Es lebe Drupal (zwar habe ich WordPress schätzen gelernt und ein kleines hübsches Theme dafür gemacht, aber für ernsthafte Entwicklung ist WP… naja)