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

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

от Йордан Радунчев
лиценз 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 - ще се сдобиете и с красиви графики, които да визуализират информацията ви. Но за това друг път.

Комфорт в терминала

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

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

Инстументите, които ще покажа тука са следните: zsh и tmux (други мисля, че вече сме си споменавали в по-стари статии като cmux, irssi, alpine).

Zsh (Z Shell)

Е алтернатива за bash (bourne-again schell), но много по-конфигурируема и също така разпространена. С какво обаче е по-различен и за предпочитане пред инсталирания по подразбиране в много дистрибуции bash:

  1. Функционира изключително близко до bash, което позволява на потребителите да не се налага да се учат на ново как да го ползват
  2. Предлага корекция на правописа. Предполагам ви се е случвало в бързината да напишете команда и да изпуснете/заместите буква. Zsh се опитва да разпознае командата и ви предлага да я замести преди да се опита да изпълни сбърканата от вас команда.
  3. Изключително конфигурируем (както, между другото, вече споменах).
  4. Много добро и коректно допълване с клавиша [Tab]
  5. Споделена история между сесии – ако сте стартирали няколко zsh-сесии едновременно, то те ще си споделят историята
  6. Вграден пейджър – това можете да го разбирате като вградена less функционалност. Така можете да напишете <README вместо cat README | less
  7. Красив и разширяем – освен по-подредения синтаксис, към zsh можете да иснталирате пакет oh-my-zsh, с който инсталирането и конфигурирането на обвивката става изключително бързо и лесно. Смяната на контролната лента е просто като да смените темата на десктоп средата (не говоря за Gnome3, където това е чиста висша акробатика).

Повечето дистрибуции идват с преинсталиран bash, и ако искате да го смените ще трябва да извършите няколко машинации, които далеч не са нещо особено сложно:
- Инсталирате пакет zsh: В ArchLinux това би било pacman -S zsh
- Смяна на шела по подразбиране за настоящия потребител – в почти всички дистрибуции това става с командата chsh [change shell]:

chsh -s /bin/zsh

- Добавяне на oh-my-zsh: Това може да стане по два начина:
Автоматизирано с curl:

curl -L https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh | sh

Ръчно с извличане на git хранилището:

git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh

Тук обаче ще се наложи ръчно да създадете .zshrc файла, по образеца в ~/.oh-my-zsh

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

Списък с предлаганите теми към oh-my-zsh можете да намерите на адрес: https://github.com/robbyrussell/oh-my-zsh/wiki/Themes
Списък с предлаганите добавки и кратко обяснение за какво са: https://github.com/robbyrussell/oh-my-zsh/wiki/Plugins

И един бонус, който мен лично доста ме ядосваше в началото е пействането от clipboard с клавишната комбинация Shift+Ins за целта трябва да добавите следното във вашия .zshrc файл:

# Create a widget from the function paste-from clipboard.
# Note that /dev/clipboard will give you access to the clipboard
# if you are on cygwin.
paste-from-clipboard() {
CLIPOUT=`cat /dev/clipboard`
BUFFER=$LBUFFER$CLIPOUT$RBUFFER
}
 
# Bind a widget with the same name as the function
zle -N paste-from-clipboard paste-from-clipboard
 
# Make insert paste from clipboard by binding it to the widget.
# If you hit ctrl-v and then the key, it shows you the extended code to use.
bindkey "\e[2~" paste-from-clipboard

Общо взето това е – мисля, че останалото бихте могли сами да разучите.

Tmux (Terminal Multiplexer)

Накратко по-добра алтернатива за screen и byobu, позволява ви да стартирате една или повече инстанции на шела в една програма, като ги разделяте по екран или по прозорци – всичкото в една програма. Представете си ползвате компютъра без графична среда. Няма прозорци, които да минимизирате, няма табове – за запознатите – тук влиза в употреба screen. В случаят при мен влиза в употерба tmux. И защо е за предпочитане – защото позволява с прости клавишни комбинации да разделяте екрана, както пожелаете. В screen например разполагате с прозорци и толкова (или пък аз не съм достатъчно запознат). Докато в tmux можете да разделяте допълнително прозореца на дялове. По този начин можете да изпълняване няколко неща директно от един екран (особено за разработка това е страхотно (ляво: терминал, дясно: vm,  долу: gdb). Разбира се бихте могли да си нацепите по този начин и vim, но за някои от функциите ще трябва да се погрижите за подходящи добавки.

Важно да кажем за някои от характеристиките на tmux:
- Поддържа utf-8 и 256 цвята
- Панели и прозорци, като всеки панел може да бъде разделят многократно
- Смяна на прозорци, чрез търсене на по индекс
- Заключване на терминала – ръчно или автоматично след определен период от време и т.н.

Инсталирането на tmux става от пакетния мендиджър на почти всяка дистрибуция.

За да не преписвам клавишните комбинации ще добавя една Ctrl+b+…. – това е командната клавишна комбинация, след което следва командата.
На пример ако искате да разделите екрана на две полета ляво/дясно Ctrl+b+!
Ctrl+b+" – разделя екрана/полето на две горе/долу
Ctrl+b+<стрелки за движение> – можете да се движите между полетата
и т.н. пробвайте с man tmux за да ги разучите

Щеше ми се да допълня и малко повече за настройката на vim посредством bundles, но мисля, че за това ще трябва допълнителна статия.

Надявам се информацията да ви е била полезна.

P.S. BulTux.Org rises from the dead :-)