blog.andreas-klingler.de

Notizen und Gedanken von Andreas Marc Klingler

Kategorie: Soft­ware­ent­wick­lung (Seite 1 von 2)

Code-Rea­li­tät

In Vor­le­sun­gen hört man ja ab und zu Hor­ror-Geschich­ten über „die Rea­li­tät”™. Man lacht dann meist dar­über und fragt sich, ob es denn stim­men kann, das in frei­er Wild­bahn wirk­lich der­ma­ßen unglaub­lich schreck­li­cher Code exis­tie­ren kann. So blöd kann ja kei­ner sein.

Letz­te Woche habe ein sol­ches Bei­spiel erlebt, bei des­sen Code-Ana­ly­se ich minu­ten­lang nicht mehr aus dem Lachen her­aus­kam. Auch wenn Wei­nen wohl ange­mes­se­ner gewe­sen wäre.

Es ging um eine Web­platt­form, die trotz 8-Kern-Sys­tems mit 32 GB RAM kaum noch benutz­bar war auf­grund extrem lan­ger Ant­wort­zei­ten im Minu­ten­be­reich. Ein Haupt­pro­blem war eine Meho­de, die fol­gen­des gemacht hat:

  • Lade zu Beginn erst­mal alle Objek­te aus der Daten­bank in eine Varia­ble.
  • Lade, weil’s so schön ist, auch direkt alle abge­lei­te­ten Objek­te abge­lei­te­ter Tabel­len in Varia­ble.
  • Füh­re diver­se Trans­for­ma­tio­nen mit allen die­sen Objek­ten aus (deren Sinn sich mir nicht zu 100% erschlos­sen hat).
  • Fil­te­re ca. 80% der Objek­te raus.
  • Füh­re mit der ver­blei­ben­den Objek­ten wei­te­re Trans­for­ma­tio­nen durch.
  • Ermitt­le schließ­lich die Anzahl der Ele­men­te, die in der „Haupt­va­ria­ble” noch drin sind, und …
  • ver­wen­de die­sen Wert nie wie­der.

Über­flüs­sig zu sagen, dass auch die ande­ren Varia­blen über­haupt nicht ver­wen­det wer­den. Tja…

Will­kom­men in der Rea­li­tät! (Flucht­mög­lich­kei­ten sind nicht aus­ge­schil­dert.)

(Nach­trag: Zum The­ma: devopsreactions.tumblr.com, codinghumor.tumblr.com uvm.)

MyP­la­ces: Orte orga­ni­sie­ren auf eige­nem Ser­ver

In Madrid habe ich nach eini­gen Wochen ange­fan­gen, eine Goog­le Maps-Kar­te zu erstel­len, auf der ich inter­es­san­te Orte mar­kiert habe — sonst hät­te ich sie nicht wie­der­ge­fun­den.

In Ber­lin habe ich vor eini­ger Zeit wie­der das glei­che Pro­blem gehabt: Stän­dig sind mir neue Orte auf­ge­fal­len, die ich mir zu einem spä­te­ren Zeit­punkt mal genau­er habe anse­hen wol­len. Aber ich woll­te nicht wie­der auf einer qua­si-öffent­li­chen Kar­te mar­kie­ren, für wel­che komi­schen Inter­es­se ich bestimm­te Orte inter­es­sant fin­de. (Ja, ja, ja — natür­lich kann man bei Goog­le Maps Kar­ten als „pri­vat” mar­kie­ren. Völ­lig pri­vat. Schon klar. :-/ )

Ich habe daher neben­bei eine klei­ne Anwen­dung geschrie­ben, mit der ich Orte hier pri­vat ver­wal­ten kann. Die Ruby-on-Rails-Anwen­dung mit dem schreck­lich krea­ti­ven Namen MyP­la­ces ist auf git­hub ver­füg­bar.

Mit ihr kann man

  • Orte auf dem Mobil­ge­rät wie auf dem Desk­top schnell hin­zu­fü­gen,
  • in Kate­go­ri­en ver­wal­ten und
  • anzei­gen.

Die Anwen­dung muss auf dem eige­nen Ser­ver gehos­tet wer­den. Eine Demo-Anwen­dung läuft unter http://my-places.naturtrunken.de.

Für mich ist die Anwen­dung erst­mal gut benutz­bar, aller­dings kann noch eini­ges ver­bes­sert wer­den, was ich die nächs­ten Wochen und Mona­te wahr­schein­lich immer mal wie­der zwi­schen­durch tun wer­de. Wer die Soft­ware nütz­lich fin­det, kann sich ger­ne die offe­nen Tickets anse­hen oder eige­ne Ver­bes­se­run­gen vor­neh­men.

Und wer in Ber­lin ist, kann auch mal Diens­tags oder ab und zu Sams­tags im co.up bei dem Coding-Ami­gos-Tref­fen vor­bei­schau­en. Da habe ich die Anwen­dung größ­ten­teils ent­wi­ckelt und wer­de sie dort ab und zu auch wei­ter­ent­wi­ckeln.

Neue Mög­lich­kei­ten mit WebRTC

Ich habe mir schon vor län­ge­rem vor­ge­nom­men, mich mal aus­gie­big mit WebRTC zu beschäf­ti­gen. Mit die­ser noch in der Ent­wick­lung befind­li­chen Web-Tech­nik wird es mög­lich, belie­bi­ge Daten in Echt­zeit direkt zwi­schen Brow­sern zu über­tra­gen. Zum Bei­spiel ist damit eine Anwen­dung wie Sky­pe nativ im Brow­ser mög­lich — ohne den Umweg über US-Ser­ver, die alles unbe­grenzt spei­chern.

Sehr span­nend. Letz­ten Mon­tag fand im Beta­haus das ers­te WebRTC-Tref­fen statt; mit tol­len Leu­ten und Vor­trä­gen. Eini­ge Noti­zen:

  • In Mac OS ist seit eini­ger Zeit der Dienst Air­Drop ein­ge­baut. Damit kann man im loka­len Netz zwi­schen zwei Macs Datei­en aus­tau­schen. Und zwar idio­ten­si­cher. Genau die­sen Dienst gibt es jetzt auch als Web-Platt­form unter sharedrop.io. Im loka­len Netz kann man zwi­schen zwei Rech­nern damit auch platt­form­un­ab­hän­gig Datei­en aus­tau­schen, ohne irgend­wel­che Ser­ver-/Cli­ent-Geschich­ten auf­set­zen zu müs­sen.
  • Brow­ser-zu-Brow­ser-Tele­fo­nie wird mög­lich. Zwi­schen zwei Brow­sern klappt das direkt, und mit einem Pro­xy-Dienst auch mit dem Fest­netz. Die Live-Demo eines Test­pro­jekts lief ein­wand­frei.
  • Falls auf­grund von NAT oder ande­ren Netz­werk­ein­schrän­kun­gen kei­ne direk­te Ver­bin­dung zwi­schen zwei Brow­sern mög­lich ist, kann man einen Dienst auf einem gemein­sa­men Ser­ver auf­set­zen, der bei­de „ver­bin­det“. Wenn die Daten über die­sen Ser­ver lau­fen, ist das natür­lich sicher­heits­tech­nisch erst­mal nicht so schön, aber das garan­tiert wenigs­tens die Ver­füg­bar­keit. Und da die Tech­nik dezen­tral ist, las­sen sich hun­dert­tau­sen­de WebRTC-Ser­ver natür­lich auch nicht so ein­fach über­wa­chen wie z.B. nur Sky­pe-Ser­ver.
  • Ich dach­te bis­her bei dem Begriff WebRTC bis­her pri­mär an „Sky­pe ohne Über­wa­chungs­in­fra­struk­tur direkt im Brow­ser“. Aber abs­trakt gese­hen geht es um direk­ten Aus­tausch belie­bi­ger Daten zwi­schen Brow­sern. Das eröff­net ein gewal­ti­ges Feld an neu­en Mög­lich­kei­ten.

Ich glau­be, wir wer­den in Zukunft vie­le Diens­te mit die­ser Tech­nik sehen, wel­che die Gren­ze zwi­schen Desk­top- und Brow­ser-Anwen­dung wei­ter ver­wi­schen wer­den.

Ruby on Rails, i18n: Feh­len­de Über­set­zun­gen

Pro­blem: In einem Ruby on Rails-Pro­jekt wur­den eini­ge Über­set­zun­gen nicht gefun­den. Obwohl alles kor­rekt in den i18n-loca­le-Datei­en ein­ge­tra­gen war, die auch alle gela­den wur­den.

Lösung: i18n-Loca­le-Datei­en wer­den in Rails sequen­ti­ell ein­ge­le­sen. Datei für Datei. Wird ein neu­er Schlüs­sel gefun­den, wird die­ser defi­niert. Ist der Schlüs­sel aber schon vor­han­den, wird er über­schrie­ben. Gibt es also meh­re­re Schlüs­sel in meh­re­ren Datei­en (oder in einer Datei, das lie­fe auf das glei­che hin­aus), sind in der Anwen­dung nur die­je­ni­gen Über­set­zun­gen des­je­ni­gen Schlüs­sels vor­han­den, der zuletzt ein­ge­le­sen wur­de. Fies.

 

Ruby on Rails: perform_caching und Flash-Mel­dun­gen

Bei einem Ruby-on-Rails-Pro­jekt funk­tio­nier­te lokal alles — aber in der Umge­bung pro­duc­tion (unter nginx) ver­schwan­den die Flash-Mel­dun­gen (zum Bei­spiel nach dem Log­in über Devi­se) nicht mehr — bezie­hungs­wei­se erst, als eine Sei­te gerän­dert wur­de, die von einem ande­ren Con­trol­ler ver­wal­tet wird.

Da das Pro­jekt Devi­se teil­wei­se per Ajax nutzt und die eini­ge Flash-Mel­dun­gen selbst aus­gibt, dach­ten wir erst an alles ande­re; bis wir, als uns nach etli­chen Stun­den Debug­ging lang­sam die Optio­nen aus­gin­gen, wir ein­fach mal den Inhalt der deve­lop­ment- und pro­duc­tion-Datei­en in config/environments aus­tausch­ten. Und sie­he da, das Pro­blem war weg.

Der Grund des Pro­blems war fol­gen­de Ein­stel­lung:

config.action_controller.perform_caching = true

Nach­dem wir sie in pro­duc­tion auf fal­se gesetzt haben, funk­tio­nier­ten die Flash-Mel­dun­gen wie­der.  Rück­bli­ckend ist das eigent­lich klar, aber dar­auf zu kom­men, hat gedau­ert.

Mer­ke daher: Gibt es Pro­ble­me mit dem Anzei­gen von Flash-Mel­dun­gen, immer auch an die­se Caching-Ein­stel­lung den­ken.

All­mäch­ti­ges Front­end

Ich expe­ri­men­tie­re seit eini­ger Zeit hin und wie­der mit Java­Script-Frame­works wie Angular.js oder Ember.js. Dar­in kann man mitt­ler­wei­le kom­plet­te MVC-Anwen­dun­gen schrei­ben, die kom­plett im Brow­ser lau­fen kön­nen und ggf. höchs­tens noch per JSON/XML mit einem Ser­ver-Skript zur per­sis­ten­ten Daten­spei­che­rung kom­mu­ni­zie­ren müs­sen. (Wobei auch das teil­wei­se schon lokal geht.)

Ein inter­es­san­ter Aspekt, der mir heu­te Abend bei einem Gespräch auf dem Angular.js-Meetup gekom­men ist: Es gibt einen Trend, immer mehr Logik in das Front­end (→ Brow­ser) zu ver­schie­ben.

In den meis­ten Web­an­wen­dun­gen wird der­zeit die meis­te Logik im Backend in einer eigen­stän­di­gen (Skript-) Spra­che geschrie­ben und dar­aus HTML-/JS-/CSS-/usw.-Code erzeugt und vom Brow­ser geren­dert. Zwar wird die Dar­stel­lung zwar oft noch per Java­Script geren­dert, aber die wesent­li­che Logik liegt im Backend.

Die Java­Script-Frame­works lau­fen dage­gen voll­stän­dig im Brow­ser ab. Dar­aus folgt dann aber auch, dass die gesam­te Logik öffent­lich wird. Jeder kann sich im Brow­ser durch die Java­Script-Datei­en han­geln, die kom­plet­te Logik nach­voll­zie­hen, auf Schwach­stel­len ana­ly­sie­ren und gar kom­plett her­un­ter­la­den, ver­än­dern und woan­ders mani­pu­liert hoch­la­den.

Das eröff­net neben­bei völ­lig neue Mög­lich­kei­ten zum „Platt­form­klau” oder zu Angrif­fen, bei denen man nicht mal mehr ande­re Sei­ten nach­bau­en muss, weil man sie kom­plett auf einen eige­nen Ser­ver kopie­ren kann. Schnell noch eine Ver­tip­per-Domain regis­trie­ren und dann mal schau­en, wer sich so anmel­det. Die Anmel­de­da­ten kann man dann auch gleich spei­chern, um damit auf der rich­ti­gen Platt­form frem­de Nut­zer­kon­ten über­neh­men zu kön­nen.

In die­sem Zusam­men­hang lohnt sich auch ein Blick auf die Sei­te nobackend.org, auf der bereits Ide­en und Lösun­gen gesam­melt wer­den für eine Welt, die voll­stän­dig ohne Backend aus­kommt.

Die Idee fin­de ich für eini­ge Anwen­dungs­fäl­le ganz inter­es­sant und ich wer­de das auch wei­ter­hin beob­ach­ten. Aber es fühlt sich irgend­wie komisch an, eine Platt­form so leicht kom­plett kopie­ren zu kön­nen. Viel­leicht bin ich da aber auch nur zu vor­ein­ge­nom­men, weil ich es bis­her anders nicht ken­ne. Mal schau­en, wie sich das ent­wi­ckelt.

Nagi­os-Plug­in zur Über­prü­fung von Gemfile-Aktua­li­sie­run­gen

Für Nagi­os gibt es fast alles – aber ein Modul zum Über­wa­chen für (Ruby on Rails-) Gems schein­bar noch nicht. Ich beschrei­be daher im fol­gen­den kurz ein Bash-Skript und des­sen Ein­bin­dung in einer Nagi­os-NRPE-Instanz, mit der man das Vor­han­den­sein von Gem-Aktua­li­sie­run­gen mit Nagi­os über­wa­chen kann.

Kern des Skripts ist der Auf­ruf von gem obsolet, das eine Lis­te mit allen Gems zurück­lie­fert, für die Aktua­li­sie­run­gen vor­han­den sind. Das Skript zählt mit wc ein­fach die Anzahl der zurück­ge­ge­be­nen Zei­len der Stan­dard­aus­ga­be STDOUT. Wird kei­ne Zei­le zurück­ge­ge­ben, sind alle instal­lier­ten Gems auf dem aktu­el­len Stand.

Wei­ter­le­sen

Exzel­len­tes Blog über Soft­ware­tech­nik und -ent­wick­lung

Vor eini­ger Zeit bin ich auf ein wun­der­ba­res Blog gesto­ßen, dass ich allen ans Herz legen möch­te, die Soft­ware auch ent­wi­ckeln: Joel on Soft­ware.

Es han­delt um Soft­ware­tech­nik und -ent­wick­lung sowie einer grö­ße­ren Epsi­lon-Umge­bung davon. Vie­le Arti­kel sind Augen-öff­nend und zumin­dest ich habe in den gut vier Wochen, in denen ich das Blog „aus­ge­le­sen” habe, sehr viel erkannt und gelernt. (Unte­re ande­rem auch gute Grün­de dafür, war­um man in der Pra­xis oft Din­ge tut, für die es im aka­de­mi­schen Bereich aber auch gute Grün­de gibt, sie zu ver­pö­nen.)

Auf der Haupt­sei­te gibt es in der zwei­ten Spal­te eine sehr lan­ge Lis­te auf gute Arti­kel aus ver­schie­de­nen Berei­chen. Ein guter Anfang. Über die Archiv-Sei­te kann man dann geord­net alle Bei­trä­ge ab März 2000 lesen.

Ursprüng­lich habe ich an die­ser Stel­le auch noch eine Aus­wahl her­vor­ra­gen­der Zita­te aus dem Blog anbrin­gen wol­len. Ich habe mich bei der gro­ßen Men­ge, die ich mir her­aus­ko­piert habe, nicht mehr ent­schei­den kön­nen und gebe daher allen Inter­es­sier­ten lie­ber den Rat, das Blog selbst aus­zu­le­sen. Man kann sich ja auch damit Zeit las­sen, die Arti­kel lau­fen ja nicht weg. :-)

Ältere Beiträge