Linux

Programy, skripty a navody pro Linux.

1x DP to 2x HDMI

1x DP to 2x HDMI



HW description in web-shops often lacks important information. I haven’t been able to find this device outside of Czech Republic, so I won’t translate details of the description. Translation of the title in one of the shops is: “PremiumCord adapter mini DisplayPort – 2x HDMI, extension + mirroring of image, 4K*2K@30Hz kportadm18” and there isn’t much extra information in the description. Google didn’t find any datasheet or manual.

You may think this device would merge two screens to one wider virtual screen like Matrix Dualhead2Go did, but it didn’t. It just tunnels both screens via one DP directly to the graphic card. Therefore it will not allow to connect the 4th screen to my integrated Intel graphics card in Lenovo T540p, which is limited to three screens. So the Linux utility xrandr reports:

xrandr: cannot find crtc for output eDP-1

when I try to add a 4th screen.

Have I been deceived to buy useless junk? Not exactly. I’m trying to add more screens for some time now, so I have expected it will not work and I can use it for another computer. But this text may help you to decide if this piece of HW will solve your problem or not.


Z popisu v obchode je obcas tezke poznat, co vlastne dany kus hardware dela. Posudte sami:

PremiumCord adaptér mini DisplayPort – 2x HDMI, rozšíření + zrcadlení obrazu, 4K*2K@30Hz kportadm18
Popis produktu
Značkový adaptér, který slouží k propojení zařízení s DisplayPort výstupem se dvěma HDMI protějšky (například počítačovými monitory nebo s televizní obrazovkou).
Obraz na výstupních zařízeních lze například rozšířit nebo zrcadlit. Systém podporuje technologii MST pro snadný přenos páru obrazů přes jediný DisplayPort výstup. Délka kabelu činí 20 cm.

Ve vypisu vlastnosti naleznete navic

 EAN: 8592220015510

a podle nej lze nalezt nekolik dalsich informaci, z nihz nektere se nezdaji byt pravdive: “Napájení z DisplayPort sběrnice”, protoze zarizeni je napajeno microUSB konektorem (nemohu ale vyloucit, ze na nekterych pocitacich zvlada oboji).

Spoji dva monitory do jednoho virtualniho (jako to umel napriklad Matrix Dualhead2Go)? Nebo jen pripoji dva monitory za pomoci jednoho DP portu? To se nikde nepise.

Google nabizi jen dalsi ceske eshopy, kde lze zarizeni koupit at uz se hleda podle nazvu (kportadm18) a vyrobce, nebo podle EAN.

Takze jsem zarizeni koupil a otestoval.

Co to umi?

Pripojit dva monitory k pocitaci s mini-DP vystupem pujde, pokud graficka karta zvladne dva monitory (to snad zvladnou vsechny).

Pripojit tri monitory (dva za pomoci tohoto zarizeni) pujde i k integrovanym grafickym kartam intel. Overeno na Lenovo T540p.

Pripojit ctyri monitory nejde, pokud graficka karta neumi ctyri monitory. Proc? Protoze toto zarizeni pouze pripoji dva monitory za pomoci jednoho DP portu. Ve vypisu z xrandr-u se objevi dva nove monitory a v okamziku, kdy se pokusite pripojit ctvrty, dostanete tuto chybu:

xrandr: cannot find crtc for output eDP-1

Zaver

Takze jsem se nechal napalit? Ani ne, napul jsem to ocekaval a dokazi to vyuzit i k jinemu ucelu, nez jsem puvodne planoval. Ale pokud hledate neco, co spoji dva monitory tak, aby je graficka karta videla jako jeden, toto zarizeni to neni.

Posted by Low Hateria Count in Linux, 1 comment
Simple serial sniffer

Simple serial sniffer


I needed to see what’s going on my serial port to test some new hardware. Screen isn’t very usable when these values aren’t printable ASCII characters and using hexdump isn’t very practical due to buffering and printing it when whole line accumulates. So I have created this simple piece of code in python: serial_hexsniffer.py.

How it works

It uses python library serial to read byte by byte from selected serial port. All these bytes are printed to stdout in hexadecinal and decadic representation. If the value is between 0x20 (space) and 0x7E it’s printed as ascii character too.

What it needs to run

Linux and python (developed on 2.7)

Example

serial_hexsniffer.py /dev/ttyUSB0 115200



Pri debuggovani ruzneho hardware obcas potrebuji videt, co se deje na seriovem portu. Screen funguje pekne, dokud jsou vsechny znaky tisknutelne ASCII. Hexdump bufferuje a ceka, dokud nemuze vypsat cely radek, takze mi nezbylo, nez si napsat svoje reseni:
serial_hexsniffer.py.

Jak to funguje

Cte to ve smycce byte po bytu ze seriaku za pomovi pythonovske knihovny serial. Vsechny vypise na standardni vystup v hexa a dekadicky, pokud je znak navic tisknutelny (0x20-0xFE), vypise i ASCII znak.

Co to potrebuje k behu

Linux a python (vyvinuto na verzi 2.7)

Priklad

serial_hexsniffer.py /dev/ttyUSB0 115200

Posted by Low Hateria Count in Linux, 0 comments
Hyper is the new Super

Hyper is the new Super

Na tohle (at uz to je cokoliv) by se hodila klavesova zkratka. Jenomze jaka? Ctrl+pismeno, nebo cislo, muze kolidovat s nekterymi aplikacemi a s ovladanim terminalu (zvlast Ctrl+C,Z,Q a S je velmi neprakticke odchytavat). Alt+pismeno pouzivaji jine aplikace. Alt+F-klavesa se pouziva na prepinani pracovnich ploch. Mackat vice modifikatoru je docela nepohodlne (i kdyz uzivatele Emacsu trenuji, co mohou).

Docela prakticke je pouzit jako modifikator klavesu Wokno, kterou X prijme jako Super_L, nebo Super_R (levou a pravou) a dale ji mapuje na X-ovy modifikator Mod4. Pak takova klavesova zkratka v konfiguraku fluxboxu vypada napriklad takto:

Mod4 x :Exec xterm

Ale ne na kazde klavesnici takova klavesa je. Treba na psani velmi pohodlna IBM model M ji nema.

Behem techto uvah jsem si znovu uvedomil, jak me stve CapsLock. Uz pred nekolika lety doslo k deCapsLockizaci jedne klavesnice sroubovakem, protoze se na ni povedlo az prilis casto tuhle klavesu strefit omylem spolecne s pismenem “a”. Po nalezeni redukce z velkeho DINu na PS/2 a prechodu na jiz zminenou IBM Model M CapsLock opet vyvstal, znovuzrozen, jako Fenix. Model M mi, narozdil od scheisse-membranovky, bylo lito nicit. A to byla idealni prilezitost pro sber statistiky o vyuzivani teto klavesy.

Vyuziti CapsLock
umyslne neumyslne
------------------
0       mockrat

Nesel by CapsLock predefinovat na neco uzitecnejsiho? Pry se dal prohodit s Ctrl, jako to mely stare layouty klavesnic. Nezbylo, nez zacit hledat.

Nakonec jsem se dostal az sem: https://en.wikipedia.org/wiki/Space-cadet_keyboard. Dobre si prohlednete modifikatory z pred-UNIXove doby a jejich rozmisteni. Vsechny ctyri modifikatory jsou na obou stranach klavesnice, zrcadlove proti sobe a v jedne rade. Takze bylo mozne zmacknout jejich kombinaci i bez polydaktilie, kterou si dnes preji k vanocum ctyri z peti uzivatelu Emacsu.

Takze to mame do prostredka do kraje: Ctrl: jasne, ten mam na klavesnici taky, ne? Meta: ne, tahle ne. Vetsinou (a defaultne) se jako Meta mapuje na PC klavesnici Alt. Super: tam je namapovana klavesa s wokynkem, tucnakem, nebo jinum obrazkem jako v materske skolce. Hyper: WTF, to jsem jeste nevidel.

Klavesu Hyper jde na PC klavesnici namapovat treba na klavesy s wokynkem a nebo prave na zmineny CapsLock. Staci v Xkach pustit:

setxkbmap -option caps:hyper

a je to. Jenomze se chova stejne, jako klavesa Super (wokynko). Proc?

To, ze do Xek prijde scankod klavesy Hyper jeste mnoho neznamena, Xka zmaji 8 modifikatoru (a vic jich mit nemohou, protoze modifikatory jsou v bitove maper v jednom Byte) a do toho se pocita i Shift, CapsLock, NumLock a prepinac layoutu klavesnice. Hyper je na vsech pocitacich, na ktere jsem se koukal, defaultne nastaveny na Mod4 stejne jako Super.

Takze nasleduje prehozeni na (defaultne prazdny) Mod3.

xmodmap -e "remove Mod4 = Hyper_L" -e "add Mod3 = Hyper_L"

a hned to vypada lepe:

$ xmodmap -pm

xmodmap:  up to 3 keys per modifier, (keycodes in parentheses):

shift       Shift_L (0x32),  Shift_R (0x3e)
lock
control     Control_L (0x25),  Control_R (0x69)
mod1        Alt_L (0x40),  Meta_L (0xcd)
mod2        Num_Lock (0x4d)
mod3        Hyper_L (0x42),  Hyper_L (0xcf)
mod4        Super_L (0x85),  Super_R (0x86),  Super_L (0xce)
mod5        ISO_Level3_Shift (0x5c),  Mode_switch (0xcb)

A ted uz staci pouzit klavesovou zkratku s Hyper na neco uzitecneho, takze do ~/.fluxbox/keys zapiseme treba:

Mod3 b :Exec xmessage -center -timeout 2  "$(/home/username/bin/bt)"
Mod3 i :Exec xmessage -center -timeout 5  "$(/home/lhc/username/show_ip_addrs)"

a jeste naplnime oba soubory a zapneme jim executable flag (chmod +x jmeno_souboru):
/home/username/bin/bt:

for bat in /sys/class/power_supply/BAT*; do
        cat "$bat"/energy_now | tr '\n' ' '
        echo -n 'from '
        cat "$bat"/energy_full | tr '\n' ' '
        echo -n '= '

        (
                cat "$bat"/energy_now | tr '\n' ' '
                echo -n '*100/'
                cat "$bat"/energy_full  | tr '\n' ' '
                #rounding
                echo '+0.005'
        ) | bc -l | sed 's/\([^.]\...\).*/\1 \%/'
done

Na ruznych notebookach muze byt informace o bateriich v ruznych adresarich, takze je nutne si prohlednout /sys/ a nahradit /sys/class/power_supply/ spravnou cestou.

/home/lhc/username/show_ip_addrs (na jeden radek):

/sbin/ifconfig | sed 's/        inet /#inet /;s/^\([^# ]\)/#@\1/' | tr '@\n' '\n#' | sed 's/^\([^:]*\)[^#]*#*/\1\t/; s/inet//; s/netmask.*//' | grep -v '^#'

Pak uz staci jenom zmacknout Hyper b (teda vlastne CapsLock b) a uprostred monitoru se na dve sekundy objevi informace o stavu akumulatoru. Misto prehistoricke xmessage se da samozrejme pouzit treba mnohem modernejsi notify-send, ale ten se neumi zobrazit doprostred monitoru (bacha, prijima timeout v milisekundach).

A pokud jste behem cteni nezapomneli, proc jsem s vyzkumem alternativnich vyuziti CapsLocku zacal, je vam asi jasne, ze klavesova zkratka Hyper a zustava neobsazena. Technicky samozrejme nic nebrani tomu namapovat na ni shozeni Firefoxe (aspon by se restartoval driv, nez stihne vyzrat celou RAM). Hlavne si nezapomente namapovat nejakou dulezitou funkci na Hyper Super Shift Ctrl Alt H. Jiste to ocenite, az ji budete potrebovat zmacknout mene, nez trema rukama :-).

Poznamka: pokud by se jednalo pouze o klavesnici IBM Model M, stacilo by namapovat na CapsLock Super_L timto prikazem: “setxkbmap -option caps:super”, ale pracuji na vice pocitacich s ruznymi klavesnicemi, takze chci vyuzit najednou Hyper i Super na klavesnicich bez numerickeho bloku.

Posted by zelenohlav in Linux, 2 comments

Klavesnicova makra podruhe – lokalni

Diky Jendove komentari pod jak-automaticky-vkladat-text-i-kdyz-se-nekdo-snazil-aby-to-neslo jsem objevil xdotool. Precetl jsem si manualovou stranku a dostal par napadu. A o tech, ktere se mi zatim osvedcily bude tento clanek.

UNIXova graficka nadstavba X-window ma sice nekolik schranek (clipboardu), ale pokud je chcete normalne pouzivat – treba oznacit levym tlacitkem text v browseru a vlozit ho prostrednim tlacitkem do textoveho editoru otevreneho v terminalu, nebo naopak – je nutne system nakonfigurovat tak, aby se choval, jakoby mel schranku jednu. Jenomze obcas by se hodilo vice schranek u kterych si clovek muze sam vybrat, do ktere co ulozi. Staci se snazit nekomu poslat mail, ve kterem je cast textu z jineho mailu. Ctu zdrojovy mail, oznacim text, zavru zdrojovy mail, otevru novy mail, chce to po me adresu, zjistim adresu, chci ji oznacit a tim prichazim o puvodni text. Ne, ze by to byla neresitelna situace, ale zbytecny opruz to je.

Nekdo mozna namitne, ze mam mit adresar s maily primo v klientovi … ale tak muj mozek nefunguje. Ne, opravdu nevim, jestli jsem si toho cloveka ulozil pod jmenem, prijmenim, nebo prezdivkou. Pripadne pod kterou prezdivkou. A pokud je to firma, tak si dost mozna pamatuju jenom jednu vec, kterou jsem tam kupoval a nic jineho. Takze by ten mailovy klient musel umet prohledavat bloky textovych dat podle (nekdy i vice) klicovych slov a ve vybranem textu pak hledat mailove adresy. Ne, ze by to principialne neslo, ale nic takoveho jsem nikde nevidel, takze mam svuj program na adresar. Adresu oznacim levym tlacitkam, prejedu do terminalu (nebo jen prehodim screen) s mailovym klientem a vkladam prostrednim tlacitkem.

Obcas se take stava, ze clovek potrebuje posbirat data z vice mist a vlozit je do jednoho. Treba prijde URL rozlamana na vice radek od nekoho, kdo ma mail na seznamu. Nebo je potreba vykopirovat z nejakeho clanku na webu jenom to dulezite a ne kecy okolo.

Cim to ovladat?

Zadani je jasne a ted nastava otazka cim to ovladat. Samozrejme by slo pouzit zvlastni klavesove zkratky, ale pak je problem pri vkladani textu, protoze text prichazi jako z klavesnice, takze je nutne pockat, nez uzivatel pusti vsechny modifikatory (Control, Alt, Shift, Tucnak …), jinak se mohou stat nejruznejsi veci. Samozrejme by slo poslat text z vedlejsiho pocitace pres inputattach (klavesnicova makra poprve), ale jak ho pohodlne dostat tam? Taky by slo poslat nejake nevyuzivane scankody, ale na bezne klavesnici se par nevyuzivanych klaves najde.

Kdysi jsem psaval cisla zasadne na numericke klavesnici. Jenomze pak prisly vykonne notebooky, vice cestovani a numericka klavesnice najednou nebyla k dispozici, takze nezbylo, nez se naucit psat cisla na hornim radku klavesnice. Po par letech uz mi to ani neprislo a od te doby je numericky blok me klavesnice zcela nevyuzit. Precijen je zbytecne daleko na to, aby tam clovek presouval ruku, kdyz chce napsat cislo a zdrzuje to. Jeste se da pouzit Ctrl a numericky +/- na zmenu velikosti textu v browseru, ale to uz funguje i s normalnim + a -, jak se mi povedlo zjistit po ziskani noveho notebooka, ktery uz numericky blok ani neemuluje pres Fn. Tim ziskavame klavesy 0-9 na 10 schranek a nekolik dalsich okolo.

Jak to ovladat?

Zkusime tedy vymyslet intuitivni ovladani.

Do schranky je potreba ulozit a pak z ni cist. Prepinani modu je pakarna, protoze si clovek musi pamatovat v jakem je modu (a samozrejem VIM ktery textovy editor je nejlepsi, ale i tak je lepsi se tomu vyhnout, kdyz to jde). Slo by rozdelit klavesy na 0-4 a 5-9, ale to by bylo intuitivni jak brainfuck. Takze zbyvaji tri rozumne varianty: vkladat bez modifikatoru a cist s modifikatorem, nebo opacne, pripade delat vse bez modifikatoru a hadat, co chce uzivatel udelat. Systemy, ktere hadaji, co chce uzivatel udelat vetsinou funguji blbe a clovek se kvuli nim nauci sprosta slova v mnoha cizich jazycich. Dalo by se predpokladat, ze s prazdnou mysi schrankou se ma extra schranka vypsat a s plnou se ma text prekopirovat z mysi do extra schranky. Ale na rovinu – mazete po pouziti obsah schranky? Asi ne, to by byl opruz navic. Delat si zivot tezsi neplanuju, takze posladni moznost pada.

Vypisovat obsah schranky modifikatorem znamena, ze modifikator modifikuje zacatek vypisu. To je sice jakesi technicke omezeni, ktere by mozna slo obejit lepe, nez rychlym uvolnenim modifikatoru v kombinaci s vlozenim cekani pred zacatek vypisu, ale neni to jedina nevyhoda. Druha nevyhoda je vkladani bez modifikatoru. Je sice rychle, ale obcas clovek hrabne po prave sipce, nebo PgUp/PgDn a strefi se i na numerickou klavesnici a prepise si schranku, aniz by si to uvedomil. Na to jsem prisel tim tezsim zpusobem (nejdriv mi to pripadalo intuitivnejsi).

Tim zbyva jedina varianta: prepis schranky mysi do extra schranky: modifikator + cislo na numericke klavesnici (pouzivam Shift), vypsani extra schranky: cislo na numericke klavesnici.

Tim se resi i sber dat po dokumentu, ale kdo si ma pamatovat kterou schranku pouzil naposledy. Takze by se hodila jeste funkce na pridani do schranky. Rozhodl jsem se to nekomplitovat a vytvorit jedenactou extra schranku, do ktere pujde pridavat z mysi schranky. Klavesa tecka na numericke klavesnici ji smaze (krome tecky to je i Delete, ale asi jste ji tak v tomto tisicileti nepouzili), klavesa plus prida (to je docela intuitivni) a klavesa lomitko vypise obsah (protoze minus a hvezdicku uz mam zabranou). Jeste me napadlo, ze by plus se shiftem a altem mohl pridat mezeru, nebo konec radku a teprve pak dalsi data, ale ukazalo se, ze to prilis nepouzivam.

Kdo sezral minus a hvezdicku? Numerickym minusem vkladam obsah schranky, kdyz nechci sahat az na mys a hvezdickou vkladam totez, jen s odstranenou diakritikou (to se obcas hodi). Vyhoda je ta, ze se do grafickych programu text vlozi tam, kde je prave textovy kurzor (stejne, jako do terminalovych pri beznem vkladani prostrednim tlacitkem) a neni treba peclive pozicovat mysi kurzor tam, kde uz je textovy kurzor.

Implementoval jsem toho vice, ale toto jsou veci, ktere od okamziku implementace pouzivam temer denne a prijdou mi kulervouci.

Implementace

Je potreba rozlisit, jestli cisla a dalsi znaky prichazi z alfanumericke casti klavesnice, nebo z numerickeho bloku. To lze vyresit tak, ze vytvorime zkratku na scankod klavesnice a ne na prichazejici znak. Scankody zmacknutych klaves (a dalsich eventu) ukaze program xev.

Navod je specificky pro windowmanager Fluxbox, ktery pouzivam. Pokud pouzivate jiny, ceka vas googleni a cteni manualovych stranek, protoze vlastni klavesove zkratky jsem v zadnem jinem windowmanageru asi nikdy nekonfiguroval (mozna v minulem tisicileti ve fvwm2 a WindowMakeru, ale v takovem pripade uz jsem zapomnel jak). Ve Fluxboxku to je zcela jednoduche. Staci otevrit soubor ~/.fluxbox/keys a pridat par radek:

#Numericke 0-9
Shift 79 :Exec /home/username/bin/xtraclip_mem 79
Shift 80 :Exec /home/username/bin/xtraclip_mem 80
Shift 81 :Exec /home/username/bin/xtraclip_mem 81
Shift 83 :Exec /home/username/bin/xtraclip_mem 83
Shift 84 :Exec /home/username/bin/xtraclip_mem 84
Shift 85 :Exec /home/username/bin/xtraclip_mem 85
Shift 87 :Exec /home/username/bin/xtraclip_mem 87
Shift 88 :Exec /home/username/bin/xtraclip_mem 88
Shift 89 :Exec /home/username/bin/xtraclip_mem 89
Shift 90 :Exec /home/username/bin/xtraclip_mem 90
79 :Exec /home/username/bin/xtraclip_mem_out 79
80 :Exec /home/username/bin/xtraclip_mem_out 80
81 :Exec /home/username/bin/xtraclip_mem_out 81
83 :Exec /home/username/bin/xtraclip_mem_out 83
84 :Exec /home/username/bin/xtraclip_mem_out 84
85 :Exec /home/username/bin/xtraclip_mem_out 85
87 :Exec /home/username/bin/xtraclip_mem_out 87
88 :Exec /home/username/bin/xtraclip_mem_out 88
89 :Exec /home/username/bin/xtraclip_mem_out 89
90 :Exec /home/username/bin/xtraclip_mem_out 90

#Numericky -
82 :Exec /home/username/bin/mouse_copy
#Numericka *
63 :Exec /home/username/bin/mouse_copy_uncs

#Numericky +
86 :Exec /home/username/bin/xtraclip_add
#Numericka .
91 :Exec /home/username/bin/xtraclip_del
#Numericke /
106 :Exec /home/username/bin/xtraclip_out

Misto username si samozrejme dejte svuj username. Asi se to vyrovna i jen se jmenem programu, pokud mate svuj “$HOME”/bin v ceste, ale proc to delat zavisle na promennych prostredi.

xtraclip_mem:

xclip -out > ~/extra_clipboard/"$1"

xtraclip_mem_out:

xdotool type -- "`cat ~/extra_clipboard/"$1"`"

mouse_copy:

xdotool type -- "`xclip -out`"

mouse_copy_uncs:

xdotool type -- "`xclip -out | cstocs utf8 ascii`"

xtraclip_del:

echo -n '' > ~/extra_clipboard/x

xtraclip_add:

xclip -out >> ~/extra_clipboard/x

xtraclip_out:

xdotool type -- "`cat ~/extra_clipboard/x`"

Jeste vytvorit adresar, kde budou v souborech ulozene nove clipboardy (ktere timpadem preziji i restart pocitace):

mkdir ~/extra_clipboard/

Pokud neco z toho nefunguje, jak ma, vlozte do skriptu pred xdotool sleep.

sleep 0.1

Pak uz staci v menu ve Fluxboxu dat reload config (nebo restartovat Fluxbox, nebo Xserver) a muzete se tesit z novych klavesovych zkratek. Nakonec – jak si myslite, ze se do tohoto clanku dostaly obsahy tech vsech souboru. Skutecne jsem nepreklikaval osmkrat sem a tam. Deset schranek je navykovejsich, nez opiaty.

EDIT: Zda se, ze jsem se unahlil s optimalizaci. Behem ladeni jsem na zacatku kazdeho z vyse uvedenych skriptu pouzival

sleep 0.5

a postupne jsem ho snizil az na 0.1 sekundy. Pak jsem presel na klavesove zkratky, ktere pri vypisovani nepouzivaji zadny modifikator, takze se sleep zdal byt zbytecnym a pri psani tohoto clanku byl vynechan. Samozrejme bez otestovani, protoze jsem si byl jist, ze tam uz je k nicemu.

Ukazuje se, ze tam k nicemu neni. V pripade, ze tam sleep neni, nevypise se prvni znak, protoze zjevne prijde drive, nez Key Release od klavesy, ktera akci spustila.

Posted by zelenohlav in Linux, 4 comments
Ceske cislice slovy

Ceske cislice slovy

Potreboval jsem automatizovat generovani slozenky. Formular slozenky vypada, ze byl navrzen v dobe, kdy byl Wattuv rozteznik horkou novinkou. Nektere informace obsahuje snad i trikrat, radky v ruznych sloupcich nejsou zarovnane, nelze vytisknout cely najednou, ale je potreba se strefit tiskarnou do predtisteneho papiru a navic vyzaduje castku napsanou slovy.

Skript cisla_cz umi popsat slovy kazde cele cislo od nuly do 999999. Rozsireni na vyssi cisla by bylo pomerne jednoduche, ale miliony jsem slozenkou posilat jeste nevidel. Je napsan v BASHi, ale v zasade jde jednoduse prepsat do jakehokoliv imperativniho jazyka, ktery podporuje ridke pole (sparse array). Staci nahradit retezcove operace se sed-em aritmetikou.

Popis funkce:

Jeho jedinym parametrem je cislo. Pokud najde ve vstupu jine znaky, nez 0-9, stezuje si, ze to neni cislo. To plati i pro zaporna, realna a komplexni cisla, ktera jsem na slozence resit nepotreboval. Zde je prostor pro vylepseni.

Je-li na vstupu 0, vypise nula.

Pro cisla vyssi, nez 9999 urizne posledni tri cislice, rekurzivne zavola skript na zbytek cislic a vypise za to tisic. Dale posle jen posledni tri cislice.

Pote vzdy porovna zbytek s cislem 999, 99 a 9, aby se nesnazil odecitat nulu, odecte prvni cislici, vyhleda ji v poli s prislusnym radem a vypise retezec. Kdyz dojde k nule, skonci.

Cele to bylo napsane bez smycky, protoze jsem ocekaval vice problemu s ceskym jazykem. Nakonec se ukazalo, ze by to slo napsat i ve smycce, ale to uz to bylo hotove a nechtelo se mi to psat znovu jinak.

Sekce zpracovavajici cisla mezi 999 a 9999 je tam kvuli spravnym tvarum slova tisic. Jsou i lide, kteri rikaji treba tricet dva tisice, misto tricet dva tisic, ale zda se, ze spravne jsou oba tvary.

A ted si muzete uzivat generovani cisel.

Posted by zelenohlav in Linux, 0 comments

Klavesnicova makra poprve

Tento prispevek navazuje na jak automaticky vkladat text i kdyz se nekdo snazil aby to neslo a odkazuje na SW a HW v nem zmineny.

Klavesnicova makra si predstavuji jako funkce, kterym jdou dat parametry a podle nich se vygeneruje vlozena sekvence uhozu na klavesnici. V nejjednodussim pripade se se parametry dosadi nekam do textu, ktery se posle. Ve slozitejsich pripadech se muze treba podle zadane mailove adresy prijemce rovnou prednastavit osloveni a podpis a podobne pokrocilejsi funkce.

Zatim mam napsana jen hloupa makra: serkbd_in_loop.py. Cely HW a SW na strane prijemce zustava stejny. Staci spustit program v pythonu, jako root* a pak mackat klavesy. Klavesou q se program ukonci, ostatni klavesy zpusobi pokus o nalezeni souboru s jednopismennym nazvem v aktualnim adresari a poslani jeho obsahu.

Pismena jsou samozrejme zadavana na klavesnici druheho pocitace a retezce znaku definovane v souborech prijdou do pocitace prijimaciho.

Takze kdyz vytvorim textovy soubor se jmenem u a s obsahem uname -a, staci na klavesnici ovladajicicho pocitace zmacknout u a na ovladanem pocitaci se napise uname -a (at uz bude focus kdekoliv – do terminalu, do mailu, jako by to bylo napsano primo na klavesnici).

V UNIXu neni prilis prakticke vytvares soubory se jmeny *, nebo – a vytvorit soubor se jmenem / by nastesti nemelo jit vubec. Takze pro seriozni pouziti by se hodil jiny zpusob ukladani maker. Tohle je spise proof of concept.

*) Kdyz poustite program jako root, ziska kontrolu nad celym vasim pocitacem. Takze se hodi alespon trochu rozumet tomu, co v nem je. Mohl jsem tam schovat neco zakerneho (neudelal jsem to, ale to bych sem napsal i v pripade, ze bych to udelal, to da rozum). Nekdo mohl odchytit packety po ceste na siti a zmenit obsah. Nakonec nejjednodussi zpusob je ukrast muj text a program (ten se krade blbe, ma licenci GPL :-)), dat oboje nekam na freeweb a do programu pridat nejaky nechteny bonus.

Happy hacking!

P.S. odmitam prijmout zodpovednost, za skody zpusobene makry. Takze pokud si vytvorite makra s hesly a odkazy na sve oblibene pornostranky a povede se vam je omylem vlozit do pracovniho emailu a diky enteru na konci makra rovnou i odeslat, muzete si za to sami, ja vas varoval.

Posted by zelenohlav in Linux, 7 comments

Jak automaticky vkladat text i kdyz se nekdo snazil, aby to neslo

Clovek obcas narazi na program, nebo webovou stranku, kde si nekdo dal tu praci, se znemoznenim vkladani textu prostrednim tlacitkem mysi. Nekdy se da text vlozit klavesovymi zkratkami, nekdy pres menu, nekdy vubec a vzdy je cloveka nedustojne hledat jakym zpusoben (a jestli vubec) to tentokrat pujde.

V Linuxu nastesti existuje moznost pripojit ps/2 klavesnici po seriovem portu a ta jde vyuzit i zajimavejsim zpusobem. Scankody ps/2 klavesnice muze totiz posilat druhy pocitac. Oba pocitace musi mit seriovy port (konvertor do USB funguje, takze staci USB). Seriove porty se propoji nullmodemem (to je kabel, kde je prekrizeny TX a RX). Zapojeni kabelu je na Wikipedii, nebo se da bezne koupit. A to je cely HW, vic toho neni potreba delat a obejdete se bez pajky a programatoru mikrokontroleru.

Na pocitaci, ktery ma ziskat falesnou klavesnici je potreba pustit jako root:

inputattach --baud 19200 --ps2serkbd /dev/ttyUSB0

a na pocitaci, ktery posila data lze pouzit napriklad serialkbd.py.

Puvodni klavesnice samozrejme funguje dal a dokonce ovlivnuje chovani tehle falesne, takze napriklad zmacknuti shiftu zmeni mala pismena na velka (az do prvniho pusteni shiftu tou falesnou klavesnici).

V pripade, ze bude program pusten pres ssh z terminalu na stejnem pocitaci, jako kam je vkladan text, pak doporucuji vlozit pred program nekolikasekundove cekani, aby bylo dost casu prepnout focus do zadaneho mista:

sleep 3; serialkbd.py datovy_soubor

alternativne by slo treba nakonfigurovat aby se na nejakou klavesovou zkratku spustilo ssh, ktere prekopiruje zvolena data na druhy pocitac a spusti vlozeni po seriovem portu.

Zda se, ze dnes uz jde na ebayi koupit prevodnik z ps/2 na seriovy port – staci hledat ‘ps2 serial arduino’. Temer s jistotou bude mit TTL vystupy, takze bude nutne zkonvertovat napetove urovne MAX232 na +-12V, ale pak by sla pripojit bezna klavesnice na seriovy port pocitace, ktery by zpracovaval psany text a posilal ho dal. To by umoznilo implementovat makra, pridat klavesy (treba vyuzitim normalni klavesnice pripojene k tomu ridicimu pocitaci, jeho paralelniho portu, USB, apod.), nebo treba nahravat psany text a umoznit ho cast znovu prehrat. To se obcas hodi kdyz se povede neco napsat do spatneho okna a nebo kdyz nekdo implementoval na webove strance komentarovy formular tak blbe, ze pri jakekoliv chybe text zmizi a neda se k nemu vratit ani pres tlacitko zpet v browseru.

Jeste zodpovim par predpokladanych dotazu:

Otazka: Musi tam byt druhy pocitac, neslo by spojit tim nullmodemem dva seriove porty na tom samem pocitaci?

Odpoved: Slo.

Otazka: A musi tam vubec byt ten HW, neslo by to nejak udelat pres virtualni porty?

Odpoved: Urcite by to nejak slo, ale z hlavy nevim jak. Treba se k tomu nekdy dostanu, prijdu na to a pridam to sem.

Otazka: To jsi delal jenom kvuli par blbym programum, ktere znemoznuji vkladani mysi?

Odpoved: Chtel bych klavesnici s makry, ktera si budu moci sam programovat. Zkonvertovat ps/2 na seriovy port a zpracovavat nezavislym pocitacem stream dat na seriovem portu mi prijde nejjednodussi. Umozni to nahravat provoz na klavesnici a cast ho znovu prehrat (treba kdyz clovek neco napise do spatneho okna) a navic to muze nahradit i KVM pro praci na vice pocitacich.

Otazka: Ma to smysl? Makra umi nektere herni klavesnice.

Odpoved: Vsechny herni klavesnice, ktere jsem zatim videl (kamarad jich mel plnou skrin) vyzadovaly k programovani maker nejaky program pro Windows, coz je system, ktery nemam, neumim s nim a navic by byl pekny opruz kvuli kazdemu programovani makra prehazovat klavesnici mezi pocitaci. Krome toho je otazka co vsechno tam jde naprogramovat. Moje reseni umoznuje naprogramovat v zasade cokoliv, co jde napsat v C, pythonu, nebo jinem jazyce, ktery lze pustit na pocitaci se dvema seriovymi porty. Tim pocitacem muze byt klidne treba arduino, nebo Atmega8 zabudovana ve fyzicke klavesnici.

Otazka: Ma to smysl? KVM nahradi treba synergy a neni nutne tahat seriove kabely.

Odpoved: Je rozdil precist si manual k synergy, zkusit ho na pet minut a pouzivat ho. Ten program (informace stara asi 4 roky, od te doby jsem ho nezkousel) asi tak jednou za hodinu udela nejakou pitomost. To je dost malo na to, aby se to dobre debuggovalo a prilis casto na to, aby to clovek nechtel rozslapat a prohodit oknem. Problemy pretrvavaly i kdyz synergy dostalo vlastni sitove karty a vlastni prekrizeny ethernetovy kabel.

Otazka: Kdyz to pouziju, jako KVM, budu s tim moci nastavovat i BIOS a bootloader?

Odpoved: Ne. Tohle zacne fungovat, az se pod uzivatelem root pusti inputattach. Ten se muze pustit i automaticky, ale aby to fungovalo drive, nez nabehne jadro, bylo by nutne zkonstruovat HW, ktery by ze serioveho portu delal zpet ps/2. S nejakym mikrokontrolerem by to nemelo byt tezke.

Otazka: Muj Linux nema inputattach, kde he sezenu?

Odpoved: Na Debianu je v balicku inputattach, na Fedore to je v balicku linuxconsoletools, na dalsich distribucich doporucuji hledat googlem jmeno distribuce a inputattach, nebo vyuzit nejaky distribucni tool pro hledani balicku.

Otazka: Chci tam doplnit klavesu, nasel jsem nejake scankody ps/2 klavesnice a dela to uplne nesmysly.

Odpoved: Existuji dve mnoziny ps/2 scancodu. inputattach zjevne pouziva set2. V poli keyboard jsou jednotlive polozky serazene podle jejich ascii kodu. Co se stane s unicode znaky netusim, ale python ma podporu unicode, takze predpokladam, ze v nem bude jednoduchy zpusob, jak projit cele unicode znaky v retezci i kdyby to nebyl ten, ktery jsem pouzil. Pak je otazka, jestli prodlouzit pole, nebo to napsat jinak.

Otazka: Bude mi to fungovat na Windows? Treba v cygwinu?

Odpoved: Na prijimaci strane temer jiste ne. Ale treba nekdo portoval inputattach i pro Windows. Na vysilaci strane (serialkbd.py) bude patrne nutne upravit nejake systemove veci (jmena seriovych portu, apod.), pripadne se postarat o konce radku a asi by to fungovat melo. Python je multiplatformni, takze clovek, ktery ma zkusenosti s programovanim v pythonu pro Windows by to podle meho nazoru mel bez problemu rozchodit. Nicmene moje zkusenosti s Microsoftimi operacnimi systemy konci u turbopascalu a qbasicu nekdy v minulem mileniu.

Posted by zelenohlav in Linux, 3 comments