Weblog

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.

Generovanie dokumentácie k Ajax web službe

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

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

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

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

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

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.