Návrat k RSS (po rokoch)
Blog pojednáva o znovuobjavení čara RSS, tentokrát v prostredí Emacs-u
1 Prológ
Keď som začínal v r. 2004 s GNU/Linuxom, internetové pripojenia neboli vôbec rýchle a ani cenovo veľmi dostupné. Vo firme i doma sme mali nejaký dial-up a na cestách som používal EDGE modem od Orange. Kvôli obmedzeniu rýchlosti i množstva dát som začal používať konzolový program Snownews a články som otváral v textovom Lynx-e. Ostatne, videá neboli, zaujímavé obrázky sa dali otvoriť v externom programe, takže aj pri nízkorýchlostnej prenosovej technológii bolo čítanie správ svižné. A - weby sa vtedy ešte optimalizovali, obrázky zmenšovali (rozmery i farebná hĺbka), skripty a iné balasty boli minimálne.
A teraz som sa, po 16 rokoch, opäť k RSS vrátil.
2 Motivácia
Ale prečo vlastne?
Zrejme to súvisí s tým, že ako sa človek snaží úkony pri počítači automatizovať, časom dôjde aj na oblasti, ktoré nie sú až tak prvoradé alebo nesúvisia s prácou.
A možno je za tým aj akýsi odpor k dnešným webom, ktoré schovávajú podstatnú informáciu (pre mňa) - text, za záplavu reklám, bannerov, menu, informácií o cookies,…. Isteže, väčšinu z toho možno efektívnej blokovať (napr. pomocou uBlock Origin), ale súčasne mi prekáža, že každý web má vlastné veľkosti a farby písma (iste, aj CSS sa dajú blokovať).
Nebolo inej cesty ako sa vrátiť k RSS. Opäť v konzole, ale tenktokrát v mojom preferovanom Emacs-e.
3 GNU Emacs a Elfeed-mode
Opisovať Emacs nemá zmysel. Ostatne, je to tak známy kus softvéru, že hádam niet užívateľa GNU/Linuxu, ktorý sa s ním nestretol. Azda len taký, ktorý si spustil Vi(m) a dodnes v ňom ostal (starý vtip tvrdí, že preto, lebo nevie, ako ho ukončiť ☺).
Osobne používam odjakživa Emacs iba v konzole. GUI mi nesedí, nepáči sa mi, že aj tak by som ho dizajnovo priohýňal do vzhľadu TUI a jeho spustenie nie je také rýchle (iste, Emacs ako démon to čiastočne rieši), ale napr. konzolový Emacs ľahko hodím do pozadia, spustím/pozriem/spravím niečo (čo sa nedá v Emacs Shell-i alebo v Emacs Term-e) a potom fg a je naspäť.
Ale možno je to len zvyk.
Elfeed-mode je rozšírenie, ktoré umožňuje pracovať s RSS zdrojmi. Je možné ho stiahnuť z https://github.com/skeeto/elfeed (kde je i výborná dokumentácia), niekam ho nakopírovať a potom spúšťať samotný .el (alebo kompilovaný .elc) súbor.
Druhou možnosťou, ktorá je zrejme preferovaná, je použitie MELPA správcu balíkov, čím sa nielen automaticky rozšírenie nainštaluje do Emacsu, ale navyše sa dá ľahko program povyšovať na vyššie verzie.
Ale je tam určité "ale". A tým je neduh Emacsu, ktorý nové rozšírenia, ich spúštanie a ich nastavenia vloží do konfiguračného súboru (typicky ~/.emacs), ktorý týmto rastie a pri každej spustenej inštancii Emacsu sa musia tieto "prejsť" a čo-to strojového času zkonzumovať.
Takže pri snahe o zdravý minimalizmus to riešim tak, že mám sústavu dodatočných skriptov v ELISP-e (Emacs Lisp), ktoré sa spustia, ak je to potrebné (napr. pri otvorení programu v C potrebujem iné rozšírenia, ako pri písaní emailov či riadení agendy).
No a automatická inštalácia elfeed-mode práve toto spraví - nielen, že nadefinuje skratky navyše pre tento mode, ale súčasne sa musí popasovať s konfiguráciou a RSS zdrojmi.
Moje riešenie spočíva v nasledovnom:
Elfeed-mode mám spustený nepretržite v samostatnom okne konzoly. Spúšťam ho príkazom:
roxterm -T "RSS" -e "emacs -nw -f load-rss"
Kde load-rss je funkcia definovaná v ~/.emacs
(defun load-rss() "Load RSS from ~/.emacs.d/rss/rss.el" (interactive) (load "~/.emacs.d/rss/rss.el") (elfeed) )
Takže elfeed-mode sa spustí po naštartovaní Emacsu v okne konzoly. Vyzerá to takto:
Ovládanie je jednoduché:
klávesová skratka | akcia |
---|---|
Shift + G | (znovu)načíta RSS zdroje |
Enter | podrobnejší opis správy |
b | otvorenie správy v prehliadači |
s | filtrovanie |
c | reset filtra |
g | potlačí už prečítané správy bez aplikácie filtra |
Jednoduché, prosté, ale prečo to nevylepšiť?
4 RSS zdroje, externý prehliadač
Ako sme videli, nahraním ~/.emacs.d/rss/rss.el sa spustil malý skript, v ktorom mám definované (tu len výber):
(setq elfeed-feeds '( ("http://www.dsl.sk/export/rss_articles.php" dsl.sk pc) ("https://planet.emacslife.com/atom.xml" emacs) ("http://ergoemacs.org/emacs/blog.xml" xah emacs ) ("http://linuxos.sk/clanok/feeds/latest/?include_comments" linuxos linux) ("http://linuxos.sk/blog/feeds/latest/?include_comments" linuxos linux) ("https://www.linux.org/articles/index.rss" linux.org linux) ("https://old.reddit.com/r/commandline.rss" reddit commandline) ("https://old.reddit.com/r/linux.rss" reddit linux) ("https://old.reddit.com/r/emacs.rss" reddit emacs) ("https://old.reddit.com/r/orgmode.rss" reddit org) ("https://old.reddit.com/r/vintageunix.rss" reddit vintageunix) ("http://dfens-cz.com/feed/" dfens news) ("https://www.youtube.com/feeds/videos.xml?channel_id=UC8uT9cgJorJPWu7ITLGo9Ww" 8-bit yt) ("https://www.youtube.com/feeds/videos.xml?channel_id=UC2eYFnH61tmytImy1mTYvhA" lukesmith yt) ("https://www.youtube.com/feeds/videos.xml?channel_id=UCt7rRDigd7oKNsUBMOHkwGg" jaffarski yt) ("https://www.youtube.com/feeds/videos.xml?channel_id=UCD0y51PJfvkZNe3y3FR5riw" chyrosan yt) ))
Takže takto sa dajú pridávať RSS zdroje, ich URL a najmä tag-y, pomocou ktorý je možné správy v základnom zobrazení filtrovať.
A týmto:
(setq browse-url-firefox-program "/usr/bin/xlinks2")
definujeme externý prehliadač, ktorý sa spustí po stlačení klávesy "b".
Hm - že xlinks2?
Presne tak, je to úžasný, rýchly, grafický prehliadač webu. Žiadne CSS, žiadne skripty. Len čisté informácie.
Niekto by mohol namietať, že je predsa možné použiť aj vstavaný eww prehliadač v Emacse. To je pravda, ale to by som musel používať GUI verziu Emacsu. Alternatívou by bolo mať osobitný inicializačný súbor pre GUI verziu, len so spusteným eww. To by šlo.
No čo ak chcem napr. pridať komentár do Reddit-u, ale toto xlinks2 nezvládne…?
Jedno z možných riešení spočíva v takejto funkcii (tiež v ~/.emacs.d/rss/rss.el):
(defun palemoon () "Palemoon link with cursor on." (interactive) (shell-command (concat "palemoon " (thing-at-point 'url) "")))
Takže - ak som v podrobnom zobrazení správy (po stlačení Enteru) a kurzor mám na URL správy, tak spustením príkazu palemoon (pomocou M-x), ktorý by sa samozrejme dal priradiť aj ku klávesovej skratke, sa otvorí príslušná URL v inom prehliadači, u mňa v Pale Moon-e.
5 Iné funkcie
A toto sa dá samozrejme omnoho viac vylepšiť. Napr. ďalšia mnou vytvorená funkcia:
(defun mpv () "MPV link with cursor on." (interactive) (shell-command (concat "mpv --ytdl-format=22 " (thing-at-point 'url) " &")) (progn (run-at-time "2 sec" nil 'delete-windows-on (get-buffer-create "*Async Shell Command*")) ))
prehraje video na Youtube a následne po spustení zavrie buffer s výstupom programu.
Analogicky:
(defun ebook () "Webpage link under cursor into e-book goes." (interactive) (shell-command (concat "~/bin/webpage-pdf-e-reader-rss.sh " (thing-at-point 'url) " &")) (progn (run-at-time "2 sec" nil 'delete-windows-on (get-buffer-create "*Async Shell Command*")) ))
pošle URL stránky do ďalšieho skriptu v BASH-i, ktorý stránku prevedie do formátu pre čítačku elektronických kníh (názov súboru vyextrahuje z názvu stránky) a uloží do určitého adresára.
Reddit používam často, ale ak sa otvorí v xlinks2, tak je potrebné skrolovať niekoľko strán, kým sa zjaví relevantný obsah. Ale aj tu je pomoc - nakoľko text správy začína pod textom "Welcome to Reddit", tak sa dá využiť xdotool ku vyhľadaniu reťazca a skoku naň:
(defun reddit-jump () "Jump to beginning of article in xlinks." (interactive) (shell-command "sleep 2 && xdotool key --window `xdotool search --name Links` slash w e l c o m e space t o space R e d d i t Return"))
Ešte elegantnejšie riešenie je editovať súbor elfeed-search.el, a následne ho skompilovať (byte-compile-file)
(defun elfeed-search-browse-url-reddit (&optional use-generic-p) "Visit the current entry in your browser using `browse-url'. If there is a prefix argument, visit the current entry in the browser defined by `browse-url-generic-program'." (interactive "P") (let ((entries (elfeed-search-selected))) (cl-loop for entry in entries do (elfeed-untag entry 'unread) when (elfeed-entry-link entry) do (if use-generic-p (browse-url-generic it) (browse-url it))) (mapc #'elfeed-search-update-entry entries) (unless (or elfeed-search-remain-on-entry (use-region-p)) (forward-line))) (shell-command "sleep 2 && xdotool key --window `xdotool search --name Links` slash w e l c o m e space t o space R e d d i t Return"))
a tiež mu priradiť klávesovú skratku:
(define-key map "B" #'elfeed-search-browse-url-reddit)
6 Niečo k filtrovaniu
Filtrovanie je rýchle a intuitívne. Filter sa upravuje "defaultne" po stlačení s a vyzerá napríklad takto:
@6-months-ago +unread +yt
Čo znamená zobrazenie príspevkov novších ako 6 mesiacov, neprečítaných a s tagom yt (YouTube videá).
Myslím, že viac netreba dodávať, hádam len, že pomocou - je možné potlačiť zobrazenie tagu a pokiaľ sa nezadá ako + ani -, tak dôjde k vyfiltrovaniu príspevkov, ktoré obsahujú v názve zadaný text.
7 Záver
To je asi všetko bez zbytočného balastu. RSS majú stále svoje miesto, ich efektívnosť, rýchlosť spracovania a úspora času sú úžasné.
Azda za nevýhodu možno považovať, že človeka môžu držať v určitej informačnej bubline.
Napísané v org-mode pre GNU Emacs. , , / \ ((__-^^-,-^^-__)) `-_---' `---_-' `--|o` 'o|--' \ ` / ): :( :o_o: "-" G N U
Pre pridávanie komentárov sa musíte prihlásiť.
Vim a Chuck Norris to schytávajú pravideľne a vždy sa na tom človek pobaví :-) Vynikajúci blog akurát som popri ňom dovaril.
To sa človek nestačí čudovať na čo sa dá použiť xdotool. Je to krása ako to máš vymakané, možno ešte niekedy nájdem odvahu siahnuť na GNU Emacs, tam by som sa nemal zaseknúť :-D
RSS ako technologia alebo ako format (zalozeny na XML)? Kedze RSS format sa nahradza formatom Atom (modifikacia formatu RSS).
Napriklad Gmail (browser) nove mozes vidiet cez RSS technologiu na: https://mail.google.com/mail/u/0/feed/atom
Vedia bezny ludia o RSS/Atom, ze pre kuknutnie, ci prisiel mail nemusia otvarat cely gmail web.
Len malé vylepšenie k otváraniu v externom programe.
Aby nebolo potrebné chodiť kurzorom na link, dá sa vyhľadať aj pomocou funkcie ELispu.
Takže riešenie je: