Reaktif HTML not defteri
(maxbo.me)- Tarayıcının çalıştırdığı tek bir HTML dosyası ile veri keşfi, analiz, görselleştirme, dizgi ve dağıtımı tek bir belgede birleştirerek mevcut not defteri → yayıncılık aracı → PDF akışını azaltmak mümkün
- Temel uygulama,
stylevescriptöğelerini ekranda gösteren echo hücreleri,contenteditableve Observable Runtime'ı birleştirerek düzenlenebilir reaktif hücreler oluşturma yaklaşımına dayanıyor cell(name, inputs, definition)Observable'ın bağımlılık modelini izleyerekcounter, FizzBuzz render'ı, gizli hücreler ve çıktısı olmayan ara değer hücreleri gibi birbirine bağlı yürütme birimlerini kuruyor- Aynı HTML belgesi içinde Observable Plot, TeX, Markdown, Graphviz, WASM tabanlı SQLite, Pyodide tabanlı Python, WebR tabanlı R, Observable Inputs ve Mutable durum da gösteriliyor
- Ortaya çıkan çıktı, ayrı bir platform olmadan tarayıcıda çalışan bilimsel ve teknik belgeler oluyor; uygulama daha sonra
@celine/celinekütüphanesi olarak yayımlanıyor
Tek bir HTML dosyasıyla not defteri-yayın ayrımını azaltmak
- HTML dizgi için yaygın olarak kullanılsa da, veri keşfi, analiz ve görselleştirme platformu olarak görece daha az kullanıldı
- Tipik iş akışı birden çok araçtan geçiyor
- Tek bir HTML dosyası bu üç adımı üstlenirse manuel prosedürleri, CLI araçlarını, CI aşamalarını ve üçüncü taraf platform bağımlılığını azaltabilir
- Uygulama, Anton Zhiyanov'un In-browser code playgrounds, Cristóbal Sciutto'nun Self-modifying HTML notes, Quarto ve Observable Framework çalışmalarından güçlü biçimde etkileniyor
Düzenlenebilir hücreler oluşturmak
- İlk adım,
echoCSS sınıfıylastylevescriptöğelerini belgenin içinde olduğu gibi görünür hale getirmek - Yerleşik sözdizimi vurgulamalı yazı tipi ve
contenteditableözniteliği eklenince bu yapı temel bir kod düzenleyici gibi kullanılabiliyor contenteditableuygulanmışscript, odağı kaybettiğinde yeniden değerlendirilir- Mevcut
scriptkopyalanarak yeni birscriptöğesi oluşturulur ve orijinali kaldırılır eval,importifadesi içeren kodda çalışmadığı için bu yöntem gerekir
- Mevcut
- Observable tabanlı yürütme için iki kütüphane yüklenir
- Global alanda yalnızca
libraryvecelladlı iki sembol açığa çıkarılır
Observable Runtime tabanlı reaktif veri akışı
cell(name, inputs, definition, observerVisibility)işlevi, hücre tanımlamak için Observable Runtime'ın modül kapsamını kullanır- Aynı isimli değişken zaten varsa mevcut değişken alınır, yoksa yeni bir değişken oluşturulup tanımlanır
- Bu yapı sayesinde
contenteditablehücre yeniden değerlendirildiğinde yeni tanım bağlı hücrelere yayılır
- Bu yapı sayesinde
- Observable
Inspector, hücre çıktısınıscriptbloğunun üzerinde göstermek için kullanılır counterhücresi, her 1 saniyede bir sayı üreten asenkron bir generator olarak kurulurscriptinidözniteliği ilecellinnameargümanı aynıdır- Başlangıç değeri
ideğiştirilip odak kaldırıldığında yeni değer uygulanır
countera bağımlı hücreler de oluşturulabilir- Hypertext Literal yüklenerek
counterdeğeri FizzBuzz biçiminde render edilir htl, HTML5 ayrıştırıcısını uygular ve otomatik escape, event listener, stil nesnesi ve DOM düğümü gibi serileştirilemeyen değerlerin enterpolasyonunu işler
- Hypertext Literal yüklenerek
Görünen hücreler, gizli hücreler ve çıktısız hücreler
echosınıfı eklenmezse hücre tanımı gizlenirken çıktı yine gözlemlenebilir- Bu tür hücreler render primitive'i olarak kullanılabilir
- Çıktının kendisini göstermeyen hücre tipleri de yapılabilir
silent(name, inputs, definition),observerVisibilitydeğerini gizli ayarlayarak ara değerleri veya veri yapılarını saklamak için kullanılabilir
- Hücreler, bildirim sırasından bağımsız çalışabilir
- Örnekte
reallyNegativehücresi, daha sonra bildirilennegativehücresine bağımlıdır
- Örnekte
- Aynı hücre değeri daha karmaşık çıktılarda da kullanılabilir
- Observable Plot yüklenerek sayı dizisi bir çizgi grafiği olarak çizilir ve
counter % 40konumunda dikey bir kural çizgisi gösterilir
- Observable Plot yüklenerek sayı dizisi bir çizgi grafiği olarak çizilir ve
Belge ve görselleştirme çıktısını genişletmek
- Hücreler herhangi bir DOM öğesini döndürebilir
- TeX, Markdown ve Graphviz demoları sırasıyla farklı türde öğeler döndürür
texhücresi birspanöğesi döndürürmdhücresi birtableöğesi döndürürdothücresi birsvgöğesi döndürür
- Hücreler
Promisedöndürebilir veyaErrorfırlatabilir- Observable
Inspector, çalışmakta olan hücrenin dışındakidiveobservablehq--runningsınıfını uygular - Hata hücresine
observablehq--errorsınıfını uygular - Belge bu durumlara uygun stiller tanımlar
- Observable
Tarayıcı içinde SQLite, Python ve R
- SQLite demosu, Chinook sample database veritabanını
https://maxbo.me/chinook.dbadresine yükleyip WASM tabanlı SQLite istemcisi ile sorgular- SQL sorgusuna
WHERE Milliseconds < 1000000eklemeyi deneyebilirsiniz
- SQL sorgusuna
- Python demosu, Pyodide CPython WASM dağıtımını kullanır
- Pyodide içinde NumPy, Pandas, Matplotlib, scikit-learn, Scipy bulunur
- Daha önce oluşturulan grafik, Matplotlib ve Python
sqlite3modülüyle yeniden üretilir
- R demosu WebR kullanır
- ggplot2 render etme kısmı uygulanamamış olsa da bunun mümkün olduğu düşünülüyor
- İlgili hücre iOS'ta biraz kararsız görünüyor ve ek inceleme yapılmıyor
Girdi ve değiştirilebilir durum
viewofhücre tipi, Observable Inputs ile birlikte kullanılmak üzere oluşturuluyorviewof, iki reaktif hücre bildirirNAME: girdinin değeriviewof NAME: DOM öğesinin kendisi
- Girdiyi hücrenin üzerinde göstermek için hücre
idsiviewof NAMEolarak ayarlanır - Örnekte
Inputs.range([0, 100], { step: 1 })ile bir aralık girdisi oluşturulur verangePlothücresi buna göre güncellenir - Observable Inputs'in çalışma şekli biraz kafa karıştırıcıdır; Synchronized Inputs demosu yardımcı olabilir
- Yalnızca saf fonksiyonel veri akışının yetmediği durumlar için
mutableyardımcı işlevi de oluşturulurmutable, değer değiştiğinde yeni değeri yayan birMutablenesnesi kaydeder
Kütüphanenin yayımlanması ve sunum slaytları
- Bu uygulama için ilk başta
inceladı düşünülse de daha sonracelineadı tercih ediliyor - Kütüphane @celine/celine olarak yayımlanıyor
- Bu belge SydJS etkinliğinde demo olarak gösteriliyor
- Belgeyi slayt gösterisine dönüştürmek için kod da içeriyor
Shift+N: slayt gösterisini başlat veya sonraki slayta geçShift+B: önceki slayta geçShift+E: slayt gösterisini bitir
- Uygulamanın kaynak kodu source code olarak yayımlanmış durumda
1 yorum
Hacker News yorumları
Yazının öncülüne güçlü biçimde katılıyorum. HTML, hesaplamalı notebook’lar için harika bir temel olabilir
Ancak buradaki uygulama tercihlerini beğenmiyorum. Dinamik ve reaktif HTML bundan çok daha deklaratif hâle getirilebilir; Observable harika olsa da standart JavaScript’ten sapan yönleri var
Heximal adında reaktif bir HTML sistemi yapmaya başladım; ileride notebook desteği de eklemeyi planlıyorum. HTML şablonları ve özel öğeler tabanlı deklaratif bir sistem; bunun üzerine TC39 Signals önerisine dayalı bir ifade/reaktivite sistemi oturtuluyor
https://github.com/elematic/heximal
HTMX, Tangle, Curvenote ve Polymer karışımı bir şeye daha yakın; HTML baştan beri reaktif olsaydı muhtemelen böyle görünürdü. Grafik düzenleme ve notebook kullanım senaryolarına oldukça iyi uyacağını düşünüyorum
Bu yüzden Observablehq’da normal JavaScript debug ifadeleri düzgün çalışıyor
https://github.com/observablehq/parser
Observable runtime’ını sevdiğim için front-end kaynak ile derlenmiş saf JS gösterimi arasında çift yönlü dönüşüm yapabilen bir decompiler da yaptım
https://observablehq.com/@tomlarkworthy/observablejs-toolcha...
Gerçekten harika. Özellikle Python ve SQLite demosunu beğendim. Web üzerinden düzenleme döngüsünden (TTW) başlayıp buna quine demesi ilginç; geçerli sayılır, ama temel zayıflık kalıcılık
TiddlyWiki de aslında aynı şeyi yapıyor, ancak çalışmayı kaydetmek baş ağrısı. Çünkü bir şeyi kalıcı kılmak için sonunda ayrı bir headless sunucu sürecine ihtiyaç duyuluyor
Benzer bir şey yapmak istediğimde[0] şahsen kalıcılıktan başlamıştım; bu da doğal olarak dosya demekti. Programcı editörüyle düzenlenebilen, dosya sistemiyle kaydedilip dağıtılabilen düz metin dosyalarıydı. Böylece tarayıcının içinde programcı editörünü yeniden uygulama sorunundan kaçınabiliyorsunuz; bu hiç kolay değil
Bunun yerine hızlı bir sunucu yazma sorunu doğuyor, ama bu da oldukça keyifli bir problem[1]. Burada temel contenteditable bölümleri kullanarak o sorundan kaçınmışlar, fakat bu kalıcılıktan sonraki en büyük sorun
Gömülü script içinde export yapılamaması da aynı duvar gibi görünüyor. Global window nesnesini kirletmemek için böyle bir özellik iyi olurdu; benim kullanım senaryomda kod üretimini de kolaylaştırırdı
0 - Literate Markdown: https://simpatico.io/lit.md
1 - Reflector, Markdown’ı dönüştüren, sıkıştıran, önbelleğe alan ve dosya izleme invalidation’ı yapan küçük bir node sunucusu: https://simpatico.io/reflector
Harcanan düşünce ve emeğe saygı duyuyorum ama bu yaklaşımın kullanılabilirliği korkunç. Keşifsel veri analizi yapmaya çalışırken neden stil öğeleriyle de uğraşmam gerektiğini bilmiyorum
Jupyter Notebook gibi araçların iyi tutmasının nedeni tam da bu. Yine de merak edip alternatif fikirleri hayata geçirmiş olmasını çok takdir ediyorum
Keşifsel veri analizi platformu olarak henüz yeterli değil. Observable Notebooks gibi tam teşekküllü bir web kod düzenleyicisinin anlık tepkiselliği de yok; dosya izleme tabanlı hot reloading sunan Observable Framework de değil. Deno + VSCode için yeni Jupyter kernel’i de oldukça akıcı bir deneyim sunuyor
Bu yüzden keşifsel analiz için kullanılabilirliği konusunda, şey… kötü olduğuna katılıyorum; ama dağıtım kullanılabilirliğinin o kadar kötü olmadığını düşünüyorum. Hatta iyi. Çünkü yalnızca tek bir dosya. Birine grafikler ve veri işleme sonuçları göndermek için devasa bir toolchain’i sürdürmeye ya da üçüncü taraf bir servise para ödemeye gerek kalmadan, tek bir HTML dosyasını Slack’e atabilir veya bir yerde barındırabilirsiniz
Analiz sonuçlarını stillendirebilme esnekliği sayesinde, bloglar veya araştırma makaleleri gibi stilin önemli olduğu ortamlarda da yayımlanabilir
ivoryyirede çevirince sözdizimi vurgulamasının gerçek zamanlı değiştiği sahne de bunu gösteriyorBuraya nasıl gelindiğini anlıyorum ama JavaScript framework ve kütüphaneleriyle tarayıcıda daha kolay oynayamamak üzücü. Sonuçta sadece JS; hafif bir ortamda hızlıca deney yapılabilmeli. Bu yaklaşımın güçlü olduğu nokta da bu
HTML/JS’in oyuncu ve deneysel olanaklarını geri getiren bir yöntem. TS, rollup, webpack gibi şeylerdense böyle denemelerin daha fazla olmasını isterim
Ek: Biraz daha okuyunca bunun veri analizi için önerildiğini gördüm. O kullanım için pek uygun olduğunu düşünmüyorum
Atılıp bitmeyen Jupyter notebook alternatiflerinin büyük değeri olduğunu düşünüyorum. Mevcut kullanıcı deneyiminin gerçekten berbat olması düzeltilebilir. Sorun, bu düzenin Jupyter notebook’un JSON karmaşasından daha iyi olup olmadığı; kişisel olarak ben daha iyi olduğu görüşündeyim
Lit’in asıl yazarı yakın zamanda Google’dan ayrıldı ve bildiğim kadarıyla buna çok benzeyen bir şey üzerinde çalışıyor
https://github.com/elematic/heximal
Bu yazının biçimini beğendim. En temelden başlayıp ilginç bir şeye kadar adım adım inşa ediyor. Bir bağımlılık yığını ya da şuradan buradan framework ekleyen abartılı bir akış değil
Takip etmek için verilen parçaları kopyalayıp yapıştırmak ve adım adım nasıl çalıştığını anlamak yeterli olacak gibi. Ben böyle bir şey yazsaydım, org-mode’un literate programming özelliğiyle yazar, sonra HTML’e aktararak blog yazısına dönüştürürdüm
Yine de yerleşik sözdizimi vurgulaması olan font hâlâ kafamı kurcalıyor
Tepkisel HTML deniyor ama neredeyse tamamı JavaScript değil mi, yoksa bir şeyi yanlış mı anladım?
Tarayıcı dışında üçüncü taraf yazılıma bağımlı değil; HTML’in olduğu gibi uzun ömürlü, taşınabilir ve kullanımı kolay
Yakında bu tür HTML notebook’ları Raku içinde ya da Raku için desteklemeye çalışacağım
Raku’nun mevcut “notebook çözümü” Jupyter tabanlı ya da Mathematica tabanlı
Bu süreci web teknolojileriyle karmaşıklaştırmanın mantığını pek anlayamıyorum. Eklenen karmaşıklık neyi çözüyor? Aksine süreci yavaşlatmaya ve otomatik tamamlama, snippet, eklenti gibi gerekli özellikleri ortadan kaldırmaya daha yakın görünüyor
Üstelik başkalarının bu kuruluma aşina olmama ihtimali yüksek olduğundan iş birliği de daha zorlaşıyor
Ortamı bir kez kurup, teknoloji değiştikçe küçük iyileştirmeler ekleyerek kullanmaya devam etmek yeterli
n/vim kullanıcıları için şunlar yeterli olabilir. 1- Veri keşfi: https://github.com/untitled-ai/jupyter_ascending kullanarak metni Jupyter notebook’a bağlar. jupytext kullandığı için kodu metin düzenleyicide verimli biçimde düzenleyip çalıştırabilirsiniz
2- Yazı yazma: LaTeX için https://github.com/lervag/vimtex kullanılabilir
Buna tmux ve tmuxp eklerseniz projeyi anında açabilirsiniz. Emacs’te org mode[1][2] ve/veya Auctex ile akıcı bir süreç oluşturulabilir
[1] https://sqrtminusone.xyz/posts/2021-05-01-org-python/
[2] https://martibosch.github.io/jupyter-emacs-universe/
Ancak Python’ı pek sevmediğim için Python merkezli olmayan araçlar kullanmak istiyorum. Bu yüzden Raku ve Mathematica’dan söz ettim
Bu arada https://github.com/imbue-ai/jupyter_ascending bağlantısını paylaştığın için teşekkürler
Bu yazının öncülüne, yani HTML’nin bilimsel yazıların dağıtım ortamı olarak yeterince kullanılmadığına büyük ölçüde katılıyorum
Bununla ilgili Will Crichton’ın yakın tarihli çalışmaları var
https://willcrichton.net/nota/
https://willcrichton.net/notes/portable-epubs/
Bu aralar notebook’lar gerçekten gündemde. Biz de TypeScript notebook sürümünü yayımladık[1], ancak ödünleşimlerde epey farklı bir tarafı seçtik
Biz backend node kodu çalıştırmak istediğimiz için, bu yazıdaki yöntemden veya Observable’dan farklı olarak tarayıcı ortamında çalıştırmaya çalışmıyoruz. Yine de birçok uygulama için bu fikir daha iyi bir çözüm olabilir
Yazarı alkışlıyorum
https://github.com/srcbookdev/srcbook