Archive for the ‘ development & nerd stuff ’ Category

goAccess ein Apache, NginX real-time log analyzer

so eben gefunden und für cool befunden :)

wer sich bisher mit grep und awk duch seine logs hangelt sollte sich mal goAccess anschauen.

http://goaccess.prosoftcorp.com/

einfacher geht es nicht

goaccess -f /var/log/apache2/access.log

oder wer wie ich ungerne zusätzliche software auf seinem Server Installiert.

ssh user@server 'cat /var/log/apache2/access.log' | goaccess

und so sieht das ganze aus.

goaccess

CodeBox – Git Hosting

Lange zeit war ich auf der suche nach einem Web-basierenden GIT-Interface. Dabei ist es ja nicht so das man in der Cloud nicht fündig würde. Neben GitHub gibt es noch etliche Anbieter. Doch die kommen einen bei vielen privaten Projekte auch sehr teuer.

Wendet man sich Freien Alternativen zu, bleiben eigentlich nur Trac, Gitorious, Redmine und Indefero.

Trac
Für meine Ansprüche ist das in Python geschriebene Trac zu mächtig. Ich suche was einfaches an dem ich auch Spaß habe. Und das nicht erst Tage für die Konfiguration verschlingt.

Gitorious,
ist nett allerdings hat mich eine Test Installation so viele Nerven gekostet das ich von einem ständig zu wartenden Produktiv System Abstand genommen habe.

Das ist leider eine Erfahrung die ich bisher bei allen Ruby Anwendungen gemacht habe. Wahrscheinlich liegt es auch daran das ich durch das Ruby/Gem Universum nur bedingt durchsteige.

Hinzu kommt das Gitorious keinen BugTracker hat.

Redmine.
Ebenfalls in Ruby geschrieben bietet Redmine eine insgesamt sehr angenehme Oberfläche. Allerdings ist die Repository Verwaltung nicht integriert.

Indefero,
ist in php geschrieben lässt sich leicht Installieren und macht auch sonst einen guten Eindruck. Mir gefällt lediglich die Adaptierte Google Code Oberfläche nicht wirklich. Für jemanden der sich daran nicht stört ist es aber das einfachste und Übersichtlichste System der hier vorgestellten.

Während die Tage mit Recherche, Installieren und ausprobieren ins Land zogen, ertappte ich mich immer öfter dabei, wie ich darüber nachdachte ein eigenes System zu entwickeln. Meine Grundüberlegung dabei, dass SSH in Kombination mit Authorized_Keys, ja schon den größten teil frei Haus liefert.

Ein Prototyp war dem entsprechend auch in ein paar Stunden geschrieben. Gammelte dann aber doch wieder viel zu lange in der Projekt Schublade.

Da die frage nach einer geeigneten Code Verwaltung aber immer wieder aufkam und sich in Gesprächen herausstellte das sich auch andere mit der bestehenden Auswahl schwer tun, habe ich die letzten Wochen nochmal etwas zeit investiert und möchte euch das Ergebnis nicht vorenthalten.

Neben der reinen Code-Verwaltung sollte das System die Möglichkeit geben alle relevanten Daten und Dokumente zu einem Projekt Vor-zuhalten.

Daraus ergibt sich die folgende Liste bisher implementierter Features.

Features

  • Öffentliche und Private Projekte
  • Activity Stream
  • Commit View/Diff
  • Project Members
  • Mehrsprachig (Vorbereitet)

Features pro Projekt

  • Milestones
  • Issue Tracker
  • Repository Browser
  • Downloads
  • Wiki

An der ein oder anderen Stelle kann es noch etwas Liebe vertragen. Das Logging würde ich gerne nochmal um-schreiben und das User-Management etwas erweitern.

Sollte ich nun euer Interesse geweckt haben würde ich mich freuen den ein oder Tester gewinnen zu können. Schreibt mir dazu einfach eine Mail mit dem Betreff “CodeBox” an dn(at)alphalog.de

Facebook Development – Internet Explorer, Cookies und iFrame’s

Na klasse! Da hat man seine App fertig und macht nochmal die obligatorischen Browser-Tests und dann das: Der IE weigert sich standhaft den Auth-Cookie zu setzen. Ich habe wirklich lange nach einer Lösung suchen müssen.

Das Problem ist folgendes:

Die Sicherheits-Einstellungen des Internet Explores verbieten das Setzen eines Cookies Innerhalb eines IFrames (nichts anderes ist ja das Facebook Canvas). Ich habe mir daraufhin andere Facebook-Apps angeschaut und tatsächlich: Selbst so bekannte Anwendungen wie “Mafia Wars” bleiben in der Authentifizierungs-Schleife hängen.

Abhilfe schafft das Setzen des Cookies explizit zu erlauben. Dies geschieht über das “Devil Eye” in der Statusleiste des IE. Für die meisten Benutzer ist das aber keine wirklich praktikable Lösung.

Es geht aber auch anders.

Mittels des sogenannten P3P-Headers kann man eine “Privacy-Policy” setzen, die es der eingebetteten Seite erlaubt, einen Cookie zu speichern. Dies erfolgt durch das Senden eines Header Feldes “P3P” mit folgendem Inhalt:

CP='IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT

Dann klappt es auch mit dem Internet Explorer.

Dies kann entweder per PHP, Python oder durch den Apache Webserver geschehen. Dazu muss die .htaccess nur um folgende Zeilen erweitert werden:

<IfModule mod_headers.c>
    <Location />
        Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\""
    </Location>
</IfModule>

Doch was bedeuten diese Zeilen? Unter p3pwriter.com gibt es ein Schlüssel-Verzeichnis. Zum Beispiel steht “DEVi” für:

“Information may be used to enhance, evaluate, or otherwise review the site, service, product, or market. Opt-in means prior consent must be provided by users.”

Ich habe keine Ahnung, wie verpflichtend diese Policy ist und ob es rechtliche Konsequenzen hat, diese zu brechen. Jedenfalls bin ich docherstaunt, das Facebook diese Problematik anscheinend egal ist und nirgendwo eine Hilfestellung zu diesem Problem anbietet.

Build and Install Cinepaint on Ubuntu 10.10

Cinepaint lässt sich zurzeit leider nicht so einfach unter Debian oder Ubuntu Installieren. Aber mit ein paar Anpassungen lässt es sich aus dem CVS bauen.

Hier eine kurze schritt für schritt Anleitung.

1. ubuntu-cvs.sh speichern.

2. In ubuntu-cvs.sh Zeile 24 in “export LD_LIBRARY_PATH=/usr/lib/local” ändern.

3. CVS per “apt-get install cvs” installieren.

4. Skript mit “sh ubuntu-cvs.sh” ausführen (bricht bei ersten Durchlauf ab)

5. ca. Zeile 304 “cvs/cinepaint-project/cinepaint/plug-ins/collect/collect.cpp”

- gimp_layer_set_name (layers[0], strrchr(fc->value(1),'/')+1);
+ gimp_layer_set_name (layers[0], (char *)(strrchr(fc->value(1),'/')+1));

6. ca. Zeile 341 “cvs/cinepaint-project/cinepaint/plug-ins/collect/collect.cpp”

- gimp_layer_set_name(layers[0], strrchr(fc->value(i),'/')+1);
+ gimp_layer_set_name(layers[0], (char *)(strrchr(fc->value(i),'/')+1));

7. Skript mit “sh ubuntu-cvs.sh” erneut ausführen.

Webseiten auf Speed – Content Delivery Network 1/2

Trotz immer besserer Internetanbindungen wird die Optimierung der Ladezeit aus verschiedenen Gründen immer wichtiger. Der Einsatz eines CDN (Content Delivery Network) kann dabei ein wichtiger Optimierungsfaktor sein, der sich positiv auf folgende Punkte auswirken kann:

  • Die Absprungrate
  • Suchmaschinen-Plazierung
  • Server-Last/-Traffic
  • Kostenreduzierung

Doch zuerst: Was ist ein CDN oder Content Delivery Network? Ein CDN ist meist ein weltweit oder kontinentales Netzwerk aus Servern, die Inhalte an den Besucher ausliefern können. In diese werden statische Inhalte wie Bilder, Javascript, CSS und Videos vorgehalten, die dann von einem möglichst nah am Besucher liegendem Server an diesen ausgeliefert werden. Da die Inhalte zum einen nicht durch das ganze Netz transportiert werden müssen, und zum anderen der Client von zwei Ressourcen parallel Daten anfordern kann, steigt die Ladegeschwindigkeit und die Latenz sinkt.

Netzwerk ohne Content Delivery Network

Netzwerk ohne Content Delivery Network

Netzwerk mit Content Delivery Network

Netzwerk mit Content Delivery Network

Kommen wir nun zu den Punkten, auf die sich die Verwendung eines solchen Netzwerkes positiv auswirken kann.

Die Absprungrate

Der erste Punkt ist eigentlich jedem klar: Wer auf eine Seite warten muss, springt ab und obwohl die Anbindungen in der Regel schneller werden, sind die Besucher wesentlich ungeduldiger als noch vor ca. 5 Jahren, als das Warten auf eine Seite noch zum Alltag gehörte. Welche Korrelation zwischen Ladezeit und Absprungrate besteht, ist zu individuell, um darüber eine pauschale Aussage zu treffen. Allerdings gilt für alle Seiten: Je schneller, desto besser :)

Google hat dazu in einem Test das Ausliefern ihrer Suchergebnisse künstlich verzögert. Und zwar im Maximum um gerade mal 400 ms. Die Folge ist ein Einbruch des Suchvolumens um 0,59%. Dieses Ergebnis ist meiner Meinung auch noch extrem geschönt, da Google einen hohen Trust hat und die Benutzer wissen, was Sie erwartet. Ein Erstbesucher auf Ihrer Seite weiß das nicht, daher ist dort die Absprungrate meist um ein Vielfaches höher.

Suchmaschinen Platzierung

Zu Punkt zwei. Diese Auswirkung wird oft vergessen, aber Fakt ist, dass alle großen Suchmaschinen offen zugeben, die Ladezeit mit in das Ranking aufzunehmen. Zu welchem Teil, darüber lässt sich natürlich nur spekulieren. Aber gering kann er nicht sein, wenn Yahoo und Google sogar eigene Page-Speed-Analyse-Werkzeuge als Browser-Plugin anbieten. Aber selbst, wenn sie die Ladezeit nicht als Ranking-Faktor einbeziehen würden – die Absprungrate und Verweildauer auf Ihrer Seite ist es auf jeden Fall. Und die hat ebenfalls einen Einfluss auf das Ranking. Hier beißt sich also die Katze in den Schwanz….

Darüber hinaus wird die Verwendung eines CDN so oder so positiv bewertet. Bei Google heißt es zwar nur, dass man statische Inhalte wie Bilder, Javascript und CSS auf eine sogenannte “cookieless domain” auslagern soll. Yahoo dagegen vergibt nur die volle Punktzahl, wenn ein echtes CDN eingesetzt wird.

Server-Last/-Traffic

Der letzte Punkt ist die Entlastung des eigenen Servers. CDN sind eine wirklich gute Möglichkeit, Last vom Server zu nehmen. Dieser kann sich ganz auf die Bereitstellung der dynamischen Inhalte konzentrieren, ohne die vielen weiteren Requests für die restlichen Seitenelemente bearbeiten zu müssen. Aber auch wer mit Engpässen aufgrund eines hohen Traffic-Aufkommens Probleme hat, kann sich mit der Auslagerung von Downloads oder Audio-/Video-Inhalten in ein CDN helfen.

Kostenreduzierung

Dieser Punkt mag den ein oder anderen verwundern, da Content Delivery Networks in der Regel sehr teuer sind. Aber es gibt auch Fälle, wo sich durch Ihren Einsatz sparen lässt. Wer seine Seite in der Cloud hosted, bezahlt in der Regel recht viel für den anfallenden Datenverkehr. Im Beispiel von JiffyBox sind das pro GB 0.09 Cent. Dagegen kostet MaxCDN pro GB umgerechnet nur 0.07 Cent und wird bei der Abnahme von größeren Volumen sogar noch günstiger.

Fazit

Kleine, performante Seiten stehen im krassen Gegensatz zum Trend, immer mehr Bilder/Videos und JavaScript-Frameworks einzusetzen. Trotzdem sollte vor dem Einsatz eines CDN zuerst einmal die Datenmenge reduziert werden z.B. durch Kompression der verwendeten Scripte und CSS-Dateien. Auch die Bilder sollten nochmal durch ein Optimierungs-Tool wie optipng laufen. Photoshop hat das leider nicht so ganz raus…

Zur Messung der eigenen Seiten-Performance empfiehlt sich der Einsatz eines Browser-Plugins wie PageSpeed oder eine Onlinemessung wie sie z.B. Pingdom bietet. Diese geben auch gute Tipps zu weiteren Optimierungs-Faktoren.

Nächste Woche geht es dann im Teil zwei weiter. Dieser wird verschiedene Typen von CDN beleuchten und auch ein paar Tips und Empfehlungen geben, wie Ihr günstig selber ein CDN für Euch nutzen könnt.

Folder Art – Kunst auf dem Desktop

Wenn euch mal langweilig ist, hier ein paar Inspirationen wie ihr die Zeit rumkriegt. Selbst wenn euch der Chef alle Minispiele gesperrt hat ;)

jQuery Template Plugin

Wer auf “State of the Art” Features wie Nesting, Loops und ähnliches verzichten kann, für den lohnt es sich in ein paar Zeilen ein eigenes Template-Plugin zu schreiben.

Hier das jQuery Plugin:

jQuery.fn.render = function(values){

    this.each( function (index, template) {

        var org_ob = $(template)
        var ob = org_ob.clone();

        for (var key in values) {
            re = new RegExp('@'+key+'@', 'gm');
            ob.html(ob.html().replace(re,values[key]))
        }  

        ob.addClass('jst_ready').insertAfter(org_ob)

        var id = org_ob.attr('id');
        re = new RegExp('jst_', 'gm');
        ob.html(ob.html().replace(re,id))

        if (ob.hasClass('jst_hide')) { ob.hide(); } else { ob.show(); }

    });
}

Templates sehen dann so aus:

<div class="name" style="display:none;">@firstname@ @lastname@</div>

und

$('.name').render({'firstname':'Max','lastname':'Muster'});

macht daraus…

<div class="name_item jst_ready" style="display:none;">Max Muster</div>

Darüber hinaus kann durch die Klasse “jst_hide” das Template zwar gerender aber nicht angezeigt werden und eine “id” sollte wie folgt aufgebaut sein damit es keine Kollisionen gibt.

id="jst_name"

wird zu

id="name"

Eins, zwei, drei, ganz viele….

CSS Icons

Buttons mit Icons

Für manche Projekte benötigt man eine Menge Icons, die durch eine CSS-Klasse z.B. auf einen Button angewendet werden sollen. Also sucht man sich aus einem der bekannten und beliebten Iconsets das Benötigte zusammen und pflegt diese in einer separaten CSS-Datei.

Das wird gerade bei vielen Icons sehr fehleranfällig und zeitaufwendig. Dabei lässt sich dieser Schritt einfach automatisieren. Alles, was Ihr dazu braucht, liefern Pinguin- und Apfel-Betriebssysteme bereits mit.

Erstmal kopiert ihr dazu alle benötigten Icons in einen eigenen Ordner neben eurem bestehenden Style-Sheet. Ich ergänze diesen immer noch um die Angabe der entsprechenden Icongröße wie z.B.

"icons_16"

für 16x16px große Icons. Nun öffnest du einen Terminal, wechselst in das soeben erstellte Verzeichnis und führst dort ein bisschen Shell Magic aus. Die erstellt Dir den benötigten Stylesheet und speichert diesen als icons_16.css.

mv ../icons_16.css ../icons_16.css.bac; \
for file in `ls`; \
do echo "a.icon_16_${file%%.*} { background:url($file) }"  \
>> ../icons_16.css; done;

komplett kopieren und im Terminal einfügen

danach sollte deine Ordnerstruktur ungefähr so aussehen:

/Project
  /index.html       # Das HTML-Projekt
  /icons_16.css     # Die erstellte CSS-Datei
  /icons_16         # Dein Icon-Ordner
    /icon_a.png
    /icon_b.png
  /style.css        # Dein regulärer Style

In der “style.css” definierst Du nun wie gewohnt den Basis-Look Deines Buttons und importierst lediglich noch die “icons_16.css” am Anfang des Dokumentes.

@import url(icons_16.css);

a {
    display:block;
    float:left;
    padding:10px 10px 10px 32px;
    margin:0px 10px 10px 0px;

    background: 10px center no-repeat #333;
    text-decoration:none;
    color: #fff;
    -moz-border-radius: 5px;
    -webkit-border-radius: 5px;
    border-radius: 5px;
}

a:hover {
    background-color: #999;
    color: #333;
}

Nun kannst du jedem Button durch Verwendung einer Klasse, die sich aus “icon_16_” + den Dateinamen der Bilddatei zusammensetzt, automatisch das entsprechende Icon zuordnen.

<a href="#" class="icon_16_emoticon_happy">emoticon_happy.png</a>

in diesem Fall das “happy emoticon”.

emoticon_16_happy

Button mit Emoticon Happy Icon

Alle benötigten Daten habe ich hier nochmal zum Download zusammengefasst: icon_site.zip

USB Network for SHR

Sharing your hosts network connection with your freerunner is pretty simple under Debian and Ubuntu. Create a script with the following code and you are done.

#!/bin/bash
sudo iptables -A POSTROUTING -t nat -j MASQUERADE -s 192.168.0.0/24
sudo sysctl -w net.ipv4.ip_forward=1
sudo ip addr add 192.168.0.200/24 dev eth2
sudo ip link set eth2 up
scp /etc/resolv.conf root@192.168.0.202:/etc/resolv.conf
ssh -X root@192.168.0.202