Jahresrücklick 2015
Mein zweites Jahr in Frankreich, mein zweites Jahr im PhD, das 8. Jahr dieses Blogs. Weil ich sonst nie dazu komme, fasse ich dieses Jahr mal etwas verfrüht zusammen was sich alles getan hat.
Projekte
Anfang des Jahres haben wir Serendipity 2.0 veröffentlicht. Das läuft seitdem ziemlich ruhig vor sich hin. Ich bin immer noch stolz über die Verbesserungen die wir damit geschaffen haben. Die anderen Leute des Projekts danach auf dem Serendipity-Treffen kennenzulernen war toll.
Meine eigene Blogengine habe ich von dsnblog in ursprung umbenannt, dsnblog (distributed social network blog) passte nicht mehr zu den Zielen (einfach eine gute Blogsoftware zu sein). Als ich auf Hackernews versuchte die Software zu zeigen, wurde ursprung erst völlig ignoriert. Vor ein paar Tagen wurde ich dann aufgefordert, es nochmal neu zu versuchen, und diesmal gab es Upvotes, Kommentare und einige Sterne auf Github. Sehr nett.
Für ursprung hatte ich vorher eine Vorstellungsseite gebastelt, nachdem ich das zuvor schon für feedtragón gemacht hatte. Feedtragón hatte ich am Anfang des Jahres weiter fertiggestellt, es fehlte nicht mehr viel. Das Jahr über war dies dann auch mein Feedreader, von einer kurzen Auszeit abgesehen.
Izulu hat wie die beiden anderen Projekte eine neue Projektseite und ein neues Release bekommen.
Große Bewegung gab es bei meinem Hardwareempfehler pc-kombo. Den hatte ich im März vervollständigt, sodass ab dann alle Bestandteile eines PCs berücksichtigt wurden. Später entdeckte ich mit /r/buildapc und /r/buildapcforme zwei Subreddits, für welche die Software perfekt passte. Im Sommer generierte die Seite sogar ordentlich Einnahmen, später beruhigte sich dann leider wieder. Trotzdem: Dass nach so langer Zeit stiller Entwicklung sich die Seite vor Nutzern bewähren konnte und aktiv genutzt wurde und wird war ein Riesenerfolg für mich und freute mich wirklich sehr.
Spiele
Meiner Selbstwahrnehmung zufolge spiele ich kaum noch. Dann schaue ich mir die gespielten Spiele an und darf feststellen, dass es so wenig gar nicht wahr – und dabei fehlt sicher einiges im Blog.
Ein shooterlastiges Jahr, besonders der Anfang. Hitman: Blood Money stand am Ende des letzten Jahres, und dieses tolle Spiel motivierte mich überhaupt erst dazu wieder etwas mehr zu spielen. Mit Spec Ops: The Line folgte dann direkt ein großartiges Spiel, über dessen Linearität ich mich aber auch etwas ärgerte. Bioshock Infinite spielte dann wie Spec Ops ziemlich auf der Meta-Ebene und mit der gleichen erzählerischen Macke, aber mit Elizabeth lieferte es auch einen Meilenstein.
The Darkness 2 war noch ein Shooter, Van Helsing dann endlich etwas anderes (und ein überraschend gutes Spiel), Shadow Warrior noch ein Shooter, unter Linux und sehr ähnlich zu The Darkess. Vor dem Urlaub gingen ein paar Stunden für Mount & Blade: Warband drauf, wieder bin ich nicht König aller Könige geworden bevor mich andere Spiele banden. Mark of the Ninja war davon nicht das letzte, inzwischen habe ich noch Skyrim angefangen.
Über Batman (Asylum und Arkham City) habe ich nicht geschrieben, mit dem zweiten Teil bin ich gar nicht warm geworden, aber auch Asylum gefiel mir nicht richtig – vom Spiel her etwas für Kinder, von der Inszenierung dafür aber zu düster. Planetside 2 hatte ich zwischendurch wieder angeschaut und einen Medic aufgebaut, Spaß gehabt, mich aber auch über die Pay2Win-Features geärgert und es bald wieder beiseite gelegt. Für League of Legends reichte die Zeit dann wirklich nicht, da ist es aber auch schmerzhaft, wieviel Praxis mir fehlt und was sich nach der (teils durch schlechtes Internet erzwungenen) Auszeit alles geändert hat. In Kerbal gab es noch ein paar Raketenstarts.
Musik
Ibrahim Maalouf, Diagnostic. Anfang oder Mitte des Jahres von einem Kollegen empfohlen bekommen und toll gefunden. Aber inzwischen finde ich es als Album nach dem melodischen Anfangs schwierig zu hören, besonders das Stück Diagnostic selbst.
Ratatat à la Route du Rock und das zugehörige Album dagegen kann ich immer noch rauf und runter hören. Großartiges Konzert und großartige Musik, die aber auch verdammt gut mitten in meine Musikhistorie passt. Stolperte ich bei ben drüber.
Software & Infrastruktur
Syncthing ersetzte Dropbox und damit freie Software proprietäre, wobei der reparierte Pogo als Heimserver das erst möglich machte.
Die Radeon HD 7850 konnte ich mit einer wassergekühlten 7950 ersetzen. Wasserkühlung war nicht der Plan, ich wollte ursprünglich nur ein bessere Grafikkarte um den Kühler auswechseln zu können, ohne das Geld in eine zu schwache Karte zu stecken. Ein leiserer PC sollte es sein. Die Wasserkühlung (Corsair H90) war dann ohne weitere Änderungen leise genug.
Kleine Entdeckung des Jahres waren ergonomische Mäuse. Meine Hand machte mir Probleme, zwei verschiedene ergonomische Mäuse (eine für Zuhause, eine für die Uni) halfen. Darüber schreib ich nochmal gesondert.
Normalerweise ist eine neue Maus keine große Änderung, ich aber hatte seit meinem ersten eigenen PC eine Logitech MX 500 genutzt.
Sichtbarere Neuerung war das Lightpack; LEDs für den Monitor, die je nach Bildschirminhalt die Farben ändern. Gefällt mir immer noch gut.
Arbeit
Ich durfte auf der Konferenz Communities & Technologies 2015 eine Studie präsentieren, das heißt sie kam durchs Peer-Review und wurde danach veröffentlicht (ohne Schranke hier). War wichtig für mich, mit Lerne die Sprache war Habe eine Veröffentlichung mein von mir gesetztes Minimalziel für das Doktorat.
Lieblingsfoto des Jahres
Chichen Itza in Mexiko, schlechte Handykamera aber tolles Licht:
Mochte aber auch schlicht den Urlaub dort.
Ausblick 2016
Das nächste Jahr könnte wichtig werden. Laut Plan schreibe ich die Doktorarbeit und habe Ende des Jahres die Verteidigung. Schon bald müsste ich einen Job für danach suchen.
Für Serendipity wird es hoffentlich eine neue Webseite geben. Und das nächste Treffen ist für den April geplant, Gäste sind immer noch willkommen.
Von meinen eigenen Projekten würde ich vor allem gerne pc-kombo weiterentwickeln und bekannter machen. Doch wenn ursprung und feedtragón Nutzer oder gar Mitentwickler finden wäre das ebenfalls hochwillkommen.
Bis bald
Damit verabschiede ich mich auch in den Weihnachtsurlaub, zumindest auf Blogseite. Ich wünsche ein frohes Fest und einen guten Rutsch, hoffe ihr hattet ein gutes Jahr, und dass man sich im nächsten wieder liest und sieht.
Featurebeschreibung für die neue Serendipity-Seite
Auch ein Experiment: Für einen kleinen Teil der neuen Webseite für Serendipity fragen wir im Forum nach Rückmeldung. Es geht um den Abschnitt der Seite, der die Funktionen und Eigenschaften von Serendipity präsentieren soll. Da schwanken wir zwischen zwei Designs, die beide ihre Vor- und Nachteile haben: Einmal ein Design mit Icons und mehrspaltigen Text, und einmal ein Design mit Screenshots und mehrspaltigen Text.
Nicht jeder Block, nicht jeder Aspekt der Seite soll so entschieden werden. Hier aber erhoffe ich mir von der Abstimmung sowas wie eine Bauchentscheidung zwischen zwei Möglichkeiten, die wohl beide nicht verkehrt sind.
Alle Screenshots und die Auswahl der Blogs im mittleren Abschnitt sind rein vorläufig und mit niemanden abgesprochen.
No-Offset Pagination in ursprung
Die schnellere Pagination ohne Offset habe ich inzwischen wirklich für ursprung umgesetzt. Das war letzten Endes einige Arbeit.
Statt einem Link wie archive/older=datum
sollte es dann doch wieder ein Link mit Seitenzahl sein, also archive/2
für Seite 2. Also brauchte das System eine Liste, um Seitenzahlen auf eine Datumsangaben zu mappen. Außerdem muss das System sich merken, welcher Eintrag bereits in der Pagination berücksichtigt ist. Denn immer dann, wenn die neu erstellt wird (bei jedem Löschen eines Eintrags) muss dies gezählt werden, statt einfach nur die Anzahl insgesamt vorhandener Einträge zu zählen.
Die Kernfunktion ist das Hinzufügen eine Seite zur Pagination und deren Anpassung:
# Add the page to the precomputed mapping of page to entry date, to enable the no offset pagination # This also has to take care of shrinking the buffer (the second archive page, n -1), so that all other archive pages remain stable def addToPagination(entry:) limit = 5 # the tag can't just be nil, because in sqlite3 INSERT OR REPLACE on shared primary keys detects ('abc', NULL) and ('abc', NULL) not as a conflict tags = entry.tags.empty? ? [self.NOTAG] : (entry.tags << self.NOTAG) tags.each do |tag| totalPages, totalEntries = self.getTotalPages(limit, tag) totalEntries += 1 # the current entry is not already counted by that function page = (totalEntries > 1 && totalEntries % limit == 1) ? totalPages + 1 : totalPages # start date of n is now entry.date @@db.execute("INSERT OR REPLACE INTO pagination(page, tag, startDate) VALUES(?, ?, ?)", page, tag, entry.date) if totalEntries > limit # now the start second archive page, the shrinking and growing buffer, has to be set as well tagSQL = tag == self.NOTAG ? "" : "AND id IN (SELECT entryId FROM tags WHERE tag = '#{SQLite3::Database.quote(tag)}')" bufferStart = @@db.execute("SELECT date FROM entries WHERE date < (SELECT startDate FROM pagination WHERE page = ? AND tag = ?) #{tagSQL} ORDER BY date DESC LIMIT ?", page, tag, limit).last['date'] @@db.execute("INSERT OR REPLACE INTO pagination(page, tag, startDate) VALUES(?, ?, ?)", page - 1, tag, bufferStart) if (totalEntries > (limit * 2)) && (totalEntries % limit == 1) # if we have more than two pages and the buffer just overgrew, we can set it back to 1 and move the full amount of entries to a stable page bufferEnd = @@db.execute("SELECT date FROM entries WHERE date < (SELECT startDate FROM pagination WHERE page = ? AND tag = ?) #{tagSQL} ORDER BY date DESC LIMIT ?", page - 1, tag, 1).last['date'] # this will never be changed again @@db.execute("INSERT OR REPLACE INTO pagination(page, tag, startDate) VALUES(?, ?, ?)", page - 2, tag, bufferEnd) end end end @@db.execute("UPDATE entries SET paginated = 1 WHERE id = ?", entry.id) end
Schließlich hat es aber durchaus funktioniert. Das Aufrufen einer Archivseite in einem vollen Blog ist schneller geworden, ohne dass sich für den Nutzer etwas geändert hätte. Es fehlt nur noch ein schlaueres Vorgehen beim Löschen eines Eintrags, dass die Pagination angepasst wird statt sie zu löschen und neu zu erstellen.
Wobei ich das Gefühl nicht loswerde, dass meine Implementation unnötig kompliziert ist.