Notebook HTML reaktif
(maxbo.me)- Hanya dengan satu file HTML yang dijalankan browser, eksplorasi data, analisis, visualisasi, tata letak, dan distribusi bisa digabung dalam satu dokumen, sehingga alur notebook→alat penerbitan→PDF yang ada dapat dipersingkat
- Implementasi intinya menggabungkan sel echo yang menampilkan
styledanscriptdi layar,contenteditable, dan Observable Runtime untuk membuat sel reaktif yang dapat diedit cell(name, inputs, definition)mengikuti model dependensi Observable untuk menyusun unit eksekusi yang saling terhubung seperticounter, render FizzBuzz, sel tersembunyi, dan sel nilai perantara tanpa output- Dalam dokumen HTML yang sama, didemonstrasikan Observable Plot, TeX, Markdown, Graphviz, SQLite berbasis WASM, Python berbasis Pyodide, R berbasis WebR, Observable Inputs, hingga status Mutable
- Hasil akhirnya menjadi dokumen ilmiah dan teknis yang berjalan di browser tanpa platform terpisah, dan implementasinya kemudian dirilis sebagai pustaka
@celine/celine
Memangkas pemisahan notebook-penerbitan dengan satu file HTML
- HTML banyak digunakan untuk tata letak, tetapi relatif kurang dimanfaatkan sebagai platform eksplorasi data, analisis, dan visualisasi
- Alur kerja umumnya melewati beberapa alat
- Jika satu file HTML menangani ketiga tahap itu, prosedur manual, alat CLI, tahap CI, dan ketergantungan pada platform pihak ketiga bisa dikurangi
- Implementasi ini sangat dipengaruhi oleh Anton Zhiyanov lewat In-browser code playgrounds, Cristóbal Sciutto lewat Self-modifying HTML notes, serta Quarto dan Observable Framework
Membuat sel yang dapat diedit
- Langkah pertama adalah membuat elemen
styledanscripttetap terlihat di dalam dokumen dengan kelas CSSecho - Dengan font yang memiliki penyorotan sintaks bawaan dan atribut
contenteditable, ini bisa dipakai seperti editor kode dasar scriptyang dibericontenteditableakan dievaluasi ulang saat kehilangan fokusscriptyang ada disalin untuk membuat elemenscriptbaru, lalu yang asli dihapus- Cara ini diperlukan karena
evaltidak bekerja pada kode yang berisi pernyataanimport
- Untuk eksekusi berbasis Observable, dua pustaka dimuat
- Hanya dua simbol yang diekspos ke global:
librarydancell
Alur data reaktif berbasis Observable Runtime
- Fungsi
cell(name, inputs, definition, observerVisibility)mendefinisikan sel menggunakan cakupan modul Observable Runtime - Jika variabel dengan nama yang sama sudah ada, variabel lama diambil; jika belum, variabel baru dibuat lalu didefinisikan
- Berkat struktur ini, saat sel
contenteditabledievaluasi ulang, definisi baru akan diteruskan ke sel-sel yang terhubung
- Berkat struktur ini, saat sel
- Observable
Inspectordigunakan untuk menampilkan output sel di atas blokscript - Sel
counterdisusun sebagai generator asinkron yang mengeluarkan angka setiap 1 detik- Atribut
idpadascriptsama dengan argumennamepadacell - Jika nilai awal
idiubah lalu fokus dilepas, nilai baru akan diterapkan
- Atribut
- Sel yang bergantung pada
counterjuga bisa dibuat- Dengan memuat Hypertext Literal, nilai
counterdirender dalam bentuk FizzBuzz htlmengimplementasikan parser HTML5 dan menangani interpolasi dengan escape otomatis serta nilai nonserialisasi seperti event listener, objek style, dan node DOM
- Dengan memuat Hypertext Literal, nilai
Sel terlihat, sel tersembunyi, dan sel tanpa output
- Jika kelas
echotidak dipasang, definisi sel bisa disembunyikan sambil tetap mengamati output- Sel seperti ini dapat dipakai sebagai primitif rendering
- Jenis sel yang sama sekali tidak menampilkan output juga bisa dibuat
silent(name, inputs, definition)mengaturobserverVisibilitymenjadi tersembunyi agar bisa dipakai untuk menyimpan nilai perantara atau struktur data
- Sel dapat bekerja tanpa bergantung pada urutan deklarasi
- Dalam contoh, sel
reallyNegativebergantung pada selnegativeyang dideklarasikan kemudian
- Dalam contoh, sel
- Nilai sel yang sama juga dapat digunakan untuk output yang lebih kompleks
- Dengan memuat Observable Plot, array angka digambar sebagai grafik garis, lalu garis aturan vertikal ditampilkan pada posisi
counter % 40
- Dengan memuat Observable Plot, array angka digambar sebagai grafik garis, lalu garis aturan vertikal ditampilkan pada posisi
Perluasan output dokumen dan visualisasi
- Sel dapat mengembalikan elemen DOM apa pun
- Demo TeX, Markdown, dan Graphviz masing-masing mengembalikan elemen dengan bentuk berbeda
- Sel
texmengembalikan elemenspan - Sel
mdmengembalikan elementable - Sel
dotmengembalikan elemensvg
- Sel
- Sel dapat mengembalikan
Promiseatau melemparError- Observable
Inspectormenerapkan kelasobservablehq--runningpadadivdi luar sel yang sedang berjalan - Untuk sel error, kelas
observablehq--errorditerapkan - Dokumen memberi gaya sesuai status tersebut
- Observable
SQLite, Python, dan R di dalam browser
- Demo SQLite mengunggah Chinook sample database ke
https://maxbo.me/chinook.db, lalu melakukan query dengan klien SQLite berbasis WASM- Bisa dicoba menambahkan
WHERE Milliseconds < 1000000pada query SQL
- Bisa dicoba menambahkan
- Demo Python menggunakan distribusi CPython WASM Pyodide
- Pyodide menyertakan NumPy, Pandas, Matplotlib, scikit-learn, dan Scipy
- Plot yang dibuat sebelumnya dibuat ulang dengan Matplotlib dan modul Python
sqlite3
- Demo R menggunakan WebR
- Rendering ggplot2 belum berhasil diimplementasikan, tetapi dianggap mungkin
- Sel terkait tampak agak tidak stabil di iOS, dan tidak diteliti lebih lanjut
Input dan status yang dapat diubah
- Tipe sel
viewofdibuat untuk digunakan bersama Observable Inputs viewofmendeklarasikan dua sel reaktifNAME: nilai dari inputviewof NAME: elemen DOM itu sendiri
- Untuk menampilkan input di atas sel,
idsel harus diatur menjadiviewof NAME - Dalam contoh, input rentang dibuat dengan
Inputs.range([0, 100], { step: 1 }), lalu selrangePlotdiperbarui sesuai nilainya - Cara kerja Observable Inputs agak sulit dipahami, dan demo Synchronized Inputs bisa membantu
- Untuk kasus yang tidak cukup ditangani oleh alur data fungsional murni, helper
mutablejuga dibuatmutablemendaftarkan objekMutableyang mengeluarkan nilai baru saat nilainya berubah
Rilis pustaka dan slide presentasi
- Implementasi ini awalnya dipikirkan bernama
incel, tetapi kemudian ingin disebutceline - Pustakanya dirilis sebagai @celine/celine
- Dokumen ini didemokan di SydJS
- Juga disertakan kode untuk mengubah dokumen menjadi slideshow
Shift+N: mulai slideshow atau ke slide berikutnyaShift+B: ke slide sebelumnyaShift+E: keluar dari slideshow
- Sumber implementasinya dipublikasikan sebagai source code
1 komentar
Pendapat Hacker News
Saya sangat setuju dengan premis tulisan ini. HTML bisa menjadi fondasi yang sangat baik untuk notebook komputasional
Namun, saya kurang suka pilihan implementasi di sini. HTML yang dinamis dan reaktif bisa dibuat jauh lebih deklaratif daripada ini, dan meski Observable itu keren, ada sisi yang menyimpang dari JavaScript standar
Saya mulai membuat sistem HTML reaktif bernama Heximal, dan nantinya berencana menambahkan dukungan notebook juga. Ini adalah sistem deklaratif berbasis template HTML dan elemen kustom, dengan sistem ekspresi/reaktivitas berbasis proposal TC39 Signals di atasnya
https://github.com/elematic/heximal
Rasanya lebih seperti campuran HTMX, Tangle, Curvenote, dan Polymer; mungkin seperti inilah jadinya jika HTML sejak awal memang reaktif. Saya rasa ini cukup cocok untuk kasus penggunaan penyuntingan grafis dan notebook
Karena itu, ekspresi debugging JavaScript biasa berjalan dengan baik di Observablehq
https://github.com/observablehq/parser
Saya menyukai runtime Observable, jadi saya juga membuat decompiler yang bisa mengonversi dua arah antara source frontend dan representasi JS murni hasil kompilasi
https://observablehq.com/@tomlarkworthy/observablejs-toolcha...
Benar-benar keren. Saya terutama menyukai demo Python dan SQLite. Menarik bahwa ini berawal dari loop penyuntingan lewat web (TTW) lalu disebut quine; itu memang masuk akal, tetapi kelemahan utamanya adalah persistensi
TiddlyWiki pada dasarnya melakukan hal yang sama, tetapi menyimpan pekerjaan adalah masalah yang merepotkan. Sebab untuk mempertahankan sesuatu secara persisten, pada akhirnya diperlukan proses server headless terpisah
Ketika dulu ingin membuat sesuatu yang mirip[0], saya pribadi memulai dari persistensi, dan tentu saja itu berarti file. Maksudnya file teks polos yang bisa diedit dengan editor untuk programmer serta disimpan dan didistribusikan lewat sistem file. Dengan cara ini, kita bisa menghindari keharusan mengimplementasikan ulang editor untuk programmer di dalam browser, yang bukan hal sepele
Sebagai gantinya, muncul masalah harus menulis server yang cepat, tetapi itu juga masalah yang cukup menarik[1]. Di sini mereka menghindari masalah itu dengan memakai section contenteditable bawaan, tetapi setelah persistensi, ini adalah masalah terbesar berikutnya
Ketidakmampuan melakukan export di dalam skrip tertanam juga tampak seperti dinding yang sama. Agar tidak mengotori objek global window, fitur semacam ini akan berguna, dan dalam kasus penggunaan saya, itu juga akan membuat pembuatan kode lebih mudah
0 - Literate Markdown: https://simpatico.io/lit.md
1 - Reflector, server node kecil yang mengonversi, mengompresi, dan melakukan cache Markdown serta invalidasi melalui pengawasan file: https://simpatico.io/reflector
Saya menghargai pemikiran dan upaya yang dicurahkan, tetapi usability pendekatan ini buruk sekali. Saat sedang melakukan exploratory data analysis, saya tidak mengerti kenapa harus ikut memikirkan elemen styling
Di sinilah alasan mengapa alat seperti Jupyter Notebook berhasil. Meski begitu, saya sangat menghargai rasa ingin tahu dan upaya mengimplementasikan ide alternatif ini
Sebagai platform exploratory data analysis, ini memang belum cukup. Ini tidak memiliki reaktivitas instan dari editor kode web lengkap seperti Observable Notebooks, dan juga bukan Observable Framework yang menyediakan hot reloading berbasis file watching. Kernel Jupyter baru untuk Deno + VSCode juga memberikan pengalaman yang cukup mulus
Jadi untuk usability eksplorasi analisis, hmm… saya setuju ini buruk, tetapi menurut saya usability untuk distribusi tidak seburuk itu. Malah bagus. Karena ini hanya satu file. Jika ingin mengirim grafik dan hasil pengolahan data kepada seseorang, tidak perlu memelihara toolchain besar atau membayar layanan pihak ketiga; cukup lempar satu file HTML ke Slack atau host di suatu tempat
Fleksibilitas untuk menata hasil analisis juga memungkinkan publikasi di lingkungan yang gaya tampilannya penting, seperti blog atau makalah riset
ivorydiubah menjadiredlalu syntax highlighting berubah secara real-time menunjukkan hal ituSaya paham latar belakang sampai ke sini, tetapi sayang sekali framework dan library JavaScript tidak bisa lebih mudah dimainkan di browser. Pada akhirnya ini hanya JS, jadi seharusnya bisa dieksperimenkan cepat di lingkungan yang ringan. Pendekatan ini punya kekuatan dalam hal itu
Ini adalah cara untuk menghadirkan kembali kemungkinan HTML/JS yang playful dan eksperimental. Saya berharap ada lebih banyak upaya seperti ini daripada TS, rollup, webpack, dan sejenisnya
Tambahan: Setelah membaca sedikit lebih lanjut, ternyata ini diusulkan untuk analisis data. Menurut saya ini kurang cocok untuk penggunaan itu
Menurut saya ada nilai besar pada alternatif Jupyter Notebook yang tidak berakhir dibuang begitu saja. Pengalaman pengguna yang saat ini benar-benar buruk masih bisa diperbaiki. Pertanyaannya adalah apakah susunan ini lebih baik daripada kekacauan JSON Jupyter Notebook, dan secara pribadi saya cenderung menjawab ya
Pembuat asli Lit baru-baru ini meninggalkan Google, dan setahu saya sedang mengerjakan sesuatu yang sangat mirip
https://github.com/elematic/heximal
Saya suka format tulisan ini. Dimulai dari dasar lalu disusun sampai menjadi sesuatu yang menarik. Ini bukan alur berlebihan yang menempelkan tumpukan dependency atau berbagai framework di sana-sini
Untuk mengikutinya, sepertinya cukup salin-tempel potongan-potongan yang diberikan dan pahami langkah demi langkah cara kerjanya. Kalau saya menulis sesuatu seperti ini, mungkin saya akan menulisnya dengan literate programming di org-mode, lalu mengekspornya ke HTML sebagai tulisan blog
Namun font dengan syntax highlighting bawaan masih terasa meragukan bagi saya
Dibilang HTML reaktif, tetapi bukankah hampir semuanya JavaScript, atau saya salah paham?
Selain browser, ini tidak bergantung pada perangkat lunak pihak ketiga, dan seperti HTML, ini tahan lama, portabel, serta mudah digunakan
Dalam waktu dekat saya ingin mencoba mendukung notebook HTML semacam ini di Raku, atau untuk Raku
Saat ini “solusi notebook” Raku berbasis Jupyter atau berbasis Mathematica
Saya kurang paham logika penggunaan teknologi web untuk membuat proses ini menjadi rumit. Kompleksitas tambahan itu menyelesaikan apa? Justru lebih mirip memperlambat proses dan menghilangkan fitur-fitur yang diperlukan seperti autocomplete, snippet, dan extension
Selain itu, kemungkinan besar orang lain tidak terbiasa dengan setup ini, sehingga kolaborasi juga menjadi lebih sulit
Lingkungan cukup disiapkan sekali saja, lalu terus dipakai sambil menambahkan perbaikan kecil seiring perubahan teknologi
Jika Anda pengguna n/vim, hal berikut sudah cukup bisa dilakukan. 1- Eksplorasi data: gunakan https://github.com/untitled-ai/jupyter_ascending untuk menghubungkan teks ke Jupyter notebook. Karena menggunakan jupytext, Anda bisa mengedit dan menjalankan kode secara efisien dari editor teks
2- Menulis: untuk LaTeX, Anda bisa memakai https://github.com/lervag/vimtex
Dengan menambahkan tmux dan tmuxp di atasnya, proyek bisa langsung dibuka. Di Emacs, org mode[1][2] dan/atau Auctex dapat digunakan untuk membuat proses yang mulus
[1] https://sqrtminusone.xyz/posts/2021-05-01-org-python/
[2] https://martibosch.github.io/jupyter-emacs-universe/
Namun saya tidak terlalu suka Python, jadi ingin memakai alat yang tidak berpusat pada Python. Itulah alasan saya menyebut Raku dan Mathematica
Ngomong-ngomong, terima kasih sudah memberi tahu tentang https://github.com/imbue-ai/jupyter_ascending
Saya secara umum setuju dengan premis tulisan ini, yaitu bahwa HTML belum dimanfaatkan secara memadai sebagai media distribusi untuk penulisan ilmiah
Ada karya terbaru Will Crichton yang terkait dengan hal ini
https://willcrichton.net/nota/
https://willcrichton.net/notes/portable-epubs/
Belakangan ini notebook memang sedang panas. Kami juga merilis versi notebook TypeScript[1], tetapi mengambil sisi yang cukup berbeda dalam trade-off-nya
Karena kami ingin menjalankan kode node backend, berbeda dari pendekatan tulisan ini maupun Observable, kami tidak mencoba menjalankannya di lingkungan browser. Meski begitu, untuk banyak aplikasi, ide ini mungkin merupakan solusi yang lebih baik
Apresiasi untuk penulisnya
https://github.com/srcbookdev/srcbook