Zápisník

// Odesílání denních přehledů ze služby Wunderlist emailem

Nějakou dobu používám jako úkolovníček službu Wunderlist (yup, taky jedu na GTD vlně). V některých aspektech předčí svého největšího konkurenta, Todoist (minimálně má notifikace v tarifu zadarmo a trošku přehlednější design). Jedinou věcí, která mi opravdu chybí, je automaticky zasílaný denní přehled (což prý Todoist má).

Naštěstí před nějakou dobou Wunderlist uvolnil API, které umožňuje aplikacím třetích stran přístupovat a spravovat obsah uživatelského profilu.

Napsal jsem si jednoduchý skript, který ze služby stáhne nedokončené úkoly a pošle email s denním přehledem. Nazval jsem jej Wudd. Nenabízím jej jako online službu (zatím?), každý si jej musí rozchodit na svém stroji (viz soubor README).

Hlavní vlastnosti:

  • 3 sekce: Dnešní úkoly, nezatříděné úkoly v inboxu bez data splnění, úkoly s datem splnění v příštích 7 dnech. Generická struktura s lambda podmínkami dovoluje snadno definovat další sekce.
  • HTML i plaintextová verze emailu.
  • Stručný souhrn v předmětu zprávy.
  • V současnosti je výpis v češtině. I18n zatím není podporováno.
  • Odešle email přes lokální SMTP server (autorizace & SSL zatím není podporováno).

Pro stažení navštivte moje Bitbucket repo. Na stejném místě lze hlásit chyby. Enjoy!

// Nový vzhled

Celkem dlouho jsem odolával bezpečnostním hláškám ohledně aktualizací DokuWiki, na které provozuji zdejší stránku. Updaty jsem odkládal hlavně kvůli množství zásahů, které jsem do kódu za účelem různých vylepšení udělal. Mergování těchto změn se stalo se zvyšujícím počtem změn v distribuci DokuWiki dost obtížné.

Před 2 týdny jsem si řekl dost a rozhodl se s tím něco dělat. Všechny úpravy jsem zahodil a stránky přenesl do nové instalace DokuWiki a postupně doplnil nezbytné pluginy. Blogovací plugin jsem nahradil za schopnější BlogTNG, jako šablonu jsem použil mnml-blog. Časem třeba dojde i na vlastní design.

Samozřejmě jsem neodolal, a několik úprav do kódu pluginu a templaty udělal (hlavně podporu pro dvojjazyčný web). Ale od minule jsem trochu zestárl a zmoudřel a kód DokuWiki je zatím netknutý, takže to nebrání hladkým updatům :-). Navíc jsem zúročil své nabyté zkušenosti s „lepšími“ verzovacími systémy a úpravy si vedu v paralelní branchi k updatům z oficiálních zdrojů. Postupně to tu dolaďuji, hlavně doplňuji chybějící české lokalizace v pluginech a templatě.

A až tohle všechno dodělám, dojde i na responzivní layout :-).

// Můj první plugin pro DokuWiki

Před několika měsíci jsem kompletně updatoval svoji website. Vybral jsem si DokuWiki jako velmi flexibilni engine rozšiřitelný spoustou pluginů.

Též jsem použil Blog plugin a další k vytvoření svého občasníku. Ale chyběla mi jedna vlastnost. Tou bylo zobrazení data vytvoření a autora na stránce příspěvku podobně, jako to vkládá Include plugin v seznamu. Ano, DokuWiki standardně tiskne zápatí, ale pokud je použit Discussion plugin, vloží se až pod všechny komentáře hodně hodně dolů.

Takže jsem spáchal jednoduchý plugin, který informace vkládá těsně pod příspěvek, nad komentáře. Stačí se podívat například na stránce tohoto příspěvku dolů. Musel jsem ale hrábnout do proměnných event handleru (které by v jiném jazyce velmi pravděpodobně byly privátní), abych plugin udělal prvním listenerem události TPL_ACT_RENDER_AFTER, tj. ještě před Discussion pluginem. Důsledkem toho je vždy text před komentáři. Nutno přiznat, že tento trik mi naťuknul Vity. Plugin lze stáhnout na stránce DokuWiki goodies.

// Photobase, nová verze, další featury

Po nějaké době jsem se dokopal k dalším inovacím na mojí fotogalerii. Stalo se tak vlastně až na základě okolností a potřeby nahrát do galerie cca 50 fotografií. Původní způsob jsem ihned zavrhl, protože bych se zřejmě uklikal k smrti. Světlo světa tak spatřil primitivní upload souborů přes FTP. K tomu jsem již dříve pracoval na systému pro lokalizaci, takže nyní mohu psát PhotoBase v angličtině a zachovat i českou verzi. Nemluvě o možnosti jednoduchého překladu do téměř jakéhokoli jazyka.

Lokalizace

PhotoBase

Abych si lokalizaci co nejvíce usnadnil, použil jsem jednoduše asociativního pole. Jednotlivá hesla k překladu jsou klíči pole a přeložená hesla pak obsahem jednotlivých položek. Tvorba nové lokalizace pak spočívá v založení nového souboru v podadresáři /inc/lang podle již existujícího exempláře a následného přeložení hodnot v poli. Jedinou nevýhodou je nutnost zachování korektní PHP syntaxe.

V kódu pak volám pro vložení hesla příslušnou funkci, která zajistí překlad, případně nahlásí debugovací komponentě neexistenci překladu a použije původní text. Pro složitější konstrukce s proměnlivými položkami existuje funkce, která po překladu provede nahrazení výrazů %1, %2 apod. hodnotami uvedenými jako parametry funkce. Tento fígl je použit snad ve všech aplikacích, které znám.

FTP upload

FTP upload

FTP upload

Jak bylo již řečeno, důvodem pro uspíšení vytvoření této funkce byla hromada fotek, které ulpěly na paměťové kartě mého mobilu po dovolené na Vysočině. Upload přes FTP není úplně to, co bych si představoval, pro někoho může být postup příliš složitý nebo nepohodlný, ale je to asi nejjednodušší řešení, kterého jsem byl schopen dosáhnout.

Jak to zhruba funguje … Administrátor musí každému uživateli, který chce nahrávat fotky přes FTP, vytvořit adresář pro uploady nesoucí jeho přihlašovací jméno a příslušný účet, pomocí kterého může uživatel do adresáře fotky nahrát. Tento požadavek je asi ze všeho nejvíc „zdržující“ a navíc je nutno při vytváření účtu dát pozor na přístupová práva, aby nebyla ohrožena bezpečnost aplikace (přístup do jiného než adresáře pro upload). Uživatel potom adresář naplní fotkami, které chce přidat. Pomocí příslušného odkazu přejde k hromadnému vkládání. Skript načte všechny soubory a zkontroluje jejich mime-typy, případně upozorní na neobrázkové soubory, které je nutno před nahráním z adresáře odstranit. Uživatel vybere galerii, do které chce fotografie nahrát a potvrdí.

V tuto chvíli nastává další z problémů tohoto řešení. Skript by měl správně soubory přesunout do adresáře pro fotografie. Ale důsledkem toho, že má FTP uživatel většinou jiná práva než webserver, je fakt, že skript soubory z adresáře pro upload odstranit nemůže. Proto je pouze zkopíruje a na tuto „chybu“ upozorní a varuje před možným opětovným nahráním v případě ponechání oněch souborů.

V budoucnu bych chtěl tuto nepohodlnou funkci nahradit mnohem sofistikovanější. Jako nejhezčí řešení se jeví Java applet. Bohužel v tuto dobu jednoduše prostě netuším, jak to přesně funguje. Například Facebook má velmi povedený. Asi začnu o této alternativě zjišťovat víc. Další možností je uploadovat fotografie v jednom souboru, například jako ZIP nebo TAR. Jenže to naráží na omezení v podobě maximální velikosti dat odesílaných metodou POST, takže se to jeví jako slepá ulička.

Nicméně ...

nové funkce jsou na světě. A to ještě před půl rokem to vypadalo, že tento mini-projekt bude jako spousta jiných zapomenut pod záplavou ostatních věcí a povinností. Takže pro zájemce odkazuji na stránky projektu PhotoBase. Pokud byste se přeci jen rozhodli galerii vyzkoušet, přivítám Vaše odezvy a případné hlášení chyb. Enjoy!

// MiniMath - pozdě, ale přece

MiniMath jsem začal tvořit již někdy v roce 2006 jakožto semestrální práci na předmět Jazyky a překladače. Shodou okolností jsem tehdy měl i pokročilé C++, takže cvičící si k tomu přimyslel nějake požadavky, včetně GUI, a náplň vánočních prázdnin jsem měl jasnou.

Pozdě, ale přece?

Minimath ikonka

Program byl v podstatě hotov někdy ze začátku ledna 2007, nicméně teprve teď jsem se dostal k tomu, abych jej dostal do podoby, která se hodí k publikaci. Proč až teď? Přesnou odpověd neznám, ale zcela jistě v tom měly prsty školní a jiné povinnosti. Následující semestr byl totiž ve znamení programování bakalářky a jiných semestrálek (mj. PhotoBase vznikla jako práce na předmět Internet a WWW). Také se mi povedlo projekt recyklovat v předmětu Programování v jazyku Java, kde jsem celý kód přepsal do Javy a GUI do Swingu. Červenec jsem strávil (doteď nevím, proč tak dlouho) psaním bakalářky a v srpnu jsem částečně „odpočíval“ a částečně se učil na státnice. Po euforii z 20. září jsem nějakou chvíli neměl chuť nic dělat. Další semestr, už na mgr. studiu, byl ve znamení spousty semestrálek a podivných předmětů (znáte to, prvák je vždycky nejhorší). No a tím jsem se na časové ose přiblížil až k dnešku…

Co že to vlastně je

MiniMath prerelease

Hlavní okno programu

MiniMath je tedy překladač a interpreter příkazů vlastního jazyka matematických výrazů a operací. Umožňuje definovat proměnné a funkce včetně rekurze, kterou lze ovládat jen a pouze pomocí ternárního operátoru (nebo spíš funkce) If, a tak rekurzi zastavit, jako jednoduchý příklad lze uvést definici faktoriálu

fact (x) = if (x>0, x*fact(x-1), 1)

a = fact(6)

Hodnoty proměnných se počítají, až při výstupu na obrazovku, tedy jejich definici nelze založit na předchozí hodnotě (např. a=a+2). V tomto případě překladač pozná „přímou“ rekurzi a definici nepoužije. V případě definice faktoriálu výše ovšem pouze upozorní na možnost zacyklení, protože to lze správnou podmínkou zastavit. Výstup na obrazovku se provádí příkazem

write(promenna, „nebo nějaký text“)

Vypočtené hodnoty proměnných se cachují a platnost cache se nastavuje dynamicky podle změny závislostí a redefinicí závislých proměnných/funkcí. Platné cache hodnoty se v logu dynamicky zvýrazňují. Čtení ze vstupu se provádí zabudouvanou funkcí (z hlediska jazyka spíš klíčového slova) read, např.

a = read(„test výzvy ke vstupu“)

V tomto případě se read zavolá při každém vyhodnocení proměnné a (pokud už není v cache).

GUI je vytvořeno na frameworku Qt 4, opensource verzi, program je tudíž uvolněn pod GNU GPL. Pro formátování výstupu lze použít CSS, vzorový soubor je přiložen. MiniMath lze jednoduše rozšířit o další zabudované funkce, které nelze zadefinovat algebraickými operacemi. Ve zdrojovém kódu existuje příslušná abstraktní třída na zabudované funkce/konstanty. Pro lepší čitelnost doporučuji vygenerovat dokumentaci pomocí nástroje Doxygen.

Doufám, že aspoň někomu se můj prográmek bude líbit. Kompletní distribuci najdete na stránce projektu MiniMath.