\


 Tuesday, November 9, 2004
Další listopadové úterý s programátorskou hádankou

Hádanka 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();
        }
    }

}


Tuesday, November 9, 2004 9:16:00 AM (Central Europe Standard Time, UTC+01:00)       
Comments [7]  Programátorské hádanky


 Sunday, November 7, 2004
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).



Sunday, November 7, 2004 11:27:00 AM (Central Europe Standard Time, UTC+01:00)       
Comments [2]  Kurzy UML a OOP | Ostatní | UML


 Tuesday, October 26, 2004
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?



Tuesday, October 26, 2004 6:50:00 PM (Central Europe Standard Time, UTC+01:00)       
Comments [8]  Programátorské hádanky


 Monday, October 25, 2004
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".



Monday, October 25, 2004 8:08:00 PM (Central Europe Standard Time, UTC+01:00)       
Comments [16]  Ostatní


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>



Monday, October 25, 2004 7:04:00 PM (Central Europe Standard Time, UTC+01:00)       
Comments [1]  Web Services


 Thursday, October 21, 2004
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.



Thursday, October 21, 2004 8:28:00 PM (Central Europe Standard Time, UTC+01:00)       
Comments [16]  Literární a jiné humanitní úlety


 Wednesday, October 20, 2004
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.



Wednesday, October 20, 2004 8:29:00 PM (Central Europe Standard Time, UTC+01:00)       
Comments [0]  Mobilitky


 Tuesday, October 19, 2004
Programátorská hádanka na nudné úterý

Dokážete najít dva ekvivalentní zápisy zámku (lock) v metodě AtomicOperation?

    class  AtomicTest
    {
        private int x = 0;
        private int y = 0;
        public void AtomicOperation(int arg)
        {
            lock(this)
            {
                x += arg;
                y += arg;
            }
        }
    }


Tuesday, October 19, 2004 5:27:00 PM (Central Europe Standard Time, UTC+01:00)       
Comments [16]  Programátorské hádanky


 Monday, October 18, 2004
Česká .Net komunita, zásluhy jejích hodnostářů a rozdělování medailí :)

Roman Pichlík svým nevinným povzdechnutím nad JAVA komunitou a srovnáním podpory Microsoftu a SUNu spustil diskuzi nad .Net komunitou, přidal se i Slavo, a celé to vyústilo v půvabné hledání nejzasloužilejšího iniciátora a šikovatele .Net komunity. Asi se budou udělovat medaile nebo jiné lukrativní benefity, protože jinak by se tomu určitě všichni zainteresovaní nevěnovali s takovým zaujetím. Mám pro všechny dobrou zprávu, protože znám jasného vítěze - medaile budou muset být expresně poslány vývojovému týmu Microsoftu odpovědnému za .Net Framework, protože by jinak MS komunita postrádala předmět, kolem kterého se nyní tak ráda "seskupuje", a s tichou závistí by jen mohla pozorovat, jak jim ze stále vzdálenějších a lepších SW zítřků spokojeně kynou JAVA programátoři, kteří jsou šťastní, že jejich technologie nemá žádnou konkurenci a prosazuje se navzdory vlastnímu pomalému technologickému vyspívání, liknavosti a neskutečné marketingové neschopnosti SUNu.;) .

Původně jsem na spot o .NET komunitě ani nechtěl reagovat, ale při přečtení si svého jména ve spotu Michala, se s ohlušující intenzitou rozezněly moje interní kontrolní mechanismy citlivé na každý kolektivní patos a identifikaci s nějakou skupinou.

Necítím se být exponentem žádné skupiny a dá snad Bůh, že jím nikdy nebudu. V tomto konkrétním případě hlavně nevím, co si mám pod .NET komunitou představit. Čechy jsou tak malé, že mi označení komunita nepřijde moc přiléhavé, protože na konferencích, blogu nebo v diskuzích pod články potkávám většinou stále stejnou skupinku lidí a i když vím, že pasivně se účastní všech aktivit (zní vám to také tak protismyslně?) mnohem více lidí, zdráhal bych se na ně alespoň prozatím použít slovo komunita. Pro mě jde o skupinku lidí se zájmem, ať už profesionálním (většinou) nebo nadšeneckým o .Net, ale těžko z toho vyvozovat, že jde o lidi, kteří by k sobě měli blízko, sdíleli názory, protože tohle vše mi evokuje pojem komunita a myslím, že zakládat lidské vztahy na něčem tak banálním jako je technologie snad ani nemá cenu. Řekněme, že spíše než komunitu připomínáme zájmový spolek jako jsou filatelisté nebo spolek přátel žehu:)

V čem bych viděl opravdový smysl takového spolku? Ve vytvoření takové atmosféry, kdy by si blog nebo jinou vlastní tribunu založili další zajímaví, ale zatím skoro neviditelní lidé (zvykem je nejmenovat, ale snad se nebudou zlobit - namátkou Zbyšek Hlinka, Petr Zahradník, Milan Múčka).

Ještě k tomu rozporu na Michalově blogu. Pro mě je zřejmé, že Javistům chybí nějaký nový "Michal Bláha", který by tvrdohlavě šel za svým cílem a nezištně by nabídl hostování blogu a dalších aktivit všem, kteří projeví zájem. Od minulého roku (a možná i dříve) je patrný silný zájem českého Microsoftu na zlepšení přímé komunikace s vývojáři a díky lidem jako je Honza Šeda (teď mě napadá, proč ty Honzo nemáš ještě blog? ;)), Michael Juřek, Jirka Burian a mnoho dalších se to opravdu daří. Já samozřejmě nevím, jestli třeba Michael Juřek nebo Petr Lazecký blogují proto, že Microsoft ústy Billa Gatese začal považovat blogy za účinný nástroj zakořeňování povědomí o svých produktech, nebo jde čistě o jejich soukromou iniciativu, ať tak či onak, tyto motivace jsou mi zcela volné - důležité je, že tyto blogy existují a že si na nich každý může vybrat články podle svého naturelu. Takže v činnosti Michala Bláhy a v působení Microsoftu je znát stejný zájem - poskytnout prostor vývojářům a hledat, kdo učinil víc, je asi nesmyslné a neplodné. Oba póĺy jsou komplementární a podmiňují se navzájem - nadšení jednotlivců v Microsoftu a mimo Microsoft i finanční, marketingová a manažerská záštita Microsoftu.

Líbí se mi, že tuhle diskuzi otevřel spot Romana Pichlíka - kovaného Javisty.;) Od prvního spotu svého blogu jsem byl proti budování ghet a ohrádek malých omezených prasátek-vyznavačů jediné správné technologie. Už jsem naznačoval výše, že nemám rád žádné kolektivní akce, proklamace a závazky. Myslel jsem tím také to, že občas se u některých lidí vynoří pochybnosti, zda se může MVP vůbec snažit psát objektivně a jestli již není tak svázán s Microsoftem, že mu jeho mozek před každý názor nejdříve vygeneruje stylové logo Windows, které působí jako autokastrační filtr nepatřičných myšlenek. Mám k MVP ocenění asi trochu jiný vztah než třeba Slavo. Slavo několikrát psal (promiň Slavo, jestli to nebude úplně přesné, ale přesný citát jsem na tvém blogu nedohledal), že chce působit v konferencích, protože chce být "valuable" a dostát tak titulu. Můj názor je, že MVP titul je udělován za činnost v předchozím roce a svého nositele k ničemu nezavazuje - pro mě je tento pocit důležitý, protože nezávislosti v konání, chtění a sebeprezentování, a to i tehdy když by mělo jít jen o iluzi nezávislosti ;), se nikdy nevzdám, protože jen těžko bych mohl žít s pocitem, že se ode mě něco vyžaduje a že nemám na výběr. Když mě přestane bavit psaní do konferencí nebo psaní do blogu, nebudu se nikoho ptát, co smím nebo nesmím, a proto ani nikdy nechci být s žádnou skupinou nerozlučně spojován jako její ikona. Jsem závislý jen na svých individuálních rozmarech, (pravda, teď i na rozmarech své dcerky:) ), a ne na rozmarech žádné, byť sebelepší komunity. A doufám, že je tomu tak u každého z vás. :)

P.S: Případné a v poslední době oblíbené tipy na velikost mého ega od vyznavačů anonymního bezbřehého kolektivismu jsou vítány.:)

UPDATE: Aby nedošlo k dezinterpretaci spotu. V poslední části jsem chtěl říct, že bez ohledu na různé postoje ke komunitě, jsou všichni MVP ve svých názorech na Microsoft ponecháni napospas jen sami sobě.



Monday, October 18, 2004 8:39:00 PM (Central Europe Standard Time, UTC+01:00)       
Comments [16]  Ostatní


 Sunday, October 17, 2004
Dotazy a odpovědi k .NET Remotingu

Tento spot přímo navazuje na starší spot o nejčastějších problémech v .NET Remotingu.

Dotazy v konferencích se často týkají událostí. Důvodem je hlavně to, že mnoho knih (namátkou třeba Building XML Web Services for Microsoft .Net platform) obsahuje “postup” pro rozchození události, který nefunguje. V čem je problém?

Když ve vzdáleném serverovém objektu nadeklarujete událost a pokusíte se k ní zaregistrovat delegáta ukazujícího na metodu na klientovi, dostanete při běhu aplikace výjimku, že se nepodařilo nahrát assembly s typem, ve kterém se nachází klientská obslužná metoda události. Server odmítne registraci delegáta u události, protože nedokáže ověřit signaturu metodu, na níž odkazuje delegát - server nemůže nalézt assembly s typem, ve kterém je deklarována metoda, protože assembly je známa a rozmístěna jen na klientovi.

Správný postup při deklaraci a používání událostí v .NET Remotingu

  1. Vytvořte jednu assembly se serverovým objektem a nadeklarujte serverové události. Assembly umístěte pouze na serveru.
  2. Vytvořte assembly, v níž bude sdílená třída s obslužnou metodou serverové události a dále bude třída obsahovat událost vlastní, která bude stejného typu jako serverová. V těle obslužné metody serverové události pouze vyvolejte událost vlastní - lokální a přepošlete argumenty obdržené ze serveru. Assembly umístěte na server i na klienta, protože klient si zaregistruje obslužnou metodu sdíleného typu k serverové události (v té chvíli již server dokáže ověřit signaturu metodu a nahrát typ, ve kterém je metoda deklarována) a současně si klient přihlásí odběr lokální události ze sdíleného typu a takto zprostředkovaně zpracuje událost ze serveru.
  3. Vytvořte klientskou assembly. Assembly umístěte pouze na klienta.

Dalším problémem u vzdálených událostí je korektní ošetření stavu, kdy se klient odpojí a na serveru zůstane zaregistrován delegát (například spadne spojení). Aby nedošlo k výjimce na serveru při pokusu distribuovat událost, tak jako nejjednodušší cesta se nabízí dekorování obslužné metody na klientovi atributem OneWay - atribut způsobí, že server ignoruje všechny návratové hodnoty a výjimky z metody. Velkou nevýhodou je ale hromadění delegátů ukazujících do "prázdna" a tím zvýšená režie na distribuci každé události. Lepším řešením je ruční vyvolání každého delegáta registrovaného k události a po odchycení výjimky vyřazení delegáta z další distribuce událostí.

public void OnServerEvent(EventArgs e)
{
    Delegate[] delegatesList = ServerEvent.GetInvocationList();
    foreach(ServerEventHandler clientDelegate in delegatesList)
    {
        try
        {
            clientDelegate(e);
        }
        catch
        {
            ServerEvent -= clientDelegate;
        }
    }
}



Sunday, October 17, 2004 5:33:00 PM (Central Europe Standard Time, UTC+01:00)       
Comments [8]  .Net Remoting