Wer A Sagt

Tägliche Beobachtungen

29. Mai 2011
von Rainer
Keine Kommentare

Gems für Ruby On Rails 3

SemipreciousBei Ruby On Rails ist es schwierig den Überblick über die gerade aktuellen Gems zu behalten. Auf dem intridea Blog kann man sich den verschaffen, zumindest für die nächsten Monate.
Dort werden die gebräuchlichsten für Rails 3 aufgelistet.
Wenn man sich die Gems näher anschauen möchte, existieren für die meisten auch ein Screencast auf Railscasts.

29. Mai 2011
von Rainer
Keine Kommentare

RailsConf 2011: Eric Ries, “Lessons Learned”

Zwei Dinge sind mir aus diesem Vortrag im Gedächtnis geblieben:

  • Eric Ries möchte das man sein Buch vorbestellt, das in der zweiten Jahreshälfte erscheinen soll.
  • Bevor man ein Produkt entwickelt sollte man schauen, ob überhaupt Bedarf dafür da ist.

Der zweite Punkt war für mich jetzt der interessantere. Denn sofern man nicht etwas nur für sich selber entwickelt und möchte das auch andere das Produkt  nutzen sollte man sich darum kümmern, bevor man mit dem Programmieren anfängt.

Eric Ries beschreibt, daß er der Entwicklung eines Plugins für Instant Messenger beteiligt war. Die Entwicklung hat einige Monate gedauert. Es wurden zahlreiche Messenger unterstützt. Das Produkt hatte zahlreiche Fehler, aber man hat es dann trotzdem veröffentlicht. Glücklicherweise blieben die Bugs unentdeckt, denn das Plugin wurde wohl von niemandem genutzt. Er stellte dabei die Frage, ob man nicht das Gleiche Ergebnis erziehlen hätte können, wenn sie nur einen Messenger unterstützt hätten, oder gar nur eine Seite erstellt hätten, mit einem Downloadlink, der auf eine nichtexistierende Datei gezeigt hätte.

Gerade im Web ist es ziemlich herauszufinden, ob es Interesse für etwas gibt. Ganz am Anfang der Kette stehen die Keywords. Durch das Google Keywords Tool, oder durch Software wie Market Samurai kann man schnell sehen, woran Leute interessiert sind.

Erstellt man dann auch noch eine eigene Website, dann kann man durch die Nutzung schnell sehen, wie das Produkt ankommen wird und wenn die Besucher dann auch noch ihre Email Adresse angeben können, um benachrichtigt zu werden, wenn das Produkt erscheint, hat man gleich die ersten potentiellen Kunden.

4. Januar 2011
von Rainer
Keine Kommentare

Ändern des Zeilenumbruchs für alle Dateien in einem Verzeichnis

Nachdem ich ein .vim Verzeichnis von einem Git Repository auschecke und für VIM verwenden möchte, beschwert sich VIM über die Zeilenumbruchszeichen (CRLF).
Mit den Befehlen “find” und “dos2unix” kann dies folgendermaßen behoben werden:

find . -type f |xargs dos2unix

Dazu muß das Paket dos2unix installiert sein.
Interessieren würde mich, ob man dies auch gleich beim Git checkout machen kann.

10. September 2010
von Rainer
Keine Kommentare

Anmeldung bei Posterous

Nachdem Ed "The hottest man in the universe" Dale ständig von Posterous redet in The Challenge redet und ich einige Folgen ausgelassen habe, habe ich mir heute die Videos zu Posterous angesehen und mich angemeldet.
Das geniale an Posterous ist die Möglichkeit durch eine Email eine Meldung bei Twitter, Facebook und Blogs zu veröffentlichen.
Nur schade, das man durch die Email keine Möglichkeit der Vorschau hat.

20. August 2010
von Rainer
Keine Kommentare

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.

8. Juli 2010
von Rainer
Keine Kommentare

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.

6. Juli 2010
von Rainer
Keine Kommentare

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.

1. Juni 2010
von Rainer
Keine Kommentare

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)

23. Juli 2009
von Rainer
Keine Kommentare

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

20. Mai 2009
von Rainer
Keine Kommentare

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.

Social Widgets powered by AB-WebLog.com.