John Resigs Vortrag über jQuery bei Tech4Africa


Gerade habe ich mir ein Video über einen Vortrag von John Resig, dem Hauptentwickler von jQuery, auf der Tech4Africa Konferenz angesehen und möchte den Vortrag schriftlich zusammenfassen.

Data Store

Inhalt des Vortrages waren neue und weniger bekannte jQuery Features wie z.B. dem jQuery data store. Einem Key/Value Speicher mit dem man Daten an DOM Elemente hängen kann. Dadurch lassen sich u.A. globale Variablen vermeiden und man erreicht eine deutlichere Zuordnung der Daten zum betroffenen Element. Durch die Verknüpfung mit dem Element muss man sich auch nicht um den Lebenszyklus des Speichers kümmern. Falls das Element aus dem DOM entfernt wird, gibt jQuery diesen Speicher automatisch frei.
Die Events von jQuery werden z.B. auf diese Weise gespeichert.

Event Delegation

Üblicherweise bindet man die Events an das jeweilige Element, welches den Event auslöst. Dies hat den Nachteil, das man z.B. bei Tabellenzellen recht viele Eventhandler hat. Ein häufiger auftretender Nachteil ist, daß man beim Hinzufügen eines neuen ähnlichen Elements daran denken muß, auch den Eventhandler hinzuzufügen.
Da die Events in der DOM Hierarchie nach oben weitergeleitet werden, wenn sie nicht behandelt werden, kann man die Events jedoch auch an ein übergeordnetes Element hängen, womit man die zuvor genannten Nachteile beseitigt. Dazu gibt es in jQuery die Funktionen live() und delegate(). Bei live() wird der Event vom Eventhandler am body Element behandelt. Bei delegate() lässt sich ein beliebiges Element angeben.

Namespaced Events

Hat man viele Events auf einer Seite wird es schwierig diese richtig zu behandlen z.B. wenn man eine bestimmte Art von Events entfernen möchte. Es kann leicht passieren, daß man dabei einen Event eines Plugins mit erwischt. Um dies zu vermeiden lassen sich die Events mittels Namen gruppieren.

HTML Templates

Zwei von Microsoft unterstützte Features zielen darauf ab den Umgang mit angezeigten Daten zu vereinfachen. Durch das Template Plugin, welches ab jQuery 1.5 in den jQuery Kern integriert werden soll, ist es möglich HTML Vorlagen mit Variablen zu definieren welche automatisch durch JSON Daten ersetzt werden können. Dies vereinfacht nicht nur das Einsetzen der Daten, es wird auch deutlicher was im Dokument ersetzt wird.
Da die Werte der Variablen im jQuery Data Store gespeichert werden lassen sich diese auch im Nachhinein auslesen und verändern.

Data Link

Ein weiteres Feature das in jQuery integriert werden soll ist das Verknüpfen der Formulardaten mit dem zugrundeliegenden Objekt. Das Plugin dazu findet man auf Github. Man braucht sich damit nicht mehr um die Synchronisation der Daten zwischen dem Formular und dem Javascript Objekt zu kümmern. Eine Änderung der Formulardaten ändert automatisch die Daten im Objekt und umgekehrt, d.h. auch die manuelle Initialisierung des Formulars mit Daten kann man sich sparen.

Abgeschlossen hat John Resig den Vortrag mit dem höchstwahrscheinlich bekannten Tipp den jQuery Code über ein Content Delivery Network einzubinden. Dabei erwähnte er das jQuery mit Googles Closure Compiler bearbeitet wird.

Verweise

Die Slides des Vortrags.
Das vorgestellte Spiel.
Der Source Code des Spiels.

Veröffentlicht unter Allgemein | Verschlagwortet mit , , | View Comments

Foreign Keys

Mein Chef ist Fan von Foreign Keys in Datenbanken, da er aus dem Business Intelligence/Datenbank-Bereich kommt. Dort greifen viele Programme auf die Datenbank zu, die unabhängig voneinander sind und keine gemeinsame Quelle für die Beziehungen der Tabellen untereinander haben.
Bei den üblichen Webanwendungen die auf Ruby On Rails, oder Hibernate basieren hat man jedoch nur eine Anwendung, die auf die Datenbank zugreift und dort sind auch die Relationen der Tabellen schön definiert, so das man eigentlich in der Datenbank ohne Foreign Keys auskommen kann.
Da sich mein Chef aber nicht überzeugen lies und ich muß zugeben, etwas zusätzliche Sicherheit bekommt man dadurch schon, verwende ich für Rails das Foreigner Plugin, mit dem sich in den Migrationsdateien auch die Foreign Keys anlegen lassen.
Für die Version 0.6.1 und Rails 3 Beta 4 ist jedoch ein Patch nötig, den ich heute auf Github veröffentlicht habe, da sich wohl etwas in der Startreihenfolge geändert hat.

Veröffentlicht unter Allgemein | Verschlagwortet mit , | View Comments

RichFaces – Ein Fertiggericht

Nissin Demae Ramen
Picture taken by Chevalierusa

Fertiggerichte sind sehr beliebt: Sie sind günstig, schnell und einfach zuzubereiten und schmecken immer gleich. Man kann also gut mit Fertiggerichten durchs Leben kommen, wenn man ein genügsamer Esser ist und sich nicht fürs Kochen interessiert.
Allerdings ernähren sich die wenigsten Menschen nur durch Fertiggerichte. Selbst die faulsten Leute werden irgenwann zumindest auch Essen gehen, denn der größte Nachteil ist, das es bestimmte Gerichte nicht als Fertiggericht gibt.
Ähnlich ist es mit RichFaces. Einer Sammlung von Komponenten für Java Server Faces, mit denen es möglich ist eine dynamischere Webanwendung zu erstellen, ohne direkt AJAX, oder JavaScript zu verwenden.
Auf den ersten Blick sieht das ja toll aus: Man fügt einfach eine Komponente, also ein paar beschreibende HTML Elemente in die Seite ein und braucht sich um die Innereien der Komponente nicht zu kümmern.
Wenn man das Verhalten der Komponente jedoch ändern möchte, oder sie aufgrund eines Fehlers nicht wie erwartet funktioniert, wird es schwierig und natürlich gibt es nicht für alle Wünsche die passenden RichFaces Komponenten, so daß man nur bei den einfachsten Anwendung ohne JavsScript auskommen wird.
Auch die Wiederverwertbarkeit ist eingeschränkt. RichFaces funktioniert halt nur mit Java.
Wenn man also eine schnelle Mahlzeit haben will kann man RichFaces verwenden. Leuten die sich mehr fürs Kochen interessieren empfehle ich jQuery.

Veröffentlicht unter Allgemein | Verschlagwortet mit , , | View Comments

Lohnt sich das Spielen von kleinen Pocket Pairs?

Ich habe begonnen No Limit Holdem zu spielen, nach einem Jahr Pause. Ein Anbieter hat mir freundlicherweise Geld zum Spielen zur Verfügung gestellt.
Noch nicht so ganz überzeugt bin ich von dem Starting Hands Chart von Pokerstrategy in dem Vorgegeben wird kleine Paare (22-44) zu limpen, oder überhaupt zu spielen.
Durch das Limpen vor dem Flop, bleibt der Pot klein, so das man wenig gewinnt, wenn man ein Set trifft und man hat zusätzlich die Gefahr von einem höheren Set dominiert zu werden.
Ein Beispiel dafür ist die folgende Hand, wobei mein Mitpieler hier recht freundlich war und den Pot klein gehalten hat, um mir nicht mehr Geld aus der Tasche zu ziehen.

Hand converted with Elephant 0.69 by PokerStrategy.com
Known players: (?)

vp$ip BBvsSteal ORL RaisePreflop
Position: Stack
AF W$SD WTS hands
Hero: $10,12
12 100 0 2
UTG2: $1,21
0,6 57 37 122
12 - 0 0
CO: $10,00
2,0 60 63 83

0,05/0,1 No-Limit Hold’em (8 handed)
Hand recorder used for this poker hand: Elephant 0.69 by www.pokerstrategy.com.

Preflop: Hero is SB with 2, 2. CO posts a blind of $0,10.
UTG2 raises to $0,20, 3 folds, CO calls $0,10, BU folds, Hero calls $0,15, BB folds.

Flop: ($0,70) 9, 9, 2 (3 players)
Hero checks, UTG2 checks, CO checks.

Turn: ($0,70) 7 (3 players)
Hero bets $0,33, UTG2 folds, CO calls $0,33.

River: ($1,36) 7 (2 players)
Hero bets $0,80, CO calls $0,80.

Final Pot: $2,96

Results follow (highlight to see):
Hero shows a full-house, deuces full of nines (2c 2s)
CO shows a full-house, sevens full of nines (7s Ts)

CO wins with a full-house, sevens full of nines (7s Ts)

Veröffentlicht unter Allgemein | Verschlagwortet mit | View Comments

Endlich Capistrano

Nach einem Jahr mit Ruby on Rails habe ich nun angefangen Capistrano zu benutzen. Das dies so lange gedauert hat, lag daran das die bisherigen Anwendungen unter Windows liefen.

Mit einem *nix Applikationsserver sollte man natürlich ohne Frage Capistrano nutzen, was das Ausrollen deutlich komfortabler und schneller macht.

Die folgende Konfigurationsdatei checkt die Anwendung aus einem Subversion Repository lokal aus und kopiert die Dateien zum Applikationsserver. Es wird weiterhin vorrausgesetzt, daß das Apache Modul Passenger auf dem Applikationsserver verwendet wird.

Möglichkeiten

  • Checkt Sourcecode aus Repositories aus
  • Kann Webserver neu starten (wird bei Passenger nicht benötigt)
  • Migriert Datenbanken
  • Alte Versionen werden gesichert und es kann ein Rollback gemacht werden
  • Es können unterschiedliche Applikations und Datenbankserver verwendet werden

Vorgehensweise

Installation

sudo gem install capistrano

Im Verzeichnis der Rails Anwendung: capify .

Konfigurationsdatei

config/deploy.rb:

Annahmen: Subversion, installation über Kopieren (scp) auf den Applikationsserver, Apache mit Passenger als Applikationsserver

—————————————————————————————

#############################################################
# Application
#############################################################

set :application, “ApplicationX”
set :deploy_to, “/var/www/#{application}”

#############################################################
# Settings
#############################################################

set :user_sudo, false

#############################################################
# Subversion
#############################################################

set :repository, “https://<pfad zum Repository>/trunk”
set :svn_username, ‘<benutzername>’
set :svn_password, ‘<passwort>”

#############################################################
# Servers
#############################################################

set :host, “<Adresse des Zielrechners>”
role :web, host
role :app, host
role :db, host, :primary => true

set :deploy_via, :copy # checkt lokal aus und kopiert die Daten
set :via, :scp

set :user, ‘<benutzername>’ # ssh benutzername
set :runner, ‘<ausführender benutzer>’

#############################################################
# Passenger
#############################################################

namespace :deploy do
desc “Restart Application”
task :restart do
run “touch #{current_path}/tmp/restart.txt”
end
desc “Start Application — not needed for Passenger”
task :start, :roles => :app do
# nothing — need to override default cap start task when using Passenger
end
end

—————————————————————————————

Capistrano Tasks

Prüfen ob Einstellungen richtig sind: cap deploy:check
Erstellen der Verzeichnisse auf dem Server: cap deploy:setup
Erstes Ausrollen: cap deploy:cold
Ausrollen: cap deploy
Datenbank Migration: cap deploy:migrations
Rollback: cap deploy:rollback

Bücher

Professionelle Webentwicklung mit Ruby on Rails 2 – ab Seite 489
Deploying Rails Applications – ab Seite 85

Veröffentlicht unter Allgemein | Verschlagwortet mit | View Comments

Rails, SQL Server und Daten vor 1970

Verwendet man den activerecord-sqlserver-adapter für Rails, um auf eine Microsoft SQL Server Datenbank zuzugreifen wird man feststellen, daß man keine Daten vor dem Jahr 1970 bekommt, weil der Adapter ein Time Objekt, statt DateTime verwendet.
Daher sollte man stattdessen den rails-sqlserver adapter verwenden:

gem uninstall activerecord-sqlserver-adapter
gem install rails-sqlserver-2000-2005-adapter -s http://gems.github.com

Wenn man dann noch die deutsche Ländereinstellung für SQL Server verwendet, muß man noch das :db Datumsformat ändern:

ActiveSupport::CoreExtensions::Time::Conversions::DATE_FORMATS.merge!(
   :db => '%Y-%d-%m %H:%M:%S'
)

Dies kann man z.B. in die Datei config/environment.rb einfügen.

Veröffentlicht unter Programming | Verschlagwortet mit , , | View Comments

Update von Windows 2000 auf Windows 7

Windows 7Als ich noch jünger war und mehr Zeit hatte, habe ich ziemliche viele Betriebssysteme ausprobiert. Seit einigen Jahren verwende ich nun Ubuntu/Kubuntu und wenn etwas damit nicht geht Windows 2000.
Einen zwingenden Grund Windows 2000 zu aktualisieren gab es nicht. Windows XP war kein Fortschritt und Vista erst recht nicht. Wozu sollte man dafür Geld ausgeben, wenn man es eh kaum nutzt und keinen Vorteil davon hat.

Die Nichtverfügbarkeit von Visual Studio Express 2008 für Windows 2000 brachte mich auf den Gedanken, daß Microsoft Beta Versionen von Windows 7 zum Download anbietet. Statt der Beta Version gab es zu dem Zeitpunkt schon den Release Candidate, den ich mir herunterlud und dieses Wochenende installierte.

Ich begann mit dem Versuch eines Updates von Windows 2000 auf Windows 7. Die DVD Installation klappte zwar, aber beim Start des Betriebssystems kam der Text “Dienste werden gestartet”, dann kam die Meldung, daß das ein Problem auftrat und das Setup nach einem Neustart weitergeführt wird. Leider ging es nicht weiter. Nach kurzem Überlegen, ob auf der Partition noch etwas wichtiges war, lies ich sie vor der Installation formatieren. Diesmal funktionierte die Installation dann.

Schade ist, daß man wie bei Windows üblich, noch Gerätetreiber installieren muß. Treiber für WLAN und Sound fehlten. Ich installierte zu erst die falschen WLAN Treiber, was zur Folge hatte, daß die Downloadrate bei unter 10KB/s lag, was auch seinen Reiz hatte, da man wieder mal mitbekommen hat wie es früher war, als man noch Analog Modem, oder ISDN benutzte.

Windows 7 macht, ein paar Stunden nach der Installation, einen guten Eindruck. Es sieht optisch gut aus, obwohl ich die Aero Effekte abstellen werde. Die Größe der Icons im Panel hat mir allerdings nicht gefallen. Wenn man die kleinen Icons verwendet sieht das Panel wieder so aus, wie in den vorigen Windows Versionen. Schön fand ich, daß nach der Installation nun nur noch das Papierkorb Icon auf dem Desktop zu sehen ist.
Am Auffälligsten war dann noch die Zip Behandlung. Unter Vista kam mir das sehr langsam vor, so daß man 7Zip benutzen musste. Bei Windows 7 funktioniert das Entpacken nun mit angenehmer Geschwindigkeit. Auch die Startgeschwindigkeit von Windows und der Programme ist recht kurz.

Außer das Windows 7 bunter ist und das mehr Programme laufen, gibt es zu Windows 2000 keine Vorteile. Durch die Möglichkeit Windows 7 eine recht lange Zeit kostenlos verwenden zu können, spricht allerdings auch wenig gegen ein Update. Es freut mich, daß Microsoft das Betriebssystem ähnlich wie bei Linux Distributionen zum kostenlosen Download anbietet. Wenn Windows 7 bei Erscheinen dann nicht mehr als 100 Euro kostet, ist es gut möglich daß ich es mir kaufe, ansonsten kann ich ja immer noch auf Windows 2000 zurückwechseln.

Veröffentlicht unter Allgemein | View Comments

ruby-dbi und Unicode

Gestern und heute habe ich einige Stunden damit verbracht nach einem Fehler zu suchen, der erst auftrat, als eine bei einer Rails Anwendung die Datenbank von MySQL auf SQL Server gändert wurde.

Beim Auslesen eines Passwordhashs aus einem Zeichenfeld wurde von Rails statt dem letzten Zeichen ein Null Charakter zurückgegeben. Dies geschah nur, wenn die Länge des Strings der Länge der Spalte entstprach, hier waren es 40 Zeichen. Vergrößerte man die Spalte auf 41 kam der richtige Wert zurück.

Es konnte schnell ausgeschlossen werden, daß es an der Datenbank, oder an der ODBC Einstellung lag, da mit anderen Anwendungen der richtige Inhalt zurückkam. Die Ursache lag also zwischen der Anwendung und der ODBC Verbindung. Dies gab mir die Gelegenheit die Komponenten dazwischen und ruby-debug genauer kennenzulernen, also den activerecord-sqlserver adapter, ruby-dbi und ruby-odbc. Leider konnte ich nichts finden, da der Debugger trotz Step into nicht in eine Funktion hineinspang. Nach einer Weile wusste ich auch warum. Ich lud mir den Quellcode zu ruby-odbc herunter und erkannte, daß es eine Funktion einer Binärlibrary war. Die auch noch zu debuggen war mir zu viel, es war auch schon kurz vor Feierabend. Ich schrieb dem Autor von ruby-odbc, da ich annahm, daß das Phänomen möglicherweise schon bekannt ist.

Da mir der Autor abends schon antwortete konnte ich am nächsten Tag gleich sinnvoll weitermachen. Er schlug vor die ODBC Daten zu protokollieren. Das Tracen klappte nicht sofort, weil komischerweise nur die SQLs von Migrationen getraced wurden, nicht die SQLs der Anwendung, aber das Log brachte mich der Lösug schon viel näher. Dort sah ich das die von ruby verwendete Feldlänge nur die Hälfte der Länge der Abfrage von MS Access war. ruby-odbc sah also nicht, daß dies ein Unicode Feld war.

Ich sah mir dann den Code der odbc Bibliothek an und mir fielen #ifdef unicode Zeilen auf, woraus ich schloß, das Unicode eine Konfigurationsmöglichkeit sein muß. Daraufhin tat ich das, was man eigentlich als erstes machen sollte. Ich las die README Datei in der tatsächlich die Lösung stand:

if $KCODE == "UTF8" then
  require 'odbc_utf8'
else
  require 'odbc'
end

Dies fügte ich in dbd/odbc.rb was auch in diesem Patch zu finden ist.

Veröffentlicht unter Programming | Verschlagwortet mit , , | View Comments

Update von Ubuntu 8.10 auf 9.04

Gestern aktualisierte ich mein OS auf Ubuntu 9.04. Die 6.Alphaversion schien mir sicher genug zu sein. Beim Update trat ein Fehler im Paket checkbox auf, welcher verhinderte das weitere Pakete über apt-get installiert werden konnten. U.A. konnte deswegen die zum Kernel passenden Nvidia Treiber nicht installiert werden, wodurch X nur mit dem vorherigen Kernel funktionierte.
Nachdem ich das Paket hwtest und ubuntu-desktop, keine Angst der Gnome Desktop wird nicht mit deinstalliert, über “dpkg –remove ..” entfernt habe und danach “apt-get -f install” aufgerufen habe, war die Paketverwaltung wieder in Ordnung und ich konnte die restlichen Pakete installieren.
Bis auf eine leicht größere Schrift ist mir bei Ubuntu 9.04 allerdings nichts Neues aufgefallen.

Reblog this post [with Zemanta]
Veröffentlicht unter Allgemein | Verschlagwortet mit , | View Comments

Lokalisierung nach Update auf Rails 2.3

Nach einem Update von Rails 2.2.2 auf Rails 2.3 funktionierte das Localization Plugin simple_localization, welches ich hauptsächlich wegen der Fehlermeldungen verwendet habe, leider aufgrund eines Fehlers nicht mehr. Dies brachte mich dazu, mich mit den Lokalisierungsfunktionen von Rails zu beschäftigen.

Die Hinweise gelten hauptsächlich für ein Update einer bestehenden Anwendung. Bei neuen Projekten werden die genannten Änderungen teilweise von Rails gemacht.

Die Dateien mit den Übersetzungen kommen nach config/locales und werden automatisch geladen. Daher fügt man folgende zwei Zeilen in die environment.rb im Rails::Initializer Block ein:

# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
config.i18n.default_locale = :de

Nun erstellt man das Verzeichnis “config/locales” und darin die Datei de.yml

Mögliche Strings zum Übersetzen findet man unter dem Ruby gems Verzeichnis, oder durch Ausgabe des Inhalts von config.i18n.load_path

Allerdings wundert es mich, daß ich noch keine fertigen Übersetzungen gefunden habe. Wer die Fehlermeldungen nicht auch selbst übersetzen möchte, kann meine de.yml als Vorlage verwenden.

Wer genaueres über die Lokalisierung erfahren möchte kann sich den Guide zur Rails Internationalization API durchlesen.

Reblog this post [with Zemanta]
Veröffentlicht unter Programming | Verschlagwortet mit , | View Comments