Jozef Izso

Generovanie dokumentácie k Ajax web službe

February 25th, 2009

Webové služby využívajúce formát SOAP sa s pomocou WCF programujú veľmi ľahko hlavne vďaka tomu, že programátor sa môže sústrediť na biznis logiku, ktorú potrebuje implementovať. Na vytvorenie služby a rozchodenie komunikácie stačia štyri kroky:

  1. Zadefinovanie interface-u,
  2. Implementácia interface-u,
  3. Spustenie služby pomocou ServiceHost a povolenie generovania metadát,
  4. Zo schémy sa vytvorí proxy trieda pre prístup k službe.
[ServiceContract(Namespace="WebApplication1.Services")]
public interface IPublicApi
{
        [OperationContract]
        [WebGet]
        IList<TaskGroup> GetTaskGroups();

        [OperationContract]
        [WebGet]
        Guid CreateTaskGroup(string taskGroupName);
}

Utilitka svcutil.exe vie na základe XML schémy SOAP služby vygenerovať strongly-typed triedu pre .NET. Keď sa zmení rozhranie služby, stačí pregenerovať triedu a prípadne refektorovať kód.

S webovými službami pre Ajax to tiež nie je ťažké. WCF 3.5 podporuje Json a stačí použiť triedu WebScriptHostFactory ktorá vytvorí WebServiceHost s WebScriptEnablingBehavior. Ten pridáva podporu pre formát Json a XML a mapuje cestu /js na generátor JavaScript-ového proxy súbory. Vygenerovaný JavaScript je určený pre ASP.NET AJAX framework a generátor zatiaľ nie je plug-able, čiže sa nedá vymeniť za nejaký iný.

http://localhost/WebApplication1/PublicApi.svc/js

Objavil som však WCF REST Starter Kit (zdrojový kód je na Codeplex.com) – je to ukážka rozšíriteľnosti WCF stacku a záreveň implementácia podpory pre REST.

Tento kit obsahuje triedu HelpPageInvoker, ktorá si registruje url /help na ktorej sa zobrazí jednoduchý popis dostupných metód, ktoré HTTP príkazy (GET, POST, PUT, DELETE…) sa dajú použiť a taktiež odkazy na ukážkový request alebo response pre metódu.

http://localhost/WebApplication1/PublicApi.svc/help

REST Starter Kit je určený hlavne pre zjednodušenie práce so službou, ktorá používa POX a HTTP príkazy. Umožňuje použiť Json formát, ale cieľovou skupinou tohto kitu nie sú prímarne Ajax rozhrania.

Ak používate dependency injection v Ajax službách, tak zrejme budete potrebovať vlastnú implementáciu triedy HelpPageInvoker aby v nej správne fungovalo generovanie ukážkových hodnôt pre request alebo reponse. HelpPageInvoker si zistí návratový typ metódy, alebo jej parametre, tieto typy inštanciuje cez Activator.Cre­ateInstance() a objekt serializuje do XML alebo Json. Ak sú však tieto typy definované ako rozhrania (napr. GetTaskGroups() vracia IList<TaskGroup>) tak Activator ich samozrejme nevie ako vytvoriť.
Tu prichádza napomoc dependency injection. Do triedy HelpPageInvoker stačí poslať referenciu na kontajner z DI frameworku, ktorý využívate a nahradiť štyri volania Activator.Cre­ateInstance() za kontajner a jeho príslušné metódy.

Nasleduje kód, ako principiálne funguje vytvorenie ukážky návratovej hodnoty pre nejakú operáciu:

class HelpPageInvoker
{
  public Message GetResponseExample(OperationDescription od)
  {
    // z popisu operácie získa dátový typ návratovej hodnoty
    // a vytvorí objekt
    Type body = GetResponseBodyType(od);
    object instance = UnityContainer.Resolve(body);

    // vytvori Message serializovanu do Json
    Message result = Message.CreateMessage(MessageVersion.None, null,
      new JsonBodyWriter(instance, body));
    return result;
  }
}

Dependency injection v Ajax WCF službe

February 23rd, 2009

Mám možnosť sa hrať s WCF službami v ASP.NET MVC projekte. Z MVC som mal po pár projektov v práci zimomriavky na chrbte a Web Forms zostávali u mňa tým skvelým prostriedkom, ako spraviť webovú aplikáciu bez toho, aby som šiel na psychiatriu pre programátorov kvôli neustálemu implementovaniu nejakých rozhraní cez 7 vrstiev enterprise aplikácie.

Musím povedať že ASP.NET MVC vo verzii RC1 je skvelý framework, ktorý umožňuje nevídané testovanie kódu (pri štýle vývoja pre Web Forms to je snáď nemožné).

Píšem si teda projektík, kde je web robený pomocou MVC modelu, vrstvy pre služby a dáta sú definované pomocou rozhraní a využívajú Dependency Injection v podobe Unity Application Block. API webovej aplikácie je dostupné vďaka WCF službe s podporou pre Json formát.

ASP.NET MVC je priamo pripravený na to, že sa v ňom bude používať Dependency Injection. Horšie je to s WCF. Je potrebné si napísať vlastný IInstanceProvider pre konkrétny DI framework. Ja som využil tento návod: Using Unity with a WCF Service, ktorý vychádza z ukážky pre Spring.NET: WCF Service Dependency Injection. Kód sa trochu zväčší, ale môžeme si užívať výhody DI, testovania a pri návrhu API pre Ajax službu nemusíme rozmýšlať nad tým, ako bude vyzerať prístup do databázy. Keď je API vyladené, stačí zmeniť objekty v DI nastaveniach a služba môže fičať s databázou.

Gopas Bootcamp

February 23rd, 2008

Bootcamp je skvelý spôsob, ako si oddýchnuť, vyškoliť sa v novej technológii a spoznať nových odborníkov.

Témou zimného bootcampu bol Office SharePoint Portal 2007. Úžasnou vecou na bootcampe je, že ráno si môžete dať perličkový kúpeľ, potom je klasické školenie, obed, školenie a večera a potom vlastný program – takže nejaký ten bowling, prípadne zase perličkový kúpeľ, či sauna a rôzne iné aktivity.

iPod touch 1.1.3 jailbreak

February 3rd, 2008

Pokúsil som sa upgradovať svoj jailbreaknutý iPod touch 1.1.2 na firmware 1.1.3 s jailbre­akom. Na internete sú rône návody pre iPhone a iPod, niektoré sú len pre Mac, iné pre Windows a niektoré nevyžadujú použitie počítača vôbec. Mne fungoval až druhý program, ktorý som použil – iJailBreak.

Jailbreaknutý iPod touch 1.1.3 umožňuje spúšťať nové iPod aplikácie (Mail, Maps, nové Safari s widgets) bez nutnosti ich kúpenia cez iTunes Store (čo u nás nie je zatiaľ možné).

Veľmi dobrým zdrojom informácií o jailbreakovaní všetkých verzií iPod touchov je blog RupertGee’s i­Blog.

Na upgrade na firmware 1.1.3 je potrebné mať jailbreaknutý firmware 1.1.2. Treba mať firmware 1.1.1, ísť na http://jailbre­akme.com, nainštalovať Installer.app, nainštalovať októbrový update, upgradovať na 1.1.2 a aplikovať JailBreak 1.1.2.

Pred aplikovaním iJailBreak treba vypnúť Auto-Lock (Settings > General > Auto-Lock > Never) a nainštalovať BSD Subsystem. Z repozitáru http://ijailbreak.com/repo.plist si treba nainštalovať iJailBreakMobile 1.1.2 package. iJailBreak aplikácia si stiahne firmware 1.1.3, opatchuje ho a flashne. Celý proces trval približne 45 minút. Po manuálnom reštarte som mal úspešne nainštalovaný najnovší firmware a aj dostupný Installer.app.

Nasledovala honba za najnovšími iPod touch aplikáciami :-) V kategórii iJailBreakMobile totiž package iPod touch Software Upgrade nefunguje. Treba použiť repozitár http://ipodtouchmaster.com/files/repo.xml, ktorý pridá kategóriu iPhone 1.1.3 Applications a v nej je package The iPhone 1.1.3 Apps. Enjoy Mail a Google Maps ;-)

Celý popis ako aplikovať iJailBreak: Let’s Jailbreak the iPod touch 1.1.3 with the iJailbreak.com Met­hod

Informácia o dostupnosti iPod touch aplikácií: AriX at iJailBreak.com restored; certain emails should be resent!

Prehľad o systéme na pozadí desktopu

November 1st, 2007

Ak spravujete veľa serverov a stráce prehľad v tom, s ktorým serverom práve robíte, určite vám pomôže Sysinternals utilitka BgInfo.

BgInfo generuje pozadie plochy s aktuálnymi hodnotami systémových premenných, ako je názov stroja, meno prihláseného užívateľa, všetky používané IP adresy, DHCP server, default gateway, verzia OS a mnohé iné. Ak hodnota, ktorú potrebujete, nie je medzi štandardnými, BgInfo vie načítavať údaje aj cez WMI, čiže si môžete zobraziť hodnotu čohokoľvek.

BgInfo je veľmi užitočná utilitka aj v prostredí virtuálnych strojov, pri prezentáciách, či HOL laboch.

.NET Framework uvoľnený v licencii Microsoft Reference Licence

October 3rd, 2007

Scott Guthrie na svojom blogu dnes oznámil, že zdrojový kód .NET Frameworku bude uvoľnený pod licenciou Microsoft Reference Licence.

V praxi to znamená, že budeme môcť debugovať aj procesy v microsofťáckych knižniciach. Zdrojový kód má byť dostupný na stiahnutie, ale aj pomocou webovej služby, ktorú bude využívať Visual Studio 2008.

Po nastavení adresy serveru vo Visual Studio 2008 bude VS automaticky on-demand sťahovať potrebné zdrojové kódy počas debugovania. Výhoda tejto služby je, že vždy sa stiahnu aktuálne kódy pre používanú verziu frameworku (vo VS 2008 bude možné nastaviť, voči ktorej verzii .NET sa má vyvíjať – 2.0, 3.0 alebo 3.5).

Viacej podrobností v článku Releasing the Source Code for the .NET Framework Libraries.

NBÚ

August 9th, 2007

Náš naozaj najbezpečnejší úrad, ktorý by sa mal starať o elektronickú bezpečnosť, je jednoznačne jediný na svete, ktorý má stránkové hodiny dokonca aj na svoje webové stránky (prístupné od 7.30 do 16.00), má pre istotu zverejnený Rozpočet na rok 2007 na localhost-e, aby hackeri vedeli, koľko peňazí bolo investovaných do zmeny hesla nbusr123 na nové – nbusr1234.

Toto je odkaz na spomínaný rozpočet:

http://localhost/…ocet2007.pdf

A čo asi znamená hodnota X-xxxxxxxx: xxxxxxxxxxxxx­xxxxxx v HTTP hlavičkách posielaných zo serveru?

Jedinej informácii na stránkach www.nbusr.sk naozaj verím: že medzi záľuby riaditeľa patrí rybárstvo a záhradkárstvo.

Microsoft okopíroval Javu

July 27th, 2007

Toto je časté revanie malých detí, ktoré si myslia, že keď napíšu kód v Jave, tak sú programátori. Je to naozaj silný pocit prehnať kód javac kompilátorom a potom si myslieť, že toto je „programový kód“. java je však v skutočnosti interpretovaná, preto sa jedná o „skriptovací kód“.

Mýtus: Microsoft okopíroval Javu.

Fakt: citácia z knihy JSP – Java Server Pages, Barry Burd, 2003 Computer Pres­s:

Poohlédněme se teda za historií objektů typu JavaBeans. Ke knoci devadesátých let minulého století se programátoři ve vývojovém týmu firmy Sun Micrososystems dívali přes rameno svým kolegům v Redmondu. A co spatřili? Dozrávajíci model komponentového softwaru známý jako COM – neboli Microsoft Component Object Model. Objekty modelu COM byly z oblibou používány na webových stránkach známých pod označením ASP – Active Server Pages. Odpovědí firmy Sun byla specifikace JavaBeans (jako součást sady JDK 1.1).

Tento odstavec presne naznačuje, že Sun sa nechal inšpirovať komponentovým modelom COM od Microsoft-u.

Java jazyk vs. C#

Microsoft, ktorý údajne okopíroval Javu, sa pri návrhu jazyka C# (ktorý je syntakticky oveľa viacej podobný na C++ než na Javu) inšpiroval: autori C# zistili, že checked a unchecked exceptions sú úplná zbytočnosť, C# má narozdiel od Javy aj Vlastnosti, Delegátov, skutočné Udalosti a iné vymoženosti.

.NET narozdiel od Javy má skutočné generické typy – Java kompilátor odstráni informáciu o typovosti generických typov (tzv. erasures) – teda tieto informácie, nerozdiel od .NET, nie sú dostupné pomocou reflexie za behu programu. Podobne je tomu aj s atribútovým programovaním. Zatiaľ čo Java má v poslednej verzii úbohú podporu pre anotácie (veľmi zjednodušená obdoba atribútov), .NET už vo svojej prvej verzii podporuje plnohodnotnú prácu s atribútmi i pomocou reflexie. Plno „killing“ (alebo „that rocks!“) vlastností .NET-u je založených práve na atribútoch.

Ďalšie rozdiely medzi C# a Javou: Java vytvára všetky metódy ako virtuálne (explicitne treba zákazať pomocou final). C# (a .NET MSIL kód) ide presne opačnou cestou: virtuálne metódy treba explicitne označiť. Deklarácia implementácie rozhrania alebo rozširovania triedy sa v C# označuje operátorom : (ako v C++). Java používa kľúčové slová extends a implements. .NET (a teda aj C#) umožňujú explicitnú implementáciu rozhrania – Java nie.

Hodnotové a referenčné typy

Java obsahuje primitívne typy (ktoré sú naozaj primitívne a nedá sa s nimi robiť pomocou OOP – iba pomocou procedúr zaobalených do tried). .NET dotiahol unifikovanú OOP prácu s dátovými typmi takmer k dokonalosti – existujú hodnotové a referenčné typy, ktoré všetky dedia zo System.Object. Takto je skutočne zaručené, že všetky dátové typy dedia z jediného rootového typu. V Jave je toto obchádzané pomocou zaobalovacích tried. Základné dátové typy (bool, int, long, double, DateTime) sú hodnotové – tzn. vždy majú priradenú hodnotu. Takto sa vás nestane, že kompilátor za vás boxuje/unboxuje hodnoty, vy máte podmienku if (!isEditMode) { … } a zrazu dostanete NullPointerEx­ception.

Java Virtual Machine vs. .NET Runtime

Javisti si celkovo mýlia pojmy s dojmami a ani poriadne nerozlišújú medzi jazykom Java, jazykom C# a ich spúšťacími prostrediami – Java Virtual Machine a .NET Runtime. Mýtus okopírovania .NET modulu manažovanej správy pamäte vychádza práve z podobnosti správy pamäte v Jave. Treba však podotknúť, že manažovanú správu pamäti má aj PHP, Python, či JavaScript.

Finalizácia objektov je v .NETe oveľa lepšie vymyslená ako v JVM. .NET Garbage Collector umožňuje volať finalizátory (C# deštruktory) a podporuje IDisposable pattern. Ako som sa dočítal na webe, v Jave nie je vôbec zaručené vykonanie finalize() metódy a zdroje sa uvoľňujú v try/catch bloku. Vďaka definovanie IDisposable patternu a deštruktorom je možné správne uvoľniť zdroje, aj keď programátor spraví chybu a nepoužije napr. using() blok. Čo je ďalšia vec, ktorú jazyk Java nemá: blok using vygeneruje pre IDisposable objekty kompletný try/finally blok a dojde teda k správnemu a včasnému odstráneniu zdrojov.

No, to som sa ale rozpísal :) Ako je vidieť, .NET ponúka oveľa bohatší programový model, ktorý je konzistentný a je založený na zdrojovom kóde (to je moje označenie. Java totiž strašne veľa vecí definuje iba v rôznych dokumentoch a špecikáciách (napr. JavaBeans a ich „vlastnosti“ = get, set, is). .NET vďaka využitiu atribútov poskytuje celé riadenie kompilátora, alebo vývojového prostredia zo zdrojového kódu.).

Človeka, ktorý píše skripty v Jave a hovorí si „programátor“, som určite nepresvedčil, že .NET a C# nie sú kópiou Javy. Ale ponúkol som prehľad výborných funkcií, ktoré nemajú svoj ekvivalent v Jave a vďaka ktorým viem, že som sa pred niekoľkými rokmi rozhodol správne, keď som sa začal učiť používať .NET platformu.

Aktulizácia: A skoro som zabudol na to, že pre .NET už môžete programovať vo vyše 30 jazykoch.

Klonované virtuálne počítače

June 9th, 2007

Potreboval som si vytvoriť skúšobnú sieť o 3 serveroch (doména, DB, Sharepoint), tak som skúsil použiť VMware Workstation namiesto Virtual PC. Nainštaloval som Windows Server 2003 R2 Enterprise Edition, aplikoval Service Pack 2 a zaktualizoval. Potom som naklonoval tento virtuálny stroj a začal nastavovať počítače. Po vytvorení domény a pripojení serverov do nej som však začal mať problém ? nedalo sa prihlásiť do domény. Problém bol v duplicitnom SID počítačov. (Chybová hláška The name or SID of the domain specified is inconsistent with the trust information for that domain.)

Sysinternals však má dobrú utilitku NewSID, ktorá vygeneruje počítaču nové SID. Pred vygenerovaním a aplikovaním nového SID však je potrebné počítač odpojiť z domény, pretože novo aplikované SID nebude mať žiadne práva v doméne. Bude sa dať prihlásiť do domény avšak bude problém s právami počítača.

PS: 4GB disk je málo pre Windows Server 2003 R2 Enterprise Edition SP2. Po inštalácii zaberá 3GB.