Wieczos Blog

Ich laufe auf Sonnenschein!

Kommentare gesperrt

by Thomas Wieczorek - 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 Thomas Wieczorek - 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 Thomas Wieczorek - 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 Thomas Wieczorek - 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 Thomas Wieczorek - 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.

Jasmine Tests vor jedem Git Commit ausführen

by Thomas Wieczorek - Dezember 23rd, 2011

In meinem aktuellen Backbone.js Projekt verwende ich Jasmine für die Tests. Ich habe dazu das Jasmine Ruby Gem installiert.

Die Tests liefen erst als ich

require 'rubygems'

in die Rakefile eingefügt habe.

Bisher habe ich die Tests nur im Browser ausgeführt mit:

rake jasmine

Das ganze ist auch schön und gut, aber manchmal vergesse ich die Tests auszuführen und commit-te etwas, obwohl die Tests fehlschlagen.

Um die Tests laufen zu lassen, wenn ich commit-en will, habe ich einen pre-commit Hook geschrieben:

  • Erstelle die Datei .git/hooks/pre-commit
  • Folgendes in pre-commit kopiert:
rake jasmine:ci
exit $?
  • Den Hook ausführbar machen:
chmod +x .git/hooks/pre-commit
  • Tada! Bei jedem Aufruf von git commit -am ‚was geändert‘ werden zuerst die Tests ausgeführt, wenn sie fehlschlagen, wird auch nichts commit-tet.

Vor Commit

So sah es als ich git commit gestartet habe.

Konsole vor Commit

So sieht es aus, wenn die Tests fehlschlagen und der commit nicht durchgeführt wurde.

Das ganze dauert zwar ein bisschen, aber ich fühle mich sicherer, dass ich beim commit nichts zerstöre.

JavaScript: Problem mit this

by Thomas Wieczorek - Dezember 20th, 2011

tl;dr http://howtonode.org/what-is-this hat mir this in JavaScript klar gemacht.

Vor kurzem habe ich angefangen, einen Memory-Klon in JavaScript zu entwickeln.

Zuerst verwendete ich nur prozedurales JS mit Underscore und jQuery. Nach über 500 Zeilen Spagetti-Code, habe ich nach Frameworks gesucht, um den Code zu organisieren und bin bei Backbone.js auf was Einfaches und Solides gestoßen.

Doch Code wie

_.delay(game.nextLevel, 500)

funktionierte nicht mehr. Das Problem ist JavaScripts this, das in verschiedenen Kontexten verschiedene Objekte referenziert. Das this in game.nextLevel referenziert nicht mehr game, sondern window.

Die Lösung zum Problem ist:

_.delay(_.bind(game.nextLevel, game), 500)

Somit wird game als Kontext der Funktion game.nextLevel gesetzt. Somit referenziert das this in der Funktion wieder das game Objekt.

Tim Caswells Artikel auf howtonode.org hat mir geholfen das Ganze besser zu verstehen.

Huss & Hodn – Heute!

by Thomas Wieczorek - September 19th, 2009

Hey!

Gestern war  die Party der Rudi MSS in der Krone(spitze aufgelegt, Gerrit ;) und heute geht’s mit allen vieren Elementen des Hip Hop im Kanal 70 weiter.

Ich freu‘ mich!

Gleich geh ich hin und schau mir die Sprayer an. Später gibt’s einen B-Boy Circle mit Leuten aus Worms, Frankenthal und Mannheim. Davor, dazwischen und währenddessen laufen Beats und Raps vom Feinsten.

Bis später! :)

iSync-Plugin für Samsumg SGH-E380

by Thomas Wieczorek - August 26th, 2009

Bei meinem Sony Ericsson K700i gibt der Akku langsam den Geist auf und auf ein iPhone muss ich noch bis zum dritten September warten, also habe ich das alte Samsung SGH-E380 meiner Mutter.
Auch wenn ich das K700i wegen Softwarefehlern und Abstürzen nicht wirklich mag, gebe ich ein Lob an Sony Ericsson, weil sie ein iSync-Plugin anbieten. Bei Samsung fand ich zum SGH-E380 nichts, also ab zu Google und im Mac Mini Forum fand ich die Lösung, um ein bestehendes Plugin zu anzupassen. Der Post ist gut und ausführlich mit Bildern beschrieben. Es gibt aber kein Paket zum Runterladen, also habe ich die beschriebenen Änderungen durchgeführt, alles komprimiert und hier hochgeladen: Samsung-E380.phoneplugin.zip

Die Installation davon ist recht einfach:

  1. Samsung-E380.phoneplugin.zip runterladen, Doppelklick auf die Zip-Datei und Mac OS X entpackt es
  2. Samsung-E380.phoneplugin kopieren
  3. Im Finder den Programme-Ordner öffnen
  4. Rechts-Klick auf iSync und „Paketinhalt zeigen“ anklicken

    "Paketinhalt anzeigen" bei Rechts-Klick im Finder

    "Paketinhalt zeigen" bei Rechts-Klick im Finder

  5. Den Ordner Contents/Plugins/ApplePhoneConduit.syncdevice/Contents/PlugIns öffnen und das Samsung-E380.phoneplugin einfügen
  6. iSync neustarten und das Handy sollte erkannt werden:

SGH-E380 in iSync

Viel Spaß beim Synchronisieren ;)

P.S.: Falls ich irgendwelche Rechte von Apple oder Samsung verletzt habe, meldet bitte Euch direkt an meine Email-Adresse.

Meine installierten WordPress Plugins

by Thomas Wieczorek - August 19th, 2009

Nach knapp 6 Wochen Existenz möchte ich die Plugins vorstellen, die mein Leben leichter machen:

Askimet

DER Spam-Vernichter Nummer 1! Neben diesem Blog hat Askimet auch meinen alten Foto-Blog immer vor Spam geschützt. Einmal hat er zwar Ham gegessen, aber einfach markieren und es läuft. Askimet ist bei jeder WordPress Installation dabei. Einfach bei WordPress.org anmelden, API-Key anfordern, in den Einstellungen eingeben und gut ist.

Contact Form 7

Vorgestern installiert und ruckzuck am Laufen. Ich musste nichts machen außer ein Tag in die Seite einzufügen und schon bin ich auch von hier erreichbar für jeden der Fragen hat.

Google(XML) Sitemaps Generator

Jeder redet von SEO, Suchmaschinen-Marketing und was auch immer, aber manche vergessen, dass es auch ohne „Profi“ klappt. Plugin installieren, bei Yahoo, Google und vielleicht anderen registrieren und schon werden die Suchmaschine automatisch bei jeder Änderung informiert. Gestern gespendet, heute berichtet. :)

WordPress.com Stats

Stats gibt eine Übersicht über Referrers, best-besuchte Artikel und vieles mehr. Es ist ähnlich wie Google Analytics, bietet aber mehr Details und man muss kein JavaScript einbinden, das manche(wie ich sowieso sperren).

Du!

Was fehlt mir noch?