Archive for July, 2008

Uninstalling .NET Framework 2.0 SP2 and 3.5 SP1 in Vista

Thursday, July 31st, 2008

Recently I had a run-time heap corruption problem in our software which is caused by some internal changes in the beta CLR and .NET Framework assemblies. This software uses lots of interop code, it become broken because of these changes in the fw.
So, I decided to uninstall the beta frameworks from my machine but it’s happened to be not such a trivial thing to do. I asked Aaron Stebner in Microsoft for some help who responded me kindly and promptly. Thanks for it. :)

Here is his answer:

“The original version of the .NET Framework 3.5 included the .NET Framework 2.0 SP1 and 3.0 SP1, but it created separate Add/Remove Programs entries for 2.0 SP1 and 3.0 SP1 so you could uninstall all of the pieces as long as you uninstalled in the exact order of 3.5, 3.0 SP1, 2.0 SP1. That same behavior should be the case for 3.5 SP1 as well.

One thing that might be different here – on Windows Vista and Windows Server 2008, the .NET Framework 2.0 and 3.0 are OS components, so they will not show up in Add/Remove Programs. If you are running one of these OS’s, you will need to use steps like this to remove the .NET Framework 2.0 SP2 and 3.0 SP2:

1. Uninstall the .NET Framework 3.5 SP1 product from the Programs and Features control panel
2. In the Programs and Features control panel, click the link on the left named View Installed Updates
3. In the list of installed updates, look for an item named Update for Microsoft Windows (KB948609) – this is the .NET Framework 3.0 SP2
4. Right-click on the item and choose Uninstall
5. In the list of installed updates, look for an item named Update for Microsoft Windows (KB948610) – this is the .NET Framework 2.0 SP2
6. Right-click on the item and choose Uninstall
7. Reboot”

So, the key to uninstall these beta bits from your Vista machine is to remove KB948609 and KB948610 hotfixes.

Apparently the fw. rollback healed our application. We will investigate this problem if it comes up in the RTM bits too (in few weeks I think). I hope it won’t. :)

Bocs, de ezt Aaron kérésére angolul írtam.
A lényeg, hogy ha Vistán le kell szedni az SQL 2008 RC0 vagy más által felrakott beta NET Framework 2.0 SP2-t és 3.5 SP1-et, akkor a KB948609 és KB948610 hotfixeket kell uninstallálni.

SQL 2008 vizsga: Exam 70-432: TS: Microsoft SQL Server 2008, Implementation and Maintenance

Thursday, July 31st, 2008

Megléptem ma, ha már beta és ingyen van. Az alábbi témák ismerete ajánlott a vizsgához:

  • Maintenance Planek részleteiben
  • A Backup új szolgáltatásai (COPY ONLY, titkosítás, stb.)
  • CHECKDB új cuccai pl. spatial típusokhoz
  • Adatbázisok mozgatása szerverek között
  • Jogosultságok. Ezek miatt sokat buktam szerintem, rá kell szánni egy órát, és végignézni az összes securable-t és permissiont, ojjektum, database és szerver szinten is.
  • Az upgrade módjai és hatásai az upgrade-elt adatbázis működésére
  • Az új audit cuccok
  • Konfigurálható szerver jellemzőket tudni
  • Árva userek kezelése (nem a régi 2000-es módon!)
  • Jogosultságokhoz kapcsolódó nézetek, függvények. Erre most nagyon rámentek (lehet, hogy nekem meg a vizsgám :).
  • Transzparens titkosítás titkai
  • Profilozáshoz milyen jog kell? Mindenki tudja?
  • Data Collector A…Z
  • Új profiler eventek, de tényleg, eddig erre se mentek rá ennyire.
  • Főbb dm_-ek, de ezeknek oszlop szinten tudni a jelentését!
  • Resource Governor A…Z
  • DTA
  • FTE új működése
  • SSAS security! Ez szerintem övön aluli volt, de lehet, hogy ez nem pontozzák, csak kíváncsiak, hogy az SQL-es csávók értenek-e a BI cuccokhoz? Nem. :)
  • Database mail működése, architekturális szinten is
  • Partíciók kezelése, split, merge, kapcsolódó nézetek, függvények.
  • Tudni, hogy az XML és spatial indexek a PK-re épülnek
  • Job logolási kérdések, hová logol, mikor törlődik, stb.
  • SQL Server Agent szerepkörök
  • Karbantartási munkálatok mirroros környezetben
  • PBM, elég sok kérdés, nem túl nehezek, de a fogalmakat jól le kell tisztázni, szórakoznak vele
  • P2P Repl.
  • Titkosítási kulcsok kezelése failover clusteres környezetben
  • Snapshot resore-os scenariók, ez elveszett, az elveszett, visszajön-e snapshotból. Ehhez tudni kell pontosan, hogyan működik a database snapshot
  • Szokványos, nem nehéz backup kérdések

Elmondható, ha valaki ismeri a 2005-ös verziót, és felkészül a 2008 admin újdonságaiból, akkor ez nem lesz egy nehéz vizsga . A jogosultságok kérdések voltak kissé kínosak nekem, rászálltak a secura az sql servernél is, tessék jól megtanulni (én is meg fogom, de valljuk be, ezek k. unalmas dolgok, még, ha életbevágóan fontosak is.)

MCP#++ Yoda képző 3 milláért

Wednesday, July 30th, 2008

Ha kevés az MCP, van jobb: Certified Master program.

Ehhez szükséges egy 18500$-os képzés Redmondban. Ezt így most kihagyom. :)

Egy főjoda oktató:
“our ‘storage building blocks’ module has been taught by an individual who has dealt with hard drives and the surrounding technology for 30 years. He is a storage architect leveraged extensively across our company, and can analyze SCSI commands on the wire (which happen to fly by in nanoseconds, never mind milliseconds) in addition to being very future looking from a high level perspective.”

Hobbifeljelentők, hazug média, fenyegetett mentősök, stb.

Wednesday, July 30th, 2008

Mivel a blogomban a jövőben igyekezek politikailag korrekt lenni, nem nagyon kommentálom az alábbi híreket:

Egyik nap:
Megrugdosták a mentősöket Bicskén
Másnap:
Nem rugdosták meg a mentősöket Bicskén

Szóval emberek, Magyarországon senki nem bántja a mentősöket, ezek csak kósza hírek, ne higgyétek el senkinek. Inkább vegyetek fel sok hitelt, higgyetek az állami nyugdíjban, nézzétek győzikét, és igyátok az olcsó tesco sört. A mentősök meg hazudozzanak tovább kedvükre, most már úgyse hiszünk nekik, örüljenek, hogy van olyan szuper munkájuk, ahol a házinép még segít is nekik, kereken hárman!
Komoly baj van kis hazánkban.

Update: ez egy ironikus írás, nem szó szerint kell érteni.

Vista memóriakezelési furcsaság

Monday, July 28th, 2008

Időnként annyira belassul a Vista alatt a munka, hogy néha már veszélyben volt a laptop fizikai léte. :)
2G RAM, DCE kikapcsolva, semmi üveges tekintetű ablak. Amikor ennyire lassú a gép, akkor a következő kép látszik a Task Managerben:

A Task Manager híres arról, hogy a benne látható memóriaértékeket fenntartásokkal kell kezelni, de az ábra alapján azt gondolnám feleslegesen 1 G RAM-ot elrabol cache céljára, cserébe a gép majd szétesik a page-eléstől, mert a 1G-ba tényleg nem fér bele minden futtatott app. Félreérthető a TM által mutatott érték, vagy túlzabálja magát a Vista cache? A Superfetch már ki van kapcsolva, és az indexer is, ezekről írják, hogy szeretik unalmukban szétenni a vinyót.

Update: némi magyarázat. Nem zabája a RAM-ot, hanem használja, cache céljára (hasonlóan, mint a SQL Server). Akkor viszont azért lassú a gép, mert több mint 2 G ramot esznek együtt az appok, így page-elni kell. Erről még nem vagyok meggyőződve, de ebből ez következik.

Update2: semmi furcsaság nincs a dologban, én voltam a tudatlan.
Inside the Windows Vista Kernel: Part 2

No, ez egy durva vizsga: 71-660 Windows Internals

Monday, July 28th, 2008

Lehet, hogy egy év múlva nekigyürkőzök ennek, egyelőre most esélytelen lennék.

Ami kellemetlen, hogy az SQL 2008 beta vizsgákra csak most eszméltem fel, és már csak 31-éig élnek. Nem biztos, hogy már eljutok, ha egyáltalán van még hely.

Vista folder virtualizáció takarítás – szabad ilyet?

Wednesday, July 23rd, 2008

Nem tudom, mennyire ismert az a tény, hogy az Vista UAC bekapcsolt állapota mellett ha egy butus program egyes védett területekre, úgymint winroot, program files vagy program data akar írni, akkor az írási kérelmet átirányítják a virtualizált megfelelőikbe, amelyek nálam itt laknak:

C:\Users\zsolt.soczo\AppData\Local\VirtualStore\

Eme kedves könyvtár mérete nálam 10 GB. Kicsit szétnézve benne azt találtam, hogy jó sok fájl benne teljesen azonos az eredetivel, azaz teljesen felesleges, hogy a virtualstore-ban fogja a helyet.
Szisztematikusan meg kellene keresni, és kitörölni ezeket.
Nosza, mivel 5 perc guglizással nem találtam erre specializálódott programot, írtam egyet.
Összeveti az eredeti és a virtualizált verziót, és ha kérjük, kitörli a duplikált virtualizáltakat.
Mielőtt kipublikálnám a kódot, és megölnétek, hogy szétcsaptam a gépeteket vele megkérdem: stimmel az elmélet? A tartalomra azonos, de dátumra nem feltétlen azonos duplikált fájlokat a virtual store és az eredeti hely között a virtual store-ból ki lehet törölni büntetlenül?

Hmm?

Update: bátor vagy botor módon takarítottam, nem állt meg tőle az élet, de látom szépen, sorban pakolnak vissza mindent a programok. Szélmalomharc.

Isten szerepe napjainkban – Bálint szerint

Sunday, July 20th, 2008

Mivel Isten már megteremtette a világot nem kell neki földet hordania, ezért most segít az önkormányzatnak kirakni a közlekedési táblákat és a közvilágítást.

Scott Hanselman – The Weekly Source Code

Friday, July 18th, 2008

A legutóbbi msdn magazinban nézelődve láttam, hogy hivatkoznak Scott gyerek sorozatára. Mivel az ő blogjára már pont nem voltam feliratkozva (régebben a SharpReader miatt fenn voltam), nem értesültem róla.
No, ő sok kódot olvas, elvégre a MS azért vette fel vagy 2 éve, hogy takarítsa ki a fw. kódját, mielőtt kiadják az egészet.
A “The Weekly Source Code” sorozatában érdekes kódokat boncolgat, érdemes végigmenni rajtuk, aki szereti más kódját olvasni. Steve McConnell (gondolom nem kell bemutatni) szerint az egyik legjobb kódírás tanulási mód ez, mások kódját olvasni.

Például a 27. részben a reflection helyett mutat egy sokkal gyorsabb kódgenerálós dinamikus property elérést, vagy IIS7 (nem tévedés!) hosztolását saját processzben.

Amint lesz időm-erőm nézem a többi részt is, ha találok valami érdekeset, leírom.

SQL Server 2008 Analysis Services Windows Server 2008-on vs. Windows Server 2003-on

Thursday, July 17th, 2008

Habár nem értek az Analysis Serviceshez (még, az SSIS után ez a következő falat), de ez a cikk igen érdekes. Nem annyira az SQL-es, inkább az operendszeres vonatkozásai miatt.
Az átlagfelhasználó az új Windowsokból csak az új shellt tapasztalja meg, meg, hogy több ram kell nekik. Ennek ellenére a háttérben keményen fejlesztik a rendszer magját, csak az nem annyira látványos, még, ha igen hasznos is.
A cikkben arról beszélnek, hogy a Windows 2008-ban új memóriakezelő van, ami sokkal jobban kezeli a sok, apró memóriafoglalást. Ez azonnal látszik, ha az Analysis Services-szel dolgoztatunk fel jelentős mennyiségű adatot, a 2008-on kapásból dupla olyan gyors lett a feldolgozás (tudom, minden teszt csal, de nem hiszem, hogy nagyot hazudnának).
A szerviznek meg lehet mondani, hogy előre allokálja le a memóriát, így 2003-on is hasonló teljesítményt érhetünk el, mint 2008-on.

Az egészből számomra az az érdekes, hogy gyorsabb Windows 2008-ban a memóriakezelés, amiből bármilyen app profitálni fog. Megvettük. :)

Előkép (thumbnail) generálás szakosan

Wednesday, July 16th, 2008

A .NET illetve a GDI+ alapban gyors de ronda munkát végez ezen a téren. Ez a kis bejegyzés sok képpel demonstrálja, melyik optimalizált algoritmus milyen képet eredményez.
Én a legjobbak között nem sok különbséget láttam nagyítás nélkül, de a legrosszabb és a jobbak között azért jól észlelhető a minőségdiff.

C++ linker elszállás elleni gyógyír

Saturday, July 12th, 2008

A VS 2008-ra áttérés nekem nagy csalódás volt, mert a C++ fordítás során gyakran elszállt a linker, csúnya belső hibákkal. Az inkrementális linkelés kikapcsolása időlegesen megoldotta a dolgot, de azért egy fatális hiba a linkerben az nem szép dolog, és az Edit and Continue-s debugoláshoz meg kell ez a fajta linkelés.

Szerencsére már elég régóta van rá gyógyír, csak én most vettem észre. Eddig úgy tűnik segít, de majd a jövő héten jobban kiderül, amikor intenzíven használom.

Line of Business (formos izé) alkalmazás WPF-ben?

Friday, July 11th, 2008

Bár nem erre találták ki, sokan mégis kacsingatnak felé, hátha végre WinForms helyett be lehetne vetni.
Az alábbi videó első kb. 25 percében bemutatnak egy közel készre fejlesztett WPF nagyvállalati (aka. enterspájz) appot. Nem vadultak be nagyon, de szép UI-t raktak össze.
Két érdekes infót említett meg az ürge. Az egyik, hogy szinte minden több elemet tartalmazó interfészt template-elt ListBox-szal valósítottak meg. Még azokat a kis cetliket is a jobb oldalon, érdemes megnézni.
A másik, hogy azt mondják elvileg nincs akadálya átrakni az appot a kistesóra, Silverlight-ra, így aztán már szinte egyből a Software as a Service-ben találjuk magunkat.

Inside SQL Server 2008 könyvek jövő februárban

Friday, July 11th, 2008

Ezt már egy komplett focicsapat írja, de végül is elég nagy a téma.

DTS-ről SSIS-re konverziós gyík

Friday, July 11th, 2008

Elég jó, nem sok minden van benne, de ami van, az jó.
Kár, hogy a szerző nem szereti az IDisposable-t.

Amúgy most már elég sokat foglalkoztam az SSIS-sel, és azt mondom, tetszik. Eddig távol tartottam tőle magam, lustaságból. Most viszont olvasgatom a Pro SQL Server 2005 Integration Services könyvet, közben kattogok néha, és tetszik, okos dolog ez az eszköz.

Küzdelem az SQL Server 2008 RC0 telepítővel (debug war)

Wednesday, July 9th, 2008

Hetek óta nincs SQL Serverem (jó, időm se volt), mert nem ment fel az RC0. Egyes komponensek nem mentek fel, pl. a database engine, ami azért hiányzott.
A probléma oka nyilvánvalóan az volt, hogy fenn volt előtte a februári CTP, ami odaganézott a merevlemezre ide-oda.
Ezért bőszen nekiálltam feszítővassal, lángvágóval, és kiszedtem az általam azonosított maradványokat a registryből, a fájlrendszerből, gacból. Erre ilyen hiba kezdett jönni:

2008-07-08 22:19:22 Slp: Microsoft.SqlServer.Setup.Chainer.Workflow.ActionExecutionException: MsiGetProductInfo failed to retrieve ProductVersion for package with Product Code = '{7D3F6746-94DE-4E1F-94F9-933B68EB68C4}'. Error code: 1605. ---> System.InvalidOperationException: MsiGetProductInfo failed to retrieve ProductVersion for package with Product Code = '{7D3F6746-94DE-4E1F-94F9-933B68EB68C4}'. Error code: 1605.
2008-07-08 22:19:22 Slp:    at Microsoft.SqlServer.Configuration.MsiExtension.SetFeatureInstallStateAction.FillInstallPropertyByProductCode(PackageInstallProperty pkg, String prodCode)
2008-07-08 22:19:22 Slp:    at Microsoft.SqlServer.Configuration.MsiExtension.SetFeatureInstallStateAction.FillInstallProperty(PackageInstallProperty pkg)
2008-07-08 22:19:22 Slp:    at Microsoft.SqlServer.Configuration.MsiExtension.SetFeatureInstallStateAction.ExecuteAction(String actionId)
2008-07-08 22:19:22 Slp:    at Microsoft.SqlServer.Chainer.Infrastructure.Action.Execute(String actionId, TextWriter errorStream)
2008-07-08 22:19:22 Slp:    at Microsoft.SqlServer.Setup.Chainer.Workflow.ActionInvocation.InvokeAction(WorkflowObject metabase, TextWriter statusStream)
2008-07-08 22:19:22 Slp:    at Microsoft.SqlServer.Setup.Chainer.Workflow.PendingActions.InvokeActions(WorkflowObject metaDb, TextWriter loggingStream)

Google nem adott kézzelfogható eredményt.

Reflectorral megnéztem, mi történik ezekben a metódusokban?

private void FillInstallPropertyByProductCode(PackageInstallProperty pkg, string prodCode); 
Declaring Type: Microsoft.SqlServer.Configuration.MsiExtension.SetFeatureInstallStateAction 
Assembly: Microsoft.SqlServer.Configuration.MsiExtension, Version=10.0.0.0 

Ez a kód a gyanús benne:

errorCode = MsiNativeMethods.MsiGetProductInfo(pkg.ProductCode, “Language”, lpValueBuf, ref capacity);
if (errorCode != 0)
{
throw new InvalidOperationException(SR.MsiGetProductInfoFailedToRetrieveProductVesrionByProductCode(pkg.ProductCode, errorCode));
}

Ismer valami ProductCode-ot, ennek akarja lekérni a verzióját, de nem sikerül, mert kézzel már leirtottam a darabjait.

Honnan veszi a beteg ProductCode-ot? CTRL-R, analyze. Itt hívják meg a fenti metódust:

private void FillInstallProperty(PackageInstallProperty pkg);

Ebben:

installedProductCodeList = this.msiMetadata.GetInstalledProductCodeList(packageAttributes);
if ((installedProductCodeList != null) && (installedProductCodeList.Count > 0))
{
this.FillInstallPropertyByProductCode(pkg, installedProductCodeList[0]);
}

Szóval a GetInstalledProductCodeList adja vissza a rossz prod code-ot. Ő belül ezt hívja meg:

errorCode = MsiNativeMethods.MsiEnumRelatedProducts(packageUpgradeCode, 0, iProductIndex, lpProductBuf);

MsiEnumRelatedProducts, ez adja vissza a baromságot. Ez már natív függvény, az MSI.DLL-ben. Elő a debuggerrel! Nem, nem a VS-re lesz szükség, az kis gyík a nagytesóhoz, a WinDbg-hez képest, ehhez az kevés.

UINT MsiEnumRelatedProducts(
  __in   LPCTSTR lpUpgradeCode,
  __in   DWORD dwReserved,
  __in   DWORD iProductIndex,
  __out  LPTSTR lpProductBuf
);

WinDbg-vel töréspont beállít a fenti függvényre. A törésponthoz be lehet állítani akciót a WinDbg-ben, ebben kiíratom a függvény első és 4. paraméterét, az 1-re keres rá, a 4.-ben jön vissza a baromság.

bu msi!MsiEnumRelatedProductsW+0x64 "du poi(esp+0x4);du poi(esp+0x10);g"

Ez a breakpoint szintax. Breapoint Unresolved (szimbolikus, futás közben oldja fel), az msi.dll MsiEnumRelatedProductsW függvényére, de nem a belépési pontjára, hanem 64h offsettel hátrébb (ez a függvény ret utasítása, azért ez kell, mert itt már ki van töltve a 4. paraméter).
Az akció rész idézőjelek között van, ez fut le, ha becsap a töréspont. du: dump unicode data. A poi feloldja az ESP+4 címet, onnan írjuk ki a stringet. Ugye ESP a visszatérési címre mutat, ESP+4 az első paraméterre, ami egy LPCTSTR, esetünkben LPCWSTR, ezt oldja fel a poi, a du meg kííratja. A 10h címen van a 4. paraméter. A g parancs futtatja tovább a kódot, azaz a töréspont valójában csak kiírja a számomra szükséges infókat, és a program fut tovább.

{65A00972-4629-4343-AAF7-9C35CE25CD84} erre kérdeznek rá, és {7D3F6746-94DE-4E1F-94F9-933B68EB68C4} rá a válasz, pont, ami a hibaüzenetben is jött.

No, honnan a francból szedi fel a 65A00972… GUID-ot? Bármennyire is bosszantó, se a fájlrendszerben, se a registryben nem találtam meg azt a kódot. Fukk.

Elő a procmonnal. Ugye az a gond, hogy detektál valami darabkát egy korábbi verzióból, de az MSI-ket már nem leli hozzá. Beállítottam szűrési feltételt, hogy a setup100.exe process név és a Path tartalmazza az UpgradeCode stringet. Kiderült, hogy miután megtalálja ezt:
HKEY_CLASSES_ROOT\Installer\UpgradeCodes\27900A5692643434AA7FC953EC52DC48
leáll a telepítés. Ezek szerint ez valami korábbi SQL Server verzió darabja lehet. Átneveztem ezt kicsit, hogy ne találja meg a telepítő. Ettől továbbment a telepítő, de befagyott. Kiirtottam az összes keresett UpgradeCode-ot és voalá, sikeresen felment a szerver.

Finnyás egy kis köcsög lett ez a verzió. Jó, tudom, nem illik szétszabni kézzel a registry-t, de akkor is. :)

Telefon rossz volt

Tuesday, July 1st, 2008

Az utóbbi kb. 1 hétben nem nagyon tudott senki elérni, mert döglődött a telefonom, elnézést érte.
Most kaptam egy pótot Jani barátomtól, újra lehet hívni.