Dipl.-Ing. Peter Ehrenberg [dipe]

Web- und Datenbankanwendungen

  • Soll ich das in meinen Kalender schreiben?
  • Soll ich nachschauen, ob ich nach der Arbeit noch Pläne habe, bevor ich verspreche, länger zu bleiben?
  • Soll ich diese Konfigurationsdatei im Source-Repository ablegen?
  • Ist jetzt ein guter Zeitpunkt, um die Datei an der ich gerade arbeite, zu sichern?
  • ist es tatsächlich richtig, dass der Lokomotivführer nicht an einem Lenkrad drehen muss, um an einer Weiche abzubiegen?
  • Soll ich das auf meine Todo-Liste schreiben?
  • Soll ich in meinen Kalender schauen, bevor ich den Termin bestätige?
  • Soll ich das für meine Kollegen dokumentieren?
  • Soll ich das automatisieren?
  • Soll ich das jetzt noch am Freitag ändern oder lieber auf Montag verschieben?

Zur Integration von Web-Anwendungen stellen sich IFrames immer noch als ein adäquates Mittel dar, denn sie sind äußerst einfach anzuwenden und stellen an die beteiligten Systeme denkbar geringe Anforderungen.

Ein Nachteil von IFrames ist aber, dass sie keine dynamische Höhen- oder Breitenanpassung auf ihren Inhalt mittels CSS erlauben. Hierfür ist man dann auf den Einsatz von Javascript angewiesen.

Ganz besonders knifflig ist dass dann, wenn das IFrame-Dokument (ich meine das, welches innerhalb des IFrames zur Darstellung kommt) HTTPS erfordert, das äußere Dokument (das Dokument mit dem IFrame-Element) hingegen HTTP benutzt. In diesem Fall hat keines der beteiligten Dokumente Zugriff auf das DOM des anderen, so dass eine direkte Javascript-Manipulation hier nicht möglich ist. Das selbe gilt auch für den Fall, dass die Dokumente aus unterschiedlichen, sich nicht gegenseitig vertrauenden Domains stammen.

Lösung: Ein HTTP-Call-Back-Request. Wie das geht, steht im Artikel...

Ein Freund hat mich auf Wicket aufmerksam gemacht. Wicket ist ein Java-basierter Web-Applikations-Framework, deren Autoren (immer noch) den Traum komponentenbasierter Software-Architektur träumen. Aus meiner Sicht ein Alptraum.

Wiederverwendbare Software zu schaffen ist eine der ganz schwierigen Aufgaben. Wiederverwendbare high-level Software-Komponenten zu schaffen ist noch schwieriger [1].

Bei der Wiederverwendung einer high-level Komponente sieht oft zuerst alles gut und einfach aus. Aber dann kommen die Details. Immer umfangreichere Teile der Komponente müssen angepasst, also neu implementiert werden. Manchmal ist gar nicht abschätzbar, ob ein gefragtes Feature mit der Komponente überhaupt realisierbar ist - geschweige denn zu welchem Aufwand. Spätestens aber wenn der Upgrade auf ein neues Release der Komponente ansteht, ist der Spaß vorbei.

Im Sinne der agilen Software-Entwicklung ist das Ergebnis jedenfalls schon tot, bevor es ausgerollt wird. Das Ergebnis ist überkomplex und damit kaum wart- und anpassbar. Es enthält Features bei denen nicht bekannt ist, für was und ob sie überhaupt vom Kunden benötigt werden.

Am Ende war der Aufwand für die Anpassungen größer und schmerzvoller, als hätte man die Funktionalität vom scratch implementiert.

Was ist die Alternative? Aus meiner Sicht macht es Rails genau richtig. Statt auf konfigurierbare und wiederverwendbare Komponenten zu setzen, adressiert Rails die Verbesserung der Infrastruktur. Um so einfacher es ist, eine Anwendung vom scratch zu schreiben, um so weniger bedarf es irgendwelcher high-level Komponenten.

Das Ergebnis ist dann eine einfache Anwendung mit wenig, leicht lesbaren Code, die nur solche Features enthält, die der Kunde benötigt. Agile Software eben.

[1]: SOA doomed?

Mac und Emacs - das ist ja ein Gegensatz schon beinahe biblischer Dimension. Um so überraschender der Trend unter den Apple-vernarrten Rails-Entwicklern von TextMate auf Emacs umzusteigen. Geoffrey Grosenbach (Peepcode) hat dazu jetzt sogar einen Screencast produziert.

Mich selbst erstaunt das insofern, als das ich Mac-OS nach einigen tapferen Monaten gleich ganz wieder verlassen habe. Weniger weil mir Emacs so sehr fehlte (mit TextMate hätte ich leben können), sondern weil mir Mac-OS als Entwickler-System viel zu unkomfortabel ist. Die wesentlichen Mac-OS-Macken sind meiner Ansicht nach:

  • Mac-OS hat keinen Paket-Manager. Zwar gibt es Mac-Ports, aber das endet in unerfreulichen, länglichen Compilations-Sitzungen.

  • Keine persistenten Sitzungen.

  • Keine brauchbare Multi-Desktop-Implementation.

  • Keine intelligente Window-Platzierung.

  • Windows kann man nur an der rechten unteren Ecke in der Größe ändern.

Seither benutze ich wieder Linux/KDE (Debian) auf einem Wald-und-Wiesen-PC. Alles was ich vermisse, ist die Mac-Hardware - abgesehen von der Tastatur, die mies funktioniert und deren Layout noch schlimmer als QERTZ ist (zumindest für Programmierer).

Wer benutzt alles Emacs? Im Ruby- und Rails-Umfeld habe ich neben Matz himself folgende Leute ausfindig gemacht: Pat Maddox (rspec, cucumber), Ola Blini (jruby), Ryan Davis (Ruby Cookbook, ZenTest), Nathan Weizenbaum (Haml, Sass). Jamis Buck (Capistrano) benutzt den anderen Editor: vi :-).

[*] Die scherzhafte Auflösung des Akronyms Emacs zu Eight Megabytes And Constantly Swapping stammt aus Zeiten, wo acht Megabyte - nicht Gigabyte - Hauptspeicher viel waren. Zu wenig allerdings für Emacs.

Unsere letzte Wohnmobil-Tour durch die Eifel wurde mal wieder zu einem unfreiwilligen Campingplatz-Test. Dabei trifft man auf auf manch "faschistoides Kleinod", aber glücklicherweise auch auf sehr schöne Plätze.

Zwei besonders schöne Platze, die wir auf unserer Tour kennen lernten sind der Campingplatz-Platz Perlenau in Monschau und der Platz am Pulvermaar in Gillenfeld.

Der Campingplatz in Monschau ist ganz besonders hübsch an einem Wildbach, dem Perlenbach, 2km von Monschau entfernt gelegen. An das schöne aus Naturstein errichtete Rezeptionsgebäude und Wohnhaus der Platzbesitzers schließt sich ein gemütliches Restaurant an, welches eine kleine Auswahl liebevoll zubereiteter Speisen bietet. Die Sanitäreinrichtungen sind modern und großzügig. Duschen ist gratis. Sehr zur Freude der Kinder fließt der Perlenbach mitten durch den Platz. Die hintere Zeltwiese erreicht man über eine flache Furt.

Der Platz am Pulvermaar ist einfach aber Preiswert. Mit Badestelle, Imbiss und einfachen Sanitäranlagen mit Gratis-Duschen bietet er alles, was ein Camper braucht. Das zwar kalte aber kristallklare Wasser des Maars läd zu einem kurzen Bad oder einer Bootstour ein.

Nach mehreren Erlebnisreichen Tagen wollten wir im Nord-Osten der Eifel noch einmal Halt an einem See machen. Mit dem Finger auf der Karte fiel die Wahl den Campingplatz Laacher See in der Nähe von Maria Laach.

Die Einfahrt zum Campingplatz wird von einer Doppelschranke und einem hohen Zaun dominiert. Selbst längere Wartezeiten bei der Abfertigung kann man sich mit der Lektüre der aushängenden Platzordnung vertreiben.

Die klärt einen nicht nur darüber auf, dass das Campingplatz-Personal jederzeit berechtigt ist, Fotokopien der mitzuführenden Personalausweise zu machen, auch wird die Zentimeter-genaue Höhe eines auf dem Platz zu benutzenden Grills in dem umfangreichen Text festgelegt.

Was geht eigentlich in einem Hirn vor, das sich sowas ausdenkt?

Nicht als zahlender Gast, also als Kunde wird man begrüßt, sondern als ein schlecht erzogener Nassauer, der bestenfalls geduldet wird, wenn er sich denn den Erzieherischen Maßnahmen des Platzwarts unterwirft.

Ich empfinde solches Gebaren gegenüber Kunden als Unverschämtheit.

Besucher aus dem europäischen Nachbarländern, wie zum Beispiel aus Holland, trifft man übrigens auf solchen Platzen selten. Die sind es offenbar nicht gewohnt und nicht im geringsten bereit, sich derart behandeln zu lassen.

Jürgen und Meno haben angefangen, ich habe es nachgemacht: Campa 10-fach Kette auf einer Shimano-Schaltung.

Die Shimano Dura-Ace-Gruppe ist ja sehr gut - aber was Marathon-Fahrer nervt, ist die extrem eingeschränkte Lebensdauer der Shimano-10-fach Kette von nur 800 bis 1100 km. Das heißt teilweise alle zwei Wochen oder früher eine neue Kette. Auch die KMC-Ketten halten nur wenig länger.

Das Gute ist, dass die Campagnola 10-Fach Ketten kompatibel sind. Und diese Ketten halten ein vielfaches länger, was den höheren Preis mehr als wett macht - denn auch Ritzel und Kettenblätter werden damit nicht so leicht von einer zu langen Kette heruntergefahren.

Campa-Kette auf Shimano
Chimere: Shimano mit Campa-Kette und Connex-Schloß

Alternativ zum teuren Campa-Kettennieter kann man die Kette mit einem Ketten-Schloß verschließen. Dann kann man die Kette auch leicht zum Reinigen öffnen. Ich habe sowohl den KMC missing link als auch das Connex-Schloß getestet. Es funktionieren beide - auch auf einem 11er Ritzel (was bei Campa angeblich nicht geht).

Ende letzten Jahres bestellte ich bei Alice zwei Mobilfunk-Sim-Karten mit dem Ziel, die Rufnummern meiner auslaufenden T-Mobile-Verträge dorthin zu übernehmen. Ich erteilte Hansenet also (per Fax) zwei entsprechende Portierungsaufträge und harrte der Dinge.

Die Portierung der ersten Rufnummer war dann auch nach zwei Wochen abgeschlossen. Nur die Portierung der zweiten Rufnummer ließ auf sich warten. Böses ahnend, rief ich bei der Hotline an, nur um die üblichen Beschwichtigungen zu hören: "Das dauert manchmal!", "Ich kann Ihren Auftrag hier zwar nicht sehen, aber der ist ganz bestimmt in Arbeit!"...

Nach drei Wochen war's mir zu dumm und ich schrieb per Einschreiben und Rückschein mit Fristsetzung – keine Reaktion von Hansenet. Wieder Anrufe bei der Hotline. Ein Einschreiben läge nicht vor, der Auftrag sei aber in Bearbeitung. Sicherheitshalber solle ich ihn aber nochmal faxen. Ich faxte. Mehrfach. Weiterhin keine Reaktion von Hansenet.

Nun erhielt ich heute zwei Briefe von Alice: In dem einen wurde mir erklärt, dass mein Auftrag noch in Arbeit sei. Der zweite Brief erklärte, die Bearbeitung sei nicht mehr möglich, weil die Frist von einem Monat seit Kündigung des bisherigen Anbieters überschritten sei.

Ich frage mich: "Wann endlich wird der Faustpfand – meine Telefonnummer – den Telefonanbietern abgenommen und mir ausgehändigt?" Mittels ENUM könnte technisch schon heute der Verbraucher selbst entscheiden, welche seiner Rufnummern zu welchem Anbieter geleitet wird.

Implementiere ich eine Methode, die als Argument ein Modell-Objekte emfangen soll, frage ich mich oft "Benötige ich hier tatsächlich das Exemplar des Objekts, oder genügt auch dessen ID?".

Stellen Sie sich eine Methode append vor, die einen gegeben Song an eine Playlist anhängen soll:

class Playlist

  has_many :entries

   # Creates and returns a new playlist entry for given song
  def append(song)
    enties.create(:song_id => song.id)
  end

end

Für den Benutzer dieser Methode bedeutet das, dass er das Song-Objekt zuvor laden muss. Die append Methode benötigt aber letztlich nur dessen ID. Für eine Web-Anwendung kann das sehr teuer sein, da die Requests nur IDs liefern und die Objekte jedes mal neu aus der Datenbank geladen werden müssen.

Die Signatur der Methode dahingehend zu ändern, dass sie grundsätzlich eine ID empfängt, geht oft nicht durchgängig und ist deshalb nicht schön. Es kann also eine gute Idee sein, solche Methoden so zu implementieren, dass sie sowohl Objekt-Exemplare als auch IDs empfangen können.

Nur wie kann ich das implementieren, ohne durch eine zusätzliche Fallunterscheidung deren Komplexität zu erhöhen? Eine Lösung ist, für Songs die Methode to_s zu implementieren:

class Song
  ...

  # Returns the record id
  def to_i
    id
  end

end

Nun kann ich die Eingangs erwähnte Methode so formulieren:

 # Creates and returns a new playlist entry for given song or song-id
def append(song_or_id)
  enties.create(:song_id => song_or_id.to_i)
end

Auf den Parameter song_or_id wird die Methode to_i angewendet. Sie liefert für einen gegebenen Song dessen Id und für eine gegebene ID deren Wert .

Zur Erfolgskontrolle möchte das Marketing im Nachgang von Newsletter-Aktionen eigentlich immer wissen, wieviele Leser auf welche Links im Newsletter geklickt haben.

Üblicherweise wird diese Aufgabe mittels spezieller Urls gelöst, die von einem Mail-Link-Klick-Zähl-Controller entgegengenommen werden, dessen Aufgabe einzig darin besteht, den jeweiligen Klick zu zählen und dann zur eigentliche Seite zu redirecten. Beispiel: Anstelle das beworbene Produkt 4711 mit der Url /product/show/4711 im Newsletter direkt zu verlinken, wird der Mail-Link-Klick-Zähl-Controller mit /maillink/product/4711 verlinkt. Die jeweiligen Requests werden vom Controller gezählt (zum Beispiel durch "Ziehen" eines Google-Analytics-Urchin) und dann zur Url /product/show/4711 weitergeleitet.

Die Marketing-Leute wollen aber auch wissen, aus welchem Newsletter der jeweilige Klick erfolgte. Diese Daten bei jedem Link im Newsletter spezifizieren zu müssen ist recht umständlich. Mit Rails geht das aber auch viel einfacher mittels default_url_options:

class NewsletterMailer < ActionMailer::Base

  def monthly_newsletter(customer, subject, ...)
    default_url_options = {:newsletter => 'monthly', :date => Date.tody}

    subject subject
    body    :customer => customer,
            ...
  end
end

An alle mit link_to im Template monthly_newsletter.rhtml erzeugten Link werden jetzt die Parameter newsletter mit dem Newsletter-Namen und date mit dem Erzeugungsdatum angehängt.

Standardmäßig verbiete ich aus Sicherheitsgründen die SSH-Anmeldung via Passwort mit Hilfe der open_sshd-Konfigurationsoption

PasswordAuthentication no

in /etc/ssh/sshd_conf. Danach sollte es nur noch möglich sein, sich mittels eines autorisierten SSH-Keys anzumelden.

Zu meiner Überaschung ist das zumindest bei Debian 4.0 nicht so! Die Ursache ist schnell gefunden. Es ist die Konfigurationsoption

UsePAM yes

Diese muss ebenfalls auf no gesetzt (oder auskommentiert) werden.

In den letzten Wochen macht der Hamburger Bürgermeister, die Hamburger CDU Bürgerschaftsfraktion, der Präsident der Handelskammer Hamburg sowie das Hamburger Abendblatt kräftig Stimmung gegen den aktuell zur Abstimmung stehenden Volksentscheid »Hamburg stärkt den Volksentscheid« und das nicht nur mit fadenscheinigen, unredlichen Argumenten, sondern auch mit einer großen Angstkampagne.

»Getting Real« ist eine erfrischend unorthodoxe Sicht auf den Software-Entwicklungsprozess. Der Augenmerk des Buches liegt auf Web-Anwendungen, aber die Ideen sind auch auf nicht-Software-Vorhaben übertragbar. Es richtet sich an Manager, Entwickler und Designer.

Behandelt werden Prinzipien der Betriebswirtschaft, des Designs und Programmierens sowie der Vermarktung von Web-Anwendungen. Es enthält keine technischen Dinge, sondern Vorschläge zum Vorgehen, angefangen bei der Idee eines neuen Produktes, bis zu dessen Vermarktung.

Almost for all Linux and Unix programs it is possible to copy them from one to another Linux node (as long as both nodes are of the same architecture). What you need to know is the complete list of all files you have copy. Sometimes there are some "hidden" information that you have to copy also, e.g. user accounts, crontab entries or other configuration file entries.

This text describe how to make a instantly runable copy of an existing Oracle installation from one Linux node to another one.

Auch wenn lästernde Zungen behaupten, mit einem Computer löse man nur Probleme, die man ohne Computer gar nicht hätte, wird niemand ernsthaft bestreiten, dass der breiten Einführung der Informationstechnologie in allen Branchen eine erhebliche Produktivitätssteigerung folgte.

Ich aber behaupte, in weiten Bereichen wird das Produktivitätspotential durch den Einsatz von IT gar nicht ausgeschöpft. Als Ursache ist meistens der Einsatz von nicht auf die jeweiligen Geschäftsprozesse angepasster Software auszumachen. Bei der Entwicklung von Software werden die Geschäftsprozesse des Kunden oft gänzlich außer acht gelassen. Denken Sie nur an das obligatorische Office-Paket. Selbst Platzhirsch Microsoft ist es bisher nicht gelungen, bürotypische Arbeitsabläufe mehr als nur ansatzweise zu unterstützen.

Pragmatische Einführung in den CVS-Nachfolger Subversion mit praxisorientierten Rezepten. Empfehlenswert gleichermaßen für Ein- und Umsteiger.

Der de facto-Standard bei den Versionskontrollsystem war lange Jahre CVS. Inzwischen hat SVN ihm längst den Rang abgelaufen. Höchste Zeit, sich damit zu beschäftigen.

Powered by Mephisto - Valid: xhtml | css
Stoppt die Vorratsdatenspeicherung! Jetzt klicken &handeln! Willst du auch bei der Aktion teilnehmen? Hier findest du alle relevanten Infos und Materialien: