763 Tage zuvor: Twitter-Home als Feed mit Javascript

Vor gut zwei Jahren hat Twitter einen wichtigen Schritt zur Datensicherheit gemacht. Mit EinfĂŒhrung ihrer API 1.1 wurde zum AusfĂŒhren vieler Funktionen eine OAuth Authentifizierung nötig. Und bei der Implementierung in (Web-) Applikationen ist dies auch meistens kein Problem. Anders sieht es da schon mit JavaScript aus.

Generell ist von einer Implementierung von OAuth in JavaScript auch deutlich abzuraten! Da die privaten SchlĂŒssel zur einer eindeutigen Identifizierung im Klartext dem Client vorliegen mĂŒssen, gibt es keine Möglichkeit diese ausreichend vor Fremdzugriff zu schĂŒtzen. FĂŒr mein letzte Projekt, eine personalisierte Browser-Startseite, war jedoch eine Server-seitige Implementation nicht zielfĂŒhrend.

kbo Startpage

Beim Herausarbeiten der FunktionalitĂ€t stieß ich immer wieder auf Aussagen das dies generell nicht möglich sei (sogar von Twitter-Mitarbeitern). Selbstredend ist dies nicht korrekt; wenn auch die Implementation, vor allem dank des faszinierenden Signatur-Prozesses, durchaus herausfordernd ist. Um meinen Teil zum aufrĂ€umen mit diesem GerĂŒcht beizutragen, hier jedenfalls die FrĂŒchte meiner Arbeit.

Um das Skript auszufĂŒhren benötigt man:

  1. Eine Twitter-App (zu erstellen)
  2. Authentifizierten Zugriff der App auf das eigene Profil
  3. Die CryptoJS library (hmac-sha1.js reicht)
  4. jQuery (zumindest in dem Beispiel)

FĂŒllt man die Variablen fĂŒr Consumer und Access Token aus, sollte der Aufruf von loadTwitter() das Array tweets[] mit den letzten Tweets der Twitter Home-Timeline befĂŒllen. Und die kann man dann, zum Beispiel, in einer personalisierten Startseite verwenden.

/*
 * Retrieve Tweets from your personal Twitter home via REST.
 * (c)2015 by Kai Boenke [code@boenke.info]
 * Requires CryptoJS (hmac-sha1.js): https://code.google.com/p/crypto-js/
 * Requires jQUery: https://jquery.com/
 */
var tweets = [];
function loadTwitter(){
	twitterURL =			"https://api.twitter.com/1.1/statuses/home_timeline.json";
	twitterURLmethod =		"GET",
	twitterKey =			"xxxxxxxxxxxxxxxxxxxxxxxxx"; //Consumer Key (User)
	twitterSecret =			"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; //Consumer Secret (User)
	twitterToken =			"99999999-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; //Access Token (App)
	twitterTokenSecret =	"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; //Access Token Secret (App)
	twitterNonce =			getNonce(32);
	twitterTimestamp =		Math.round(Date.now()/1000);
	
	// Generate oAuth Signature (https://dev.twitter.com/oauth/overview/creating-signatures)
	twitterParameter = [
		encodeURI('oauth_consumer_key='+twitterKey),
		encodeURI('oauth_nonce='+twitterNonce),
		encodeURI('oauth_signature_method='+"HMAC-SHA1"),
		encodeURI('oauth_timestamp='+twitterTimestamp),
		encodeURI('oauth_token='+twitterToken),
		encodeURI('oauth_version='+"1.0")
	];
	twitterParameter.sort();
	twitterSignatureBase =	twitterURLmethod +"&"+ encodeURIComponent(twitterURL) +"&"+ encodeURIComponent(twitterParameter.join("&"));
	twitterSignatureKey =	encodeURIComponent(twitterSecret) +"&"+ encodeURIComponent(twitterTokenSecret);
	twitterSignature =		encodeURIComponent(CryptoJS.HmacSHA1(twitterSignatureBase, twitterSignatureKey).toString(CryptoJS.enc.Base64));
	
	// Get tweets
	$.ajax({
		type:		twitterURLmethod,
		url:		twitterURL,
		headers:	{
			'Authorization': 'OAuth '+
				'oauth_consumer_key="'+ twitterKey +'", '+
				'oauth_nonce="'+ twitterNonce +'", '+
				'oauth_signature="'+ twitterSignature +'", '+
				'oauth_signature_method="HMAC-SHA1", '+
				'oauth_timestamp="'+ twitterTimestamp +'", '+
				'oauth_token="'+ twitterToken +'", '+
				'oauth_version="1.0"'
		}
	}).done(function(twitterData){
		// Retrieve tweets
		$.each(twitterData, function(i, tweet){
			tweets.push({
				timestamp: (new Date(tweet.created_at)).getTime(),
				link: "https://twitter.com/"+ tweet.user.screen_name +"/status/"+ tweet.id_str,
				value: tweet.text
			});
		});
	});
}

1707 Tage zuvor: DNSmasq und Active Directory

Eines meiner liebsten Tools fĂŒr den Heimeinsatz ist DNSmasq. Es handelt sich dabei um einen kleinen, leicht einzurichtenden DNS und DHCP-Server – perfekt fĂŒr das Heim-Netzwerk. Der grösste Vorteil allerdings ist seine enorme FlexibilitĂ€t, denn dank zahlreicher Funktionen und Optionen kann man nahezu alle Netzwerk-Szenarien mit ihm realisieren. Vermutlich sind das auch die GrĂŒnde aus denen er bei Tomato, einer wirklich tollen Router-Software, zum Einsatz kommt.

Leicht einzurichten oder nicht, wenn man ausgefallene Netzwerk-Konfigurationen hat, wird es auch mit dem ĂŒbersichtlichsten Programm kompliziert. Zum Beispiel wenn man das Netzwerk fĂŒr Dual-Stack mit einer Active-Directory Domain im IPv6 Netzwerk konfigurieren möchte. Kompliziert, vielleicht. Aber mit folgenden Parametern durchaus machbar:

srv-host=_ldap._tcp.<Domain-Name>,<DC-Hostname>,389
server=/<Domain-Name>/<DC-IPv6>

Mit diesen Parametern sagt man DNSmasq welche Anfragen an einen Domain-Controller weiterzuleiten sind (und wo sich dieser befindet). Der DNS-Server der DomĂ€ne muss allerdings auch umgekehrt konfiguriert werden, zum Beispiel mit einem Forwarder zum DNSmasq-Host um allgemeine (oder nicht AD-integrierte) Anfragen auflösen zu können. Die Namensauflösung sollte damit einwandfrei funktionieren – sowohl fĂŒr IPv4 als auch fĂŒr IPv6 EndgerĂ€te.

Ein hier nicht angesprochenes, da nicht mit der Namensauflösung zusammenhÀngendes, Problem ist die IPv6 Adress-Vergabe. Denn leider funktioniert die vermeintliche Selbstkonfiguration nicht ganz so Aufwands-arm wie angepriesen. Dazu vielleicht spÀter mehr.

1935 Tage zuvor: ActiveDirectory via PowerShell

PowerShell ist eine tolle Sache. Und das liegt nicht zwingend an dem sich irgendwie einstellenden Linux-Feeling. Vielmehr an der FlexibilitĂ€t und dem GefĂŒhl furchtbar effizient eigentlich einfache Aufgaben erledigen zu können, die mit einem GUI oder einer MMC-Konsole schrecklich lange dauern wĂŒrden. Aber das erwĂ€hnte ich ja bereits.

Und auch in Sachen ActiveDirectory hat Microsoft mittlerweile so viele CmdLets zur VerfĂŒgung gestellt, das man so ziemlich alles aus der PowerShell heraus steuern kann. Hier und heute meine Top 3:

  1. get-adgroup –f { name –like "*internet*access*" }
  2. get-acl \\server01\share01
  3. add-adgroupmembers somegroup –members user1, user2, laptop3

NatĂŒrlich macht das alles erst so richtig Spaß wenn man sie kombiniert. Hier zum Beispiel die von mir am hĂ€ufigsten genutzte Kombination um einen User in diverse Gruppen einzufĂŒgen (ich kann mir zwar kryptische Passwörter merken, aber logisch benannte Gruppennamen wollen sich mir nicht eintrichtern):

get-adgroup –f { name –like “vpn” } | add-adgroupmembers –members User02

Etwas komplexere AktivitÀten schreibt man jedoch besser in ein PowerShell Skript. So lassen sie sich nicht nur einfach an Kollegen weitergeben sondern auch als Job einplanen. Hier ein Skript das ich nutze im deaktivierte Computer-Accounts nach einer gewissen Zeitspanne zu löschen:

import-module activedirectory
$ou = read-host "Which OU is to be searched?"
$computers = get-adcomputer -filter 'enabled -eq $false' -searchbase $ou -properties Name, LastLogonDate | where {$_.LastLogonDate -le ((get-date).addmonths(-6))}
foreach($c in $computers){ remove-adcomputer $c  -whatif }

2013 Tage zuvor: Code schreiben, Code lesen

Denkt man an Programmieren fĂ€llt einem zunĂ€chst nur die Logik ein: Der Ablauf, den ein Programm erledigen muss um ein gewĂŒnschtes Resultat zu liefern. Hat man das erreicht stellt sich meist als nĂ€chste Frage die Effizienz: Wie kann ich das Resultat möglichst schnell oder mit möglichst wenig Ressourcen erreichen? Ein eher GrundsĂ€tzlicheres Problem stellt sich schließlich bei der Implementation: Welche Namenskonventionen verwende ich fĂŒr meine Funktionieren, Variablen und Klassenbezeichnungen? Allerdings gibt es auch noch eine weitere, eher unauffĂ€llige Fragestellung: Wie kann ich mein Programm verstĂ€ndlich schreiben? Meistens wird hier auf eine ausgiebige Dokumentation oder sinnvolle Kommentare im Quellcode verwiesen – doch in der RealitĂ€t werden diese eher spĂ€rlich umgesetzt.

Auf dieser Situation aufbauend haben Robert Green und Henry Ledgard ein paar GrundsĂ€tze ĂŒber Namenskonventionen und Layout von Quellcode erstellt und in der ACM Queue veröffentlicht. Ihr Ziel war es Code so zu schreiben, dass er auch ohne Dokumentation einfach und verstĂ€ndlich nachzuvollziehen ist – nicht nur fĂŒr andere, sondern auch fĂŒr einen selbst. Wer sich jemals Jahre spĂ€ter durch den eigenen Spaghetticode wĂŒhlen musste um Modifikationen an einem Programm vorzunehmen, kann das sicherlich nur zu gut nachempfinden. Doch wie funktioniert dieser Ansatz? Ein Beispiel aus ihrer Veröffentlichung

char c1;
c1 = getChoice();
Switch(c1){
  case 'q': case 'Q':  quit();                break;
  case 'e': case 'E':  enterPerson(content);  break;
  case 'd': case 'D':  delPerson(content);    break;
  case 's': case 'S':  sortByName();          break;
  case 'l': case 'L':  showAll();             break;
  case 'f': case 'F':  searchByName(content); break;
  case default:        System.out.println("--Invalid Command!!\n"):
}

Wie zu sehen ist legen sie auf die Gestaltung des Codes wert – Anweisungen werden in logische Blöcke strukturiert so dargestellt, dass man durch einfaches betrachten erkennen unter welcher Bedingung welche Aktion ausgefĂŒhrt wird. In ihren GrundsĂ€tzen gehen sie allerdings auch auf die Benennung (und Lesbarkeit) von Variablen, Funktionen und Klassen ein. Stets mit dem Ziel den Code fĂŒr sich selbst sprechen zu lassen. Ein Artikel den sich, wie ich finde, zu lesen lohnt!

Ich persönlich gerate speziell bei den Namenskonventionen regelmĂ€ĂŸig ins Straucheln – was zu einem guten Teil auch von meiner Trial-and-Error Programmierung herrĂŒhrt: Variablen Ă€ndern durchaus öfters im Laufe der Versionen ihre Nutzung, Funktionen ihren Umfang und Klassen ihre Bestimmung (was dank Refactoring kein großes Problem mehr darstellt). Und eine wirkliche Dokumentation hat bislang noch keines meiner ohnehin eher kleineren Projekte verpasst bekommen. Daher werde ich mich bemĂŒhen bei meinen zukĂŒnftigen Projekten diese GrundsĂ€tze zu beherzigen.

2659 Tage zuvor: PXE und BOOTP

Live-CDs sind eine geniale Erfindung. Auf jedwedem Computer kann man so eine gewohnte Umgebung nutzen ohne zuvor eine langwierige Installations-Prozedur durchlaufen zu mĂŒssen. Und das ganz ohne die Daten auf dem Rechner an-zufassen. Leider muss man, um sie zu nutzen, entweder eine CD brennen, oder einen USB-Stick entsprechend herrichten. Das kann sich mitunter mindestens ebenso langwierig gestalten.

Grund genug das Heim-Netzwerk um einen Boot-Server zu erweitern. Damit sollten sich die CD-Flut im Zaum halten und der USB-Stick weniger hÀufig formatieren lassen. Und die Installation ist dabei auch noch herrlich einfach:

apt-get install tftpd-hpa

NatĂŒrlich muss der Dienst auch noch konfiguriert werden, aber das komplizierteste dabei ist noch das Spezifizieren des Installations-Verzeichnisses. Mit diesem Dienst kann man nun fertige PXE-Images via Netzwerk starten. Zum Beispiel eine Debian-Installation, oder Tools wie ConeZilla. Praktisch!

Doch es geht auch noch besser. Wenn man auf seinem Debian-System einen NFS-Server betreibt, ist es auch möglich zum Beispiel Ubuntu via Netzwerk zu starten. Der Trick besteht darin, dass File-System komplett via NFS einzuhĂ€ngen – und somit einen USB-Stick oder eine CD ĂŒberflĂŒssig zu machen. Eine feine Sache, und durchaus performant! Kleiner Tipp dazu: Den Inhalt des ISO-Images nicht auf das Filesystem kopieren, sondern direkt auf den freigegeben NFS-Pfad mounten.

2855 Tage zuvor: Fern-Fernsehen

Nachdem das ZDF seine Mediathek umgestaltet hat, funktionierte mein schöner Fern-Fernseher leider nicht mehr richtig. Das entsprechende Plug-In wurde nÀmlich leider nicht auf die neue Struktur umgestellt. Doch wie meinte mein alter Abteilungsleiter (streng genommen war es seine Frau) doch gleich? Darfst kein Depp sein. Ergo, selbst ist der Mann:

#!/bin/sh
d=`date +%y%m%d`
j="/media/public/heute_journal_$d.asx"
h="/media/public/heute_$d.asx"
s="/media/public/heuteshow$d.asx"

rm /media/public/heute_*.asx

wget -qO $j "http://wstreaming.zdf.de/zdf/veryhigh/"$d"_hjo.asx"
[ "$?" -ne "0" ] && \
        rm $j

wget -qO $h "http://wstreaming.zdf.de/zdf/veryhigh/"$d"_h19.asx"
[ "$?" -ne "0" ] && \
        rm $h

wget -qO $s "http://wstreaming.zdf.de/zdf/veryhigh/"$d"_heuteshow_hsh.asx"
[ "$?" -ne "0" ] && \
        rm $s

Das kleine Script lĂ€uft bei mir tĂ€glich um 18:00h (Mitternacht deutscher Zeit) und lĂ€dt die kleinen Streaming-Links herunter. Die wiederum kann XBMC problemlos abspielen. Leider bekommt man so nur die Auslands-Fassung mit (aus rechtlichen GrĂŒnden) weniger BeitrĂ€gen und an manchen Stellen ohne Bild. Aber immerhin.

2856 Tage zuvor: Munin und Tomato

Munin ist eine System-Überwachung fĂŒr Linux und, nachdem ich meinen Homeserver “neu aufsetzen” durfte, auch meine neue Lösung zur Überwachung des Heim-Netzwerks. Da Munin schön modular aufgebaut ist und den Status mehrerer Systeme zentral zusammenfasst, lag es nur nah auch den Router, der unter Tomato lĂ€uft, mit in die Überwachung zu integrieren.

Da es keine Möglichkeit gibt eine Munin-Node nativ unter Tomato laufen zu lassen, muss man auf SNMP zurĂŒckgreifen. Denn einen SNMPd gibt es mit integrierten Bibliotheken in kompakter Form bereits fertig zum Download. Nachdem er einmal entpackt ist, kopiert man ihn (ĂŒber eine CIFS-Freigabe) auf den Router – oder lĂ€sst ihn direkt von der Freigabe aus laufen, je nach belieben. In meinem Fall wollte ich ihn auf dem verbleibenden JFFS-Speicherbereich laufen lassen. Dazu muss unter dem JFFS-Punkt Execute when Mounted folgender Aufruf hinterlegt werden:

/jffs/snmpd -c /jffs/snmpd.conf &

Der SNMP-Dienst sollte jetzt laufen. Ein beliebiger SNMP-Client sollte jetzt Daten auslesen können. Eben auch Munin, fĂŒr das jedoch zunĂ€chst die SNMP-Plugins auf dem ĂŒberwachenden Rechner entsprechend eingerichtet werden mĂŒssen. ZunĂ€chst legt man eine virtuelle Node in /etc/munin/munin.conf an:

[abeir.selune]
address 127.0.0.1
use_node_name yes
[shar.selune]
address 127.0.0.1
use_node_name no

Anschließend kann man sich mit munin-node-configure --snmp shar.selune --snmpversion 2c --snmpcommunity public die notwendigen Links generieren lassen – einfach die Ausgabe kopieren und entsprechend ausfĂŒhren. Startet man noch den Munin-Dienst neu (/etc/init.d/munin-node restart) braucht man nur noch ein wenig zu warten und die ersten Daten fließen in die Auswertung mit ein:

2942 Tage zuvor: Getunnelt

Wie konnte man doch gleich Webseiten aufrufen, die die Herkunft der Anfrage anhand der IP-Adresse feststellen, von die die Anfrage ausgeht? Richtig, mit einem SSH-Tunnel! Und wie genau geht das doch gleich? Unter Linux ist es recht einfach:

ssh -D 8080 <host>

Unter Windows geht es dank PuTTY allerdings auch:

PuTTY-Tunnel

Anschließend im lokalen Browser localhost:8080 als SOCKS-Proxy hinterlegen und lossurfen! FĂŒr Webseiten funktioniert das wunderbar. Ob Videos auch ĂŒber den Proxy angefragt werden oder, wie zum Beispiel DNS-Anfragen, weiterhin direkt angefordert werden, mĂŒsste noch getestet werden.

2944 Tage zuvor: TĂŒcken mit Linux

Man sollte es eigentlich besser wissen, wenn man die Test-Version von Debian auf seinen Systemen installiert: Manchmal funktioniert irgend etwas nicht mehr. Urplötzlich. Und einfach so. War es vor einigen Wochen noch der VLC-Player (der auf einmal einen Filter nicht mehr enthielt, den ich fĂŒr meinen Streaming-Server genutzt habe), war es dann vor einigen Tagen BackupPC, die Backup-Lösung fĂŒr meine Linux-Systeme (und den Windows-Server). Besonders Ă€rglich war dies, weil ich gerade auf einen Restore-Point zurĂŒckgreifen musste.

Im Falle des BackupPC-Problems war die Fehlermeldung leider nicht wirklich offensichtlich. Beim Aufruf der entsprechenden Webseite beschwerte sich die Installation auf einmal, dass sie unter einem falschen User laufen wĂŒrde. Lighttpd, der nicht nativ unterstĂŒtzt wird, zeigte sich unschuldig. Ein fehlendes SUID-Bit fĂŒr /usr/share/backuppc/cgi-bin/index.cgi war die Ursache. Hier hatte wohl ein Update zugeschlagen.

Leider funktionierte danach noch weniger als zuvor: Beim Aufruf der Seite kam jetzt zwar nicht mehr die oben genannte Meldung, dafĂŒr aber interne Server-Fehler (500) ohne weitere Auskunft – auch nicht in den Log-Dateien. Ein ausfĂŒhren der betroffenen index.cgi direkt in der Konsole klappte zwar mit root problemlos, mit dem www- oder backuppc-User jedoch kam eine neue Fehlermeldung:

perl: error while loading shared libraries: libperl.so.5.10: cannot open shared object file: Permission denied

Kein Wunder, existierte die Datei doch garnicht (mehr). Irgend ein Update hatte sie wohl gelöscht. Das erklÀrt zwar nicht, warum mit root-Rechten der Aufruf immernoch funktionierte, lieferte jedoch einen Lösungs-Ansatz:

apt-get install libperl5-10

Und siehe da: Alles funktioniert wieder wie gehabt. Vielleicht sollte man doch die stable-Versionen von Debian nutzen. Aber die hÀngen der FunktionalitÀt mitunter ja leider um Jahre hinterher.

2945 Tage zuvor: 255.255.224.0

Teil der momentan angestrebten Zertifizierung ist die Berechnung von Subnetz-Masken, CIDR-Adressbereichen und der damit einhergehenden Anzahl an verfĂŒgbaren Host-Adressen. VorwĂ€rts, rĂŒckwĂ€rts und auch seitwĂ€rts. Daher habe ich mir die Zeit genommen wieder ein kleines JavaScript dazu zu basteln:



Auch davon gibt es im Netz genĂŒgend, aber das erstellen eines solchen Scripts hilft beim Lernen eine Menge mehr, als lediglich das austesten.

2959 Tage zuvor: Adios Exchange!

Ich hatte es kurz bei identi.ca erwÀhnt: Googlemail bietet neuerdings die Möglichkeit Email-Konten via Active-Sync mit Windows Mobile-GerÀten abzugleichen. Gratis, selbstredend. Da ich bislang einen (kostenpflichtigen) Exchange-Account bei einem Hoster hatte, konnte ich der Versuchung nicht widerstehen das Google-Pendant zu testen.

DafĂŒr habe ich zunĂ€chst meine Email-Accounts in Googlemail integriert (sprich, Google ruft dort meine Mails ab und kennzeichnet sie entsprechend der Konten, von denen sie kamen). Anschließend wurden die Kontakte sowie mein Kalender von Outlook (Export als Windows-CSV) nach Googlemail (Import) ĂŒbertragen. Das alles ging wunderbar einfach und schnell gleichermaßen. Selbst das Einrichten von Googlemail unter Windows-Mobile war absolut problemlos. Nach einigen Minuten tröpfelten dann die so abgeglichenen Mails, KalendereintrĂ€ge und Kontakte auf meinem Handy ein.

Doch einen Haken hat die Geschichte leider. Denn als Desktop-Frontend taugt Outlook fĂŒr Googlemail leider nicht mehr. Zwar kann man Kalender (als Internet-Kalender) und Mails (via IMAP) weiterhin abgleichen, aber fĂŒr die Kontakte gibt es nur dubiose Synchronisierungs-Programme. Unter Linux hat man Dank Evolution hier keinerlei Probleme: Alle Funktionen von Googlemail werden unterstĂŒtzt – selbst das Versenden von Mails unter verschiedenen Accounts. Doch unter Windows musste ich ein wenig suchen. Gelandet bin ich dann bei Thunderbird.

Von Haus aus unterstĂŒtzt Thunderbird zwar Googlemail direkt, allerdings nur als POP-Abruf (und ohne Kontakt / Kalender-Synchronisation). Ein IMAP-Konto ist jedoch schnell auch manuell eingerichtet. Mittels der IdentitĂ€ts-Verwaltung kann man auch unter anderen Accounts Mails ĂŒber das so eingerichtete Konto versenden. Doch wirklich integriert wird Googlemail erst durch das bereits von Firefox bekannten Addon-Konzept. So bietet Google-Contacts die Schnittstelle zu den Kontakten, Lightning bietet die Kalender-FunktionalitĂ€t und Provider for Google Calendar die dazugehörige Schnittstelle fĂŒr den Google-Kalender.

Alles in allem bin ich also quasi wieder da, wo ich am Anfang war. Allerdings kostenlos, Plattform-ĂŒbergreifend (unter Linux funktioniert es gleichermaßen) und mit einem mĂ€chtigen Web-Frontend.

3036 Tage zuvor: X ohne X

Manchmal fragt man sich ja, warum man eigentlich bei einfachen Sachen so lange herumbasteln muss, bis sie funktionieren. Zum Beispiel bei einer Remote X-Session. Dabei ist es doch so einfach:

ssh -Y [host]

Allein der Hinweis darauf, dass auf dem Client ein X-Server laufen muss, stand nirgends dabei. Ist aber eigentlich, wenn man mal ein klein wenig drĂŒber nachdenkt, auch selbstverstĂ€ndlich. Ein weiterer Beweis dafĂŒr, dass Google einem zunehmenden das Denken abnimmt. Und dafĂŒr, dass die Bing-Werbung wirklich gelungen ist:

3037 Tage zuvor: Sendeleistung

Garnicht mal so einfach, zwei Wireless-AccessPoints zu einem Verbund zusammen zu schließen. Nicht nur, dass man dazu mindestens ein kompatibles GerĂ€t braucht – man muss auch noch alles genau richtig einstellen. Mit WDS allein ist es da nicht getan. Die Sicherheitseinstellungen mĂŒssen ĂŒbereinstimmen (kein WPA2) und der Sende-Kanal muss auch derselbe sein.

Um einen zu verwirren sind im Netz auch teils gegensprĂŒchliche Anweisungen, vor allem im Bezug auf die KanĂ€le, zu finden. Ich vermute hier mal einfach Hersteller-abhĂ€ngige Unterschiede. Trotzdem sollte man denken, dass es mittlerweile auch dafĂŒr einen Standard gĂ€be.

Aber gut, jetzt funktioniert es und WiFi ist mittlerweile im gesamten Haus zu empfangen. Bei der Einrichtung viel mir dann auch gleich wieder auf, dass alle Nachbarn netter Weise auf denselben KanÀle sitzen:

3041 Tage zuvor: Bake mit Fenstern

Es gibt viele Hinweise darauf, wie man CakePHP unter dem IIS zum laufen bekommen soll. Allerdings haben mir die Weiterleitungsregeln alle nur Ansatzweise geholfen. Dabei hatte ich die Installation extra in ein eigenes Web ausgelagert um die Konfiguration unabhÀngig von den normalen Web-Diensten konfigurieren zu können.

Nun, diese Weiterleitungsregeln fĂŒr ISAPI-Rewrite3 funktionieren – jedenfalls bei mir:

RewriteEngine on
RewriteRule ^/(css|files|img|js|stats)/(.*)$ /app/webroot/$1/$2 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?url=$1 [L,QSA]

3056 Tage zuvor: Der alte K(r)ampf

Zugegeben, es ist schon einige JĂ€hrchen her das ich mich intensiver mit HTML auseinandersetzen musste. CSS war seinerzeit eine tolle Sache, die sich gerade durchzusetzen abzeichnete, Internet Explorer war der Browser schlechthin und Firefox nannte sich noch Phoenix. Und schon seinerzeit war es eine Herausforderung sondergleichen eine Webseite so zu schreiben, dass sie auf allen Browsern in etwa gleich aussah – oder zumindest zumutbar.

Das hat sich bis heute leider nicht wirklich geĂ€ndert. Auch wenn es wesentlich leichter geworden ist sein Ziel zu erreichen. Immerhin kann man jetzt einfach ein zusĂ€tzliches Stylesheet schreiben, dass IE-spezifische Änderungen vornimmt.


Tolle Sache!

3092 Tage zuvor: Die Suche nach den Mail-Einstellungen

Falls jemand mal in die Verlegenheit kommen sollte unter einem 64Bit-Vista nach den Outlook-Einstellungen zu suchen: Die verstecken sich unter den Additional Options des Control Panel bei den 32-bit Control Panel Items.

Logisch, eigentlich.

3114 Tage zuvor: Tasks abschießen

Wenn man viel mit Linux arbeitet, vermisst man ab und an schon mal eine Funktion unter Windows. In vielen FĂ€llen gibt es allerdings ein Äquivalent – man kennt es nur nicht. Eines davon ist taskkill. Und, falls ich es mal wieder suchen sollte, so funktioniert es:

taskkill /F /FI "IMAGENAME eq VirtualBox.exe"

Das Ganze geht natĂŒrlich auch mit anderen Prozessen. Beim Namen der Prozesse hilft tasklist weiter.

3143 Tage zuvor: Schlechte Menschen

Diese Welt ist voller schlechter Menschen. Eigentlich wollte ich die Tage ja voller Lob von dem Sheeva Plug reden. Allein ein fieser Hacker meinte sich einen Spaß erlauben zu mĂŒssen und das arme, kleine System zu infiltrieren. Gut, ich hĂ€tte den Port am Router nicht auflassen dĂŒrfen – auch nicht fĂŒr nur einen Tag.

Werde ich in Zukunft auch nicht mehr tun. Denn das Wiederherstellen des Systems hat mich circa zwei Tage beschÀftigt. Konstruktionsbedingt sind Plug Computer nicht wirklich mal eben neu aufgesetzt. Daher bin ich jetzt schlauer was das Einrichten eines USB-Seriell-Adapters unter Debian betrifft (geht nicht), wie sich U-Boot konfigurieren lÀsst (Unmengen Hex-Codes), worum es sich bei TFTP und NFS handelt und wie man mit JFFS2-Dateisystemen umzugehen hat.

Ach ja, was mir schlussendlich geholfen hat, was das Booten von der eingebauten SD-Karte samt anschließendem flashen des internen Speichers mit den Original-Images. FĂŒr alle NachahmungstĂ€ter:

setenv bootargs='console=ttyS0,115200 mtdparts=nand_mtd:0x4000000×100000(uImage),0×1fb00000@0×500000(rootfs) rw root=/dev/mmcblk0p1 rw ip=10.4.50.4:10.4.50.5:10.4.50.5:255.255.255.0:DB88FXX81:eth0:none’@

3154 Tage zuvor: Shell fĂŒr Bill

Wir haben hier so eine Überwachungskamera an der HaustĂŒr hĂ€ngen. Eine durchaus lustige Sache, nicht nur um zu sehen wann die Post ankommen oder das Kommen und Gehen der Besucher im Auge zu behalten (oder gar die Nachbarn zu beobachten). Zumal sie eine beeindruckende Nachtsicht mit einer sehr fein einstellbaren Bewegungserkennung mitbringt (man kann sich sogar via Telnet in das dort laufende Linux einklinken).

Das Problem bei all der schönen Überwachung sind allerdings die anfallenden Datenmengen. Zwar wird alles brav mit Mpeg-4 komprimiert, trotzdem kommen schnell einige GB(Gigabyte) damit zusammen. Und da ich leider des öfteren vergesse dort regelmĂ€ĂŸig zu entrĂŒmpeln, habe ich mich heute einmal daran gemacht das Löschen der ĂŒberflĂŒssigen Bits und Bytes zu automatisieren.

Da die Daten der Kamera via FTP auf meinem Heimserver abgelegt werden, musste also eine Windows-konforme Lösung her. Doch wie tut man das, wenn eine Batch-Datei dabei an ihre Grenzen kommt? Ganz recht: Mit der PowerShell. Gehört hatte ich von ihr schon zuvor, allerdings bis heute noch nie benutzt. Und ich muss sagen: Tolle Sache! In nicht mal einer halben Stunde war ich in der Lage die PowerShell zu installieren, ein passendes Script zusammenzustellen, es zu testen und anschließend einzuplanen.

Ich zeige mich beeindruckt und ziehe den Hut, Herr G.!

3165 Tage zuvor: Videos drehen

Damit ich beim nÀchsten Mal nicht wieder suchen muss:

mencoder -vf rotate=1 -ovc lavc -oac copy &#60;file_in&#62; -o &#60;file_out&#62;

3210 Tage zuvor: Textpattern bei 1und1

Nachdem diese Domain ja mittlerweile bei ihrem neuen Hoster angekommen ist, habe ich heute dann auch den letzten Fehler behoben: Saubere URLs in Textpattern. Ein wenig kniffelig, aber durchaus einfach zu lösen. Mit folgender .htaccess-Datei:

DirectoryIndex index.php index.html
# For security reasons, Option followsymlinks cannot be overridden.
#Options +FollowSymLinks
Options +SymLinksIfOwnerMatch
RewriteBase /

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+) - [PT,L]
RewriteRule ^(.*) index.php

3399 Tage zuvor: Dein DNS und Du

Heute schon den DNS-Server auf den berĂŒchtigten Sicherheitsfehler geprĂŒft? Ich tat dies soeben und musste dabei leider feststellen, dass mein Provider sich scheinbar noch nicht genötigt sah etwas dagegen zu unternehmen. Er steht damit zwar nicht alleine da, aber das macht die Sache ja nun auch irgendwie nicht besser.

3469 Tage zuvor: Virtuelle 64-Bit

Allen, die versuchen ein 64-Bit Client-Betriebssystem unter Vista-64 zum Laufen zu bekommen sei gesagt:

Virtualbox does not support 64-bit guests.

Mich hat es einige Stunden gekostet, dies herauszufinden.

3580 Tage zuvor: PHP5 unter IIS6

Falls jemand in die Verlegenheit kommen sollte PHP5 unter einem IIS6 laufen lassen zu wollen und alle Guides einfach nicht weiterhelfen, sollte mal probieren fĂŒr die PHP-Erweiterung in den Web Extensions denselben Pfad einzutragen wie in der Web Site Configuration. Also im alten MS-DOS Format (mit Tilden). Damit wird zumindest das Problem bei einem 404 2 1260 Fehler behoben (keine Berechtigung zum AusfĂŒhren der Erweiterung).

Klar, oder?