Posts

  • Sonntag: Zeit für Brot

    Sonntag: Zeit für Brot

    We call it: Hipster Sunday

    Sonntag: Zeit für Brot

    Sonntag: Zeit für Brot

    Es ist auch das erste mal, dass mir ein San Francisco Sourdough so gut und ohne Probleme gelungen ist. Das blöde: Ich weiss wirklich nicht, was ich anders gemacht habe.

  • Herbst

    Herbst

    Ein Blick aus dem Fenster genügt.

  • Zionskirche 1

    Zionskirche 1

    Manchmal muss man sich die Motive ganz in der Nähe suchen um dran zu bleiben.

    Die Zionskirche in verschiedenen Jahreszeiten gibt es in einem Album:

  • Pflanzenportraits

    In der Pandemie fingen ja viele Leute an, sich mit Sachen zu beschäftigen die man sonst ignoriert. Mir ist zum Beispiel aufgefallen, dass (Zimmer-) Pflanzen wunderbare Fotomotive abgeben, wenn man nur will.

    Jetzt hab ich begonnen eine Reihe daraus zu machen. Das erste Bild hängt schon an der Wand weil es mir so gut gefallen hat.

  • Jekyll Pipeline mit Github Actions

    Seit einer ganzen Weile läuft dieser Blog mit Jekylls und ist mit git versioniert. Immer wenn ich einen neuen Post veröffentlichen möchte, muss ich

    bundle exec jekyll build
    

    ausführen und dann mit rsync die neuen Dateien auf meinen host kopieren. Dafür habe ich mir ursprünglich mal ein kleines Rakefile geschrieben um das einfacher zu machen. Das Problem an der Sache ist dass ich das eigentlich nur auf meinem Mac machen kann und auch immer manuell starten muss. Früher™️ hatte ich meine eigene gitlab installation laufen und damit auch mein eigenes CI/CD. Der Aufwand die Installation zu pflegen war mir aber zu hoch und so bin ich nun doch bei einem privaten Github Repository gelandet. Da gibt es ja Github Actions die eine rudimentäre build-pipeline ermöglichen und das nutze ich nun um meinen blog einfacher zu aktualisieren.

    Im wesentlichen funktioniert das genau wie lokal:

    • ich baue die website mit jekyll
    • ich kopiere die dateien mit rsync auf meinen host

    nur passiert das jetzt immer, wenn ich einen neuen commit in einem bestimmten branch pushe. Das kann ich von fast überall - sogar meinem Telefon.

    Mal sehen ob ich damit jetzt öfter was poste oder nicht.

    Das Github Action Format ist relativ simple und leicht anpassbar: Man legt sich ein yaml-file in .github/workflows/jekyll-build.yaml

    name: Build and deploy Jekyll site
    on:
      push:
        branches:
          - production
    
    jobs:
      jekyll:
          name: Build and deploy Jekyll site
          runs-on: ubuntu-latest
          steps:
          - name: Install ImageMagick
            run: |
              sudo apt-get update
              sudo apt-get install imagemagick libmagickwand-dev
          - name: Install ruby 3
            run: |
              sudo apt install ruby-full
              ruby --version
          - name: add gem bin to env
            run: |
              echo "/home/runner/.gem/ruby/2.7.0/bin" >> $GITHUB_PATH
          - name: debug PATH 
            run: |
              echo "$PATH" 
          - name: Install bundler
            run: |
              gem install bundler --user-install
          - name: Install Rake
            run: |
              gem install rake --user-install
          - name: Checkout
            uses: actions/checkout@v2
          - name: Install GemFile
            run: |
              bundle install
          - name: Build Page 
            run: |
              rake build
          - name: Deploy to host
            uses: up9cloud/action-rsync@v1.1
            env:
              HOST: blog.kanedo.net
              USER: user
              KEY: $
              TARGET: virtual/blog.kanedo.net/
              VERBOSE: true
              ARGS: -rtzh --delete
              SSH_ARGS: '-p 22 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'
              SOURCE: ./_site/
    

    Der letzte Schritt, rsync, ist eine externe action vom marketplace aber sonst sind alles einfache bash commands die im ubuntu image laufen. Nett ist, dass man mittels secrets einen private SSH Key hinterlegen kann, der dann von rsync benutzt wird. Cool wäre es jetzt noch, dem rsync SSH Key nur Zugriff auf das eine Verzeichniss zu geben… wenn jemand ne Idee hat?

  • Visualisierung von Neuronalen Netzwerken

    Um genau zu sein, Visualisierung vom Attention-Mechanismus von Attention-based Encoder-Decoder Architekturen 1 2. Darum soll es allerdings nicht vordergründlich gehen. Ich arbeite schon seit einer ganzen Weile mit neuronalen Netzen (NNs) um maschinelles Übersetzen zu verbessern. Damit jeder eine grobe Vorstellung hat, von was ich schreibe, ein super-schnell-crash-kurs Neural Machine Translation. Wenn eine Übersetzung generiert wird, passiert das in unserem Fall Wort für Wort. Bei jedem Wort stellt sich die Frage, welche Quell-Wörter sind relevant und welche nicht. Es gibt verschiedene Möglichkeiten dieses Problem zu lösen. Die aktuellen State-of-the-Art Architekturen benutzen einen sogenannten Attention-Mechanismus wie er in den beiden Papern vorgestellt wird. Dabei lernt man für jedes Zielwort eine Wahrscheinlichkeitsverteilung über die Quellwörter. Diese werden dann entsprechend gewichtet als Eingabe für das Netzwerk benutzt (Es ist ein bisschen komplizierter als das, aber das sollte erstmal reichen).

    Ein großes Problem mit NNs ist es, dass deren gelernte Parameter nicht auf den ersten Blick interpretierbar sind. Letztlich sind NNs nur eine Ansammlung von verdammt großen Matrizen… Bei den Attentions ist das aber anders, denn sie sind normiert (Summe ist Eins) und man kann sie daher als Wahrscheinlichkeitsverteilung interpretieren und dementsprechend auch visualisieren.

    Es gibt ja Menschen, die auf eine Kolonne von zwanzig Zahlen zwischen 0 und 1 schauen und direkt sehen was Sache ist. Ich gehöre nicht dazu. Bisher habe ich mich immer so weit wie Möglich von allem Ferngehalten habe, was auch nur annähernd mit Frontend und Visualisierung zu tun hat. Als ich noch einen Nebenjob als Webentwickler hatte, habe ich es gehasst, wenn ich das CSS anfassen musste oder irgendwas “noch mal hübscher” machen musste. Einfach Text reicht doch, oder? Bei der Arbeit mit NNs habe ich meine Meinung dann doch schnell geändert und es sehr zu schätzen gelernt, wenn jemand eine Visualisierung für die Probleme bereitstellt.

    Um nun zum eigentlichen Punkt zu kommen: ich habe angefangen mir kleine Tools zu bauen, die mir die Zahlenkolonnen die unser Übersetzer erzeugt in verständliche Visualisierungen zu bringen.

    Ein Tool was dabei herausgekommen ist visualisiert einfach als Overlay welche Wörter wie stark gewichtet worden sind. Fährt man mit dem Cursor über ein Wort im Zielsatz, dann sieht man, welche Wörter aus dem Quellsatz dafür verwendet wurden:

    Dieses Tool war sehr hilfreich um eine Intuition dafür zu bekommen, welche Dinge das Model lernen konnte und wo es noch Probleme gibt.

    Ein zweites Tool generiert aus den gleichen Daten eine Matrix-Ansicht.

    Die zweite Ansicht habe ich vor allem implementiert, damit wir die Grafiken später in Papern benutzen können und daher gibt es einen Download-Button der ein SVG exportiert. Das kann dann in Inkscape o. ä. angepasst werden (auch wenn das wirklich weird ist und auf unterschiedlichen OS unterschiedliche Grafiken erzeugt, anyway… Anderes Thema).

    Diese Art von Grafik wird zwar auch von sockeye 3 erzeugt, aber nur als png und dann ist die Auflösung Mist und die Schriftart ist im PDF unterschiedlich. Außerdem kann man an denen nichts mehr verändern. Also habe ich mir vorgenommen, es neu zu implementieren.

    SVG Grafiken per Hand zu bauen fand ich irgendwie nicht geil. Also habe ich mich nach Projekten umgesehen, die das vereinfachen. Für dieses Grid habe ich d3js benutzt. Ich war sehr positiv überrascht. Ich muss zugeben, das letzte was ich in JS entwickelt hab war irgendwann 2015 mit jQuery und das war nicht besonders angenehm. Abgesehen von der manchmal etwas lückenhaften Doku von d3js bin ich davon sehr begeistert. Die ganze Entwicklung hat mich nur wenige Stunden gekostet und ich habe von d3js noch nie gehört vorher.

    Beide Tools habe ich auf Github liegen. Das Repository ist ein Fork den ich angelegt habe um eine Beam-Search Visualisierung nach zu implementieren und jetzt sammle ich darin alle meine Visualisierungen. Alles ist immer noch Work-in-Progress, weil ich nur genauso lange daran arbeite, bis es gut genug für den aktuellen Anwendungsfall ist. Alles ist irgendwie schnell zusammen-gehackt und nicht besonders hübsch. Andere nennen es Research-Code. Dafür, finde ich, hat sich die Arbeit aber gelohnt und ich freue mich immer wieder, wenn ich nicht auf Zahlenkolonnen schauen muss, sondern eine interaktive Grafik habe.

    1. Bahdanau, D., Cho, K., & Bengio, Y. (2015). Neural Machine Translation by Jointly Learning to Align and Translate (pp. 1–14). San Diego, Calefornia, USA. Retrieved from http://arxiv.org/pdf/1409.0473v6.pdf 

    2. Luong, T., Pham, H., & Manning, C. D. (2015). Effective Approaches to Attention-based Neural Machine Translation. Emnlp, 1412–1421. 

    3. Hieber, F., Domhan, T., Denkowski, M., Vilar, D., Sokolov, A., Clifton, A., & Post, M. (2017, December 15). Sockeye: A Toolkit for Neural Machine Translation. https://arxiv.org/abs/1712.05690 

  • macos Service - csv zu Multimarkdown

    Für die kommende Masterarbeit habe ich mir vorgenommen, gründlichere Notizen zu schreiben. Das bedeutet vor allem die Ergebnisse von Experimenten immer direkt aufzuschreiben und nicht erst am Ende wenn alles fertig ist. Aus meiner Bachelorarbeit habe ich gelernt, dass man dann viele Feinheiten schon vergisst. Als Format habe ich einfache Text-Dateien in meiner Dropbox gewählt und ich benutze Markdown zum formatieren. Markdown lässt sich schnell schreiben und hilft auch ohne konvertierung Struktur in den Text zu bringen.

    Einzig Tabellen sind (in jeder Auszeichnungssprache) unfassbar nervig. Um das ganze etwas schnner zu gestalten, habe ich ein Skript angepasst, dass ursprünglich von Chris Brandow geschrieben wurde.

    Das ganze funktioniert als Service und in meiner Notiz schreibe ich die Tabelle als CSV:

    -, old beam, new beam
    with empty, 30.2, 29.84
    without empty, 30.45, 30.42
    

    dann markiere ich die drei Zeilen und lasse den Service via Keyboard-Shortcut laufen und dieser erzeugt:

     | -             |  old beam |  new beam |
     | :-----------: | :-------: | :-------: |
     | with empty    |  30.2     |  29.84    |
     | without empty |  30.45    |  30.42    |
    
    

    Das angepasste Skript habe ich als gist auf github gelegt. War mal wieder eine nette Übung in Swift und ist sicher weder besonders elegant, noch effizient. Aber es funktioniert und war schnell erledigt.

  • MergePDF: Duplex-Scan für Arme

    Kurze Notiz weil ich es sonst nirgends gefunden habe und wieder brauchte. Mein Scanner kann kein Duplex-Scannen. Daher habe ich irgendwann mal ein Automator-Service gefunden (weiß leider nicht mehr woher) mit dem man zwei PDFs die jeweils die geraden und ungeraden Seiten enthalten miteinander kombinieren kann.

    Das Script basiert im Wesentlichen auf der CombinePDFPages Aktion und dort Shuffling Pages.

    mergePDFs

    Den Workflow kann man sich hier runterladen: mergePDFs Workflow

  • Sonnenaufgangstour zu den Schrammsteinen

    Wie ging der Spruch? Einmal ist Zufall, zweimal ein Trend und ab drei ist es eine Tradition? Damit ist die Fahrt in die Sächsische Schweiz zu Weihnachten ein Trend, den ich definitiv zur Tradition machen möchte.

    Letztes Jahr war es die Bastei. Auf der Suche nach dem klassischen Postkartenmotiv haben wir uns früh aus dem Bett gequält und haben stattdessen nebelverhangene Tristheit bekommen (Im Fachjargong “moody”). Das gesuchte Motiv habe ich dann übrigens im September gefunden.

    Dieses Jahr also wieder: 4:30 Uhr Weckerklingeln, Kaffee kochen (diesmal zumindest mit Thermoskanne) und ab ins kalte Auto Richtung Osten. Wir wollten zu den Schrammsteinen. Eine der bekanntesten Steinformationen würde ich mal behaupten und im Sommer wimmelt es dort von Wanderern und Kletterern. Im Dezember 6 Uhr Morgens ist man da allerdings alleine. Temperaturen um die null Grad lassen einen die Daunenjacke wertschätzen. Komoot, verantwortlich für die Routenplanung, führt uns direkt den steilsten Weg nach oben, den es gibt. 13% Steigung zeigen einem auch schnell, was der Stollen im Advent angerichtet hat und die anschließenden Treppen und Leitern sorgen dafür, dass man das auch so schnell nicht vergisst. Immerhin friert man nicht mehr.

    20171227-0006 20171227-0007 Leitern und Treppen sind der einzige Weg nach oben.

    An der Schrammsteinaussicht angekommen weht uns so ein heftiger Wind entgegen, dass wir erst einmal zurück in den Windschatten gehen und frühstücken. Ein Hoch auf warmen Kaffee. Wir suchen uns geschütztere Orte für Fotos und finden glücklicherweise einen Felsvorsprung an dem man nicht nur auf die Schrammsteine, sondern auch in die andere Richtung des Elbtals schauen kann. Dadurch hatten wir einen wunderbaren Blick auf die Zschirnsteine und den Schneeberg

    Elbtalpanorama Elbtalpanorama mit Blick auf die Zschirnsteine und den hohen Schneeberg.

    Der Sonnenaufgang der danach folgte war phänomenal. Selten so einen epischen Himmel gesehen. Da stört es dann auch nicht, dass der Vordergrund voll mit Buchen steht, die laubfrei sind (Auch wenn das bedeutet, dass wir im Herbst auf jeden Fall noch mal hin müssen).

    Zschirnsteinsteine im Sonnenaufgang Layers.
    Zschirnsteine im Sonnenaufgang

    hintere Schrammsteine Wer hätte gedacht, dass in die Sonne fotografieren auch gut aussieht

    hintere Schrammsteine gezoomed Und weil’s so schön war, noch mal näher ran

    Als die Sonne dann endlich oben war, sind wir dann doch mal zum eigentlichen Ziel unserer Wanderung gegangen und haben die Schrammsteine fotografiert. Zu dem Zeitpunkt war ich etwas enttäuscht von der Komposition, aber im Nachhinein, finde ich, verfehlt das Bild doch nicht seine Wirkung.

    Schrammsteine Die Schrammsteine

    Samuel wollte gerne, neben den großen Vistas, auch die intimeren Landschaften im Wald fotografieren. Im Winter bietet sich dafür natürlich ein Nadelwald an und so sind wir auf dem Rückweg noch Richtung Kirnitzschtal gelaufen. Auswahl an “schönem” Waldboden (Ja, ich klinge auch in meinem Ohr wie ein baumknutschender Öko aber hey ¯\(ツ)/¯ ).

    Wie zu erwarten, gestaltetete sich die tatsächliche Bildwahl dann schwierig, aber interessant.

    20171227-0008

    Alle Fotos als Gallerie

  • The new Macbook Pro

    Ich kann mich noch ziemlich gut daran erinnern, wie ich am 4. Oktober 2009 (Ja, das war ein Sonntag), in den Mediamarkt in Dresden gefahren bin um mir endlich mein erstens Macbook Pro zu kaufen. 1700€ hat das damals gekostet und war die mittlere Ausstattung.

    Dieses Jahr, also 8 Jahre später, hat der Rechner doch ziemlich das zeitliche gesegnet. Bluetooth funktioniert gar nicht mehr, WLAN nur ab und an und man muss den rebooten damit es wieder kommt.

    Es war also Zeit Magrathea in Rente zu schicken und einen neuen Rechner zu kaufen: Das mid-20017 Macbook Pro mit Touchbar. Was zuerst mal auffällt ist, dass die Preise ziemlich in die Höhe gegangen sind. Habe ich damals für das mittlere Model rund 1.7k€ ausgegeben hat mich dieser Rechner (mit upgrade auf 16GB RAM) mit Studentenrabatt 2k€ gekostet. Naja – anscheinend kann ich das ja später von der Steuer absetzen 🙄.

    Im Vorraus dazu habe ich mir viele Gedanken gemacht. Ich mochte ja meinen alten Rechner. Die Tastatur, die Auswahl an Ports, den Fakt, dass ich RAM, Festplatte und Batterie noch selbst tauschen kann. Das hat vieles einfacher gemacht und definitiv dazu beigetragen, dass ich so lange mit dem Rechner ausgekommen bin. Im neuen MBP geht nichts mehr. Deswegen auch sofort das upgrade auf 16GB RAM – früher oder später werde ich sie brauchen. In meinem alten Rechner hatte ich eine 100GB SSD und eine 1TB HDD im FusionDrive und damit eine Menge Speicher (den ich auch fröhlich voll gemacht habe). Die Upgrade-Preise für Speicher sind absurd. Also nicht, dass man die großen SSDs mit diesen Geschwindigkeiten sonst irgendwie billiger kaufen könnte, aber 750€ für das Upgrade auf eine 1TB SSD sind einfach nicht drin. Auch der Wechsel auf USB-C hat mir ein wenig sorge bereitet, denn ich gehöre noch zu der Gruppe Menschen die eine FireWire Festplatte besitzt 👴. Um es kurz zu machen ich hatte Angst das mein aktueller Workflow so nicht mehr funktioniert.

    Bisher hat sich die Angst aber nicht bestätigt. Ja die Tastatur ist laut, aber sie Tippt sich finde ich fantastisch. Die ESC Taste existiert nicht mehr, aber ich langsam aber sicher erschrecke ich mich auch nicht mehr, wenn ich das Gefühl habe ins nix zu tippen und trotzdem ESC zu treffen. Die Touchbar ist nett: nicht bahnbrechend, aber ich habe schon einige Anwendungen gesehen in denen ich mich über die individuellen Shortcuts gefreut habe (Kalender, Messages und so). TouchID ist fantastisch und das Trackpad….also das ist ja um Welten besser, als das alte (und das war schon fantastisch). Was man auch bedenken muss: Ich komme von einem 2009er Model. Das Display hatte eine Auflösung von 1440x900 Pixel. Retina ist da definitiv bemerkbar 😀.

    Was USB-C angeht: Bisher habe ich keine Probleme. Mein Monitor hat Display Port und einen USB Hub. Für DisplayPort habe ich mir ein neues Kabel gekauft und für das USB-Kabel einen Adapter. Damit habe ich fürs erste alle alte Peripherie (mal abgesehen von FireWire, aber die hat auch USB) angeschlossen bekommen. Wenn ich Unterwegs bin, habe ich noch einen zweiten USB-A zu USB-C Stecker dabei (da Kosten 2 Stk 6,30€. Das finde ich OK). Lediglich für Projektoren und Fernseher habe ich noch nix. Aber da musste man auch mit Mini-DisplayPort schon immer Adapter rumschleppen. Leider gibt es, zumindest meines Wissens nach, noch keinen Adapter der alles nötige zu einem bezahlbaren Preis beinhaltet. Ich hätte gern: USB-A, USB-C Passthrough-Charging, HDMI und Gigabit Ethernet. Extra Bonus wäre noch Mini-DisplayPort. Dann könnte ich nämlich meine alten VGA und DVI Adapter weiter benutzen. aber der einzige der in die Nähe kommt ist der HooToo Hub (Was für ein beschissener Name) und der kostet auch gleich 60€.

    Außerdem brauche ich jetzt noch eine externe Platte die ich mitnehmen kann. Meine Knapp 400GB Fotosammlung passt ja nicht mehr auf die interne SSD. Im Moment liegen all diese Daten auf einer großen 3.5” Platte mit extra Netzteil – nicht gerade portabel. Externe Platten mit nativ USB-C haben momentan auch noch den du-hast-dir-für-2k€-einen-Rechner-gekauft-du-hasts-ja-Aufschlag den ich nicht bereit bin zu zahlen. Mein aktueller Plan ist mit eine USB-A 3.1 Platte mit wechselbarem Kabel zu kaufen – und dann einfach zwei Kabel rumtragen. Aber dafür muss mein Konto erstmal wieder Luft holen 😉

    TL;DR: Neues Macbook Pro ist Arsch teuer aber geil. Hoffentlich hält es jetzt wieder 8 Jahre.