Blok přesunut






Vážení čtenáři. Tento blok byl přesunut na novou adresu http://blok.kurzy-uml.cz. Zde ještě chvíli budou staré články, nové však již vycházejí pouze na novém místě. Prosím, upravte si své záložky.



úterý 10. března 2015

Jak pokračuje realizace mých projektů? #ukazcodelas

Další měsíc práce je za mnou a rád bych se podělil o to, co zatím vzniklo na základě mého plánu zveřejněném v lednu.
  • Školení: Kromě přípravy kurzu Enterprise Architecta, o kterém jsem již psal, je tu vypsané dvoudenní školení přípravy k certifikaci znalostí UML: OCUP Intermediate ve dnech 30. a 31. března. Cena školení je včetně certifikace. Více informací získáte na stránkách školicího střediska.
  • Moodle: Po několika nevydařených pokusech a mnoha hodinách času strávených při snaze připravit testový software Moodle na mém stávajícím hostingu jsem se rozhodl pro radikálnější krok. Založil jsem novou doménu a dal ji do správy společnosti Webhosting C4, která své služby upravuje přímo na míru nejen pro uvedený nástroj, ale třeba i WordPress a mnohé další. Moodle je tam nainstalovaný a funkční v řádu několika minut a je možné s ním začít hned pracovat.
  • Testy UML: Jakmile bylo Moodle připravené, začal jsem do něj zadávat první testové otázky. V současné době mám k dispozici téměř 120 otázek, ze kterých se budou testy generovat. Díky tomu bude každý test unikátní a jen s velmi malou pravděpodobností získají dva uživatelé všechny otázky stejné. Musím se přiznat, že vymýšlení špatných odpovědí k otázkám bylo často docela složité. Tento týden budou připraveny jednotlivé testy a poté začne „testování vlastních testů“. Ostrý provoz plánuji na začátek dubna. A na co se lze těšit?
    • Ukázkový test zdarma.
    • Další tři testy s různou měrou informací získaných na základě odpovědí.
    • Ve spolupráci se serverem ilutrika.cz získá jeden ze zákazníků UML tričko. Konkrétní pravidla budou zveřejněna v den spuštění testů.
    • A jako návnadu uvádím jednu z otázek:
      Ukázková úloha z připravovaných testů
  • Tento blok: Jako vedlejší bod březnového programu je převod tohoto bloku z Bloggeru pod křídla systému WordPress. Musím opět zmínit možnosti hostingu na zmíněném C4, díky kterému je instalace systému otázkou pár okamžiků. A při použití vhodného pluginu lze převést i články v řádech sekund. Přiznávám se, že mě to vyděsilo, jak to celé proběhlo hladce. Zatím to kontroluji a hledám, zda je opravdu vše v pořádku. Do světa to spustím společně s již zmíněnými testy UML.

čtvrtek 12. února 2015

Školení nástroje Enterprise Architect

Před cca 14 dny jsem se tu rozepisoval o svých plánech pro letošní rok a dnes mohu představit první výsledek. Ve spolupráci se společností Anywhere pořádáme třídenní praktický kurz nazvaný Enterprise Architekt – modelování napříč diagramy. Na uvedené stránce uvidíte podrobnější rozpis toho, co se Vám budu snažit předat. Celá sláva se bude konat 13.-15. dubna 2015.

Jestliže se chcete nejprve seznámit s kurzem nezávazně a zdarma, přijďte se podívat na snídaňové setkání Enterprise architect v rukou profesionála. To se koná 25. 3. 2015 od 9:00 do 11:00.

Těším se, že se tam potkáme.

úterý 10. února 2015

Sedm smrtelných hříchů uživatelů UML

Předminulý týden jsem měl povídání o často dělaných chybách uživatelů UML. O některých jsem již psal i na těchto stránkách. Prezentaci můžete zhlédnout níže.


Pokud vás některý zaujal více a nevíte si s ním rady, dejte např. v komentářích vědět a já se tu o něm rozepíšu.

středa 28. ledna 2015

Já, UML a rok 2015

Loňský rok jsem se pustil do několika časově náročných projektů současně, což může, doufám, vyústit v relativně dost novinek tento rok. Na čem tedy pracuji?

Přepracování stránek OCUP.cz

Jelikož přišla na svět nová verze UML certifikace, je třeba aktualizovat stránky, aby odpovídaly certifikačním požadavkům. S tím souvisí několik bodů:
  • Přepracování OCUP.cz nejen obsahově, ale zvažuji přechod z Bloggeru na WordPress. Očekávám od toho lepší čitelnost.
  • Stejně tak se na WordPress přesune tento blok.
  • E-knižní podoba stránek OCUP.cz je v současnosti distribuována jako PDF vygenerovaný z wordovského dokumentu. Jelikož jsem milovníkem (La)TeXu a kvalitní sazby, zvážím přechod právě na tento systém (vy samozřejmě budete nadále dostávat PDF dokument). 
Aktualizace přípravy k certifikaci OCUP 2

Elektronické kurzy UML a EA


Rád bych postupně připravoval elektronické kurzy (školení) nejen UML, ale i Enterprise Architekta pro distanční studium, kdy nebudete omezeni konkrétním časem. Sám jsem několik takových kurzů absolvoval jako student a vyhovovalo mi to. K tomu si (prozatím) hraji se systémem Moodle.

Testy UML

Chcete si nanečisto otestovat své znalosti UML? Nebo máte firmu, která chce otestovat uchazeče o práci? Případně se chystáte na certifikační zkoušku z UML a chcete se podívat na některé typické otázky? Pro všechny takové skupiny bych rád připravil odpovídající nabídku. Opět, pro tyto účely zkoumám Moodle.

Školení Enterprise Architecta

V současné době jsem v jednání s jedním školicím střediskem, že připravíme školení nástroje Enterprise Architect jako takového. Mělo by jít o ukázku na uceleném příkladu, kdy si budete moci vše vyzkoušet. Jakmile dojde k dohodě, oznámím to tu včetně termínů.

Vytvoření rozšíření pro EA kontrolující dodržení UML pravidel 

Jak jistě víte, EA není zrovna kabrňák v dodržování pravidel UML. Z tohoto důvodu se snažím vytvořit plugin, který bude vaše modely kontrolovat a zobrazovat nalezené nedostatky. Pro mě je to příjemný návrat o deset let zpět, kdy jsem aktivně programoval a těšilo mě to.

Kus zdrojového kódu rozšíření pro Enterprise Architecta

Jak je vidět z obrázku, dělám to na platformě .NET. Používám C# a Visual Studio .NET 2013 (dříve edici Express, nyní Community; jak na to jste se mohli dočíst v mém článku). Výhodou je, že máte kvalitní a aktuální vývojový nástroj za nulovou cenu. Na druhou stranu pokud předtím 14 let programujete především v Pascalu a poté v Delphi (případně PL/SQL), tak zvykat si na nové prostředí a platformu je docela boj. Naštěstí se mi daří vyhrávat. 
Výsledek kontroly prvků na diagramu
Na obrázku je uvedena současná podoba pluginu. Sice to vypadá už použitelně, ale věřte, že zatím je stále hodně práce přede mnou.

středa 26. listopadu 2014

Diagram aktivit: Aktivita nebo akce?

Jedním z poměrně hloupých nedostatků UML je, že aktivita i akce mají stejnou základní notaci. Jednou z naprosto neakceptovatelných chyb Enterprise Architekta je, že uživatelům dovoluje zaměňovat aktivity a akce. A nedostatkem uživatelů UML je, že si myslí, že stejná notace uvedených prvků znamená i jejich stejnou sémantiku. Co je tedy z pohledu UML standardu správně a jak vhodně modelovat aktivity a akce v uvedeném nástroji?

Aktivita popisuje libovolné chování pomocí orientovaného grafu, tj. pomocí uzlů a orientovaných hran, které jsou aktivitě podřízené (aktivita je vlastní). Uzly se dělí do tří velkých skupin: řídící, objektové a ty, které něco vykonávají. Jedním typem takových vykonávacích uzlů jsou právě akce. Akce jako taková je dále nedělitelný krok dané aktivity (tímto krokem ovšem může být volání jiné aktivity, ukážeme si dále). Předávání řízení mezi akcemi se děje pomocí tzv. přechodových hran, přičemž UML definuje řídící a objektové hrany. Důležité je dále vědět, že přechodová hrana může být pouze mezi uzly, které vlastní stejná aktivita, která současně vlastní i danou hranu. Jinými slovy, nesmí se stát, že byste namalovali hranu, která vede z uzlu jedné aktivity do uzlu jiné aktivity.

Ukažme si jednoduchý příklad:


Na diagramu je aktivita pojmenovaná „Udělej čaj“, která vlastní, kromě jiného, pět akcí. Tyto akce jsou dále nedělitelné (myšleno v našem modelu, který, jak jistě víte, poskytuje zjednodušený pohled na reálný svět). Jak jsem říkal, notace obou elementů je v této základní podobě shodná. První častou chybou uživatelů EA je skutečnost, že místo akcí používají aktivity. To je špatně! Proč je to špatně, samozřejmě vysvětlím kousek níž.

Pojďme ale prozatím o krok dál. Co se má stát, pokud má sekretářka udělat šéfovi čaj a přinést jej s návrhem dopisu pro představenstvo společnosti? Nejprve ukážu to, co udělá většina nepoučených analytiků:

Co je na obrázku špatně? Řídící tok směrem k aktivitě a poté od aktivity. Ten totiž z definice může vést pouze mezi uzly diagramu aktivit, nikoliv však mezi aktivitami nebo od aktivity k něčemu jinému (akci, rozhodovacímu uzlu…).

Jak to však má být správně? UML mj. definuje akci typu CallBehavior. Jejím úkolem je zavolat některé jiné chování. Notace přidává do pravého dolního rohu „vidličku“ v případě volání jiné aktivity. Akci určíme, které chování má zavolat:

Pokud vám to připadne divné, tak vězte, že taková akce nedělá nic jiného, než že synchronně zavolá jinou aktivitu. Zavolání jiné aktivity je tedy jeden, dále nedělitelný krok. Teď už by vám to tedy mělo být jasnější.

Proč tomu tak je?

Dosud jsem tu jen povídal, jak to má být správně. Ještě než ukážu, jak se s tím vypořádat v EA, řeknu vám, proč je to tak správně. K tomu mi bude sloužit UML 2.5 (druhá beta), ale tytéž informace najdete na podobných místech i ve starších verzích UML 2.x.

Nejprve nahlédněme na základní diagram metatříd pro aktivity:


Na něm vidíme, že opravdu aktivita (metatřída Activity) vlastní uzly (metatřída ActivityNode) a hrany (metatřída ActivityEdge). Dále shledáme to, že hrany vycházejí z nějakého takového uzlu a vedou do nějakého uzlu (dvě asociace mezi ActivityNode a ActivityEdge).

Abych potvrdil další správnost mého výkladu, musíme zjistit, zda aktivita (metatřída Activity) je specializací – ne nutně přímou – metatřídy ActivityNode. Pokud by byla, pak lze vést hranu do a z aktivity. Pokud nikoliv, pak hrana do aktivity vést nesmí (jestliže znáte principy objektově orientovaného návrhu, tak plně rozumíte právě napsanému textu). Důkaz lze provést procházením standardem nebo v EA načtením metamodelu. Pokud věříte mně, pak vám stačí následující obrázek:

Je aktivita, třeba i nepřímou, specializací metatřídy ActivityNode? Nikoliv. Tedy platí tvrzení, že hranu mezi aktivitou a čímkoliv dalším udělá jen ten, kdo neumí UML, nebo ten, kdo si nepřečetl tento článek. A EA mu takovou čuňárnu umožní.

Konečně pro formu si můžete sami dohledat, zda může být hrana mezi uzly různých aktivit (nápověda: hledejte omezení source_and_target metatřídy ActivityEdge).

Jak správně pracovat s EA?

 

Nové modelování 

Začínáte-li nový model nebo vytváříte nový diagram aktivit, pak máte víceméně cestu umetenou. Pro aktivitu použijte v ToolBoxu prvek Activity, pro akci Action.


Pokud akci přetáhnete na diagram, Enterprise Architect vám dát na výběr, který typ akce chcete. Pokud jej nechcete blíže specifikovat, použijte volbu Atomic. Jestliže chcete zavolat jiné chování, vyberte položku Call Behavior.


EA vám zobrazí dialog, ze kterého dané chování vyberete.


Již existující elementy

V případě, že již máte špatně namodelovaný diagram aktivit, kde jste místo akcí používali opět aktivity, ani zde není moc co ztraceno. Označte špatně použitou aktivitu a v menu Element -> Advanced -> Change Type… lze změnit typ prvku.


Bohužel to nefunguje pro více než jeden element najednou.

Závěrem

Je třeba si zapamatovat tři zásadní pravidla:
  • Aktivita není totéž, co akce.
  • Řídící i objektové toky lze modelovat pouze mezi uzly téže aktivity, nikoliv však mezi aktivitami.
  • Chceme-li použít „kód“ jiné aktivity, použijeme k tomu akci CallBehavior.

středa 22. října 2014

Chyba Enterprise Architecta v objektovém modelu

Při programování rozšíření pro EA jsem narazil na další chybu. Funkce Repository.GetContextItemType() nevrací správnou hodnotu, pokud máte vybraný model v Project Browseru. Namísto hodnoty otModel dostanete otNone, což není úplně zdravé. Chybu jsem poslal do Sparxu, ale údajně o ní již dlouho vědí, ovšem do opravy se jim zřejmě nechce. Než se tak stane, můžete použít následující funkci, které problém řeší:

protected EA.ObjectType temporaryGetContextItemType(EA.Repository Repository) {
    EA.ObjectType vOT = Repository.GetContextItemType();
    if (vOT == EA.ObjectType.otNone)
        //try it to retype to Package and check if it is a model... 
        //if anything gets wrong, forget it
        try {
            if (((EA.Package)(Repository.GetContextObject())).ParentID == 0)
                return EA.ObjectType.otModel;
        } catch { }
    return vOT;
}

Funkce v případě, že GetContextItemType vrátí otNone, tak zkusí vybraný objekt přetypovat na balík a zjistit jeho ParentID. Pokud se to povede a hodnota je rovna nule, jde o model, jinak je to cokoliv jiného, chybné přetypování odchytím v sítu výjimek a navrátím původní hodnotu.

Pokud budete dále pracovat s balíkem, který je vlastně modelem, tak také dejte pozor na to, že jeho vlastnost Element je null (což se v dokumentaci nedozvíte). Není to od autorů hezké.

A drobnost na závěr: funkce očekává, že máte otevřený nějaký projekt. Že tomu tak opravdu je, byste si měli zajistit sami např. vhodným povolením či zakázáním jejího volání v EA_GetMenuState.

středa 8. října 2014

Jak naprogramovat rozšíření pro Enterprise Architect

Vytvořit vlastní rozšíření (plug-in) pro Enterprise Architect je velmi snadné, rychlé a dokonce bez dalších nákladů na programovací nástroje. Jak tedy na to?

Předpokládám, že máte nainstalovaného Enterprise Architecta (pro uvedené pokusy stačí i dosud funkční trial verze). Dále budete potřebovat nějaký programovací nástroj. Jestliže nechcete do něj vkládat jakékoliv peníze, použijte Express edici Visual Studia od Microsoftu. Já sám používám VS Express 2013 for Desktop s jazykem C#. Pokud tedy i to máte, můžeme přikročit k vlastní tvorbě (ukázky budou právě v C#).

Visual Studio

  1. Spusťte si Visual Studio a vytvořte nový projekt podle šablony Class Library.
  2. Nyní musíte svůj projekt ve VS seznámit s Enterprise Architektem, tedy jinými slovy přidat na něj referenci. Díky tomu budete moci využívat třídy a jejich vlastnosti definované přímo dodavatelem EA. To uděláte tak, že:
    1. V Solution Exploreru zvolíte položku References a přes kontextové menu vyberete položku Add Reference… 
    2. V dialogu Reference Manager, který se otevře, zvolte tlačítko Browse… a z adresáře, kde máte nainstalovaný Enterprise Architect, vyberte soubor nazvaný Interop.EA.dll.
       
    3. Zvolte tlačítko OK.
  3. Jelikož budeme zobrazovat nějaké informace i uživateli, pak přidáme ještě System.Windows.Forms (podobně jako v předchozím kroku vyvoláme dialog Reference Manager, vlevo zvolíme Assemblies --> Framework a v seznamu zaškrtneme System.Windows.Forms).
  4. V tomto kroku řekneme překladači, aby s naší knihovnou zacházel tak, aby ji šlo použít jako COM objekt. Toho docílíme tak, že:
    1. dvojitým kliknutím (dablklikem) na položku Properties v Solution Exploreru zobrazíme vlastnosti našeho projektu.
    2. Zvolíme tlačítko Assembly Information…
    3. Zaškrtneme Make assembly COM-visible.
    4. Volitelně můžete upravit i další pole.
    5. Stiskněte OK.
  5. Abychom si ulehčili ještě trochu život, požádáme Visual Studio, aby po každém sestavení nové verze na našem počítači zaregistrovalo knihovnu do registrů.
    1. Z předchozího kroku máme zobrazené Project Extensions. Po pravé straně zvolíme záložku Build.
    2. V sekci output zaškrtněte políčko Register for COM interop.
  6. Visual Studio pro nás připravilo třídu Class1. Pro lepší pohodlí si ji můžete přejmenovat např. na MyFirstEAPlugin, podobně i soubor na MyFirstEAPlugin.cs.
  7. Zkopírujte si nyní následující zdrojový kód do VS. V textu je pár komentářů, které vysvětlují jednotlivé metody. Obecně lze říct, že EA volá v případě potřeby metody začínající na EA_. Pro další studium je tu pro vás nápověda k Enterprise Architektovi a oblast nazvaná Automation and Scripting.
    using System;
    using System.Windows.Forms;
    
    namespace OCUPBlokPlugin
    {
        public class MyFirstEAPlugin
        {
    
            /// 
            /// Tuto metodu volá EA aby zjistil, jakého typu je náš plugin.
            /// Můžeme buďto zvolit MDG, pokud tvoříme plugin tohoto typu, jinak 
            /// vrátíme prázdný řetězec, čímž říkáme, že jde o obecný plugin.
            /// 
            /// Budeme ignorovat.
            /// Vrátíme prázdný řetězec.
            public String EA_Connect(EA.Repository Repository)
            {
                return "";
            }
    
            /// 
            /// Metoda je volána při ukončování EA. Takže po sobě zkusíme trošku uklidit.
            /// 
            public void EA_Disconnect()
            {
                GC.Collect();
                GC.WaitForPendingFinalizers();
            }
    
            /// 
            /// Definujeme si někteté položku v Menu
            /// 
            const string menuHeader = "-&OCUP blok plug-in";
            const string menuItemAbout = "&About...";
    
            /// 
            /// Pokud EA potřebuje znát seznam položek menu, pak se zavolá tato metoda
            /// 
            /// Repository jako taková
            /// Umístění menu
            /// Název menu
            /// 
            public object EA_GetMenuItems(EA.Repository Repository, string Location, string MenuName)
            {
    
                switch (MenuName)
                {
                    // Jde o hlavní položku, vrátíme náš název
                    case "":
                        return menuHeader;
                    // a zde vrátíme všechny naše položky mmenu
                    case menuHeader:
                        string[] subMenus = { menuItemAbout };
                        return subMenus;
                }
    
                return "";
            }
    
            /// 
            /// Tady se nás EA ptá, zda má položku v menu povolit nebo zakázat. 
            /// Můžeme tak reagovat na různé stavy (např. zdali je otevřen nějaký projekt).
            /// 
            /// 
            /// 
            /// 
            /// 
            /// 
            /// 
            public void EA_GetMenuState(EA.Repository Repository, string Location, string MenuName, string ItemName, ref bool IsEnabled, ref bool IsChecked)
            {
                switch (ItemName)
                {
                    case menuItemAbout:
                        IsEnabled = true;
                        break;
                    default:
                        IsEnabled = false;
                        break;
                }
            }
    
            /// 
            /// Konečně! Někdo zvolil některé z našeho menu, takže směle do toho.
            /// 
            /// 
            /// 
            /// 
            /// 
            public void EA_MenuClick(EA.Repository Repository, string Location, string MenuName, string ItemName)
            {
                switch (ItemName)
                {
                    case menuItemAbout:
                        MessageBox.Show("OCUP blok plug-in. Hello, EA user!");
                        break;
                    default:
                        MessageBox.Show("Neobsloužená položka menu!");
                        break;
                }
            }
    
    
    
    
        }
    }
  8. Teď vaše řešení přeložte, aby se vytvořila DLL knihovna. Poznámka: Na některých operačních systémech je třeba mít pro následnou registraci dostatečné oprávnění, Visual Studio je pak nutné spouštět jako správce. 

Záznam do registrů


Nyní máte sestavenou a zaregistrovanou knihovnu. Posledním krokem je říct EA, aby ji používal. K tomu stačí drobný zásah do registrů:
  1. Spusťte editor registrů regedit.
  2. Najděte větev HKEY_CURRENT_USER\Software\Sparx Systems\EAAddins.
  3. Přidejte do této větve nový klíč s názvem projektu ve Visual Studiu (v našem příkladu je to OCUPBlokPlugin).
  4. V registrech vznikne i výchozí hodnota pro tento klíč. Změňte ji dle formátu [název projektu].[název třídy], tedy opět v našem případě na OCUPBlokPlugin.MyFirstEAPlugin.
A je hotovo! Teď můžete svůj výtvor otestovat.

Enterprise Architect


  1. Otevřete si EA (pro náš pokus není nutné mít otevřený žádný projekt).
  2. V menu Extensions zvolte položku OCUP blok plug-in, která rozbalí a ukáže jednu položku About…:
  3. Pokud ji zvolíte, dostanete jednoduché hlášení: 

Jak vaše rozšíření distribuovat?


Pokud máte nějaký software na tvorbu instalačních souborů, tak máte vyhráno, zachovejte se podle jeho instrukcí. V opačném případě je třeba postupovat následovně:

  1. Zkopírujte si knihovnu (s případnými dalšími potřebnými soubory) na nové místo (na jiný počítač).
  2. Na novém místě je třeba zaregistrovat soubor do registrů. To se dělá pomocí aplikace regasm, kterou máte v adresáři %WINDIR%\Microsoft.NET\Framework\v4.0.30319\. Celá registrace pak probíhá tímto příkazem:

    %WINDIR%\Microsoft.NET\Framework\v4.0.30319\regasm OCUPBlokPlugin.dll /codebase
  3. Je třeba se zmínit Enterprise Architectovi o vašem pluginu. To, jak již víte, se dělá vytvořením klíče v registrech. Zde stačí export vašeho stávajícího klíče a pak distribuovat přímo .reg soubor.

Jak dál?


Teď už je to na vás. Podívejte se na uvedené metody začínající na EA_ a prostudujte si nápovědu, co vše lze tvořit. Možností je mnoho. Pro vaši potřebu si můžete stáhnout celé zdrojové kódy uvedeného příkladu zde.