Ich habe jedes Buch analysiert, das jemals über Stack Overflow erwähnt wurde. Hier sind die beliebtesten.

Es ist schwierig und riskant, das nächste Programmierbuch zu finden.

Als Entwickler ist Ihre Zeit knapp und das Lesen eines Buches nimmt viel Zeit in Anspruch. Sie könnten programmieren. Du könntest dich ausruhen. Stattdessen verwenden Sie viel Zeit, um Ihre Kenntnisse zu lesen und zu erweitern.

Welches Buch solltest du also lesen? Meine Kollegen und ich diskutieren oft über Bücher und haben festgestellt, dass unsere Meinungen zu einem bestimmten Buch sehr unterschiedlich sind.

Also beschloss ich, mich eingehender mit dem Problem zu befassen. Meine Idee: Die beliebteste Programmierressource der Welt nach Links zu einem bekannten Buchladen durchsuchen und dann zählen, wie viele Erwähnungen jedes Buch enthält.

Zum Glück hatte Stack Exchange (die Muttergesellschaft von Stack Overflow) gerade ihren Datendump veröffentlicht. Also setzte ich mich und machte mich an die Programmierung.

Ein Screenshot von dem Tool, das ich erstellt habe: dev-books.com
"Wenn Sie neugierig sind, ist das Buch, das am häufigsten empfohlen wird," Effektiv mit Legacy-Code arbeiten ", wobei das Entwurfsmuster: Elemente wiederverwendbarer objektorientierter Software an zweiter Stelle steht. Während die Titel für diese so trocken wie die Atacama-Wüste sind, sollte der Inhalt noch Qualität sein. Sie können Bücher nach Tags wie JavaScript, C, Grafiken und was auch immer sortieren. Dies ist natürlich nicht das Ende aller Buchempfehlungen, aber es ist sicherlich ein guter Ausgangspunkt, wenn Sie sich nur mit Codierung befassen oder Ihr Wissen verbessern möchten. “- Rückblick auf Lifehacker.com

Kurz darauf startete ich dev-books.com, mit dem Sie alle Daten durchsuchen können, die ich gesammelt und sortiert habe. Ich habe mehr als 100.000 Besucher und viele Rückmeldungen erhalten, in denen ich gebeten wurde, den gesamten technischen Prozess zu beschreiben.

Also, wie versprochen, werde ich beschreiben, wie ich gerade alles gebaut habe.

Daten abrufen und importieren

Ich habe mir den Stack Exchange-Datenbankspeicherauszug von archive.org geholt.

Von Anfang an wurde mir klar, dass es nicht möglich sein würde, eine 48-GB-XML-Datei mit gängigen Methoden wie myxml: = pg_read_file ('path / to / my_file.xml') in eine frisch erstellte Datenbank (PostgreSQL) zu importieren, da ich dies nicht tat Habe 48 GB RAM auf meinem Server. Also habe ich mich für einen SAX-Parser entschieden.

Alle Werte wurden zwischen -Tags gespeichert, daher habe ich ein Python-Skript zum Parsen verwendet:

Nach drei Tagen des Imports (fast die Hälfte des XML-Codes wurde in dieser Zeit importiert) stellte ich fest, dass ich einen Fehler gemacht hatte: Das ParentID-Attribut sollte ParentId gewesen sein.

Zu diesem Zeitpunkt wollte ich keine Woche länger warten und bin von einem AMD E-350 (2 x 1,35 GHz) auf einen Intel G2020 (2 x 2,90 GHz) umgestiegen. Dies hat den Prozess jedoch noch nicht beschleunigt.

Nächste Entscheidung - Batch einfügen:

Mit StringIO können Sie eine Variable wie file für die Funktion copy_from verwenden, die COPY verwendet. Auf diese Weise dauerte der gesamte Importvorgang nur eine Nacht.

OK, Zeit zum Erstellen von Indizes. Theoretisch sind GiST-Indizes langsamer als GIN, benötigen jedoch weniger Speicherplatz. Also habe ich mich für GiST entschieden. Nach einem weiteren Tag hatte ich einen Index, der 70 GB beanspruchte.

Als ich einige Testabfragen ausprobierte, stellte ich fest, dass die Verarbeitung viel zu lange dauert. Der Grund? Disk IO wartet. SSD GOODRAM C40 120 GB hat viel geholfen, auch wenn es nicht die schnellste SSD ist, die es bisher gab.

Ich habe einen brandneuen PostgreSQL-Cluster erstellt:

initdb -D / media / ssd / postgresq / data

Dann habe ich den Pfad in meiner Dienstkonfiguration geändert (ich habe Manjaro OS verwendet):

vim /usr/lib/systemd/system/postgresql.service
Environment = PGROOT = / media / ssd / postgres
PIDFile = / media / ssd / postgres / data / postmaster.pid

Ich habe meine Konfiguration neu geladen und postgreSQL gestartet:

systemctl daemon-reload
postgresql systemctl start postgresql

Diesmal hat der Import einige Stunden gedauert, aber ich habe GIN verwendet. Die Indizierung benötigte 20 GB Speicherplatz auf der SSD, und einfache Abfragen dauerten weniger als eine Minute.

Bücher aus der Datenbank extrahieren

Nachdem meine Daten endlich importiert waren, suchte ich nach Beiträgen, in denen Bücher erwähnt wurden, und kopierte sie dann mithilfe von SQL in eine separate Tabelle:

CREATE TABLE books_posts AS SELECT * FROM posts WHERE body LIKE ‘% book%’ ”;

Der nächste Schritt bestand darin, alle Hyperlinks in diesen zu finden:

CREATE TABLE http_books AS SELECT * Beiträge WHERE body LIKE ‘% http%’ ”;

Zu diesem Zeitpunkt wurde mir klar, dass StackOverflow alle Links wie folgt ersetzt: rads.stackowerflow.com/[$isbnowntown/

Ich habe eine weitere Tabelle mit allen Beiträgen mit Links erstellt:

CREATE TABLE rads_posts AS SELECT * FROM posts WHERE body LIKE '% http: //rads.stackowerflow.com%' ";

Verwenden regulärer Ausdrücke zum Extrahieren aller ISBNs. Ich habe Stack Overflow-Tags durch regexp_split_to_table in eine andere Tabelle extrahiert.

Nachdem ich die beliebtesten Tags extrahiert und gezählt hatte, waren die 20 meist erwähnten Bücher nach Tags in allen Tags ziemlich ähnlich.

Mein nächster Schritt: Tags verfeinern.

Die Idee war, die Top-20-Bücher von jedem Tag zu nehmen und Bücher, die bereits verarbeitet wurden, auszuschließen.

Da es sich um eine einmalige Aufgabe handelte, entschied ich mich für die Verwendung von PostgreSQL-Arrays. Ich habe ein Skript geschrieben, um eine Abfrage wie folgt zu erstellen:

Mit den Daten in der Hand machte ich mich auf den Weg ins Internet.

Erstellen der Webanwendung

Da ich kein Webentwickler und mit Sicherheit kein Experte für Webbenutzeroberflächen bin, habe ich beschlossen, eine sehr einfache App für eine einzelne Seite zu erstellen, die auf einem Standard-Bootstrap-Thema basiert.

Ich habe eine "Suche nach Tag" -Option erstellt und dann die beliebtesten Tags extrahiert, um jede Suche anklickbar zu machen.

Ich habe die Suchergebnisse mit einem Balkendiagramm visualisiert. Ich habe Hightcharts und D3 ausprobiert, aber sie waren eher für Dashboards gedacht. Diese hatten einige Probleme mit der Reaktionsfähigkeit und waren recht komplex zu konfigurieren. Also habe ich mein eigenes Responsive Chart basierend auf SVG erstellt. Damit es reagiert, muss es bei einem Ereignis zur Änderung der Bildschirmausrichtung neu gezeichnet werden:

Webserverfehler

Nginx gegen Apache

Unmittelbar nachdem ich dev-books.com veröffentlicht hatte, hatte ich eine riesige Menge, die meine Website überprüfte. Apache konnte nicht mehr als 500 Besucher gleichzeitig bedienen, daher habe ich Nginx schnell eingerichtet und unterwegs darauf umgestellt. Ich war wirklich überrascht, als die Besucher in Echtzeit gleichzeitig auf bis zu 800 schossen.

Fazit:

Ich hoffe, ich habe alles klar genug erklärt, damit Sie verstehen, wie ich das aufgebaut habe. Wenn Sie Fragen haben, können Sie diese gerne stellen. Sie finden mich auf Twitter und Facebook.

Wie versprochen werde ich meinen vollständigen Bericht von Amazon.com und Google Analytics Ende März veröffentlichen. Die bisherigen Ergebnisse waren wirklich überraschend.

Stelle sicher, dass du unten auf das grüne Herz klickst und folge mir für weitere Geschichten über Technologie :)

Bleiben Sie auf dev-books.com auf dem Laufenden