sidenote

Archívum
A(z) „Bash” címke bejegyzései

About a year ago I got a request on GitHub regarding bash-weather, if I intend to make bash-weather print a colored output. I totally forgot about it. But when the other day I was browsing on GitHub I remembered this request, and I have written the “colored output feature”.

bash-weather

bash-weather bash-weather bash-weather

Also, there are some videos about bash-weather and my previous shell scripts (bash-gorillas, bash-life) made by a guy who I think is really into command-line applications (I can understand why).

Check out the description below the videos. ;)

Megosztás, like stb.

I have been working on a project since last (2014) spring. I have been building a mirror inspired by Michael Teeuw’s Magic Mirror and now I have finished it! It is called Mirror π, and it is a “smart mirror”.

Mirror π

What’s this all about? How is it smart? More posts to come (I hope sooner than later), until than you can already browse the source code on GitHub.

Megosztás, like stb.

Múlt héten jött a hír, hogy rendelhető a Raspberry Pi-hez készített infravörös filter nélküli kamera a Pi NoIR.

Pi NoIR

Kép: adafruit industries blog

Azonnal rendeltem is egyet, majd írtam egy kommentet a HUP-ra, hogy én mire használom a kamera modult. trey-nek megtetszett, amit írtam, és írt is egy bejegyzést az ételdobozból és Raspberry Pi-ból készített time-lapse kamerámról.

Ennek eredményeképpen több megkeresést kaptam, hogy mennyibe kerül egy ilyen hordozható time-lapse kamerát összeállítani, illetve milyen szoftvereket használok, ezt próbálom most összefoglalni.

Szeretném megjegyezni, hogy az eddig elkészült felvételek még nincsenek kész, nincsenek megvágva, nincs rajtuk javítás stb. A cél egy hosszabb videó, vagy klip vagy ilyesmi készítése, és még nagyon az elején járok a dolognak.

Miből áll és mennyibe kerül?

A legegyszerűbb, ha felsorolom az alkatrészeket. (Az árak mellett feltüntettem, hogy milyen pénznemben értendők, mert pár dolgot külföldről rendeltem.)

  • Raspberry Pi Model B (rev2): 35 USD – Napi árfolyam kérdése, hogy Forintban mennyi.
  • Raspberry Pi Camera Board: 16.56 GBP – Napi árfolyam kérdése, hogy Forintban mennyi.
  • Wi-Fi USB adapter: ~2000–4000 HUF – Nagyon fontos, hogy elég legyen neki az az áram, amit az RPi közvetlenül le tud adni, különben powered hubot kellene használni.
  • SD kártya: ~5000+ HUF – Legalább 16 GB-os, class 10-es SD kártyát ajánlok, mert egy-egy fotózás alkalmával simán összejön 4–5 GB fotó.
  • 2 db 4-es AA elemtartó: ~150 HUF – Bármelyik elektronikai üzletben kapható.
  • kapcsoló: ~25 HUF – Nem emlékszem, hogy mennyibe került, 100 HUF alatt van az biztos.
  • 8 db 2500 mAh-ás 1,2 V-os NiMH akkumulátor: ~4000–8000 HUF – Az ár a márkától függ, nekem eléggé noname van. :)
  • ételdoboz: ~1000 HUF – Fontos, hogy légmentesen zárható legyen, így eső esetén nem folyik be a víz, a köd nem okoz gondot stb.
  • matt akrilfesték spray (fekete és fehér): ~2000 HUF – Az ételdoboz belülről feketére, kívülről fehérre van fújva. Belül fekete, hogy a különböző ledek fényét, villogását elnyelje nehogy becsillanjon a kamerába. Kívülről azért fehér, hogy visszaverje a fényt a melegedést elkerülendő.
  • UV szűrő: használtan ~500–1200 HUF
  • csavarok, alátétek: ~100 HUF
  • fényképezőgép állvány: Ehhez inkább nem írok árat (nekem korábbról volt már egy). Viszont nagyon fontos, hogy ha állvánnyal dolgozom, akkor legyen az állványon alul valami kampó, vagy más, hogy súly lehessen akasztani az aljára. Ugyanis az ételdoboz nagyobb, mint egy átlagos fényképezőgép, és a súlya még elemmel együtt is kicsi, ezért könnyen belekap a szél.
  • egyebek: maszkolószalag, szigetelőszalag, drót, forrasztópáka, forrasztóón, fenyőléc, laminált padlódarab. Utóbbi rögzíti a dobozt az állványra; úgy „faragtam”, hogy az állvány fejébe illeszkedjen. Ezek mind voltak itthon, árat nem tudok mondani.

Végösszeg: 28284 HUF (mindenből a legolcsóbbal és a mai USD és GBP árfolyammal számoltam).

Ebben nincs benne a fényképezőgép állvány, az itthon talált felhasznált anyagok, alkatrészek, sem az a készíttetett gyűrű, amelybe az UV szűrő illeszkedik. Nem gondoltam volna, hogy ennyit költöttem rá. Sőt, nekem 32 GB-os SD kártyám van, és nem is mindenből a legolcsóbb cucc, ráadásul több kamera modulom is van (NOiR is)… Szóval én valahol 50 ezer felett járok.

Szoftver

A legutóbb ennyit írtam a szoftverről:

A fényképezés mobiltelefonról vezérelhető:

  • A Pi egy USB-s WiFi modul hostapd és isc-dhcp-server segítségével szolgáltat hálózatot.
  • Egy SSH klienssel be lehet jelentkezni a Pi-re.
  • Egy egyszerű shell script a raspistill alkalmazással preview képet készít, amit netcat-tal browserbe továbbítva lehet megtekinteni.
  • Szintén egy shell scripttel lehet elindítani a fényképezést (5000 ms timeout).

Most ezt megpróbálom kicsit jobban kifejteni.

Az RPi-n „gyári” Raspbian fut, a fényképezéshez pedig a raspistill programot használom. Az SSH szerver szintén a „gyári”, a hostapd és az isc-dhcp-server konfigurációját pedig egyszerűen innen puskáztam:

A használt scriptek pedig letölthetők:

Nincs bennük semmi magic. A fényképezésre külön scriptek vannak (capture-*.sh), amelyekben csak a két kép közötti timeout az eltérő. Preview-t pedig a preview.sh scripttel lehet készíteni. Ez utóbbi ahhoz kell, hogy a fényképezés elindítása előtt rendesen be lehessen állítani az állványt és a kamerát.

Képek feldolgozása

A képek bizgetéséhez ImageMagick-et használok. Itt egy szokásos, csak croppoláshoz és átméretezéshez használt parancs, ami végigmegy a megadott könyvtárban található összes jpg fájlon:

mogrify -gravity northwest -crop 2592x1458+0+308 +repage -resize 1920x -format png \
-path /media/szantaii/Tibor/capture/cap1_processed/ /media/szantaii/Tibor/capture/cap1/*.jpg

Egy másik paraméterezéssel már a színeket is állítgattam (ennek az eredménye látható a poszt végén):

mogrify -gravity northwest -contrast -contrast -color-matrix "1.2 -0.1 -0.1 -0.1 1.2 -0.1 -0.1 -0.1 1.2" \
-crop 2592x1458+0+243 +repage -resize 1920x -format png \
-path /media/szantaii/Tibor/capture/cap28_processed_enhanced/ /media/szantaii/Tibor/cap28/*.jpg

Az utolsó példában pedig egy 1,6 fokos forgatás, vágás és átméretezés van:

mogrity -gravity center -background "rgb(0,255,0)" -rotate "1.60" +repage -gravity northwest \
-crop 2446x1376+54+176 +repage -resize 1920x -format png \
-path /media/szantaii/Tibor/capture/cap30_processed/ /media/szantaii/Tibor/capture/cap30/*.jpg

A felsoroltakon kívül még az ImageMagick -sigmoidal-contrast operátorával „játszottam”.

Az eddigi parancsokkal csak a képeket dolgoztam fel. A képekből a videót pedig FFmpeg-gel fűzöm össze. A végeredményt 30 és 60 fps-be is ki szoktam renderelni, hogy lássam melyik néz ki jobban. A 30 és a 60 fps generálása között csak annyi a különbség, hogy az FFmpeg-nek meg kell adni, hogyan értelmezze a bemenetként szolgáló képeket, vagyis az -r kapcsoló után 30-at vagy 60-at kell írni.

ffmpeg -r 30 -i %06d.png -vcodec libx264 -vprofile high444 -vlevel 4.2 -pix_fmt yuv420p ~/Desktop/test_30fps.mp4
ffmpeg -r 60 -i %06d.png -vcodec libx264 -vprofile high444 -vlevel 4.2 -pix_fmt yuv420p ~/Desktop/test_60fps.mp4

Hirtelen (az elmúlt másfél órában) ennyi jutott eszembe.

Megosztás, like stb.

Raspberry Pi stencil

Nem a stencilen. Azon Király András dolgozott: aprólékos munkával kivágta az 5 cm magas mintát, és ráfújta arra a dologra, amin „dolgozom”.

A legutóbbi befuccsolt projektem után, arra gondoltam, hogy valami egyszerűbbel próbálkozom: építek egy hordozható kamerát. Mindehhez egy Raspberry Pi-t, a hozzá tartozó kamera modult, néhány újratölthető elemet és egy hermetikusan zárható ételdobozt használtam fel.

Raspberry Pi camera Raspberry Pi camera

A célom, hogy kihozzam a maximumot a Raspberry Pi kamera moduljából, hogy megmutassam… Valamit, amit még meg kell, hogy fogalmazzak. Igazából ez nekem hobbi és játék. Szeretnék egy érdekes, Budapestet bemutató timelapse videót összerakni.

A működéséről röviden, tömören – és valószínűleg a többség számára érthetetlenül – a képek után.

Raspberry Pi camera Raspberry Pi camera
Raspberry Pi camera Raspberry Pi camera
Feeding Raspberry Pi through GPIO

A táp 2 × 4 db sorban kötött 1.2 V-os 2500 mAh-ás akkumulátor párhuzamosan kötve. Így jön össze a 4.8 V és az 5000 mAh, amivel kb. 4,5–5 órát tényleg ki is bír a Pi.

A fényképezés mobiltelefonról vezérelhető:

  • A Pi egy USB-s WiFi modul hostapd és isc-dhcp-server segítségével szolgáltat hálózatot.
  • Egy SSH klienssel be lehet jelentkezni a Pi-re.
  • Egy egyszerű shell script a raspistill alkalmazással preview képet készít, amit netcat-tal browserbe továbbítva lehet megtekinteni.
  • Szintén egy shell scripttel lehet elindítani a fényképezést (5000 ms timeout).

A következő playlistben láthatók 30 és 60 fps-sel lejátszva az eddig készített felvételek. Tudom, hogy nem jó az optika – hisz ez csak egy kis fix fókuszos „vacak” –, amatőr stb., de mint mondtam, ez nekem hobbi és játék. Remélem, azért másnak is tetszik majd az eredmény.

Végül álljon itt a Raspberry Pi Foundation-t vezető Eben Upton előadása a napokban tartott LinuxCon North America 2013 konferenciáról. (Nagyon jó.)

Megosztás, like stb.

Csak röviden, tömören: elkészült a múltkor beharangozott bash-weather.

bash-weather

Megtalálható a bash.sidenote.hu-n, de elsődlegesen a GitHub-on.

Megosztás, like stb.

Folytatom a teljesen értelmetlen, ámde bonyolultabbnál bonyolultabb shell scriptek írását. Most egy időjárásjelentő script van soron. Íme a mockup:

bash-weather

A script úgy működik, hogy a gép IP címe alapján lekéri a jelenlegi tartózkodási helyünket (freegeoip.net), majd az OpenWeatherMap-ről leszedi a jelenlegi időjárási adatokat, valamint az előrejelzést. Ez eddig nem volt para, csak XML-t kellett parsolni, ami Bash-ben némi Perl regexp grep-pel simán megoldható.

Viszont némi segítségre volna szükségem a nagy ASCII képeket illetően. Művészi véna hiányában nem vagyok jó ilyenek „rajzolgatásában”, ezért olyasvalakit keresek, aki elkészítené a szükséges ASCII képeket. Az OpenWeatherMap API/Weather Codes oldalon, az Icon List szekcióban megtalálható, hogy milyenek kellenek:

  • tiszta ég (napsütés, éjszakai ég),
  • kevés felhő (nappali és éjszakai változat),
  • felhős (ebből elég egy fajta),
  • tiszta – esős (külön nappali, éjszakai),
  • eső,
  • zápor/felhőszakadás,
  • havazás,
  • köd.

Ráadásul, hogy mindezt nehezítsem, ezekre 40×16 karakter (40 oszlop, 16 sor) méretben volna szükségem.

Help, I need somebody,
Help, not just anybody,
Help, you know I need someone,
Help!

Megosztás, like stb.

A bash-gorillas után itt a „legújabb” shell scriptem, a bash-life. Igazából tavaly nyáron írtam, de csak most tettem rendbe a kódot.

Így néz ki, természetesen karakteres képernyőn:

                                   bash-life                                    
+------------------------------------------------------------------------------+
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                        o                                                     |
|                         o                                                    |
|                       ooo                                                    |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
+------------------------------------------------------------------------------+
Navigate: arrow keys, Toggle cell: spacebar                Start: 's', Quit: 'q'

A bash-life egy Bash-ben írt Game of Life szimulátor. Hogy mi az a Game of Life, a Wikipédiáról megtudható:

Az életjátékot (angolul: The Game of Life) John Conway, a Cambridge Egyetem matematikusa találta ki. Játékként való megnevezése megtévesztő lehet, mivel „nullszemélyes” játék; és a „játékos” szerepe mindössze annyi, hogy megad egy kezdőalakzatot, és azután csak figyeli az eredményt. Matematikai szempontból az ún. sejtautomaták közé tartozik. A játék egyes lépéseinek eredményét számítógép számítja ki […]

A négyzetrács mezőit celláknak, a korongokat sejteknek nevezzük. Egy cella környezete a hozzá legközelebb eső 8 mező (tehát a cellához képest „átlósan” elhelyezkedő cellákat is figyelembe vesszük, feltesszük hogy a négyzetrácsnak nincs széle). Egy sejt/cella szomszédjai a környezetében lévő sejtek. A játék körökre osztott, a kezdő állapotban tetszőleges számú (egy vagy több) cellába sejteket helyezünk. Ezt követően a játékosnak nincs beleszólása a játékmenetbe. Egy sejttel (cellával) egy körben a következő három dolog történhet:

  • A sejt túléli a kört, ha két vagy három szomszédja van.
  • A sejt elpusztul, ha kettőnél kevesebb (elszigetelődés), vagy háromnál több (túlnépesedés) szomszédja van.
  • Új sejt születik minden olyan cellában, melynek környezetében pontosan három sejt található.

Szóval, ezen szabályok alapján működik a bash-life is. A játék indítása után a négyzetrácson a nyíl gombokkal lehet navigálni, space-szel lehet egy sejtet életre kelteni/kinyírni, az „s” billentyűvel indítható a szimuláció, „q”-val pedig bármikor ki lehet lépni.

Előkövetelmény Bash ≥ 4.2, ncurses-bin és minimum 80×6 méretű terminál (ez utóbbi még változhat). A kód elérhető GitHub-on, a futtatáshoz pedig a következőket kell terminálba bepötyögni:

$ git clone https://github.com/szantaii/bash-life.git
$ cd bash-life
$ bash bash-life.sh

További fejlesztések:

  • a kód további kommentelése;
  • bejegyzés létrehozása a bash.sidenote.hu oldalon.

Bugreportot küldhettek mailen, akár diffet is, de jöhetnek a pull request-ek is GitHub-on.

Megosztás, like stb.

Ezt írtam legutóbb:

A következő nagy projekt a Gorillas játék Bash változata. Hosszú lesz megírni, és egészen biztos vagyok benne, hogy fájdalmasan lassan fog futni, de akkor is… Jó lesz!

Nem volt hosszú, vagy nehéz megírni, és nem fut „fájdalmasan lassan” sem (ez persze géptől függ), viszont tényleg jó lett.

bash-gorillas

Előkövetelmény Bash ≥ 4.2, ncurses-bin, bc és minimum 80×22 méretű terminál. A kód elérhető GitHub-on, a futtatáshoz pedig a következőket kell terminálba bepötyögni:

$ git clone https://github.com/szantaii/bash-gorillas.git
$ cd bash-gorillas
$ bash bash-gorillas.sh

bash-gorillas bash-gorillas

További fejlesztések:

  • README frissítése (hét második fele);
  • kód kommentezése (majd valamikor);
  • dobás szög és sebesség felhasználó által való javítási lehetősége (ezt a hét második felében megcsinálom);
  • max_speed, wind_value beállítása a játék indításakor getopts használatával (hétvégén vagy jövő héten megírom);
  • bejegyzés létrehozása a Projektek, illetve a bash.sidenote.hu oldalakon.

A hátralevő fejlesztések ellenére már használható a cucc. Viszont ne habozzatok írni, ha találtok bugot, elérhetőségem a Rólunk oldalon. (Diffeknek örülnék a legjobban.)

Megosztás, like stb.

#!/bin/bash

Az utóbbi időben mindenféléket írogatok, Bash-ben. Hogy miért shell script? Egyszerűen azt is mondhatnám, miért ne, de igazából arról van szó, hogy élvezem ennek a nyelvnek a használatát. Adatstruktúrából nincs sok, van tömb, asszociatív tömb és kb. ennyi, nincs objektum, nincs beépített lebegőpontos aritmetika. :) Igazi kihívás valami bonyolultabb problémát shell scriptben megírni, mégis előfordul, hogy a megoldás egész hatékony.

Ismét felmerül a kérdés, hogy miért próbálok bonyolult dolgokat shell scriptben megcsinálni, mikor azokra vannak más, bejáratott programozási nyelvek, metódusok. Egyszerűen azért mert szívás. Folyton workaroundokban kell gondolkodni, különböző trükköket kell bevetni, gondolkodtat, és szeretem feszegetni a határokat. Emellett ott van még a teljes userland, amit aztán úgy használok, ahogy csak akarok. A megoldás természetesen nem a leggyorsabb, néha fájdalmasan is lassú lehet, viszont shell scripteket könnyedén és gyorsan lehet írni.

Létrehoztam egy oldalt, ahol közzétettem néhány scriptemet: http://bash.sidenote.hu/

Eddig a következőket tettem fel:

  • ASCII labirintus generátor,
  • Debian font csomag preview script,
  • logaritmikus spirál kirajzoló script,
  • Mandelbrot halmaz kirajzoló script.

ASCII maze Debian fontpackage previewer
Logarithmic spiral Mandelbrot set

Minden script GNU GPL v3-as licenccel van ellátva. Hogy a licenc mit enged és mit nem, megtaláljátok a shell script oldalon. További scriptek várhatók, pl. amint lesz időm szépen bekommentezem, és kiteszem a Bash-ben írt Game of Life szimulátoromat, mely az alábbi képre kattintva működés közben is megtekinthető. VIGYÁZAT, MÁSFÉL MEGÁS ANIMGIF!

Game of Life Shell Script

A következő nagy projekt a Gorillas játék Bash változata. Hosszú lesz megírni, és egészen biztos vagyok benne, hogy fájdalmasan lassan fog futni, de akkor is… Jó lesz!

BashGorillas

Megosztás, like stb.

Pont azután olvastam Plastik Józsi angelday Commodore 64 BASIC „grafikás” posztját, hogy nekiálltam, és meghegesztettem a Gorillas-t, hogy fusson Windowson és Linuxon. Tökéletes időzítés.

Ezzel az egy sorból kiindulva készült egy könyv, ami a számítógépek és a procedurális BASIC grafikák világát, benne a Commodore 64-et mutatja be – 10print.org. […]

Plastik média – 10 PRINT CHR$(205.5+RND(1)); : GOTO 10

Nagyon jó könyv, gyönyörű dolgok vannak benne.

10 PRINT CHR$(205.5+RND(1)); : GOTO 10

Gondoltam egyet, és átírtam a 10 PRINT CHR$(205.5+RND(1)); : GOTO 10 sort Batch-be, PowerShellbe és Bash-be is. Sajnos az első három változat nem produkál olyan szép „képet”, mint C64-en, viszont ha kicseréljük a „/” (slash) és „\” (backslash) karaktereket „-” és „|” (vertical bar) karakterekre, akkor egész szép labirintusokat kapunk. Linux-on Unicode terminált használva szinte tökéletes az output.

  • Batch

    1
    2
    3
    4
    5
    6
    7
    8
    9
    :LOOP
        @ECHO OFF
        SET /A R=%RANDOM% %%2
        IF %R%%2==0 (
                ECHO|SET /P=/
            ) ELSE (
                ECHO|SET /P=\
            )
    GOTO LOOP

  • PowerShell

    1
    While($true) {Write-Host -NoNewline $(if ((Get-Random -Minimum 0 -Maximum 2) -eq 0){"/"} else {"\"})}

  • Bash (Mac)

    1
    while true ; do if [ $((RANDOM % 2)) -eq 0 ] ; then printf "/" ; else printf "\" ; fi done

  • Bash (Linux)

    1
    while true ; do printf "\u257$(($RANDOM % 2 + 1))"; done

Hála a fent említett könyvnek, ismét felfedeztem a Processinget. Remélem sikerül valami érdekeset szépet alkotnom vele.

Megosztás, like stb.