\

Školení Návrhové vzory, OOP a UML


 Thursday, 30 September 2004
Deset mých oblíbených aplikací na PDA

Na mém MDA II jsem si oblíbil hlavně tyto programy. Výčet není ani zdaleka úplný, protože aplikací používám mnohem víc, ale snad někomu z vás přijdou tyto tipy na zajímavé programy vhod.

  1. Total Commander CE - Pocket PC verze souborového manažera je stejně podařená jako její starší desktopový bratranec.
  2. ftxPBrowser - nadstavba nad internetovým prohlížečem Pocket IE s podporou záložek pro zobrazení více WWW stránek najednou (tabů). Více jsem o něm psal zde. Uvažuji ale, že si koupím profesionální prohlížeč NetFront, který mi kromě jiných vymožeností umožní mobilně přístupovat do internetového bankovnictví ČS.
  3. vxUtil - nepostradatelná utilitka pro síťová testování (Ping, TraceRoute, DNS Audit, Port scanner...)
  4. RepliGo - v desktopové verzi programu zkonvertujete například PDF, DOC, XLS, HTML dokumenty do formátu vhodného pro čtení v RepliGo čtečce na Pocket PC. RepliGo umí zobrazit dokumenty na šířku, využije pro zobrazení textu celou plochu displeje, pamatuje si stranku, kterou jsme v dokumentu naposledy prohlíželi a má další vychytávky, které z něj dělají kvalitní čtečku souborů na PDA.
  5. SharpVault - jednoduchý, ale praktický program na uchovávání přístupových kódů a dalších tajných informací pod jednim heslem.
  6. ICQ - K této aplikací asi není potřeba nic dodávat. PDA verze nejoblíbenějšího klienta pro instant messaging
  7. Spb Pocket Plus - sada užitečných drobností od mé oblíbené firmy Spb Software House. Jednoduchý, ale i na MDA II bezproblémový správce úloh, nevtíravý a přítom stále viditelný indikator stavu baterie v horní části displeje, rozšíření Pocket IE o podporu zobrazení více WWW stránek a hlavně skvělý Plug-In do Today obrazovky složený ze záložek, které můžete přidávat, přejmenovávat a především na ně umisťujete zástupce programů a zajímavé indikátory (stav baterie, velikost obsazené/volné paměti). Příslovečnou šlehačkou na dortu je plná podpora drag&drop přemisťování zástupců.
  8. Acrobat Reader - nepostradatelný program pro otevírání PDF souborů, které vám přišly třeba emailem, takže jste je nemohli na desktopu zkonvertovat do nativního formátu RepliGo.
  9. BetaPlayer - náhrada za dodávaný Windows Media Player, která zvládne i plynulé přehrávání filmů, na kterých se Windows Media Player trhá.
  10. Qusnetsoft NewsReader - plnohodnotný klient pro čtení zpráv z news (NNTP) serverů.


Thursday, 30 September 2004 20:58:00 (Central Europe Standard Time, UTC+01:00)       
Comments [6]  Mobilitky


 Monday, 27 September 2004
Dodatek k informacím o školení v OOP a UML

Protože se na školení o OOP a UML přihlásilo tolik účastníků, že máme nyní zcela zaplněny 3 kurzy a další zájemci se stále ozývají, chci upřesnit, jak to s kurzy já a školící středisko DIGI TRADE plánujeme:

  1. První kurz proběhne v dříve avizovaném termínu 3.11-5.11 2004 a s jeho účastníky by již měly být vyřízeny všechny formality.
  2. Druhý kurz se pravděpodobně uskuteční 15.12-17.12 2004 a všichni zájemci budou naším školícím střediskem s dostatečným předstihem informováni.
  3. Třetí kurz bude uspořádán na jaře 2005 a přesné termíny zveřejním opět na blogu.
  4. Zvláštním případem jsou firmy, které projevily zájem o in-house školení nebo si chtěly zarezervovat jeden či více termínů jen pro sebe. To není možné, protože nechceme ani nebudeme ulehčovat přežití na SW trhu naší přímé konkurenci. ;) Nijak ale neomezujeme počet účastníků z jedné firmy přihlášených na školení. Tohle je oficiální stanovisko společnosti DIGI TRADE, které se nezmění.

A hlavně díky všem přihlášeným za enormní zájem ;)



Monday, 27 September 2004 20:03:00 (Central Europe Standard Time, UTC+01:00)       
Comments [9]  Kurzy UML a OOP | UML


Mílé Živě, už nás neuč programovat ani zvracet

Milé nepoučitelné Živě,
protože nás stále oblažuješ seriálem o programování ve VB.Net, jehož autorem je pravděpodobně retardovaný jedinec rozšafně rozjímající nad pravidly strukturálního programování platnými snad někdy před 20 lety, a přitom nadpis seriálu nás ubezpečuje, že se týká VB.NET, který je, což pro tebe milé Živě bude asi nečekaným překvapením, jazykem plně objektovým, dovol mi se Tě zeptat, kdo prováděl korektury posledního dílu, ve kterém je takové množství nepřesnosti a chyb. Jeho plat za tento měsíc bych být Tebou věnoval nadaci pro šíření a zakořeňování vývojářských bludů a omylů.
Dovol mi alespoň zmínit některé nesmysly, které jsem nestrávil ani po třech rychle vypitých panácích Four Roses na obnovení své rozkymácené duševní rovnováhy.

Myslíš si opravdu laškující Živě, že se začátečník musí při výkladu konstrukce If Then Else dozvědět, jaké jsou hodnoty konstant true a false, aby byl vzápětí ubezpečen, že jejich použití se nedoporučuje?

Objasní mi tvůj odborný korektor smysl této kryptické věty.

"Praktická zasada je obykle taková, že konstrukce pro ošetřování chyb by měla zahrnovat co nejmenší počet příkazů, mají-li být vyjímky zpracovány co možná konkrétně a adresně v duchu pravidla "jedna chyba na jeden blok Try - Catch". Ladění kódu v bloku Try - Catch, ve kterém dochází k několika chybám současně může být velice nepohodlné a nepřehledné."

Chce tím snad autor říci, že konstrukce Try-Catch by měla obsahovat jen jednu sekci catch? Jestliže ano, pak bych rád věděl, odkud drahé Živě nabíráš pro své seriály tyto duševní trosky,  které si o programování četly naposledy v kroužku Mladých techniků otevřeném na škole pro mentálně opožděné vývojáře.

Snad byste v redakci mohli autora nějak šetrně a citlivě upozornit, aby se nerozzuřil, že již v .NET nežijeme ve světě ASCII znaků, ale že máme Unicode a doporučit mu, aby alespoň občas po očku nahlédl do MSDN a do specifikace jazyka, který vysvětluje, takže se příště zdrží všech žvástů o ASCII, řetězcích a relačních operátorech ve VB.NET.

Srovnejte seriál a dokumentaci k VB.NET.

"String. The operators return the result of comparing the two values using either a binary comparison or a text comparison. The comparison used is determined by the compilation environment and the Option Compare statement. A binary comparison determines if the numeric Unicode value of the characters, or each character in each string, is the same. A text comparison does a Unicode text comparison based on the current culture in use on the .NET Framework. When doing a string comparison, a null reference is equivalent to the string literal "". "

Občas slyším Živě, že jsi bulvárem. Nevím přesně, co znamená v IT světě bulvár a myslím, že je toto hodnocení často nepatřičné, zjednodušující a k Tobě nespravedlivé. Přesto se k této metafoře vrátím - bulvár (boulevard) se obrací alespoň na širokou, rozjívenou a frackovitou ulici, ale tímto seriálem se Živě podbízíš publiku, které neexistuje nebo bere seriál jako recesi, jíž jste se pobavili v redakci o Silvestru a potom jste ji zapomněli vyřadit z redakčního systému. Za výchovu další generace vývojářských neumětelů Ti nikdo Živě nepoděkuje. Proto Tě Žive prosím, ve svém zájmu a pro zachování svého již notně pošramoceného dobrého jména seriál ukonči a najdi si jiného autora, který nebude experimentovat s trpělivostí tvých čtenářů.



Monday, 27 September 2004 19:28:00 (Central Europe Standard Time, UTC+01:00)       
Comments [7]  Ostatní


Film Umučení Krista respektuje i transcenduje své téma

Ke shlédnutí filmu Umučení Krista jsem se dlouho odhodlával. Lákalo mě, že dle ohlasů si Mel Gibson dovolil překročit hranici, před kterou je ve filmovém ale i výtvarném umění násilí v Bibli estetizováno, upozaďováno a shrnováno pod banálně znějící větu "Kristus za nás trpěl a zemřel na kříži". Obával jsem se ale toho, že hollywoodský spektákl určený nejširšímu publiku neodolá pokušení vytlačit z filmu smysl Kristovy oběti a lascivně deskriptivním způsobem rekonstruuje jen fyzický aspekt Kristova utrpení.

Nestalo se tak. Ve filmu jsou emotivní a drastické scény utrpení Krista, kamera se někdy s okázalým zájmem vyžívá v zobrazení krutosti, ale hlavním motivem filmu zůstává pokoření Boha v lidských rukou, a krutost je vyvažována retrospektivními návraty k Ježíšovu působení před zatčením. Snad jediné, co by se dalo vytknout výběru scén milosti, které kontrastují s běsněním davu, je jejich prvoplánovitost usnadňující pochopení i člověku, který nezná Bibli. Počátek Křížové cesty lemovaný nadávajícím anonymním davem je stavěn do protikladu s dřívějším triumfálním přivítání Ježíše davem při vjezdu do Jeruzaléma. Smysl biblických metafor "cesta a příchod" ale nemůže vyčerpat tento doslovný výklad, protože Ježíš sám mluví o sobě jako o cestě a jeho příchod je chápán jako završení prefigurací ve Starém Zákoně.

Kontrast nejen mezi utrpenim a milostí je leitmotivem celého filmu. Barokní kontrast mezi světlem a tmou inspirovaný obrazy Caravaggia, kontrast mezi spokojeným a intrikujícím církevním establishmentem zosobněným farizeji a rodícím se společenstvím apoštolů, kteří se stanou "úhelnými kameny" Nového společenství křesťanů.

Vytknout by se mohlo filmu schématické zobrazení postav. Ale Bible sama podřizuje vykreslování postav i děj smyslu, který se jako všudypřítomná řeka spásy line pod nimi. Mně přijde film Umučení Krista jako zdařilé spojení dvou větví evropského vyprávění - mimetické, dějové a "realistické" zobrazování událostí ve filmu je smíšeno s s digresivními pasážemi, které mohou někomu připadat jako sadistické vyžívání se v utrpení, ale mně přišlo, že jejich záměrem bylo dostat dementními filmy otupělého diváka do stavu, kdy se stane účastníkem přímého přenosu popravy na Golgotě, která není báchorkou z dávných časů, ale i pro dnešní dobu přítomnou a věčnou obětí Krista.

Ano, film má i svá slabší místa. Je jím vymyšlené a nijak logikou tématu nezdůvodněné vyklovnutí oka jednomu lotrovi na kříži a procházení Satana mezi davem, což mi příliš připomínalo podobnou scénu ve Statečném srdci, nebo malý prostor, který byl ve filmu poskytnut tragédii Jidáše. Nadchlo mě ale, že se ve filmu mluví aramejsky.

Existují lepší zpracování Kristova utrpeni. Pro mě je jím hlavně Kazantzakisovo Posledni utrpení (kniha, film jsem neviděl), v němž je Kristus pokoušeným a osamělým člověkem, jehož utrpení na kříži je hlavně psychického rázu a který své Božství v rozporu s tradicí stvrzuje až závěrečným výkřikem "Bože můj, proč jsi mě opustil".

To ale nemění nic na tom, že Utrpení Krista je nadprůměrný film, jehož závěr propojí bez sentimentality a dekorativních církevních klišé všechny motivy filmu dohromady a navíc s využitím tradičních a ke kýči svádějících symbolů. Tmu v Kristově hrobce začne prozařovat světlo, jímž je Kristus - zmrtvýchvstalý Kristus, který se vztyčí a kamera zobrazí detail jeho ruky s otvorem po hřebu. Tak začínají dějiny spásy...



Monday, 27 September 2004 12:34:00 (Central Europe Standard Time, UTC+01:00)       
Comments [3]  Literární a jiné humanitní úlety


 Sunday, 26 September 2004
Logování událostí v mediátoru

V mediátoru, kterého jsem popisoval v jednom dřívějším spotu, potřebujeme při testování logovat všechny příchozí události, které jsou předdefinovaným a bezpečným způsobem distribuovány dalším objektům. Nejméně náročnou cestou na napsání, volenou většinou vývojáři, kteří se pravděpodobně do IT rekrutují z rekvalifikovaných potomků nejzarytějších stachanovců;), je logování každé události zvláštní metodou. Po registaci nových událostí do mediátora je vždy i změněna komponenta pro logování, takže o údržbě takového kódu si můžete nechat zdát jen mrazivé sny o opětovném plíživém nahrazování kvality kvantitou.*

Na údržbu nenáročné a univerzální řešení spočívá ve vytvoření preprocesoru (viz spot o mediátoru), který je vyvolán před distribucí událostí ostatním objektům a který parametry události vypíše přes objekt Trace z jmenného prostoru System.Diagnostics.

Základní myšlenky v preprocesoru.

1) Většina (ne li každý) objekt v business vrstvě má unikátní identifikátor s názvem Id. Preprocesor události vypíše typ objektu, který událost vyvolal a jeho unikátní Id, takže je snadné dohledat zdroj problematických událostí.

2) Objekty nesoucí parametry událostí dědí vždy z třídy EventArgs. Přes reflection vypíšeme rekurzívně hodnoty vlastností do úrovně nastavené ve vlastnosti EndDumpLevel.

using System;
using System.Diagnostics;
using System.Reflection;
namespace RStein.Utilities
{
    /// <summary>
    ///  Třída EventsLog pro logování událostí
    /// </summary>
    public class EventsLog
    {
       
        #region private constants
        private const int BEGIN_DUMP_LEVEL = 1;
        private const int DEFAULT_END_DUMP_LEVEL = 2;
        #endregion private constants
        #region private variables
        private int m_endLevel;
        #endregion private variables
        #region Constructors
        /// <summary>
        /// Konstruktor
        /// </summary>
        public EventsLog() : base()
        {
            m_endLevel = DEFAULT_END_DUMP_LEVEL;
        }
        #endregion Constructors
        #region Public properties
        /// <summary>
        /// Koncová úroveň rekurzivního výpisu vlastností objeudálosti
        /// </summary>
        public int EndDumpLevel
        {
            get
            {
                return m_endLevel;
               
            }
            set
            {
                if (value < 1)
                    throw new ArgumentOutOfRangeException("Value must be greater than 1");
                
                m_endLevel = value;   
            }
           
        }
        #endregion Public properties
        #region Public methods
       
        /// <summary>
        /// Metoda pro výpis informace o událostech
        /// </summary>
        /// <param name="sender">Zdroj události</param>
        /// <param name="e">Parametry události</param>
        public void ProcessEvent(object sender, EventArgs e)
        {   
            Debug.Assert((sender != null) && (e != null), "EventsLog - Invalid event data");
           
            if ((sender == null)||
                (e == null))
            {
                    return;
            }
               
           
                Trace.WriteLine(new string('-',25));
                dumpId(sender);
                dumpEventProperties(e);
           
        }
        #endregion Public methods
        #region Private methods
       
        //Zapsání Id a názvu objektu
        private void dumpId (object sender)
        {
           
            Type senderType = sender.GetType();
            PropertyInfo idInfo = senderType.GetProperty("Id");
            string id = String.Empty;
           
            if (idInfo != null)
                id = idInfo.GetValue(sender, null).ToString();
            Trace.WriteLine(String.Format("Přijata událost od objektu {0}, Id = {1}", senderType.ToString(), id));
        }
        //Vypsani vlastností objektu s parametry události
        private void dumpEventProperties(EventArgs e)
        {
           
            Type eventType = e.GetType();
            Trace.WriteLine(String.Format("Objekt události -  {0}", eventType.ToString()));
            PropertyInfo[] eventInfo = eventType.GetProperties();
            Trace.WriteLine("Výpis hodnot událostí");
            writeEventValues(eventInfo, BEGIN_DUMP_LEVEL, e);
        }
        //Metoda pro rekurzivní výpis hodnot vlatností
        private void writeEventValues(PropertyInfo[] eventInfo, int level, object o)
        {
            foreach (PropertyInfo info in eventInfo)
            {
               
               
                //Nezpracovávat indexované vlastnosti
                if (info.GetIndexParameters().Length != 0)
                    continue;
               
                object propValue = info.GetValue(o, null);
               
               
                if (propValue == null)
                    continue;
               
                Trace.Write(new String('\t', level));
                Trace.WriteLine(String.Format("Jméno - {0}, Hodnota = {1}", info.Name, propValue.ToString()));
               
                if (level < EndDumpLevel)
                    writeEventValues(propValue.GetType().GetProperties(), level + 1, propValue);
            }
        }
       
        #endregion Private methods
    }
}
 
 
*Pozorný čtenář z tohoto spotu dokáže vyčíst i mou politickou orientaci a nechuť k určitému druhu myšlení;)



Sunday, 26 September 2004 17:02:00 (Central Europe Standard Time, UTC+01:00)       
Comments [0]  .NET Framework | Návrhové vzory


 Thursday, 23 September 2004
Druhá malá programátorská hádanka na tento týden

Dokážete (bez spuštění programu) poznat, v čem bude provádění tohoto kódu z hlediska "selského programátorského rozumu" podivné a proč?

using

System;

namespace

ConsoleApplication24

{

public class Class1

{

public static void Calculate( int number)

{

}

}

public class Class2: Class1

{

public static void Calculate( long number)

{

}

}

class Test

{

[STAThread]

static void Main( string []args)

{

Class2.Calculate(

int .MinValue);

}

}

}



Thursday, 23 September 2004 15:30:00 (Central Europe Standard Time, UTC+01:00)       
Comments [13]  Programátorské hádanky


 Wednesday, 22 September 2004
All-In-One zařízení nebo jednoúčelové vyšperkované přístroje?

Dneska se Patrik Zandl zamyslel nad užitečností All-In-One zařízení, tedy přístrojů, které v jednom kabátku nabídnou funkce více specializovaných elektronických “hraček". Spot byl zaměřen hlavně na mobily, do kterých je dneska integrován fotoaparát, rádio, MP3 přehrávač a další více či méně užitečné funkce. Vyznění spotu bylo jednoznačné - kombinovaná zařízení jsou hezká věc, ale brzy nás omrzí a používáme jen jejich primární funkce a na vše ostatní zakoupíme dražší, ale technicky dokonalejší přístroje, které mají lepší ovládání přizpůsobené svému základnímu a jedinému účelu. Z telefonu pořád hlavně voláme nebo posíláme  SMS, ale dle průzkumů nás třeba fotoaparát omrzí po prvním měsící hraní, z čehož nemají radost hlavně operátoři, kteří by asi nejradeji viděli, jak si s voyerským úsměvem vyměňujeme každý s každým fotografie banálního soukromí, které svou (ne)kvalitou danou nízkým rozlišením dávají prostor fanatazii, protože si každý může (spíš musí) z rozpitých skvrn domýšlet, jestli fotografie zachycuje poslední výstřelek kubistické estetiky nebo fotříka rozvaleného s pivem v křesle;)

Zpět k All-In-One zařízením.

Jirka Macich se ve svém spotu All-In-One zařízení zastal a vyzdvihl hlavně výhodnou cenu kombinovaného zařízení. Také jsem zastáncem kombinovaných zařízení, i když vím, že jsou zatím kompromisem. Ale velmi dobrým kompromisem. MDA II jsem si koupil, protože mě nebaví nosit s sebou PDA, mobil, přenosný MP3 přehrávač, rádio, čtečku knih. Fotoaparát nezmiňuji, protože se bez něj s radostí obejdu. Nerad se fotím a nerad koukám na strnulé statické snímky čehokoli a souhlasím s Mílanem Kunderou, že fotky jsou jen jednou ze sofistikovaných forem zapomnění.;)

Po 9 měsících intenzivního používání musím říct, že jsem spokojený a že většinu mých nároků plní MDA II na výbornou:

  1. MDA II je špičkové PDA, které i dnes předčí některá samostatně prodávaná PDA.
  2. K přehrávání MP3 na cestách nemusím mít žádné extra specializované zařízení s jednoduchým ovládáním jako je Ipod. Stačí mi, že si mohu vytvořit playlist a spustit sekvenční nebo náhodné přehrávání písniček. To vše jakýkoli přehrávač pro Windows Mobile 2003 samozřejmě zvládá.
  3. Když mě omrzí MP3, mohu poslouchat internetová rádia. Kvalita není nic moc, ale když mi nebude stačit, mohu si koupit SD kartu s rádiem.\
  4. Pro Windows Mobile existuje nepřeberné množství různě kvalitních programů pro čtení elektronických knih. Všechny materiály, odborné knihy, které mám právě teď rozečteny, mám stále u sebe, aniž bych s sebou tahal navíc nějaké místo zabírající jednoúčelové zařízení.
  5. Když bych zatoužil po GPS, není nic snazšího než zakoupení SD karty nebo samostatného a přes bluetooth komunikujícího GPS modulu.

Paradoxně jediné co se dá vytknout MDA II je horší software pro ovládání telefonní části. Verze "Phone Edition" operačního systému Windows Mobile není ještě tolik vyzrálá, ale třeba konkurenční Symbian má již dnes telefonní část plně srovnatelnou s běžnými “jednoúčelovými" mobily bez operačního systému.

Kvalita All-In-One zařízení se bude podle mě bude stále zvyšovat, takže k nákupu specializovaných zařízení najdeme stále méně důvodů. Nebo si myslíte něco jiného a používáte tak propracované zařízení, že vám ho žádný All-In-One přístroj nedokáže nahradit?



Wednesday, 22 September 2004 19:47:00 (Central Europe Standard Time, UTC+01:00)       
Comments [0]  Mobilitky


 Tuesday, 21 September 2004
Malá programátorská hádanka

Máte následující kód:

class

Test :  BaseTest

{

private string m_rene;

public Test() : base ()

{

m_rene = "Rene";

}

public override void WriteName()

{

Console.WriteLine(m_rene);

Console.Read();

}

}

Metoda WriteName vypíše za určitých podmínek jen prázdný řetězec - víte kdy? ;)

Update: A víte, jak se bude chovat stejný kód po přepsání do C++?



Tuesday, 21 September 2004 15:32:00 (Central Europe Standard Time, UTC+01:00)       
Comments [25]  Programátorské hádanky


 Monday, 20 September 2004
Česká .Net Developer Group nabírá dech

Jak už psal Michal, dneska se uskutečnilo první setkání české .Net Developer Group. K jeho postřehům bych jen dodal, že mě jakožto skeptika, co se týče úspěšnosti pořádání kolektivních akcí pod egidou velkých společností jako je Microsoft, příjemně překvapil počet účastníků, a hlavně to, že většina z nich nebyla všemu pasivně přitakávající zasmušilou většinou, která vévodí většině oficiálních seminářů a přednášek, ale že se se (skoro) všichni podíleli na vytváření programu dalších setkání.

Jestliže tedy nechcete potkávat své kolegy jen ve virtuálním prostoru internetu a nejste naprostí asociálové opevňující se s hysterickými vzlyky ve svém domě i při zmínce o návštěvě blízkého příbuzného, tak přijďte na další setkání, které se bude konat přibližně za měsíc a jehož tématem je bezpečnost v .Net Frameworku. O bezpečnosti bude přednášet Honza Šeda.

Honzovi Šedovi také patří pořádný dík za to, že si .Net Developer Group vymyslel, prosadil a celé první setkání v Microsoftu zorganizoval.



Monday, 20 September 2004 21:52:00 (Central Europe Standard Time, UTC+01:00)       
Comments [2]  .NET Framework | Ostatní


ADSL versus CDMA

Uvažuji, že své pomalé GPRS připojení vyměním za něco lepšího, protože mám konečně v dosahu ADSL i CDMA.

Po srovnání obou technologií a hlavně jejich perspektivy se mi víc zamlouvá ADSL, ale ta má jednu velkou nevýhodu - je poskytována Českým Telecomem, jehož rozhodnutí o rozvoji broadband internetu mají jedinou logiku - logiku maximalizace zisku za každou cenu v co nejkratším časovém období a na úkor rozvoje celé služby. Kvůli laxnosti Telecomu při instalaci DSlamů, kdy jsem byl neustále krmen jen velkohubými PR zprávami o lepšící se infratruktuře Telecomu, jsem v únoru už dlouho předtím nepoužívanou pevnou linku odhlásil. A teď bych si jí měl zase zřídit, jak já nesnáším monopol :(

Vím, že s Eurotelem Telecomu neuteču, ale ke kompletnímu manažerskému ovládnutí Eurotelu Telecomem a k telekomunizaci celé cenové politiky a firemní strategie Eurotelu snad zatím nedojde a po prodeji Telecomu se, alespoň doufám, obě společnosti opět rozdělí. (spekulace vychází z modelového scénáře, že Eurotel koupí Orange, který se chce Telecomu ihned zbavit).

Takže bych vás chtěl poprosit, abyste mi v komentářích napsali své zkušenosti s oběma technologiemi i vaším doporučením, abych měl rozhodování lehčí. Díky ;)



Monday, 20 September 2004 08:03:00 (Central Europe Standard Time, UTC+01:00)       
Comments [10]  Ostatní


 Sunday, 19 September 2004
Rychlá instalace všech aplikací na MDA II (XDA II) po tvrdém restartu

Nevím jak vy, ale já na svém Pocket PC nesnáším stav po tvrdém resetu, kdy musím znovu a znovu instalovat desítky programů, které používám. Windows Mobile 2003 jsou sice navzdory pochybovačným křiklounům stabilní a kvalitní operační systém a kvaziargumenty křiklounů jen je samotné usvědčují z toho, že za perfektní PDA považují jakoukoli programovatelnou kalkulačku, hlavně když je bez démonického systému Microsoftu, a do extatického křepčení kolem zlatého telete je dostane pouze fakt, že jde navíc o kalkulačku osedlanou Linuxem, ale experimentování s málo zdokumentovaným RIL protokolem dokáže i moje MDA II spolehlivě složit. U MDA II naštěstí nemusíte s otráveným obličejem instalovat všechny programy, ani nemusíte dbát na pravidelné a zdlouhavé zálohování celého zařízení, protože instalaci programů lze po tvrdém resetu spustit z Extended ROM.

Extended ROM je neveřejná část vestavěné flash paměti, která je vyhrazena pro mobilní operátory. Mobilní operátoři do této paměti umisťují programy (u TMO jde například o GPRS monitor), českou lokalizaci nebo témata na Today obrazovku se svým logem. Extended ROM je uzamčena pro zápis a v seznamu složek na PDA není vidět. Druhou část flash paměti, kterou asi používáte, je takzvaná Storage. Storage je volně přístupná uživateli a je určena k zálohování dat, o něž nechceme přijít po tvrdém resetu. Do Storage i do Extended ROM můžeme také nakopírovat CAB soubory, které budou nainstalovány po tvrdém restartu zařízení. Aby byly programy nainstalovány, neobejdeme se bez zásahu do Extended ROM a hlavně do "magického" souboru config.txt.

Upozornění: I když jde o zcela nesmyslné opatření servisu, zásahem do Extended ROM přicházíte o záruku. Proto si nejdříve obsah originální Extended ROM zazálohujte na počítači a před zanesením zařízení do servisu obnovte zálohu, zamkněte a skryjte Extended ROM - v servisu pak žádné provedené úpravy nepoznají a vaše oprava bude provedena v rámci záruky. Úpravu Extended ROM provádíte na vlastní odpovědnost a já neodpovídám za žádná případná poškození zařízení. (ale to jste určitě ode mě ani nečekali;) )

1) Stáhnete si a nainstalujte na MDA II Extended ROM Unlocker. Extended ROM Unlocker je nástroj, který zpřístupní a odmkne Extended ROM. Po instalaci najdete zástupce programu s výmluvnými názvy Hide, Unhide, Lock, Unlock v menu Programy pod složkou Extended ROM Tools. Zveřejněte (Unhide) a odemkněte (Unlock) Extended ROM. Resetujte (měkký reset) zařízení, abyste viděli složku Extended ROM.

2) V Extended ROM jsou hlavně CAB soubory operátorů, ale nás bude zajímat soubor config.txt. Config.txt je obyčejný textový soubor, který obsahuje příkazy vykonávané jednoduchým interpreterem autorun.exe po tvrdém resetu MDA II. Modifikací souboru config.txt můžeme instalovat další programy, které jsou umístěny v Extended ROM, ve Storage nebo na paměťové SD kartě (Storage Card) a odstraněním instrukcí operátora nebo výrobce se zase zbavíme automatické instalace programů, které stejně ihned po restartu odebíráme.

Instalaci CAB souboru si vynutíme zadáním prefixu CAB:, za který doplníme cestu k CAB souboru.

Instalace CABu umístěného v Extended ROM:
CAB: \EXTENDED_ROM\tcmdpocket.exe

Instalace CABu umístěného v Storage
CAB: \STORAGE\tcmdpocket.exe

Kromě instalace CAB souborů, můžete potvrdém restartu automaticky kopírovat soubory. Takže je snadné přidat třeba nového zástupce do Startup složky.

Za prefixem CPY1: zadáme cestu ke kopírovanému (zdrojovému souvoru)
Za prefixem CPY2: zadáme cestu k cílovému souboru

CPY1:\STORAGE\totalcmd.lnk
CPY2:\Windows\StartUp\totalcmd.lnk

Příkazem RST: Reset v config.txt si vynutíme měkký reset.

Nyní můžete bez obav provést tvrdý reset zařízení a všechny programy (bez dat!) budete mít za chvíli nainstalovány.

Tip na závěr: Z config.txt odstraňte volání nepovedených programů TPEnable.exe a TPDisable.exe. Jejich úkolem je po dobu instalace programů nepovolit vstupy uživateli - bohužel tyto prográmky jsou občas příčinou "zamrznutí" zařízení a také se nehodí, když CAB soubor vyžaduje potvrzení některých instalačních kroků.



Sunday, 19 September 2004 16:38:00 (Central Europe Standard Time, UTC+01:00)       
Comments [0]  Mobilitky


 Thursday, 16 September 2004
Vytvářejte se mnou aureolu dobrého weblogu

Můj blog rozmnožuje informační entropii již několik měsíců, a protože souhlasím s Radkem Hulánem, že dobrý weblog je navštěvovaný weblog, chci dát v tomto spotu prostor vám, čtenářům, abyste mi pomohli dotvářet jeho podobu, která bude více zajímavá pro vás i pro mě.

Za těch pár měsíců, co se spolu potkáváme na weblogu, jste mohli už částečně poznat, co mě zajímá, z čeho jsem nadšený i jaké animozity v sobě živím. Weblog jako žánr vyžaduje, aby v něm autor nabídl svoje osobité vidění problematiky, a to i problematiky odborné, a ne aby byl vzdálenou dvouřádkovou ozvěnou novinek právě rezonujících všemi informačními kanály na internetu nebo ochraptělou a omezenou hlásnou troubou jedné minoritní komunity. Od počátku se snažím i podtitulkem naznačit, že weblog je pro mě hlavně střet - nejen veřejný verbální střet mezi mnoha soupeřícími podobami mého ega (myšleno psychologicky, ne pejorativně ;) ) ve spotech , ale také střet mezi mými a vašimi názory, střet s jinými bloggery nebo autory. Nechci být jedním z mnoha bloggerů na doméně Vyvojar.cz, ale chci a snažím se, abyste po otevření směsice spotů na blog.vyvojar.cz poznali, který příspěvek jsem napsal já. Je to neskromné? Asi ano, ale kdybych o to neusiloval, tak nemusím psát weblog - nezaměnitelná aureola dobrého weblogu je podle mě konstituována jen a pouze originálními příspěvky jeho autora.

Proto bych chtěl slyšet váš názor na můj blog.

Zajímalo by mě, proč právě vy chodíte na můj weblog a jaké rysy vás na něm přitahují, co vás nudí nebo dokonce odpuzuje a co by vás nejvíce z témat, o nichž víte, že mě baví, zajímalo. Vaše reakce mi usnadní rozhodnutí, co by se s blogem mělo dít dál. V poslední době čím dál častějí přemýšlím o přesunu svych aktivit na vlastní doménu, i když by těsná spolupráce s Vývojářem v jiné podobě trvala určitě dále.

Co mě k rozhodnutí založit si vlastní doménu vede?

  1. Můj blog se netýká jen .NETu a i když Michalovi tématicky odlišné příspěvky nevadí, tak si nejsem jist, zda neodrazují jiné návštěvníky serveru Vyvojar.
  2. Na blogovacím systému .Text se mi nelíbí, že do RSS exportuje celé spoty.
  3. Na vývojáři není funkční stránka pro zasílání emailu přes odkaz Contact.
  4. Nové příspěvky pod spoty nejsou zasílány emailem. Nejen kvůli těmto nevýhodám uvažuji, že jako blogovací systém nepoužiji .Text v jeho "čisté" podobě.
  5. Na blogu nemám jednoduše dostupné úložiště pro obrázky a zdrojové kódy. Michal na požádání sice ochotně všechny artefakty na server umístí, ale přeci jen vlastní a vždy dostupné úložiště by bylo lepší.
  6. Na mých stránkách nechci mít jen blog, ale také stránky s regulérními články, poradnu pro zajímavé dotazy a když bude z vaší strany zájem, tak i třeba komerční sekci s e-booky na aktuální vývojářská témata.

Takže neváhejte a pořádně me zkritizujte, abych věděl, co musím se svým blogem udělat ;)



Thursday, 16 September 2004 21:15:00 (Central Europe Standard Time, UTC+01:00)       
Comments [23]  Ostatní


 Wednesday, 15 September 2004
Živě učí staré psy staré kousky

Živě zahájilo s obrozeneckým nadšením seriál o VB.NET. Nadšení serveru pro nové jazyky a polopatické vzdělávání svých čtenářů se ale ve své aktuální podobě stávají pro seriál sudičkami se smrtícími kletbami ve své bezzubé hubě.

Autor seriálu Milan Petřík se rozhodl, že postaví na hlavu všechna didaktická pravidla, která říkají, že vysvětlování nového tématu s odlišným viděním problému by nemělo být budováno na předchozích zastaralých znalostech, a raději nám předkládá svoji vizi "jednoduchého" VB jako chameleona proplouvajícího napříč technologiemi již léta skoro beze změny. To, že VB.NET je jen marketingový název Microsoftu pro jazyk budovaný na zcela jiných principech nez VB6 a nižší verze, který se svými zastaralými předchůdci sdílí některé méně významné syntaktické konstrukce, a že jen pro nepoučitelné nostalgiky je vytvořen jmenný prostor Microsoft.VisualBasic, s jehož pomocí je způsob kódování ve VB.NET degradován na hybridní VB6/.NET styl, nemusím návštěvníkům mého blogu asi připomínat.

Autor veškeré připomínky ke svému seriálu odmítá alibistickým poukazem na to, že prvních 10 dílů seriálu je určeno úplným začátečníkům, a proto nevysvětluje hned některé pokročilé, ale zásadní koncepty (třeba třídy, jmenné prostory), které přesahují ohraničený svět VB.NET. Alibistické je to proto, že se sice dle svých slov vyhýbá teoretickému vysvětlování některých pojmů, ale to mu nebrání, aby nás hned ve druhém dílu seriálu nepoučil o o logickém členění programu do modulů (Proč Microsoft před programátory skrývá své sladké tajemství, že modul ve VB.NET je jen třída se statickými metodami a syntaxe modulu je rozvinuta do třídy teprve kompilátorem?) a procedur a v zatím posledním díle se zase rozhodne, že jeho čtenáři jsou již dostatečně vyspělí, aby pochopili konstrukci Try - Catch (a to vše ještě před řídícími konstrukcemi jazyka!), ale aby jejich chápavé obvody v mozku nepřetížil, tak jim taktně zamlčí existenci klíčového slova Finally.

Dalšími lapsy jsou neustálé vypisování celé hierarchie jmenných prostorů nebo utvrzování začátečníka, že používání "magických" čísel místo konstant je v pořádku. Seriál je rozvleklý, těžkopádný a skáče bez jakékoli logické souvislosti z tématu na téma.

Shrnu-li to. Za seriálem není znát žádná myšlenková osnova a působí na mě dojmem, že si někdo v Živě řekl "No ten .Net už je docela rozšířenej, jeden děsnej seriál pro začátečníky o PHP už máme, a protože jsme server pro masového čtenáře, tak vytvoříme i podobný seriál ve VB.NET (jako bumerang se zde Microsoftu vrací, že VB má pověst lidového jazyka :), pozn. aut. ) a seženeme někoho, kdo dokáže žoviálně podat, jakej je ten VB.NET pohodovej jazyk fakt pro každou lamu".

Komu je seriál určen, opravdu netuším. Napadli mě jen ortodoxní příznivci programování v Basicu na nezastarávajícím stroji Didaktik Gamma, kteří se pod tlakem doby rozhodli migrovat na na PC a .NET. Ale že by tvořili tak početnou skupinu, aby se pro ně vyplatilo vytvářet seriál? :)



Wednesday, 15 September 2004 07:55:00 (Central Europe Standard Time, UTC+01:00)       
Comments [16]  .NET Framework | Ostatní


 Monday, 13 September 2004
Http modul pro změnu URL adresy ve WSDL webové služby

Webové služby v ASP.NET generují dynamické WSDL, ve kterém je adresa služby (obsah elementu soap:address) dynamicky určena podle url původního požadavku. Například při použití reverzní proxy by se hodilo určit adresu ve wsdl dokumentu staticky a přitom stále ponechat na ASP.NET generování většiny elementů ve wsdl dokumentu.

K tomuto účelu jsem napsal http modul pro změnu adresy. V kódu se předpokládá, že nové url webové služby je zadáno ve web.config v sekci appSettings pod klíčem newUrl a že k službě je přistupováno pouze přes protokol SOAP.

using System;
using System.Web;
using System.IO;
using System.Xml;
using System.Diagnostics;
namespace RSTEIN.HttpModules
{
    /// 
    /// Modul pro změnu
    /// 
    public class ChangeUrlModule : IHttpModule
    {
        
        #region private constants                
        private const string WSDL_REQUEST = "wsdl";
        private const string SOAP_NAMESPACE = "http://schemas.xmlsoap.org/wsdl/soap/";
        private const string SOAP_PREFIX = "soap";
        private const string LOCATION_NAME = "location";
        private const string ADDRESS_NAME = "address";
        #endregion private constants                
        #region private variables
        private readonly string m_newServiceUrl;
        #endregion private variables
        #region Constructors
        /// 
        /// Konstruktor
        /// 
        public ChangeUrlModule()
        {
            m_newServiceUrl = System.Configuration.ConfigurationSettings.AppSettings["newUrl"];
        }
    #endregion Constructors
    
    #region IHttpModule Members
        /// 
        /// Inicializace modulu - Součást rozhraní 
        /// 
        /// 
        public void Init(HttpApplication context)
        {
            if (m_newServiceUrl != String.Empty)
            {
                context.BeginRequest +=new EventHandler(context_BeginRequest);
                context.EndRequest +=new EventHandler(context_EndRequest);
            }
        }
        /// 
        /// Součást rozhraní 
        /// 
        public void Dispose()
        {
        }
        #endregion
        
        #region private methods
        //Zapsání jiného URL
        private void context_EndRequest(object sender, EventArgs e)
        {
            string path = HttpContext.Current.Request.RawUrl.ToLower();
            if (isWSDLRequest())
                changeUrl();
        }
        
        //Změna Url www služby
        private void changeUrl()
        {
            HttpResponse response = HttpContext.Current.Response;
            XmlDocument doc = new XmlDocument();
            MemoryStream originalStream = ((FilterStream)response.Filter).InnerStream;
            originalStream .Position = 0;
            try
            {
                
                XmlTextReader reader = new XmlTextReader(originalStream);
                doc.Load(reader);
            }
            catch (Exception e)
            {
                Trace.WriteLine("Invalid response");
                return;
            }
            
            XmlNamespaceManager namManager = new XmlNamespaceManager(doc.NameTable);
            namManager.AddNamespace(SOAP_PREFIX, SOAP_NAMESPACE);
            XmlNode locationNode = getLocationAttribute(doc);
            locationNode.Value = m_newServiceUrl;
            response.Clear();
            doc.Save(response.Output);
            
        }
        //Vyhledání atributu location elementu soap:address
        private XmlNode getLocationAttribute(XmlDocument doc)
        {
            XmlNode addressNode = doc.GetElementsByTagName(ADDRESS_NAME, SOAP_NAMESPACE)[0];
            return addressNode.Attributes["location"];
        }
        #endregion private methods
        //přiřazení filtru na objekt Response
        private void context_BeginRequest(object sender, EventArgs e)
        {
            if (isWSDLRequest())
                HttpContext.Current.Response.Filter = new FilterStream(HttpContext.Current.Response.Filter);
        }
        //Kontrola, zda se jedná o WSDL požadavek
        private bool isWSDLRequest()
        {
            string path = HttpContext.Current.Request.RawUrl.ToLower();
            if (path.EndsWith(WSDL_REQUEST))
                return true;
            return false;
        }
    }
}


O významu http modulů a jejich registraci ve web.config se více dočtete v mém starším článku na Interval.cz.



Monday, 13 September 2004 15:12:00 (Central Europe Standard Time, UTC+01:00)       
Comments [0]  Web Services


 Sunday, 12 September 2004
Několik zkušenosti s merge replikací na MSSQL proti SQL serveru CE (PDA)

Merge replikace na MSSQL proti SQL Serveru CE má svůj půvab, který ale odhalíte až po projití minového pole nástrah, o nichž v dokumentací naleznete jen pár sporadických zmínek. Spot jsem napsal proto, abych vás před nástrahami kapriciozních tvůrců CE replikací varoval a v některých případech nabídl i dočasné řešení.

1. Jestliže máte nainstalován na MSSQL Service Pack 3, nainstalujte podporu pro CE replikace na serveru z instalačního balíčku, který si můžete stáhnout zde.

2. Pro CE klienty je podporována jen "merge" replikace. Vytvoření publikace s podporou pro CE klienty je snadné - v průvodci "Create publication wizard" na formuláři "Specify subscriber types" zaškrtněte "Devices running SQL Server CE". Při manuálním vytváření publikace proceduru sp_addMergePublication nastavte argument @sync_mode na N'character' a povolte vytváření "subscription" anonymním klientům (@allow_anonymous = N'true').

3. Jestliže používáte dynamické filtry (to znamená, že filtrujete replikovaná data například podle Id uživatele), tak musí být v replikaci povolena optimalizace přenášených dat na klienta. V průvodci na formuláři "Optimize synchronization" zvolte "Yes, enable data optimization” . Alternativně v proceduře  sp_addMergePublication nastavte argument @keep_partition_changes na true.

4. CE klienti NEPODPORUJÍ komprimované snapshoty, proto tuto volbu nikdy nezapínejte.

5. Po instalaci SQL Server CE 2.0 na serveru spustťe MMC konzoli SQL Server Connectivity Managament a vytvořte nový virtuální adresář. Na záložce Http Content Folder vyberte adresář, ve kterém je knihovna sscesa20.dll, která zpracovává požadavky na replikaci od PDA klientů. Virtuální adresář musí mit nastaveno právo Execute, takže MMC konzole vám toto právo nedovolí upravovat. Na záložce Http authentication si můžete vybrat vyžadovaný typ autentizace přistupujících klientů - jestliže se rozhodnete pro anonymní přístup, můžete kliknutím na tlačítko Edit... vybrat účet, pod kterým bude knihovna sscesa20.dll přistupovat ke zdrojům počítače. Na záložce NTFS permissions můžete upravit práva, která jsou přidělena účtu, pod kterým běží IIS - většinou ale není nutné s právy manipulovat, protože průvodce si sám nastaví potřebná práva a nedovolí je přes konzoli změnit. Jen pro upřesnění – IIS replikační agent nemusí být nainstalován na serveru, na němž běží MSSQL s publikací.
6. Dostupnost IIS aplikace si ověříte zadáním adresy souboru sscesa20.dll (například http://RSTEIN2/sqlserverce/sscesa20.dll). Jestliže je soubor správně nainstalován, zobrazí se text "SQL Server CE Server Agent". Když se vám zobrazí chybové hlášení nebo dokonce prohlížec nabídne stažení knihovny, přeregistrujte dll zadáním regsvr32 /i sscesa20.dll.

7. Do databáze s publikací musí mít uživatel povolen přístup a současně musí být uživatel přidán do PAL (Publication Access List) ve vlastnostech publikace. O jakého uživatele se ale jedná?
a) Jestliže používáte v IIS aplikaci anonymní autentizaci a pro přístup k MSSQL Windows autentizaci, přístup do databáze a umístění do PAL se týká uživatele, pod nímž běží IIS replikační agent (IUSR_NazevPocitace nebo  účet vybraný v bodě 5).
b) Při "Basic" nebo "Integrated Windows" autentizaci uživatele v IIS aplikaci a Windows autentizaci do MSSQL, musí být povolen přístup do databáze a sočasně přidán záznam do PAL pro všechny uživatele, kteří replikaci provádějí.
c) Při SQL autentizaci do MSSQL je do PAL přidán příslušný SQL účet, kterému je také povolen přístup do databáze.

8. Snapshot publikace by měl být generován do vlastní složky, která je sdílena po síti a má nastavena minimální potřebná práva. Výchozí složka pro snapshoty je po síti totiž dostupná jen přes "administrátorské sdílení" (jméno disku se znakem dolaru na konci).
Složku se snapshotem určíte ve vlastnostech publikace na záložce Snapshot loation. Zaškrtněte volbu "Generate snapshots in this location" a do textového pole Folder zadejte název složky (například \\RSTEIN2\PDAREPLIKACE\PDA_FULL). Při zakládání publikace metodou sp_addMergePublication určete alternativní umístění snapshotu argumentem @alt_snapshot_folder. (@alt_snapshot_folder = '\\RSTEIN2\PDAREPLIKACE\PDA_FULL' ).
Na složce, do které je generován snapshot, musejí být nastavena tato práva.
a. Účty, pod kterými běží služby SQL Server a SQL Server Agent, musejí mít nastaveno plné řízení (Full control).
b. Jestliže používáte v IIS aplikaci anonymní autentizaci, musí mít anonymní účet právo "Read".
c. Jestliže používáte v IIS aplikaci "Basic" nebo "Integrated Windows" autentizaci, musejí mít všechny přistupující účty právo "Read".

9. Ke správě a řízení zařízení na PDA je možné vytvořit odlehčenou verzí replikačního manažera, kterého jsem popisoval v jiném spotu. CE replikační manažer má  své zvláštnosti, protože například dotaz na dostupnost MSSQL je nesmyslný, poněvadž CE replikace komunikují jen s replikačním agentem v IIS. Namísto dotazu na MSSQL tedy vytvoříme GET požadavek na soubor sscesa20.dll a zkontrolujeme, jestli se nám vrátil řetězec "SQL Server CE Server Agent".

10. Nepříjemným omezením (chybou) v SQL serveru CE 2.0 je podpora pouze maximálně jedné "subscription" v jedné databázi. Přesněji řečeno - před začátkem práce na projektu jsem si ověřoval, jestli mi SQL CE server bude podporovat dvě "subscription", protože jsem chtěl vytvořit dvě publikace v jednoé databázi. Jedna z nich by byla filtrovaná, druhá nefiltrovaná, což je v souladu s doporučeními v MSDN, jež se zabývají optimalizacemi replikací. Vytvořil jsem tedy dvě zkušební "subscription" v jedné CE databázi a vše proběhlo bez problémů. Problém se vyskytl až při pokusu o první replikaci. První "subscription" byla úspěšně synchronizována se serverem a byl doručen snapshot, při synchronizaci druhé "subscription" byla vrácena chyba "Invalid subscription", která je ale natolik obecná, že jsem nejdříve několikrát generoval znovu snapshot na serveru a zkoušel zakládat nové "subscription". Jako poslední zoufalcovo gesto jsem prohodil pořadí synchronizace obou subscription - synchronizace druhé (původně první) "subscription" selhala. Takže i když se CE server „tváří“, že podporuje paralelně více subscription, nevěřte tomu a adekvátně upravte svůj návrh publikace.

11. API pro replikaci v compact .NET Frameworku představuje rozhraní třídy SqlCeReplication,
Příklad práce s objektem SqlCeReplication:
Vytvoříme pomocnou metodu, abychom měli v replikačním manažeru na jednom místě inicializaci vlastností instance třídy SqlCeReplication.
 
    private SqlCeReplication getDefaultReplicationClass()
    {
    SqlCeReplication replication = new SqlCeReplication();
 //Připojovací řetězec k CE databázi
 replication.SubscriberConnectionString = m_connectionString;
       //URL IIS agenta (souboru sscesa20.dll)
  replication.InternetUrl= m_internetURL;
 //Libovolný řetězec, který bude na serveru použit k filtrování tabulek (článků) - v MSSQL hodnotu vlastnosti vrátí funkce HOST_NAME.
 replication.HostName = m_hostNameValue;
 //Libovolný unikátní identifikátor jednoho PDA klienta
  replication.Subscriber = m_subscriberValue;
      //Když není prázdné heslo, tak je zvolena "basic" nebo "anonymní" autentizace V IISreplikačním agentovi
 if ((m_internetUserPassword != String.Empty) &&
     (m_internetUserPassword != null))

 //Přihlašovací jméno uživatele (IIS replikační agent)
 replication.InternetLogin = m_internetUserName;
 //Heslo uživatele (IIS replikační agent)
 replication.InternetPassword = m_internetUserPassword;
 }

 //Název databázoveho serveru s publikací
 replication.Publisher = m_remoteServerName;
 //Název databázoveho serveru s publikací
 replication.PublisherDatabase = m_remoteDatabase;
 //Název publikace
 replication.Publication = m_publicationName;
 //Typ autentizace k MSSQL (NT nebo SQL)
 replication.PublisherSecurityMode = this.m_serverSecurityMode;
 
 //Jestliže je zvolena SQL autentizace k MSSQL, doplníme jméno a heslo
 if (m_serverSecurityMode == SecurityType.DBAuthentication)
 {
  //Přihlašovací jmeno k SQL serveru (SQL účet)
  replication.PublisherLogin = m_serverLoginName;
  //Heslo k SQL serveru (SQL účet)
  replication.PublisherPassword = m_serverLoginPassword;
 }
 //Vrácení inicializovaného objektu SqlCeReplication
 return replication;
}
Metoda pro spuštění replikace.

public bool RunReplication(bool reinitialise)
{
 //Resetování členské proměnné,která nese informaci o počtu provedených změn při poslední replikaci
 m_totalChanges = 0;
 //Získání inicializovaného objektu SqlCeReplication SqlCeReplication ceReplication = getDefaultReplicationClass();
 //Podmíněná reinicializace "subscription" (=vynucení si opětovného dodání snapshotu)
 if (reinitialise)
 {
  ceReplication.ReinitializeSubscription(true);
 }
 try
 {
  //Metodou Synchronize spustíme replikaci dat. Předtím můžete ještě voláním ceReplication.CreateSubscription založit „subscription“ před první synchronizací. V replikačním manažeru spravují „subscriptions“ speciální metody.
  ceReplication.Synchronize();
  //Celkový počet změn je součtem změn provedených na klientovi a serveru
  m_totalChanges += (ceReplication.PublisherChanges + ceReplication.SubscriberChanges);
  return true;
 }
 catch (Exception e)
 {
//Jestliže došlo k chybě, naplníme členskou proměnnou m_lastReplicationError s popisem chyby pro prostého uživateli
  m_lastReplicationError = STATIC_REPLICATION_ERROR_MESSAGE + Environment.NewLine +  e.Message;
  return false;
 }
 finally
 {
  //Objekt SqlCeReplication používá neřízené prostředky, proto zavoláme jeho metodu Dispose.
  if (ceReplication!= null)
  {
   ceReplication.Dispose();
  }
 }
}
Tento kód předpokládá, že MSSQL server s rolí „publisher“ je současně i „distributor“ publikace.
12.  Jestliže chcete zjistit, jaké chyby při replikaci nastaly, tak po zachycení výjimky SqlCeException projděte její kolekci Errors, která obsahuje objekty SqlCeError,  a zkontrolujte jejich vlastnosti Hresult, Message, NativeError a Source.

13. Na serveru můžete logovat činnost IIS replikačního agenta přidáním nového klíče do registrů pod větev HKLM\Software\Microsoft\MSSQLSERVERCE\Transport. Klíč musí být typu DWORD a jeho názvem musí být fyzická (!ne virtuální) cesta k adresáři, v němž je umístěn soubor  sscesa20.dll, doplněná  řetězcem LOGGING_LEVEL. Hodnota klíče musí být v intervalu od 0 do 3 (0 – logování vypnuto, 1 – logování chyb, 2 – logování chyb a varování, 3 – logování chyb, varování a všech informativních hlášení). Po zapnutí  nebo změně úrovně logování musíte restartovat IIS. Soubor s logem je vytvořen v adresáři IIS replikačního agenta a jmenuje se Sscerepl.log. (klíč c:\Inetpub\Sqlce20Agent\ LOGGING_LEVEL  s hodnotou 1 zapne po restartu IIS logování chyb do souboru  c:\Inetpub\Sqlce20Agent\ Sscerepl.log).

14. V books online pro SQL CE 2.0 si pozorně prostudujte článek o mapování mezi datovými typy  MSSQL a SQL CE 2.0  (MSSQL ), abyste již při návrhu databáze počítali se všemi omezeními SQL CE klienta. Článek má název Supported Data Types and Data Type Mappings.



Sunday, 12 September 2004 18:35:00 (Central Europe Standard Time, UTC+01:00)       
Comments [1]  (MS)SQL tipy a triky


 Thursday, 09 September 2004
Interval - článek Návrh aplikací v jazyce UML - textová specifikace případů užití

Další článek o UML mi dnes vyšel na serveru Interval.cz. I když pojem UML je dnes v názvu článku použit spíše jen ze setrvačnosti a také respektu k celému názvu seriálu, protože se zabývám návrhem struktury šablony dokumentu, ve které je umístěn podrobný popis případů užití.

Tímto článkem jsem opustil problematiku případů užití a příště již přijde na řadu (IMHO) nejzajímavější diagram v UML - diagram tříd.



Thursday, 09 September 2004 08:35:00 (Central Europe Standard Time, UTC+01:00)       
Comments [0]  UML