2. September 2016: Restore erfolgreich

Heute ist es 303 Tage her, dass diese Webseite offline ging. Eine ziemlich lange Zeit, selbst für mich. Allerdings habe ich nur bedingt zu dieser beachtlichen Wiederherstellungszeit beigetragen. Gut einen Tag habe ich für die eigentliche Wiederherstellung auf einem anderen Webserver gebraucht. Allerdings hat es gut zehn Monate gedauert, bis ich wieder auf meine Daten zugreifen konnte.

Am 5. November waren meine Webseiten nicht mehr erreichbar. Ein Zugriff auf den Server war nicht mehr möglich, und auch ein Fern-Reboot brachte leider keine Abhilfe. Ein freundliches Nachfragen beim Hoster hat allerdings auch keine Lösung gebracht – bis zur Antwort waren bereits einige Wochen verstrichen. Da es sich bei dem Server um einen RaspberryPi in einem gratis-Hosting Programm handelte, kann man sich auch nur bedingt ueber Antwortzeiten beschweren. Jedenfalls wurden mir zwei Optionen angeboten:

  1. Die SD-Karte zum booten neu aufsetzen lassen, was eine Neukonfiguration erfordert.
  2. Den RasPi zurück schicken lassen, womit der Platz im Rechenzentrum wegfallen würde.

Das Hosting-Programm wurde in der Zwischenzeit eingestellt. Option 2 hieß daher auch, dass ein Umzug auf einen neuen Server anstehen würde. Da ich jedoch zu diesem Zeitpunkt (Dezember) bereits einige Zeit mit warten verbracht hatte, entschloss ich mich für Option 2. In Vorbereitung auf den Umzug der Webseiten erstellte ich schon einmal einen neuen Server, diesmal in der Amazon-Cloud.

Nach einigen Tagen lieft der Server in der Cloud, samt verteilter Ressourcen und Nutzung von etlichen AWS Diensten. Die Performance-Unterschiede sind gewaltig – und nebenbei habe ich noch das Know-How für Cloud-basierte Webseiten aufgebaut. Alles in allem eine sehr positive Erfahrung! Jedenfalls bis die erste Rechnung kam und das Aufräumen und das Zusammenstreichen der Dienste auf das wirklich Notwendige anfing. Am Ende kostete mich der Server samt aller Ressourcen knapp $5.50 pro Monat. Ein akzeptabler Preis.

Was nun noch fehlte, waren meine Daten. Einige Webseiten konnte ich von Backups wiederherstellen. Das Blog jedoch basiert auf einer Datenbank – und für die hatte ich kein Offsite-Backup eingerichtet. Es hieß also warten bis der RasPi eintrifft. Und das war, nach etlichen Tickets, Emails und Tweets, gestern dann endlich der Fall. 303 Tage nachdem die Webseite offline ging.

Nun also ist das Blog wieder verfügbar. Wenn ich mir anschaue wie viele Artikel ich in den letzten Jahren über diesen Zeitraum geschrieben habe, hat das Internet sie sicherlich nicht vermisst. Allerdings hatte ich durchaus ab und an das Bedürfnis einige Tricks nieder zu schreiben. Wollen wir hoffen, dass derlei auch in nächster Zukunft weiterhin der Fall sein wird.

18. October 2015: 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
			});
		});
	});
}

1. December 2011: Zähl mich!

Manchmal gibt es Weisheiten, deren Klarheit sich erst nach Jahren vollständig erschließt. You can’t manage it if you can’t measure it ist eine von Ihnen. So offensichtlich diese Erkenntnis auch sein mag: Ich habe einige Zeit gebraucht um sie zu schätzen – und noch länger um sie auch zu leben.

Nun wurde ich vor einigen Monaten auf die Quantified Self Bewegung aufmerksam. Im Prinzip geht es dabei darum eben diese Weisheit auf ein neues Feld auszudehnen: Den eigenen Körper. Der Gedanke dabei ist, dass man wesentlich gesünder und bewusster lebt wenn man weiß wie man mit sich umgeht. Im Grunde genommen ist das keine neue Erkenntnis, beruht doch zum Beispiel Weight Watchers auf derselben Annahme. Doch bei QF(Quantified Self) wird der Gedanke noch ein wenig weiter gesponnen – und um ein paar neu-modische Spielereien angereichert auch wesentlich kurzweiliger gestaltet. Fitbit ist eine davon.

Fitbit Chart

Dahinter versteckt sich ein kleines Gerät, das erfasst wie viel man sich tagsüber bewegt. Wirklich interessant wird es jedoch erst sobald man es mit der Fitbit Webseite abgleicht: Auf einmal erhält man Aufschluss über die eigenen Gewohnheiten, Routinen… und Unzulänglichkeiten. Wer hätte gedacht wie wenig man sich als Schreibtischtäter im Land der unbegrenzten Möglichkeiten tatsächlich bewegt? Erfasst man dazu noch weitere Daten (wie viel Kalorien nehme ich zu mir, wie viel Sport betreibe ich) gewinnt man schnell Erkenntnisse über sich, die einem kein Arzt in diesem Maße hätte veranschaulichen können.

Hat man dann Gefallen daran gefunden an seinen Schwächen zu arbeiten (und vielleicht den ein oder anderen auch dafür begeistert), kann man sich auch gegenseitig messen: Wer bewegt sich mehr, wer erreicht sein Ziel als erster? Und Dank Internet funktioniert das sogar über Kontinente hinweg.

5. September 2011: Löten nach macht Spaß!

Programmieren ist ja im Grunde genommen nichts anderes als Löten mit der Tastatur: Kreatives kombinieren bekannter Zutaten zu etwas Neuen. Oder, wie manch einer sagen mag, Legos für Erwachsene. Auch wenn das in meinen Augen den Legos nicht gerecht wird. Um den heranwachsenden Lego-Fans den Übergang zu vereinfachen, gibt es nun jedenfalls zwei gelungene Anleitungen. Passender Weise im Comic-Format.

Das eine beschäftigt sich nicht nur mit den Grundlagen des Lötens. Es möchte auch den Spaß vermitteln, den man dabei haben kann. Ob nun beim Basteln nach Anleitung oder eigenen Gehversuchen (allen Vätern sei empfohlen mit einem roten Schalter zu einer bunten Lampe anzufangen – es lohnt sich). Soldering is easy ist im übrigen auch bereits in etliche Sprachen übersetzt worden.

Das zweite Werk, das mir in dieser Woche untergekommen ist, beschäftigt sich mit Arduino – und auch hier stehen wieder die Grundlagen im Mittelpunkt. Wenn auch mehr Sinn und Zweck des Open-Source Baukastens denn handwerkliches Know-How. Introduction to Arduino sollte dennoch jedem Bastler einen Blick wert sein – denn die Möglichkeiten des Arduino sind schier endlos (wenn man weiß wie man einen Lötkolben zu bedienen hat).

30. March 2011: Virtueller Umzug II

Ich scheine langsam Übung darin zu haben Webseiten um zu ziehen. Jedenfalls ging dieser Umzug scheinbar anstandslos über die Bühne.

Zugegeben, diesmal hatte ich direkten Zugriff auf die DNS-Einstellungen der Domain – das hilft ungemein. Und auf Textpattern-Seite gibt es neben den Änderungen an der Datenbank-Konfiguration eigentlich auch nur die Pfade anzupassen. Und zwar auch die in der internen Konfiguration.

Oder hat irgend jemand etwas bemerkt?

28. February 2011: Jetzt auch mit Zwitschern

Seit letzter Woche werden die Kurznachrichten (siehe auf der Startseite, rechter Hand) nicht mehr von identi.ca ausgelesen, sondern von Twitter. Warum? Abgesehen davon, dass es einfach wesentlich leichter ist Updates von anderen – zum Beispiel der City of Miami Beach – zu folgen. Ich kann auch endlich die eingebauten Funktionen in meinem Telefon nutzen. Yay…!

Natürlich kann man sich die Kurznachrichten so auch selbst abonnieren. Oder antworten. Falls das jemanden überhaupt interessiert.

Follow me on Twitter

21. January 2011: Bosch bei Channel9

Über was man manchmal so stolpert:

Leider wird Silverlight für die Darstellung benötigt.

19. February 2010: Virtuelles ganz physisch

Im Rahmen eines neuerlichen ASUG Florida Chapter Meeting gab es heute eine zutiefst interessante Rechenzentrums-Tour zu sehen: Bei Terremark direkt hier in Miami. Kannte ich das Unternehmen bis vor ein paar Tagen selbst noch nicht, bin ich nun umso mehr von dem beeindruckt, was in ihren Wänden statt findet.

Als Tier-IV Knoten des Internets laufen hier, in Wurfweite der American Airlines Arena die Unterseekabel von circa 160 Telekommunikationsunternehmen zusammen. Die Deutsche Telekom landet hier genauso an wie der Rest Europas. Oder komplett Südamerika. Daher stehen hier auch einige von Verisigns Rootserver für die .com und .net Domains sowie einige der ICANN-Rootserver für .gov und .edu. Und, das muss man durchaus so sagen: Sie sehen verdammt gut aus! Ist der normale Server dazu verdammt sein Dasein in einer anonymen grauen Kiste in einem dunklen Raum zu fristen, sind die Rootserver hübsch angestrahlt und hinter Glasscheiben zur Schau gestellt. Inklusive Status-Monitor mit aktueller Anzahl an DNS-Abfragen pro Sekunde.

Allerdings stelle ich mir jetzt doch noch die Frage, warum meine Verbindungen gen Deutschland nicht über Miami direkt nach Deutschland geroutet werden, sondern den Umweg über Washington gehen:

Tracing route to www.t-online.de [62.153.159.92]
over a maximum of 30 hops:

1 <1 ms <1 ms <1 ms shar.selune [172.16.0.8]
2 8 ms 12 ms 9 ms 10.156.0.1
3 10 ms 22 ms 12 ms 172.23.80.81
4 14 ms 10 ms 9 ms 172.23.80.1
5 25 ms 25 ms 24 ms xe-5-0-0.edge2.Miami1.Level3.net [4.59.84.49]
6 31 ms 32 ms 36 ms ae-32-52.ebr2.Miami1.Level3.net [4.69.138.126]
7 28 ms 58 ms 30 ms ae-2-2.ebr2.Atlanta2.Level3.net [4.69.140.142]
8 * * 45 ms ae-63-60.ebr3.Atlanta2.Level3.net [4.69.138.4]
9 55 ms 55 ms 67 ms ae-2-2.ebr1.Washington1.Level3.net [4.69.132.86]

10 57 ms 77 ms 48 ms ae-61-61.csw1.Washington1.Level3.net [4.69.134.1
30]
11 44 ms 60 ms 47 ms ae-14-69.car4.Washington1.Level3.net [4.68.17.6]

12 63 ms 50 ms 41 ms 62.156.139.129
13 148 ms 135 ms 140 ms ulm-ea3-i.ULM.DE.NET.DTAG.DE [62.154.58.125]
14 152 ms 139 ms 137 ms 80.156.161.42
15 162 ms 155 ms 138 ms www.t-online.de [62.153.159.92]

Trace complete.

Auf der anderen Seite gibt es hier aber auch einen der drastischsten Gegensätze, die ich bislang sehen musste. Findet in den Wänden diese dedizierten Internet-Knotenpunkts Hightech aus aller Herren Ländern Verwendung, ist also sozusagen die Inkarnation der ersten Welt dort zu Hause, ist an der Rückseite des Gebäudes der Treffpunkt der ärmsten der Armen, die Miami zu bieten hat. Zwischen den den Überresten ihrer Existenz sitzen sie dort zu Dutzenden und harren mit ihrem Schicksal. Ein merkwürdiges Gefühl.

27. January 2010: GeoIP-Lookup in GeoRSS umwandeln

Um die Frage zu beantworten wie ich denn IP-Adressen in eine Google-Karte bekommen habe: Mittels geoip, GeoRSS und (logisch) Google-Maps. Und zwar folgendermaßen.

  • geoiplookup <IP> >> geolookup.txt speichert die Ausgabe in einer Datei.
  • Mit regulären Ausdrücken extrahiert man die Längen- und Breitenangaben.
  • Diese legt man als GeoRSS-Feed ab.
  • Den Feed wiederum kann man in Google-Maps importieren.

Fertig ist die Karte. Wer es ein wenig einfacher haben will, kann auch folgendes PHP-Script zum umwandeln der geoip-Ausgabe in einen GeoRSS-Feed nutzen.


	
	
	
	
		

%s, %s, %s%s %s\n"; $geodata['points'] = array(); $geodata['rawdata'] = explode("\n", $_POST['geoiplookup']); // XML-Special Characters-Function (alonso05 at gmail dot com) function xml_character_encode($string, $trans=''){ $trans = (is_array($trans)) ? $trans : get_html_translation_table(HTML_ENTITIES, ENT_QUOTES); foreach ($trans as $k=>$v) $trans[$k]= "&#".ord($k).";"; return strtr($string, $trans); } // Parse input foreach($geodata['rawdata'] as $data) if(preg_match_all($regex, $data, $results)) $geodata['points'][] = array( xml_character_encode(htmlentities($results[3][0])), xml_character_encode(htmlentities($results[2][0])), xml_character_encode(htmlentities($results[1][0])), $results[5][0], $results[6][0] ); // Create GeoRSS-Feed header('Content-type: application/xml'); echo(''); echo(''); foreach($geodata['points'] as $point) vprintf($geodata['line'], $point); echo(''); ?>

11. December 2009: Die beliebtesten

Heute kam Post von Google. Offenbar ist unsere unbekannte, kleine und eher inaktive Unternehmung unter den 100.000 beliebtesten (lies: am häufigsten aufgerufenen) Unternehmen in Google-Maps.

Da fragt man sich doch irgendwie, welche Aussagekraft diese Schildchen eigentlich haben. Aufhängen dürfen wir es jedenfalls nicht, da ein Büro im Eigenheim gemäß der Miami Beach-Statuten nur dann erlaubt ist, wenn man keine Besucher empfängt – und keine Werbung vor der Haustür macht.