- हर सुबह मोबाइल news और social media को अंतहीन scroll करने की आदत घटाने के लिए, डॉट मैट्रिक्स प्रिंटर से रोज़ एक personalized कागज़ी front page print किया जाता है
- setup सरल है: Star NP-10, Raspberry Pi Zero W, parallel port-to-USB adapter, और power supply; Pi पर printer को
/dev/usb/lp0 device के रूप में handle किया जाता है
- पुराने printer सामान्य Unicode नहीं, बल्कि Code Page 437 के करीब एक सीमित character set लेते हैं, इसलिए PHP में hex values सीधे भेजकर lines, boxes और temperature symbols print किए जाते हैं
- data Open-Meteo, twelvedata, NYTimes और Reddit JSON से लिया जाता है, और weather, stocks, news headlines व Reddit posts को कागज़ की चौड़ाई के हिसाब से format किया जाता है
- cron से हर दिन सुबह करीब 8 बजे automatic run होता है, और एक पन्ने की सीमित news websites और apps की infinite scroll की जगह लेती है
स्क्रीन के बजाय कागज़ी front page बनाना
- सुबह phone खोलकर कई news और social media sites scroll करने की आदत घटाते हुए भी latest जानकारी देखना चाहते थे
- eBay से खरीदे गए dot matrix printer का उपयोग करके रोज़ तैयार होने वाला customized front page print करने के तरीके से इसे implement किया
- पूरा source code GitHub repo पर publicly available है
Hardware चुनना और connect करना
- ज़रूरी components अपेक्षाकृत simple हैं
- इस्तेमाल किया गया printer Star NP-10 है, जो 1980s के मध्य का product लगता है
- parallel port वाला dot matrix printer हो तो उसके काम करने की संभावना है
- सामान्य price range करीब 80~120 डॉलर था, लेकिन “काम करता है या नहीं, पक्का नहीं” लिखे होने के कारण इसे करीब आधी कीमत पर खरीदा
- थोड़ी cleaning और ink ribbon cartridge adjustment के बाद test page print करने में सफलता मिली
- Raspberry Pi को WiFi से connect किया गया और USB adapter के जरिए printer के parallel port से जोड़ा गया
ssh से Pi में connect करने के बाद confirm किया कि printer /dev/usb/lp0 पर detect हुआ है
Printer को सीधे data भेजना
- शुरुआत में shell से raw text सीधे भेजकर print होता है या नहीं, यह check किया
echo "Hello, world!" > /dev/usb/lp0
- file access error आया, इसलिए permission issue को
chmod से bypass किया
sudo chmod 666 /dev/usb/lp0
- इसके बाद
/dev/usb/lp0 पर भेजा गया text printer पर print होने लगा
- PHP में इसे
fopen() से printer file खोलकर text लिखने के तरीके तक expand किया
- सामान्य sentences, spaces और Unicode art try करते हुए पता चला कि printer की character support range limited है
Star NP-10 का character set
- scanned Star NP-10 user manual ढूंढकर printer के काम करने का तरीका confirm किया
- यह printer बहुत specific character set ही स्वीकार करता है
- IBM PC के Code Page 437 पर loosely based है
- standard alphanumeric characters और कुछ special symbols, line व box characters शामिल हैं
- PHP में hex values को string बनाकर सीधे printer को भेजा जा सकता है
$horizontalDouble = "\xCD";
$deg = "\xF8";
echo str_repeat($horizontalDouble, 24);
echo '78' . $deg . 'F' . PHP_EOL;
- इस तरीके से सामान्य text के अलावा lines, boxes और temperature symbols जैसे decorative characters भी print किए जा सकते हैं
लाया जाने वाला data और APIs
- personal front page में चार sections रखे गए
- weather
- stocks
- top news headlines
- top Reddit posts
- experimental project होने के कारण data cost कम रखना और संभव हो तो free APIs इस्तेमाल करना चाहा; free public APIs इकट्ठा करने वाले public-apis repository से ज़रूरी APIs ढूंढे
- इस्तेमाल किए गए data sources ये हैं
- Open-Meteo: weather data, API key की ज़रूरत नहीं
- twelvedata: stock data, generous free tier उपलब्ध
- NYTimes: news headlines, project के लिए पर्याप्त free tier उपलब्ध
- Reddit JSON: Reddit posts, free लेकिन User-Agent spoofing की ज़रूरत
- PHP script हर API endpoint से payload लाकर केवल ज़रूरी data को एक बड़े array में merge करती है
- सिर्फ specific stocks, specific news types और specific subreddit posts इस्तेमाल किए जाते हैं
- अगर किसी भी section में दिखाने लायक data न हो, तो script जल्दी exit करती है और बाद में फिर run होती है
News data filtering का तरीका
- NYTimes data में API response के
results न हों तो इसे failure माना जाता है
- articles में से केवल वे items print target के रूप में इकट्ठा किए जाते हैं जो ये conditions satisfy करते हों
type Article हो
section U.S., World, Weather, Arts में से एक हो
- केवल तब add करें जब count maximum
MAXNEWS से कम हो
NEWS, NEWSKEY, MAXNEWS को script के top पर constants के रूप में define किया गया, ताकि इन्हें आसानी से modify किया जा सके
कागज़ के हिसाब से output format
- सिर्फ section titles print करने के बजाय, top पर current date, weekday और front page name वाला bordered box बनाया गया
- layout इस आधार पर calculate किया गया कि printer की page width 80 characters है
- hex characters
str_repeat
- fixed page width value
- section titles को line characters और text मिलाकर print किया जाता है
str_repeat($horizontalSingle, 3) . " WEATHER " . str_repeat($horizontalSingle, (PAGEWIDTH - 9)) . "\n";
- weather और stocks इतने छोटे हैं कि कागज़ के किनारे तक नहीं पहुंचते, इसलिए उन्हें एक ही line में print किया जाता है
- news headlines और Reddit posts में अक्सर लंबा text होता है, इसलिए अलग line wrapping की ज़रूरत पड़ती है
लंबे text की line wrapping
- printer लंबी lines को automatic रूप से अगली line में continue करके print कर सकता है
- लेकिन words बीच से कटकर अगली line में जाने से बचाने के लिए, string को maximum line length के आधार पर बांटने वाला function implement किया गया
splitString() function spaces के आधार पर words को split करता है और ऐसा array return करता है जिसमें हर line PAGEWIDTH से ज़्यादा न हो
- अगर कोई single word maximum length से लंबा है, तो उस word को काटकर handle करता है
- Reddit posts के लिए returned line array पर loop चलाकर printer में लिखा जाता है
foreach (splitString($redditPost) as $line) {
fwrite($printer, $line) . "\n";
}
Automatic execution और usage experience
- manual execution
php print.php से संभव है
- असल इस्तेमाल cron job से automate किया गया
- हर दिन सुबह करीब 8 बजे personalized front page print होता है
- printed paper को फाड़कर coffee पीते हुए देखा जाता है
- एक पन्ने में मौजूद सीमित news, websites और social apps को endlessly scroll करने के तरीके से बेहतर महसूस होती है
- पुराने physical hardware को नई technology से जोड़कर इस्तेमाल करने की प्रक्रिया अपने-आप में भी इस project का अहम मज़ा थी
1 टिप्पणियां
Hacker News की राय
मैंने receipt printer से कुछ ऐसा ही करके देखा था; USB thermal receipt printer करीब 75 डॉलर का आता है और Python से कंट्रोल करना भी आसान है
इमेज और QR code प्रिंट करना सरल है, और auto-cut फीचर की वजह से messages को अलग-अलग करना सुविधाजनक रहता है
अंदर की bell बजाकर इसे अतिरिक्त notification की तरह भी इस्तेमाल किया जा सकता है, और cash drawer control के लिए output भी है, इसलिए मैं इसे लाइट्स जैसी चीज़ें कंट्रोल करने से जोड़कर देखने की सोच रहा हूँ
मैंने इसे email के लिए सेट किया है और हर सुबह schedule प्रिंट करवाता हूँ
बटन या NFC reader जैसे physical controls के साथ इस्तेमाल करें तो interface काफी अच्छी तरह फिट बैठता है। जैसे schedule प्रिंट करने के लिए NFC card, unread emails प्रिंट करने के लिए NFC card—यानी “command” दें और output पाएँ
screen time कम करने का यह मज़ेदार तरीका है, लेकिन विडंबना यह है कि जितना screen time बचाया, उससे ज़्यादा शायद इसे code और setup करने में screen देखता रहा
https://www.consumerreports.org/cro/news/2014/03/the-health-...
आज अचानक यह सवाल मन में आया
यह व्यक्ति जो काम कर रहा है, उनमें से एक बस
/dev/lp0पर echo करना है, और पहले तो मूल रूप से ऐसा ही किया जाता था। interface में text धकेल दीजिए और printer उसे print कर देता थाआज के printers कहीं ज़्यादा fancy हैं, लेकिन वे अब भी लंबी legacy वाले printers ही हैं। शुरुआती HP laser printers में भी data wire से भेजो तो Courier 10 में, प्रति page 66 lines के हिसाब से print हो जाता था। Apple LaserWriter शायद वैसा नहीं था क्योंकि वह dedicated PostScript printer था; उसमें शायद इसके बजाय PostScript भेजा जाता था
printers के evolve होने के साथ भेजी जाने वाली language जटिल होती गई, लेकिन फिर भी लंबी backward compatibility बनी रही
तो अगर USB printer को computer में लगाकर
ls > /dev/usbXXXकरें, तो क्या आज भी print होगा? क्या यह अब भी बस काम कर जाएगा?EPSON को EPSON MX-80 escape codes भेजें तो क्या अब भी काम करेगा? किसी भी जवाब से मुझे हैरानी नहीं होगी, लेकिन आजकल printers मेरे लिए काफी black box हैं, इसलिए सोच रहा हूँ कि किसी को पता है क्या
शायद कुछ लोगों को पहले से छपे multi-copy NCR forms पर reports ठीक से align कराने की जद्दोजहद वाली खुशी भी याद होगी
/dev/के नीचे expose नहीं करता। इसके बजाय OS X में भीlpहै, इसलिएecho "Hello printer" | lp -dकी तरह इस्तेमाल कर सकते हैं, और नामlpstat -pसे मिल जाता हैनए printer पर test किया तो सच में काम करता है
printf 'hello\f' > /dev/usb/lp0printf 'hello\f' | nc -N $printer_ip 9100यह Brother laser printer पर था, और online manual के पास programming guide लिंक है। language PCL है, लेकिन simple output के लिए ज़्यादा जानने की जरूरत नहीं
ऊपर के दोनों CUPS का इस्तेमाल नहीं करते। दूसरे comments की तरह
lp/lprexecutables इस्तेमाल करने हों तो पहले printer CUPS में registered होना चाहिएls >के मामले में printer DOS line endings expect करता है।\nसिर्फ नई line पर जाता है और “carriage return” नहीं करता, इसलिएsed 's/$/\r/'से pipe करना होगा याnc -Cइस्तेमाल करना होगाUSB connection में कई बार print करके एक page बनाया जा सकता है, और form feed भेजने तक paper बाहर नहीं आता। TCP connection में connection बंद होने पर page print होता है
/dev/usblp0जैसा दिखा, और बसcatसे भेजने पर भी काम कर गयाऐसे products को नया खरीदने वाले customers पिछले 30–50 साल से इस्तेमाल किए जा रहे processes के साथ compatibility चाहेंगे, इसलिए उम्मीद के मुताबिक यह ESC/P 2 support करता है और IBM escape codes भी support करता है। 90s में इस्तेमाल किए पुराने matrix printers शायद IBM codes support नहीं करते थे, इसलिए यह थोड़ा unexpected था
और भी हैरानी की बात यह थी कि MacBook में generic Epson printer के लिए built-in driver था और वह काम कर गया। quality खास नहीं थी और graphics के रूप में print किया, लेकिन जो भी हो, वह मौजूद था
नए inkjet और laser printers के बारे में ठीक से नहीं जानता। करीब 20 साल पहले इस्तेमाल किया Epson inkjet raw ESC/P codes support करता था
https://retrohacker.substack.com/p/bye-cups-printing-with-ne...
आम user mistakes में से एक यह थी कि जब कोई Word document print करने की कोशिश करता, तो PostScript dot matrix printer को भेज दिया जाता, और printer उसे PostScript source के रूप में ही ईमानदारी से print करता रहता, जिससे जब तक कोई रोकता नहीं, paper और ribbon बर्बाद होते रहते
Matrix printer भी model के हिसाब से काफी कुछ कर सकते हैं। फ़ॉन्ट बदलना, bold, underline, कभी-कभी italic, double-width/height characters, और graphics तक संभव हैं। हालांकि graphics आम तौर पर 90 या 180 DPI जैसे अपेक्षाकृत कम resolution के होते हैं
पहले मैंने escape room game जैसी किसी चीज़ के लिए एक box बनाया था जिसमें सिर्फ़ parallel printer connector लगा था। Printer से जोड़ने पर वह parallel port control line में से एक से parasitic power लेता था, और एक बहुत छोटा PIC microcontroller कुछ सौ µA ही खर्च करते हुए hints printer को भेजता था
शुरुआत में इसने Epson dot matrix printers के high-resolution graphics mode का इस्तेमाल किया। ये printers print head pins के spacing के 1/3 जितनी छोटी platen micro-adjustment कर सकते थे, जिससे head अकेले जितनी vertical resolution दे सकता था, उससे 3 गुना मिल जाता था
Fancy Font computer पर text render करने के बाद उसे इस special high-resolution mode में graphics के रूप में भेजता था, और 1980s की शुरुआत के home equipment से typesetting के जितना करीब हो सके वैसा result बनाता था
बाद के versions में original HP LaserJet जैसे शुरुआती laser printers के लिए drivers भी थे, लेकिन Mac आने के बाद ऐसे systems का भविष्य साफ़ दिखने लगा था
हालांकि print के बाद कागज़ बहुत ज़्यादा मुड़ गया था। Printer अभी भी मेरे पास है, लेकिन 4-color ribbon कहाँ मिलेगा, पता नहीं
figletजैसी commands जो ASCII art बनाती हैं, वैसी चीज़ थी। शायद वह अब भी printer output support करता होशायद version 2.0 में इसे आज़मा सकता हूँ
मैंने इस machine को कई सालों तक news feed से जोड़े रखा था।[1] यह Model 14 Teletype tape printer का mechanism है, और अभी भी living room में है; tape एक wire basket में बहकर निकलती है
इसे एक पुराने EeePC subnotebook पर Python program से चलाता हूँ
[1] https://aetherltd.com/refurbishing14.html
EeePC नाम भी बहुत दिनों बाद सुनकर nostalgia हो आया
यह सच में शानदार product idea जैसा दिखता है। हर सुबह personalized, और वह भी MSN जैसी किसी जगह से नहीं बल्कि सचमुच मेरे चुने हुए off-screen news feed को पाना—यह idea बढ़िया है
ऊपर से अगर alarm clock को भी dot matrix printer से replace किया जा सके, तो और अच्छा
PHP को अपने news sources के हिसाब से बदलना तो मैं आसानी से कर सकता हूँ, लेकिन hardware side अकेले कैसे शुरू करूँ, यह नहीं पता। ऐसे हाल में काफी लोग होंगे
अगर यह market में आया, तो पुराने printer की कीमत से कहीं महंगा होने पर भी शायद खरीद लूँगा
सबसे कठिन हिस्सा printer connection है, जहाँ adapter cable की ज़रूरत पड़ सकती है
साफ़-सुथरा है। पहले कुछ समय के लिए radio station में काम किया था, उसकी याद आ गई। Details लगभग भूल चुका हूँ, लेकिन लगता है कि किसी Associated Press number पर automatic dial-up करके latest headlines लाता था और फिर उन्हें dot matrix printer पर भेजता था
यह 90s के आखिर की बात थी और MS-DOS पर चलता था
उस समय ज़्यादातर printers control codes से fonts set कर सकते थे, और कई printers में variable-width fonts भी होते थे
अच्छा है। आजकल FT Weekend जैसा weekend paper newspaper लेने के बारे में सोच रहा हूँ, क्योंकि phone पर news बहुत बार पढ़ लेता हूँ
News अक्सर बहुत उपयोगी भी नहीं होती और negative emotions ही पैदा करती है। Paper पर, वह भी हफ्ते में सिर्फ़ एक बार news देखने से शायद ज़्यादा सुकून मिलेगा
रोज़ paper पर news print करने का यह तरीका उस बीच की जगह भरने के लिए अच्छा लगता है
साथ ही, dot matrix printer मुझे सच में बहुत पसंद है। क्या ऐसा कोई open-source printer है जिसे इस तरह hack करना अच्छा हो?
मैंने paper newspaper लेना चाहा था, लेकिन एक बार भी नहीं मिला, और 3 phone calls व करीब 10 emails के बाद जब subscription cancel और refund माँगा, तभी उन्होंने कहा कि ticket को escalate करेंगे। तब तक 3 हफ्ते बीत चुके थे और मेरा काफी समय भी लग चुका था
इसलिए screen को लगातार न देखने के लिए internet news को खुद print करने में मेरी भी बहुत दिलचस्पी है
कुछ समय से मैं “three-sided cards” print करता आ रहा हूँ। एक side पर image होती है, और दूसरी side पर document से link करने वाला QR code होता है
https://mastodon.social/@UP8/111013706271196029
“तीसरी” side वह website है जिससे QR code link करता है
Photos से ऊबकर, मैंने एक character बनाया जो सस्ता lens लेकर चलता है, aperture हमेशा f/18 या उससे ज़्यादा tight रखता है, strong post-processing और color correction करता है, और ऐसे aspect ratio में शूट करता है जो standard होते हुए भी non-standard जैसा लगता है। Setup यह है कि वह किसी alternate timeline के अजीब camera का इस्तेमाल करता हुआ लगे
इस series को print करना शुरू करते हुए मैं इस नतीजे पर पहुँचा कि 4x6 को काटकर 4x5 बनाना आसान है, लेकिन काटने के बजाय 1 inch जगह छोड़कर सामने की तरफ QR code और document डाला जा सकता है। इसी तरह 5x7 को 5x5 square में काटें तो document के लिए जगह बनती है
मेरे पास glossy paper के कुछ boxes हैं जिनके पीछे print नहीं कर सकता, इसलिए उन्हें इसी तरह इस्तेमाल करने का सोच रहा हूँ। बाद में पता चला कि Instagram पर 4x5 standard है, और अच्छे lens से ली गई sports photos उस format में सचमुच अच्छी दिखती हैं
हालांकि document का look कैसा हो, यह दुविधा है। मौजूदा layout में न्यूनतम बदलाव करने का तरीका, उस fantasy camera में built-in रही होगी ऐसी किसी old printer जैसा दिखने वाला fake dot matrix effect, या inkjet printer की खूबियों का पूरा फायदा उठाने वाला तरीका—इनके बीच उलझा हूँ
“अगर यह एक experimental project है और आप इस data cost को बहुत सस्ता, हो सके तो free रखना चाहते थे” तो NewsCatcher भी है। Open source side projects के लिए free है
https://docs.google.com/forms/d/e/1FAIpQLSejrsj4a1ZQkIasiKCt...
थोड़ा related, मैं हर सुबह MacBook पर NYTimes front page खोलने वाली एक छोटी script इस्तेमाल कर रहा हूँ
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)