Category Archives: технология

Logitech Wireless Presenter R400 и Linux

от Йордан Радунчев
лиценз CC BY

За нуждите на офиса купихме Logitech Wireless Presenter R400 - прекрасна джаджа за презентации, която позволява на презентатора да се разхожда свободно пред публиката и да прелиства слайдове отдалеч. Върши страхотна работа с PowerPoint, а съм чувал, че работи и с Evince под Linux. По същество това си е "орязана" клавиатура (като такава я вижда и Линукс), само с четирите клавиша, които трябват за една презентация.

Logitech Wireless Presenter R400

Имаме бутони напред и назад, бутон за стартиране на презентацията и бутон за изключване на картината (бланк). Има и лазерна показалка. Тъй като си падам по всякакви джаджи, изобщо няма да скрия, че много ми хареса нещото. И естествено реших, че няма начин да не го използвам за презентациите си, понеже, нали, съм един безспорно световно известен и навсякъде канен лектор... И ето тук Logitech ме саботираха. Ако ме следвате някъде по социалките, може и да си спомняте, че преди време си търсех инструмент за презентации. Изискванията ми бяха да работи под Линус, естествено, и слайдовете да се изготвят на markdown. След доста проби, се спрях на Preston. Като допълнителна екстра, за която не се бях замислял първоначално, тук ще посоча и факта, че презентацията се случва в web сървър, тоест аудиторията, ако разполага с лаптопи, таблети и прочие, и ако на мястото на събитието има локална мрежа, може да се закачи с браузъра си за презентацията на адреса на моя лаптоп и да я следи както на сцената, така и директно на екрана на устройството пред себе си. Удобно, спор няма.

Обаче. На Logitech джаджата не може да управлява презентацията на Preston, защото тя е отворена в браузъра ми, и прелистването на слайдовете става със стрелките, докато R400, бидейки направен да работи с PowerPoint на Майкрософт, изпраща към лаптопа ми PageUp и PageDown, а те нищо не говорят на браузъра и съответно той изобщо не реагира на тях. Лошо, а? Не съвсем. Понеже използваме по-добрата операционна система, нищо не ни пречи да "препрограмираме" бутоните на джаджата и да я научим да си говори с Preston (или който и да е друг софтуер за презентиране всъщност). Лесно е.

Като първа стъпка ни трябват scan code-вете, които генерира устройството. Трябва да го подслушаме. Първо го намираме на коя "честота" си говори с лаптопа използвайки stat:

yradunchev:~ $ stat -t /dev/input/by-id/usb-Logitech_USB_Receiver-event-kbd --printf "%N\n"
/dev/input/by-id/usb-Logitech_USB_Receiver-event-kbd' ->../event13'

Сега ще го подслушаме, стартираме специалното разузнавателно средство:

yradunchev:~ $ sudo /lib/udev/keymap -i input/event13

И започваме да натискаме бутоните му:

scan code: 0x7003E key code: f5
scan code: 0x70029 key code: esc
scan code: 0x70037 key code: dot
scan code: 0x7004B key code: pageup
scan code: 0x7004E key code: pagedown

За всеки натиснат бутон виждаме неговия scan code и какво изпраща. Обърнете внимание, че виждаме 5 отговора, генерирани от 4 бутона. Сещате ли се? Бутона за старт генерира два кода - един за старт (f5) и един за стоп (esc). После имаме бутона, който "гаси" екрана - dot. И после двата бутона за напред (pageup) и назад (pagedown).

За да науча R400 да си говори с Preston и браузъра ми, създадох файла /etc/udev/logitech-r400 със следното съдържание:

0x7003E f11
0x70029 f11
0x70037 space
0x7004B left
0x7004E right

Това е моя "преводач". На бутона за стартиране съм задал два пъти F11 - така всяко натискане, ще кара браузъра да влиза и излиза от режим full screen. Просто в моя случай това е достатъчно. Бутона за "гасене" на екрана генерира интервал, просто защото нещо трябва да генерира, не че ми върши някаква работа. Важните бутони за мен са наляво и надясно - с тях сменям слайдовете. Ако вие използвате друг софтуер за презентация, който си има собствени шорткъти, просто заменете в този файл на съответните места с неговите. И Logitech Wireless Presenter R400 ще заработи за вас под Линукс, въпреки че официалния съпорт на Logitech твърди, че не може и толкоз.

За да накарам системата да използва моите клавиши с R400 винаги, създадох още един файл: /etc/udev/rules.d/logitech.rules

ENV{ID_VENDOR}=="Logitech*", ATTRS{idProduct}=="c52d", RUN+="keymap $name /etc/udev/logitech-r400"

И сега вече мога да изнасям презентациите си професионално, докато се разхождам важно напред-назад из аудиторията, като истински гуру :) А Logitech да имат много здраве от мен.

Животът е прекрасен ли?

от Йордан Радунчев
лиценз CC BY

В другите новини днес - за пръв път ми се случва да си тръгна от театрално представление в антракта. "Животът е прекрасен" в Народния. Отидох да го гледам, за да разбера защо Камен Донев беше награден за ролята на Подсекалников. Мислех да напиша нещо кратко за представлението... Но се оказа, че всичко се изчерпва с едно изречение: Едно си Камен знае, едно си играе.... Повече няма какво да се добави. И да, стана ми ясно защо са го наградили за тази роля. Защото ще бъде много срамно да го наградят за "Народното творчество", а той пък явно нещо по-различно не може да предложи. Тоест - от немай къде... В интерес на истината ВСИЧКИ останали в това представление играят по-добре от Камен Донев. Много по-добре. Много. Ако отидете да го гледате, насладете се на тяхната игра.

Това което ще видите е нов театрален жанр. Моноспектакъл с елементи на епични масовки. Имаме един Камен Донев, който играе типичната си игра в типичния си монохалтурен стил с приклякване и подмигване, имаме и маса талантливи актьори, които трябва да са фон на моноспектакъла му. Уви, не се е получило. Фона изпъква пред и над главната роля. Значително. Иначе талантливите актьори не се справят поддържащите си роли - не успяват да ги задържат на ниво поддържащи и изместват, направо изблъскват, главната роля от ролята ѝ на главна. Ама не мисля, че вината за това е тяхна. Те просто са добри и по-малко не могат... Както и Донев, той също повече не може. Или може? Ще се радвам да ме опровергае с някоя роля, в която да демонстрира нещо различно от образа на народния учител, който безспорно му се получава, но това не оправдава неговото пренасяне от пиеса в пиеса.

С това си лаишко писание тук съвсем не искам да кажа, че не си заслужава да отидете да го видите! Не. Отидете. Непременно. Заради Александър Морфов, който както винаги е изпипал всичко до съвършенство. Заради перфектната сценография на Тороманов. Рени Врангова е страхотна, Светлана Янчева е невероятна. Самата пиеса като текст, сюжет и образи е нещо, което не трябва да изпускате. Отидете непременно! Всички те заслужават аплодисменти. Но си остава загадка защо от всички тях, награден е именно и само Камен Донев...

Clone drive old fashion way

от Йордан Радунчев
лиценз CC BY

Понякога се налага да направим копие на твърд диск, карта памет, флашка - с архивна цел или защото се налага да извършим върху него някаква потенциално разрушителна операция, като например опит за възстановяване на изтрита информация. Примерно ако някой е опитал да я унижощи с отвертка... В подобна ситуация първото и най-важно нещо е да се направи точно копие на твърдия диск, абсолютно точно до последния бит, за да може да се възстанови в първоначално състояние, ако се наложи. Това е елементарна операция с dd, както всеки по-отворен Линукс потребител би ви обяснил:

dd if=/dev/sdb of=./sdb.img bs=64k

Тази команда ще прехвърли бит по бит, на блокове от по 64к, съдържанието на устройството /dev/sdb във файла sdb.img в текущата директория. Съответно преди да започнете тази операция, трябва да сте сигурни, че имате достатъчно свободно място в текущата директория, защото ако твърдия диск, който копирате е 100Gb, съответно и файла sdb.img ще бъде с големина 100Gb, тъй като представлява точно до последния бит копие на оригинала - включително празното и неизползвано пространство върху него.

Ако целта ви е да възстановите изтрита информация от оригиналния диск - това е начина да си направите архивно копие преди да започнете, защото така ще съхраните и онези части от диска, които са маркирани като свободни, но върху които вероятно са останали "изтритите" данни.

Ако обаче искате просто да си направите архивно копие на твърдия диск, картата с памет от фотоапарата или флашката - тогава най-добре да се оттървете от неизползваното място върху тях, за да можете да компресирате копието с gzip, като по този начин то ще стане значително по-малко от оригинала и няма да ви заема толкова много място. За да е ефективно компресирането, трябва да подготвите празното място на оригинала - най-добре като запишете нули навсякъде върху него - така ще улесните gzip при компресирането и ще го направите много по-ефективен.

dd if=/dev/zero of=/media/usb/dummyfile

С помощта на dd започвате да копирате нули от специалното устройство /dev/zero на Линукс, което има безкраен запас от нули, във файла dummyfile на оригиналния диск/карта/флашка монитран в /media/usb - dd ще "налива" нули в dummyfile, докато там не остане повече празно място и тогава ще "умре". Сега просто изтрийте dummyfile с rm. Това упражнение ни гарантира, че цялото неизползвано пространство съдържа 0 - и образно казано gzip всичките тези нули, ще ги компресира до една единствена 0, спестявайки ни много място. Следващата стъпка е:

dd if=/dev/sdb | gzip -c  > ./sdb.img.gz

Подаваме прочетеното от dd към gzip, който го компресира и излива във файл sdb.img.gz - компресирано точно копие на оригиналния диск.

След като имаме копие от диска, идва момента в който искаме да го възстановим. Просто използваме dd наобратно :)

dd if=./sdb.img of=/dev/sdb

...ако копието ни не е компресирано. Ако е компресирано:

gunzip -c ./sdb.img.gz | dd of=/dev/sdb

...и сме възстановили оригиналното съдържание на sdb...

Ако сте забелязали навсякъде използваме sdb, а не sdb1 - това е важно, защото искаме копие на целия диск, а не само на един дял от него. Ако използвате sdb1 ще направите копие на първия дял от диска, без информацията от boot сектора на устройството и без таблицата на дяловете му. Имайте го на ум.

TermFu (За Android) – справочник за дълги команди

от Владимир Колев
лиценз CC BY-NC-ND
Терминал

ic_launcherАко често използвате терминала или пък харесвате да комбинирате доста от нещата, които вършите в .sh скриптове предполагам, че това приложение от BulTux може да ви бъде доста полезно, особено ако като мен имате проблем със запомнянето на километричните низове от команди с параметри за извършване на задачи от рода на:

- конвертиране на изображения
- записване на екрана във видео формат
- споделяне на екрана чрез SSH
и т.н.

За приложението

TermFu е приложение за Android телефони (Android 2.2+), което ви позволява да преглеждате сайта commandlinefu.com за termfu_dialogразлични команди – от записване на екрана чрез ffmpeg или mencoder, през ssh и различни трикове за споделяне на екрана до следене на системата. На практика сайта предлага различни едно-редови команди, с които можете доста да улесните живота си. От друга страна запомнянето на тези дълги команди е определено непосилно (поне за мен е така), а посещаването на сайта през телефона е меко казано неудобно. Така се роди и идеята за TermFu – едно малко приложение, което по всяко време да ми е под ръка.

Какво предлага като функционалност

- Табът “Последни” (Latest) – предлага на потребителя последните команди, публикувани за последната седмица – избор на команда отваря диалог, в който се показва цялата команда, описание какво прави и позволява на потребителя да копира командата в буфера за споделяне (clipboard). Звездичката, която е на всеки ред, позволява да добавите командата в “Предпочитани”.

- Табът Популярни (Popular) – не се различава по функционалност от Latest, освен че предлага най-популярните команди за цялото време. Това са командите, които с времето са събрали най-много гласове.

termfu_search- Табът “Търсене” (Search) – както предполагате – позволява търсене в commandlinefu.com за въведена от вас ключова дума. Резултатите функционират както последните два таба.

- Предпочитани (Favorites) – показва записаните в базата данни на приложението команди от пторебителя (Записването става, чрез избор на звездата от предните три таба). Тук функционалността е малко по-различна. Контрола става чрез задържане на определен елемент, което активира меню с опции – “Преглед” и “Изтриване”, което предполагам е ясно какво правят.

 

 

Изтегляне

Приложението можете да изтеглите от Google Play Store:

Android app on Google Play

Да си наинстаграмим снимките…

от Йордан Радунчев
лиценз CC BY

Имате стари снимки, искате да изглеждат като онези страхотно модерни снимки, които всички правят с Instagram? Дообре... Imagemagick знае как.

Оригиналната снимка:

Оригиналната снимка...

Ghotam:

Ghotam

convert zkayra.jpg -set option:distort:viewport "%[fx:min(w,h)]x%[fx:min(w,h)]+%[fx:max((w-h)/2,0)]+%[fx:max((h-w)/2,0)]" -filter point -distort SRT 0 +repage -modulate 120,10,100 -fill '#222b6d' -colorize 20 -gamma 0.5 -contrast -contrast ghotam.jpg

Toaster:

Toaster

convert zkayra.jpg -set option:distort:viewport "%[fx:min(w,h)]x%[fx:min(w,h)]+%[fx:max((w-h)/2,0)]+%[fx:max((h-w)/2,0)]" -filter point -distort SRT 0 +repage -fill black -opaque '#330000' -modulate 150,80,100 -gamma 1.2 -contrast -contrast -gaussian-blur 0x1 toaster.jpg

Nashville:

Nashville

convert zkayra.jpg -set option:distort:viewport "%[fx:min(w,h)]x%[fx:min(w,h)]+%[fx:max((w-h)/2,0)]+%[fx:max((h-w)/2,0)]" -filter point -distort SRT 0 +repage -fill black -opaque '#222b6d' -fill white -opaque '#f7daae'-contrast -modulate 100,150,100 -auto-gamma nashville.jpg

Lomo:

Lomo

convert zkayra.jpg -set option:distort:viewport "%[fx:min(w,h)]x%[fx:min(w,h)]+%[fx:max((w-h)/2,0)]+%[fx:max((h-w)/2,0)]" -filter point -distort SRT 0 +repage -channel R -level 33% -channel G -level 33% lomo.jpg

Kelvin:

Kelvin

convert zkayra.jpg -set option:distort:viewport "%[fx:min(w,h)]x%[fx:min(w,h)]+%[fx:max((w-h)/2,0)]+%[fx:max((h-w)/2,0)]" -filter point -distort SRT 0 +repage -auto-gamma -modulate 120,50,100 -fill 'rgba(255,153,0,0.5)' kelvin.jpg

Толкова, за да придобиете представа на какво е способен Imagemagick... Прегледайте документацията, за да се запознаете с пълните му възможности, ако искате да шашнете Света с наистина откачени снимки.

Пропуснах OpenFest

от Ясен Праматаров
лиценз CC BY

Не успях да ида на OpenFest. Имах намерение, но вкъщи сме с леко болничка мама и всички – дечица и тати – се опитваме да помагаме. Не ми липсва пропускането на фестивала – от няколко години вече съм леко встрани от тия неща, по едно време и престанах да ходя. Радвам се, че хората, които продължиха и продължават да го организират, не губят ентусиазма. Аз не съм бил никога от централното ядро там, но покрай Сдружението за свободен софтуер имах досег и донякъде, доколкото можех, съм помагал косвено. Първият OpenFest беше точно на рождения ми ден и отидохме заедно с Краси, после цяла вечер бяхме с хората от екипа, с Krzysztof Zaraska от Prelude IDS и Harald Welte. Беше 2003-та. Сега погледнах – на сайта на OpenFest най-старото споменаване в историята на фестивала е 2006-та. Може би има нещо общо със смяната на хората, с промяната на екипа. Може би има личен момент, както имаше и личен момент в разтурянето на FSA-BG. Жалко, но все тая. Имам много добри приятелства и познанства от тия години и си ги ценя – макар и повечето хора да ги виждам “веднъж на високосна”.

Прекарах топлите пладнета на съботата и неделята в парка с децата. Игри, езерца, катерички, жълъди, въртележки и пързалки и разговори със Светко защо някои деца се държат лошо и как трябва сам да се справя, защото не е честно аз да се намесвам. Хубави дни. Краси е по-добре. Трябва да платим наема днес – като мине това, ще се успокоя, надявам се. Бях изнервен вчера и взех да се карам на децата – поуката е, че валидолът не е лошо нещо и митовете за опасности са пълна глупост и чист HealthScare.

Пропуснах OpenFest

от Ясен Праматаров
лиценз CC BY

Не успях да ида на OpenFest. Имах намерение, но вкъщи сме с леко болничка мама и всички – дечица и тати – се опитваме да помагаме. Не ми липсва пропускането на фестивала – от няколко години вече съм леко встрани от тия неща, по едно време и престанах да ходя. Радвам се, че хората, които продължиха и продължават да го организират, не губят ентусиазма. Аз не съм бил никога от централното ядро там, но покрай Сдружението за свободен софтуер имах досег и донякъде, доколкото можех, съм помагал косвено. Първият OpenFest беше точно на рождения ми ден и отидохме заедно с Краси, после цяла вечер бяхме с хората от екипа, с Krzysztof Zaraska от Prelude IDS и Harald Welte. Беше 2003-та. Сега погледнах – на сайта на OpenFest най-старото споменаване в историята на фестивала е 2006-та. Може би има нещо общо със смяната на хората, с промяната на екипа. Може би има личен момент, както имаше и личен момент в разтурянето на FSA-BG. Жалко, но все тая. Имам много добри приятелства и познанства от тия години и си ги ценя – макар и повечето хора да ги виждам “веднъж на високосна”.

Прекарах топлите пладнета на съботата и неделята в парка с децата. Игри, езерца, катерички, жълъди, въртележки и пързалки и разговори със Светко защо някои деца се държат лошо и как трябва сам да се справя, защото не е честно аз да се намесвам. Хубави дни. Краси е по-добре. Трябва да платим наема днес – като мине това, ще се успокоя, надявам се. Бях изнервен вчера и взех да се карам на децата – поуката е, че валидолът не е лошо нещо и митовете за опасности са пълна глупост и чист HealthScare.

Poor man’s backup options

от Йордан Радунчев
лиценз CC BY

Всички ние редовно си правим архив и резервни копия от важната информация по лаптопите и компютрите, които използваме, и съхраняваме тези архиви на друго място, различно от лаптопите и компютрите, които използваме... нали така? Ха-ха.

Това все още е най-стария виц сред IT хората - датира още от появата на първия персонален компютър.

Обаче не е толкова весело, когато се прецака твърдия диск и няма от къде да възстановите данните си. Тогава ви идва на ум, че можеше и да копирате оная папка със сорс кода в dropbox например... и сега да си я върнете обратно... Само ако не беше толкова досадно да се правят архиви и да се ъплоудват на някъде. Ами всъщност не е толкова досадно. С bash скриптове и cron, всяка досадна задачка я прехвърляте на Линукс и той с удоволствие ще я върши редовно вместо вас.

Добрият човек Andrea Fabrizi е написал скрипт, който позволява да работите с dropbox от командния ред. Отбележете си някъде да го почерпите бира, когато го срещнете. Свалете си dropbox-uploader.sh и го настройте за работа с вашия dropbox, следвайки указанията на Андреа. С негова помощ можете да копирате архивите си на редовни интервали там с помощта на скрипт и cron.

Естествено, аз не ви съветвам да качвате данните си в Интернет незащитени и да се доверявате на сигурността на dropbox. В никакъв случай. Нямате никаква реална представа колко защитен е сайта им и дали вече не е хакнат. За това силно ви препоръчвам да криптирате всяка информация, която качвате там. Скрипта, който ви предлагам, освен че създава архиви от директориите, които сте му посочили, също така криптира тези архиви с публичен ключ, преди да ги качи в dropbox, така че само вие да можете да ги декриптирате в последствие с частния си ключ. Дори някой да ги източи от там, няма да може да ги разгледа.

Като първа стъпка трябва да си генерирате двойка частен-публичен ключове специално за целите на архивирането. Не ви съветвам да използвате ключове, които използвате вече за други цели. Необходимо е да имате OpenSSL в системата си, ако нямате, инсталирайте си го. С него генерираме ключовете:

openssl req -x509 -nodes -days 100000 -newkey rsa:2048 -keyout prk.pem -out puk.pem -subj '/'

Частният ключ prk.pem запазете някъде на сигурно място, чиято сигурност вие контролирате. Този ключ отключва архивите. Публичният ключ puk.pem ще се използва за заключването им, него може да запазите където ви е удобно, той може само да криптира.

Сега сте готови да използвате моя скрипт. Свалете си го от тук: dbackup. В началото на скрипта има няколко променливи, които трябва да настроите, за да стане използваем.

  • bcpdir=("${HOME}/mp3/" "${HOME}/scripts/") - тук задавате директориите, които искате да се архивират. ${HOME} е променлива на обкръжението, която отговаря на вашата домашна директория. Можете да зададете колкото пожелаете директории тук, като записвате пътя до тях в кавички и ги разделяте една от друга с интервал. В примера скрипта ще архивира две директории от домашната ми директория - mp3 и scripts.

  • pubkey=("${HOME}/dropbox_backup/pukey.pem") - тук се посочва публичния ключ, който ще се използва за криптиране на архивите. Задайте пълния път на файла.

  • dboxup=("${HOME}/dropboxbackup/dropboxuploader.sh") - това е пълния път до скрипта на Andrea. С него ще се ъплоудват архивите в dropbox. Необходимо е преди да изпълнявате моя скрипт, да сте настроили неговия за работа с вашия dropbox.

  • dboxdr="/backups" - това е папката в dropbox в която искате да се запишат архивите ви.

След като сте настроили тези променливи, можете да си създадете запис в cron, който да изпълнява скрипта на определен от вас интервал. Честито.

В този backup скрипт липсват много неща, които биха го направили истински бекъп скрипт. Например той прави само пълни архиви на посочените директории, не предлага възможност за частични архиви само на файловете, променени след последния пълен архив. Именно поради това е poor man's вариант на бекъп, а не истински бекъп. Но по-добре такъв, от колкото никакъв.

Едно нещо, което липсва и което вие можете сами да добавите - след успешно качване на архивите в dropbox, да изтрива архивите от локалната машина, за да не заемат излишно място.

Скрипта вече си работи в /tmp директорията и почиства след себе си. Освен това разделя архивите на части от по 512M. Ако искате по-малки или по-големи парчета - задайте размера в променливата bckpch в мегабайти. За всеки файл се изчислява контролна сума (md5).

DreamHost FAIL (another one)

от Ясен Праматаров
лиценз CC BY

DreamHost са пълни смешници! Казвал съм го и преди, но това вече прелива чашата. Единствената причина да не се махам от тях толкова време е, че все нямам време – имам доста неща за местене, не е просто едно блогче на уърдпрес. А, и другата причина е, че не са български хостинг. Не ми се задълбава в тая насока, но накратко аз доверие нямам по принцип на споделените хостинги, та камо ли ако са български. Всички oversell-ват, при това яко, масово нямат даже ssh, по-специализираната поддръжка е под всякаква критика, а и данните са ми в държава, управлявана от луди алчни нарцистични властолюбиви… хора.

Но за Дриймхост – вижте сега, казвате, че правите “Proactive Security Maintenance” чрез “(New Login Keys)”. Похвално, но:

1) нито е “proactive”, защото го пишете постфактум,

2) нито е “security”, защото НЕ Е и си е покана “елате ни направете MITM” и

3) що не вземете да се гръмнете с вашите циркулярни писма, в които пишете оригиналности и тъпотии, а когато има нещо сериозно – правите проактивно действие, което нито е действие, нито е проактивно.

Толкова съм потресен, че чак не ми се обяснява. Нямам думи направо. Който знае за какво става дума или има време да порови, ще разбере… Вижте, дори уеб-страницата, на която е “обявлението”, не е през SSL, а си е по чист HTTP. Даже когато го видях снощи, съобщението си беше с цитиран ключа на съответната система, която за пример са достъпили… После са го заменили с “removed for security reasons”… Всъщност защо не пуснахте ssh id-то? Щото трябва да пуснете тези на всичките ви хостове, не само на този, който сте пробвали в примера, и това ви се е видяло много като текст? В коментарите някой се беше опитвал да трие ред с номер 10278, който също е от примерната система на админа в Дриймхост… (Сега поне знаем, че някой от техните админи има поне 10278 хоста в known_hosts, макар че какво ни интересува.)

Имат ми пощенския адрес. Даже ми имат два. Имат списък за циркулярни писма, с които спамят потребителите си за глупости. Имат административен панел, в който се влиза с парола и който е по https, където можеха да направят някаква автоматика за това… или изобщо ако бяха пуснали съобщението в админ-панела, щеше да е сто пъти по-добре. Защото вече си влязъл, вече си се доверил на панела. А така, в някакво си сайтче?

Чак ми става кофти, че такива смешници се опитват да се набъркат в OpenStack. Къш бе!

Аматьори.

Отворените данни в страната на Линукс

от Йордан Радунчев
лиценз CC BY

Тези дни от Държавния архив направиха данните за всички загинали в Балканската война достъпни на специален Интернет сайт: http://archives.bg/balkanwars/. Наистина не по най-удобния за използване и обработка начин, но не им се сърдя - те също се учат в движение, достатъчно е, че са тръгнали в правилната посока. Боян Юруков, който вероятно влага най-много усилия в каузата "Отворени данни" у нас, е изтеглил всичката информация от сайта и след допълнителна обработка, я е публикувал на този адрес: http://opendata.yurukov.net/balkanwars/, като CSV файл с табулация за разделител на полетата. Целта на този текст е да ви покаже как може да използвате основни Линукс инструменти за обработка на подобни данни.

И така, имаме CSV файл. Тоест - обикновен текстов файл съдържащ данни, структурирани по определен начин. Всеки ред от този файл представлява запис за един човек. Всеки запис се състои от няколко полета, разделени с табулация едно от друго. Първият ред-запис във файла представлява всъщност списък с етикетите на отделните полета в реда по който са подредени във всеки ред-запис. Ако сте изтеглили файла с данните от сайта на Боян, можете да го отворите и да погледнете - петото поле на всеки ред-запис съдържа фамилията на човека, за когото е записа. Дванадесетото - датата на смъртта му. И така нататък. Така са организирани данните.

В Линукс, когато стане дума за текстов файл, записи по редове, данни по полета - веднага се сещаме за awk. С негова и на приятелите му помощ, можем да извлечем информация от данните. Приятелите на awk са sort и uniq. И така - може би ви интересува в битките при кои населени места, българската армия е дала най-много жертви? Във файла информацията за мястото на смъртта се съдържа в поле 13 от всеки запис. С awk можем да извадим само него от всички данни. Със sort ще сортираме резултата от работата на awk. Инструмента uniq, извикан по подходящ начин, ще преброи колко пъти се среща всяко име в подредения от sort списък. Резултата от uniq ще дадем отново на sort, като този път го помолим да го сортира в обратен ред - от най-голямата стойност към най-малката. И тъй като ни интересуват само най-големите стойности, ще извикаме head и ще поискаме от него само първите десет стойности от списъка, изготвен от sort. Следите ли мисълта ми? Ето я цялата операция в един команден ред:

awk 'BEGIN{FS="\t"}{print $13}' zaginali.csv | sort | uniq -c | sort -nr | head -n 10 
Красиво :) Резултата от изпълнението изглежда така:
    2659 
    1684 Чаталджа
   1502 Одрин
   1168 Чорлу
   1156 София
   1044 Бунар Хисар
    817 с. Тарфа
    801 Лозенград
    739 с. Калфа кьой
    718 Хисар

За 2659 от загиналите липсва информация къде са загинали. 1156 са починали в София - вероятно става дума за ранени и болни, евакуирани и починали в болници.

Малко по-подробен поглед върху awk частта... Това което е оградено с '' представлява "програмата", която искаме awk да изпълни върху всеки ред от файла, който му даваме. Ето съставните й части и коя какво прави:

  • BEGIN{FS="\t"} - указва на awk, че за разделител между полетата в записа използваме табулация. Налага се, защото по подразбирне awk използва интервал за разделител. BEGIN казва на awk да изпълни инструкциите в следващия блок {} преди да започне да обработва файла.

  • {print $13} - инструктираме awk да отпечата 13 поле от всеки ред-запис във файла zaginali.csv.

Това е почти най-простия начин да се използва awk. Толкова прост, че чак е обиден за него и вероятно тук бихме могли да използваме cut вместо awk.

Със същия команден ред, като го насочим към друго поле от данните, можем да извадим различна информация. Например за това кой войнишки набор е дал най-много жертви в Балканската война - набора на загиналите е посочен в седмото поле..

awk 'BEGIN{FS="\t"}{print $7}' zaginali.csv | sort | uniq -c | sort -nr | head -n 10

    14337 
    2985 1906
    2326 1908
    2300 1907
    2297 1905
    1886 1904
    1807 1909
    1640 1911
    1615 1910
    1512 1912

За 14337 души липсва информация от кой набор са. От останалите, за които има такава - най-голям брой жертви е дал набор 1906 - 2985 човека. До тук видяхме, че с прости и достъпни във всяка Линукс дистрибуция инструменти, можем да извличаме информация от данните, задавайки прости въпроси. А ако искаме да зададем по-сложен въпрос, който да ни даде по-специфична информация? Например - кой войнишки набор е дал най-много жертви в боевете при Одрин? На практика комбинираме двата прости въпроса, които използвахме в примерите до сега. Истината е, че в примерите до сега не сме използвали и 5% от мощта на awk. За него подобни задачи са тривиални.

awk 'BEGIN{FS="\t"}$13~/Одрин/{print $7}' zaginali.csv | sort | uniq -c | sort -nr | head -n 10

    476 
     77 1906
     66 1905
     62 1894
     59 1912
     59 1895
     57 1908
     56 1904
     50 1910
     45 1893

Въобще не го затруднихме - поискахме полетата с набора, но само на записите в които полето за място на смъртта съдържа Одрин. И после sort, uniq и head свършиха своята част от задачата. Най-много жертви при Одрин е дал набор 1906... А къде е дал най-много жертви въпросният героичен набор 1906? Да попитаме:

awk 'BEGIN{FS="\t"}$7~/1906/{print $13}' zaginali.csv | sort | uniq -c | sort -nr | head -n 10

    118 
    101 Чаталджа
     91 Чорлу
     78 с. Тарфа
     75 Бунар Хисар
     71 Одрин
     61 Щип
     52 Хисар
     48 с. Криволак
     46 Лозенград

В боевете при Чаталджа...

Тъй като в последните два примера усложнихме въпроса, инструкциите към awk също леко се усложниха.

  • BEGIN{FS="\t"} - това вече го знаем. Уведомяваме awk, че разделителя в нашия файл е табулация.

  • $7~/1906/{print $13} - тук отново искаме от awk да отпечата поле №13, но под условие! Условието е поле №7 да съдържа 1906 - ако там има друга, различна година, не го искаме. За това пред инструкцията за отпечатване на поле №13 сме сложили условието $7~/1906/... Сега awk ще погледне какво има в поле 7 и ако там стои 1906, ще продължи с изпълнението на инструкциите в блока {}, ако няма 1906 - ще мине направо на следващия ред-запис, без да отпечата нищо.

Виждате, че Linux има всичко необходимо, за да отговори на въпросите ви, стига вие да можете да ги формулирате правилно и да му дадете база от данни, от която да извлече отговора. А ако впрегнете и gnuplot - ще се сдобиете и с красиви графики, които да визуализират информацията ви. Но за това друг път.