Rivva-Logo

Der schönste Rivva-Bug (und: Verschenke mein Buch)

Es begab sich so im Oktober 2008 zu einer Zeit, in der ich nur einen einzelnen Server hatte. An jenem Morgen gab Rivva kein einziges Lebenszeichen mehr von sich. Dennoch: Ich konnte mich ohne Umwege auf der Maschine anmelden. Was war hier los?

Wie sich zu meiner Überraschung herausstellte, war überhaupt nichts los. Die Kiste war praktisch in Ruhe:

top: Keine Last.

ps: Prozessliste normal. Dann:

dmesg: Im syslog kein einziger Hinweis.

Nichtsdestotrotz: Das System lief ja überhaupt nicht mehr!???

Reflexartig:

df: 0% Plattenplatz.

Ahso! Nur wie denn das, bitte schön?

Erstes Hindernis: Rettung und Rekonstruktion sind gar nicht so einfach, sind die Festplatten erst einmal zu 100% vollgelaufen. Der Linux Kernel läuft scheinbar unbeeindruckt weiter. Nur dass eben jede, wirklich kleinste Schreiboperation sofort zum Abbruch führt. Jetzt noch ein Programm zur Fehlerdiagnose installieren, haut nicht mehr hin.

Ich fand bald heraus, dass zwei der Logdateien meines Crawlers eine Größe von je vielen hundert GBs erreicht hatten. Wie das Logging so aus dem Ruder laufen konnte, dazu musste ich anschließend erst einmal meinen Code befragen.

Hier das Szenario, wie es sich in der Nacht abgespielt haben muss. Die Kettenreaktion hat mich schwer beeindruckt:

  1. Ein Blog hatte das Abrufen seiner URL inmitten der Dateiübertragung abgebrochen, aber Status 200 OK übermittelt.

  2. Die Präambel des Downloads gab an, das Datei-Encoding wäre ISO-8859-1.

  3. Mein Crawler normalisiert alle Inhalte auf UTF-8-Kodierung. Also kurz iconv angeworfen…

  4. Hier geschah das erste Unglück: Die Datei war ja unvollständig. Der Konverter generierte daraus eine nicht mehr enden wollende Reihe von Zeichen. Eine Endlosschleife im endlichen Automaten!?

  5. Mein Bot brach ab und protokollierte die Fehlerursache. An dieser Stelle geschah der zweite Fehler: Ich hatte den dummen Bot so programmiert, dass er die komplette Exception Message loggen sollte. Die nicht enden wollende Reihe von Zeichen wurde so auch noch hübsch auf Platte gebannt: Hunderte Milliarden Mal wiederholte sich ein und die selbe Bytesequenz.

  6. Die Festplatte war jetzt zu circa zwei Drittel gefüllt. Noch ist alles gut. Bis Stunden später ein wichtiger Job seine Arbeit machte…

  7. Morgens in der Früh rotiert ein logrotate Daemon alle Logdateien des Systems. Die Anweisung lautet copytruncate, d.h. das originale Log File wird gekürzt, nachdem eine Kopie erstellt wurde. In diesem Moment nimmt der Schaden seinen finalen Verlauf. Für die Kopie ist endgültig kein Platz mehr. Oy vey!

Was lehrt uns dieser Fall? Protokolliere Fehlernachrichten nie in voller Länge (jedenfalls solange sie außerhalb der eigenen Codegrenzen generiert werden).

Auch nach Jahren finde ich diesen Bug immer noch ausgesprochen hübsch.

Vor sieben Jahren ist mein TDD-Buch erschienen. Das Buch beschreibt, wie man Software in kleinen sicheren Schritten entwickelt.

Mittlerweile ist es nicht mehr im Druck. Als Autor möchte man natürlich so weit und breit wie möglich gelesen werden.

Ich freue mich deshalb riesig über das Einverständnis des dpunkt.verlags, das Buch ab heute kostenlos als eBook anbieten zu können.

Free Download: Testgetriebene Entwicklung mit JUnit & FIT (PDF)

Glückwünsche: mokono wird Populis, Carta benennt Beirat

Nicht wundern: Auf Rivvas Seiten steht jetzt Partner von Populis. Die mokono GmbH, die rivva.de exklusiv vermarktet, wurde ja bereits im September hundertprozentige Tochter von Populis und hat nun gestern auch den Namen der Muttergesellschaft übernommen. Glückwunsch: Vasco & Florian.

Ebenfalls gestern haben die Carta-Herausgeber ihre aktuellen Pläne veröffentlicht. Es freut mich, wie es mit dem großartigen Autorenblog weitergeht und dass ich ein wenig im Wissenschaftlichen Beirat helfen darf. Glückwunsch: Tatjana, Wolfgang, Leonard & ganz besonders Vera.

re:publica: Im Gespräch mit Philip Banse

Meine Historie mit der re:publica (und Berlin-Terminen allgemein) ist leider unter aller Kanone. Zwei eingeladene Vorträge musste ich schon wegen Krankheit in letzter Sekunde absagen.

Aus dem Grund hatte ich Philip Banse zunächst geantwortet, dass das Risiko einer dritten Blamage einfach zu groß sei. Doch nun freue ich mich, doch zugesagt zu haben und endlich mal die Konferenz zu besuchen.

Die Gesprächsrunde findet statt am Donnerstag um 1615 Uhr: Blogger im Gespräch.

Weitere Gäste sind: Debora Weber-Wulff, Matthias Bauer und Raul Krauthausen.

Update: Es war superschön, wenigstens einigen von euch über den Weg zu laufen. Danke, rp12. Danke, Philip.

YouTube

Informationsverbreitung auf Twitter (30 wissenschaftliche Arbeiten)


Wunderschöne Informationskaskaden aus dem Paper von Kwak, Lee, Park und Moon [1].

Im letzten Jahr hab ich fast jeden Tag ein Research Paper gelesen und bin dadurch mit jeder Menge neuer Themenfelder in Kontakt. Derzeit führt meine Exkursion quer durch die Twitter Social Science.

Die Sozialwissenschaftler lieben Twitter. 340 Millionen Tweets pro Tag. 140 Millionen aktive Nutzer. Ein sozialer Graph mit wahrscheinlich Billiarden gerichteter Kanten? Nie zuvor hatten die Soziologen so viele, wertvolle Daten zur Hand. Und das noch nahezu in Echtzeit.

Die unten stehende Sammlung umfasst alle Forschungsprojekte zu den drei Gebieten Complex Contagion, Information Cascade, Situation Awareness, die ich so finden konnte und dazu interessant fand (siehe Sternchenvergabe).

  1. What is Twitter, a Social Network or a News Media? (WWW 2010) ***
  2. Information Resonance on Twitter: Watching Iran (SOMA 2010) ***
  3. Who Says What to Whom on Twitter (WWW 2011) ***
  4. Differences in the Mechanics of Information Diffusion Across Topics: Idioms, Political Hashtags, and Complex Contagion on Twitter (WWW 2011) ***
  5. Entropy-based Classification of ‘Retweeting’ Activity on Twitter (SNA-KDD 2011) ***
  6. Unsupervised Modeling of Twitter Conversations (HLT 2010) ***
  7. Information diffussion in Social Media (Stanford CS224W 2011) **
  8. Tweet, Tweet, Retweet: Conversational Aspects of Retweeting on Twitter (HICSS 2010) **
  9. On Word-of-Mouth Based Discovery of the Web (IMC 2011) **
  10. How Does the Data Sampling Strategy Impact the Discovery of Information Diffusion in Social Media? (ICWSM 2010) **
  11. Measuring Message Propagation and Social Influence on Twitter.com (SocInfo 2010) **
  12. Classifying Trending Topics: A Typology of Conversation Triggers on Twitter (CIKM 2011) *
  13. Mapping Information Flows on Twitter (ICWSM 2011) *
  14. Conversational Tagging in Twitter (HT 2010) *
  15. The Revolutions Were Tweeted: Information Flows During the 2011 Tunisian and Egyptian Revolutions (IJoC 2011) *
  16. Conjoining Speeds up Information Diffusion in Overlaying Social-Physical Networks (arXiv) *
  17. Information Propagation on Twitter (Stanford CS224W 2009) *
  18. (How) Will the Revolution be Retweeted? Information Diffusion and the 2011 Egyptian Uprising (CSCW 2012) *
  19. Microblogging During Two Natural Hazards Events: What Twitter May Contribute to Situational Awareness (CHI 2010) *
  20. Dynamical Classes of Collective Attention in Twitter (WWW 2012) *
  21. Information Contagion: an Empirical Study of the Spread of News on Digg and Twitter Social Networks (ICWSM 2010) *
  22. Citation Analysis in Twitter: Approaches for Defining and Measuring Information Flows within Tweets during Scientific Conferences (MSM 2011) *
  23. How Far Does a Tweet Travel? Information Brokers in the Twitterverse (MSM 2010) *
  24. Analyzing the Dynamic Evolution of Hashtags on Twitter: a Language-Based Approach (LSM 2011) *
  25. A Study on Characteristics of Topic-Specific Information Cascade in Twitter (IEICE 2011) *
  26. Cross-Pollination of Information in Online Social Media: A Case Study on Popular Social Networks (SocialCom 2011) *
  27. The Pattern of Information Diffusion in Microblog (CoNEXT 2011 Student) *
  28. Pass It On?: Retweeting in Mass Emergency (ISCRAM 2010) *
  29. Pandemics in the Age of Twitter: Content Analysis of Tweets during the 2009 H1N1 Outbreak (PLoS ONE 2010) *
  30. Understanding how Twitter is used to spread scientific messages (Web Science 2010) *

Weil sich die Forschungsergebnisse unmöglich zusammenfassen lassen, einige Meta-Anmerkungen:

Rivva wird fünf

„It's not when people notice you're there that they pay attention; it's when they notice you're still there.“ – Paul Graham, Hackers & Painters, p. 211

Im letzten Jahr hat das Rivva Blog arg wenig Liebe bekommen. Zukünftig möchte ich wieder häufiger über die Entwicklungen bloggen.

Insbesondere habe ich eine Artikelreihe in Arbeit, die den Aufbau und die Funktionsweise einmal von A bis Z erklären soll. Das wird eine wohl mehrjährige Expedition werden und ausgesprochen viele Themen diskutieren.

Für Hintergründe taugen die Gespräche oft besser. Das neueste Interview ist bei 1000ff zu lesen. Zur Rückkehr schon erschien eines bei artundweise und im Herbst ein erstes Fazit bei Meedia. Hier bereits verlinkt waren 140 Sekunden und DRadio Wissen. Vasco Sommer-Nunes (mokono) kam beim Werbeblogger zu Wort.

Woran habe ich die Monate gearbeitet? Die meiste Zeit ist tatsächlich fürs Yak Shaving hopsgegangen. Ich bin dabei, große Teile des Systems neu zu programmieren. Gleichzeitig ziehe ich Komponenten, Module und APIs heraus, um darauf aufbauend eigene Produkte zu entwickeln. Ich möchte dieses Jahr auch erste Projektteile als Open Source freigeben, um damit an die Community zurückzugeben.

Was ist für 2012 zu erwarten? Ein neues Ranking ist in Planung. Dem Twitterspam soll endlich der Garaus gemacht werden. Die Topic-Seiten, Themen-Cluster und verwandten Stories finden zurück. Große Neuerungen wird es dann erst 2013 geben, da die Produktentwicklung zunächst im Fokus steht. Rivva benötigt ein zweites und drittes Standbein.

Auf die nächsten fünf!

Google doodelt eine Welle für Heinrich Hertz

Für das heutige Google Doodle zu Ehren Heinrich Hertz schwingt das Logo als elektromagnetische Welle. Sehr hübsch. Erinnert an den Rivva Mäander.

Structured Logging mit JSON, Fluentd und MongoDB

In der Vergangenheit war die Logdatei hauptsächlich ein Protokoll jener Systemereignisse, die später zur Diagnose des Programmverhaltens und der Fehlerbehebung dienen sollten. Doch das ist nicht mehr gut genug.

A/B Testing, Realtime Analytics, Data Science uvm. haben die Rolle der Logs erweitert. Konsument sind nicht mehr nur Menschen, sondern zunehmend andere Maschinen.

Rivvabot loggt gerne und viel. Ich war nun auf der Suche nach einer Lösung, die mich echte, beliebig schachtelbare Datenstrukturen loggen lässt und die gleichzeitig meinen Code vom Logging Clutter säubert.

Ein Beispiel aus Rivvas neuem Feedfetcher:

def fetch_url
  intent 'About to fetch feed'
  response = Robot.fetch(url)

  if response.success?
    success 'Fetched feed'
    return response
  else
    error 'Error fetching feed', :status => response.response_code
    return nil
  end
end

intent, success und error sind hier Log-Anweisungen, die ich als Kernel Methods in alle Ruby-Objekte reingemixt habe und die im Initializer an konkrete Log-Levels (debug, info, warn, error, fatal) gebunden werden. Mir gefällt daran, wie das Logging dem Code eine fast narrative Struktur gibt.

Noch ein Stückchen aus dem Robot:

def get(options = {})
  intent 'About to fetch document'
  @response = http_get(@uri, options)

  success 'Fetched document',
    :status     => response_code,
    :uri        => effective_url,
    :origin     => origin,
    :size       => downloaded_bytes,
    :type       => content_type,
    :error      => acceptable?(content_type),
    :fetch_time => total_time
  return self
end

Die hier protokollierten sieben Attribute werden nicht mehr im dummen Format String in ein Log File geschrieben, sondern als semistrukturierter JSON String, einfach zu parsender Key/Value-Paare, zum zuständigen Event Collection Server gestreamt. Als Log Aggregator setze ich Fluentd ein.

Fluentd nun sammelt die Logs aller Nodes in einer Mongo-Instanz. Da MongoDB dokumentenorientiert ist, wird jede Log Message mit all ihren Feldern indiziert und damit beliebig queryable.

db.logs.findOne({ origin: 'https://blog.rivva.de/rss' })
{
  "_id" : ObjectId("4f40329d1645465463000003"),
  "type" : "text/xml; charset=UTF-8",
  "status" : 200,
  "message" : "Fetched document",
  "system" : "feedfetcher",
  "node" : "search.rivva.de",
  "fetch_time" : 0.765,
  "severity" : "info",
  "time" : ISODate("2012-02-18T23:22:04Z"),
  "size" : 14799,
  "uri" : "http://feeds.feedburner.com/rivvablog",
  "pid" : 87369,
  "error" : null,
  "origin" : "https://blog.rivva.de/rss"
}

Ersichtlich ist hier auch, wie der Hash automatisch noch um weitere Kontextinformationen aus ActiveRecord und Systemumgebung erweitert wird.

Gegen diese Collection kann ich jetzt beliebige Queries formulieren. Zum Beispiel:

„Wann haben wir diesen Feed zuletzt gesehen?“

db.logs.find({ origin: 'https://blog.rivva.de/rss' }).sort({ time: -1 }).limit(1)

„Welche Quellen sind heute verstorben?“

db.logs.find('this.status == 404 && this.time > ISODate("2012-02-19T")')

„Wie viele Fehler dieser Art gab es?“

db.logs.count(
  { $or: [
    { 'exception.message': /HostResolutionError/ },
    { 'exception.stacktrace': /robot\.rb/ }
  ] }
)

Vorerst pusht Rivva nur um die 2,4 Millionen Events täglich, insbesondere weil ich immer noch mit der Größe von Mongos Capped Collection experimentiere (momentan: 1 GB, Tradeoff: Speicherbelegung vs. Langzeitarchivierung).

font-family: Optima;

„Das musst du ja mal festhalten“, dachte ich mir gestern.

„Zu lustig!“: Techmeme (2012) vs. Rivva (2008)

Gegen SOPA und Netzsperren

Auch Rivva wird sich am 18. am Netzprotest gegen SOPA und ACTA beteiligen und für 12+ Stunden die Lichter ausknipsen.

"Stop SOPA" war eigentlich häufig genug Titelstory. Gute Argumente gegen den Stop Online Piracy Act liefern bspw. der Breitband-Beitrag vom Samstag und Joi Ito.

Auf rege Beteiligung hoffend…

Zu Gast im Online Talk bei DRadio Wissen

Thomas Reintjes und Sebastian Sonntag hatten mich heute morgen als Gast im Online Talk. Nachzuhören gibt es den Beitrag als MP3-Download oder man abonniert gleich den Podcast.

Ein neues Jahr

2011 bleibt für mich als das Jahr in Erinnerung, in dem Rivva das Blatt noch einmal wenden konnte. Knapp dem Projekttod entronnen, hat die Seite unterdessen sogar seine Leserzahlen verdoppeln können. Mein Dank dafür gilt allen Fürsprechern sowie mokono und BMW i, ohne deren Unterstützung das alles gar nicht möglich gewesen wäre.

Es freut mich daher außerordentlich, euch heute das Update geben zu können, dass BMW i die Werbepartnerschaft durch mokono für das gesamte Jahr 2012 verlängert. Mir fällt damit ein Stein vom Herzen und für das gesamte deutschsprachige Social Web ist es auch eine wunderschöne Bestätigung. Danke!

Hier findet ihr die finale Ausgabe vom Jahresrückblick 2011: http://rivva.de/2011 Die Daten zwischen Februar und Juni habe ich soweit wie möglich aufgearbeitet. Ich wünsche euch allen ein gesundes und glückliches neues Jahr.

 

Archiv: 2021 (2)   2020 (1)   2019 (2)   2018 (5)   2017 (3)   2016 (3)   2015 (1)   2014 (2)   2013 (8)   2012 (11)   2011 (4)   2010 (8)   2009 (18)   2008 (12)   2007 (17)   alle (97)