NoSQL Is Hard (Stack Overflow Architecture)

Vyberám zaujímavú časť o NoSQL databázach z článku Stack Overflow Architecture.

The biggest problem of all is that transactions can not span arbitrary boundaries. There are no ACID guarantees beyond a single record or small entity group. Once you wrap your head around what this means for the programmer it's not a pleasant prospect at all. References must be manually maintained. Relationships must be manually maintained. There are no cascading deletes that act correctly during a failure. Every copy of denormalized data must be manually tracked and updated taking into account the possibility of partial failures and externally visible inconsistency.

All this functionality must be written manually by you in your code. While flexibility to write your own code is great in an OLAP/map-reduce situation, declarative approaches still cover a lot of ground and make for much less brittle code.

What you gain is the ability to write huge quantities of data. What you lose is complacency. The programmer must be very aware at all times that they are dealing with a system where it costs a lot to perform distribute operations and failure can occur at anytime.

Unit testing videá

Na konferencii NDC2009 vystupoval aj Roy Osherove, ktorý vie celkom pekne prednášať o unit testingu. Video záznam z konferencie je dostupný na blogu MSDN UP North vo forme torrentu. Odporúčam pozrieť si jeho prezentácie, na ktorých predstavuje Test Driven Development, ukazuje hlavné best practises pri písaní unit testov a taktiež objasňuje mockovanie.

Konfigurácia web aplikácií vo VS 2010

Veľmi príjemnou zmenou v ASP.NET 4 je nový web.config súbor, ktorý podstatne schudol a normálne obsahuje iba 2 potrebné direktívy. Od .NETu 2.0 web.config postupne rástol s každou novou verziou (3.0, 3.5, 3.5 SP1), pretože pôvodný machine.config z 2.0 verzie sa nemenil, ale nové funkcie a ich nastavenia pribúdali rapídne.

Všetko čo potrebujeme určiť je použitá verzia frameworku a nastaviť IIS, aby používal ASP.NET moduly.

<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
  </system.webServer>
</configuration>

Druhou novinkou je správa rôznych konfigurácii web aplikácie priamo v projekte. Doteraz bol v projekte jeden Web.config súbor, ktorý sa používal hlavne počas vývoja a pri nasadení aplikácie do produkčného prostredia bolo potrebné vytvoriť iný konfiguračný súbor a ten udržiavať samostatne. Problém bol aj s verziovaním nastavení ktoré mal každý vývojar iné. Teraz máme k dispozícii transformačné konfiguračné súbory.

Visual Studio v nových projektoch vytvorí základný Web.config súbor a k nemu dve ďalšie verzie: Web.Debug.config a Web.Release.config. Základný konfiguračný súbor sa použivá rovnako ako doteraz – nastavíte v ňom všetko potrebné pre beh webovej aplikácie. Nové Debug a Release konfiguračné súbor slúžia na popísanie zmien v ladiacej a produkčnej verzii. Ich syntax je presne taká istá ako v normálnych Web.config súboroch. Používajú však XML-Document-Transform rozšírenie, čo sú špeciálne XML atribúty, ktoré určujú, ako budú zmeny aplikované.

Transformácie XML dokumentu umožňujú pridať či odstrániť určité XML elementy a atribúty, nahradiť celý XML element úplne novým elementom, ale aj využiť XPath výrazy na definovanie podmienok, za akých má dôjsť z aplikovaniu zmi­en.

Typicky je teda v Release verzii odstránený debug="" atribút a nastavený connection string na produkčnú databázu:

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <connectionStrings>
  <add name="MyDB"
    connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True"
    xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
  </connectionStrings>
  <system.web>
    <compilation xdt:Transform="RemoveAttributes(debug)" />
  </system.web>
</configuration>

Šablóna pre HelpStudio 3 založená na MSDN Lightweight štýle

Hľadal som spôsoby ako jednoducho písať a spravovať dokumentáciu k softvérovému projektu. DocBook som hneď obišiel, keďže sa mi nechcelo písať ručne XML značky. Preferujem, aby som hneď videl naformátovaný výsledok (potrebujem „Word experience“). Visual Studio 2005 SDK obsahuje HelpStudio Lite, čo je voľne dostupná verzia WYSIWYG editora dokumentácie, ktorý dokáže vygenerovať MSHelp 2.x súbory (to sú .HxS a podobné balíčky dostupné s Visual Studiom 2005 a 2008 v ktorých je dokumentácia a prezerajú sa pomocou Document Explorera).

MSDN 2010 Template for HelpStudio 3

Druhá moja požiadavka bola môžnosť upraviť si výstup tak, aby pripomínal nový MSDN Lightweight štýl – ten fialový branding MSDN knižnice. HelpStudio Lite umožňuje vytvoriť si vlastné šablóny a štýlovanie pre HTML stránky, ale aj podporné súbory pre MSHelp (index dokumentov, navigácia, atď.). Šablóny sú obyčajné HTML súbory s vloženými špeciálnymi značkami označujúci miesta, kde sa majú vložiť údaje z dokumentácie. Samotné dáta sú uložené v HelpStudio projekte – .hsp – čo je XML súbor obsahujúci celú vytvorenú dokumentáciu.

<!--DXMETADATA start type="Stylesheets" --><!--DXMETADATA end-->
<!--DXMETADATA start type="ProjectTitle" -->Project Title<!--DXMETADATA end -->

Šablóny sa v pohode dajú upravovať v editore ktorý je súčasťou HelpStudia. Ja som však využil Dreamweaver, lebo sa v ňom oveľa ľahšie čistil kód a robili štýly.

Nevýhoda Lite verzie je nutnosť výstupu iba do MSHelp 2.x verzie. HS 3 vie spraviť aj HTML výstup. Je to však také krkolomné: treba vypnúť zmazanie vygenerovaných HTML súborov. Balíčky MSHelp totiž obsahujú HTML dokumenty a HS v prvej časti kompilácie vygeneruje HTML obsah a ten v druhej fáze spojí do balíčka .HxS. S prechodom na HS 3 prišli aj trošku problémy: najprv nedokázal rozpoznať moju šablónu, pretože config.xml súbor obsahoval starú definíciu šablóny a HelpStudio ju nevie automaticky prekonvertovať. Druhý problém bol podobný. Definícia tzv. HTML Scraps je síce stále uložená v .txt súbore ale z textovej definície prešli na nový XML formát a síce šablóny fungovali s pôvodnou verziu, niektoré premenné generovali len tak rôzne XML fragmenty do HTML kódu.

Samotnú šablónu som uverejnil na Google Code hostingu ako hs3msdn2010tem­plate projekt pod BSD licenciou. Ako verziovací systém som zvolil Mercurial, pretože si myslím že umožní prípadným používateľom tejto šablóny oveľa jednoduchšie lokálne verziovanie kódu. Stačí si stiahnuť binárky a zadať tento príkaz na „naklonovanie“ zdrojákov:

hg clone https://hs3msdn2010template.googlecode.com/hg/ hs3msdn2010template

Síce HelpStudio Lite a 3 má veľkú výhodu vo vizuálnej editácie dokumentácie, slušné HTML editory, kontrolu pravopisu, rôzne podporné nástroje a jednoduché rozhranie, má aj veľa nevýhod a problémov: nezdokumentované šablóny, kompilácia je nechutne pomalá, občas padne a predávajú ho za nekresťanských cca 350? za 1 licenciu. Preto teraz študujem možnosti projektov Sandcastle a DocProject. Ale o nich nabudúce.

Visual Studio 2010 Ultimate Beta 2 v Dreamsparku

Študenti majú teraz cez Dreamspark prístup k beta verzii Visual Studio 2010 Ultimate, čo je najvyššia edícia.

DreamSpark is simple; it's all about giving students Microsoft professional-level developer and designer tools at no charge so you can chase your dreams and create the next big breakthrough in technology – or just get a head start on your career.

Vista: Set global command failed on WSH

Celý deň nejde Wowko, tak sa hrám zo sieťou, skúšam latenciu a mením TCP Autotuning nastavenia. Vypnutie bola hračka: netsh interface tcp set global autotuninglevel=di­sabled. Nahodenie auto tuning späť na hodnotu normal už bolo problematickejšie vďaka chybe:

Set global command failed on WSH Systém nemôže nájsť zadaný súbor.

Po inštalácii Service Pack 2 na Vistu pribudlo v kontexte netsh interface tcp nové nastavenie heuristics ktoré pri hodnote wsh=default robí problém a neumožňuje nastaviť autotuninglevel=nor­mal (všetky ostatné hodnoty je možné nastaviť.

Zadal som teda

netsh > int tcp
netsh interface tcp > set heuristics enabled
Ok.
netsh interface tcp > set global autotuninglevel=normal
Ok.

A už to beží. Zatiaľ neviem čo je tá nová heuristika, ale pingy to veľmi neovplyvňuje. Za to Wowko furt a furt nič. Zrejme si odpočiniem od raidy.

Prípad padajúceho Prieskumníka (aka explorer.exe)

Mám teraz doma nanovo preinštalovanú Vistu Ultimate x64 a keďže veľmi veľa programujem, mám tu plno nástrojov na vývoj: Visual Studio, WinDbg, MSDN Library s dokumentáciou, Apache na lokálny SVN server, samozrejme Tortoise SVN (x86 aj x64 bit verzie, aby kontextové menu fungovalo správne v Exploreri aj v Total Commanderi, ktorý je len 32bitový). Nesmie chýbať virtuálna cd-romka – pomocou Virtual CD 9 – a NOD32 Antivirus 4.

Potreboval som nainštalovať Windows SDK, tak som pripojil .iso image a chvíľu počkal. Autorun sa nespustil, takže som šiel do Štart > Počítač, pravý klik na cd-romku, chvíľu sa nič nedialo a nasledoval Dr. Watson, ktorý mi oznámil, že program Prieskumník sa musí reštartovať.

Na to že som ešte nestihoval nainštalovať rôzne bety a iné pofidérne programy a mám tu len tie o ktorých viem, že sú veľmi stabilné, začal Prieskumník vo Viste padať celkom rýchlo. Prvé podozrenie padlo na chybný Tortoise SVN, ktorý je zaregistrovaný do exploreru a Virtual CD ktorý do neho tiež pridáva vlastné kontextové menu. Stačí sa len dopátrať ku skutočnej príčine.

Mark Russinovich má vynikajúce články na svojom blogu o možnostiach hľadania chýb v padajúcich programoch a článok The Case of the Random IE and WMP Crashes mi naozaj pomohol a konečne som mal možnosť si skúsiť tento typ troubleshootingu.

Vo WinDbg sa stačí pripojiť na existujúci proces: File > Attach to a Process… > explorer.exe a debugovanie môže začať. WinDbg sleduje, čo sa deje v Prieskumníkovi a keď som klikol pravým na cd-romku, hneď sa zastavil na výnimke:

V Call Stacku bolo vidieť, že Virtual CD DLLka uvoľňovala pämať a zrejme tam mali chybičku.

Odskúšal som si aj utilitu adplus.vbs, ktorá je súčasťou Windows Debugging Tools. Tento skript pripojí debugger na existujúci proces (alebo spustí nový proces) a zaznamenáva 1st a 2nd chance výnimky, ktoré nastanú v programe, zaloguje ju a vytvorí memory dump z ktorého sa dajú vyčítať veľmi cenné informácie.
1st chance výnimka je taká, ktorá je v programe odchytená a viacej-menej si s ňou dokáže poradiť.
2nd chance výnimky sú všetký neodchytené výnimky a teda spôsobujú ukončenie procesu.

cscript adplus.vbs -crash -pn explorer.exe -o C:\dump

Adplus.vbs zaznamenal do logu 1st chance AccessViolation exception v <Unloaded_vc9ex­tse64.dll>+0×5f84 a okamžite aj 2nd chance AccessViolation exception čo znamená, že tam je bug.

--- 2nd chance AccessViolation exception ----
---------------------------------------------------------------

Call Site
<Unloaded_vc9extse64.dll>+0x5f84
0x1`00000000
0x7f24f90
0x4ded7a8
0x360033`00380033
0x7fe`00000037
<Unloaded_vc9extse64.dll>+0xf1c8

Čo s takouto chybnou knižnicou? Virtual CD som používal v staršej verzii, najnovšia 9.3.0 je opravená. Nie vždy však môže byť opravená verzia dostupná. V takom prípade treba knižnicu zakázať napríklad pomocou ShellExView. Veľmi často podobné padanie spôsobujú staré DivX a xvid kodeky, keď vytvárajú náhľady.

Prípad nefungujúceho Štart menu vo Windows Vista

Pred bedmintonom som sa štandardne zastavil v bývalej robote vyzdvihnúť kolegov a jeden z nich mal problém s Vistami. Firemný noťas, 32bit Vista Business a už to bude nejaký ten rok, čo je nainštalovaná. Keďže to je vývojársky a domáci komp, je tam nainštalovaných veľa rôznych softov.

Dnes sa mi sťažoval, že vo Viste nefunguje Štart menu a nie je vôbec pokrok oproti Windows 95 kde fungovalo bez problémov. Windows spúšťal z menu iba niektoré programy. Fungovali z plochy, z rýchleho spustenia a aj z ponuky Všetky programy. Z úvodného Štart menu alebo s pomocou vyhľadávania nefungovali.
Hlavne sa jednalo o programy inštalované cez Microsoft Installer – MS Office, Acrobat, či Cisco VPN klient.

Pomocou Process Monitoru som zistil, že sa spúšťajú iba obyčajné .lnk odkazy. Štart menu však obsahuje aj odkazy, ktoré sú uložené v Registroch v časti HKLM\SOFTWARE\Mi­crosoft\Window­s\CurrentVersi­on\Installer\U­serData\S-1–5–18\Components.

Napríklad Acrobat Reader je uložený pod kľúčom 9579C59FFA311­4E44AB6BD2D1806D835\68AB­67CA7DA71501B7449A010000­0010 kde má záznam typu REG_SZ s uvedeným cestou k AcroRd32.exe.

(Screenshot je z XPéčok, lebo na nich píšem tento zápisok 🙂 )

Explorer už vie, kde sa odkaz na program náchadza a teda za normálnych okolností by File Monitor zobrazil tieto udalosti:

  1. Explorer.EXE 3040 ReadFile C:\Program Files\Adobe\Reader 9.0\Reader\AcroR­d32.exe SUCCESS
  2. Explorer.EXE 3040 Process Create C:\Program Files\Adobe\Reader 9.0\Reader\AcroR­d32.exe SUCCESS
  3. AcroRd32.exe 3692 Process Start SUCCESS Parent PID: 3040
  4. AcroRd32.exe 3692 Thread Create SUCCESS Thread ID: 2604

Explorer však ani nezačal načítavať Acrobat z disku, ani vytvárať nový proces.

Po chvíľke googlenia som našiel zmienku o nefungujúcom menu vo Viste s podobnými symptómami na Winmatrix fóre – Vista Start Menu Broken?. Bola tam zmienka o utilitke ShellExView, ktorá vie zobraziť všetky COM+ rozšírenia zaregistrované do Exploreru (a že tých rozšírení je veľa – čistá inštalácia Windows XP SP3 ich má okolo 250),

Kolega mal v počítači rôzne rozšírenia do kontextového menu, na vytváranie náhľadov a iných vecí. Niektoré sa dali identifikovať podľa výrobcu (Real Networks, RAR Labs, Tortoise SVN), jedna .dllka bola no-name. Po vypnutí všetkých neštandardných dlliek Štart menu začalo fungovať. Postupným skúšaním sme zistili, že problém spôsobovala práve komponenta AdCntxtM.dll s názvom AdCtxtM Dynamic Link Library, ktorá má neznámeho výrobcu. V systéme je zaregistrovaná pod GUID {AA6639D1-CE2B-11D5-AB4D-006097A79E23} a nachádza sa v System32 priečinku: C:\Windows\sys­tem32\AdCntxtM­.dll.

Prípad niekoľko dní nefungujúceho Štart menu sa mi nakoniec podarilo opraviť bez formátovania, reinštalácie a iných zdĺhavých procedúr 😉 Za hodinku sa to dá opraviť, stačí však poznať správne nástroje.

Dependency injection v Ajax WCF službe

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.