- Untuk pengguna yang ingin membaca tulisan web langsung di terminal, James' Coffee Blog juga menyediakan tulisan blog dalam format halaman manual Linux
- Meski URL-nya sama, jika klien mengirim
Accept: text/roff, situs menggunakan negosiasi konten HTTP agar klien menerima dokumen roff alih-alih HTML
- File
.man untuk setiap tulisan dibuat dari template yang memiliki bagian TITLE, AUTHOR, PUBLISHED, POST, dan URL
- Di bagian isi, sumber Markdown dimasukkan agar lebih mudah dibaca daripada HTML, tetapi spasi/jaraknya tidak selalu rapi di halaman manual
- NGINX mendeteksi permintaan
text/roff dan menulis ulang URL ke file .man, sehingga setelah disimpan dengan curl, file itu bisa dibuka seperti man ./post.page
Membaca tulisan blog dengan man
- Halaman manual di Linux adalah cara dasar untuk mengecek penggunaan perintah di terminal, dan biasanya dapat dibuka dengan
man <command>
- Misalnya, manual untuk perintah
tac dapat dilihat seperti berikut
man tac
- James' Coffee Blog menyusun alur agar tulisan blog web juga dapat dibaca dengan cara yang sama, yaitu mengunduh versi
roff dari URL tulisan lalu membukanya dengan man
- Contoh permintaan sebenarnya adalah sebagai berikut
curl -sL -H "Accept: text/roff" https://jamesg.blog/2024/02/28/programming-projects/ > post.page && man ./post.page
Memilih format dengan negosiasi konten HTTP
- Inti implementasinya adalah negosiasi konten HTTP, yaitu klien memberi tahu server format respons yang diinginkan
- Header
Accept digunakan untuk menyampaikan tipe konten yang diinginkan
- Misalnya,
Accept: image/png berarti meminta agar file PNG dikirim jika memungkinkan
- Beberapa tipe konten dan prioritasnya juga dapat ditentukan, tetapi di sini hanya digunakan permintaan format tertentu
- Saat ingin menerima tulisan blog dalam format halaman manual, kirim header
Accept: text/roff
- Server melihat header ini dan mengembalikan respons text/roff yang dapat dibuka dengan
man, bukan HTML
Cara membuat file .man
- Halaman manual Linux ditulis dengan sintaks roff
- Situs dimodifikasi agar menghasilkan versi halaman
man untuk setiap tulisan blog
- Struktur template yang digunakan adalah sebagai berikut
.TH jamesg.blog 1 "" "jamesg.blog"
.SH TITLE
...
.SH AUTHOR
James' Coffee Blog (https://jamesg.blog)
.SH PUBLISHED
...
.SH POST
...
.SH URL
...
- Template memakai nama domain sebagai header dan membuat lima bagian
- TITLE
- AUTHOR
- PUBLISHED
- POST
- URL
- Bagian isi menggunakan sumber Markdown
- Spasinya tidak selalu tersusun rapi di halaman manual
- Namun tetap lebih mudah dibaca daripada HTML, dan kehilangan informasi pemisahan judul serta paragraf lebih sedikit dibanding teks biasa
Mengambil dengan curl dan membuka dengan man
- Versi
roff dari tulisan blog dapat diminta dengan perintah berikut
curl -sL -H "Accept: text/roff" https://jamesg.blog/2024/02/28/programming-projects/ > post.page
- Hasil yang disimpan dapat dibuka seperti halaman manual lokal
man ./post.page
- Jika browser biasa meminta URL tulisan yang sama, ia akan menerima versi HTML
- Sebaliknya, perintah
curl di atas secara eksplisit meminta versi text/roff untuk URL yang sama
Menulis ulang ke file .man di NGINX
- Server menangani permintaan
text/roff secara terpisah dengan beberapa baris konfigurasi NGINX
- Di
/etc/nginx/nginx.conf, dideklarasikan variabel yang mengatur flag ketika tipe konten tertentu terdeteksi
map $uri $redirect_suffix {
~^/(.*)/$ $1;
default "";
}
map $http_accept $redirect_location {
default "";
"~^text/roff" 1;
}
- Di bawah
/etc/nginx/sites-enabled, yaitu file konfigurasi situs, ditambahkan aturan untuk menangani permintaan halaman roff
server {
...
location / {
if ($redirect_location = 1) {
rewrite ^/(.*)/$ /$1.man last;
}
...
}
}
- Konfigurasi ini menghapus slash di akhir URL dan menambahkan
.man saat ada header Accept: text/roff
- Hasilnya, NGINX membaca file
.man yang sesuai, bukan index.html untuk tiap tulisan
- Dengan konfigurasi ini, tulisan blog yang sama bisa dibaca sebagai HTML di browser web dan sebagai halaman manual Linux di terminal
1 komentar
Pendapat Hacker News
Akan keren kalau menyediakan repositori deb sebagai cara berlangganan blog
Misalnya mengambil semua tulisan dengan
apt update, lalu melihat tulisan terbaru dan tautan indeks semua tulisan denganman your-blogRasanya akan takut untuk berlangganan
Semua itu bisa dilihat secara lokal dengan paket dwww: “Read all on-line documentation with a WWW browser”
https://packages.debian.org/bookworm/dwww
Joerg Jaspert dulu adalah pengelola paket Linux Gazette: https://people.debian.org/~joerg/ (2002)
Itu salah satu contoh terbaik yang pernah kulihat tentang pengintegrasian penyampaian informasi dan dokumentasi ke dalam sistem operasi, dan khususnya membuat dokumen man/info lebih berguna daripada antarmuka tradisional berbasis terminal
Ada juga Debian Planet, blog terkait Debian, tetapi sepertinya tidak pernah disediakan sebagai paket Debian itu sendiri
Sejujurnya, RSS kemungkinan besar adalah pilihan yang lebih baik untuk berlangganan blog
Di https://github.com/capjamesg/jamesg.blog.deb ada isi yang bisa membuat berkas deb yang hanya berisi halaman man dengan perintah di bawah ini
git clone [https://github.com/capjamesg/jamesg.blog.deb](<https://github.com/capjamesg/jamesg.blog.deb>)cd jamesg.blog.debdpkg-deb --build --root-owner-group jamesg.blogsudo dpkg -i jamesg.blog.debSetelah itu akan terlihat keluaran seperti
Processing triggers for man-db (2.9.1-1) ..., yang berarti halaman manual untukman jamesg.blogsudah tersediaSaat ini baru ada placeholder, dan mungkin akan kuselesaikan besok
Mungkin juga akan segera menjadi tulisan blog
Bisa langsung di-pipe ke
mantanpa perlu fork atau memakai berkas perantaracurl -sL -H "Accept: text/roff" [https://jamesg.blog/2024/02/28/programming-projects/](<https://jamesg.blog/2024/02/28/programming-projects/>) | man -l -{curl,wget}ke perintah dimulai lagiTeman tidak membiarkan temannya mem-pipe stream langsung ke perintah
https://news.ycombinator.com/item?id=39554044
Sebagai referensi,
curl -sL -H "Accept: text/roff" [https://jamesg.blog/2024/02/28/programming-projects/](<https://jamesg.blog/2024/02/28/programming-projects/>) | man -l /dev/stdinberfungsi di lingkungankuTidak perlu menyimpan berkas roff secara lokal
bashbiasanya dianggap sebagai praktik burukSecara pribadi menurutku tidak apa-apa. Orang yang paham implikasi keamanannya hampir pasti juga tahu metode konversi seperti ini, jadi tidak perlu diberi tahu
Namun kurang baik untuk diajarkan kepada pemula. Suatu saat mereka bisa terkena masalah. Ketika kemampuan mereka meningkat, mereka akan mengetahui fitur seperti ini dengan sendirinya, dan semoga saat itu mereka juga sudah memahami implikasinya
Ini bukan tulisanku: https://www.seancassidy.me/dont-pipe-to-your-shell.html
/usr/bin/man: illegal option -- lAku mencoba membuat perintah satu baris yang memakai pipe di Mac, tetapi terus mendapat galat
Implementasi
mandi macOS tidak memiliki flag-l. Aku sudah memeriksa halaman manualnyaman -l <(curl -sL -H "Accept: text/roff" https://jamesg.blog/2024/02/28/programming-projects/)Kalau bicara tentang URL yang melakukan hal menarik di terminal, dulu aku pernah melihat sesuatu di textfiles.com
Bentuknya menampilkan film animasi pendek dengan kode terminal VT100, dan semuanya disajikan dari satu URI
Di sistem modern, kamu bisa melihatnya dengan membatasi kecepatannya
curl --limit-rate 1000 [http://textfiles.com/sf/STARTREK/trek.vt](<http://textfiles.com/sf/STARTREK/trek.vt>) && resetresetdisertakan karena terminal bisa jadi kacauURI berbasis terminal lainnya:
curl cheat.sh/tarmengambil contoh penggunaan program setelah/, dancurl wttr.in/berlinmengambil informasi cuaca dengan format terminalSebenarnya cukup sederhana; bagian tersulitnya adalah membuat frame
Ini bisa dilakukan dengan
ffmpeg+img2txt.py: https://github.com/bfontaine/RickASCIIRoll/tree/master/movie...Ada mirror lama dari https://16colo.rs/, jadi kamu bisa melihat sebagian besar seni ANSI yang pernah dirilis hingga sekarang
Contoh:
curl ansi.hrtk.in/ungenannt_1453.anshttps://itsfoss.com/star-wars-linux/
tritty, kamu bisa meniru kecepatan transfer 1200/9600 BPSSekarang yang dibutuhkan hanyalah konverter dari Markdown ke roff, dan setelah dicari ternyata sudah ada
https://github.com/postmodern/kramdown-man
https://rtomayko.github.io/ronn/ronn.1.html
https://kristaps.bsd.lv/lowdown/
[0]: https://pandoc.org/
md2groffsudah lama ada di komunitas garis suckless/2f30/cat-vhttps://codeberg.org/nereusx/md2roff
Ada paket Emacs yang memasang SICP karya Abelson dan Sussman ke direktori Info
Cukup ketik
M-x package-install sicp RETMelihat ini, aku terpikir bahwa dengan feed reader yang dimodifikasi, mungkin seluruh rak arsip blog juga bisa dipasang
Kalau membaca Info di Emacs, bookmark juga bisa dipakai
chicken-schemejuga tinggal dipasang. Setelah itu jalankan sebagai rootchicken-install srfi-203chicken-install srtfi216~/.csircuntuk SICP adalah sebagai berikut(import scheme)(import (srfi 203))(import (srfi 216))(define (inc x) (+ x 1))(define (dec x) (- x 1))Setelah itu gunakan geiser user dan geiser untuk chicken seperti biasa
Mungkin aku bisa menemukan jawabannya di internet, tapi aku ingin bertanya di HN
Saat SMA, di HP-UX, aku ingat seseorang menunjukkan cara melompat ke kata yang digarisbawahi, yaitu referensi bagian, dengan menekan kombinasi tombol tertentu, tapi sama sekali tidak ingat tombol apa itu
Aku sudah memeriksa
man(1)danman(7), tapi tidak menemukannya. Bisa saja ini ingatan palsuman ohmanpada dasarnya adalahnroff -man /usr/share/man/man1/ohman.1 | $PAGERJadi yang kamu ajak berinteraksi bukan man atau nroff, melainkan pager
Sekarang
lessyang paling umum, danmorepun besar kemungkinan sebenarnya less, tetapi dulu ada yang lain juga, dan HPUX mungkin memakai sesuatu sepertipgpgberasal dari lini AT&T,moredari lini BSD, danlessdari lini GNUKetiganya memulai pencarian regex dengan
/, jadi bisa dicari terlepas dari ada garis bawah atau tidaklessjuga mendukung file tag sehingga bisa melompat ke tag berikutnya dengantdthelpview, viewer bantuan CDE. Bisa jadi itu menampilkan halaman maninfoIronisnya, cukup banyak dokumentasi groff asli ditulis dalam texinfo: https://lists.gnu.org/archive/html/groff/2005-10/msg00107.ht...
Entah kenapa detail sepele ini memicu naluri saya untuk mencari-cari kesalahan. Mungkin karena ada seseorang di internet yang sedikit keliru
Bisa jadi karena sejak awal terlalu berpusat pada Linux tanpa perlu, atau karena saya mengharapkan sesuatu yang lain tetapi akhirnya hanya demo singkat content negotiation NGINX
Bagaimanapun, ada beberapa hal tidak penting yang tetap ingin saya katakan
Secara ketat, ini bukan mengembalikan roff. Hal seperti
.THbukan roff itu sendiri, melainkan bagian dari paket makro untuk menulis halaman manSaya kecewa karena tidak ada konversi Markdown-ke-roff. Saya kira itu akan menjadi bagian menarik dari tulisan ini, dan setidaknya satu alat yang sudah ada bisa dipakai
Demikian pula, karena ini, pemformatan teksnya sebenarnya juga tidak benar. Masukan roff dimaksudkan satu kalimat per baris untuk membedakan
.di akhir kalimat dari.untuk kegunaan lainSelain itu, setiap baris yang diawali
.akan ditafsirkan sebagai perintah dan bisa menimbulkan masalahAtau mungkin saya hanya orang tua yang pemarah
Adanya alat lain seperti
groffdannroffmembuatnya makin membingungkanTulisan yang hanya menjelaskan “apa itu roff/halaman man/nroff/varian lain dan bagaimana menggunakannya” saja sudah cukup layak menjadi satu artikel blog
Kalau ada penjelasan yang singkat dan jelas, saya juga akan senang, dan sepertinya itu juga akan membantu orang lain
Markdown-to-roff saya anggap sebagai v2. Saat saya mulai mempertimbangkan untuk mengimplementasikan parser, seseorang memberi tahu saya tentang https://github.com/sunaku/md2man, dan ini tampaknya menyelesaikan masalah tersebut
Saya perlu mencari tahu bagaimana mengintegrasikan ini ke situs Python saya yang berjalan di atas GitHub Pages, jadi perlu sedikit penyesuaian
Pandoc bisa mengonversi Markdown ke roff halaman man dengan sangat mudah
Kalau dimasukkan ke template yang diberikan, hasilnya akan terlihat lebih seperti halaman man sungguhan
Tipe media yang benar menurut RFC 4263 adalah text/troff: https://www.rfc-editor.org/rfc/rfc4263.html
Ide yang keren. Sekarang tinggal pasang timer sampai muncul “menyajikan tulisan blog saya sebagai DOOM WAD yang bisa dimainkan”