Elemeztem minden, a Stack Overflow-ról valaha említett könyvet. Itt vannak a legnépszerűbbek.

A következő programozási könyv megtalálása nehéz és kockázatos.

Fejlesztőként szűkös az időd, és egy könyv elolvasása sok időt vesz igénybe. Lehet, hogy programozol. Lehet, hogy pihen. De ehelyett értékes időt szán az olvasásra és a képességek bővítésére.

Tehát melyik könyvet olvassa el? Kollégáimmal gyakran beszélgetünk a könyvekről, és azt vettem észre, hogy az adott könyvvel kapcsolatos véleményünk nagyon eltérő.

Ezért úgy döntöttem, hogy alaposabban megvizsgálom a problémát. Ötletem: elemezni a világ legnépszerűbb programozói erőforrását egy ismert könyvesbolt linkjeire vonatkozóan, majd megszámolni, hogy az egyes könyvek hány említést kapnak.

Szerencsére a Stack Exchange (a Stack Overflow anyavállalata) épp most tette közzé adattárukat. Tehát leültem és eljutottam a kódolásig.

„Ha kíváncsi vagy, az általánosan ajánlott könyv hatékonyan működik a Régi Kóddal, a második pedig a Tervezési minta: Az újrafelhasználható objektumorientált szoftver elemei. Noha ezek címei ugyanolyan szárazak, mint az Atacama-sivatag, a tartalomnak mégis minőséginek kell lennie. A könyveket címkék szerint rendezheti, például JavaScript, C, Graphics és bármi más szerint. Ez nyilván nem a könyvajánlások vége, de minden bizonnyal egy jó hely a kezdéshez, ha csak kódolással foglalkozik, vagy szeretné bővíteni tudását. " - áttekintés a Lifehacker.com oldalon

Röviddel ezután elindítottam a dev-books.com webhelyet, amely lehetővé teszi az összes általam gyűjtött és rendezett adat feltárását. Több mint 100 000 látogatót kaptam, és rengeteg visszajelzést kaptam, amelyben arra kértek, hogy írjam le az egész technikai folyamatot.

Tehát, ahogy ígértem, leírom, hogyan építettem most mindent.

Az adatok megszerzése és importálása

Fogtam a Stack Exchange adatbázis kiírását az archive.org webhelyről.

A kezdetektől fogva rájöttem, hogy nem lehet 48 GB-os XML-fájlt importálni egy frissen létrehozott adatbázisba (PostgreSQL) olyan népszerű módszerekkel, mint például myxml := pg_read_file(‘path/to/my_file.xml’), mert nem volt 48 GB RAM a szerveremen. Tehát úgy döntöttem, hogy használok egy SAX elemzőt.

Között értékeket tároltunk ow> tags, so I used a Python script to parse it:

After three days of importing (almost half of the XML was imported during this time), I realized that I’d made a mistake: the ParentID attribute should have been ParentId.

At this point, I didn’t want to wait for another week, and moved from an AMD E-350 (2 x 1.35GHz) to an Intel G2020 (2 x 2.90GHz). But this still didn’t speed up the process.

Next decision — batch insert:

StringIO lets you use a variable like file to handle the function copy_from, which uses COPY. This way, the whole import process only took one night.

OK, time to create indexes. In theory, GiST indexes are slower than GIN, but take less space. So I decided to use GiST. After one more day, I had an index that took 70GB.

When I tried couple of test queries, I realized that it takes way too much time to process them. The reason? Disk IO waits. SSD GOODRAM C40 120Gb helped a lot, even if it is not the fastest SSD so far.

I created a brand new PostgreSQL cluster:

initdb -D /media/ssd/postgresq/data

Then I made sure to change the path in my service config (I used Manjaro OS):

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

I Reloaded my config and started postgreSQL:

systemctl daemon-reloadpostgresql systemctl start postgresql

This time it took couple hours to import, but I used GIN. The indexing took 20GB of space on SSD, and simple queries were taking less than a minute.

Extracting books from the database

With my data finally imported, I started to look for posts that mentioned books, then copied them over to a separate table using SQL:

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

The next step was to find all the hyperlinks within those:

CREATE TABLE http_books AS SELECT * posts WHERE body LIKE ‘%http%’”;

At this point I realized that StackOverflow proxies all links like: rads.stackowerflow.com/[$isbn]/

I created another table with all posts with links:

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

Using regular expressions to extract all the ISBNs. I extracted Stack Overflow tags to another table through regexp_split_to_table.

Once I had the most popular tags extracted and counted, the top of 20 most mentioned books by tags were quite similar across all tags.

My next step: refining tags.

The idea was to take the top-20-mentioned books from each tag and exclude books which were already processed.

Since it was “one-time” job, I decided to use PostgreSQL arrays. I wrote a script to create a query like so:

With the data in hand, I headed for the web.

Building the web app

Since I’m not a web developer — and certainly not a web user interface expert — I decided to create a very simple single-page app based on a default Bootstrap theme.

I created a “search by tag” option, then extracted the most popular tags to make each search clickable.

I visualized the search results with a bar chart. I tried out Hightcharts and D3, but they were more for dashboards. These had some issues with responsiveness, and were quite complex to configure. So, I created my own responsive chart based on SVG. To make it responsive, it has to be redrawn on screen orientation change event:

Web server failure

Right after I published dev-books.com I had a huge crowd checking out my web site. Apache couldn’t serve for more than 500 visitors at the same time, so I quickly set up Nginx and switched to it on the way. I was really surprised when real-time visitors shot up to 800 at same time.

Conclusion:

I hope I explained everything clearly enough for you to understand how I built this. If you have any questions, feel free to ask. You can find me on twitter and Facebook.

As promised, I will publish my full report from Amazon.com and Google Analytics at the end of March. The results so far have been really surprising.

Make sure you click on green heart below and follow me for more stories about technology :)

Stay tuned at dev-books.com