von c.kuetbach am March 31, 2016

... Vater sein, dagegen sehr

Geräusche Es ist unglaublich, welche Geräusche ein Neugeborenes machen kann wenn es schläft. Mit unserem Kleinen könnten wir einen Horrorfilm nachvertonen, ohne dass er dafür wach sein müsste.

Ausgaben Fast schockierender finde ich, was man alles ausgeben kann, aber nicht muss. Alles für Baby kostet irgendwie einen massiven Endorphin aufpreis. Anders kann ich mir nicht erklären, wieso ein Sparpaket Socken für Babyfüsse, das gleiche kostet soll, wie für meine 45er Latschen.

Werbung Man wird unweigerlich Opfer von Werbung. Insbesondere direkt nach der Geburt. Es beginnt oft schon im Krankenhaus, wo man vollkommen unverbindlich eine professionelle Fotoserie machen lassen kann. Diese (durchweg gelungenen) Bilder werden einem dann bereits nach zwei oder drei Tagen vor die Nase gehalten. In dem Moment steckt man so voller Glückshormone, dass dann ~220€ für ein Paket mit Bildern und Karten und einer Fotoleinwand für absolut gerechtfertigt hält. Ich für meinen Teil bin froh, erst mit einer Woche Abstand die Präsentation gesehen zu haben. (Fairerweise muss man sagen, dass außer der Tatsache, dass alles fertig vor einem Lag kein weiterer Druck aufgebaut wurde.)

Glücksgefühle Wenn man ihn sieht, hört oder riecht. Oder wenn man einfach nur an das Kind denkt, oder daran denkt, wie man zuletzt an das Kind gedacht hat.

Eigentlich immer.

von c.kuetbach am March 31, 2015

Die Fire TV Box ist ein Mediacenter von Amazon. Leider hat kann diese Box nicht direkt auf eigene lokale Dateien und Mediaserver zugreifen.

Hierbei hilft Kodi. Kodi funktioniert hervorragend auf dem AFTV, auch wenn der Amazon AppStore etwas anderes suggeriert.

Eine tolle Anleitung, wie die Installation von statten geht, findet ihr hier:

aftvhacks.de

Sollte nach einem Update von Kodi die Anwendung nicht mehr direkt zu starten sein, hat folgende Anleitung bei mir Abhilfe geschafft:

amazon.de

von c.kuetbach am November 20, 2014

I just bought my first Amazon Fire TV

A small set-top box for browsing Amazon Instant Video or
Netflix.

This box is really tiny, but powerful: A Quad Core CPU with 2GB RAM.

After viewing an annoying intro video, which I couldn't skip, everything worked as expected.

There is a SPMC App in the Amazon App Store, but this was not compatible with the Fire TV.

I really wanted a XBMC App on this device. I googled a lot. This is the way to do it:

  • Load the actual spmc.apk from
  • Load adbFire
  • Install the apk with adbFire
  • Buy the spmc App from the Amazon App Store for 0,00€. This app is marked as not compatible wit the Fire TV, but (the cake) is a lie. It will work.
  • Now you have to sync all bought items. This will create a shortcut on the launcher.
  • Some tweaks: You should disable Hardware Acceleration, this will increase the Framerate.
von c.kuetbach am September 25, 2014
#!/bin/sh
DOMAIN=""     # Your domain
DEVICE=""     # Your device (eth0, wlan0)
PASSWORD=""   # Your has from afraid.org


### No changes beyond this line

SERVER="http://freedns.afraid.org/dynamic/update.php?$PASSWORD&address="
INET6_OLD=$(nslookup -q=AAAA $DOMAIN | grep AAAA | awk -F "address " '{print $2}')
INET6_NEW=$(ip -6 addr show dev $DEVICE | grep inet6 | grep global | awk '$1 == "inet6" {gsub(/\/.*$/, "", $2); print $2}')

if [ "$INET6_OLD" = "$INET6_NEW" ]; then
        echo "Not changed => Not updating"
else
        echo "Changed from '$INET6_OLD' to '$INET6_NEW'"
        curl -k $SERVER$INET6_NEW
fi


von c.kuetbach am September 24, 2014

Seit heute hat Bornet in seinem Glasfasernetzwerk IPv6 aktiviert.

Hier eine Kurze Zusammenfassung, wie man nun mittels Genexis-Router von aussen an seine Dienste kommt:

Schritt 1:

Die "externe IP" (Bei IPv6 eher ein Adressbereich) ermitteln:

Status -> Interfaces -> WAN -> IPv6 Adresse (die, die nicht mit :: beginnt)

Schritt 2:

Die "interne IP" des freizugebenen Rechners ermitteln:

Unter Windows -> Ausführen "cmd" -> ipconfig -> dann die heraussuchen, die mit der externen Adresse beginnt

Schritt 3:

IPv6 Weiterleitung aktivieren Netzwerk -> IPv6 Weiterleitung -> Neue Regel ->

  • Service Name: Frei wählbar
  • Lokale IPv6 Addresse: Die soeben ermittelte IP (oder ein extern ermittelter Hostname)
  • Lokale Ports: Der oder die Ports
  • Protokoll: TCP (im Normalfall)

Jetzt sollte alles soweit funktionieren.

Jetzt wird es dynamisch

Da sich die Adressen vermutlich regelmäßig ändern, muss nun einiges anders gemacht werden, als oben beschrieben.

Zuerst muss ein dyndns Dienst gefunden werden, der IPv6 beherrscht. Ich habe mich hier für afraid.org entschieden. (Hat keinen besonderen Grund, ist gratis und hat auf Anhieb funktioniert).

Die Genexis scheint hier eine Firewall eingebaut zu haben, die den IPv6 Traffic filtert und nur Dienste weiterleitet die explizit wie zuvor beschrieben freigegeben sind.

Um jetzt nie wieder unhandliche IPv6 Adressen eingeben zu müssen, kann man unter afraid.org eine gratis subdomain erstellen.

Wenn die Subdomain erstellt ist, muss man einen "AAAA" Eintrag erstellen. Dieser erlaubt es dann einen Namen in eine IPv6 Adresse zu wandeln. Der Dienst bietet einige Wege an die Adresse zu aktualisieren. Ich nutze hier die einfache Update-URL.

Den dort erstellten Namen kann man nun statt der ermittelten IP Adresse in Schritt 3 verwenden.

IPv4 Verbindungen annehmen

Wenn jetzt ein Domainname automatisch an die Adresse gebunden wird, dann kann man darüber zuerst nur über IPv6 zugreifen. Ein einfacher Weg trotzdem auf HTTP (Webseiten) zugreifen zu können ist sixxs.net. Hier kann man den dynamischen IPv6 Namen (zum Beispiel myftth.mooo.com über den namen myftth.mooo.com.ipv4.sixxs.org erreichen.

Derzeit arbeite ich noch an dieser Anleitung. Bislang habe ich mich noch nicht mit dem Aspekt der Sicherheit befasst. Es kann also sein, dass einige der hier genannten Einstellungen für Sicherheitsprobleme sorgen können

von c.kuetbach am September 5, 2014

Not working?

@sprite
.my-image {
    gwt-image: 'imageSource';
}

use

@sprite .my-image {
    gwt-image: 'imageSource';
}

instead. There is a bug in the CSS compiler. There needs to be a whitespace after an annotation. Just typing a ' ' after @sprite is also OK.

von c.kuetbach am October 12, 2012

Just found a new bug in android 3.2 WebView:

Assume you have created a nice hybrid application with phonegap. You set the viewport, with minscale, maxscale and usescalable=no.

The width of the viewPort is set to device-width.

BUT, in android 3.2 apps, you can drag your app arround.

Nothing to find with weinre, the DOM looks great.

Then I removed an css attribute from body:

body{
    -webkit-transform: translate3d(0,0,0) rotate(0) scale(1);
}

And the problem was gone.

von c.kuetbach am September 5, 2012

App Closes if Bask-Button is pressed while focussing input-element

I just encountered a interesting Bug within a Cordova/Phonegap App:

Everytime a user enteres something into a input-field, the softkeyboard will show up. But if the user hides the keyboard and than hit the Android-Back-Button the application closed.

No errormessage on screen, nothing strange in the log. Just a clear shutdown of the App.

If the user hides the keyboard, unfocus the input-field and hits back, the app worked as designed.

After some time I found the problem: The Bback-Button will end the DroidGap Activity, that closes the app.

This ISSUE at the Codova Issue-Tracker described a similar problem: Cordova Issue Tracker

I found a simple solution there. Just override some native Key-Events in you DroidGap-Activity:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event){
    LOG.d(TAG, "KeyDown has been triggered on the view"+keyCode);
    //If volumedown key
    if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) { 
        // only override default behaviour is event bound 
        LOG.d(TAG, "Down Key >Hit"); 
        this.loadUrl("javascript:cordova.fireDocumentEvent('volumedownbutton');"); 
        return true; 
    }
    // If volumeup key
    else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) { 
        LOG.d(TAG, "Up Key Hit"); 
        this.loadUrl("javascript:cordova.fireDocumentEvent('volumeupbutton');"); 
        return true; 
    } else { 
        //return super.onKeyDown(keyCode, event); 
    }
    //return super.onKeyDown(keyCode, event);
    return true;
}

@Override
public boolean onKeyUp(int keyCode, KeyEvent event){
    LOG.d(TAG, "KeyUp has been triggered on the view"+keyCode);
    // If back key
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
        this.loadUrl("javascript:cordova.fireDocumentEvent('backbutton');"); 
        return true; 
    }
    // Legacy
    else if (keyCode == KeyEvent.KEYCODE_MENU) { 
        this.loadUrl("javascript:cordova.fireDocumentEvent('menubutton');"); 
        return true;     
    }
    // If search key
    else if (keyCode == KeyEvent.KEYCODE_SEARCH) { 
        this.loadUrl("javascript:cordova.fireDocumentEvent('searchbutton');"); 
        return true; 
    }
    return false;
}

von c.kuetbach am January 11, 2009

Dies ist mein erster Blogeintrag und mir fällt nichts besseres ein, als über das PHP-Framework "Yii" zu schreiben.

Als ich ein wenig mit WordPress herumgespielt habe und daran gescheitert bin das WordPress Design in meine Webseite zu integrieren (was nicht unbedingt an WordPress, sondern eher an meinem interessanten Template-System lag), bin ich zufällig auf Heise-Online auf Yii aufmerksam geworden.

Nachdem ich las, dass Yii strikt nach MVC aufgeteilt ist und Ruby on Rails zum Vorbild hat, wollte ich es ausprobieren.

Nach drei Abenden hatte ich mein kleines CMS komplett auf das Framework umgestellt. Nach zwei weiteren hatte ich mein erstes Opensource-Projekt gestartet.

Als ich dann mit dem Schreiben eines Blogs beginnen wollte, kamen die Entwickler von Yii mir zuvor. Ich musste dann nur noch das Offiziele Demo in meine Webseite integrieren.

Alles in allem kann ich sagen: Wenn es denn PHP sein muss, dann nur noch mit einem Framework wie Yii.