Introducing Time Heroic – Your heroic time tracker

Recently, I had problem to remember what the hell I was doing all the time. So I decided that I need somehow track my time. I searched few of existing tools, both on-line and desktop, like Harvest (www.getharvest.com) or Hamster for Gnome (since I use Linux desktop). But they feel confusing and complicated to me.

Beside it, we are struggling with underestimations of needed time for our projects in company where I work. But we had no data to analyse why and actually how much we underestimates it. So I come up with idea to make tool that lets me set what I am going to do now and what is my estimation of how long it will take me to done that task.

By that I would track how much time I spend on what, plus I would get more info about how my estimations are wrong.

Public release!

So I’m glad to present You a public release of this tool I called Time Heroic. It’s an alpha version, so it is meant to proof concept of the tool:

http://timeheroic.gdmt.cz

I am looking forward for Your opinions!

Generování kalendáře v XSLT 1

XSLT se normálně používá pro transforamce XML dat ve smyslu jejich různého obalení (např. do HTML), přeskupení, vytažení nebo seskupení na základě různých kritérií. Umí toho ale podstatně více. V XSLT se totiž dá naprogramovat de facto jakýkoli algoritmus.

Tento příspěvek se bude snažit ukázat, jak této vlastnosti XSLT využít pro následující dílo :)

XSLT calendar

Na úvod

V rámci cvičení k přednášce XML technologie na Matfyzu jsme měli za úkol vytvořit nějaký netriviální XSLT skript.
Jako data jsem si vzal XML popis rozvrhovacího problému, které mám z práce na bakalářce a říkal jsem si, jak bych je mohl prezentovat. Řekl jsem si, že bych mohl zkusit vykreslení kalendáře (klasického měsíčního s řádky po týdnech) se znázorněním časových oken ve dnech.

Na první pohled se může zdát, že na tom není nic extra. Je třeba si ale uvědomit, že zdrojová data žádnou informaci o kalendáři neobsahují a jak už jsem zmínil na začátku, XSLT je navrženo pro zobrazení existujících dat. Zároveň budu chtít vyhodnocovat, jaká okna jsou v jakém dni a to pouze na základě logických podmínek zapsaných v datech – tedy nikde není seznam dnů, ve kterém by okno bylo aktivní (může jich být dokonce nekonečno).

Když jsem se tedy do psaní XSLT skriptu pustil, začal jsem v XSLT 2.0 a šlo to celkem pěkně. Pak jsem ale zjistil, že na domací úkol to musí být v XSLT verze 1 a tak se podělím i o tom, jaké zapeklitosti přináší první nebo druhá verze.

Struktura dat

Podívejme se nejprve na XML soubor, který bude předmětem transformace. Datový XML soubor je opravdu jedonoduchý popis rozvrhování aktivit. Obsahuje

  • definice časových oken
  • definice kategorií aktivit
  • a samotné aktivity určené k rozvržení

Pro účel tvorby kalendáře budu pracovat pouze s časovými okny. Jejich podoba v XML je následující:

Z toho bude pro kalendář důležitý především element pravidla. Ten obsahuje podmínky, které když všechny platí současně na určítém datu, tak v to datum je okno dostupné. Podmínky (dle aktuálního schématu viz příloha) mohou být:

  • porovnání s konstantním datumem (větší, menší, rovno) (element den)
  • datum je pracovní den (element pracovniden)
  • porovnání s pořadím dne v týdnu (element denvtydnu)

Implementace skriptu

Popíši zde pouze zajímavé části skriptu, který je na konci příspěvku k dispozici ke stažení.

Výpočet dne v týdnu

Výpočet čísla dne v týdnu lze řešit mnoha způsoby (viz Determination_of_the_day_of_the_week). Já jsem použil Gaussovu metodu, na čemž není nic až tak složitého. Zajímavé na tom ale je, že to ukazuje sílu XSLT jako programovacího jazyka a že se v něm dá napsat i složitejší matematický výpočet.

Na tomto příkladě bych ale chtěl prezentovat hlavní rozdíl mezi XSLT 1 a XSLT 2. Podívejme se na rozdíl:

Nejprve hezčeji v XSLT 2:

a nyní v XSLT 1:

Všimnout si můžete 2 rozdílů:

  • funkce se v XSLT 1 nejmenují funkce, ale šablony
  • v XSLT 2 je datum předáno jako typovaná hodnota data, zatímco ve starší verzi jako 3 samostatné části den, měsíc a rok
  • výsledek je v XSLT 1 “plácnut” jako výstup šablony, v XSLT 2 je to typovaná a přesně ohraničená hodnota

Především to, že v XSLT 1 ještě funkce nebyly zavedeny, způsobuje značné množství textu kolem. Není to totiž nic, co by nešlo udělat, ale je s tím zbytečná práce – volat šablonu, předat ji parametry, navrat uložit do proměnnév (to zde není, ale představte si, že okolo volání posMod je ještě element xsl:variable), tu pak použít dá na 3 vnořené XSLT elementy. V XSLT 2 je to název funkce uvnitř XPath výrazu.
Významnou nevýhodou starší verze XSLT je také absence datových typů a s tím související absence pokročilých vestavěných funkcí. V tomto případě jsou vhod funkce pro práci s datem.

Generování tabulky kalendáře

Právě výpočet dne v týdnu se bude u kalendáře hodit. Stačí pak totiž vzít kolikátý den v týdnu je prvního v měsící, na takovém sloupci začít a pak už jen přičítat den s vypsáním buňky, když je neděle (resp. sobota u anglického týdnování) vložit nový řádek a tak dál dokud není konec měsíce. Jednoduché, že?

Alespoň takhle, by se to udělalo narychlo v PHP, C#, či jakémkoli jiném procedurálním programovacím jazyce. Jenže v XSLT nelze říct “opakuj dokud”, “vypiš když” a to především asi proto, že nelze říct “přičti den”. Proměnné v XSLT jsou totiž jen deklarativní a ve skutečnosti se chovají jako konstanty. XSLT je tak v tomto směru mnohem blíže např. prologu.

Jak tedy na to? Kdo zná neprocedurální programování už asi tuší. Cestou je rekurze. Jedinou možností jak změnit proměnnou je, jak jsme si řekli, právě její nastavení. A nastavit jde například při volání funkce (resp. šablony). Vytvoříme tedy šablonu, kterou chceme opakovat a při každé iteraci mít jinou hodnotu proměnné. Tu pak v ní samotné voláme znova s hodnotamy pro další iteraci, pokud (záměrně nepíši dokud) je splněna podmínka.

Hlavní šablona pro genarování tabulky se v mém skriptu jmenuje calendarWeekRowsOfMonth. Této šabloně se předá datum a ona vypíš řádek týdne, kde první vypsaný den bude právě předaný den. Tedy vypíše nejprve tolik prázdných buněk, kolikátý je to den v týdnu (k tomu slouží opět rekurzivní šablona emptyCells). Pak vypíše pomocí jiné rekurzivní šablony buňky dnů, jejichž počet je do konce týdne nebo měsíce. A na závěr, pokud den následující po právě vypsaných dnech je ještě v aktuálním měsící, zavolá sama sebe na den následující po vypsaných dnech.

Protože je XSLT a obzvláště verze 1 (kvůli funkcím via šablony) strašně ukecané, je ukázka ořezána

 

 

Vyhodnocení platnosti pravidel okna

Když už máme kostru kalendáře, zbývá naplnit buňky jednotlivých dní obsahem. Ten bude v našem případě obsahovat časová okna, která jsou v daný den k dispozici.

Jak už jsme si ukázali na začátku, v datech jsou definována pouze pravidla. Z nich se musí teprve informace o platnosti v konkrétní den dopočítat. Aby časové okno bylo v určitý den aktivní, musí být v ten den splněny všechny podmínky současně.

To lze realizovat opět pomocí rekurze tak, že otestuje jedno pravidlo a pokud je platné, rekurzivně otestustuje nasledující (pokud nějaká jsou) a vrátí výsledek. Pokud je neplatné, vrátí false a již nepokračuje.
K tomu se mohou šikovně využít klasické šablony XSLT, které se aplikují na elementy XML dokumentu. A to v tomto případě na všechny elementy pod elementem pravidla. Následující pravidla pak lze zjistit aplikováním šablon na prvky vybrané osou following-sibling.

Podobně elegantní využití XSLT ve své podstatě lze právě otestování jednotlivých pravidel. Jedoduše necháme aplikovat šablony na aktuálně vyhodnocovaný element pravidla. Aby se se aplikovala šablona provádějící vyhodnocení, stanovíme ji speciální mód evaluate. Při volání se pouze předá den a konkrétní šablona konkrétního elementu rozhodne na záladě jeho semantiky. Volající kód tak nemusí vůbec vědět o tom, co to je za pravidlo – pouze ho zajímá jestli platí nebo ne.

Vyhodnocení pravidla pak může vypadat následovně

S tímto už jen stačí v každé buňce kalendáře projít všechny definovaná okna (pomocí for-each), pro každé zjistit jestli platí a pokud ano, vypsat s pomocí přepočtu hodin začátku a konce do procent HTML blok, který pak webový prohlížeč zobrazí jako proužek odpovídající části dne :)

Výsledek

V přílohách je k dispozici ke stažení kompletní XML data a XSLT skript (včetně XSchema).

Na začátku XSLT skriptu jsou definovány hodnoty měsíce a roku, které určují, jaký kalendář se zobrazí. Samozřejmě už by jednoduše šlo například zobrazit kalendáře pro celý rok. Ale to už nechám na Vás :)

XSLT Calendar template

Algorithmic Music Lab

Program na generování tzv. algoritmické hudby pomocí přímého programování zvukové křivky. Umožňuje definovat pomocí vizuálního grafu matematický výraz, jehož vstupem je číslo vzorku a výstupem hodnota vzorku.

Screenshot

Algorithmic Music Lab

Popis

Program umožňuje generování zvuko na základě grafického modelování matematického výrazu, který počítá hodnotu každého vzorku výsledného zvuku.

Program funguje tak, že vytvořenému výrazu se pro každý vzorek předá číslo daného vzorku ve zvuku ve formátu 64 bitového celého čísla (long int). Výraz tak může pracovat se základními binárními a aritmetickými operátory.

Výsledek výrazu je vydělen hodnotou 255 (resp jsou použity nejmenší 8 bitů) a tato hodnota je použita jako hodnota vzorku na škále 0-255.

Ovládání

Vložení uzlu

Uzly výrazu se vkládají dvojklikem na vybraný uzel v seznamu napravo v okně programu. Pokud uzel vyžaduje při vytvoření dodatečné informace, je otevřeno okno, ve kterém je možné je zadat.

Propojení uzlů

Každý uzel má žádný až několik vstupních “pinů”, které jsou znázorněny čtverečky na spodní straně uzlu. Každý uzel má jeden výstupní pin.

Propojení lze provést metodou “drag-n-drop” tažením myší výstupního pinu nad vstupní pin jiného uzlu.

Každý vstupní pin může mít maximálně jedno napojení. Výstupní pin může být napojen na více vstupů.

Aktivní uzel

Dvojklikem na název uzlu se tento aktivuje a použije se pro výpočet hodnoty vzorků.

Vlastnosti uzlu

Některé uzly mají vlastnosti, které lze upravovat a měnit tak chování uzlu. Tyto vlastnosti se otevřou kliknutím na tlačítko “P” na uzlu.

Odebrání uzlu

Uzel lze z plochy odebrat kliknutím na tlačítko “X” na uzlu. Případné spojení s uzlem jsou automaticky odebrány.

Přehrávání

Spustit nebo zastavit přehrávání slouží tlačítko “PLAY” v pravém dolním rohu okna programu.

Přehrávání je možné nastavit vzorkovací frekvenci ve vstupním poli nad tlačítky “SAVE” a “LOAD”

Zobrazení zvukové vlny

Při přehrávání je vizualizace zvokové vlny autoamticky synchronizována s přehráváním.

Tlačítkem “1:1″ je možné nastavit zobrazení odpovídající 1 vzorek = 1 pixel (šířky).

Posuvníkem “View Length” je možné nastavit velikost zobrazovaného okna v počtu vzorků. Doporučuje se nastavit mocninu 2 pro zfázování pohledu ( závisí ovšem na schématu generovaného zvuku ).

Posuvníkem “Position” je možné při vypnutém přehrávání nastavit číslo vzorku levého okraje zobrazení. Je tak možné ručně procházet generovanou zvukovou vlnu.

Typy uzlů

Základní

Mezi základní typy patří aritmetické a binární logické operátory:

  • NumberExpression – konstantní číslo – nemá vstup, číslo je definováno ve vlastnosti uzlu
  • AndExpression – provede binární (bit po bitu) AND nad vstupními hodnotami (vše je long int)
  • OrExpression – binární OR
  • XorExpression – binární XOR
  • ShiftLeftExpression – bitový posun vpravo – vlastnost určuje o kolik bitů
  • ModuloExpression – zbytek po celočíselném dělení – první vstup je číslo, druhý vstup je dělitel
  • AritmExpression – aritmetický uzel. Provádí aritmetickou operaci nad vstupy. Operace:
    • Mult – násobení
    • Div – vydělení prvního vstupu druhým vstupem  v desetinném módu (výsledek je zaokrouhlen) – interně je použit double
    • IntegerDiv – vydělení vstupu druhým vstupem v celočíselném módu
    • Add – sečtení
    • Sub – odečtení
    • Vlastnost “Divider” umožňuje druhý operand vydělit v desetinném módu – např při násobení škály je možné druhý operand normalizíovat do škály 0.0-1.0 a prvním ho pomocí operace Mult vynásobit na požadovanou škálu.

Podmíněné

  • ConditionExpression – “ternární operátor” – pokud je hodnota prvního vstupu rovna “0”, výstupen bude hodnota druhého vstupu, jinak hodnota třetího vstupu
  • SwitchExpression – přepínač – při vložení definujete počet celkových pinů. Prvení vstup určuje číslo pořadí dalších vstupů, které se použijí jako výstup. Hodnota vstupního pinu je automaticky modulo počet dalších vstupů – není třeba dopředu ošetřovat.
  • ArrayExpresion – pole. Pole má jako vlastnost seznam hodnot. Hodnota vstupního pinu slouží pro výběr hodnoty z tohoto seznamu ( hodnoty jsou číslovány od 0). Hodnota vstupu je modulo velikost seznamu.

Speciální

  • SinusExpression – Generátor sinusoidy. Má vlastnosti
    • InputDivider – vydělí vstupní hodnotu v desetinném módu, kterou použije jako vstup pro sinus (v radianech)
    • OutputMultiplicator – násobič hodnoty Sinu pro výstup (výstup je vždy long int).

Download

V přiloženém ZIP archivu je k dispozici program a ukázkové soubory.

Požadavky

  • MS Windows Vista/7
  • DirectX 9 nebo vyšší
  • .NET framework 4.0
  • Zvuková karta DirectSound nebo kompatibilní

Stáhnout AML

Rekonstruktor – multiview orthographic projection to 3D

Program for reconstruction original 3D object from its orthographic projection. Demonstrates ability to automatic reconstruction, it is able to do only simple objects. Created during my computer science studies.
rekonstruktor

Features

  • Able to reconstruct original 3D object from 3 views of orthographic project of object
  • Simple and intuitive GUI
  • Easy view drawing with snapping to grid and other lines.
  • Real-time reconstructing

 Technologies

  • .NET 2
  • C#
  • WinForms

Project on GitHub

Download EXE