5 poin oleh GN⁺ 2025-05-02 | 1 komentar | Bagikan ke WhatsApp
  • Saat membuat hn.unlurker.com, saya menambahkan fitur scan pada klien API HN yang mengambil seluruh item secara berurutan, lalu mengunduh seluruh data Hacker News ke lokal
  • Saat menjalankan hn scan --no-cache --asc -c- -o full.json, unduhan sempat beberapa kali berhenti, tetapi berkat scan yang bisa dilanjutkan, beberapa jam kemudian saya berhasil mendapatkan file JSON berukuran 20 GiB
  • Setelah mengubah JSON menjadi tabel dengan read_json_auto dari DuckDB, saya menghitung proporsi penyebutan Python, JavaScript, Java, Ruby, dan Rust menggunakan SQL text ILIKE serta rata-rata bergerak 12 minggu
  • Bahkan hanya dengan grep sederhana, saya bisa memastikan frasa “correct horse battery staple” muncul 231 kali di Hacker News, dan DuckDB tampak sangat cocok untuk analisis sekali jalan pada skala ini
  • Begitu seluruh data tersedia secara lokal, konten lama Hacker News bisa dianalisis dengan berbagai cara, tetapi proyek ini saya akhiri di sini dan langkah berikutnya saya serahkan kepada orang lain

Mengunduh seluruh item Hacker News

  • Untuk membuat hn.unlurker.com, saya menulis klien API HN
    • Sebenarnya sudah ada beberapa klien, tetapi saya ingin mencoba fitur Go terbaru dan linter pada proyek baru
    • Di HN API, komentar dan cerita disebut item
  • Klien ini bisa mengambil item aktif, daftar item, dan sebagainya
    • Proyek aslinya hanya membutuhkan item terbaru, tetapi demi kelengkapan saya menambahkan fitur scan
    • scan mengunduh item secara berurutan dari 0 hingga yang terbaru, atau ke arah sebaliknya
  • Saya memperkirakan unduhan penuh ini bukan akan berukuran puluhan ribu GiB, melainkan sekitar puluhan GiB JSON, jadi saya mencobanya
hn scan --no-cache --asc -c- -o full.json
  • Unduhan sempat beberapa kali macet dan saya hentikan dengan CTRL-C, tetapi karena scan bisa dilanjutkan, prosesnya selesai beberapa jam kemudian
  • Hasilnya adalah file JSON 20 GiB yang berisi seluruh hal yang pernah terjadi di Hacker News
  • Jika menjalankan perintah yang sama lagi, data bisa diperbarui kembali dengan data terbaru

Menganalisis data lokal dengan DuckDB

  • Awalnya saya hanya mencari dengan grep
    • Frasa “correct horse battery staple” muncul 231 kali di Hacker News
    • Kemunculan terakhirnya adalah item yang diposting “hari ini” pada saat tulisan ini dibuat
  • Setelah itu saya mencoba menganalisisnya dengan DuckDB
    • DuckDB adalah mesin eksekusi analitik cepat yang bisa di-embed dan juga tersedia sebagai alat baris perintah
    • Berkat UI barunya, alat ini mudah dipakai bahkan untuk pemula, dan LLM membantu menulis kueri SQL
  • Data JSON dimuat ke DuckDB dengan cara berikut
CREATE TABLE items AS
SELECT *
FROM read_json_auto('/home/jason/full.json', format='nd', sample_size=-1);
  • Kueri contohnya mengelompokkan item per minggu dan menghitung proporsi item yang memuat kata tertentu dibanding seluruh item
    • python, javascript, java, ruby, rust dicari dengan text ILIKE
    • Untuk tiap proporsi, dihitung rata-rata bergerak 12 minggu
  • Dengan cara yang sama, kata-kata terkait basis data juga divisualisasikan
    • Grafik contoh mencakup proporsi penyebutan rata-rata bergerak 12 minggu untuk mysql, postgres, mongo, redis, sqlite
  • DuckDB tampak sangat bagus untuk menganalisis dataset sebesar ini
  • Meski kini saya memiliki salinan lokal dari seluruh konten Hacker News, saya memutuskan proyek ini selesai sampai di sini

1 komentar

 
GN⁺ 2025-05-02
Komentar Hacker News
  • Saya tahu dua database yang memiliki tabel Hacker News yang diperbarui, yang memungkinkan menjalankan analisis tanpa perlu mengunduhnya terlebih dahulu
    BigQuery membutuhkan akun Google Cloud, dan kuerinya mungkin bisa dilakukan dalam tingkat gratis; gunakan bigquery-public-data.hacker_news.full
    ClickHouse tidak perlu mendaftar dan bisa menjalankan kueri langsung di browser: https://play.clickhouse.com/play?user=play#U0VMRUNUICogRlJPT...

  • Dulu saya pernah melakukan hal serupa dengan akun Twitter/Bluesky @fesshole. Saya mengunduh seluruh arsipnya dan melakukan fine-tuning model agar menghasilkan pengakuan yang lebih gila
    Saya cukup bangga, tetapi akhirnya sadar bahwa yang saya lakukan hanyalah mengajari mesin polos tentang masturbasi dan perceraian
    Rasanya seperti adegan di film fiksi ilmiah ketika alien atau AI supercerdas melihat sejarah manusia dengan sangat cepat lalu memutuskan bahwa kita tidak layak diselamatkan

    • Terkait bagian “mengajari mesin polos tentang masturbasi dan perceraian”, bayangkan kita menemukan flash drive dari peradaban yang sudah lama punah lalu melatih model dengan data teks di dalamnya
      Jika sama sekali tidak ada keterhubungan dengan dunia luar terkait data itu, bagaimana manusia atau model bisa tahu bahwa flash drive tersebut berisi data tentang masturbasi dan perceraian?
    • Saya tidak mengerti apa masalahnya dengan masturbasi dan perceraian. Masing-masing adalah cara agar orang bisa hidup lebih bahagia dan mandiri, serta cara keluar dari situasi yang tidak cocok
      Saya melihat keduanya secara keseluruhan positif, dan bersyukur bisa hidup di masyarakat tempat hal-hal seperti ini dinormalisasi
  • Kueri Java juga mencakup semua kemunculan JavaScript, jadi Java menjadi terambil secara berlebihan

    • Demikian pula, kueri Rust juga akan mencakup banyak kata seperti trust, antitrust, dan frustration
    • Benar… kalau begitu, terlihatnya tren menurun mungkin justru lebih tak terduga
  • Bahwa ada file JSON 20GiB yang berisi semua yang pernah terjadi di Hacker News terasa mengejutkan besar, mengingat situs ini hanya berisi teks
    Apakah itu berarti selama 18 tahun keberadaan HN, orang-orang telah mengunggah lebih dari 20 miliar byte teks? Rata-rata lebih dari 2MB per hari, sekitar 7,5KB per detik

    • 2MB per hari tidak terlihat terlalu banyak. Apalagi setelah insiden Reddit, dengan datangnya “September tanpa akhir” terbaru dan terbesar, jumlah posting kemungkinan besar meningkat secara eksponensial selama beberapa tahun
      Selain itu, cukup banyak di antaranya mungkin bukan manusia. /newest penuh dengan spam bot
    • 7,5KB/s, alias 7.500 karakter per detik, terdengar tidak realistis, jadi saya menghitungnya[0], dan ternyata sebenarnya mendekati sekitar 34 byte per detik, alias 0,03KB/s
      Itu pun mencakup metadata dan sintaks JSON, jadi jumlah teks sebenarnya pasti lebih rendah lagi. Perhitungan “lebih dari 2MB per hari” memang benar
      [0] Sebenarnya perhitungannya dilakukan ChatGPT, tapi kelihatannya benar: https://chatgpt.com/share/68124afc-c914-800b-8647-74e7dc4f21...
    • Arsip lengkap Reddit, tepat sebelum API-nya dihapus, berukuran sekitar 4TB dalam kondisi terkompresi. Dulu di-host di the-eye, dan kalau mau masih ada tempat untuk men-torrent file-nya
      Banyak di antaranya memang sampah, tetapi data awal sebelum 2018–2019, terutama sebelum bot yang lebih pintar bermunculan, tampaknya layak ditelusuri
    • JSON 20GB itu mengejutkan. Saya punya file SQLite berisi semua data HN dan ukurannya 20GB, jadi kalau JSON rasanya seharusnya jauh lebih besar
    • Ukuran totalnya justru terasa kecil. Ini hasil kontribusi ratusan ribu anggota aktif dan total jutaan orang selama hampir 20 tahun
      Menurut standar sebelum Facebook, HN mungkin merupakan jejaring sosial yang cukup besar, dan karena skalanya pas serta dikelola dengan aktif, nilainya juga relatif tinggi
      Pada 2019, ketika Google+ ditutup, saya pernah memodelkan berapa banyak data teks yang dikontribusikan ke situs itu
      Yang dimaksud data teks di sini mengecualikan media seperti gambar, audio, video, serta elemen halaman tambahan seperti kerangka HTML, CSS, dan JS
      Mengingat tingkat partisipasinya sangat rendah dan rata-rata posting sekitar 120 karakter, riwayat 7 tahun dari puluhan juta akun aktif pun hanya beberapa GiB. Profil terdaftar memang lebih dari 4 miliar, tetapi aktivitas nyatanya jauh lebih kecil
      Archive Team melakukan upaya pelestarian Google+ secara terpisah meski bekerja sama dengan Internet Archive, dan hasilnya campuran. Banyak konten terselamatkan, tetapi jauh lebih banyak yang terlewat; komentar hampir tidak tersisa; thread dipotong menjadi kira-kira 10 yang terbaru; dan karena tidak ada pencarian, secara umum kegunaannya rendah. “Vanity accounts” yang memakai nama akun pilihan alih-alih hash acak bahkan lebih sulit diakses
      Selain itu, dengan men-scrape seluruh halaman untuk mereproduksi tampilan online-nya, kebutuhan penyimpanan meningkat drastis, sementara banyak hal yang justru membuat situs itu menarik malah terlewat
      Bahkan ketika hendak menyimpan kontribusi teks dari populasi besar, kebutuhan penyimpanannya cukup modest. Misalnya rata-rata waktu online per hari 45 menit, kecepatan mengetik 45wpm, dan hanya separuh waktu online dipakai untuk menulis alih-alih membaca, itu sekitar 1.000 kata per orang per hari, alias sekitar 6KiB. Per 1.000 orang menjadi 6MiB, per 1 juta orang 6GiB, dan per 1 miliar orang sekitar 6PiB
      Nilai sebenarnya hampir pasti lebih rendah. Waktu menulis terlalu dilebih-lebihkan dan kemungkinan nyatanya lebih dekat ke 10%, sementara kecepatan input mobile juga mungkin sekitar 20–30wpm. Misalnya di Facebook ada sekitar 2,45 miliar “potongan konten” per hari, dan separuhnya adalah video. Jika diasumsikan 120 karakter per posting, data teksnya jauh di bawah 300GiB per hari—jumlah yang mengejutkan kecil
      Sebagian besar sistem pengumpulan data dan kapitalisme pengawasan saat ini diisi oleh data yang tidak diketik langsung oleh manusia, seperti lokasi, video, interaksi online, dan perdagangan
  • Apa netiket saat mengunduh HN? Haruskah bertanya dulu kepada dang sebelum membebani server?
    Atau boleh diasumsikan bahwa perusahaan teknologi bernilai miliaran dolar sudah melakukannya berkali-kali, jadi tidak akan terlihat?

    • Seperti disebut di artikel, HN punya API, bahkan tanpa rate limit. Semua datanya di-host di Firebase, perusahaan YC, jadi tidak masalah
    • Secara harfiah ada database publik
      https://console.cloud.google.com/marketplace/product/y-combi...
    • Tidak bisa dikesampingkan juga kemungkinan bahwa lembaga tiga huruf sudah mencocokkan alias HN dengan nama asli
    • Namanya Hacker News, jadi setidaknya hacking dalam arti baik adalah fair game
    • Kalau ada di web publik, sudah ada ribuan bot yang men-scrape-nya
  • Saya pernah melakukan hal serupa. Saya memakai trik dengan dataset BigQuery; entah kenapa datanya terus diperbarui, lalu saya mengekspor datanya ke Parquet, mengunduhnya, dan menjalankan kueri dengan DuckDB

    • Itu bukan trik, cuma pilihan yang praktis
  • “Sekarang setelah semua konten Hacker News diunduh secara lokal, kita bisa melatih ratusan bot berbasis LLM dan menjalankannya sebagai kontributor, lalu secara perlahan dan tak terelakkan mengganti semua teks manusia dengan keluaran vibrator Chinese room yang selamanya menggemakan dan mendaur ulang masa lalu”—itu memang lelucon, tetapi saya takut suatu hari nanti ada yang akan mencobanya
    Saya berharap itu tidak terjadi, tetapi kalau terjadi, bisakah kita menghentikannya?

    • Saya makin percaya pada sebuah ide lama yang kian penting seiring waktu: membuat jaringan kepercayaan di antara manusia, sehingga sebuah akun bisa diverifikasi lewat jalur seperti: dipercaya oleh seseorang yang tidak saya kenal, orang itu dipercaya oleh seseorang yang saya kenal, dan orang tersebut saya percayai
      Ada banyak masalah yang harus diselesaikan, dan privasi salah satunya. Relasi koneksi tidak perlu dibuka kepada pengguna, tetapi dalam implementasi yang naif, data itu akan tetap ada di server
      Jalur ketidakpercayaan juga bisa ditambahkan sebagai bobot negatif. Jika Anda tidak memercayai seseorang secara langsung atau tidak langsung, nilai rantai kepercayaan yang menghubungkan Anda dan orang itu akan turun
      Karena ini sebuah jaringan, sistem dapat menyesuaikan diri terhadap upaya manipulasi, tetapi seberapa tangguh sistemnya masih menjadi pertanyaan
    • Bagaimana kita tahu bahwa ini belum terjadi?
      Komentar yang panjang dan berisi biasanya masih bisa dibedakan, tetapi sudah jauh lebih sulit dibanding 1–2 tahun lalu. Untuk komentar pendek satu atau dua kalimat, menurut saya LLM kini sudah cukup bagus untuk lolos seperti manusia
    • LLM kita hanya bisa memberikan hasil yang terverifikasi dari berbagai sumber, jadi yang keluar hanyalah respons rata-rata manusia
      Sebaliknya, banyak komentar di HN berisi wawasan yang cukup unik dan menyimpang dari pemikiran populer rata-rata. Jika LLM mencoba menirunya, yang keluar hanya omong kosong
      Jika ditambahkan filter yang hanya meloloskan jawaban yang rasional dan masuk akal dari omong kosong itu, jawabannya akan menjadi membosankan dan tetap nyaris omong kosong
      Agar jawabannya akurat, presisi, dan unik, harus memakai sesuatu yang bukan LLM
    • HN sudah memiliki sistem imun yang cukup baik terhadap hal semacam ini. Komentar berupaya rendah dan repetitif cepat mendapat downvote, dilaporkan, dan terkena rate limit
      Heuristik karma dan kecepatan situs ini memang kasar dibanding machine learning yang canggih, tetapi berfungsi karena komunitasnya lebih kecil dibanding Reddit atau Twitter dan moderator turun tangan langsung
      Agar gerombolan akun palsu LLM bisa “menggantikan” teks manusia, mereka harus terus memposting tulisan yang benar-benar dianggap menarik oleh orang. Kalau tidak, mereka akan dibatasi atau diam-diam disingkirkan jauh sebelumnya
      Bahkan menjaga beberapa akun AI tetap hidup pun biaya marjinalnya besar. Menjalankan inferensi pada puluhan thread baru selama 24 jam tidak gratis, dan menjaga agar keluarannya tidak tergelincir menjadi sampah SEO generik juga ternyata sulit
      Imbalannya juga praktis tidak ada. Trafik HN tidak bisa dimonetisasi, dan karma adalah mata uang yang buruk bagi operator bot
      Apakah kita bisa menghentikan pelaku jahat yang gigih dan punya sumber daya? Mungkin bisa, tetapi penanggulangannya akan sama seperti sekarang: rate limit yang kuat, batasan lebih ketat untuk akun baru, peninjauan oleh moderator manusia, dan mungkin sedikit analisis gaya tulisan
      Ini akan merepotkan pengguna baru yang sah, tetapi tidak mematikan. Pada akhirnya HN bertahan karena manusia yang ada di sini ingin membaca tulisan manusia lain. Jika komentar mulai terdengar seperti burung beo probabilistik, pembaca akan mengabaikan atau melaporkannya, dan bot-bot itu akan berbicara satu sama lain
      Ditulis oleh GPT-3o
    • Ada hal-hal yang sudah meramalkan arus seperti ini, seperti franchise Metal Gear[0] dan teori internet mati[1]
      “Di Metal Gear Solid 2, naskah ambisius Hideo Kojima kadang dinilai sebagai salah satu contoh pertama video game postmodern, dan juga dinilai telah mengantisipasi konsep seperti politik pascakebenaran, berita palsu, echo chamber, dan fakta alternatif”
      [0] https://en.wikipedia.org/wiki/Metal_Gear
      [1] https://en.wikipedia.org/wiki/Dead_Internet_theory
  • Dalam beberapa tahun ke depan, saya rasa banyak API akan mulai menyediakan opsi untuk sekadar mengembalikan file DuckDB
    Kalau pada akhirnya JSON akan dimuat ke database, tidak ada alasan untuk tidak menerima database sebagai respons

    • zstd Parquet yang diekspor dari file DuckDB 1.2 terkompresi 2–3 kali lebih baik
  • Saya berharap orang tidak memakai grafik bertumpuk. Menurut saya hampir mustahil untuk tidak mendistorsi kesan pembaca
    Karena sangat sulit memperkirakan tinggi titik data tertentu di tengah noise, dan grafik itu mengisyaratkan dependensi yang kemungkinan tidak ada

    • Itu juga pikiran pertama saya. Pembuat uPlot punya demo yang menunjukkan jebakannya dengan baik: https://leeoniya.github.io/uPlot/demos/stacked-series.html
    • Benar :( Namun ketika data yang sama digambar sebagai grafik garis, terlalu banyak yang saling tumpang tindih sehingga sulit melihat apa pun
      Berikutnya saya sedang mempertimbangkan pendekatan menumpuk beberapa grafik garis yang disejajarkan, masing-masing hanya berisi satu seri per wilayah
    • Pendekatan 3D adalah titik di mana masalah ini terpecahkan. Ditumpuk tetapi diberi sedikit offset; tidak ada yang lebih baik untuk memahami data berskala besar sekaligus dengan memakai teknologi game engine untuk business intelligence nyata
      Lihat karya di https://flowimmersive.com/
    • Bagaimana menurut kalian tentang plot bertumpuk dengan sumbu y logaritmik? Beberapa eksperimen fisika selalu melakukannya seperti ini[1], tetapi rasanya cukup tidak intuitif
      [1]: https://atlas.web.cern.ch/Atlas/GROUPS/PHYSICS/PUBNOTES/ATL-...
  • Dulu saya pernah membuat satu, dan https://github.com/ashish01/hn-data-dumps cukup menyenangkan
    Fitur yang akan keren jika diimplementasikan adalah mencerminkan fakta bahwa item yang lebih baru lebih sering diperbarui seiring waktu, sehingga item yang baru diunduh menjadi cache usang lebih cepat daripada item lama

    • Senang sekali HN menyediakan API seperti ini tanpa menguncinya seperti banyak situs lain
      Saya memakai fungsi berbasis usia untuk menentukan keusangan. Awalnya, item dianggap usang mulai 1–2 menit setelah dibuat, lalu diperbarui sering selama beberapa hari, kemudian cepat menurun setelah minggu pertama, dan setelah sekitar 2 minggu diperlakukan sebagai tidak berubah
      // DefaultStaleIf marks stale at 60 seconds after creation, then frequently for the first few days after an item is
      // created, then quickly tapers after the first week to never again mark stale items more than a few weeks old.
      const DefaultStaleIf = "(:now-refreshed)>" +
      "(60.0*(log2(max(0.0,((:now-Time)/60.0))+1.0)+pow(((:now-Time)/(24.0*60.0*60.0)),3)))"
      https://github.com/jasonthorsness/unlurker/blob/main/hn/core...