642 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
			});
		});
	});
}

1587 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.

1815 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 }

1893 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.

2539 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.

2735 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.

2736 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:

2822 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.

2824 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.

2825 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.

2839 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.

2916 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:

2917 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:

2921 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]

2936 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!

2972 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.

2994 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.

3023 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’@

3034 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.!

3045 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;

3090 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

3279 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.

3349 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.

3460 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?