Just because it's:

Archive for the ‘Ruby’ Category

Ein Hack für MySQL um Umlaute zu konvertieren

Friday, July 25th, 2008

Noch immer konnte sich die Welt nicht auf einen gemeinsamen Zeichensatz einigen. Das wird wohl auch noch eine ganze Weile dauern. Falls es überhaupt nochmal dazu kommen sollte. Bis dahin werden wir alle immer mal wieder Spass mit dem konvertieren von Zeichensatz A nach Zeichensatz B haben.

Just beim Upgrade dieses Blogs, bin ich schon wieder in die Zeichensatzfalle getappt. Um mir mittelfristig die Nerven zu schonen und akut so schnell wie Möglich die häßlichen Zeichen aus der Datenbank zu schmeissen, habe ich ein kleines Ruby Skript geschrieben, dass mir die Umlaute bestimmter Tabellenfelder, durch HTML Entities ersetzt.

Einen Preis gewinne ich damit nicht, aber es tut seinen Job. Hier das Skript unverhüllt und häßlich wie es ist. Die Konfiguration sollte einfach nachzuvollziehen sein. Ansonsten einfach mal melden, gell?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/usr/bin/ruby -w
# Konvertiere Umlaute der 
# Textfelder verschiedener MySQL 
# Tabellen
 
require "mysql"
 
@umlauts = {
 'ü' => 'ü',
 'ä' => 'ä',
 'ö' => 'ö',
 'Ü' => 'Ü',
 'Ä' => 'Ä',
 'Ö' => 'Ö',
 'ß' => 'ß',
 "'" => '''
}
 
# Hier beliebige Eintraege im Format 
# :tabellen_name => [:id_feld, :feld_1, :feld_2, :feld_n]
# ergaenzen
 
@targets = {
  :wp_comments => [:comment_id, :comment_content],
  :wp_posts => [:id, :post_content, :post_title]
}
 
begin
  dbh = Mysql.real_connect("hostname", "username", "password", "db_name")
 
  @targets.each_pair do |table, fields|
    query = "SELECT #{fields.join(',')} FROM #{table}"
    puts query
    res = dbh.query(query)
    while row = res.fetch_row do
      values = {}
      row.each_index do |i|
        if i > 0
          values[fields[i]] = row[i];
          @umlauts.each_pair do |umlaut,entity|
            values[fields[i]].gsub!(umlaut,entity)
          end
        end
      end
      blah = []
      values.each_pair do |key,value|
        blah << "#{key}='#{value}'"
      end
 
      update_query = "UPDATE #{table} SET #{blah.join(',')} WHERE #{fields[0]}=#{row[0]}"
      res2 = dbh.query(update_query)
      puts update_query
    end
  end
 
rescue Mysql::Error => e
  puts "Error code: #{e.errno}"
  puts "Error message: #{e.error}"
  puts "Error SQLSTATE: #{e.sqlstate}" if e.respond_to?("sqlstate")
ensure
  dbh.close if dbh
end

6 Gründe für Ruby

Monday, March 5th, 2007

1. Blöcke und Iteratoren

Die meisten Sprachen setzen entweder auf traditionelle Zähl-Schleifen und Arrays oder einer Kombination aus einem Iterator-Objekt und einer Schleife. Ruby hingegen macht verstärkt Gebrauch von sogenannten Blöcken, wenn es um die Iteration von Feld-Datentypen geht. Das bedeuten im Detail, dass die Instanz eine Iterator-Methode anbietet, in die ein Codeblock hineingereicht werden kann. Im Vergleich zu Java sieht das zum Beispiel wie folgt aus:

1
2
3
4
5
6
7
8
//Iterator in Java
List a = new ArrayList();
Iterator it = a.iterator();
Object o = null;
while(it.hasNext()){
    o = it.next();
    o.doStuff();
}
1
2
3
4
5
#Iterator in Ruby
a = []
a.each |o|
    o.doStuff()
end

Der Grund warum Blöcke funktionieren, liegt bei dem Schlüsselwort yield. Es sorgt bei jedem Aufruf dafür, dass der Codeblock einmal ausgeführt wird. Kombiniert man yield Beispielsweise mit einer Schleife, kann man so sehr einfach einen “universalen” Iterator implementieren.

1
2
3
4
5
6
def do_the_trick
    4.times do |i|
        yield i+1
    end
end
do_the_trick { |i| puts "#{i}. hello world!" }

In dem obigen Beispiel führt die Methode do_the_trick fünf mal den am Aufruf nebenstehenden Block aus. Also wird “1. hello world” bis “4. hello world” ausgegeben. yield kann mit und ohne Parameter aufgerufen werden. Die Parameter stehen in entsprechender Reihenfolge im Code-Block zur Verfügung.

2. Operator Overloading

Ein Feature das ich Jahrelang nicht vermisst und dafür jetzt umso lieber gewonnen habe. Ruby hat eine ganze Reihe Standard-Operatoren, die über die üblichen Methodendefinition implementiert werden können (z.B. def ==(obj)). Folgende Operatoren stehen einem zur Verfügung: ==, >, <, >=, <=, <=>, ===, +, -, *, /, %, **, <<, >>, ~, +@, -@, [], []=, .., |, ^, &, =~

Selbstverständlich wird man viele dieser Operatoren nicht im Tagesgeschäft unterbringen können. Daher hier eine kurze Liste der vermeindlich nützlichsten Operatoren:

  • def == (obj) # Gleicheit: Prüft die aktuelle Instanz auf Gleicheit mit der hineingereichten. Kann true bei Gleicheit oder false bei Unterschied liefern.
  • def <=> (obj) # Wertprobe: Prüft die aktuelle Instanz gegen die hineingereichte auf Reihenfolge. Dieser Operator wird Beispielsweise von Array.sort genutzt, um die Elemente eines Arrays sortieren zu können. Ist die eigene Instanz höherwertig als die hineingereichte wird -1 zurückgeliefert. Ist die Wertigkeit beider Instanzen gleich, soll die Methode 0 wiedergeben. Ist das andere Objekt höherwertig, hat die Methode den Wert 1 zu liefern. Auf diese Art, können auch komplexe Klassen auf einfachem Wege und zentralisiert für die Sortierung vorbereitet werden.
  • def << (obj) # Input: Bei Objekten des Typs Array wird der << Operator genutzt, um neue Elemente an das Ende des Arrays anzufügen.
  • [] (index) # Zugriff auf Skalar: Bereits bekannt in Verbindung mit Array und/oder Hash dient dieser Operator zur Referenzierung von in der Instanz gekapselten Objekten. Passend hierzu gibt es ebenfalls den []= Operator, der allerdings zwei Argumente entgegen nimmt. Das erste als Index/Schnlüssel und den Zweiten als Wert/Objekt.

3. Sprechende Syntax

Die Syntax einer Programmiersprache ist in erster Linie vor allem eines: Geschmackssache. Vor nicht allzu langer Zeit, habe ich die C Syntax noch für die Symphatischste gehalten. Nach einiger Zeit Ruby Programmierung, vermisse ich Curly Brace und Semikolon nicht wirklich. Die Schlüsselwörter sind praktisch zu lesen und die Syntax dennoch nicht zu umgangsprachlich wie Beispielsweise in Cobol. Aussederm bricht man sich nicht ständig die Finger bei dem Versuch Alt+Gr+Any-Key mit einer Hand zu drücken.

4. YARV: Yet Another Ruby VM

Lange Zeit war Ruby eine reine Interpreter-Sprache. Mit dem neuen Ruby 2.0 wird von Haus aus eine VM mitgeliefert, die dem Ganzen einen enormen Performance-Gewinn verleiht. Antonio Cangiano hat in seinem Blog Ergebnisse seines “Ruby Implementation Shootout” Experiments veröffentlicht, und dabei festgestellt, dass Ruby mit YARV bis zu 71% schneller performed, als Ruby 1.8.5 alleine. In konkreten Zahlen bedeutet das, dort wo Ruby1.85 im Schnitt 10,59 Sekunden für die Ausführung der Testszenarien gebraucht hat, begnügt sich Ruby1.9 inklusive YARV mit 3,05 Sekunden. Damit wird dem Argumente, dass Ruby zu langsam sei allmälich der Wind aus den Segeln genommen.

5. Ruby On Rails

Das Webframework von 37Signals sorgte in den letzten Jahren für viel Furore in der Ruby Community. Über die Beliebtheit von Rails gibt es viele Meinungen. Meiner Meinung nach ist es definitiv ein großartiges Framework! Viele Leute sind von den diversen Bling-Bling Web2.0 features wie der Scriptalicious Intergration und Plugins begeistert (ungefähr genauso viele behaupten das Gegenteil). Die waren Stärken liegen meiner Meinung nach allerdings bei den Kernfunktionalitäten:

  • Die strickte Model, View Controller Architektur.
  • Relationelles Datenbank Mapping mit ActiveRecord. Inklusive der Model-Filter für unterschiedlichste Beziehungsmodelle.
  • Datenbank unabhängige Migration Scripts und Data Fixtures.
  • Unit Tests!

6. Getters and setters the easy way

In der Regel ist es in der Objektorientierung üblich, für jedes Attribut einer Klasse jeweils eine Get- und Set-Methode zu definieren. Das ist meistens ziemlich nervig, da es sich hierbei um das ewig gleiche stupiede Stück Programmcode handelt. Matz kannte teilte diese Ansicht anscheinend, und entwarf für Ruby einen sogenannten Attribute-Accessor. Es gibt diesen in drei Ausführungen:

  1. lesend (attr_reader)
  2. schreibend (attr_writer)
  3. lesend und schreibend (attr_accessor)

Um Attribute-Accessor zu nutzen werden diese z.B. in den Kopfbereich, kurz nach der Klassendefinition eingebunden.

1
2
3
4
5
6
7
8
class MyClass
    attr_reader :nur_lesen
    attr_writer :nur_schreiben
    attr_accessor :lesen_und_schreiben
    @nur_lesen = 1
    @nur_schreiben = 2
    @lesen_und_schreiben = 3
end

Treffen der Steinweisen in Dortmund

Thursday, December 7th, 2006

Hingehört und aufgepasst! Schon zur Zeit der Alchemisten war der Stein der Weisen (oder auch Roter Löwe genannt) ein heiß umworbenes Artefakt. Er vermochte unedle Metalle in Gold zu verwandeln und galt vieler Orts ebenfalls als Universalmedizin.

Selbstverständlich wissen wir heutzutage nahezu alle, dass es den Stein der Weisen, so wie er in Überlieferungen und Märchen Erwähnung findet, schlicht und ergreifend nicht gibt. Dennoch halte ich diese Einleitung als passenden Opener für folgende Aktion.

Seit nun gut 2 Jahren durchlebt die Programmiersprache Ruby einen regelrechten Hype. Nicht zu letzt aufgrund des allseits bekannten Ruby On Rails Frameworks. Viele Entwickler und Unternehmen erhoffen sich aufgrund dieser neuen Technologie, ihren persönlichen Stein der Weisen gefunden zu haben und somit edle Produkte erschaffen zu können. Unabhängig davon was die Wirtschaft in Ruby zu sehen meint, gibt es eine relativ kleine und dennoch aktive deutsche Ruby Community. In vielen deutschen Großstädten haben sich bereits Ruby Usergroups organisiert — tendenz steigend.

Dortmund als Stadt im Zentrum des Ruhrgebiets, hat “traditionell” eine stark ausgeprägte UG Kultur. Ich möchte an diese “Tradition” anschließen und einen Kreis aus Ruby interessierten aus Dortmund und Umgebung zusammenrufen. Zunächst gilt es allerdings festzustellen, ob überhaupt Interesse an einem lokalen Rubyisten Treffen besteht. Vorgestellt habe ich mir, ersteinmal ein einmaliges Treffen zu organisieren und zu schauen wie die das Feedback so ist. Anschließend oder während dessen kann man auf darüber Diskutieren, ob sich das aufsetzen einer Mailingliste oder eines Forums lohnen würde.

Also, ich warte auf eure Rückmeldung in Form einer Mail an steinweise[menschen kennen das]abakia[und das auch]de oder eines Kommentars auf diesen Eintrag.