* Plugin do Vimu na odstranění diakritiky

24. September 2014, Jakub Horák. Categorized as Vim.


Při kopírování textu se mi občas stává, že potřebuji z původního textu odstranit českou diakritiku. Jako textový editor používám Vim, rozhodl jsem se tedy napsat do něj plugin, který mi takovou funkcionalitu poskytne. Zasvětil jsem se do tajů Vimscriptu. V mnohém jsem se inspiroval skvělou knížkou Learn Vimscript the Hard Way od Steva Loshe.

Plugin včetně dokumentace je k dispozici na GitHubu.

Hurá, už žádné ruční přepisování písmen z české abecedy do latinky!

Tags: , , .



* Jaro v Luganu

12. May 2014, Jakub Horák. Categorized as Erasmus.


Lugano, kde jsem momentálně na Erasmu, nabízí spoustu możností, kam se vydat na výlet.

Na začátku dubna jsme s přítelkyní Annou navštívili největší město Švýcarska: Curych.Dům metropol v Curychu Curych lze popsat jedním slovem a tím slovem je šedivý. Fasády i střechy jsou šedivé, mělká řeka i obrovské jezero jsou taktéž šedivé. Sem tam má některá fasáda barevný odstín, ale ten není nikdy výrazný. Oproti Luganu, což je velmi malé městečko s cca 60 000 obyvateli, je Curych velkoměsto. Co do počtu obyvatel ho lze srovnávat s Prahou.

Zatímco v Luganu se člověk potýká s nedostatkem kulturního vyžití, Curych v sobotu večer, kdy jsme v něm byli, opravdu žil. Lidé byli v noci v ulicích a ne schovaní doma jako v Luganu. Z architektury mě nejvíce zaujaly barokní domy a zámky (viz obrázek vpravo, Haus Metropol).

O Velikonočních prázdninách jsme se vydaliCentrum Neapole italského městečka Nola, odkud Anna pochází. Nola je moc pěkné malé městečko poblíž Neapole. Jak Nola, tak Neapol leží na v bezprostřední blízkosti Vesuvu, jediné činné sopky v Evropě.

Neapol je třetí největší město Itálie co do počtu obyvatel a navštívili jsme ho na jeden celý den. Město má velmi vysokou hustotu obyvatel na kilometr čtvereční a je typické svými uzoučkými a temnými uličkami. Neapol je rodiště pizzy, tak asi uhodnete, co jsme měli k obědu. Zvláštní je, že většina domů v Neapoli je opravované ledabyle nebo není opravovaná vůbec. Vytváří to vskutku jedinečnou atmosféru.

Noční NeapolNavštívili jsme podzemí Neapole, které bylo v antických dobách využíváno pro těžení kamene a později jako akvadukt. V 19. století do podzemí házeli odpad a během druhé světové války sloužilo jako protiletecký kryt. Díky své strategické poloze se v Neapoli nachází několik hradů. Navštívili jsme Castel Nuovo. Vpravo se můžete pokochat nočním pohledem na Neapol. Pantheon

Další den jsme se vydali na výlet do Říma. Všude bylo spoustu turistů, protože následující víkend proběhlo svatořečení dvou papežů. Řím mě zaujal svou antickou historií, necítil jsem v něm ale takovou atmosféru živého města jako v Neapoli. Přišlo mi spíš jako město pro turisty. Na obrázku vlevo se tyčí nejvýznamnější památka v Římě, Pantheon.

Duomo v MiláněJako poslední zastávku na naší velikonoční tůře jsme navštívili Milán, z kterého to pak domů trvá už jen hodinu vlakem. Na fotce vpravo můžete vidět Milánskou katedrálu, která se stavěla necelých šest století. Mentalita  seveřanů se liší od jižanů. Na vzhledu města se to velmi podepsalo. Milán je bohatým městem se spoustou luxusních obchodů. V roce 2015 hostí Miláno Světovou výstavu Expo. Postrádá ale přátelskost, otevřenost a živost jihu.

Jezero ComoMinulou neděli jsme se vydali k jezeru Como, což jezero ledovcového původu stejně jako Luganské jezero. Zatímco Luganské jezero sahá do Švýcarska, jezero Como leží výhradně v Itálii. Na rozdíl od Lugánského jezera jsou zde vesničky takřka všude podél pobřeží. Kopce se totiž nesvažují do jezera tak prudce a umožňují tak osídlení poblíž vody. Za slunečného počasí je tam vskutku nádherně. Viz obrázek vpravo.

Toť prozatím vše. Do konce Erasmu zbývá již jen měsíc a půl :/

 

.



* Konec zimy, začátek jara v Luganu

30. March 2014, Jakub Horák. Categorized as Unassigned.


SplügenV návaznosti na předchozí příspěvek jsem se vydal ještě dvakrát na snowboard. Zavítal jsem opět do Splügenu, tentokrát jsem však nejezdil na sáňkách, ale na snowboardu na vedlejší sjezdovce. Tento areál považuji za nejlepší z těch, které jsem letos navštívil. Ze spodku sjezdovky jsem vždy jezdil kabinovou lanovkou zpět nahoru.

OvronnazPoslední letošní výjezd za zimními radovánkami byl zároveň tím nejdelším. Účastnil jsem se víkendové akce pořádané spolkem Erasmus Student Network Switzerland, která se konala v Ovronnazu. Na celý víkend se na jedno místo sjelo několik studentů z nejrůznějších měst z celého Švýcarska, aby se setkali a zalyžovali/zasnowboardovali si spolu. Oba dva dny sice sněžilo, ale aspoň jsme tak v neděli měli výborný čerstvý sníh. Zajistil jsem si kurzy snowboardu a tak jsem se konečně naučil snowboardovat pořádně.

Ovronnaz je ve francouzsky mluvící části Švýcarska a pro nás z Lugana je to tak relativně daleko. Protože v cestě jsou Alpy, museli jsme vlakem jet přes Curych, čtyřikrát přestupovat a celkem jsme cestovali 8 hodin.

San SalvatoreTím jsem tedy završil kapitolu zimních sportů a nastupuje jaro. Již zde rozkvétají třešně a květiny v zahradách. Poslední fotku, co zde prezentuji, jsem pořídil na sobotním odpoledním výletu na kopec San Salvatore. Na fotce je vidět kopec Monte Brè, na kterém jsem již také byl. Dle fotky na jezeře zatím nejsou žádné lodě, ale od té doby se situace změnila a tento týden již na jezeře lodě jsou. S jarem se také otevírá možnost pořádání pikniků. Lugano ožívá 🙂

.



* Zimní sporty v Luganu

24. February 2014, Jakub Horák. Categorized as Erasmus.


Vzhledem k blízkosti Alp je Lugano ideální základnou pro provozování zimních sportů. Zatím jsem podniknul dva výlety.

První výlet byl organizován naší univerzitou pro studenty programu Erasmus a jednalo se o noční sáňkování, což je tradiční švýcarský sport. Protože v Luganu není přímo sportovní areál, konala se akce v lyžařském areálu Splügen, který se nachází 95km od Lugana (přes hodinu jízdy busem). Dvě hodiny jsme jezdili ve dvojicích na sáňkách po speciální osvětlené trase vedle sjezdovky. Nahoru jsme se vždy vyvezli kabinkovou lanovkou. V rámci výletu jsme pak byli pohoštěni tradičním švýcarským pokrmem: fondue.

airolo

Airolo, Pesciüm

Včera jsme se pak s kamarády vydali na celodenní lyžařsko-snowboardový výlet do střediska Airolo vzdáleného 85km (cca 1 hodina jízdy busem). Počasí bylo nádherné a moc jsem si to užil. Osvěžil jsem si jízdu na snowboardu. Byla neděle a tudíž v areálu lyžovalo hodně lidí. Ve Švýcarsku se nic jiného v neděli dělat nedá, protože všechny obchody jsou zavřené. Areál je nicméně obrovský a na sjezdovce, kde snowboardoval já, příliš dlouhé fronty u vleku nebyly. Výbavu jsem měl zapůjčenou od univerzity a dopravu jsme měli zajištěnou také až přímo domů.

.



* První poznatky z Lugana

11. February 2014, Jakub Horák. Categorized as Erasmus.


Odjel jsem na Erasmus do švýcarského městečka Lugano. Jedná se o malé městečko o cca 60 tisících obyvatel, stísněné mezi hory a jezero zvané taktéž Lugano. Mluví se zde italsky a do Milána se dá dostat za hodinu vlakem. Město žije především z turismu a finančnictví.

Kolej, na které jsem ubytovanLuganoý, vypadá jako hotel. Asi to bude tím, že v prvním patře trojpatrové budovy skutečně hotel je. Má tři hvězdičky a jmenuje se Ceresio. Kolej sdílím s hrstkou dalších zahraničních studentů nejrůznějších národností: je tu několik Španělů, němců, singaporek, Švédka, Finka, Slovinka, Slováci a mnoho Čechů. Doufal jsem, že tu nebude mnoho Čechů a bohužel jich je tu spoustu. Naštěstí budu ale budu mít na pokoji itala, takže aspoň neuslyším češtinu pořád. Mohl jsem skončit na pokoji s Čechem a to by bylo horší.

BréProstředí je tu krásné. Vše na dosah ruky. Snad jen je zvláštní to, že v neděli mají všechny obchody, kromě jednoho na nádraží zavřeno. Naštěstí nádraží je vzdálené jen 15 minut chůze. Švýcaři totiž rozhodli v referendu (wiki), že chtějí nechat obchody zavřené. Lidé v neděli odpočívají. Stejně tak se tu nenajde obchod otevřený po osmé hodině. Přijde mi to jako pražákovi nezvyklé, vzhledem k tomu, že v Praze má každá vietnamská večerka otevřeno nejméně do 9 hodin.

Celý minulý týden pršelo, hezky bylo pouze ve čtvrtek a v neděli. Ve čtvrtek jsme měli tour po městě a mohl jsem vyfotit první fotku města a jezera Lugana. V neděli jsme pak vyrazili na Monte Bré, místní kopec tyčící se nad jezerem Lugano. Z něj pak pochází druhá fotka.

.



* Populární trendy na Twitteru

24. August 2013, Jakub Horák. Categorized as Twitter.


Spustil jsem aplikaci zobrazující grafy populárních trendů na Twitteru.

Začalo to vymýšlením tématu semestrální práce na předmět Enterprise Java, kdy jsem potřeboval napsat aplikaci, která by splňovala technologické podmínky vyučujícího a zároveň dělala něco zajímavého. Zrodil se nápad a v rámci předmětu byl úspěšně dotažen do konce, nebo to tak alespoň vypadalo 🙂 Bohužel, to co fungovalo při předvádění na testovacích datech nefungovalo na o několik řádů mohutnějších reálných datech. Nicméně jsem se poučil, překopal architekturu aplikace a odstranil funkčnosti, které jsem implementoval pro pobavení vyučujícího. Voilà a dnes je z toho prima hračka.

Rozhodl jsem se implementovat pouze denní a týdenní grafy, protože kvůli proměnlivosti trendů nedává pro tento typ grafu větší časový rozsah smysl. Trendy většinou trvají jen několik hodin, maximálně několik dní. Pro větší rozsahy by se dala udělat statistika např. nejvíce používaných trendů, ale vyžadovalo by to jiný způsob zobrazení. Vidím to zatím jen jako nápad na rozšíření.

Co se týče dat, zajímavý je např. včerejší denní graf, kde lze vidět, jak se na Twitteru vzedmula vlna odporu proti účinkování Bena Afflecka v roli Batmana v nadcházejícím filmu Batman vs. Superman (viz #BetterBatmanThanBenAffleck). Z historických dat lze pozorovat např. vývoj trendů při dubnovém útoku v Bostonu (viz #PrayForBoston) nebo při květnovém tornádu Moore v Oklahomě (viz #PrayForOklahoma).

Prohlížejte a sdílejte zde: mrtweety.zee.cz

Tags: , , , .



* Simulátor agentů v Lispu

21. June 2013, Jakub Horák. Categorized as Unassigned.


V rámci mé bakalářské práce jsem implementoval engine na simulaci agentů.  Agenti mohou hrát hry na schovávanou, honěnou nebo slepou bábu. Prostředí je reprezentováno pomocí šestiúhelné mřížky. Konkrétní vlastnosti jsou dokumentované přímo v souborech projektu, který je k dispozici na Githubu.

Jedná se o můj první projekt v jazyku Common Lisp a musím říct, že se mi Lisp hodně zalíbil. Dovedu si představit jeho využití v situacích, kdy chce člověk vytvořit algoritmus, ale neví ještě, co ten algoritmus bude přesně dělat a jaké bude používat datové struktury. Díky dynamickému typování a principu “všechno je funkce” se kód refaktoruje výjimečně snadno. Člověk tak získá výsledný algoritmus postupnou evolucí původní myšlenky.

V síle Lispu ale zároveň spočívá i jeho slabina. Volání funkce musí být obalené závorkami. Málokdy se mi podařilo trefit ukončující závorky tak, aby program fungoval napoprvé. S přibývajícími zkušenostmi se to naštěstí zlepšilo. Když si člověk zvolí nějaký konkrétní styl odřádkování a psaní závorek,  lze tento typ chyby omezit. Hodně pomáhá barevné zvýraznění jednotlivých úrovní závorek, jako to umí např. Vim plugin Rainbow Parentheses.

Více o Lispu se můžete dozvědět online v knize Practical Common Lisp.

Tags: , , .



* Posílání chybových hlášek na mail

22. April 2012, Jakub Horák. Categorized as Unassigned.


Včera jsem zjistil, že mám poškozený filesystém na zálohovacím disku. Oprava byla jednoduchá, stačilo pustit fsck, ale nepříjemné bylo, že jsem se o problému dozvěděl úplně náhodou, až při ručním spustění zálohy před velkou aktualizací systému. Aby se již podobná situace neopakovala, nastavil jsem démona syslog-ng, aby mi posílal chybové hlášky na mail. Když se vyskytne problém, může se ale zalogovat mnoho chyb najednou, a tak mi zanedlouho přišlo cca 300 mailů. Abych podobnému zahlcení do budoucna zabránil, napsal jsem následující skript, který pošle nejvýše jeden mail každých pět minut.

#!/bin/bash
#
# ./bin/syslog-mail.sh
# Posilat nejvyse jednu hlasku za pet minut
#
TO='xy@xy.cz'
FROM=$TO
 
last=`cat /var/tmp/syslog-mail-last-sent 2>/dev/null`
let last=last+300
now=`date +%s`
if [ "$last" -lt "$now" ]; then
	read logline
	logline=${logline/+([0-9<>])}
	if [ "$logline" == "" ]; then
		exit 0
	fi
	/usr/sbin/sendmail -t <<EOT
To: $TO
From: $FROM
Subject: Log Alert: $logline
 
$logline
`while read logline; do
	logline=${logline/+([0-9<>])}
	echo $logline
done`
 
--
This is an automatically generated message from $HOSTNAME
EOT
 
	echo "$now" > /var/tmp/syslog-mail-last-sent
fi

Do /etc/syslog-ng/syslog-ng.conf jsem přidal tato pravidla:

destination mail-alert {
	program("/home/kuba/bin/syslog-mail");
};
filter f_error {
	not facility (mail) and level(err,crit,emerg);
};
log {
	source(src);
	filter(f_error);
	destination(mail-alert);
};

.



* Automatická aktualizace WordPressu

7. August 2011, Jakub Horák. Categorized as Scripts.


Podle statistik rozšíření CMS na internetu z ledna tohoto roku využívá 15% všech webů WordPress. Kdyby tedy hacker objevil ve WordPressu bezpečnostní díru, mohl by teoreticky ovládnout až 15% Internetu. Spoustu lidí se o to již pokusilo a jistě nadále pokouší a komunita vývojářů chyby rychle odstraňuje. Nové verze vychází zhruba jednou za měsíc. Oprava vám ale nepomůže, pokud jí nemáte nainstalovanou :). Je tedy nutné neustále aktualizovat.

WordPress se dá aktualizovat z administrace, proces ale potřebuje na stažení a rozbalení balíčku místo na disku, kterého se mi na freehostingu nedostává. Člověk se také musí přihlásit a zmáčknout tlačítko. Naštěstí to lze udělat i jinak. Stačí malý skript.

Můj skript stáhne poslední stabilní verze českého WordPressu a vašich pluginů, uloží je do lokálního repozitáře GITu a následně nahraje na FTP pouze ty soubory, které se změnily. K nahrání změněných souborů jsem využil skvělý skript git-ftp.py.

Aby git-ftp.py fungoval, vytvořte ve složce WordPressu soubor .git/ftpdata s následujícím obsahem a doplňte vaše údaje k FTP:

[master]
username=me
password=s00perP4zzw0rd
hostname=ftp.hostname.com
remotepath=/htdocs

Připravte si adresář, do kterého se rozbalí WordPress. Já mám WORKDIR nastavenou na /home/kuba/weby/oss/, takže WordPress se rozbalí do /home/kuba/weby/oss/wordpress. Do proměnné PLUGINY uveďte názvy pluginů získané z adres URL jejich webů. Zde je celý skript (stáhnout):

#!/bin/bash
#
# Automaticka aktualizace Wordpressu pres FTP
#
 
WORKDIR="/home/kuba/weby/oss/"
TMPDIR="/tmp/wordpress-update/"
PLUGINY="w3-total-cache wp-syntax simplemodal-contact-form-smcf lightbox-plus openid"
 
function echoi {
        echo -e "\e[1;36m""$1""\e[0m"
}
 
function stahnoutplugin {
        PLUGINSVN=http://plugins.svn.wordpress.org/
        PLUGINDIR="$TMPDIR"/"$1"
        stabilni_verze=`svn ls "$PLUGINSVN"/"$1"/tags | tr -d / | sort -V | tail -n 1`
        echoi "Stahuji $1-$stabilni_verze"
        mkdir -p "$PLUGINDIR"
        cd "$PLUGINDIR"
        svn co "$PLUGINSVN"/"$1"/tags/"$stabilni_verze"
        rm -rf `find -type d -name .svn`
        mv "$stabilni_verze" "$1"
        mv "$1" "$WORKDIR"/wordpress/wp-content/plugins
}
 
cd "$WORKDIR"
rm latest-cs_CZ.tar.gz
echoi "Stahuji aktualni wordpress"
wget http://cs.wordpress.org/latest-cs_CZ.tar.gz
rm -rf wordpress/*
tar xvf latest-cs_CZ.tar.gz
for plugin in $PLUGINY; do
        stahnoutplugin "$plugin"
done
cd "$WORKDIR"/wordpress
echoi "Mazu zbytecnosti"
rm -rf wp-content/themes/twenty*
rm wp-content/plugins/*/screenshot-*
find -name \*.txt -exec rm '{}' \;
find -name \*.dev.\* -exec rm '{}' \;
rm -rf "$TMPDIR"
echoi "Commituji zmeny"
git add .
git commit -a
echoi "Nahravam na vzdaleny server"
git-ftp.py

O upozornění na nové verze WordPressu se stará moje RSS čtečka se speciálním kanálem. Časem by se to celé ale klidně dalo spojit s Cronem a nemusel bych se starat vůbec o nic.

Tags: , .



* Ukládání coverů do ID3 tagu

9. May 2011, Jakub Horák. Categorized as Scripts.


Od verze 2 tagu ID3 lze k souboru MP3 kromě tradičních metadat ukládat i obrázky. Těchto obrázků se využívá se například v iPodu, když se vám při přehrávání písničky zobrazuje cover alba. Hezké. Kvůli tomu jsem vylepšil svůj loňský skript na automatické stahování coverů alb, aby dokázal stažené covery automaticky uložit také do ID3 tagu.

K vlastnímu tagování používám program eyeD3. Seznam závislostí se tedy rozrostl na: id3lib, eyeD3, ImageMagick, Ruby, cURL.

Novou sadu skriptů stahujte zde: musiccovers.20110509.tar.gz

Tags: , , , .