Neues Referenzprojekt online

local.ch bietet national Dienste im Bereich der Suche und Auffindbarkeit von Firmen und Restaurants im Web an. Neben Einträgen unter www.local.ch erstellt local.ch auch Webseiten für lokale KMUs wie zum Beispiel Restaurants und Coiffeure.

Diese Webseiten können neu über ein Tool zur Verkaufsunterstützung visualisiert werden. 

Details zum Projekt sind auf unserer Webseite und in der Case Study als PDF

Baruco 2014

Baruco 2014

Simplificator an der Baruco Konferenz

Nachdem wir gestern Vorträge über die internas von ActiveRecord, Type Safety und Release Responsible gehört haben, geht es heute mit Optimization und Services weiter.

Heute gibt es keine Lightning Tasks dafür aber etwas das sich “Dancing with Robots” nennt. Wir sind gespannt.

Büro geschlossen am 8. August 2014

Wir ziehen um! 

Am 8. August 2014 ziehen wir um in den 3. Stock. Unser Büro bleibt an diesem Tag geschlossen, unsere Mitarbeiter sind mehrheitlich im Homeoffice tätig und über Mail oder Skype erreichbar. Wir freuen uns über ein baldiges Wiedersehen ab dem 11. August in den neuen Räumlichkeiten. 

Von einer GmbH zur AG

Seit dem 7. Juli ist die Umwandlung der Simplificator GmbH zur Simplificator AG vollzogen.

Für unsere Kunden ändert sich nichts, die AG ist Rechtsnachfolger der GmbH.

Finding column names using DBI

A useful snippet, should you ever require to get the column names of a table that you are connecting through DBI:

DBI.connect(something’) do |con|
  con.execute(“SELECT * FROM FOO”).each do |row|
    p row.inspect
    p row.column_names
  end
end

VCR Tests mit Custom matcher

VCR ist ein Library um Tests zu schreiben welche HTTP Requests auf externe Services machen.

VCR nimmt die Anfragen an den Service auf und spielt die Antworten bei bedarf wieder ab. Somit können Tests beschleunigt und unabhängig von externen Diensten gemacht werden.

Um zu bestimmen ob eine aufgenommene Antwort wieder abgespielt werden soll, greift VCR auf Request Matchers zurück. Nebst diversen bereits vorhandenen Matchern kann VCR um eigene Matchers erweitert werden.

Ein Matcher ist ein “callable” welches zwei Argumente nimmt (zwei Requests welche verglichen werden müssen) und ein Boolean wert zurückgibt.

do |a, b|
  true
end

Ein einfacher (und nutzloser) Matcher.

Man kann Custom Matcher einsetzen um z.B. bestimmte Parameter zu ignorieren oder Host Name basiertes loadbalancing (api1.foo.com, api2.foo.com…) abzudecken.

MS Access und Ruby?

Auch das geht.

Während MS Access sicher nicht zu unseren favorisierten Tools gehört um Daten zu verarbeiten, so kann es trotzdem vorkommen, dass unsere Kunden Applikationen auf Access Basis betreiben.

Access kann diverse Datenquellen nutzen unter anderem Datenbanken welche direkt in der MDB Datei eingebettet sind.

Sollen nun solche Daten von aussen bearbeitet, ergänzt oder gelöscht werden, so kann dies ohne grossen Aufwand via SQL erfolgen. Dazu muss nur eine DSN eingerichtet (die geübten Entwickler können das natürlich auch auf Linux versuchen, z.B. mit libmdbodbc, wir haben das ganze auf einem Windows Server gemacht) und, schon etwas komplizierter, ruby mit odbc zum laufen bekommen werden.

Aus historischen Gründen müssen wir Ruby 1.8.7 verwenden, odbc sollte durch folgende Schritte zum laufen bekommen werden

  1. Download http://www.ch-werner.de/rubyodbc/i386-msvcrt-ruby-odbc.zip
  2. Kopiere den Inhalt des Zipfiles nach C:\Programs\Ruby187\lib\ruby\1.8\i386-mingw32 (und ja: es macht weniger Probleme wenn Ruby in einem Verzeichnis ohne Spaces installiert ist)
  3. gem install dbi
  4. gem install dbd-odbc
  5. Das wars.

Testen:

in irb

require ‘rubygems’
require ‘dbi’

username = nil # depends on the DSN
password = nil # depends on the DSN

DBI.connect(‘dbi:odbc:DSN_NAME’, username, password) do |connection|

  res = connection.execute(“SELECT * FROM SOMETABLE”)
  res.each do |row|
    ….
  end
  res.finish

end

Natürlich fängt der Spass hier erst an, in unserem Use-Case sind noch CSV Import von verschlüsselten Attachments und zwei weitere Datenbanken dabei. Stundenweise Spass mit falsch encodierten Dateien und SQL Server sind garantiert:-)

Natürlich würde ich persönlich gerne die ganze Access Applikation als Webapplikation neu bauen. Auf aktuellen Technologien aufsetzend und hübsch gestaltet. Aber der Aufwand würde sich aktuell nicht rechtfertigen lassen und dann ist die Wahl via ODBC auf eine Access DB zuzugreifen auch im Sinne des Kunden.

Staging Umgebung auf Heroku erstellen

Für einige Kunden verwenden wir das Rails Hosting von heroku. Es bietet sich dann an, auch die staging Umgebung auf heroku zu betreiben damit keine wesentlichen Unterschiede zur produktions Umgebung bestehen.

Ein paar Schritte reichen dazu:

  1. Staging App erstellen
  2. Add-Ons hinzufügen, bei beiden Umgebungen mindestens pgbackups installieren
  3. Umgebung setzen: 
    heroku config:set RACK_ENV=staging RAILS_ENV=staging —app name-der-staging-app
  4. DB_URL herausfinden (z.B. HEROKU_POSTGRESQL_RED_URL): heroku config —app name-der-staging-app
  5. Datenbank von Produktion nach Staging kopieren: 
    heroku pgbackups:restore <DB_URL> -a name-der-staging-app `heroku pgbackups:url -a name-der-production-app`
  6. Evtl. S3 Buckets Kopieren:
    s3cmd sync —skip-existing —recursive s3://source-bucket-name s3://target-bucket-name
    (vorgängig s3cmd installieren)
  7. Evtl. S3 Permissions im neuen Bucket anpassen.
  8. Fertig