Vítejte na blog.vyvojar.cz Přihlásit | Registrovat | Pomoc
Titulní Blogy Fotky Soubory

René Stein

Názory vzešlé z mesaliance humanitní skepse a technologického optimismu

  • !!!Změna adresy blogu!!!

    Poslední spot. Nová adresa blogu je http://blog.renestein.net., aktualizujte prosím své bookmarky.

  • Ještě jedna prezentace z přednášky o návrhových vzorech

    Jak mě upozornil jeden kolega, tak jsem nedal ke stažení prezentaci z přednášky o návrhových vzorech a .Net Frameworku z listopadového programátorského večera.

    Takže pro zájemce napravuji:

    V archivu ČVUT je i videozáznam přednášky, i když já sám jsem nenašel odvahu se na sebe narcisticko-kriticky podívat ;)

    Prezentace, velikost 675 KB

     

  • Prezentace a příklady z přednášky o C# 2.0

    Uvolnil jsem prezentaci a příklady ze včerejší přednášky o C# 2.0

    Stažení prezentace, velikost 313 KB

    Stažení příkladů (testovány na prosincovém CP buildu VS.NET), velikost 170 KB

    Protože při diskuzi zazněl zajímavý dotaz na téma dynamického vytváření uzavřeného konstruovaného generického typu pomocí reflection, přidal jsem další příklad, který ukazuje, že máme v C# (a v .Net Frameworku obecně) i za běhu aplikace k dispozici všechny informace o generickém typu, a proto můžeme provádět "kouzla", která jsou v C++ nebo v JAVĚ zapovězená a nedostupná.

    static void Main(string[] args)
            {
                //Získání generického typu
                Type poolType = typeof(ObjectPool<>);
                
                //Vytvoření generických argumentů (typ SomeResource substituující generický parametr T z třídy ObjectPool)
                Type[] genArguments = new Type[]{typeof(SomeResource)};
                //Dynamické vytvoření uzavřeného konstruovaného typu ObjectPool<SomeResource>
                Type constructedType = poolType.BindGenericParameters(genArguments);
                //Vytvoření instance typu ObjectPool<SomeResource>
                Object conType = Activator.CreateInstance(constructedType, new Object[]{10});
                
                Console.WriteLine(conType.ToString());
            }
  • Prezentace z .NET Developer Group o UML ke stažení

    Na čtvrteční přednášce o UML jsem do svého rezervoáru životních paradoxů přidal pár dalších :)

    1) I když sebekriticky zredukuju prezentaci o 150 slidech na 70, poté se intenzivní a zostřenou psychoanalytickou rychloseancí, na které by i těžkotonážní barokně rozsochatá lady Halina Pawlowská prodělala akutní záchvat mentální anorexie, jenž by byl excelentně konvertibilní na finační částku za nějakou další a zatraceně rychle natočenou reklamu na hubnutí s bonusem ve formě nezbytných JoJo baculatých efektů pro frustrované paničky, které jako ona chytře snídají dietní Colu s čokoládovými tyčinkami. :), vypořádám s pocity viny, jejichž zdrojem je obsedantní představa, že svatokrádežně zjednodušuju svá milovaná témata hodná nejvyšší úcty,  a přesto nenásleduje kýžená odměna, jíž měl suplovat fakt, že jsem ve vyhrazených 3 hodinách vykleštěné téma alespoň stihl probrat. ;)

    2) Je zvláštní přijít tak rozpolcený z přednášky na výsostné půdě Microsoftu, protože jsem navzdory svému obdivu vůči mnoha MS produktům musel po dotazech posluchačů doporučovat modelovací nástroje od jiných firem a dát najevo svoji vytříbenou nechuť k "vytváření návrhů" ve Visiu a také si opět otravně povzdychnout nad tím, že Visual Studio Team System, MSF a UML nejsou a nebudou nerozlučným triem - killerem konkurenčních nástrojů pro návrh a vývoj aplikací. ;)

    Zájemci si mohou stáhnout prezentaci, i když na návrhové vzory nezbyl ve čtvrtek čas a budou v rozšířené podobě tématem až nějaké další .Net Developer Group.

  • Programátorsko-analytická hádanka

    Máte třídu objednávky, která může nabývat 3 stavů (Nová, Schválená, Zamítnutá) . Dokážete určit, co všechno je v následujícím kódu špatně?

    public enum OrderState
        {
            New,
            Rejected,
            Approved
        }
        
        
        public class Order
        {
            protected OrderState m_state;
            public Order()
            {
                m_state = OrderState.New;
            }
            public virtual void Approve()
            {
                if (m_state != OrderState.New)
                {
                    throw new InvalidOperationException();
                }
                m_state = OrderState.Approved;
            }
            
            public virtual void Reject()
            {
                if (m_state != OrderState.New)
                {
                    throw new InvalidOperationException();
                }
                m_state = OrderState.Rejected;
            }
        }
        
        public class SpecialOrder : Order
        {
            public SpecialOrder() : base()
            {
                
            }
            
            public override void Approve()
            {
                
                throw new InvalidOperationException();
            }
            public override void Reject()
            {
                if ((m_state != OrderState.New) && (m_state != OrderState.Approved))
                {
                    throw new InvalidOperationException();
                }
                
                m_state = OrderState.Rejected;
            }
            
        }
        
  • Třída XmlSerializer - pár tipů

    Dnes se na Emwacu objevil dotaz ke třídě XmlSerializer. K neoblíbené a podezřelými chybovými hláškami prolezlé třídě XmlSerializer dodám ještě dva tipy pro neštastníky, kteří s ní stále vedou nerovný podpásový zápas.;)

    V aplikaci je vyvolána výjimka s informací "System.IO.FileNotFoundException: File or assembly name <nejaka blbina - jméno dynamické assembly>.dll, or one of i
    ts dependencies, was not found.
    " Tuto hlášku můžete dostat i ve webových službách, které interně XmlSerializer používají.

    Jaké jsou příčiny této chybové hlášky?

    1) XmlSerializer emituje za běhu dynamickou assembly pro rychlou serializaci typu předaného do jeho konstruktoru. Dynamická assembly se vytváří v pracovním adresáři (aktuálně požívaný TEMP adresář získáte voláním Path.GetTempPath) a k selhání dojde, protože účet, pod kterým běží aplikace, nemá práva na zápis a čtení z adresáře. Účtu aplikace stačí přidělit vyžadovaná práva na TEMP adresář a vše se zdá být v pořádku, alespoň k dalšímu neúspěšnému pokusu o spuštění aplikace.

    2) Výše zmíněnou výjimku totiž XmlSerializer používá jako univerzální informaci o takřka jakémkoli selhání. Jste-li si jisti, že práva na temp adresář nastavena máte, přidejte do konfiguračního souboru aplikace následující switch.

    <system.diagnostics>

       <switches>

         <add name="XmlSerialization.Compilation" value="1" />

       </switches>

    </system.diagnostics>

    V TEMP adresáři pak naleznete textový soubor <jméno generované assembly>.out, ve kterém jsou zalogovány chyby - tentokrát ty "pravé" bez ochranných mimikrů iritujícího XmlSerializeru :)

  • Pozvání na přednášky o návrhových vzorech a C# 2.0

    Po delší době úplného mediálního klidu na svém blogu bych Vás všechny rád pozval na dvě přednášky. Tedy alespoň vytrvalce, kteří jsou tak trpěliví nebo nepořádní, že při jarním úklidu svých počítačů nevymetli můj blog ze svých RSS čteček jako loňské zahnívající názorové smetí. ;)


    31.3.2005 od 18:00 mám přednášku pro .NET Developer Group s názvem "UML a návrhové vzory" a podtitulem "Od letmých doteků k nestřídmé zamilovanosti" ;)
    Podrobnosti o akci naleznete na hlavní stránce serveru Vyvojar.cz. Kvůli vymezenému času půjde samozřejmě jen o povrchní seznámení, ale na počátku nestřídmé zamilovanosti stojí většinou jen pár (ještě ;)) cudných pohledů na objekt zájmu.

    Původ a historie jazyka UML

    1. Základní konstitutivní prvky jazyka UML
    2. Požadavky na systém - případy užití
    3. Třídy a objekty - diagram tříd, diagram objektů
    4. Diagramy interakce (diagram spolupráce a sekvenční diagram)
    5. Diagram aktivit
    6. Stavové diagramy
    7. Diagram komponent a diagram nasazení
    8. Návrhové vzory – úvod
    9. Unit of Work
    10. Component configurator
    11. Special Case object
    12. Thread specific storage (PseudoSingleton)
    13. Interceptor
    14. Volná diskuze

    Na programátorském večeru ČVUT 11.4.2005 budu přednášet o C# 2.0. Přednášku jsem uvedl takto.

    V přednášce budou vysvětleny nové vlastnosti jazyka C# ve verzi 2.0, motivace pro zavedeni novych jazykovych konstrukci . Součástí přednášky budou také ukázky kodu, ktere demonstrují na typizovaných problémech i raritnich hřičkách sílu a eleganci C# 2.0 v praxi.

    Pro "zmrtvýchvstáni" všeho druhu jsou Velikonoce příhodný čas, takže přeji Vám všem, abyste plně sdíleli smysl tohoto nádherného symbolického zpřítomnění naddějinné události, která tak libozvučně zní jen v řečtině - "Christos Anesti". Je dobré vědět, že vše má smysl...

  • Vánoce 2004

    Přeji Vám všem prožití Vánočních svátků v radosti z Kristova narození a rychlé zhojení všech šrámů na těle i na duši, ať už těch, které jste možná utrpěli při zběsilém a a na poslední chvíli odkládaném nakupování dárků od frustrovaných obchodníků, nebo jakýchkoli jiných naakumulovaných za celý rok. ;)

     

  • Další listopadové úterý s programátorskou hádankou

    Dokážete (opět bez spuštění programu ;) ) určit, co vypíše tento program, a zdůvodnit jeho chování?

    using System;
    namespace RSTein.Blog
    {
        struct NumberStruct
        {
            public int Number;
        }
        
        
        public class Test 
        {
            private  static Object Add(Object obj) 
            {
            
                if (obj is NumberStruct)
                {
                    NumberStruct numb = (NumberStruct) obj;
                    numb.Number += 1;
                    return numb;
                    
                }
                
                return obj;
            
            }
            public static void Main()
            {
                NumberStruct numberStruct = new NumberStruct();
                numberStruct.Number = 10;
                
                Object retNumberStructObject = Add(numberStruct);
                object originalStructObject =  numberStruct;
                
                Console.WriteLine(numberStruct.Number);
                Console.WriteLine(((NumberStruct)retNumberStructObject).Number);
                Console.WriteLine((originalStructObject == retNumberStructObject));
                Console.Read();
            }
        }
    
    }
    
  • První termín kurzu o OOP a UML za mnou, co chystám dál?

    V pátek bylo prvním účastníkům kurzu o návrhu aplikaci předáno osvědčení o jeho úspěšném absolvování ;)

    Všem, kdo se zúčastnili prvního běhu, a byli tak chtě nechtě laboratorními zvířátky;), na nichž jsem si ověřoval , jaká témata musím zdůraznit a jaká naopak mohu jen letmo ve vyhrazeném čase zmínit, děkuji za věcné připomínky a náměty, které budou mít vliv na podobu kurzu v dalších termínech. Nejbližší další temín kurzu je 15.12-17.12 2004 a je, stejně jako následující jarní termín, plně obsazen.

    Aby spot nebyl jen ozvěnou toho, co bylo nebo v dalších variacích bude, zde je předběžný a neúplný seznam věcí, které bych chtěl do konce tohoto roku a během příštího roku stihnout a které záležejí jen na mně.

    22.11.2004 - přednáška Návrhové vzory nejen pro komerční aplikace a jejich implementace v .Net Frameworku na programátorských večerech ČVUT. Přednáška se soustředí na srovnání návrhových vzorů na odlišné úrovni abstrakce, bude se zabývat rozdíly mezi tradičními GoF vzory, vzory kodifikovanými Martinem Fowlerem, vzory pro integrační scénáře a způsobem implementace vzorů v .NET Frameworku.

    Během příštího roku bych rád vydal knihu (nevím zatím, zda jen v podobě e-booku nebo v nějakém kamenném nakladatelství) o návrhových vzorech a aplikačních frameworcích, kde bych uvedl i některé své vlastní vzory a idiomy, které při návrhu aplikací používám. (největším lákadlem by měla být plně generická Identity Map).

    V první polovině příštího roku chci spustit již dříve avizovanou vlastní doménu.

    Ve druhé polovině roku by se mělo objevit pokračování kurzu o OOP a UML, které by u každého účastníka předpokládalo znalosti v rozsahu právě probíhajícího kurzu, takže bez jakýchkoli zdržování a srovnávání znalostí bychom se všemi účastníky ihned přikročili k návrhu informačního systému od analýzy přes systémový design a skončili bychom vytvořením tří různých klientů ve VS.NET 2005 (Windows Forms, ASP.NET, compact .NET Framework).

  • Další úterý s programátorskou hádankou

    Máte tento kód:
    using System;
    namespace Blog.Test
    {
        /// <summary>
        /// Summary description for Class1.
        /// </summary>
        class DelegateTest
        {
            public delegate int CallOperation (int x, int y);
            /// <summary>
            /// The main entry point for the application.
            /// </summary>
            [STAThread]
            static void Main(string[] args)
            {
                CallOperation operation = new CallOperation(Add);
                operation += new CallOperation(Substract);
                int result = operation( 2, 2);
                Console.WriteLine(result);
                Console.Read();
            }
    
            public static int Add(int x, int y)
            {
                return (x + y);
            }
            public static int Substract(int x, int y)
            {
                return (x - y);
            }
        }
    }
    

    Otázka 1) Dokážete bez spuštění programu říct, jaký výsledek bude v proměnné result a proč?

    Otázka 2) Umíte přepsat tento kód tak, abyste dostali návratové hodnoty z obou metod, na něž ukazuje kompozitní delegát?

  • Návrat brécy do České spořitelny

    Při hledání různých způsobů financování auta jsme si s ženou řekli, že se obrátíme i na Českou spořitelnu, u které máme běžný účet a dvě stavební spoření. Služeb České spořitelny jsem měl před několika lety plné zuby, hlavně kvůli neochotnému a neinformovanému personálu, jehož kvalifikace by stačila snad na pomocnou uklízečku s trvalým dohledem nadřízeného, ale určitě ne na poskytování finančních služeb klientům. Kvůli své liknavosti jsem se ale ke zrušení účtu nedostal. Po vstupu Erste Bank do ČS jsem přestal mít ke zrušení účtu i důvod - většina poboček na malých městech byla zrušena a na větších pobočkách se objevili zaměstnanci, se kterými bylo možné bez problémů zřídit GSM bankovnictví, Internetové bankovnictví, mezinárodní platební kartu s pojištěním a další záležitosti. Konečně jsem si začal připadat jako klient banky a ne jako trpěný hmyz na pravidelné návštěvě útulku senilních lichvářů.

    Dnešek nás ale přesvědčil, že staří zaměstnanci ze zrušených poboček si své vyhřáté místečko i v Erste Bank našli.

    1. I když jsme si na internetu našli, že v Benešově je kontaktní místo ČS leasingu, pracovníci banky o něm nejdříve v životě neslyšeli a po chvíli našeho přesvědčování jedna pracovnice pravila "že to má na starosti asi kolega, ale ten má zrovna dovolenou, takže nic nebude".
    2. Po dotazu na poskytnutí účelového úvěru nám bylo sděleno, že se pletem a že nám poskytnou jen spotřebitelský (=mnohem nevýhodnější) úvěr - navíc musíme prý mít alespoň 2 ručitele, i když se ta osoba ani neobtěžovala vůbec podívat na pravidelný zůstatek na účtu a ani ji nezajímal náš příjem. Žádná detailní kalkulace také nebyla provedena, protože světe div se, zrovna před naším příchodem "vyhořel systém". Mám pocit, že systém mohl "vyhořet" jedině proto, že se některé zaměstnankyni v hlavě samovolně vznítila přeschlá sláma.

    Jednání třeba s ČSOB bylo na zcela jiné úrovni bez ohledu na to, že nejsme jejími klienty. Takže s ČS asi končím - nevidím žádnou výhodu v tom být stálým klientem, jehož požadavky řeší stále stejně neschopné vysloužilé obstarožní brécy, které umí jen tklivě a do zblbnutí opakovat "nevím, nefunguje, asi ne", aby už konečně ten dokonale otrávený klient vypad' a voni mohly v klidu dopít kafíčko a dokecat neskutečně důležité ptákoviny "s holkama z vedlejší kanceláře".

  • Webové služby obohacené o SoapExtensionReflector

    Když jsem psal článek o http modulech pro Interval s příkladem http modulu pro dynamické přidání dokumentace k operacím webových služeb, stále jsem trpěl obsedantní představou, že by mělo existovat lepší API pro práci s generovaným WSDL webové služby.

    Představa lepšího API mě znovu přepadla při přípravě staršího spotu o http modulu pro změnu URL adresy webové služby.

    A nepletl jsem se. Pro tyto účely je zde třída SoapExtensionReflector, i když její význam Microsoft cudně v MSDN skrývá pod nepřátelskou větu "The SoapExtensionReflector type supports the .NET Framework infrastructure and is not intended to be used directly from your code", která má ale na mě přesně opačný účinek, protože vyburcuje moji zvědavost lačně ohledávající vnitřnosti .Net Frameworku.;)

    V potomku abstraktní třídy SoapExtensionReflector je nutné přepsat metodu ReflectMethod. Metoda ReflectMethod je volána pro každou metodu webové služby. Podstatné informace o právě zpracovávané webové metodě jsou uloženy v v zděděné vlastnosti ReflectionContext.

    Příklad přidání dokumentace k webové službě v potomku třídy SoapExtensionReflector. Stejně jako v článku na Intervalu platí, že dokumentace k metodě musí být uložena v sekci appSettings, v elementu add, a že název klíče (key) musí být shodný s názvem metody, k němuž je přidán suffix Method, a text dokumentace tvoří hodnota atributu value.

    using System;
    using System.Collections;
    using System.Configuration;
    using System.Web.Services.Description;
    namespace AddDocExtension
    {
        /// <summary>
        /// Zkušební SoapExtensionReflector pro přidání dokumentace k webové metodě
        /// </summary>
        public class ImportDocExtension : SoapExtensionReflector
        {
            #region Private constants
            private const string METHOD_KEY_SUFFIX = "Method";
            #endregion Private constants
            #region Private static fields
            private static Hashtable m_operationsDoc;
            #endregion Private fields
            
            #region Constructors
            /// <summary>
            /// Statický konstruktor
            /// </summary>
            static ImportDocExtension()
            {
                readConfig();
            }
            
            /// <summary>
            /// Konstruktor
            /// </summary>
            public ImportDocExtension() : base()
            {
            }
            #endregion Constructors
            #region Public methods
            /// <summary>
            /// Přidání dokumentace ke každé operaci
            /// </summary>
            public override void ReflectMethod()
            {
                string opName = ReflectionContext.Operation.Name;
                if (m_operationsDoc.ContainsKey(opName))
                {
                    ReflectionContext.Operation.Documentation = (string) m_operationsDoc[opName];
                }
            }
            #endregion Public methods
            #region Private static methods
            /// <summary>
            /// Načtení dokumentace k metodám z konfiguračního souboru
            /// </summary>
            private static void readConfig()
            {
                 m_operationsDoc = new Hashtable();
                
                string[]keys = ConfigurationSettings.AppSettings.AllKeys;
                
                foreach (string key in keys)
                {
                    if (key.EndsWith(METHOD_KEY_SUFFIX))
                    {
                        string hashKey = key.Substring(0, key.LastIndexOf(METHOD_KEY_SUFFIX));
                        string hashValue = ConfigurationSettings.AppSettings[key];
                        m_operationsDoc.Add(hashKey, hashValue);
                    }
                }
            }
            #endregion Private static methods
        }
    }
    

    SoapExtensionReflector musí být zaregistrován v konfiguračním souboru webové služby v sekci webServices.

    <webServices>

      <soapExtensionReflectorTypes>

        <add type="AddDocExtension.ImportDocExtension,AddDocExtension" />

      </soapExtensionReflectorTypes>

    </webServices>

  • Jedna melancholická hádanka o šampaňské (programátorských už máte dost, ne? :) )

    Abych opět rozkymácel monotónní rovnováhu technickými spoty přesyceného blogu, zde je ukázka jedné básně z díla mého oblíbence. Mým oblíbencem je možná proto, že jsem se s ním seznámil v době "kdy je člověk bloud, když je mu 16 let a lípy zaplaví svou vůni promenádu. A člověk je poblouzněn a cítí polibek, jak malé zvířátko, jež leze v hlavě." (Rimbaud) a že jeho inspirací jsou hlavně ženy v různých svůdných podobách a rozkošných maskách s espritem, které se nijak nepodobají asexuálním a domněle emancipovaným feministickým monstrům s bicepsy, jejichž názory jsou v harmonickém a nepřetržitém souladu s nikdy nezpochybňovaným orákulem matrón v posledním čísle časopisu Elle.;)

    A aby to bylo zajímavější, tak kdo první uhádne jméno básníka, má u mě flašku šampaňského.;)

    Když obemknu tvá zápěstí
    tak útlá,
    že kvítí závidí jim -
    proč cítím
    na liduprázdném náměstí
    srdce tvého
    nezapomenutelný útlak
    navždy zapomenutého?

    Nezasel jsem, co sklidím.
    Nesklidím, co jsem zasel.
    Budu však vonět jitřním kvítím.
    Posté. A znova. A zase.

    A krveprolitím.

  • MobSync - skvělý doplněk ActiveSyncu

    Jestliže potřebujete stejně jako já synchronizovat obsah různých adresářů mezi PDA a počítačem, tak určitě používáte nějaké vlastní utilitky, protože ActiveSync je omezen na jeden pevně určený výchozí adresář. Dají se sice upravit registry a přesvědčit tím ActiveSync, že má soubory hledat jinde, ale podpory více složek stejně nijak nedosáhnete.

    MobSync je prográmek, který tuto nedokonalost řeší. Stáhnout si jej můžete z jeho domovské stránky, pouze se nelekněte japonských znaků.:)

    Uživatelské rozhraní MobSyncu zdařile imituje styl spráce s ActiveSyncem, takže ovládání je pro každého intuitivní.

    Aby došlo k synchronizaci adresářů, musíte vytvořit tzv. joby, kterých může být libovolný počet. Při zakládání nového jobu zadáte jen jeho název, cestu ke složce na PC, cestu ke složce na PDA a vyberete si typ synchronizace (obosusměrná, jednosměrná -PDA, jednosměrná -PC). Dále můžete určit masky souborů, které nemají být do synchronizace zahrnuty a zvolíte, zda si přejete synchronizovat soubory automaticky při každém spojení s PDA, nebo manuálně po požadavku uživatele.

    MobSync je stabilní a kvalitní software i v aktuální verzi 0.9 a doporučuji jej každému majiteli PDA alespoň vyzkoušet.

Více článků Další stránka »
Powered by Community Server (Personal Edition), by Telligent Systems
Vyvojar.cz na prodej!