1 पॉइंट द्वारा GN⁺ 2024-10-05 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • हर सुबह मोबाइल 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 टिप्पणियां

 
GN⁺ 2024-10-05
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 देखता रहा

    • receipt printer मज़ेदार हैं, लेकिन ध्यान रहे कि हानिकारक thermal paper न खरीदें
      https://www.consumerreports.org/cro/news/2014/03/the-health-...
    • मेरा thermal printer भी हर सुबह weather प्रिंट करता है, और अगर कोई अहम device network से हट जाए तो notification प्रिंट करता है
    • receipt printer वाकई मज़ेदार होते हैं। कुछ साल पहले मैंने इसी तरह के setup से GitHub tickets प्रिंट करने वाला project किया था, और वह उस setup जैसा ही था जिसे मैं अभी dot matrix printer के साथ इस्तेमाल करता हूँ
    • जानना चाहूँगा कि कौन-सा printer इस्तेमाल कर रहे हैं। मैं एक खरीदने के बारे में सोच रहा हूँ, लेकिन आपके बताए notification feature और external control features के बारे में नहीं जानता था
  • आज अचानक यह सवाल मन में आया
    यह व्यक्ति जो काम कर रहा है, उनमें से एक बस /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 कराने की जद्दोजहद वाली खुशी भी याद होगी

    • OS X पर अभी test किया; लगता है यह बताए गए तरीके की तरह printer को /dev/ के नीचे expose नहीं करता। इसके बजाय OS X में भी lp है, इसलिए echo "Hello printer" | lp -d की तरह इस्तेमाल कर सकते हैं, और नाम lpstat -p से मिल जाता है
      नए printer पर test किया तो सच में काम करता है
    • नीचे के दोनों मेरे setup में काम कर गए
      printf 'hello\f' > /dev/usb/lp0
      printf 'hello\f' | nc -N $printer_ip 9100
      यह Brother laser printer पर था, और online manual के पास programming guide लिंक है। language PCL है, लेकिन simple output के लिए ज़्यादा जानने की जरूरत नहीं
      ऊपर के दोनों CUPS का इस्तेमाल नहीं करते। दूसरे comments की तरह lp/lpr executables इस्तेमाल करने हों तो पहले 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 होता है
    • कुछ साल पहले खरीदा नया Epson LX-350 मेरे पास है, जो USB से जुड़ता है और serial/parallel ports भी हैं। USB से connect करने पर यह /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 करता था
    • network printer पर भी संभव है। खुले port पर netcat से PDF भेजें तो print हो जाता है
      https://retrohacker.substack.com/p/bye-cups-printing-with-ne...
    • 1990s में school computer lab में अभी भी dot matrix printer था, और network के हर computer पर default printer के रूप में set था
      आम 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 को भेजता था

    • पहले शुरुआती desktop publishing programs में SoftCraft का Fancy Font नाम का एक program था। यह CP/M और बाद में DOS program था, इसलिए PageMaker जैसा WYSIWYG page layout tool नहीं था; यह simple markup language से formatted text documents इस्तेमाल करता था
      शुरुआत में इसने 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 का भविष्य साफ़ दिखने लगा था
    • मेरे पिता के पास 90s में 4-color dot matrix printer था। Deluxe Paint II का pharaoh head print करने में बहुत समय लगा, लेकिन सच में काफी सुंदर लगा
      हालांकि print के बाद कागज़ बहुत ज़्यादा मुड़ गया था। Printer अभी भी मेरे पास है, लेकिन 4-color ribbon कहाँ मिलेगा, पता नहीं
    • मुझे endless roll paper पर landscape mode में विशाल banners print करने की याद है। यह आजकल terminal में figlet जैसी commands जो ASCII art बनाती हैं, वैसी चीज़ थी। शायद वह अब भी printer output support करता हो
    • Design के नज़रिए से मैं इसे और explore करना चाहता था। Manual में font size, emphasis, italic, subscript/superscript जैसी चीज़ों पर सचमुच दर्जनों pages हैं
      शायद version 2.0 में इसे आज़मा सकता हूँ
    • कोई terminal हो जो ESC/P समझता हो और कई fonts और CPI जैसी चीज़ें support करता हो, तो मज़ेदार होगा
  • मैंने इस 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

    • सच में कमाल है। लगातार update होते stock/cryptocurrency prices छापने वाली ticker tape की नकल करने के लिए मैं भी कभी ऐसा equipment ज़रूर हासिल करना चाहता था
      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 connect करें, और dev output में बस write कर दें। अगर मानकर चलें कि यह Linux पर चल रहा है, तो वह output बस एक file है
      सबसे कठिन हिस्सा 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 करना अच्छा हो?

    • FT की recommendation देना मुश्किल है
      मैंने 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 की खूबियों का पूरा फायदा उठाने वाला तरीका—इनके बीच उलझा हूँ

    • समझना चाहता हूँ, लेकिन लगता है कि या तो text में ही या मेरी तरफ़ से बहुत context छूट गया है। लगभग हर paragraph पिछले paragraph से पूरी तरह असंबंधित लगता है
  • “अगर यह एक 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.pdf

    • पहले इन front page images से एक RSS feed बना रखा था, जिसे इस्तेमाल करना हो कर सकता है
      https://nytonline.net/rss
    • इसे one-liner में बदल दिया
      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.pdf
    • dmy=$(date +%d/%m/%Y)