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_vc9extse64.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.
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\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1–5–18\Components.
Napríklad Acrobat Reader je uložený pod kľúčom
9579C59FFA3114E44AB6BD2D1806D835\68AB67CA7DA71501B7449A0100000010 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:
- Explorer.EXE 3040 ReadFile C:\Program Files\Adobe\Reader
9.0\Reader\AcroRd32.exe SUCCESS
- Explorer.EXE 3040 Process Create C:\Program
Files\Adobe\Reader 9.0\Reader\AcroRd32.exe SUCCESS
- AcroRd32.exe 3692 Process Start SUCCESS Parent
PID: 3040
- 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\system32\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.
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:
- Zadefinovanie interface-u,
- Implementácia interface-u,
- Spustenie služby pomocou ServiceHost a povolenie generovania metadát,
- 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.CreateInstance() 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.CreateInstance() 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;
}
}
February 25th,2009
Osobné |
No Comments
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.
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.
February 23rd,2008
Osobné |
No Comments
Pokúsil som sa upgradovať svoj jailbreaknutý iPod touch 1.1.2 na firmware
1.1.3 s jailbreakom. 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 iBlog.
Na upgrade na firmware 1.1.3 je potrebné mať jailbreaknutý firmware
1.1.2. Treba mať firmware 1.1.1, ísť na http://jailbreakme.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 Method
Informácia o dostupnosti iPod touch aplikácií: AriX at iJailBreak.com restored; certain emails
should be resent!
February 3rd,2008
Software |
No Comments
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.
November 1st,2007
Software |
No Comments
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.
October 3rd,2007
Software |
No Comments
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:
xxxxxxxxxxxxxxxxxxx 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.
August 9th,2007
Osobné |
No Comments
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 Press:
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 NullPointerException.
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.
July 27th,2007
Software |
3 Comments