Wieczos Blog

Ich laufe auf Sonnenschein!

Sinnlose Online-Anmeldungen umgehen

by Wieczo - März 15th, 2012

All the things: Online Anmeldung? Nie wieder!

Viel zu viele Seiten erwarten, dass man sich anmeldet, um Zugriff auf Foren oder Demo-Software zu bekommen. Ich mag nicht auf jeder Seite meine Email zurückzulassen.

Mein Dank geht an zwei kluge Web-Apps, die es erlauben meine Email-Adresse zu schützen: 10 Minute Mail(eigentlich www.10minutemail.com, scheint tot zu sein) und Bug Me Not

Bug Me Not

Bug Me Not Adobe

Bug Me Not mit Logins für Adobe.com

Wenn ich eine Demo von Adobe Edge runterladen möchte, gehe ich auf Bug Me Not, suche mir die Login-Daten aus und kann dann ohne Angabe von privaten Informationen Edge testen.

10 Minute Mail

10 Minute Mail

10 Minute Mail mit generierter Email-Adresse

Wenn es keinen Login auf Bug Me Not gibt, gehe ich auf 10 Minute Mail, kopiere die generierte Email-Adresse, melde mich mit der Adresse an, warte auf den Aktivierungslink und kann die Adresse wieder vergessen.

Weitere Seiten?

Ich freue mich über neue Seiten, die es mir erlauben, meine Email für mich zu behalten.

Mein erster Open Source Beitrag

by Wieczo - Februar 27th, 2012

Version 1.0.4 von WPide wurde veröffentlicht und ich werde als Contributor gelistet :)

Ausschnitt der WPide README mit meinem Namen als Autor

PHP 5.3 bei Strato aktivieren

by Wieczo - Februar 23rd, 2012

Da ich einen älteren Vertrag bei Strato habe, dauert es bis alle Server standardmäßig auf PHP 5.3.8 umgestellt sind und die Hilfe liefert nicht wirklich einen Hinweis, wie man 5.3 aktiviert.

Das geht recht schnell mit einem Eintrag in der .htaccess:

  • Datei .htaccess erstellen
  • AddType application/x-httpd-php53 .php” in die .htaccess schreiben(ohne Anführungszeichen)
  • Speichern & in den Ordner hochladen, wo PHP 5.3 verwenden werden soll.

UPDATE: Ajax.org Code Editor(ACE) & Wordpress

by Wieczo - Februar 16th, 2012

Nachdem ich den Ajax.org Code Editor entdeckt habe, dachte ich mir, dass es ganz nett wäre, das Ganze in Wordpress einzubinden. Die Plugin-Suche führte mich zu WPide. Das Plugin ersetzt den Theme & Plugin Editor durch ACE. Leider unterstützt es nur PHP-Highlighting. Deshalb habe ich beschlossen, es um JS- & CSS Highlighting zu erweitern. Während ich dabei war habe ich die große PHP-Klasse auseinander genommen und das JavaScript in separate Dateien ausgelagert.

Ich habe im Plugin Forum angefragt, wie ich den Code zum eigentlichen Plugin beitragen kann und warte noch auf die Antwort. Wer mal einen Blick auf meine Erweiterungen nehmen möchte, kann ihn hier finden.

Update

Mein Code ist in das Plugin eingeflossen. Jetzt muss ich nur noch warten, bis die Änderungen in das WP Plugin-Repository geschoben werden.

Die Arbeit an einer Version 2 läuft bereits :)

WebRTC: Zugriff auf die Webcam mit Javascript

by Wieczo - Februar 3rd, 2012

Gestern bin ich auf WebRTC gestoßen und heute hatte ich Zeit damit rumzuspielen. WebRTC steht für Web Real-Time Communications. Es ist eine JavaScript-API, die Zugriff auf die Webcam und das Mikrofon eines Rechners erlaubt.

WebRTC Verwendung

Um die WebRTC-Demos auszuprobieren, muss man Google Canary installieren. Dann aktiviert man “Enable MediaStream” unter chrome://flags oder man startet Canary mit dem  Kommando-Zeilen-Argument “- -enable-media-stream”.

(Opera bietet auch WebRTC Unterstützung, aber ich konnte es bisher nicht testen: http://dev.opera.com/articles/view/getusermedia-access-camera-privacy-ui/)

Problem mit den Demos

Nachdem ich die verschiedenen Demos ausprobiert habe, ist mir aufgefallen, dass der LocalMediaStream nicht geschlossen wird. Ich bin mir nicht sicher, ob die offenen Streams den Speicher zu müllen, aber das kleine, grüne LED an meiner Kamera geht nur aus, wenn ich entweder den Stream mit stop() schließe oder den Browser beende. Wenn ein Tab geschlossen wird, bleibt der Stream weiterhin geöffnet und meine Webcam meldet, dass sie noch an ist.

Dabei ist das Ganze nicht so schwer: Referenz zum Stream speichern und den Stream beim unload-Ereignis schließen.

//id des video tags
var video = document.getElementById("webcam");
var videoStream = null;
function onStream(stream) {
    // Referenz zum Stream speichern
    videoStream = stream;
    video.src = window.webkitURL.createObjectURL(stream);
    video.onerror = function(e) {
        console.log("Kamera Fehler: ", e);
    };
}
 
function onNoStream() {
    console.log("Kein Webcam-Stream");
} 
 
if (navigator.webkitGetUserMedia) {
    navigator.webkitGetUserMedia("video", onStream, onNoStream);
}
 
// Wichtig: Stream schließen, sonst bleibt die Kamera an
window.onunload = function() {
    if (videoStream)
        videoStream.stop();
};

Der Code ist ein Auszug aus der eigentlichen Demo.

Fazit

Insgesamt bin ich von WebRTC begeistert; eine weitere API, die weiter ins Feld von Flash vordringt. Ich hoffe nur, dass alle Browser-Hersteller es einbinden. Mal schauen, was sich noch damit bauen lässt.

Kommentare gesperrt

by Wieczo - Januar 31st, 2012
Ich habe die Kommentare für meine älteren Artikel gesperrt.
Der Grund dafür ist, dass viele alte Artikel mit Spam überrannt werden; die neuen werden in Frieden gelassen. Askimet hilft bei der Abwehr, so dass kein Spam durchkommt, aber es nervt dennoch den Spam nach richtigen Kommentaren zu durchforsten.
Wenn

Ich habe die Kommentare für meine älteren Artikel gesperrt.
Der Grund dafür ist, dass viele alte Artikel mit Spam überrannt werden; die neuen werden in Frieden gelassen. Askimet hilft bei der Abwehr, so dass kein Spam durchkommt, aber es nervt dennoch den Spam nach richtigen Kommentaren zu durchforsten.

Wenn jemand eine bessere Lösung hat, bitte melden :)

Clojure: Römische Zahlen umrechnen

by Wieczo - Januar 13th, 2012

Meine Lösung zum 4Clojure Problem 92 finde ich recht hübsch:

(fn [roman]
  (let [t (map #({\I 1 \V 5 \X 10 \L 50 \C 100 \D 500 \M 1000} %) roman)]
    (loop [c (drop 1 t) x (first t) y (fnext t) d 0]
      (cond
        (nil? y) (+ d x)
        (>= x y) (recur (drop 1 c) y (fnext c) (+ d x))
        (< x y) (recur (drop 1 c) y (fnext c) (- d x))))))

Clojure: letfn

by Wieczo - Januar 6th, 2012

Da die Doku kein Beispiel für die Verwendung von letfn hat, hier ein kleines Beispiel für eine Fibonacci-Sequenz:

(defn fib-list [z]
  "Returns a list with z Fibonacci numbers"
  ; direkte Funktionsdefinition mit Name &amp; Parameter OHNE fn
  (letfn [(fib [x]
    (if (&lt; x 3)
      1
      (+ (fib (- x 1)) (fib (- x 2)) )
    ))]
  (for [y (range 1 (+ 1 z))] (fib y)))
)

Update: Das ist die lazy-seq Version der Fibonacci-Sequenz.

(defn fib-list [z]
  (take z ((fn fib [x y] (lazy-seq (cons x (fib y (+ x y))))) 1 1)))

Clojure Highlighting in Wordpress

by Wieczo - Januar 6th, 2012

(Anmerkung: Mein Hoster ist T-Online. Ich habe noch nicht herausgefunden, wie man MySQL updatet, so dass ich WP 3 mit WP-Syntax 0.9.9+ benutzen kann. Also musste ich WP-Syntax 0.9.8 erweitern.)

Ich habe ein bisschen gestutzt, als ich feststellte, dass der Code in meinem Clojure Cheatsheet langweilig grau aussah. Um das zu ändern, bin ich an den Code von WP-Syntax gegangen.

Für Wordpress 3.0+ Benutzer: Der Datei geshi.php in Ordner wp_content/plugins/wp-syntax/geshi fehlt eine Zeile, siehe dritter Punkt & Bild.

WP-Syntax 0.9.8 verwendet eine ältere Version von GeSHi, die noch keine Clojure Highlight Datei hat.

Am Ende des Artikels ist ein Zip-Archiv mit den Änderungen. Folgende Schritte sind notwendig, um alles zum Laufen zu bringen:

  • GeSHi 1.0.8.10 runterladen & entpacken
  • GeSHi Ordner öffnen
  • geshi.php im Editor öffnen
  • In der Funktion get_language_name_from_extension(Zeile 1439) folgende Zeile einfügen und speichern.
'clojure' => array('clj'),
Code-Auszug aus geshi.php: Zugefügte Zeile ist hervorgehoben
  • Die Ordner geshi und die Datei geshi.php nach wp_content/plugins/wp-syntax/geshi hochladen.

Die Datei geshi.php und der Ordner geshi sind markiert.

  • <pre lang=”clojure”> funktioniert!
(defn fib-list [z]
  (let [fib (fn fib [x]
    (if (&lt; x 3)
     1
     (+ (fib (- x 1)) (fib (- x 2)))))]
  (for [y (range 1 (+ 1 z))] (fib y))))
 
(fib-list 10)
(1 1 2 3 5 8 13 21 34 55)

Wer nicht selber Hand an den Code legen möchte, kann den geshi Odner und geshi.php hier runterladen.

Clojure Cheatsheet: Namespaces

by Wieczo - Januar 6th, 2012

Dies ist mein persönlicher Clojure Namespace Spickzettel.

Ausgangssituation: Ich habe die Funktion call-me in der Datei dateiname.clj gespeichert. Je nachdem, wie ich require, refer und use verwende, funktioniert der Aufruf von call-me verschieden.

Namespace deklarieren

; steht in dateiname.clj als erste Anweisung
(ns mein.namespace.dateiname)

ns bietet  verschiedene Optionen:require und :use funktionieren wie ihre Funktionen. Die Dokumentation empfiehlt die Optionen zu verwenden statt require, refer und use.

(ns mein.namespace.woanders
  (:require [clojure.contrib :as cc])
  (:use [mein.namespace.dateiname :only [call-me]]))

Namespace laden

; Aufruf: mein.namespace.dateiname/call-me
(require 'mein.namespace.dateiname)
; Aufruf: d/call-me
(require '[mein.namespace.dateiname :as d])

Mehrere Namespaces laden

(require (clojure.contrib sql sql.tests))

Namespace laden & alle Symbole importieren

; Aufruf: call-me
(require 'mein.namespace.dateiname)
(refer 'mein.namespace.dateiname)

use kombiniert require und refer.

; Aufruf: call-me
(use 'mein.namespace.dateiname)

Verschiedene Optionen

refer und use bieten die Optionen :exclude, :only, :rename, um Symbole auszuschließen, nur bestimmte zu laden oder um geladene Symbole umzubenennen.