Author Archives: Robert Haken

avatar Neznámé

About Robert Haken

Software Architect, Founder at HAVIT, Microsoft MVP - ASP.NET/IIS

Exchange Management Shell vůči Office365

Pro slabo-poweshellisty, jako jsem já, si zapisuji postup, jak si z PS připojit session na cloudové Office365:

Podle potřeby:
>Set-ExecutionPolicy Unrestricted

>$LiveCred = Get-Credential

>$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook
.com/powershell/ -Credential $LiveCred -Authentication Basic -AllowRedirection

>Import-PSSession $Session

>...

Přihlašovací údaje je samozřejmě potřeba zadat ty z Office365.

CLR Profiler, WinDbg a SOS při diagnostice memory-leaků

Problémem rychlého prozkoumávání velkých memory-dumpů v WinDbg/SOS je, že většinu zkoumání provádíme nad jednotlivými instancemi objektů. Vytipujeme si závadný typ (!dumpheap -stat) a pro pár instancí (!dumpheap -mt <MT>) zkoumáme, odkud pocházejí (!GCRoot <ObjAddr>). Pokud nemáme dost štěstí, po pár pokusech (které mohou být navíc při velkých memory-dumpech dosti časově náročné), nás to přestane bavit.

Nástrojem, jak provést v takovém případě hromadnou analýzu a pohlédnout na heap určitým agregovaným pohledem, je například CLR Profiler a jeho Heap Graph:

Ukazuje nám, jak na sebe jednotlivé typy navzájem referencují, a to vše v poměru k velikosti paměti (included, tedy včetně grafu referencovaných instancí). Vše je seskupeno po typech, nezabýváme se tedy jednotlivými instancemi.

Jak se k tomu dopracovat, mám-li memory dump

Z WinDbg/SOS je potřeba si vytvořit LOG-soubor pro CLR profiler pomocí příkazu

!TraverseHeap C:\output-path\name.log

…to samotné může nad velkým memory-dumpem hooodně trvat. Podle stroje a dumpu až hodiny. Na rozdíl od čekání na !GCRoot však dostanete výstup, který vás k cíli téměř jistě navede.

Následně již soubor načteme do CLR Profileru pomocí File / Open log file…

…zase čekáme a čekáme :-))

A na dialogu Summary for zvolíme Heap Graph

image

…čekáme a čekáme, až dostaneme třeba:

SNAGHTML96fdfd

Cache není nikdy dost ;-)

Mimochodem CLR Profiler nám dá i další zajímavé histogramy, které nám pomohou k pochopení poměrů v analyzovaném memory-dumpu. O nich možná někdy příště…

Viz též

WinDbg/SOS trik: Klikatelný výstup (DML)

Práci s  WinDBG/SOS lze zpříjemnit malým trikem. Pokud za název příkazu (většina to podporuje) připojíte přepínač /d, bude výstup klikatelný (spustí příkaz, který odpovídá prozkoumání daného cíle dle jeho typu):

image

Pokud se nám nechce /d za každý příkaz psát, můžeme ho zapnout globálně:

.prefer_dml 1

Vypnout lze samozřejmě nulou.

Oficiálně se to celé jmenuje „Debugger Mark Up Language“ (DML).

ClrMD: Nalezení statických rootů při analýze .NET memory-dumpu

Používáme-li WinDbg a jeho rozšíření SOS.dll (popř. SOSEX nebo PSSCOR4) k analýze memory-dumpu .NET procesů, pak jednou z komplikovanějších úloh je například nalezení statických rootů, tedy statických fieldů, které drží reference na prozkoumávanou instanci.

Že se jedná o zarootování instance ze statického fieldu je zpravidla zřejmé z výstupu !GCRoot, který pak vypadá například nějak takto:

0:000> !GCRoot 0000000acaf3e8f8 
HandleTable:
    0000000f159f19f8 (pinned handle)
    -> 0000000ec87f1be8 System.Object[]
    -> 0000000d11ac08c8 System.Action
    -> 00000010f5df1020 System.Object[]
    -> 0000000acaf3e8f8 System.Action

Found 1 unique roots (run '!GCRoot -all' to see all roots).

.NET si drží hodnoty statických fieldů v systémových object[] polích, nicméně dohledat, který konkrétní statický field je naším rootem, už není tak jednoduché (obvykle skončíme ve WinDbg u s-d nebo s-q prohledávání paměti a hledání další reference, atp.).

ClrMD: Microsoft.Diagnostics.Runtime

Naštěstí existuje a z NuGet se dá snadno nainstalovat .NET knihovna Microsoft.Diagnostics.Runtime (zkráceně ClrMD), která umožňuje inspekci a analýzu memory-dumpu z .NET kódu obdobně jako byste pracovali s SOS ve WinDbg.

…a jednou z věcí, které lze pomocí ClrMD snadno dostat je právě identifikace statického fieldu, který je rootovou referencí na prozkoumávaný objekt:

DataTarget dataTarget = DataTarget.LoadCrashDump(@"D:\path\to\memory-dump.DMP");
ClrRuntime runtime = dataTarget.CreateRuntime(@"D:\path\to\mscordacwks.dll");
ClrHeap heap = runtime.GetHeap();

foreach (ClrRoot root in heap.EnumerateRoots())
{
	if (root.Object == 0x0000000d11ac08c8) // adresa rootu, který chceme prozkoumat
	{
		// jen pro ukázku třeba:
		Console.WriteLine(root.Kind);
		if (root.Kind == GCRootKind.StaticVar)
			Console.WriteLine(root.Name);
	}
}

Pracujeme ideálně paralelně s WinDbg+SOS:

  • do CreateRuntime() dáváme cestu k příslušnému mscordacwks.dll, z WinDbg získáme přes .cordll -ve -u -l
  • adresu prozkoumávaného rootu známe z WinDbg (první po System.Object[], viz výše uvedený příklad z !GCRoot)
  • výše uvedený snippet stačí prsknout do ConsoleApp, do které nareferencujeme ClrMD z NuGet
        • je potřeba nastavit Build / Platform Target na x86 nebo x64, podle toho, z jaké platformy pochází memory-dump

Zkušenosti s přechodu na TFS a agilní techniky – záznam a slides [WUG Praha 1/2015]

Slides z přednášky 15.1.2015 pro Windows User Group Praha (WUG), kde jsme s kolegou Jirkou Kandou povídali i našich zkušenostech z přechodu HAVITu na TFS a agilní techniky (v období 08/2012 až 12/2014):

Z přednášky jsem pořizoval záznam, který najdete na našem HAVIT YouTube Channelu:

Omluvte sníženou kvalitu zvuku záznamu, nahrávali jsme tentokrát na dva různé mikrofony a výsledný záznam je sestřihán ze dvou různých zvukových stop (jedna z mikrofonů navíc nebyl zřejmě úplně ideálně umístěn a chytal nežádoucí ruchy).

iTunes (+Match) – nelze změnit Media Kind (např. na Audiobook)

Pro hudbu a audioknihy používám iTunes. Protože mám iTunes Match, cpu do toho všechny CD, co se nám doma objeví. iTunes si je grabnou do M4A a uloží do Library. Ještě do „nedávna“ šlo měnit po nacucnutí CD pomocí Get Info volbu Media Kind (sekce Options), přičemž po přepnutí na Audiobook se album přesunulo ze sekce Music do sekce Audiobooks.

Dneska jsem zjistil, že volba Media Kind mi nabízí jedinou možnost: Music. Naimportované CD s pohádkami se mi nedaří dostat mezi Audiobooks.

Nakonec se ukazuje, že to je jakési nové chování iTunes, které se projevuje ve spojení s aktivním iTunes Match, kdy nelze Media Kind změnit.

Workaround: Stačí na chvilku vypnout iTunes Match (menu: Store / Turn Off iTunes Match), potom lze Media Kind změnit. Následně iTunes Match reaktivovat. To mi funguje.

Někdo další radí založit druhou Library bez napojení na iTunes Match, do ní si grabovat, nastavit Media Kind a další tagy a následně odtud hrnout do hlavní Library.

Jak vypnout automatické stmívání LCD panelu notebooku při tmavých obrazech

Už pěknou dobu mě štve, že můj notebook při tmavých obrazech (například Visual Studio bez otevřeného souboru) automaticky stahuje intenzitu podsvícení, což zhoršuje čitelnost a po změně obrazu na světlý mu několik vteřin trvá, než se zadaptuje zpět.

Je mi jasné, že to je hlavně kvůli úspoře baterie, ale proč to dělá i na AC adaptéru, to nevím. Každopádně mě to štve natolik, že jsem se to snažil od počátku nějak vypnout. Celkem rychle jsem se (chybně) dogooglil k nastavení Intel HD Graphics, které by to mělo být:

image

Po opakovaných neúspěšných pokusech s tímto nastavením jsem si to pro sebe uzavřel s tím, že mám holt smůlu a vypnout se mi to nepodaří. (Nakonec se ukázalo, že musí být vypnuté i toto, resp. alespoň v poloze „max. jeden dílek od Maximální kvality“).

Dnes mě to po delší době zase rozběsnilo, tak jsem pátral znovu. Nakonec jsem se dopátral k volbě, která zabírá, a kterou se to dá opravdu vypnout:

image

Nakonec se ukazuje, že vypnout je potřeba obojí. Volba přes Windows Power Options je výrazně agresivnější, nicméně i s jejím vypnutím se stále trochu obraz stmívá (není už to poznat ve Visual Studiu, ale třeba SnagIt, který je celý černý, tak nakonec intenzitu stáhne). Teprve po vypnutí na obou místech přestane stmívání úplně. Různou kombinací voleb lze určitě dosáhnout i přijatelného kompromisu mezi spotřebou a koukatelností.

.NET Memory Internals 2/2 – Heap, Garbage Collector – záznam, slides a dema [MS Fest Praha 2014]

Slides z mé přednášky 30.11.2014 pro konferenci MS Fest Praha:

Z přednášky jsem pořizoval záznam, který najdete na našem HAVIT YouTube Channelu:

.NET Memory Internals 1/2 – záznam, slides a dema [MS Fest Praha 2014]

Slides z mé přednášky 29.11.2014 pro konferenci MS Fest Praha:

Z přednášky jsem pořizoval záznam, který najdete na našem HAVIT YouTube Channelu:

Jak dělám záznamy svých přednášek pro YouTube

Od určité doby nahrávám veškeré své přednášky pro HAVIT YouTube Channel. Nenahrávám stage, ale jen obrazovku a audio.

Základní setup je jednoduchý…

Short Story

Záznam obrazovky pomocí Camtasie, audio nahrávám pomocí klopového mikrofonu do iPhonu, v Camtasii to spojím v bodě tlesknutí a vyexportuju do MP4 pro YouTube.

TechSmith Camtasia pro záznam obrazovky

image

Konkrétně Camtasia Recorder:

          • v režimu Full Screen
  • se záznamem z vestavěného mikrofonu v notebooku (je dobré si dopředu vyzkoušet) – pro některé „nepohyblivé“ přednášky stačí, jinak mi poskytuje synchronizační klapku se samostatným audiozáznamem (viz dále)
  • jediná záludnost – nesmíte pustit Camtasia Recorder, dokud se nepřipojíte na projektor a neusadíte si rozlišení. Jinak se můžete dočkat nepříjemností, jako já letos na brněnském MS Festu. Jak jsem dodatečně analyzoval, zapnutý Recorder blokoval změny rozlišení, a mě se zoufale v časovém presu nedařilo s projektorem uspokojivě skamarádit.
  • licenci Camtasie mám jako MVP od TechSmith bezplatně, alternativně lze použít Windows Media Encoder (ale sám jsem nikdy nezkoušel).

Rode smartLav mikrofon + iPhone pro záznam zvuku

image

Velmi kvalitní „klopový“ mikrofon:

  • v zapojení do iPhone telefonu (pro přednášku vždy přepínám do Flight modu),
  • se záznamem do aplikace Rode Rec (ale úplně v pohodě to fungovalo i do předinstalované aplikace Diktafon)
  • nahrávám v nastavení 11025 Hz, Mono (vychází to kolem 20 MB/hod),
  • mikrofon nedávat ke krku, ale spíš někam na prsa/solar, citlivý je dost,
  • důležité je před záznamem nastavit/zkontroloval leveling záznamu, obvykle je citlivost vytočena na maximum, a pokud by se to nechalo, záznam bude téměř nepoužitelný (Jednou jsem musel použití i původní obyčejný záznam z vestavěného mikrofonu notebooku, když jsem na toto zapomněl). Je potřeba stáhnout citlivost tak, aby se při mluvení nedostával ukazatel do červené zóny.
  • výstup si přes File Sharing do formátu AAC (.m4a), stahuji z iPhone přes iTunes (starší verze Camtasie M4A neuměly, bylo potřeba to prohnat přes iTunes do MP3, nyní už to jde přímo),
  • stačil by zřejmě i mnohem obyčejnější mikrofon a jakékoliv jiné záznamové zařízení k němu, které vám umožní volný pohyb. Michal Altair Valášek třeba používá stejným způsobem diktafon SONY, který položí někam zhruba do první řady.

Sestříhání v Camtasia Studiu

Celý trik následného spojení v Camtasia Studiu spočívá v použití synchronizační klapky (stejný princip, jako u filmu), v amatérských podmínkách tedy tlesknutí/lusknutí, nebo podobném zvuku na začátku záznamu, který zobrazí na audio-křivce špičku.

image

Následně je potřeba zahodit méně kvalitní audio ze záznamu obrazovky, tj. rozpojit obraz od audia (pravé tlačítko myši na stopě + Separate video and audio), stejně tak zahodit track System Audio (pokud tam speciálně něco nemáte).

Obvykle dávám ještě:

  • Enable noise removal (Adjust sensitivity = 40-50)
  • někdy pomáhá Enable volume leveling, pokud nebyl dobře nalevelovaný mikrofon při záznamu.

Produkce MP4 pro YouTube

Dle instrukcí, které jsem našel přímo na webu na YouTube a zkombinoval s vlastními požadavky, používám obvykle nastavení produkce (ve finále koukám jiné, než YouTube doporučuje :-)):

  • Editing Dimensions (= Recording Dimensions)
  • Format = MP4
  • bez Controlleru
  • ostatní nechávám default (Frame Rate = automatic, …)

Dostanu MP4 soubor (obvykle cca 100-200MB), který si archivuji a nahraju na YouTube. Zdrojové soubory nakonec zahazuji.

Na YouTube ještě většinou nahrávám vlastní „miniaturu“. První slide uložím z PowerPointu jako PNG (File / Save As…) a doplním ho v Paint.NET na velikost 1280×720 (rozměr dle doporučení YouTube).