1 puan yazan GN⁺ 2024-10-05 | 1 yorum | WhatsApp'ta paylaş
  • Her sabah telefonda haberleri ve sosyal medyayı sonsuzca kaydırma alışkanlığını azaltmak için, dot matrix yazıcı ile kişiselleştirilmiş bir kağıt ön sayfa her gün yazdırılıyor
  • Kurulum; Star NP-10, Raspberry Pi Zero W, paralel port-USB adaptörü ve güç kaynağından oluşacak kadar basit; Pi tarafında yazıcı /dev/usb/lp0 aygıtı olarak ele alınıyor
  • Eski yazıcı, standart Unicode yerine Code Page 437 benzeri sınırlı bir karakter kümesi kabul ediyor; bu yüzden PHP içinde hex değerleri doğrudan göndererek çizgi, kutu ve sıcaklık simgeleri yazdırılıyor
  • Veriler Open-Meteo, twelvedata, NYTimes ve Reddit JSON'dan alınıyor; hava durumu, hisse senetleri, haber başlıkları ve Reddit gönderileri kağıt genişliğine göre biçimlendiriliyor
  • cron ile her gün sabah 8 civarında otomatik çalışıyor ve tek sayfalık, sonlu bir haber akışı; web siteleri ve uygulamalardaki sonsuz kaydırmanın yerini alıyor

Ekran yerine kağıt ön sayfa yapmak

  • Sabah telefona bakıp birden fazla haber ve sosyal medya sitesini kaydırma alışkanlığını azaltırken, yine de güncel kalmak istiyordu
  • Bunu, eBay'den satın alınan bir dot matrix yazıcıyla her gün hazırlanan kişiselleştirilmiş bir ön sayfa yazdırarak gerçekleştirdi
  • Tüm kaynak kodu GitHub repo üzerinde açıklandı

Donanım seçimi ve bağlantı

  • Gerekli bileşenler nispeten basit
  • Kullanılan yazıcı, 1980'lerin ortalarından kalmış gibi görünen bir Star NP-10
    • Paralel porta sahip bir dot matrix yazıcıysa çalışması muhtemel
    • Tipik fiyat aralığı yaklaşık 80-120 dolar olsa da, “çalışıp çalışmadığı belirsiz” ibaresi sayesinde bunun yaklaşık yarı fiyatına alınmış
  • Biraz temizlik ve mürekkep şerit kartuşunda ayardan sonra test sayfası başarıyla yazdırılmış
  • Raspberry Pi WiFi'ye bağlanıyor ve USB adaptörü üzerinden yazıcının paralel portuna bağlanıyor
    • Pi'ye ssh ile bağlandıktan sonra yazıcının /dev/usb/lp0 olarak göründüğü doğrulanmış

Yazıcıya doğrudan veri göndermek

  • İlk olarak, kabuktan ham metni doğrudan göndererek yazdırmanın çalışıp çalışmadığı kontrol edildi
echo "Hello, world!" > /dev/usb/lp0
  • Dosya erişim hatası çıkınca, izin sorunu chmod ile geçici olarak aşıldı
sudo chmod 666 /dev/usb/lp0
  • Sonrasında /dev/usb/lp0'a gönderilen metin yazıcıdan çıktı
  • PHP tarafında bu yaklaşım, yazıcı dosyasını fopen() ile açıp içine metin yazacak şekilde genişletildi
  • Düz cümleler, boşluklar ve Unicode sanatını denedikten sonra, yazıcının karakter desteğinin sınırlı olduğu görüldü

Star NP-10'un karakter kümesi

  • Yazıcının nasıl çalıştığını anlamak için taranmış Star NP-10 kullanıcı kılavuzu bulundu
  • Bu yazıcı yalnızca çok belirli bir karakter kümesini kabul ediyor
    • IBM PC'nin Code Page 437 karakter setine gevşek biçimde dayanıyor
    • Standart alfasayısal karakterler ile bazı özel simgeleri, çizgi ve kutu karakterlerini içeriyor
  • PHP içinde hex değerler dize olarak oluşturulup doğrudan yazıcıya gönderilebiliyor
$horizontalDouble = "\xCD";
$deg = "\xF8";

echo str_repeat($horizontalDouble, 24);
echo '78' . $deg . 'F' . PHP_EOL;
  • Bu yöntemle yalnızca düz metin değil, çizgiler, kutular ve sıcaklık simgeleri gibi dekoratif karakterler de yazdırılabiliyor

Veriler ve API'ler

  • Kişisel ön sayfada dört bölüm yer alıyor
    • Hava durumu
    • Hisse senetleri
    • Öne çıkan haber başlıkları
    • En popüler Reddit gönderileri
  • Bu bir deney projesi olduğu için veri maliyetini düşük tutmak ve mümkün olduğunda ücretsiz API'ler kullanmak istendi; ihtiyaç duyulan API'ler, ücretsiz herkese açık API'leri toplayan public-apis deposunda bulundu
  • Kullanılan veri kaynakları şunlar
    • Open-Meteo: hava durumu verisi, API anahtarı gerekmiyor
    • twelvedata: hisse verisi, cömert bir ücretsiz katman sunuyor
    • NYTimes: haber başlıkları, proje için yeterli ücretsiz katman sağlıyor
    • Reddit JSON: Reddit gönderileri, ücretsiz ama User-Agent sahtelemesi gerektiriyor
  • PHP betiği, her API uç noktasından yükleri alıp yalnızca gereken verileri büyük bir dizide birleştiriyor
    • Yalnızca belirli hisseler, belirli haber türleri ve belirli subreddit gönderileri kullanılıyor
    • Bölümlerden herhangi biri için gösterilecek veri yoksa betik erken sonlanıyor ve daha sonra yeniden çalıştırılıyor

Haber verilerini filtreleme yöntemi

  • NYTimes verisinde API yanıtında results yoksa bu durum başarısızlık sayılıyor
  • Makaleler arasından yalnızca şu koşulları sağlayanlar yazdırılacaklar arasına alınıyor
    • type değeri Article
    • section değeri U.S., World, Weather veya Arts
    • Yalnızca sayı MAXNEWS değerinden azsa ekleniyor
  • NEWS, NEWSKEY ve MAXNEWS, kolayca değiştirilebilmeleri için betiğin üst kısmında sabit olarak tanımlanmış

Kağıda uygun çıktı biçimi

  • Yalnızca bölüm başlıklarını yazdırmak yerine, üstte mevcut tarih, gün ve ön sayfa adını içeren bir çerçeveli kutu oluşturuldu
  • Düzen, yazıcının sayfa genişliğinin 80 karakter olması temel alınarak hesaplandı
    • Hex karakterler
    • str_repeat
    • Sabit sayfa genişliği değeri
  • Bölüm başlıkları, çizgi karakterleri ve metnin birleştirilmesiyle yazdırılıyor
str_repeat($horizontalSingle, 3) . " WEATHER " . str_repeat($horizontalSingle, (PAGEWIDTH - 9)) . "\n";
  • Hava durumu ve hisse bilgileri, kağıdın kenarına dayanmayacak kadar kısa oldukları için tek satırda yazdırılıyor
  • Haber başlıkları ve Reddit gönderilerinde ise uzun metinler fazla olduğundan ayrı bir satır kaydırma işlemi gerekiyor

Uzun metinleri satırlara bölme

  • Yazıcı, uzun satırları otomatik olarak bir sonraki satıra geçirebiliyor
  • Ancak kelimelerin ortadan bölünüp alt satıra taşınmasını önlemek için, dizeyi maksimum satır uzunluğuna göre bölen bir işlev geliştirildi
  • splitString() işlevi, kelimeleri boşluklara göre ayırıyor ve her satır PAGEWIDTH değerini aşmayacak şekilde bir dizi döndürüyor
    • Tek bir kelime maksimum uzunluktan uzunsa o kelime kesilerek işleniyor
  • Reddit gönderileri için dönen satır dizisi üzerinde dönülerek yazıcıya yazılıyor
foreach (splitString($redditPost) as $line) {
    fwrite($printer, $line) . "\n";
}

Otomatik çalıştırma ve kullanım deneyimi

  • Elle çalıştırmak için php print.php kullanılabiliyor
  • Gerçek kullanım cron işi ile otomatikleştirildi
    • Her gün sabah 8 civarında kişiselleştirilmiş ön sayfa yazdırılıyor
    • Yazdırılan kağıt koparılıp kahve içerken okunuyor
  • Tek sayfalık kağıtta sunulan sonlu haber akışı, web siteleri ve sosyal uygulamalarda durmaksızın kaydırmaktan daha iyi hissettiriyor
  • Eski fiziksel donanımı yeni teknolojiyle birleştirerek kullanma süreci de projenin önemli bir keyif unsuru olmuş

1 yorum

 
GN⁺ 2024-10-05
Hacker News yorumları
  • Makbuz yazıcısıyla benzer bir şey denemiştim; USB termal makbuz yazıcıları yaklaşık 75 dolar ve Python ile kontrol etmesi de kolay
    Görsel ve QR kod yazdırmak basit; otomatik kesme özelliği sayesinde mesajları ayırmak iyi oluyor
    İçindeki zili çaldırıp ek bir bildirim gibi kullanmak da mümkün; ayrıca para çekmecesi kontrolü için çıkışı da var, bunu ışık gibi şeyleri kontrol etmeye bağlamayı düşünüyorum
    E-posta için ayarladım ve her sabah takvimimi yazdırmasını sağladım
    Düğme veya NFC okuyucu gibi fiziksel kontrollerle kullanınca arayüz epey iyi oturuyor. Örneğin takvimi yazdırmak için bir NFC kartı, okunmamış e-postaları yazdırmak için bir NFC kartı gibi; “komut” verip çıktıyı alıyorsunuz
    Ekran süresini azaltmanın eğlenceli bir yolu ama ironik biçimde, kazandığım zamandan daha fazlasını bunu kodlayıp ayarlarken ekrana bakarak geçirmiş olabilirim

    • Makbuz yazıcıları eğlenceli ama zararlı termal kâğıt almamaya dikkat etmek gerekiyor
      https://www.consumerreports.org/cro/news/2014/03/the-health-...
    • Benim termal yazıcım da her sabah hava durumunu yazdırıyor ve önemli bir cihaz ağdan düşerse bildirim yazdırıyor
    • Makbuz yazıcıları gerçekten eğlenceli. Birkaç yıl önce benzer bir kurulumla GitHub ticket’larını yazdıran bir proje yapmıştım; şu an nokta vuruşlu yazıcıda kullandığım düzeneğe benziyordu
    • Hangi yazıcıyı kullandığını merak ediyorum. Bir tane almayı düşünüyorum ama bahsettiğin bildirim özelliğini ve harici kontrol özelliğini bilmiyordum
  • Bugün birden merak ettim
    Bu kişinin yaptığı şeylerden biri aslında sadece /dev/lp0 içine echo yapmak; eskiden zaten böyle yapılırdı. Arayüze metin iterdiniz, yazıcı da yazdırırdı
    Günümüz yazıcıları çok daha gösterişli ama hâlâ uzun bir mirasa sahip yazıcılar. İlk HP lazer yazıcılar da veriyi kablo üzerinden gönderince Courier 10 ile, sayfa başına 66 satır olarak yazdırırdı. Sanırım yalnızca Apple LaserWriter özel bir PostScript yazıcısı olduğu için böyle değildi; onun yerine PostScript gönderirdiniz
    Yazıcılar geliştikçe gönderilen dil karmaşıklaştı ama yine de uzun süreli geriye dönük uyumluluğu korudular
    Peki bir USB yazıcıyı bilgisayara takıp ls > /dev/usbXXX yaparsanız bugün de yazdırır mı? Hâlâ öylece çalışır mı?
    EPSON’a EPSON MX-80 escape code gönderirseniz hâlâ olur mu? Her iki sonuç da beni şaşırtmaz ama günümüz yazıcıları benim için epey kara kutu; bilen var mı merak ediyorum
    Eskiden önceden basılmış çok nüshalı NCR formlarına raporların düzgün oturması için uğraşmanın keyfini hatırlayanlar da vardır

    • OS X’te az önce test ettim; anlattığın yöntem gibi yazıcıyı /dev/ altında göstermiyor gibi. Bunun yerine OS X’te de lp var; echo "Hello printer" | lp -d gibi kullanabiliyorsunuz, adını da lpstat -p ile bulabilirsiniz
      Yeni bir yazıcıda test ettim, gerçekten çalışıyor
    • Aşağıdaki ikisi de benim ortamımda çalıştı
      printf 'hello\f' > /dev/usb/lp0
      printf 'hello\f' | nc -N $printer_ip 9100
      Brother lazer yazıcıda; çevrimiçi kılavuzun yanında programlama kılavuzu da bağlantılı. Dil PCL, ama basit çıktı için çok şey bilmeniz gerekmiyor
      Yukarıdaki ikisi CUPS kullanmıyor. Diğer yorumda belirtildiği gibi lp/lpr çalıştırılabilir dosyalarını kullanmak istiyorsanız önce yazıcının CUPS’a kayıtlı olması gerekiyor
      ls > durumunda yazıcı DOS satır sonları bekliyor. \n yalnızca yeni satıra geçer, “carriage return” yapmaz; bu yüzden sed 's/$/\r/' ile pipe etmek veya nc -C kullanmak gerekir
      USB bağlantısında birkaç kez yazdırıp tek bir sayfa oluşturabilirsiniz; form feed göndermeden kâğıt çıkmaz. TCP bağlantısında ise bağlantı kapandığında sayfa yazdırılır
    • Birkaç yıl önce yeni aldığım bir Epson LX-350 var; USB ile bağlanıyor ve seri/paralel portları da var. USB ile bağlayınca /dev/usblp0 benzeri bir şey olarak görünmüştü ve sadece cat ile göndermek de çalışmıştı
      Böyle bir ürünü yeni alan müşteriler, son 30-50 yıldır kullandıkları süreçlerle uyumlu olmasını isteyecektir; beklediğim gibi ESC/P 2 destekliyor ve IBM escape code’larını da destekliyor. 90’larda kullandığım eski nokta vuruşlu yazıcıların IBM kodlarını desteklemediğini sanıyordum, o yüzden şaşırtıcı geldi
      Daha da şaşırtıcı olan, MacBook’ta genel Epson yazıcıları için yerleşik bir sürücü olması ve bunun çalışmasıydı. Kalitesi pek iyi değildi ve grafik olarak yazdırıyordu ama sonuçta vardı
      Güncel inkjet ve lazer yazıcıları pek bilmiyorum. Yaklaşık 20 yıl önce kullandığım Epson inkjet ham ESC/P kodlarını destekliyordu
    • Ağ yazıcısıyla da mümkün. Açık porta netcat ile PDF gönderince yazdırıyor
      https://retrohacker.substack.com/p/bye-cups-printing-with-ne...
    • 1990’larda okulun bilgisayar laboratuvarında hâlâ nokta vuruşlu yazıcı vardı ve ağdaki tüm bilgisayarlarda varsayılan yazıcı olarak ayarlıydı
      Yaygın kullanıcı hatalarından biri, biri Word belgesi yazdırmaya çalıştığında PostScript’in nokta vuruşlu yazıcıya gönderilmesi ve yazıcının bunu PostScript kaynağı olarak aynen, sadakatle basıp biri durdurana kadar kâğıt ve şerit harcamasıydı
  • Matris yazıcılar da modele bağlı olarak epey çok iş yapabiliyor. Yazı tipi değiştirme, kalın, altı çizili, bazen italik, çift genişlik/yükseklikte karakterler, hatta grafik bile mümkün. Ancak grafikler genelde 90 ya da 180 DPI gibi görece düşük çözünürlükte oluyor
    Eskiden kaçış odası oyununa benzer bir şey için, üzerinde yalnızca paralel yazıcı konektörü olan bir kutu yapmıştım. Yazıcıya bağlanınca paralel port kontrol hatlarından birinden parazit besleme alıyor, çok küçük bir PIC mikrodenetleyici yalnızca birkaç yüz µA kullanarak ipuçlarını yazıcıya gönderiyordu

    • Eskiden ilk masaüstü yayıncılık programlarından, SoftCraft’ın Fancy Font adlı bir şeyi vardı. CP/M ve daha sonra DOS programıydı; PageMaker gibi WYSIWYG sayfa yerleşim aracı değildi, basit bir işaretleme diliyle biçimlendirilmiş metin belgeleri kullanıyordu
      Başta Epson nokta vuruşlu yazıcıların yüksek çözünürlüklü grafik modundan yararlanıyordu. Bu yazıcılar, yazıcı kafası pim aralığının 1/3’ü kadar küçük platen ince ayarı yapabildiği için, yalnızca kafayla mümkün olan dikey çözünürlüğün 3 katını verebiliyordu
      Fancy Font metni bilgisayarda render edip bu özel yüksek çözünürlüklü modda grafik olarak gönderiyor, 1980’lerin başındaki ev ekipmanlarıyla dizgiye mümkün olduğunca yakın sonuçlar üretiyordu
      Sonraki sürümlerde orijinal HP LaserJet gibi erken dönem lazer yazıcılar için sürücüler de vardı, ama Mac çıkınca bu tür sistemlerin geleceği belli oldu
    • Babamın 90’larda 4 renkli nokta vuruşlu yazıcısı vardı. Deluxe Paint II’deki firavun kafasını basması inanılmaz uzun sürüyordu ama gerçekten oldukça güzel görünüyordu
      Ancak çıktıdan sonra kâğıt fena halde kıvrılıyordu. Yazıcı hâlâ duruyor ama 4 renkli şeridi nereden bulabilirim bilmiyorum
    • Sonsuz rulo kâğıda yatay modda devasa banner’lar bastığımızı hatırlıyorum. Bugün terminalde figlet gibi komutların ürettiği ASCII art benzeri bir şeydi. Belki hâlâ yazıcı çıktısını destekliyordur
    • Tasarım açısından bunu daha fazla kurcalamak istiyordum. Kılavuzda yazı tipi boyutu, vurgu, italik, alt/üst simge gibi şeyler için gerçekten onlarca sayfa var
      Belki 2.0 sürümünde deneyebilirim
    • ESC/P’yi anlayan, çeşitli yazı tiplerini ve CPI gibi şeyleri destekleyen bir terminal olsa eğlenceli olurdu
  • Bu makineyi birkaç yıl boyunca haber akışına bağlı tuttum.[1] Model 14 Teletype şerit yazıcısı mekanizması; hâlâ oturma odasında duruyor ve şerit tel sepete akıyor
    Eski bir EeePC subnotebook üzerinde çalışan bir Python programıyla sürülüyor
    [1] https://aetherltd.com/refurbishing14.html

    • Gerçekten harika. Sürekli güncellenen hisse/kripto para fiyatlarını basan bir ticker tape’i taklit etmek için böyle bir cihazı mutlaka bir kez edinmek istemiştim
      EeePC adını da çok uzun zamandır duymamıştım, nostalji yaptı
  • Gerçekten mükemmel bir ürün fikri gibi görünüyor. Her sabah kişiselleştirilmiş, üstelik MSN gibi bir yerden değil, gerçekten benim seçtiğim ekran dışı haber akışını almak fikri harika
    Üstüne bir de çalar saati nokta vuruşlu yazıcıyla değiştirmek mümkünse daha da harika
    PHP’yi kendi haber kaynaklarıma göre değiştirmeyi kolayca yapabilirim, ama donanım tarafına tek başıma nasıl başlayacağımı bilmiyorum. Bu durumda epey insan vardır gibi geliyor
    Piyasaya çıksa, eski yazıcı fiyatından çok daha pahalı olsa bile alırdım

    • Eskiden benzer bir şey yapmış biri olarak, aslında oldukça kolay. Yazıcıyı bağlayıp dev çıktısına yazmanız yeterli. Linux’ta çalıştırdığınızı varsayarsak o çıktı yalnızca bir dosya
      En zor kısım yazıcıyı bağlamak; bir adaptör kablosu gerekebilir
  • Temiz iş. Eskiden kısa bir süre bir radyo istasyonunda çalıştığım zamanı hatırlattı. Ayrıntıların çoğunu unuttum ama sanırım belirli bir Associated Press numarasını otomatik arayıp en son başlıkları alıyor, sonra nokta vuruşlu yazıcıya gönderiyordu
    90’ların sonlarıydı ve MS-DOS’ta çalışıyordu
    O dönemde çoğu yazıcı yazı tipini kontrol kodlarıyla ayarlayabiliyordu; birçok yazıcıda orantılı yazı tipleri de vardı

  • Güzel. Bu aralar FT Weekend gibi bir hafta sonu basılı gazetesi alsam mı diye düşünüyorum. Çünkü haberleri telefondan çok sık okuyorum
    Haberler çoğu zaman pek faydalı olmadığı gibi sadece olumsuz duygular yaratıyor. Haberleri kâğıttan, hem de haftada yalnızca bir kez okumak daha huzurlu olur gibi geliyor
    Haberleri her gün kâğıda basan bu yöntem, aradaki boşluğu doldurmak için iyi görünüyor
    Ayrıca nokta vuruşlu yazıcıyı gerçekten sevdim. Böyle hack’lemeye uygun açık kaynak yazıcı var mı?

    • FT’yi önermek zor
      Basılı gazeteye abone olmaya çalıştım ama bir kez bile elime ulaşmadı; 3 telefon görüşmesi ve yaklaşık 10 e-postadan sonra aboneliği iptal edip iade isteyince talebi üst seviyeye çıkaracaklarını söylediler. O noktada aradan zaten 3 hafta geçmişti ve çok zaman harcamıştım
      Bu yüzden ekrana sürekli bakmamak için internet haberlerini kendim yazdırma fikriyle ben de çok ilgileniyorum
  • Bir süredir “üç yüzlü kartlar” basıyorum. Bir yüzünde görsel var, diğer yüzünde belgeye giden bir QR kodu var
    https://mastodon.social/@UP8/111013706271196029
    “Üçüncü” yüz, QR kodunun bağlandığı web sitesi
    Fotoğraflardan sıkılıp, ucuz bir lens taşıyan; diyaframı hep f/18 veya üzerine kısan; ağır son işleme ve renk düzeltmesi yapan; standart ama standart dışıymış gibi hissettiren bir en-boy oranıyla çeken bir karakter yarattım. Sanki alternatif bir zaman çizgisindeki tuhaf bir kamerayı kullanıyormuş gibi görünmesini amaçlayan bir kurgu
    Bu seriyi basmaya başlayınca, 4x6’yı keserek kolayca 4x5 elde edilebileceği sonucuna vardım; ama kesmek yerine 1 inçlik alan bırakıp ön yüze QR kodu ve belge koyabileceğimi düşündüm. Benzer şekilde 5x7’yi 5x5 kareye keserseniz belge koyacak yer çıkıyor
    Arkasına baskı yapamadığım birkaç kutu parlak kâğıt var, onları bu şekilde kullanmayı düşünüyorum. Sonradan Instagram’da 4x5 standardı olduğunu ve iyi lensle çekilmiş spor fotoğraflarının bu formatta gerçekten güzel göründüğünü de öğrendim
    Yalnız belgenin nasıl görüneceği konusunda kararsızım. Mevcut düzenimde en az değişiklik yapan yol, o fantastik kameraya gömülü olabilecek eski bir yazıcı gibi görünen sahte nokta vuruşlu efekti, ya da inkjet yazıcının avantajlarını sonuna kadar kullanan bir yaklaşım arasında kalıyorum

    • Anlamak istiyorum ama ya yazının kendisi ya da ben çok fazla bağlamı kaçırmış gibiyim. Neredeyse her paragraf bir öncekiyle tamamen alakasız görünüyor
  • “Deneysel bir proje olduğu için bu veri maliyetini çok düşük, mümkünse ücretsiz tutmak istiyordum” diyorsanız NewsCatcher da var. Açık kaynak yan projeler için ücretsiz
    https://docs.google.com/forms/d/e/1FAIpQLSejrsj4a1ZQkIasiKCt...

  • Biraz bağlantılı olarak, her sabah MacBook’ta NYTimes birinci sayfasını açan küçük bir script kullanıyorum
    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