Memvisualisasikan semua buku dunia di ISBN-Space
(phiresky.github.io)- Untuk menjelajahi data lebih dari 100 juta buku yang ditangani Anna’s Archive dalam satu layar, diperlukan pendekatan yang mengubah ruang pengenal terbatas bernama ISBN menjadi peta
- ISBN13, jika mengecualikan prefiks
978-/979-dan checksum terakhir, adalah ruang satu dimensi dengan sekitar 2 miliar slot, dan rentang negara serta penerbit dialokasikan per unit prefiks - Tata letak per baris sederhana atau Hilbert curve dapat membuat struktur ISBN lebih sulit dilihat, sehingga digunakan Bookshelf-Curve yang memindahkan digit desimal ke koordinat 2D
- Tile peta disediakan sebagai berkas statis PNG dan JSON, dan shader WebGL/GLSL menangani rendering dan filtering seperti tahun terbit, rasio kepemilikan, perbandingan dataset, dan penyorotan penerbit secara instan
- Diimplementasikan sebagai frontend statis berbasis ThreeJS, React, MobX, dan react-threejs-fiber, dengan optimasi performa render teks dalam jumlah besar dan perpindahan zoom yang sangat menentukan kegunaan nyata
Mengapa menjadikan ruang ISBN sebagai objek visualisasi
- Perpustakaan telah lama mengumpulkan pengetahuan umat manusia, dan di era digital, pengumpulan karya secara menyeluruh yang memenuhi kriteria tertentu bisa menjadi mungkin
- Anna’s Archive, salah satu shadow library, membutuhkan visualisasi yang dapat menjelajahi lebih dari 100 juta buku sekaligus
- Data target mencakup judul, penulis, negara, penerbit, waktu terbit, jumlah perpustakaan yang memilikinya, dan ketersediaan digital
- Visualisasi interaktif mendukung pemilihan dataset, pencarian buku individual, pemfilteran tahun terbit, dan visualisasi gabungan berbasis shader kustom
- Saat diperbesar maksimal, tampilannya berubah sehingga setiap buku tampak seperti disusun di rak buku
Struktur ISBN
- ISBN13 adalah nomor 13 digit yang diberikan pada hampir semua buku terbitan
- Saat ini, tiga digit pertama ISBN13 tetap
978-atau979-, dan digit terakhir adalah checksum - Karena itu, ruang ISBN13 yang sebenarnya dapat dipandang memiliki sekitar 2 miliar slot
- Prefiks
978-dan979-muncul karena ISBN13 merupakan subset dari European Article Number, dan prefiks tetap ini disebut Bookland - Blok ISBN besar dialokasikan oleh International ISBN Agency ke organisasi internasional, lalu tiap negara membaginya lagi per penerbit
- Blok ISBN selalu dialokasikan berdasarkan unit prefiks
978-4dialokasikan ke Jepang- Jepang mengalokasikan
978-4-312ke satu penerbit - Penerbit tersebut dapat mengalokasikan item dalam rentang
000000-99999untuk membuat ISBN seperti978-4-312-99999-X
- Semakin panjang prefiks negara, semakin sedikit jumlah buku yang bisa dialokasikan di dalamnya
- Jepang memiliki ruang ISBN sebanyak 100 juta
- Singapura dimulai dengan prefiks
978-9971-sehingga hanya memungkinkan 100 ribu ISBN
Cara membentangkan ISBN satu dimensi menjadi dua dimensi
- Jika prefiks
978-/979-dan checksum dihapus, ISBN menjadi nilai satu dimensi desimal antara 0 hingga 2 miliar - Cara paling sederhana adalah mengisi piksel per baris dari atas, tetapi area kecil akan memanjang secara horizontal sehingga struktur ISBN sulit dilihat
- Hilbert curve membuat area kecil lebih mendekati persegi, tetapi dapat menimbulkan artefak struktur spasial yang tidak ada di data
- Untuk menghindari struktur yang tidak ada di data, visualisasi ini menggunakan Bookshelf-Curve yang memanfaatkan sifat desimal ISBN
Bookshelf-Curve
- Bookshelf-Curve menempatkan
0-9dari digit desimal pertama secara mendatar, lalu0-9dari digit berikutnya secara vertikal ke atas-bawah, dan pola ini diulang secara rekursif - Untuk mempertahankan rasio persegi panjang dua tingkat, rasio aspek tiap blok harus
√10, yaitu sekitar 3.16:1 - Struktur ini mirip konsep rasio aspek rekursif pada kertas A4, tetapi alih-alih dibagi dua, dibagi menjadi 10 bagian
- Transformasi koordinat sederhana karena dilakukan dengan memakai digit-digit ISBN secara selang-seling sebagai koordinat
- Kode implementasinya menjadi 50 baris karena upaya generalisasi, tetapi prinsipnya cukup mudah dipahami sampai seseorang bisa menelusuri posisi ISBN tertentu secara manual
Tile peta dan encoding data
- Gambar tile dibuat untuk setiap prefiks ISBN
- Ukuran target tile sekitar
100kB, dan hasilnya ukuran tile menjadi2000 × 633piksel - Informasi yang disimpan di piksel berbeda untuk tiap dataset
- Dataset tahun terbit menyimpan nilai setelah
1800dikurangi dalam rentang 8-bit - Kanal merah menyimpan rata-rata tahun terbit buku dalam piksel tersebut
- Kanal biru menyimpan rasio buku yang ada
- Misalnya, jika 50% buku ada, maka nilai kanal biru adalah
127/255
- Dataset tahun terbit menyimpan nilai setelah
- Pada level zoom maksimum, 1 buku dipetakan ke 1 piksel untuk menjaga akurasi
Rendering berbasis shader GLSL
- Awalnya data RGB disimpan langsung di tile, tetapi untuk meningkatkan fleksibilitas, disimpan data yang lebih abstrak dan rendering aktual dilakukan di GLSL fragment shader pada GPU
- Pendekatan ini memungkinkan pemilihan palet warna belakangan, penerapan transformasi dan filter seketika, atau penggabungan beberapa dataset secara langsung
- Data tahun terbit menyimpan rentang
1800-2055, tetapi 95% data berada di rentang1985-2024, sehingga shader dapat meringkas tampilan ke rentang ini - Fungsi
heatmapColor(float)mengubah nilai0-1menjadi skala warna pilihan pengguna - Sintaks
$dataset_xbukan sintaks GLSL asli, melainkan sintaks template sederhana berbasis regex agar hanya gambar yang benar-benar dibaca shader yang dimuat - Di opsi ⚙️ Advanced pada visualisasi, shader dapat diedit langsung dan hasil perubahannya tercermin secara real-time
- Arti tiap piksel dataset dirangkum di README
Membuatnya tampak seperti rak buku saat diperbesar
- Pada tampilan yang diperbesar penuh, setiap piksel diberi gaya agar tampak seperti buku
- Setiap buku dibuat memiliki lebar, tinggi, dan pola acak
- Bentuknya tidak persis sama dengan buku nyata, tetapi membuat layar pada zoom maksimum terlihat seperti adegan yang lebih hidup
- Semua styling ini diimplementasikan di shader
- Karena hasil pembangkit angka acak yang sama dibutuhkan di GLSL dan JavaScript, bagian menghitung tinggi buku agar batas teks cocok menjadi rumit
- Dengan mengirim nilai zoom saat ini sebagai uniform dan melakukan fade-in di antara dua level zoom, gaya rak buku bisa dimunculkan dengan halus
Teks, struktur pohon, dan performa
- Seperti tile gambar, teks juga dirender dalam struktur hierarkis berdasarkan level zoom dan view frustum culling
- Implementasinya memakai react-threejs-fiber
- React menambahkan elemen adegan secara rekursif saat tampilan berpindah, menyusun Plane, teks HTML, dan node prefiks anak untuk tiap prefiks
- Saat harus merender banyak teks, pada awalnya muncul masalah performa besar
- Pendekatan terbaik adalah memasukkan HTML ke dalam
<foreignObject />milik SVG, merendernya ke canvas dengandrawImage, lalu memuatnya sebagai tekstur - Pendekatan ini berhasil, tetapi menciptakan delay 20ms secara sinkron setiap kali selama proses rendering
- Karena SVG tidak bisa digambar di WebWorker, sulit memindahkannya ke WebWorker
- Masalah performa nyata sebagian besar teratasi dengan mengurangi jumlah elemen HTML, membatasi konten DOM yang ditambahkan per frame, dan terutama menghapus tumpukan filter CSS
text-shadow
Barcode dan rentang penerbit
- Pada zoom maksimum, setiap buku menampilkan barcode
- Barcode ditambahkan untuk memperkuat gagasan bahwa buku-buku diurutkan berdasarkan ISBN
- Alih-alih pustaka rendering barcode, digunakan font TTF Libre Barcode yang merender angka 13 digit menjadi barcode sekaligus menghitung check digit
- Berkat optimasi rendering teks pada sistem operasi, cara ini praktis dan berkinerja baik
- Tiap grup biasanya memiliki rentang besar setingkat negara, dan penerbit memiliki rentang yang lebih kecil di dalamnya
- Grup dan penerbit masing-masing diberi warna acak yang unik
- Meski satu penerbit memiliki beberapa rentang, warna yang digunakan tetap sama
- Untuk menyorot semua rentang sekaligus, setiap penerbit diberi ID unik lalu disimpan sebagai komponen RGB
- Warna penerbit masih menyisakan beberapa hal yang belum memuaskan
- Warna penerbit berbenturan dengan skala warna heatmap
- Rentang negara sulit dilihat
Navigasi pencarian dan jalur terbang
- Saat mencari buku atau mengeklik minimap, tampilan akan terbang berpindah ke lokasi tersebut
- Menghitung jalur terbang yang enak dilihat ternyata lebih sulit dari dugaan
- Pencocokan parabola menghasilkan hasil yang biasa saja, lalu dicoba pendekatan yang memakai ruang transformasi terpisah
- Hasil akhirnya belum sempurna dan terasa agak over-engineered dengan sekitar 500 baris kode, tetapi bekerja lebih baik daripada pendekatan awal
Arsitektur dan pipeline pemrosesan
- Backend tidak diperlukan
- Tile gambar disimpan sebagai PNG
- Pohon data disimpan sebagai JSON
- HTML, JS, CSS, PNG, JSON cukup diunggah ke host berkas statis seperti GitHub Pages
- Frontend memakai ThreeJS, React, dan MobX
- Kombinasi ini nyaman untuk membangun adegan 2D/3D deklaratif akselerasi-GPU yang reaktif dengan komponen yang dapat digunakan ulang
- Skrip pemrosesan sebagian besar ditulis dalam JS dan langsung menghasilkan JSON serta PNG
- Beberapa skrip ditulis dalam Rust karena harus membaca berkas sumber 250GB dan mengeluarkannya ke SQLite
Hasil dan kode
- Hasil akhirnya menjadi cara yang fleksibel untuk memvisualisasikan buku terbitan yang memiliki ISBN
- Proyek ini dimungkinkan karena ISBN dirancang sebagai ruang pengenal yang nyaris cukup kecil
- Jika pekerjaan yang sama dilakukan dengan UUID, sebagian besar ruangnya akan menjadi kosong besar
- Kode sumber tersedia secara publik di isbn-visualization
1 komentar
Komentar Hacker News
Saat memulai Amazon, saya sebenarnya ingin melakukan hal persis seperti ini, tetapi alih-alih ISBN, saya ingin memakai klasifikasi tiga tingkat Library of Congress
Pada akhirnya, penyedia data Baker & Taylor dan Books In Print menggabungkan klasifikasi tiga tingkat itu menjadi satu string, sehingga batas-batasnya tidak bisa ditemukan secara stabil, dan kami harus menyerah bahkan sebelum benar-benar memulainya
Menerapkan penjelajahan bergaya “terbang” seperti ini di web versi 1994–1995 juga jelas tidak akan mudah, jadi ini pekerjaan yang keren
Saya cukup banyak melihat LoC Classification dan LoC Subject Headings, dan sayang sekali keduanya tidak tersedia secara bebas dalam format yang berguna untuk dibaca mesin. Untuk PDF, sampai batas tertentu bisa diakali
Khususnya bagian hukum negara bagian (state law) dalam Classification memiliki kepadatan klasifikasi yang sangat tidak merata antarnegara bagian; seingat saya NY dan CA jauh lebih kompleks, PA berada di posisi ketiga yang agak tertinggal, sementara banyak negara bagian “flyover” nyaris menggelikan karena begitu sederhana dan mirip satu sama lain. Ini tampaknya mencerminkan kompleksitas undang-undang tertulis, regulasi, dan hukum preseden di masing-masing negara bagian
Fakta historis lain yang menarik: sistem klasifikasi dan pembagian tingkat teratas secara alfabetis tampaknya berasal langsung dari perpustakaan pribadi Thomas Jefferson, yang menjadi asal-usul LoC
Jika tertarik, laporan tahunan Librarian of Congress kepada Kongres yang ada di Hathi Trust memuat banyak sejarah perkembangan dan perluasan Classification
Classification: <https://www.loc.gov/catdir/cpso/lcco/>
Subject headings: <https://id.loc.gov/authorities/subjects.html>
Annual reports — Recent: <https://www.loc.gov/about/reports-and-budgets/annual-reports...> / Historical archive to ~1866: <https://catalog.hathitrust.org/Record/000072049>
Mereka salah satu perusahaan paling tertinggal secara teknis yang pernah saya ajak bertransaksi, dan bahkan sampai saya menutup akun pada awal 2020, pesanan pembelian dan rekonsiliasi masih diproses lewat kertas, PDF, dan email. Seingat saya, suatu waktu mereka juga pernah meminta dokumen dikirim lewat faks
Karena tidak jarang ISBN dialokasikan ganda ke buku yang berbeda [0], ungkapan “semua buku di ruang ISBN” mungkin agak berlebihan
Ada juga buku dengan ISBN tidak valid yang digit pemeriksanya tidak cocok dengan sisa ISBN. Jika memperbaiki digit pemeriksa itu justru membuatnya cocok dengan buku lain, maka buku tersebut akan berada di luar ruang ISBN yang diasumsikan oleh artikel blog ini
[0] https://scis.edublogs.org/2017/09/28/the-dreaded-case-of-dup...
Saat melihat ISBN terendah yang diketahui dari penerbit Ceko, ada warna lain yang muncul, dan https://books.google.cz/books?vid=ISBN9788000000015&redir_es... tampaknya bukan ISBN yang valid :-) Namun saya tidak tahu apakah buku itu memang memuat ISBN palsu yang begitu terang-terangan, atau ini kesalahan data Google Books
Presentasinya mengesankan
Namun tampilan ini bukan katalog ISBN lengkap, melainkan hanya mencerminkan koleksi Anna's Archive. Karena bias pengumpulan Anna, terlihat kecenderungan ke rentang bahasa tertentu, dan area yang ditandai hitam adalah item yang tidak ada di arsip
Basis data metadata itu berasal dari berbagai sumber, dan sejauh yang saya tahu cukup lengkap. Area hitam kemungkinan besar adalah wilayah yang memang tidak memiliki buku yang dialokasikan
Benar-benar keren, proyek penuh semangat yang menakjubkan sekaligus sumber daya yang luar biasa
Saat diperbesar, judul dan barcode terlihat, dan saat kursor diarahkan, sampul serta detailnya juga muncul. Hampir semua yang bisa diharapkan sudah ada
Sebagai ide perbaikan, akan bagus jika ada kotak centang untuk menyembunyikan panel putih mengambang di kiri atas dan elemen di kanan atas. Saya suka “tenggelam” dalam visualisasi seperti ini, tetapi elemen mengambang itu sedikit menarik saya keluar dari pengalaman tersebut, sehingga kesenangan dan fungsionalitasnya sedikit berkurang
Ini adalah kasus penggunaan yang sangat cocok untuk Microsoft Silverlight PivotViewer, antarmuka web hebat yang dulu dipakai di bidang neuroimaging sebelum dihentikan Microsoft
Ada presentasi TED yang mengesankan dari Gary W. Flake yang menunjukkan cara menggunakannya
https://m.youtube.com/watch?v=LT_x9s67yWA
Ada juga makalah IEEE yang ditulis pada 2011. Sayang sekali ini bukan standar web
https://www.dropbox.com/scl/fi/bl8zkjs3y47q3377hh3ya/Yan_Wil...
Visualisasi yang sangat keren
Ada kiriman-kiriman lain yang lebih keren di sini: https://software.annas-archive.li/AnnaArchivist/annas-archiv...
Karya saya ada di https://isbnviz.pages.dev
Jika diperbesar, tampilannya seperti rak buku. Benar-benar keren
Luar biasa. Rasanya seperti Library of Babel versi dunia nyata: https://libraryofbabel.info/
Di antara segala omong kosong VR, saya rasa saya mungkin mau membayar untuk perpustakaan tak terbatas atau museum tak terbatas di dunia nyata
Akan jauh lebih menarik jika ini adalah proyek yang memberi akses ke semua teks yang dapat diunduh dan disediakan secara legal. Misalnya sebagai antarmuka untuk tempat seperti ini:
https://onlinebooks.library.upenn.edu/
Presentasi dalam format saat ini terasa sedikit membanjiri
Butuh waktu bagi saya untuk memahami bahwa bagian preset di kiri atas sebenarnya mengarah ke sumbu visualisasi data tambahan seperti apakah AA disertakan, kelangkaan, dan apakah Google Books disertakan. Meski begitu, visualisasi dan kedalaman datanya sangat kaya
Saya juga menyukai https://archive.anarchy.cool/blog/all-isbns.html#visualizing yang menunjukkan tampilan klaster regional
Preset tahun juga menarik dengan sendirinya untuk melihat aktivitas penerbitan per wilayah. Poland tampak sangat aktif belakangan ini, sementara Norway terlihat relatif sepi. China tampaknya mulai meningkat sekitar 2005 dan berkembang sangat besar dalam 10 tahun terakhir
Ada juga hal yang aneh di United States. Saya belum pernah mendengarnya, tetapi Blackstone Audio, Blurb Inc., dan Draft2Digital menerbitkan ISBN dalam jumlah sangat besar
Tampilan yang sedikit lebih minimalis (lebih sedikit warna, dan hanya menampilkan satu level teks pada satu waktu) ada di sini:
https://phiresky.github.io/isbn-visualization/?dataset=all&g...
Sepertinya masih bisa disetel lagi, misalnya dengan menyembunyikan sebagian teks seperti bagian N publishers, atau mengurangi informasi saat mouse over
Jalur terbang dapat dipikirkan cukup masuk akal jika dimodelkan sebagai gerakan di atas bidang setengah atas hiperbolik. Ambil x sebagai posisi pada lintasan linear di antara titik akhir, dan y sebagai panjang salah satu sisi viewport
Saya memikirkan dua metrik yang ternyata menjadi sama. Pertama, dengan mengasumsikan peta tile hierarkis dan meminimalkan jumlah tile yang dimuat. Jika y digunakan sebagai panjang sisi viewport, biaya bergerak horizontal sejauh x adalah x/y tile, dan jika memperbesar/memperkecil dari y_0 ke y_1, jumlah tile yang dimuat adalah abs(log_2(y_1/y_0)), sehingga cocok dengan ds = dy/y. Jika digabung, ds^2 = (dx^2 + dy^2)/y^2, persis metrik bidang setengah atas
Cara lain adalah melihatnya sebagai upaya meminimalkan “aliran optik” viewport dalam suatu pengertian. Ini juga menghasilkan metrik yang sama, hanya berbeda skala. Jika melakukan panning sejauh x tanpa zoom, semuanya bergerak sebesar x/y, yaitu rasio terhadap viewport. Jika memperbesar k kali, piksel di (u,v) berpindah ke (ku,kv), sehingga perpindahannya adalah (u,v)(k-1). Jika panjang sisi berubah dari y ke y+dy, hasilnya menjadi (u,v)dy/y, sehingga bergantung pada cara merata-ratakan perpindahan, itu menjadi kelipatan konstanta tertentu dari dy/y
Maka geodesik yang diinginkan adalah horocycle, yaitu lingkaran yang berpusat di y=0, tetapi perlu sedikit pekerjaan untuk menghitung gerakan di sepanjang kurva. Jika mengambil busur dari θ_0 ke θ_1, total waktunya diperoleh dengan mengintegralkan dtheta/y = dθ/sin(θ), jadi untuk akurat perlu membalik t = ln(csc(θ)-cot(θ)). Saya pikir lebih baik memakai aproksimasi, tetapi Mathematica memberi tahu bahwa θ = atan2(1-2e^(2t), 2e^t), jadi tidak terlalu buruk
Dibandingkan dengan logika “blub space”, metrik efektif di sana tampaknya ds^2 = dz^2 + (z+1)^2 dx^2. Itu adalah koordinat polar dengan z=1/y sebagai tingkat zoom, dan jika memakai dz=dy/y^2, maka ds^2 = dy^2/y^4 + dx^2*(1/y^2 + ...). Dengan kata lain, implementasi yang ada tampaknya menghabiskan jauh lebih banyak waktu untuk panning pada tingkat pembesaran tinggi dibanding model hiperbolik. Biaya menurunkan dari 4x ke 2x adalah dua kali biaya menurunkan dari 2x ke 1x, padahal secara visual keduanya sama
Zoom mereka bukan faktor skala, melainkan sesuai dengan “y” saya, sehingga metriknya menjadi ds^2 = dy^2 + (C-y)^2 dx^2. Di sini C sedikit lebih besar daripada tingkat zoom maksimum. Ada juga penanganan khusus untuk saat kurva itu ingin zoom out lebih jauh
Jika dinormalisasi agar biaya melakukan panning sampai ujung saat sepenuhnya zoom out (zoom=1) sama, pada keadaan sangat diperbesar biaya panning hampir datar, sedangkan pada keadaan yang relatif tidak terlalu diperbesar biayanya lebih besar daripada model hiperbolik. Jadi ini tampaknya berkontribusi pada kesan bahwa untuk jarak pendek viewport bergerak sangat cepat, sedangkan untuk jarak panjang tampilannya hampir sepenuhnya zoom out. Karena tingkat pembesaran menengah kurang menguntungkan, lebih baik hampir sampai ujung