* Discovering Akka

25. April 2016, Jakub Horák. Categorized as Frameworks.


I came across this interesting piece of technology called Akka and I’ve decided to write a few words about it. So what is Akka? In short it is a toolkit and runtime for concurrent and distributed applications. To describe in more detail, we have to first talk about the motivation, why would someone use it.

Today we live in the era of distributed systems, billions of people use internet for their everyday life and successful online services have to plan for massive traffic. As soon as a service becomes popular, it is not economically viable to serve it using one large super-computer, but rather use a cluster of cheaper machines. As a programmer, who comes from a Java background, I have implemented concurrent thread-safe programs too many times to know, that it’s not easy. Concurrent systems introduce a new dimension of difficulty. To simplify the concurrent programing and introduce a common standard, company called Lightbend (previously Typesafe) came up with the Reactive manifesto.

Point of the Reactive manifesto is that distributed systems built following it’s guidelines will be easier to develop, scale, maintain and enhance at a later time. They are flexible, loosely-coupled, tolerant of failure and can handle unexpected behavior gracefully. Last but not least they they provide user with interactive responsive feedback.

 

Reactive traits

Reactive traits. Arrows show, how they depend on each other.

So what are then the problems of concurrency? Distributed code by default behaves non-deterministically. Without any locking, every time you run the program, you get a different result. It is caused by multiple threads sharing a mutable state, e.g. a common global variable. That leads to race conditions, when things are happening in a different order than the programmer expected. Another problem is thread starvation, when a thread will never get to work and advance the states, because others have higher priority. This happens for example in an OS process scheduler, when there are many processes with high priority and a low priority process will never get to run on CPU.

Akka is a toolkit and runtime for simplifying the construction of concurrent and distributed applications on the JVM. Reasons to write Akka were practical. First simple actor implementation (not yet Akka) was written as a part of Scala in 2006. By 2008 Scala was used in complex server applications and need for a better library support was growing. That motivated developers to come up with Akka. It was released in 2010 and drew inspiration from Erlang’s libraries. Today it is a part of Scala standard library. Java programmers don’t have to be sad though, as there are also language bindings for Java. The library is open-source (Apache License 2.0) and developed by Lightbend, which is well known for its Play framework.

Akka has many features. These are the main ones:

  • actor system, which introduces a concept of actor as a unit of execution,
  • remoting allows messages to be sent between machines,
  • routing defines how are the messages sent to the routees,
  • clustering allows cluster nodes to run a part of a bigger application,
  • Akka Persistence introduces actors with state, that remains even after restart, and
  • Akka Streams provides asynchronous stream processing with non-blocking back pressure.

Actors encapsulate state and behavior. They are isolated and lightweight, meaning that they don’t have hard references to each other, only so called ActorRef. To communicate, they pass serializable messages back and forth. Advantage of this approach is location transparency – actors can communicate locally or over network, it’s only a matter of configuration. Akka is distributed by default, meaning you can only pass messages and everything is asynchronous. It hides all thread-related code behind its actor model and allows programmers to write code easily scalable and fault-tolerant.

We already mentioned you can use Akka in Java. To do that, you just have to make sure that all messages are immutable and serializable, because they could be sent over network. Immutability is achieved in Java by making all attributes final. Akka also requires toString(), equals() and hashCode() methods to be implemented.

When building reactive applications in Java, it is often convenient to use Lambdas. Lambdas are small blocks of code, that can be executed in separate threads. Typically these applications use many callbacks and Lambdas make it easy to write them. Before Java 8 we had to use inner classes and that was not as nice.

To see how can Akka be used, I recommend trying out these two examples:

https://www.lightbend.com/activator/template/hello-akka-java8
https://www.lightbend.com/activator/template/akka-sample-remote-java

Go to akka.io to read up on the documentation or to lightbend.com/activator/templates for more samples. Also check out Apache Spark, a fast and general engine for large-scale data processing built on Akka or Apache Spark Streaming, which can do the same for near real-time small batches of data.

Tagy: , , , , .



* Introducing the English version of the blog

13. March 2016, Jakub Horák. Categorized as Unassigned.


Hello dear visitor and welcome to the English version of my blog. The main purpose of this blog is to store memories of projects I did or experiences I had. You can find here mainly scripts, code samples and solutions to problems. Because of that, do not expect me to write posts every day, week or month. The point is to have a central and public location for my documentation.

The older articles are available only in Czech. Feel free to browse through them too!

.



* Aktualizace WordPressu podruhé

22. November 2014, Jakub Horák. Categorized as Scripts.


V létě 2011 jsem na tomto blogu popisoval, jak vzdáleně aktualizovat WordPress. O tři roky později znovu řeším stejný problém, situace se však změnila. Dříve jsem měl na server přístup pouze přes FTP, nyní mám SSH.

Myšlenka nového skriptu spočívá v tom, že udržuje zdrojový kód WordPressu i jeho pluginů v SVN pracovních kopiích. Jak se to dělá pro samotný WordPress je popsáno zde. Poprvé je nutno provést SVN checkout nejnovějších tagů jádra WordPressu a jeho pluginů z repozitářů na http://core.svn.wordpress.org resp. http://plugins.svn.wordpress.org. Pro kompletní aktualizaci pak už vždy stačí spustit skript. Sám si zjistí tagy odpovídající nejnovějším verzím a pracovní kopie do nich přepne.

Skript si můžete prohlédnout:

#!/bin/bash
##
## Updates Wordpress in this directory to maximum release version.
##
 
LCYAN="\033[1;35m"
NOCOL="\033[0m"
 
update() {
  svninfo=`svn info 2>/dev/null`
  # check that directory is a working copy
  if [ "$?" -ne 0 ]; then
    echo -e "$LCYAN$(readlink -f .)$NOCOL is not a working copy."
    return
  fi
 
  oldurl=`echo "$svninfo" | grep '^URL:'`
  oldurl=${oldurl##* }
  oldversion=${oldurl##*/}
  tagurl=${oldurl%/*}
  newversion=`svn ls "$tagurl" | sed -e 's/\/$//' | sort --version-sort | tail -n 1`
 
  if [ "$oldversion" == "$newversion" ]; then
    echo "$(readlink -f .) is up to date with version $newversion."
  else
    echo -e "Update $LCYAN`readlink -f .`$NOCOL from version '$LCYAN$oldversion$NOCOL' to '$LCYAN$newversion$NOCOL'?"
    select prompt in "Yes" "No but continue" "Abort"; do
      case $prompt in
        Yes ) break;;
        "No but continue" ) return;;
        Abort ) exit;;
      esac
    done
 
    echo ---
    svn switch "$tagurl/$newversion"
    echo ---
  fi
}
 
if [ "$#" -ne 0 ]; then
  echo "Usage: $0"
  exit
fi
 
# main
update
 
# plugins
pushd wp-content/plugins/ >/dev/null
for plugindir in *; do
  if [ -d "$plugindir" ]; then
    pushd "$plugindir" >/dev/null
    update
    popd >/dev/null
  fi
done
popd >/dev/null

Také si skript můžete stáhnout.

Tagy: .



* 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!

Tagy: , , .



* 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

Tagy: , , , .



* 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.

Tagy: , , .



* 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.

Tagy: , .



* 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

Tagy: , , , .



* Ověření schématu databáze

31. October 2010, Jakub Horák. Categorized as Scripts.


Spravuji jistou webovou aplikaci pro nejmenovaného zákazníka. Nedávno se mi v souvislosti s tím stala nepříjemná událost. Při aktualizaci aplikace jsem zapomněl zkopírovat jednu tabulku do databáze. Funkci, která tabulku vyžadovala jsem neotestoval, takže o mnou způsobeném problém jsem se dozvěděl až po týdnu přímo od zákazníka.

Řekl jsem si, že by bylo moc pěkné, kdyby se mi v okamžiku deploymentu vygeneroval test, který by ověřoval, že databáze má předpokládanou strukturu. Tento test bych pak po aktualizaci aplikace mohl pustit na ostré databázi a ujistil by mě a že jsem na nic nezapomněl. Z mého snažení vyplynul Ruby skript generující PHP test.

Kód naleznete zde.

Tagy: , , .