Weblog

NoSQL Is Hard (Stack Overflow Architecture)

Vyberám zaujímavú časť o NoSQL databázach z článku Stack Overflow Architecture.

The biggest problem of all is that transactions can not span arbitrary boundaries. There are no ACID guarantees beyond a single record or small entity group. Once you wrap your head around what this means for the programmer it's not a pleasant prospect at all. References must be manually maintained. Relationships must be manually maintained. There are no cascading deletes that act correctly during a failure. Every copy of denormalized data must be manually tracked and updated taking into account the possibility of partial failures and externally visible inconsistency.

All this functionality must be written manually by you in your code. While flexibility to write your own code is great in an OLAP/map-reduce situation, declarative approaches still cover a lot of ground and make for much less brittle code.

What you gain is the ability to write huge quantities of data. What you lose is complacency. The programmer must be very aware at all times that they are dealing with a system where it costs a lot to perform distribute operations and failure can occur at anytime.

Rework – zabudnite na formálne vzdelanie

Kniha Rework má zaujímavú kapitolu o Zabudnutí na formálne vzdelanie a väčšom spoľahnutí sa na ozajstnú prax. Na príklade ukazujú, aké zlé návyky môže človek dostať v škole:

  • The longer a document is, the more it matters.
  • Stiff, formal tone is better then being conversational.
  • Using big word is impressive.
  • You need to write a certain number of words or pages to make a points.
  • The format matters as much (or more) than the content of what you write.

To mi pripomenulo projekt na predmet Informačný systém podniku, ktorý nás učí Ing. Michal Grell, PhD., a kde je podstatná forma, nie obsah. Bohužial, je to zase jeden z tých „expertov“ z Ekonomickej univerzity… :-(

Prípad nefungujúceho Hamachi

Kamoš mal problém s Hamachi na Windows 7 – po nainštalovaní nefungovala Hamachi sieť a Hamachi zobrazovalo chybu „network adapter error“. Najprv som sa pokúšal zistiť, či je správne nastavený firewall a či Hamachi nevyžaduje administrátor­ské práva.

Za normálnych okolností Hamachi nainštaluje do systému sieťový adaptér, jednu Windows službu spúšťanú s Local System právami a GUI klienta, ktorý beží s práva bežného používateľa a využíva nainštalovanú službu. Sieťový adaptér je nastavený tak, aby poskytoval routovanie na sieť 5.0.0.1/8. Zistili sme, že sieťový adaptér nebol nainštalovaný a teda Hamachi malo problémy so správnym nainštalovaním siete. Hamachi inštaluje sieťový adaptér iba počas inštalácie – nie pri reinštalovaní – a bolo potrebné ho teda najprv odinštalovať a znovu nainštalovať. Tento postup však u kamoša nepomohol.

Inštalačný log

Najprv som sa teda pokúsil získať log z inštalácie Hamachi, či tam nie je nič podozrivé.

msiexec /log hamachi.log /i hamachi.msi

...
Action 18:30:17: InstallDriver. Installing network driver
Action 18:30:18: InstallServices. Installing new services
...

Žiadna chyba, tak som sa rozhodol vyskúšať nainštalovať ovládač pre Hamachi manuálne.

Manuálna inštalácia ovládača

Cez Device Manager kamoš dal manuálne nainštalovať sieťový adaptér s Hamachi ovládačom (%PROGRAMFILE%\LogMeIn Hamachi\hamachi.inf). Táto inštalácia však skončila veľmi divnou chybou: 0×5AA ERROR_NO_SYSTEM_RE­SOURCES – Insufficient system resources exist to complete the requested service. Na prvý pohľad sa zdá, že počítač nemá dostatok zdrojov a v tomto prípade človek najprv zisťuje, či má dosť voľného miesta na disku, alebo voľnej operačnej pamäte. Problém však bol inde a skúsili sme zapnúť v msconfig.exe diagnostické spustenie systému s iba základnými službami, aby sme vylúčili problém s nejakou inou aplikáciou. Tak isto bezúspešne a s rovnakým výsledkom.

Vďaka Process Monitoru som zistil, že inštalácia ovládačov vo Windowse je podrobne zaznamenávaná do súboru %WINDIR%\inf\setupapi.dev.log. Vyžiadal som si ho teda a nasledovala podrobná analýza a porovnanie jeho obsahu voči systému, kde sa Hamachi ovládač bezproblémov nainštaloval.

.    dvi:           {DIF_INSTALLDEVICE} 23:43:46.036
     dvi:                CoInstaller 1: Enter 23:43:46.036
     cci:                     [NdisCoinst: Enter NcipHandleInstallPreProcessing]
     cci:                     NdisCoinst: NetCfgInstanceId does not exist
     cci:                     NdisCoinst: Guid of the adapter is {DEFD4A42-3C78-4F11-AAC6-D798EF311363}
     inf:                     Opened PNF: 'C:\Windows\INF\oem2.inf' ([strings])
     cci:                     NdisCoinst: IfType from registry is 1
     cci:                     NdisCoinst: IfType 1, Characteristics 0x1, IsIrdaDevice 0, PhysicalMediaType -1, MediaType -1, IsBridge 0, FoundGuidInDownlevel 0, EnableDhcp 2
     cci:                     NdisCoinst: Connection name is Local Area Connection 35
     cci:                     NdisCoinst: NetLuidIndex does not exist
!!!  cci:                     NdisCoinst: NcipAllocateNetLuidIndex failed with error 0x5aa
     cci:                     [NdisCoinst: Exit NcipHandleInstallPreProcessing]
!!!  dvi:                CoInstaller 1: failed(0x000005aa)!
!!!  dvi:                Error 1450: Insufficient system resources exist to complete the requested service.
     dvi:           {DIF_INSTALLDEVICE - exit(0x000005aa)} 23:43:46.504

Z logu bolo vidieť, že inštalátor pri vytváraní nového sieťového adaptéru volá funkciu NcipAllocateNetLuidIndex ktorá skončí chybou. Získať informácie o tejto funkcii bolo jednoduché a zložité zároveň. Našťastie o nej existuje záznam na Internete, ale použiteľné informácie sú skryté vo veľkej kope textu zmeišaného so záznamami log súboru na fóre OSR Online.

Jeffrey Tippet z Microsoftu tam opisuje ako funkcia NcipAllocateNetLuidIndex funguje.

I don't have a good guess as to what's gone wrong, but here's some background info that might help you figure it out. (This info is an implementation detail, subject to change, but may come in handy for troubleshooting):

NDIS must allocate a (locally) unique number for each network interface, the NET_LUID. The NET_LUID consists of the ifType, paired with a unique ID number. To generate that unique ID, we keep track of the IDs that have already been assigned in HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NDIS\IfTypes\[ifType] ! IfUsedNetLuidIndices (REG_BINARY) for each ifType. For example, look in \6 if your NIC is Ethernet (ifType=3D=6).

In there, there is IfUsedNetLuidIn­dices, which is (IIRC) a bitmap of the unique IDs that have been assigned to other network interfaces. Make sure this value is present and not damaged (e.g., a huge number of 0×FF's). Typically, its value will be something like 0×FF 0×01, if you have 9 NICs. Note that you can't just whack this value and replace it with something else, since then NDIS will incorrectly assign the same NET_LUID to two interfaces, and all sorts of things will break when that happens.

NcipAllocateNetLuidIndex teda pre daný typ sieťového adaptéru (v prípade Hamachi to je ifType=1) potrebuje získať LUID – Local Unique Identifier, ktorého aktuálna hodnota sa nachádza v uvedenom kľúči v Registroch. Problém môže nastať, keď je hodnota IfUsedNetLuidIndices nastavená na veľmi vysoké číslo – systém potom nemôže vytvoriť ďalšie LUID a skončí chybou 0x5AA ERROR_NO_SYSTEM_RESOURCES.

Nasledovala teda analýza tohto kľúča a dopracovanie sa (našťastie a konečne) k zdroju problému:

reg query HKLM\SYSTEM\CurrentControlSet\Services\NDIS\IfTypes\1 /v IfUsedNetLuidIndices


HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NDIS\IfTypes\1
    IfUsedNetLuidIndices    REG_BINARY    FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

Hodnota IfUsedNetLuidIndices sa z neznámich príčin poškodila a keďže kamoš nemal v počítači nejaké špeciálne sieťové adaptéry (ifType = 1 = IF_TYPE_OTHER) tak bolo bezpečné nastaviť IfUsedNetLuidIndices na 0×00. Potom však treba reštartovať počítač. Windows si totiž načítajú pomocné LUID čísla pri štarte systému a nenačítavajú ich počas inštalácie zariadenia (overené pomocou Process Monitoru 🙂 ). Nasledovalo už len nainštalovanie Hamachi – tento raz úspešne a bez problémov.

Po približne 24 hodinách som úspešne našiel príčinu problému, opravil chybu a získal cenné skúsenosti. A aj v tomto prípade nebolo potrebné na odstránenie problému načisto inštalovať Windows – k čomu by sa asi mnohí iní uchýlili. Samotné riešenie problému však trvalo iba pár hodín, natiahlo sa však kvôli poctivej dochádzke do školy 🙂

Posted in IT

Dr. Ing. Jaroslav Kultan, PhD – zážitky z cvičení z databáz

Učitelia majú na svojich stránkach väčšinou len informácie o sebe, nejaké tie publikácie čo napísali a prax. Kvality učiteľa sa však z tejto stránky študenti nedozvedia.

Tento semester sme mali tú česť mať na cvikách učiteľa Ing. Jaroslava Kultána. V skratke by sa dalo poradiť ostatným študentom: dajte si na neho bacha. Robí dosť zákernosti čo sa týka termínov odovzdávania zadaní – hlavne rád nastavuje v Moodli časy na 0:00 a potom sa teší, že študenti nemohli odovzdať zadania a následne dáva prednášky o tom, čo to znamená odovzdať niečo do 0:00. Počas semestra som sa dozvedel, že na dekanáte deklaroval, že máme na vypracovávanie projektov oveľa viacej času (2 týždne) ako sme reálne mali (4 dni). Celkovo sa nakoniec situácia na cvikách dosť vyostrovala, keďže nikto z triedy nadokázal akceptovať jeho prístup k študentom, hlavne keď sme od súkromnej školy čakali profesionálnejšieho učiteľa.

Cvičenia sme mali zakončiť prezentáciou projektu, ktorý sme spravili. Posledný termín prezentovania sme dostali na stredu 12.5.2010, kam sa niektorí študenti dostavili a zistili, že žiadne prezentovanie sa nebude konať, keďže sa cvičiaci nikde neukázal. Ešte v ten týždeň v piatok to malo dohru – Kultán vynadal študentom, že v utorok 12.5. nedošli na konzultácie – a nenechal si vysvetliť, že utorok bolo 11.5. a on sám uviedol dátum ako 12.5. Proste podľa neho pochybili študenti.

Finálne prezentovanie projektov sa konalo dnes, znovu v dusnej atmosfére. Externisti čo došli, boli vyhodení, pretože nemali projekt vytlačený. I keď v Moodli nebola žiadna zmienka o tom, že ho majú doniesť vytlačený. Pekne sa tu však prejavil charakter a povaha p. Kultána – byť arogantný, hľadať chybu v iných a stále točiť dokolečka niečo o dodržiavaní termínov (i keď je to od veci, túto problematiku spomína rád). A aby som nezabudol: platí iba to, čo vyhovuje jemu. (Čo bol hlavný dôvod, prečo som presadzoval písomnú komunikáciu pred ústnou.)

Samotné odovzdávanie mi prišlo divné, keďže často sa tváril, ako by sa to jeho netýkalo a ani ho nezaujímalo, čo hovorí dotyčný. Nejakými poznámkami a skákaním do výkladu sa snažil upozorňovať na chyby. Ak mu však niekto opontoval, debata skôr či neskôr končila frázou „To nie je podstatné“ – ostatne ako mnohé iné debaty s ním. Za dosť neprofesionálne určite považujem tvrdenie, že INT(10) v MySQL bude strááášne veľké číslo, až také, že to bude 64bitové a 32bitový procesor to nebude vedieť spracovať. Čo už len však dodať k tvrdeniu pána cvičiaceho, že 210 je väčšie ako 232 a pomaly rovnajúce sa 264? Asi len: to nie je podstatné.

Takéto správanie sa učiteľa voči študentom na štátnej škole by asi prešlo bez povšimnutia. Avšak bohužial aj na súkromnej škole sme si museli prejsť cez neadekvátny prístup k študentom, kvôli ktorému mnohí z nás investovali radšej do súkromnej školy, aby sme ho nemuseli zažívať. Niektorí by oponovali, že nás aj niečo z tých DB naučil. Nuž ak by sme však aspoň polovicu času namiesto riešenia podivných termínov sa učili, tak by vedeli o DB ešte viacej. Napísal som teda takúto kritiku ako reakciu na dosť nepodarené cvičenia tento semester, a nech táto spätná väzba nezostane len vnútri fakulty.

Microsoft CRM 4

Skúšam si Microsoft CRM 4 pre svoju osobnú potrebu a aj pre školský projekt a samotná implementácia CRM nie je komplikovaná a šlo to aj bez implementačnej príručky. Beží to na Windows Serveri 2008 R2 so SQL Serverom 2008, zatiaľ bez podpory e-mailov a CRM mám v slovenskej lokalizácii. Základná testovacia prevádzka sa dá rozchodiť v pohode, ak dodržíte túto postupnosť:

  1. Základom je Windows Server 2008 R2 Standard, stačí bežná inštalácia a vytvorenie domény – inak CRM inštalácia vyhodí hnusnú chybu.
  2. Treba povoliť .NET Framework 3.5.1 feature, nainštalovať Web Server rolu s podporou ASP.NET a samozrejme zvoliť aj IIS 6 Management Compatibility nástroje.
  3. CRM 4 ešte vyžaduje mať nainštalovanú Indexing Services, takže z role File Services treba nainštalovať Windows Server 2003 Compatibility nástroje. Inak bude CRM inštalátoru úplne pri konci vadiť, že služba cisvc nie je nainštalovaná.
  4. Nasleduje SQL Server 2008, treba nainštalovať databázový engine a Reporting Services. Pre každú službu je vhodné vytvoriť samostatné konto v doméne. Po nainštalovaní treba aplikovať SP1, aby bol SQL Server kompatibilný s R2 verziou Windowsov. Reporting Services stačí nastaviť s predvolenými hodnotami.
  5. V tejto fáze už nie je problém nainštalovať CRM 4 na predvolený IIS Web Site, pri nastavovaní URL pre Reporting Service si treba dať pozor a použiť URL pre Reporting Service, nie pre Reporting Manager. Pri otázke na adresu e-mailového serveru som vynechal jeho nastavenie, pretože potom sa CRM tvárilo, že nevie nájsť Exchange server. V testovacej prevádzke sa dá zaobísť aj bez podpory e-mailov.
  6. Slovenský jazykový balíček pre CRM nájdete v Microsoft Download centre: Jazykový balík k aplikácii Microsoft Dynamics CRM 4.0
  7. CRM sa samo neaktualizuje a je potrebné zohnať si Update Rollup 10, v prípade použitia Windows Serveru 2008 R2 samozrejme treba použiť aktualizácie určené pre amd64 architektúru. Aktualizácie treba nainštalovať v českej aj slovenskej verzii.
  8. Správca CRM musí v časti Nastavení > Správa > Jazyky povoliť slovenský jazykový balíček, čo bude trvať dlhšiu dobu – SQL Server po tejto akcii začne pekne vyťažovať procesor.
  9. Používatelia si môžu pomocou odkazu Nástroje na hlavnej lište zobraziť Možnosti a tam si na karte Jazyky zmeniť jazykovú mutáciu.

A už sa stačí len zabávať s CRM a zlepšovať si vzťahy so zákazníkmi 🙂

Posted in IT

Nová éra vývojových nástrojov

Dočkali sme sa a pre mňa celkom znenazdajky sa objavilo Visual Studio 2010 už v pondelok. Launch event počas troch dní uvádza Visual Studio 2010, nástroje pre vývoj v SharePointe, nový Silverlight 4 a vývoj pre Windows Phone. Celkom fasa veci, ak naozaj tie znalosti, ktoré mám z ASP.NET WebForms a zo Silverlightu viem bez problémov použiť v SharePointe a v Silverlighte bežiacom na Win Phone.

Hneď pri uvedení mali VS 2010 k dispozícii MSDN predplatitelia, študenti cez Dreamspark naň tiež vôbec nemuseli čakať, keďže sa tam Professional verzia objavila hneď, ostatní môžete použiť Express či 30 dňové trialky. Ešte keby im tak netrvalo sprístupniť mi MSDN Premium v rámci MSP programu…

Integrovaná podpora všemožných nových funkcií do VS je naozaj lákadlom – Office Ribbon v C++ má vlastný dizajnér, podpora pre Windows 7 Taskbar API priamo vo WPF a WPF či Silverlight dizajnéry. Malou novinkou je zmena v projektoch pre Windows a konzolové aplikácie, keď projekt je buildovaný pre x86 platformu. Spolu s .NET 4.0 to znamená podstatne zrýchlenie spustenia aplikácie. Oplatí sa po upgrade prejsť svoje staré projekty a manuálne v nich zmeniť platformu z AnyCPU na x86.

Validácia formulárov na klientovi v ASP.NET MVC

Formuláre tvorené v ASP.NET MVC frameworku priamo podporujú validáciu vstupných údajov pomocou atribútov dostupných v Data Annotations API (System.ComponentModel.DataAnnotations). Tieto atribúty vedia skontrolovať, či bola zadaná nejaká hodnota, či je vyhovujúcej dĺžky alebo ju skontroluje voči regulárnemu výrazu. Obrovská výhoda tohto API je v generovaní klientských JavaScriptových pravidiel, s ktorými sa formulár zvaliduje v prehliadači bez zbytočného post backu na server.

Validácia v prehliadači vyžaduje knižnice MicrosoftAjax.js a MicrosoftMvcValidation.js. Skripty si automaticky zistia, či na stránke sú nejaké validačné pravidlá a tie použijú. Aby sme nemuseli tieto pravidlá písať ručne, ASP.NET MVC má jednoduchý spôsob, ako ich vygenerovať: HtmlHelper.EnableClientValidation(). Keď je na stránke zapnutá validácia na strane klienta, pre každý formulár sa vygenerujú pravidlá pre tie položky, pre ktoré ste zavolali funkciu HtmlHelper.ValidationMessageFor(). Nedochádza teda ku validácii celého objektu, ale iba tých vlastností, ktoré môžu byť na stránke upravované (napríklad pri editácii objektu sa nemusí dať meniť jeho názov – keďže pre takéto pole nezavoláte HtmlHelper.EditorFor() a ani HtmlHelper.ValidationMessageFor(), nebude validácia chybne hlásiť, že žiaden názov nebol vyplnený).

Trieda označená validačnými atribútmi vyzerá takto:

public class Comment
{
    [Required]
    [StringLength(40, MinimumLength = 5, ErrorMessage = "Meno musí mať 5 až 40 znakov.")]
    public string Name { get; set; }

    [Required(ErrorMessage = "Zadajte váš e-mail.")]
    [RegularExpression(@"^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$", ErrorMessage = "Zadali ste nesprávny e-mail.")]
    public string Email { get; set; }

    [Required]
    [StringLength(140, MinimumLength = 5, ErrorMessage = "Správa musí mať 5 až 140 znakov.")]
    public string Text { get; set; }
}

Kód, ktorý zobrazí formulár môže byť takýto:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<MvcApplication1.Models.Comment>" %>
...
<% Html.EnableClientValidation(); %>
<% using (Html.BeginForm()) {%>

<fieldset>
    <legend>Fields</legend>

    <%= Html.EditorForModel() %>

    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>

<% } %>

Výsledné JSON pravidlá si môžete pozrieť na adrese http://codepaste.net/7jvdtv.

Oveľa bohatšiu podporu pre validovanie formulárov má jQuery Validation plugin. ASP.NET MVC nemá na serverovej strane žiadnu podporu pre túto formu validácie, avšak priamo MVC Futures obsahuje knižnicu MicrosoftMvcJQueryValidation.js ktorá validačné pravidlá MVC frameworku premení na formát podporovaný v jQuery. V tomto prípade nie je potrebné používať MicrosoftMvcValidation.js súbor.

Pri validácii v ASP.NET MVC 2 RC2 môžete naraziť na problém so StringLengthAttribute a jeho MinimumLength vlastnosťou. Pretože táto bola pridaná v .NET 4.0 a MVC podporuje aj .NET 3.5, tak sa generuje pravidlo, ktoré neobsahuje MinimumLength hodnotu. Na serveri teda dôjde k plnej validácii, na klientovi iba čiastočnej. Toto je možné obísť použitím regulérnych výrazov, ale napísaním si vlastnej StringLengthAttributeAdapter triedy. (Je otázne, či táto chyba bude odstránená v release verzii.)

Pozrite si výsledný formulár s validáciou.

PS: Regulérny výraz na e-mailovú adresu som prevzal z RegExLib.com.

Unit testing videá

Na konferencii NDC2009 vystupoval aj Roy Osherove, ktorý vie celkom pekne prednášať o unit testingu. Video záznam z konferencie je dostupný na blogu MSDN UP North vo forme torrentu. Odporúčam pozrieť si jeho prezentácie, na ktorých predstavuje Test Driven Development, ukazuje hlavné best practises pri písaní unit testov a taktiež objasňuje mockovanie.

Konfigurácia web aplikácií vo VS 2010

Veľmi príjemnou zmenou v ASP.NET 4 je nový web.config súbor, ktorý podstatne schudol a normálne obsahuje iba 2 potrebné direktívy. Od .NETu 2.0 web.config postupne rástol s každou novou verziou (3.0, 3.5, 3.5 SP1), pretože pôvodný machine.config z 2.0 verzie sa nemenil, ale nové funkcie a ich nastavenia pribúdali rapídne.

Všetko čo potrebujeme určiť je použitá verzia frameworku a nastaviť IIS, aby používal ASP.NET moduly.

<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
  </system.webServer>
</configuration>

Druhou novinkou je správa rôznych konfigurácii web aplikácie priamo v projekte. Doteraz bol v projekte jeden Web.config súbor, ktorý sa používal hlavne počas vývoja a pri nasadení aplikácie do produkčného prostredia bolo potrebné vytvoriť iný konfiguračný súbor a ten udržiavať samostatne. Problém bol aj s verziovaním nastavení ktoré mal každý vývojar iné. Teraz máme k dispozícii transformačné konfiguračné súbory.

Visual Studio v nových projektoch vytvorí základný Web.config súbor a k nemu dve ďalšie verzie: Web.Debug.config a Web.Release.config. Základný konfiguračný súbor sa použivá rovnako ako doteraz – nastavíte v ňom všetko potrebné pre beh webovej aplikácie. Nové Debug a Release konfiguračné súbor slúžia na popísanie zmien v ladiacej a produkčnej verzii. Ich syntax je presne taká istá ako v normálnych Web.config súboroch. Používajú však XML-Document-Transform rozšírenie, čo sú špeciálne XML atribúty, ktoré určujú, ako budú zmeny aplikované.

Transformácie XML dokumentu umožňujú pridať či odstrániť určité XML elementy a atribúty, nahradiť celý XML element úplne novým elementom, ale aj využiť XPath výrazy na definovanie podmienok, za akých má dôjsť z aplikovaniu zmi­en.

Typicky je teda v Release verzii odstránený debug="" atribút a nastavený connection string na produkčnú databázu:

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <connectionStrings>
  <add name="MyDB"
    connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True"
    xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
  </connectionStrings>
  <system.web>
    <compilation xdt:Transform="RemoveAttributes(debug)" />
  </system.web>
</configuration>