1 poin oleh GN⁺ 2024-10-05 | 1 komentar | Bagikan ke WhatsApp
  • Untuk mengurangi kebiasaan menggulir tanpa henti berita ponsel dan media sosial setiap pagi, ia mencetak halaman depan kertas yang dipersonalisasi setiap hari dengan printer dot matrix
  • Konfigurasinya sederhana: Star NP-10, Raspberry Pi Zero W, adaptor port paralel-ke-USB, dan catu daya; di Pi, printer diperlakukan sebagai perangkat /dev/usb/lp0
  • Printer lama tidak menerima Unicode umum, melainkan set karakter terbatas yang mirip Code Page 437; di PHP, nilai heksadesimal dikirim langsung untuk mencetak garis, kotak, dan simbol suhu
  • Data diambil dari Open-Meteo, twelvedata, NYTimes, dan Reddit JSON, lalu cuaca, saham, headline berita, dan posting Reddit diformat agar sesuai dengan lebar kertas
  • Dijalankan otomatis dengan cron sekitar pukul 08.00 setiap hari; satu lembar berita yang terbatas menggantikan infinite scroll di situs web dan aplikasi

Membuat halaman depan kertas alih-alih layar

  • Ingin tetap mendapatkan informasi terbaru sambil mengurangi kebiasaan membuka ponsel pada pagi hari dan menggulir berbagai situs berita serta media sosial
  • Diimplementasikan dengan memanfaatkan printer dot matrix yang dibeli di eBay untuk mencetak halaman depan khusus yang disiapkan setiap hari
  • Seluruh kode sumber tersedia di repo GitHub

Pemilihan dan koneksi perangkat keras

  • Komponen yang dibutuhkan relatif sederhana
  • Printer yang digunakan adalah Star NP-10, yang tampaknya merupakan produk pertengahan 1980-an
    • Printer dot matrix dengan port paralel kemungkinan bisa berfungsi
    • Kisaran harga umumnya sekitar 80–120 dolar, tetapi karena berlabel “tidak pasti berfungsi”, printer ini dibeli dengan harga sekitar setengahnya
  • Setelah sedikit dibersihkan dan kartrid pita tinta disesuaikan, halaman uji berhasil dicetak
  • Raspberry Pi terhubung ke WiFi dan tersambung ke port paralel printer melalui adaptor USB
    • Setelah masuk ke Pi lewat ssh, dipastikan printer terdeteksi di /dev/usb/lp0

Mengirim data langsung ke printer

  • Awalnya, keluaran diuji dengan mengirim teks mentah langsung dari shell
echo "Hello, world!" > /dev/usb/lp0
  • Terjadi error akses file, sehingga masalah izin diakali dengan chmod
sudo chmod 666 /dev/usb/lp0
  • Setelah itu, teks yang dikirim ke /dev/usb/lp0 tercetak di printer
  • Di PHP, pendekatan ini diperluas dengan membuka file printer memakai fopen() lalu menulis teks ke dalamnya
  • Saat mencoba kalimat biasa, spasi, dan seni Unicode, terlihat bahwa cakupan dukungan karakter printer terbatas

Set karakter Star NP-10

  • Manual pengguna Star NP-10 yang dipindai ditemukan untuk memahami cara kerja printer
  • Printer ini hanya menerima set karakter yang sangat spesifik
    • Secara longgar didasarkan pada Code Page 437 milik IBM PC
    • Mencakup karakter alfanumerik standar serta sebagian simbol khusus, garis, dan karakter kotak
  • Di PHP, nilai heksadesimal dapat dibuat sebagai string dan dikirim langsung ke printer
$horizontalDouble = "\xCD";
$deg = "\xF8";

echo str_repeat($horizontalDouble, 24);
echo '78' . $deg . 'F' . PHP_EOL;
  • Dengan cara ini, bukan hanya teks biasa, tetapi juga karakter dekoratif seperti garis, kotak, dan simbol suhu bisa dicetak

Data yang diambil dan API

  • Halaman depan pribadi berisi empat bagian
    • Cuaca
    • Saham
    • Headline berita utama
    • Posting Reddit teratas
  • Karena ini proyek eksperimen, tujuannya adalah menekan biaya data dan sebisa mungkin memakai API gratis; API yang diperlukan ditemukan di repositori public-apis, yang mengumpulkan API publik gratis
  • Sumber data yang digunakan adalah sebagai berikut
    • Open-Meteo: data cuaca, tidak memerlukan kunci API
    • twelvedata: data saham, menyediakan tier gratis yang cukup longgar
    • NYTimes: headline berita, menyediakan tier gratis yang cukup untuk proyek ini
    • Reddit JSON: posting Reddit, gratis tetapi perlu spoofing User-Agent
  • Skrip PHP mengambil payload dari tiap endpoint API dan menggabungkan hanya data yang diperlukan ke dalam satu array besar
    • Hanya saham tertentu, jenis berita tertentu, dan posting dari subreddit tertentu yang digunakan
    • Jika salah satu bagian tidak memiliki data untuk ditampilkan, skrip berhenti lebih awal dan dijalankan lagi nanti

Cara memfilter data berita

  • Data NYTimes dianggap gagal jika respons API tidak memiliki results
  • Dari artikel yang ada, hanya item yang memenuhi kondisi berikut yang dikumpulkan untuk dicetak
    • type adalah Article
    • section adalah salah satu dari U.S., World, Weather, Arts
    • Ditambahkan hanya jika jumlahnya masih kurang dari maksimum MAXNEWS
  • NEWS, NEWSKEY, dan MAXNEWS didefinisikan sebagai konstanta di bagian atas skrip agar mudah diubah

Format keluaran yang disesuaikan dengan kertas

  • Alih-alih sekadar mencetak judul bagian, bagian atas dibuat sebagai kotak berbingkai yang berisi tanggal saat ini, hari, dan nama halaman depan
  • Tata letak dihitung berdasarkan lebar halaman printer yang berukuran 80 karakter
    • Karakter heksadesimal
    • str_repeat
    • Nilai lebar halaman tetap
  • Judul bagian dicetak dengan menggabungkan karakter garis dan teks
str_repeat($horizontalSingle, 3) . " WEATHER " . str_repeat($horizontalSingle, (PAGEWIDTH - 9)) . "\n";
  • Cuaca dan saham cukup pendek sehingga dicetak dalam satu baris tanpa menyentuh tepi kertas
  • Headline berita dan posting Reddit sering berisi teks panjang, sehingga memerlukan penanganan pemenggalan baris tersendiri

Menangani pemenggalan baris untuk teks panjang

  • Printer dapat secara otomatis melanjutkan baris panjang ke baris berikutnya
  • Namun, untuk menghindari kata terpotong di tengah saat pindah ke baris berikutnya, dibuat fungsi yang membagi string berdasarkan panjang baris maksimum
  • Fungsi splitString() memisahkan kata berdasarkan spasi dan mengembalikan array agar tiap baris tidak melebihi PAGEWIDTH
    • Jika satu kata lebih panjang dari panjang maksimum, kata tersebut dipotong
  • Posting Reddit ditulis ke printer dengan mengiterasi array baris yang dikembalikan
foreach (splitString($redditPost) as $line) {
    fwrite($printer, $line) . "\n";
}

Eksekusi otomatis dan pengalaman penggunaan

  • Eksekusi manual bisa dilakukan dengan php print.php
  • Penggunaan sebenarnya diotomatisasi dengan job cron
    • Halaman depan yang dipersonalisasi dicetak setiap hari sekitar pukul 08.00
    • Kertas yang tercetak disobek lalu dibaca sambil minum kopi
  • Berita terbatas dalam satu lembar kertas terasa lebih baik dibanding menggulir situs web dan aplikasi sosial tanpa henti
  • Proses menghubungkan perangkat keras fisik lama dengan teknologi baru juga menjadi bagian penting dari keseruan proyek ini

1 komentar

 
GN⁺ 2024-10-05
Opini Hacker News
  • Saya pernah mencoba hal serupa dengan printer struk; printer struk termal USB harganya sekitar 75 dolar dan mudah dikendalikan dengan Python
    Mencetak gambar dan kode QR itu sederhana, dan fitur pemotong otomatisnya memudahkan pemisahan pesan
    Bel internalnya juga bisa dibunyikan sehingga dapat dipakai seperti notifikasi tambahan, dan ada output untuk mengendalikan laci kas, jadi saya berpikir untuk menghubungkannya guna mengendalikan hal-hal seperti lampu
    Saya menyiapkannya untuk email dan membuatnya mencetak jadwal setiap pagi
    Kalau dipakai bersama kontrol fisik seperti tombol atau pembaca NFC, antarmukanya terasa cukup cocok. Misalnya, seperti memberi “perintah” dengan kartu NFC untuk mencetak jadwal, atau kartu NFC untuk mencetak email yang belum dibaca, lalu menerima outputnya
    Ini cara yang menarik untuk mengurangi waktu menatap layar, tetapi ironisnya saya rasa saya malah menatap layar lebih lama untuk mengodekan dan mengaturnya daripada waktu yang berhasil dihemat

    • Printer struk memang menarik, tetapi perlu berhati-hati agar tidak membeli kertas termal berbahaya
      https://www.consumerreports.org/cro/news/2014/03/the-health-...
    • Printer termal saya juga mencetak cuaca setiap pagi, dan mencetak notifikasi jika perangkat penting terputus dari jaringan
    • Printer struk benar-benar menyenangkan. Beberapa tahun lalu saya mengerjakan proyek untuk mencetak tiket GitHub dengan konfigurasi serupa, dan itu mirip dengan konfigurasi yang sekarang dipakai untuk printer dot matrix
    • Saya penasaran printer apa yang dipakai. Saya sedang berpikir untuk membeli satu, tetapi tidak tahu tentang fitur notifikasi dan fungsi kontrol eksternal yang disebutkan
  • Hari ini tiba-tiba saya jadi penasaran
    Salah satu hal yang dilakukan orang ini pada dasarnya hanya echo ke /dev/lp0, dan dulu memang begitulah cara kerjanya. Kalau teks didorong masuk ke antarmukanya, printer akan mencetaknya
    Printer zaman sekarang jauh lebih canggih, tetapi tetap saja printer dengan warisan panjang. Printer laser HP awal pun, kalau data dikirim lewat kabel, akan mencetak dalam Courier 10, 66 baris per halaman. Saya rasa hanya Apple LaserWriter yang tidak seperti itu karena merupakan printer PostScript khusus; sebagai gantinya, PostScript yang didorong masuk
    Seiring printer berkembang, bahasa yang dikirim menjadi lebih rumit, tetapi kompatibilitas mundur yang panjang tetap dipertahankan
    Jadi kalau printer USB dicolokkan ke komputer lalu menjalankan ls > /dev/usbXXX, apakah masih akan tercetak sampai hari ini? Apakah masih langsung berfungsi begitu saja?
    Kalau mengirim kode escape EPSON MX-80 ke EPSON, apakah masih bisa? Apa pun jawabannya tidak akan mengejutkan, tetapi printer modern terasa cukup seperti kotak hitam bagi saya, jadi saya penasaran apakah ada yang tahu
    Sepertinya juga ada orang yang masih ingat betapa “menyenangkannya” berjuang agar laporan tercetak pas pada formulir NCR berlapis yang sudah dicetak sebelumnya

    • Saya baru saja mengujinya di OS X, dan tampaknya printer tidak diekspos di bawah /dev/ seperti cara yang dijelaskan. Sebagai gantinya, OS X juga punya lp, sehingga bisa dipakai seperti echo "Hello printer" | lp -d, dan namanya bisa ditemukan dengan lpstat -p
      Saya mengujinya pada printer baru dan ternyata memang berfungsi
    • Dua perintah di bawah ini sama-sama berfungsi di lingkungan saya
      printf 'hello\f' > /dev/usb/lp0
      printf 'hello\f' | nc -N $printer_ip 9100
      Ini pada printer laser Brother, dan ada tautan panduan pemrograman di samping manual online-nya. Bahasanya PCL, tetapi untuk output sederhana tidak perlu tahu banyak
      Keduanya tidak memakai CUPS. Seperti komentar lain, jika ingin memakai executable lp/lpr, printer harus didaftarkan terlebih dahulu di CUPS
      Untuk ls >, printer mengharapkan baris baru gaya DOS. \n hanya pindah ke baris baru dan tidak melakukan “carriage return”, jadi perlu dipipe melalui sed 's/$/\r/' atau memakai nc -C
      Pada koneksi USB, Anda bisa mencetak beberapa kali untuk membuat satu halaman, dan kertas tidak akan keluar sampai form feed dikirim. Pada koneksi TCP, halaman dicetak saat koneksi ditutup
    • Saya punya Epson LX-350 yang saya beli baru beberapa tahun lalu; bisa terhubung lewat USB dan juga punya port serial/paralel. Saat terhubung lewat USB, perangkatnya muncul kira-kira seperti /dev/usblp0, dan mengirimnya dengan cat saja juga berfungsi
      Pelanggan yang membeli produk seperti ini dalam kondisi baru tentu ingin kompatibel dengan proses yang sudah mereka pakai selama 30–50 tahun terakhir, jadi sesuai dugaan printer ini mendukung ESC/P 2 dan juga kode escape IBM. Itu mengejutkan karena printer matrix lama yang saya pakai pada tahun 90-an sepertinya tidak mendukung kode IBM
      Yang lebih mengejutkan lagi, MacBook punya driver bawaan untuk printer Epson generik dan driver itu berfungsi. Kualitasnya kurang bagus dan mencetak sebagai grafis, tetapi setidaknya memang ada
      Saya kurang tahu soal printer inkjet dan laser modern. Printer inkjet Epson yang saya pakai sekitar 20 tahun lalu mendukung kode ESC/P mentah
    • Ini juga bisa dilakukan dengan printer jaringan. Kirim PDF dengan netcat ke port yang terbuka, maka akan tercetak
      https://retrohacker.substack.com/p/bye-cups-printing-with-ne...
    • Pada tahun 1990-an, lab komputer sekolah masih punya printer dot matrix, dan printer itu disetel sebagai printer default di semua komputer di jaringan
      Salah satu kesalahan pengguna yang umum adalah ketika seseorang mencoba mencetak dokumen Word, PostScript terkirim ke printer dot matrix, lalu printer dengan setia mencetaknya sebagai source PostScript mentah, menghabiskan kertas dan pita sampai seseorang menghentikannya
  • Printer matriks juga bisa melakukan cukup banyak hal, tergantung modelnya. Bisa mengganti font, cetak tebal, garis bawah, kadang miring, karakter dengan lebar/tinggi ganda, bahkan grafis. Hanya saja grafisnya biasanya beresolusi relatif rendah, seperti 90 atau 180 DPI.
    Dulu saya pernah membuat sebuah kotak yang hanya memiliki konektor printer paralel untuk sesuatu yang mirip gim escape room. Saat disambungkan ke printer, mikrokontroler PIC yang sangat kecil mengambil daya parasit dari salah satu jalur kontrol port paralel, hanya memakai beberapa ratus µA, lalu mengirim petunjuk ke printer.

    • Dulu ada salah satu program desktop publishing awal dari SoftCraft bernama Fancy Font. Karena merupakan program CP/M dan kemudian DOS, ini bukan alat tata letak halaman WYSIWYG seperti PageMaker, melainkan memakai dokumen teks yang diformat dengan bahasa markup sederhana.
      Awalnya program ini memanfaatkan mode grafis resolusi tinggi pada printer dot matrix Epson. Printer-printer ini bisa melakukan penyetelan mikro platen sekecil 1/3 jarak antar-pin kepala cetak, sehingga mampu menghasilkan resolusi vertikal 3 kali lebih tinggi daripada yang bisa dicapai kepala cetak saja.
      Fancy Font merender teks di komputer lalu mengirimkannya sebagai grafis dalam mode resolusi tinggi khusus ini, sehingga dengan perangkat rumahan awal 1980-an hasilnya sedekat mungkin dengan typesetting.
      Versi-versi berikutnya juga punya driver untuk printer laser awal seperti HP LaserJet asli, tetapi setelah Mac muncul, masa depan sistem semacam itu sudah jelas.
    • Ayah saya punya printer dot matrix 4 warna pada tahun 90-an. Mencetak kepala firaun dari Deluxe Paint II memakan waktu sangat lama, tetapi hasilnya benar-benar cukup cantik.
      Namun setelah dicetak, kertasnya melengkung parah. Printernya masih ada, tetapi saya tidak tahu di mana bisa mendapatkan ribbon 4 warna.
    • Saya ingat mencetak banner raksasa dalam mode lanskap di kertas gulung tanpa henti. Bentuknya mirip ASCII art yang dibuat perintah seperti figlet di terminal masa kini. Mungkin saja perintah itu masih mendukung output ke printer.
    • Dari sudut pandang desain, saya ingin mengeksplorasi ini lebih jauh. Di manualnya benar-benar ada puluhan halaman tentang ukuran font, penekanan, italic, subscript/superscript, dan semacamnya.
      Mungkin akan saya coba di versi 2.0.
    • Akan menarik kalau ada terminal yang memahami ESC/P dan mendukung berbagai font serta CPI dan sejenisnya.
  • Saya menghubungkan mesin ini ke feed berita selama beberapa tahun.[1] Mekanismenya adalah printer pita Teletype Model 14, masih ada di ruang keluarga, dan pitanya mengalir keluar ke keranjang kawat.
    Dijalankan dengan program Python di subnotebook EeePC lama.
    [1] https://aetherltd.com/refurbishing14.html

    • Keren sekali. Saya selalu ingin mendapatkan perangkat seperti ini untuk meniru ticker tape yang mencetak harga saham/kripto yang terus diperbarui.
      Nama EeePC juga sudah lama sekali tidak saya dengar, jadi terasa nostalgis.
  • Ini terlihat seperti ide produk yang benar-benar hebat. Gagasan menerima feed berita personal setiap pagi—dan bukan dari tempat seperti MSN, melainkan feed berita off-screen yang benar-benar saya pilih sendiri—itu keren.
    Kalau bahkan jam alarm bisa diganti dengan printer dot matrix, itu lebih keren lagi.
    Mengubah PHP agar sesuai dengan sumber berita saya mungkin mudah, tetapi saya tidak tahu harus mulai dari mana untuk sisi hardware sendirian. Sepertinya cukup banyak orang berada di posisi seperti ini.
    Kalau tersedia di pasar, rasanya saya akan membelinya meski jauh lebih mahal daripada harga printer lama.

    • Sebagai orang yang pernah mencoba sesuatu yang mirip, sebenarnya cukup mudah. Sambungkan printer, lalu tulis saja ke output dev. Dengan asumsi dijalankan di Linux, output itu hanyalah file.
      Bagian tersulit adalah koneksi printernya; mungkin perlu kabel adaptor.
  • Rapi. Ini mengingatkan saya pada masa singkat ketika dulu bekerja di stasiun radio. Detailnya hampir saya lupa, tetapi sepertinya sistemnya otomatis menelepon ke suatu nomor Associated Press, mengambil headline terbaru, lalu mengirimkannya ke printer dot matrix.
    Itu akhir 90-an dan berjalan di MS-DOS.
    Saat itu sebagian besar printer bisa mengatur font lewat kode kontrol, dan banyak printer juga memiliki font lebar variabel.

  • Bagus. Belakangan ini saya mempertimbangkan berlangganan koran kertas akhir pekan seperti FT Weekend. Alasannya karena saya terlalu sering membaca berita di ponsel.
    Berita sering kali tidak terlalu berguna dan hanya menimbulkan emosi negatif. Membaca berita di kertas, apalagi hanya sekali seminggu, sepertinya akan terasa lebih tenang.
    Cara mencetak berita di kertas setiap hari ini tampak bagus untuk mengisi celah di antaranya.
    Selain itu, saya benar-benar suka printer dot matrix. Apakah ada printer open source yang cocok untuk di-hack seperti ini?

    • Sulit merekomendasikan FT.
      Saya mencoba berlangganan koran kertas, tetapi tidak pernah menerimanya. Setelah sekitar 3 kali menelepon dan 10 email, baru ketika saya meminta pembatalan langganan dan pengembalian dana mereka mengatakan akan menaikkan tiketnya ke level lebih tinggi. Saat itu sudah 3 minggu berlalu dan waktu saya juga sudah banyak terbuang.
      Jadi saya juga sangat tertarik mencetak sendiri berita internet supaya tidak terus-menerus menatap layar.
  • Saya sudah beberapa waktu mencetak “kartu tiga sisi”. Satu sisi berisi gambar, sisi lainnya berisi kode QR yang mengarah ke dokumen.
    https://mastodon.social/@UP8/111013706271196029
    Sisi “ketiga” adalah situs web yang dituju kode QR tersebut.
    Saya mulai bosan dengan foto, jadi saya menciptakan karakter yang membawa lensa murah, selalu menutup aperture ke f/18 atau lebih, melakukan post-processing dan koreksi warna yang kuat, serta memotret dengan aspect ratio yang standar tetapi terasa tidak standar. Konsepnya adalah membuatnya tampak seolah-olah memakai kamera aneh dari garis waktu alternatif.
    Ketika mulai mencetak seri ini, saya menyimpulkan bahwa 4x5 bisa dibuat dengan mudah dengan memotong 4x6, tetapi alih-alih memotongnya, saya melihat bahwa ruang 1 inci bisa disisakan untuk menaruh kode QR dan dokumen di sisi depan. Demikian pula, jika 5x7 dipotong menjadi persegi 5x5, akan ada ruang untuk dokumen.
    Saya punya beberapa kotak kertas glossy yang tidak bisa dicetak di sisi belakangnya, jadi saya berencana memakainya seperti itu. Belakangan saya juga mengetahui bahwa Instagram memiliki standar 4x5, dan foto olahraga yang diambil dengan lensa bagus terlihat sangat bagus dalam format itu.
    Namun saya masih bingung bagaimana bentuk dokumennya sebaiknya. Saya terbelah antara mengubah sesedikit mungkin dari susunan sekarang, membuat efek dot matrix palsu yang terlihat seperti printer lama yang mungkin tertanam di kamera fantasi itu, atau memaksimalkan keunggulan printer inkjet.

    • Saya ingin memahaminya, tetapi rasanya saya kehilangan banyak konteks, baik dari tulisannya sendiri maupun dari pihak saya. Hampir setiap paragraf tampak sama sekali tidak berhubungan dengan paragraf sebelumnya.
  • Jika “karena ini proyek eksperimen, saya ingin menjaga biaya data ini sangat murah, kalau bisa gratis”, ada juga NewsCatcher. Gratis untuk proyek sampingan open source
    https://docs.google.com/forms/d/e/1FAIpQLSejrsj4a1ZQkIasiKCt...

  • Sedikit terkait, saya memakai skrip kecil yang setiap pagi membuka halaman depan NYTimes di MacBook
    d=$(date +%d)
    m=$(date +%m)
    y=$(date +%Y)
    wget -q [https://static01.nyt.com/images/$y/$m/$d/nytfrontpage/scan.p...](<https://static01.nyt.com/images/$y/$m/$d/nytfrontpage/scan.pdf>;) && open ./scan.pdf