Category Archives: Development

SQL Server ignoruje DEFAULT_SCHEMA pro uživatele v roli sysadmin

SQL Books online (dnes vlastně TechNet nebo spíš už dokonce MSDN) jsou nekompromisní:

The value of DEFAULT_SCHEMA is ignored if the user is a member of the sysadmin fixed server role. All members of the sysadmin fixed server role have a default schema of dbo.

Primárně je samozřejmě špatně se na DEFAULT_SCHEMA spoléhat, nicméně při práci na starším projektu mě to překvapilo, když jsem dal uživateli sysadmin roli a najednou mi to přestalo nacházet objekty v DB.

WatiN: Could not load file or assembly Interop.SHDocVw

Pokud by vás WatiN po instalaci z NuGetu obšťastnil hláškou ve stylu

Unhandled Exception: System.IO.FileLoadException: Could not load file or assembl y ‚Interop.SHDocVw, Version=1.1.0.0, Culture=neutral, PublicKeyToken=db7cfd3acb5 ad44e‘ or one of its dependencies. The located assembly’s manifest definition do es not match the assembly reference. (Exception from HRESULT: 0x80131040) File name: ‚Interop.SHDocVw, Version=1.1.0.0, Culture=neutral, PublicKeyToken=db

…pak je potřeba na referenci Interop.SHDocVw nastavit v Properties volbu „Embed Interop Types“ na false:

imageimage

Jinak si zkouším hrát s WatiN-em. Máte s tím někdo zkušenosti? Výhody/nevýhody proti Visual Studio Coded UI Test (mimo licenčních)?

IIS Express: Managed Pipeline Mode – Classic

Pokud je Vaše aplikace psána pro Classic Managed Pipeline Mode, potom při standardním spuštění nad IIS Expressem dostanete krásnou chybku:

HTTP Error 500.22 – Internal Server Error

An ASP.NET setting has been detected that does not apply in Integrated managed pipeline mode.

image

Mě to potkalo u přechodu z VS2012 (kde jsem aplikaci pouštěl nad vestavěným Cassini) na Visual Studio 2013, kde je již jenom IIS Express. Přepínač je lehce ukryt, najdete ho v Properties projektu webové aplikace:

image

SQL DMV: Most Expensive Queries, Missing Indexes

Kolem Database Management Views a jejich využití pro SQL performance diagnostics toho napsáno tuny, ale právě tato kvanta různých zdrojů uvádějí spousty různě kvalitních podob dotazu pro Most Expensive Queries.

Nebaví mě pokaždé hledat ten správný, nebo ho dokonce vymýšlet, proto si zde archivuji mojí oblíbenou podobu:

-- Most expensive queries
SELECT TOP 20
	SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1,
		((CASE qs.statement_end_offset
			WHEN -1 THEN DATALENGTH(qt.TEXT)
			ELSE qs.statement_end_offset
			END - qs.statement_start_offset)/2)+1)
		AS query_text,
    db.name AS [db_name],
    qs.total_elapsed_time/1000 AS total_elapsed_time_ms,
    qs.total_elapsed_time/qs.execution_count/1000 AS average_elapsed_time_ms,
    qs.last_elapsed_time/1000 AS last_elapsed_time_ms,
    qs.execution_count,
    qs.total_worker_time/1000 AS total_worker_time_ms,
    qs.total_worker_time/qs.execution_count/1000 AS average_worker_time_ms,
    qs.last_worker_time/1000 AS last_worker_time_ms,
    qs.last_execution_time,
    qs.total_logical_reads,
	qs.last_logical_reads,
    qs.total_logical_writes,
	qs.last_logical_writes
    --qp.query_plan
    FROM sys.dm_exec_query_stats qs
        CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
        CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
        LEFT JOIN sys.databases db ON (qt.dbid = db.database_id)
    -- WHERE db.name='DatabaseName'
    -- ORDER BY qs.total_logical_reads DESC
    -- ORDER BY qs.total_logical_writes DESC
    -- ORDER BY qs.last_worker_time DESC -- CPU time (active)
    -- ORDER BY qs.last_elapsed_time DESC -- clock time (včetně čekání na locky, atp.)
    -- ORDER BY qs.total_worker_time DESC
	ORDER BY qs.total_elapsed_time DESC

…a rovnou přidávám už méně používaný dotaz pro chybějící indexy (varuji před zkratkovitou úvahou, že tyto indexy je nutné přidat):

SELECT
	mid.statement
	  ,migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) AS improvement_measure,OBJECT_NAME(mid.Object_id),
	  'CREATE INDEX [missing_index_' + CONVERT (VARCHAR, mig.index_group_handle) + '_' + CONVERT (VARCHAR, mid.index_handle)
	  + '_' + LEFT (PARSENAME(mid.statement, 1), 32) + ']'
	  + ' ON ' + mid.statement
	  + ' (' + ISNULL (mid.equality_columns,'')
		+ CASE WHEN mid.equality_columns IS NOT NULL AND mid.inequality_columns IS NOT NULL THEN ',' ELSE '' END
		+ ISNULL (mid.inequality_columns, '')
	  + ')'
	  + ISNULL (' INCLUDE (' + mid.included_columns + ')', '') AS create_index_statement,
	  migs.*, mid.database_id, mid.[object_id]
	FROM sys.dm_db_missing_index_groups mig
		INNER JOIN sys.dm_db_missing_index_group_stats migs ON migs.group_handle = mig.index_group_handle
		INNER JOIN sys.dm_db_missing_index_details mid ON mig.index_handle = mid.index_handle
	WHERE migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) > 10
	ORDER BY migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) DESC

Visual Studio 2013 RTM ke stažení z MSDN

Visual Studio 2013 je ke stažení z MSDN, není co dodat.

Optimalizace webových aplikací ASP.NET – záznam, slide a dema [MS Fest 2013]

Slide (jeden) a dema z mé dnešní přednášky pro MS Fest 2013 v Brně:

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

Databáze zůstane viset ve stavu „Restoring“

Pokud Vám zůstane databáze z jakéhokoliv důvodu viset ve stavu Restoring, znamená to, že sled předcházejících událostí SQL server interpretoval jako nedokončenou snahu o obnovení databáze. Legitimně se v tomto stavu databáze nachází, pokud chcete např. přehrát nad obnovenou zálohou ještě transaction-logy, atp.

Pokud tento stav pro Vás není žádoucí, nic dalšího už nechcete udělat a potřebujete databázi oživit, potom pomůže

RESTORE DATABASE MyDatabase WITH RECOVERY

…kde MyDatabase pochopitelně nahradíte názvem své DB.

SQL: Jsou dvě data (small)datetime ze stejného dne?

Potíž je v tom, že typ (small)datetime obsahuje mimo údaje data i čas. Můžeme samozřejmě zařídit, aby naše záznamy měly tento čas 00:00, ale stejně občas na tento problém narazíme.

Měli bychom rozlišit dvě situace, porovnávání s pevným dnem, nebo hledání shod ve variabilních datech.

Hledání shod ve variabilních datech

Jsme zde v situaci, kdy obě porovnávané složky jsou variabilní, u obou se musíme vypořádat s ignorováním složky dne.

SQL Server 2008 a novější verze mají datový typ date. Pokud tedy nejsme zrovna na nějaké pravěké verzi SQL, ukazuje se jako nejrychlejší (ač možná překvapivě) tato konverze:

SELECT MyColumn FROM MyTable
	WHERE CONVERT(date, DateColumn1) = CONVERT(date, DateColumn2)

Pro starší verze SQL serveru je použitelných několik o dost méně výhodných (pomalejších) podob. Protože SQL 2005 a starší již dnes považuji za pravěk, nebudu již rozebírat jejich výhody/nevýhody a rychlost:

...
WHERE
   (YEAR(Datum1) = YEAR(Datum2)
   AND (MONTH(Datum1) = MONTH(Datum2)
   AND (DAY(Datum1) = DAY(Datum2)

WHERE 
   (YEAR(Datum1) = YEAR(Datum2))
   AND (DATEPART(dayofyear, Datum1) = DATEPART(dayofyear, Datum2))

WHERE CONVERT(varchar(10), Datum1, 101) = CONVERT(varchar(10), Datum2, 101)

WHERE FLOOR(CONVERT(float, Datum1)) = FLOOR(CONVERT(float, Datum2))

Porovnání s pevným dnem

Trochu jiná situace nastává v okamžiku, kdy jeden z údajů je pevný. Například hledáme záznamy založené určitého dne

DECLARE @DateFilter smalldatetime
SET @DateFilter = '20090305'

SELECT Created FROM MyTable
	WHERE
		(Created >= @DateFilter)
		AND (Created < DATEADD(day, 1, @DateFilter))

…zde s výhodou celý problém převádíme na porovnávání s konstantami, a pokud máme k dispozici vhodný index, dokonce na operaci Index Seek.

Kupodivu úplně identický execution plan (Index Seek) a se stejnými časy dotazu (testováno na obrovských datech na MS SQL Serveru 2012) dostáváme i pro podobu:

DECLARE @DateFilter date
SET @DateFilter = '20090305'

SELECT Created FROM MyTable
	WHERE CONVERT(date, Created) = @DateFilter

Vývojářské nástroje a software, který používám [Robert Haken, 09/2013]

Protože velmi často na kurzech i jinde dostávám otázky na software (nejenom vývojářský), který používám, sumarizoval jsem seznam toho, co mám na svých počítačích nainstalováno. Předesílám, že jsem za těch 20 let s počítačem přešel od pojetí maximalisty, který měl na PC nainstalováno kde-co (s přispěním AltaVisty), na přístup minimalistický.

Vývojářská platforma

  • Microsoft Visual Studio Ultimate – Základem veškeré vývojářské práce je samozřejmě Visual Studio, nyní už nejenom pro kódování, ale i jako klient k TFS (pro mě raději než web). Jinak pracujeme zásadně v režimu Web Application Project, nikoliv Web Site.
  • Team Foundation Server
  • SQL Server – Management Studio, Profiler, Data Tuning Advisor – Pro běžnou práci s SQL si vystačím s Microsoft nástroji, pro schéma DB využívám Database Diagrams. Žádné další IDE či designer třetí strany nepoužívám.

Visual Studio Add-Ins/Extensions

  • StyleCop (Free) – Doplněk pro kontrolu stylové čistoty zdrojových kódů. Hlídá názvové konvence, formátování kódu a spoustu dalšího. U nás ho máme jako součást continuous integration buildů a jakákoliv nesrovnalost failuje build. Taková automated nultá fáze code-review.
  • Web Essentials od Madse Kristensena (Free) – Must have každého webového vývojáře.
  • Resharper od JetBrains (Paid) – Za nezbytné jsem považoval v dobách VS.NET, od VS2005-2010 jsem nepoužíval, nyní se k němu vracím pro pár funkcí, které mi usnadňují živoat. Využívám v podstatě jen vyhledávání (Ctrl[+Shift]+T) a navigaci v kódu, protože prakticky již téměř vůbec nekóduji.
  • Productivity Power Tools (Free) – V podstatě se jedná o proof of concept pro nové funkce do Visual Studia. Jednak to, co Microsoft nestihl do releasu dostat a to, co testuje na uživatelých, jestli by se hodilo do releasu dalšího.
  • Team Foundation Server Power Tools (Free) – V podstatě z té sady používám jen Windows Shell Extensions a pár drobotin ze skupiny Team Explorer Enhancements.
  • HAVIT Visual Studio Extensions (Private) – Drobné pomůcky z domácí dílny, např. – Surround member with named region (Ctrl+K,R), Collapse all #regions (Ctrl+-), Expand all outlining (Ctrl++), Open local resources file (F6), Check Build, Run Business Layer Generator, atp.

Vývojářské nástroje

  • Fiddler od Teleriku (Free) – Zachytávání a analýza HTTP(S) komunikace na straně klienta.
  • SQL Compare a SQL Data Compare od RedGate (Paid) – Nástroj na porovnání schématu/dat mezi dvěma databázemi a jejich synchronizaci. Používám pro deployment nových verzí aplikací.
  • SQL Prompt od RedGate (Paid) – vylepšené intellisense pro SQL Server Management Studio, zejména umí nabízet podmínky do JOINů dle existujících FKs
  • .NET Reflector (Paid) – Nástroj, který umožňuje prohlížet a analyzovat zdrojový kód jednotlivých assembly, včetně samotného .NET Frameworku (decompiler). Díky MVP licenci je pro mě stále jedničkou. Jako free alternativa se nabízejí např. ILSpy nebo dotPeek od JetBrains.
  • ANTS Performance Profiler od RedGate (Paid) – I když performance-profiler je vestavěný ve Visual Studiu, ANTS Performance Profiler je pro mě jedničkou pro své přehledné uživatelské rozhraní.
  • TortoiseSVN (Free) – SVN jsme používali do roku 2012 jako hlavní nástroj pro source-code-management. Po migraci na TFS používám pouze pro přístup k cizím SVN a pro neaktivní archivované projekty.
  • WCAT a WCAT Extension pro Fiddler (Free) – Zátěžová zkouška webové aplikace. Přes Fiddlera lze označit requesty připravené proklikáním z browseru a následně je přehrát jako WCAT stress test.
  • Internet Explorer F12 Developer Tools (Free) – Pro ladění client-side, zejména HTML/CSS je pro mě stále jedničkou, i když jsem jinak Internet Explorer jako svůj primární browser opustil.
  • Pencil (Free) – skicování UI. Malé, nenápadné, primitivní a s docela líbivými výstupy. Hodí se v situacích, kdy jde o vizuální vyjádření myšlenky a nepředpokládá se editace (revize) návrhu UI zákazníkem. (V takových situacích používám většinou Excel, se kterým si každý poradí. Vlastně už používám skoro jenom Excel, ale asi se k Pencil pro některé scénáře vrátím.) Zkoušel jsem i PowerPoint Storyboarding, ale nezaujalo mě to.
  • Azure Diagnostics Manager a Cloud Storage Studio – Cerebrata (Paid) – administrace Windows Azure
  • Windows Debugger (WinDbg) od Microsoftu (Free) – debugger. Používám zejména pro analýzu memory-dumpů. Pro .NET používám pscor4.dll rozšíření.
  • Debug Diagnostic Tool (DebugDiag) od Microsoftu (Free) – analýza memory dumpů (nejenom).
  • Help & Manual od EC Software (Paid) – tvorba on-line dokumentace, viz třeba manual.goran.cz. Už jsem to dlouho neměl puštěné… :-)
  • Log Parser od Microsofty (Free) – command-line utilita, která umožňuje do klást SQL dotazy do textových logů, typicky do logů IIS. Nemám nainstalováno stále, ale občas se pro diagnostiku velmi hodí. Alternativou je importovat log do tabulky SQL serveru a ptát se tam.

Základ desktopu

  • Windows 7 64-bit EN – Windows 8 jsou pro mě pohromou ála Vista, k Windows 8.1 jsem se ještě nedostal. Pracuji raději s anglickým prostředím.
      • Windows Explorer – Pro veškerou práci se soubory používám základní Windows Explorer, obejdu se bez souborových manažerů ála Total Commander.
  • Microsoft Office EN – Outlook pro maily, kontakty a kalendář. Word, Excel. OneNote poměrně intenzivně na zápisky ze schůzek. Visio občas na nějaký ten diagram (za ideální ho nepovažuji, ale vhodnější jsem nenašel). PowerPoint na slides, které se snažím ve svých vystoupeních spíše omezovat. Dříve jsem používal Access s pár naklikanými formuláři pro editaci obsahu jedné DB, ale po skončení podpory .adp již není důvod. Publisher nepoužívám. Project jsem odsoudil do rubriky “kreslítko Gantt-chartů”, i když jsem mnoho marných pokusů přijít mu na chuť udělal.
  • Google Chrome – od jara 2013 můj primární browser. Roky jsem používal Internet Explorer s argumentací, že chci vidět weby tak, jak je vidí většina našich zákazníků. IE však svůj tržní podíl ztrácí, rozdíly renderování se zmenšují a Google Chrome si mě získal svojí jednoduchostí, rychlostí a synchronizacemi.
  • 7Zip (Free) – Komprese/dekomprese. Používám skrze kontextové menu ve Windows Exploreru.
  • PDF Creator (Free) – Virtuální tiskárna s výstupem do PDF souboru.
  • XnView (Free) – Prohlížeč obrázků/fotek. Neorganizuji fotky (zatím?) do žádných knihoven a pracuji s nimi čistě souborově (organizováno do složek), XnView používám čistě jako výchozí prohlížeč obrázků s jejich otevíráním rovnou do režimu FullScreen.
  • PSPad editor (Free) – lepší Notepad. Nepoužívám příliš často a v podstatě opravdu jenom jako náhradu pomalého Notepadu, takže od toho nic moc nečekám, nic lepšího jsem nehledal. Moc se v něm ani nevyznám a nejspíš bych se bez něj obešel.
  • Paint.NET (Free) – Editace obrázků. Nejsem žádný grafik, ani foto-geek. Tato jednoduchá napodobenina PhotoShopu mi na moje úkony bohatě dostačuje a jedinou slabinou je chybějící podpora formátu .PSD. Od foťáku mám licenci Photoshop Lite, ale nevyužívám ji. V mimořádných situacích sáhnu po GIMPu, ale trvale ho instalován nemám.
  • CDBurnerXP (Free) – Vypalování CD/DVD (už velmi zřídka). Původně jsem používal Nero Burning ROM, ale poslední dobou se nějak komplikovaně získává a z celého jednoduchého Nera se stala taková komplikovaná hydra, že jsem si našel CDBurnerXP. Vestavěné vypalování ve Windows (vyjma Burn ISO) jsem nepřijal za důvěryhodné.
  • Virtual CloneDrive (Free) – Virtuální CD/DVD mechanika pro připojení .ISO souborů.
  • Total Commander (Paid) – Nepoužívám jako hlavní správce souborů, ale především jako FTP klienta. Využití u mě má i pro pár dalších scénářů (prohlížení velkých souborů, porovnávání složek, atp.), nijak intenzivně ho však nevyužívám.
  • CrashPlan+ (Paid) – Automatické zálohování souborů do cloudu. Používám nejširší CrashPlan+ Family Unlimited plan pro počítače své a svých rodinných příslušníků. Nepoužívám dlouho, ale zatím jsem spokojen. Za asi $12/měsíc to na pozadí slízává soubory ze všech počítačů (včetně manželky MacOS) a zálohuje na cloud-storage poskytovatele služby.
  • Dropbox (Free) – Cloud storage. Nevyužívám příliš intenzivně, nemám ani stále spuštěno, ale občas se hodí, např. ke zpřístupnění souborů pro iOS. Mám i SkyDrive a GoogleDrive, ale zatím obecně cloud-storage moc nevyužívám.
  • Adobe Reader, Combined Community Codec Pack

Užitečné maličkosti

  • Copy Path To Clipboard od Jgaa’s Internet (Free) – Přidá do kontextového menu Windows Exploreru ke každému souboru/složce volbu „Copy Path to Clipboard“.
  • Paste As File od Chrise Gingericha (Free?) – Přidá do kontextového menu Windows Exploreru volbu „Paste As File“. Používám občas v kombinaci s PrintScreen nebo OneNote Snipping Toolem na ukládání screenshotů do souboru.
  • OutlookOnTheDesktop – po drobné úpravě (mapování klávesové zkratky) používám pro rychlé zobrazení mého týdenního kalendáře (FullScreen). Funguje i s Outlook 2013.
  • AutoHotKey (Free) – Používám pro jedinou funkčnost, zato téměř stále. Máme ve firmě napsaný jednoduchý skriptík, který na klávesovou zkratku Win+A vygeneruje skrz klávesnici edit-stamp používaný při editaci WorkItems v TFS:

image

  • FileLocator Lite (Free) – Vyhledávání souborů na desktopu. Používám od dob Windows XP jako náhradu za standardní nefunkční vyhledávání souborů (ve Windows 2000 jsem problém nikdy neměl). Je docela rychlý a hlavně spolehlivý. Původně se jmenoval Agent Ransack.
  • inSSIDer (Free) – Wi-Fi monitor. Zobrazí obsazení kanálů, sílu signálu jednotlivých AP, atp. Hodí se k vyhledání volného místa pro vlastní Wi-Fi, popř. k rychlé diagnostice/přehledu.

Blogging, Publikování

  • WordPress.com (Paid) – HAVIT Knowledge Base běží jako hostovaný blog na WordPress.com, komerční sekce projektu WordPress.org. Předtím jsem používal šest let Community Server a udělal krátký marný pokus s BlogEngine.NET. Využívám služby, které vycházejí asi na $90/rok.
  • Windows Live Writer od Microsoftu (Free) – Publikování blog-postů z desktopu, off-line příprava postů. Aktuálně součást Windows Live Essentials a není jasné, jestli to Microsoft nezařízne. Jiný editor jsem ani nezkoušel. Pro WordPress.com jsem musel nastavení WLW trochu poladit – vypnout HTML-encoding titulků postů.
  • WLW SourceCode Plug-In pro WordPress.com od Riche Hewletta (Free) – Plug-in pro vkládání code-snipettů do postů Windows Live Writeru při publikování na WordPress.com. Žádný zázrak, ale lepší řešení jsem zatím neobjevil.
  • Insert Files Plug-In pro WLW od ScottIsAFool – Plug-in pro vkládání souborových příloh do blog-postů.
  • Camtasia Studio od TechSmith (Paid) – Nahrávání a střih screencastů.

Business Administration

  • Money S3 (Paid) – finanční účetnictví, mzdy
  • Datovka od CZ.NIC Labs (Free) – klient pro obsluhu Datové schránky
  • HAVIT Goran (Paid) – provozní agenda – timesheety, náklady, plánování, fakturace, dovolené, CRM, atd.

Osobní pomůcky

  • SplashID Safe (Paid) – repository na hesla a jiné chráněné údaje. Používám se synchronizací na iOS.
  • Quicken od Intuit (Paid) – používám pro evidenci volného kapitálu a investičního majetku. Není ideální, ale lepší jsem nenašel. Je to určeno spíše pro US trh (napojení na banky, napojení na burzu) a spíše pro běžný rodinný rozpočet (evidence výdajů atp.).

Používal jsem dříve…

    • Cruise Control .NET (Free) – Před migrací na TFS náš hlavní build server.
    • Hide Main Menu (Free) – Visual Studio Extension. Na notebooku umožňuje získat řádek kódu navíc :-)
    • VisualSVN (Paid) – Visual Studio Extenction. Napojení na TortoiseSVN funkce přímo z kontextu Visual Studia. Intenzivnější práci se SVN si bez něj nedokážu představit. Používali jsme ve firmě všichni vývojáři dlouhé roky. Po migraci ze SVN na TFS již ani neinstaluji, pro ty občasné potřeby mi stačí holé TortoiseSVN,
    • GhostDoc (Free) – Visual Studio Extension. Generování XML dokumentace. Používal jsem zejména pro kopírování předchozích komentářů při overridech.
    • Ident Guides (Free) – Visual Studio Extension. Zobrazuje svislé čáry dle úrovně odsazení kódu. Existuje několik doplňků tohoto typu a je i obsaženo v mnoha širších balících, nyní je obsaženo i v Productivity Power Tools.
    • Code Contracts od Microsoftu (Free) – snažili jsme se je několik let ve firmě používat až jsme na ně definitivně zanevřeli v okamžiku, kdy jsme nenašli záměr jejich reimplementace nad Roslyn. Jejich stávající implementace pomocí post-compile rewriteru je zoufale pomalá a naprosto neodpovídající přidané hodnotě. Nakonec jsme si vytvořili vlastní tradiční implementaci s překrývající syntaxí, která sice umí jen základní scénáře typu Requires(), Assert(), Assume(), zato se časy buildů našich projektů vrátily z minut na vteřiny.

Podobné seznamy

25 Secrets for Faster ASP.NET – PDF kniha zdarma

imageUžitečná 38-stránková knížka s 25 performance tipy pro ASP.NET je zdarma ke stažení u Red Gate.

Dá se to prolistovat za pár minut a určitě je to dobrá inspirace.

…ne se vším se ztotožňuji, ale dva tipy jsou tentokrát od mě. ;-))