WOW: Burning Crusade

January 14th, 2007

Dark Portal sa otvorí za 1 deň a 2 hodiny. Spolu s ním sa otvoria aj brány Brlohu, aby najskalnejší hráči mohli mať datadisk Burning Crusade čo najskôr.

8 miliónov hráčov, prvý polnočný predaj hry a po 164 dňoch píšem na blog ? World of Warcraft.

You are not prepared!

Počítač vo vašej dlani

September 14th, 2006

Najdôležitejší obsah svojho PC, ktorý potrebujete mať na cestách, môžete mať vo svojej dlani už dávnejšie (a aj z Mac-u). SoonR služba umožňuje prístup k súborom, e-mailom, kalendáru a aj Skype chatom cez mobilný telefón. Teraz však získate ešte rýchlejší a pohodlnejší prístup k svojim údajom: je tu jedna z prvých Ajax aplikácii pre mobily!

Ak vlastníte mobilný telefón na ktorom dokáže bežať Opera Mobile, máte možnosť si už teraz vyskúšať jednu z prvých Ajax aplikácií pre mobilné prehliadače. Ajaxové stránky sme optimalizovali pre rýchly prenos dát, takže sú oveľa rýchlejšie ako klasický mobilný HTML interface a podstatne s ním ušetríte dátový prenos. Vďaka Ajaxu je možné si priečinok s obrázkami spustiť ako slide-show prezentáciu.

Marketingové info: SoonR Sizzles on AJAX

Načítavanie údajov z DB pomocou SqlDataReader-u

August 3rd, 2006

SqlDataReader je veľmi efektívny pri načítavaní údajov z databázy, pretože obsahuje vždy jeden riadok a načítava údaje postupne. Koncept (algoritmus) načítavania údajov je defacto je pri každom načítavaní jednotný. Problémom je ako dostať dáta z readeru a spracovať ich a mať počas toho aj otvorené pripojenie do databázy (SqlDataReader samozrejme vyžaduje počas čítania aktívne pripojenie).

Najľahšie sa dá napísať všeobecná metóda pre vykonávanie SQL príkazov cez metódu SqlCommand.Exe­cuteNonQuery(). Jej návratová hodnota je void, netreba ju teda nijako spracovať a nič vracať z vlastnej metódy.

Metóda ExecuteScalar() sa dá ľahko zaobaliť: buď bude metóda vracať Object, ktorý vracia ExecuteScalar(), alebo pri použití generík môže zaobaľujúca metóda vracať špecifický typ daný generickým parametrom.

Pri použití ExecuteReader() treba údaje nejako spracovať.

Práca so SqlDataReader-om

  • Pripravíme si objekt SqlConnection a SqlCommand
  • Otvoríme spojenie do databázy
  • Spracujeme údaje zo SqlDataReader-u
  • Uzatvoríme spojenie s databázou
  • Zrušíme objekty pomocou Dispose() metódy
  • Vrátime spracované údaje

Ako som spomenul, problém spočíva v tom, ako vytvoriť všeobecnú metódu, ktorá údaje zo SqlDataReader-u vytvorí špecifický dátový typ (IList, dátová tabuľka, užívateľské konto, produkt…) a vráti ho.

Prvá časť, ktorá je generická v tejto metóde, je návratová hodnota. Pred otvorením spojenia s databázou nainštancujeme návratovú premennú na východziu hodnotu operátorom default(). (Operátor default() inicializuje číselné typy na hodnotu 0, referenčné typy na null a v štruktúrach nastaví číselné a referenčné typy obdobne.) Po získaní objektu SqlDataReader vytvoríme inštanciu návratového objektu, poupratujeme za sebou a vrátime výsledok.

Ukážka 1.

Druhá generická časť je vytvorenie objektu. Na vstupe máme objekt SqlDataReader, na výstupe generický typ T. Generická metóda by vyzerala takto:

public T DataReaderHan­dle<T>(SqlData­Reader reader); 

Keď túto metódu zavoláme v časti ?spracovanie údajov?, vykonávanie sa tak presunie do užívateľského kódu a po vytvorení objektu sa vráti k štandardnému toku programu. Tu využijeme callback pomocou delegátov. Delegát určuje predpis metódy, ktorá má byť zavolaná a je možné ho použiť ako parameter funkcie. Ukážková metóda DataReaderHandle bude ako delegát vyzerať takto:

public delegate T DataReaderHan­dle<T>(SqlData­Reader reader); 

Ešte treba pridať delegát ako parameter do metódy a vyvolať metódu, na ktorú ukazuje:

Ukážka 2.

Už len stačí napísať metódy, ktoré budú spracovávať SqlDataReader a vytvárať patričné objekt. Keď máme triedu User so statickou metódou ParseUser vracajúcu objekt User, stačí zavolať ExecuteReader takto:

User user = DbLayer.Execu­teReader<User>(U­ser.ParseUser, „UserDetails“, sqlParams); 

Knižnica DbLayer: /weblog/media/dot­net/DbLayer.cs

Prečo programujeme v C-jazykoch?

July 4th, 2006

Či už píšeme programy v jazyku C++, C#, Java a iných jazykoch založených na C (jedna prípustná syntax v PHP je podobná C, ale v PHP sa neprogramuje), nie je problém prečítať kód napísaný v inom C-style jazyku (i keď pochopenie je už ťažšie :-)). Prečo však bol jazyk C pomenovaný týmto písmeno a nie iným?

Jazykom, ktorý mal na históriu programovacích jazykov veľmi veľký vplyv bol ALGOL (algorithmic language) z roku 1958. Populárnym sa stal v roku 1960 po vzniku jednoduchšej varianty ALGOL-60. Jazyk bol portovateľný, s nízkou abstrakciou hardware a vyvinutý pre písanie algoritmov. ALGOL-68 pridal do jazyka nové vlastnosti, ale zvýšil jeho komplexnosť a abstrakciu hardwaru.

Roku 1963 Compoter Lab of Cambridge University prišiel s jazykom CPL. CPL bol založený na ALGOL-e, znižoval abstrakciu HW, ale zachovala sa v ňom komplexnosť ALGOL-u. Martin Richards navrhol Basic CPL (BCPL), ktorý bol okresanou verziou CPL. Tento jazyk ešte zlepšil Ken Thompson z Bell Labs svojím B jazykom.

Jazyk B bol oveľa vhodnejší na systémové programovanie, jednoduchší a rýchlejší. Jeho nástupca, C, vyšiel z Bell Labs roku 1972. So zachovaním jednoduchosti priniesol nový jazyk vyššiu abstrakciu hardware ako jeho predchodca.Pôvodne určený jazyk pre UNIXové systémy sa stal univerzálne použiteľný programovací jazyk.

Samostatne od procedurálnych programovacích jazykov bol navrhnutý jazyk na tvorbu simulácií ? Simula, vyvinul sa však na univerzálny objektovo orientovaný jazyk. Priniesol hlavné koncepty OPP: triedy, dedičnosť, dynamické väzby.

Kombináciou C a Simula vznikol priamy nástupca C ? C++ (1983) s novými vlastnosťami ako šablóny alebo výnimky.

A je to v piči

June 28th, 2006

Je rozhodnuté. Socky, čo nič nerobia, budú mať zdravotné ošetrenie zdarma. A poctivo zarábajúci človek sa im na to zloží zo zvýšeného mzdového zaťaženia. Geniálne!

Informačný portál

June 28th, 2006

Moja iniciatívna maličkosť navrhla, aby v robote nasadili nejaký portál na správu dokumentov. Mám skúsenosti s pár inštaláciami SharePoint Services, tak sme sa rozhodli pre ne. Požiadavka na portál bola, aby vedel pracovať aj s dokumentami na zdiľaných priečinkoch a s mailami v Exchange. Čiže sme potrebovali nasadiť SharePoint Portal Server 2003.

Rozchodiť SPS Portál už nie je taká sranda, ako rozchodiť len WSS. Trápili sme sa s kolegom, trápili, celý deň. Úspech v rozchodení Portálu spočíva v tom, že konto, pod ktorým beží Application Pool portálu na IIS, má prístup do SQL Server-u a je owner konfiguračnej databázi Portálu.

SharePoint Portal má úžasnú vec, ktorou je crawler. Tento indexovací robot prechdáza stránkami portálu a indexuje ich. Týmto spôsobom dokáže naindexovať Portál, Sites, Exchange alebo zdieľané priečinky. Verejné priečinky Exchange, ktoré sa majú zdieľať, treba vystaviť cez Exchange HTTP Virtual Server s použitím Windows integrated authentication a bez formulárového prihlasovania. Potom stačí crawleru povoliť adresu http://exchange/public/verejný_priečinok a spustiť indexáciu.

Vyhľadávanie je jedna z najlepších vecí na Portále. Z jediného vyhľadávacieho políčka máte možnosť vyhľadať vo full textovo indexovanom obsahu (kategorizovanom na základe metadát v dokumentoch) , ktorý nepozostáva len z obsahu dokumentov v knižniciach na SharePoint-e, ale aj zo súborov na zdieľaných priečinkoch, v Exchang-i a na mnohých iných miestach. Všeobecne sa dá povedať, že čokoľvek, čo sa dá reprezentovať URI adresou, sa cez portál dá nájsť.

Ukladanie dokumentov do knižníc na SharePoint Services je geniálne jednoduché. Stačí otvoriť Word, napísať svoj dokument a uložiť ho na adresu http://sharepoint/sites/project/documen­ts. Word, Excel a PowerPoint dokážu prechádzať štruktúrou SharePoint-u ako priečinkami na disku, ?root? však nie je Tento počítač, ale SharePoint Server.

Pre správne fungovanie balíka Office so SharePointom treba mať doinštalovanú súčasť SharePoint Services Components, bez ktorej Office nevie takto pracovať so SharePointom.

Windows Sidebar Gadgets

June 25th, 2006

Windows Vista a portál Live.com umožňujú spúšťanie tzv. Gadgetov, čo sú mini aplikácie využívajúce DHTML alebo Web 2.0. Najnovšie informácie pre vývojárov o gadgetoch sú na MicrosoftGadget­s.com. Sú tu dva tutoriály o vytváraní gadgetov pre Live.com a Windows Sidebar. Jediný rozdiel pre Gadgety medzi týmito dvoma prostrediami je XML manifest, ktorý popisuje Gadget.

Live.com používa rozšírený RSS formát. Windows Sidebar používa vlastný XML formát, ktorý popisuje Gadget v podstate rovnakým spôsobom, ako RSS formát, len tagy majú iné názvy.

Na vývoj Gadgetov vám stačí Visual Studio Express (Web Edition pre Live.com Gadgety) a prípadne Windows Vista, ak by ste chceli testovať Gadgety vo Windows Sidebar-e. Potrebujete mať znalosť HTML, CSS a JavaScript-u a potom už stačí si prejsť SDK.

Nastavenie vývojového prostredia pre Live.com gadgety je pracnejšie, poskytuje však aj ladenie JavaScriptov z prostredia Visual Studia (podpora pre breakpointy, step in/out… klasické debugovanie).

Portál Live.com nepoužívam, tak som začal pracovať na Gadgete do Windows Sidebar. Podľa tutoriálu som vytvoril šablónu pre Visual Studio, ktorá vytvorí nový C# projekt so základnou štruktúrou, predpripravenou prvou stránkou a stránku s nastaveniami Gadgetu a nejakú tú aplikačnú logiku na pozadí. C# projekt po zbuildovaní nakopíruje súbory do správneho priečinku, aby ho Windows Sidebar videl. V tomto type projektu však nebude možné ladiť JS, pretože Windows Sidebar nepracuje so zdrojákmi, ktoré má Visual Studio, ale s ich kópiou a neexistuje žiaden PDB súbor, ktorý by umožnil ladenie.

Šablónu Windows Sidebar Gadget treba nakopírovať do priečinku My Document\Visual Studio 2005\Templates.

.NET Framework 3.0

June 10th, 2006

Súbor technológií známych doteraz pod názvom WinFX (Windows Presentation, Communication a Worfklow Foundation a nové Windows CardSpace (pôvodné InfoCard)) bol oficiálne premenovaný na .NET Framework 3.0. Bude dostupný pre Windows Vista, XP a 2003 Server.

Logovanie chýb pomocou log4net

May 28th, 2006

Veľmi dôležitou vecou, ktorú musí mať každá aplikácia, je logovanie chýb. Pre .NET aplikácie existuje výborná knižnica log4net. Síce jej chýba priamo zabudovaný výstup do XML dokumentu, obsahuje generovanie XML fragmentov do textového súboru a ten je možné potom vložiť ako externú entitu do XML dokumentu.

log4net obsahuje dobrý základ pre logovanie chýb pomocou vlastných, špecializovaných, objektov. Pomocou nich je možné napr. zalogovať podrobne chyby v SQL príkaze, alebo všetky SQL príkazy, ktoré boli asociované s DataAdapter-om, v ktorom nastala chyba. Takto je možné zistiť aj v akom stave bolo spojenie s databázou.

Logovací systém log4net sa skladá z týchto základných objektov:

  • Layout – stará sa o formát, v akom budú logované záznamy uložené.
  • Appender – ukladá záznamy do logovacieho výstupu. Výstup môže byť súbor, databáza, konzola, logovací server a pod.
  • Filter – filtruje úroveň (Level) záznamov a iné vlastnosti, na základe ktorých logovaný záznam predá appenderu, alebo nepredá.
  • ILog – interface ktorý ukladá záznamy. Je vytvorený na základe konfiguračného XML súboru, alebo programovo.

Všetky logovacie metódy rozhrania ILog prijímajú ako prvý parameter object, druhý, nepovinný, je Exception. Napr.:

ILog.Error(ob­ject message, Exception exception);

Pri spracovaní logovaného objektu (väčšinou v metóde LayoutBase.For­mat(), v prípade XmlLayout-u vo FormatXml()) sa zavolá message.ToStrin­g(). Štandardne sa do metódy posiela string (zložitejší text sa formátuje napr. pomocou ErrorFormat(string format, params object[] args)). Nič nám však nebráni si napísať vlastný logovací objekt, ktorý bude preťažovať metódu ToString().

Prvá trieda je celkom jednoduchá: do textového logu vypisuje len chybovú správu. (Zdrojový kód SimpleLogItem)

public class SimpleLogItem
{
private string _message;

public SimpleLogItem()
: this("")
{ }

public SimpleLogItem(string message)
: this (message, null)
{ }

public SimpleLogItem(string message, params object[] args)
{
if (message != null)
_message = String.Format(mes­sage, args);
else
_message = message;
}

public string Message
{
get { return this._message == null ? "" : _message; }
}

public override string ToString()
{
return String.Concat("[Log message] ", Message);
}
}

Konštruktor SimpleLogItem priamo podporuje formátovanie textu pre väčšie pohodlie. Celkovo však táto trieda nerobí nič, čo by sa nedalo dosiahnuť „Format“ metódami v ILog. Slúži však ako veľmi jednoduchý základ pre sofistikovanejšiu triedu: SimpleSqlLogItem.

Zdrojový kód triedy SimpleSqlLogItem je celkom veľký takže na neho uvádzam len linku. Uvediem len použitie a výstup logu.

SqlCommand cmd;
SqlConnection
conn;
// …

try
{
SqlDataReader reader = cmd.ExecuteRe­ader();
// …
}
catch
(SqlException ex)
{
log.Warn(new SimpleSqlLogI­tem(cmd, „Nepodarilo sa získať informácie o užívateľovi.“));
}
finally
{
conn.Close();
}

SimpleSqlLogItem môže naformátovať výstup napríklad takto:

[Log message] Nepodarilo sa získať informácie o užívateľovi.
[SQL Command] SELECT id, meno, email FROM uzivatelia WHERE id = @ID AND meno = @meno
[param] int @ID = 1
[param] varchar @meno = ‚Administáror‘

[Connection] DBSERVER\SQLEX­PRESS:UkazkovaDB (Open)

Btw: v tomto príklade sa nepodarilo získať informácie o užívateľovi pretože dátový typ parametru @meno by mal byť nvarchar. Takéto logovanie dokáže zachytiť aj aktuálny stav pripojenia do databázy, pretože získanie stavu objektu SqlCommand.Con­nection sa vykoná pred uzavretím spojenia v kóde finally.

Nabudúce popíšem spôsob vytvorenia vylepšeného LogItem-u, ktorý bude používať XmlWriter na zápis údajov.

Skúška blogovania cez Microsoft Word 2007

May 24th, 2006

Po rozchodení XML-RPC rozšírenia do Textpatternu, môžem teraz oveľa pohodlnejšie blogovať. A aj s kontrolou pravopisu :-)

Vďaka Wordu budem môcť jednoduchšie publikovať články s naformátovanými a zvýraznenými zdrojovými kódmi s ukážkami. Len aby som teraz mal inšpiráciu na nejaké features v .NETe… A spomenul si na tie, ktoré som chcel blognúť v poslednom mesiaci, ale kvôli strnulému publikovaciemu rozhraniu som sa na to nakoniec vykašlal.

PS: Word pridáva do textu aj tvrdé medzery a sú súčasťou vypublikovaného dokument. Dobrá vecička, veľmi dobrá :-))

PS2: Vytváranie smajlíkov je tiež jednoduchšie: vytvoril som si jedného, pravé kliknutie ? Uložiť rýchly štýl a už len ďalších smajlíkov pooznačujem a kliknem v Ribbone na štýl Smajlíci. Keby som to ešte mohol spraviť cez Auto Correct ;o)