- 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
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
https://www.consumerreports.org/cro/news/2014/03/the-health-...
Bugün birden merak ettim
Bu kişinin yaptığı şeylerden biri aslında sadece
/dev/lp0iç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/usbXXXyaparsanı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
/dev/altında göstermiyor gibi. Bunun yerine OS X’te delpvar;echo "Hello printer" | lp -dgibi kullanabiliyorsunuz, adını dalpstat -pile bulabilirsinizYeni bir yazıcıda test ettim, gerçekten çalışıyor
printf 'hello\f' > /dev/usb/lp0printf 'hello\f' | nc -N $printer_ip 9100Brother 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ı gerekiyorls >durumunda yazıcı DOS satır sonları bekliyor.\nyalnızca yeni satıra geçer, “carriage return” yapmaz; bu yüzdensed 's/$/\r/'ile pipe etmek veyanc -Ckullanmak gerekirUSB 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
/dev/usblp0benzeri bir şey olarak görünmüştü ve sadececatile 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
https://retrohacker.substack.com/p/bye-cups-printing-with-ne...
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
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
Ancak çıktıdan sonra kâğıt fena halde kıvrılıyordu. Yazıcı hâlâ duruyor ama 4 renkli şeridi nereden bulabilirim bilmiyorum
figletgibi komutların ürettiği ASCII art benzeri bir şeydi. Belki hâlâ yazıcı çıktısını destekliyordurBelki 2.0 sürümünde deneyebilirim
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
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
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ı?
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
“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.pdfhttps://nytonline.net/rss
rm todays_nyt.pdf; wget -q "[https://static01.nyt.com/images/$(date](<https://static01.nyt.com/images/$(date>) +%Y/%m/%d)/nytfrontpage/scan.pdf" -O todays_nyt.pdf && open todays_nyt.pdfdmy=$(date +%d/%m/%Y)