Skip to content

Attribute or Property?

2012 May 16
tags: ,
by meier

Sorry, this entry is only available in Deutsch.

Rails ActiveRecord: count, length or size?

2012 March 25
tags: ,
by meier

Die objektorientierte Datenbankschnittstelle “ActiveRecord” bietet gleich drei verschiedene Methoden zum Bestimmen der Anzahl: count(), length() und size().

Alle drei Methoden liefern das gleiche Ergebnis. Was nehmen wir wann? Warum ist es überhaupt wichtig? Nimmt man die falsche Methode, dann erzeugt unsere Ruby-on-Rails-Anwendung überflüssige Datenbankabfragen oder braucht mehr Speicher als eigentlich nötig. Die Anwendung skaliert dann schlechter. Um mir die Unterschiede zwischen den Methoden leichter zu merken habe ich folgendes Schema erstellt.

read more…

(Deutsch) LwUIT 1.5 erste Erfahrungen

2011 October 9
tags: , ,
by meier

Sorry, this entry is only available in Deutsch.

Ilias Skins

2011 July 15
tags: ,
by meier

Custom adaptation of a web-based learning management system

(Translation in progress)

 Ilias is a so-called learning management system (LMS), ie a system for web-based education programs. It is a very comprehensive system. It integrates not only the content in online courses but also communication capabilities such as forums, chat and mail.

 When an organization like a company or a school uses such a system, they usually have the desire to change the design of the user interface.

Reasons for this include:

  1. Differentiation: You don’t want it your system look like all other systems.
  2. You want to customize it to your own Coperate Design, this includes the company logo and color scheme.
  3. Specific needs of users: In our project we want to simplify the usage by ommiting rarely used options.
  4. Regulations to be followed. Words and terms may be specified differently, or there may be ergonomics guidelines for the font size.

read more…

(Deutsch) Eins plus Zwei

2010 December 30
by meier

Sorry, this entry is only available in Deutsch.

Multilingual Websites with Ruby on Rails (3)

2010 January 8
by meier

Part 3 – Quality Assurence

Texte gehören zu den Teilen einer Anwendung, die häufig geändert werden. Wenn dann noch externe Übersetzer im Spiel sind, kann es leicht zu fehlenden Übersetzungen kommen

Wir möchten deshalb automatisch testen, dass es zu allen Texten in Sprache A auch Übersetzungen in Sprache B vorhanden sind. Ein solcher Test allein hilft schon sehr, und sollte ja nicht so schwierig sein.

Leider gibt es dabei eine Überraschung: in der Internationalisierung-API findet sich zur Zeit (Rails 2.3.5) keine Möglichkeit, alle Schlüssel aufzuzählen (sprich iterieren). Man muss also offenbar die Yaml-Dateien selbst einlesen, um an alle Schlüssel zu kommen. Unserer Test ist dabei leider abhängig von der konkreten Art der Datenhaltung.

texts_hash = YAML::load(IO.read('config/locales/de.yml'))

Wie haben nun einen rekursiven Hash. Um alle Schlüssel zu überprüfen, extrahieren wie sie mit einer gesonderten Funktion. Diese Funktion ist einfach rekursiv aufgebaut.

def deep_hash_key(hash, prefix)
  hash.keys.sort.collect{|key2|
    val = hash[key2]
    newprefix = prefix.nil? ? key2 : "#{prefix}.#{key2}"
    if val.is_a? Hash
     deep_hash_key(val, newprefix)
    else
      newprefix
    end
  }
end

Wollen wir jetzt die Übersetzungen für alle Schlüssel prüfen lauert die Zweite Falle: Wenn die Übersetzung eine Variableninterpolation enthält, erhalten wir einen Fehler beim Aufrufen der translate() Methode ohne den passenden Hash. Offenbar liefert uns die API auch keinen Zugriff auf den String ohne Interpolierung. Da uns in diesen Test nur die Existenz einer Übersetzung interessiert, und nicht ihr konkreter Wert, fangen wir die Exception “MissingInterpolationArgument” einfach auf.

Für eine deutsche Anwendung mit Übersetzungen in Englisch und Französisch sieht dann der Test so aus:

def test_all_texts_should_exists
  texts_hash = YAML::load(IO.read('config/locales/de.yml'))
  de_keys = deep_hash_key(texts_hash['de'], nil).flatten
  for lang in ['de', 'fr', 'en']
    I18n::locale = lang
    for key in de_keys
      begin
        val = I18n.translate(key, :default => nil, :raise => true)
      rescue I18n::MissingTranslationData
        val = nil
      rescue I18n::MissingInterpolationArgument
        val = true  # there was a value, only an argument is missing
      end
      assert_not_nil(val, "key missing for locale #{lang}: #{key}")
    end
  end
end

Wenn jetzt eine Übersetzung fehlt, liefert der Test eine Fehlermeldung der Art:

test_all_texts_should_exists(LocalisationTest): key missing for locale en: users.edit.title

Die fehlende Übersetzung können wir dann ergänzen, bevor wir eine neue Version der Anwendung veröffentlichen.

(Deutsch) Classics reloaded: Das Assert-Makro von C

2009 September 20
by meier

Sorry, this entry is only available in Deutsch.

Switch to our mobile site