X 19 2009

Programová změna souboru web.config

= programmatically change web.config

Dnes jsem narazil na nutnost programové změny položek v konfiguračním souboru web.config.

Příklad ukáži na změně v sekci customError. Ukázkový konfigurační soubor je:

   1:  <authenticationmode="Windows" />
   2:          <!--
   3:              The <customErrors> section enables configuration
   4:              of what to do if/when an unhandled error occurs
   5:              during the execution of a request. Specifically,
   6:              it enables developers to configure html error pages
   7:              to be displayed in place of a error stack trace. -->
   8:   
   9:          <customErrorsmode="RemoteOnly" 
  10:              defaultRedirect="GenericErrorPage.htm">
  11:              <errorstatusCode="403"redirect="NoAccess.htm" />
  12:              <errorstatusCode="404"redirect="FileNotFound.htm" />
  13:          </customErrors>
  14:   
  15:      </system.web>

Programově lze poté hodnoty této sekce změnit následujícím způsobem:

   1:  // nacteni sekce
   2:  Configuration configuration = 
   3:       WebConfigurationManager.OpenWebConfiguration("~");
   4:  CustomErrorsSection section = 
   5:       (CustomErrorsSection)configuration.GetSection("system.web/customErrors");
   6:   
   7:  // zmena hodnoty polozky sekce
   8:  section.DefaultRedirect = "SomePage.htm";
   9:   
  10:  //ulozeni konfigurace
  11:  configuration.Save();

Ohodnoť příspěvek jako první

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
VII 24 2009

Otevření souboru v přiřazené aplikace

= Open file in default application

Je-li potřeba otevřít soubor v aplikace, ke které je defaultně přiřazen, lze využít následující konstrukci:

   1: System.Diagnostics.Process.Start(@"C:\poznámky.docx");

kde parametr v závorce je cesta k otevíranému souboru.

Někdy je třeba blíže specifikovat nastavení spouštěné aplikace, např. když ji chceme pouštět maximalizovanou. Toho lze docílit následujícím způsobem:

   1: System.Diagnostics.ProcessStartInfo PSI = new System.Diagnostics.ProcessStartInfo();
   2:  
   3: PSI.FileName = @"C:\poznámky.docx";
   4: PSI.WindowStyle = System.Diagnostics.ProcessWindowStyle.Maximized;
   5:  
   6: System.Diagnostics.Process.Start(PSI);

kde vlastnost FileName je cesta k otevíranému souboru a vlastnost WindowStyle jsou parametry, s jakými má dojít ke spuštění defaultní aplikace.

Ohodnoť příspěvek jako první

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
VII 07 2009

Podmínka v projekci u SQL příkazu

= The Expression in SQL projection (T-SQL)

Někdy je potřeba v projekci SQL dotazu SELECT zapsat podmínku např. pro zobrazování předvolby u zahraničních telefonních čísel. Původně jsem hledal nějaký ekvivalent iff v T-SQL, aby příkaz vypadal nějak takto:

SELECT [FirstName], [LastName], 
iff([Country] = "Slovakia", '+421' + [Phone], [Phone]) FROM Customers

Server při dotazu vrátil chybu

Server: Msg 170, Level 15, State 1, Line 5
Line 2: Incorrect syntax near '='.

Takže tudy cesta nevedla.

Při hledání funkčního, ekvivalentního řešení jsem narazil na následující konstrukci CASE-WHEN-THEN

SELECT 
 [FirstName], [LastName],
 CASE
    WHEN [Country]='Slovakia' 
     THEN '+421 ' + [Phone]
     ELSE [Phone]
     END AS Phone
FROM 
 Customers

která přesně pokrývá moje požadavky. Navíc ji lze rozšířit o více podmínek např. takovýmto způsobem:

SELECT [FirstName], [LastName],
   CASE [Country]
    WHEN 'Germany' 
     THEN '+49 ' + [Phone]
    WHEN 'Mexico'
     THEN '+625' + Phone
    WHEN 'Slavakia'
     THEN '+421 ' + Phone
     ELSE Phone
     END AS Phone
FROM 
 Customers

Ohodnoť příspěvek jako první

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
VI 16 2009

Návrat na pozici uživatele po PostBacku

= return the user to the same position in the client browser after postback

Někdy je potřeba, aby po vyvolání poustbacku na stránce, se po jeho vykonání stránka vrátila na stejnou pozici, kde byla před postbackem. Jedná se zejména o delší stránky, které je potřeba např. k tlačítku odskrolovat.

Asp.net samo po postbacku přenačte stránku a vrátí se na její začátek. Tudíž uživatel musí znovu skrolovat na poslední pozici, což jej určitě nepotěší.

Řešení se nabízí několik. Z čitého html se nabízí využití záložek (kotev), kdy se na místo, kam má být proveden odskok, vloží definice záložky

<a href="jmeno_zalozky"></a>

a následně je možné se na tuto záložku přesměrovat

<a href="#jmeno_zalozky>na záložku</a>
<a href="stranka.html#jmeno_zalozky>na záložku</a>
<a href="http://www.nejakyweb.cz/default.aspx#jmeno_zalozky>na záložku</a>

Využití záložek ale má i své nevýhody. Lze se odkázat jen na místa, kde je záložka definována, takže stejně uživateli bude stránka odskakovat. A dále pro přechod na záložku je třeba provést přesměrování, takže provádí-li se v postbacku kód, který mění obsah stránky, tato změna se tím ztratí.

Druhá možnost je využití direktivy, kterou nabízí přímo ASP.Net v objektu @Page. Jedná se o direktivu MaintainScrollPositionOnPostback, která pokud je nastavena na hodnotu true, ASP.Net automaticky po postbacku přesune stránku na pozici, kde byla před vyvoláním postbacku. Defaultně je však tato vlastnost nastavena na hodnotu false a proto je po postbacku stránka zobrazena na začátku.

Někdy je potřeba tuto direktivu nastavit ne pro několik konkrétních stránek, ale pro všechny stránky. To je možné, stačí nastavit hodnotu direktivy v konfiguračním souboru web.config v sekci <pages>.

Ovšem nic není tak krásné, jak vypadá. Užití direktivy může vést i k nečekaným výsledkům, kdy dochází k různým odskokům stránky či se stránka vůbec neposune na poslední pozici. Také je nutné mít zapnutou podporu javascriptu, protože odskoky řeší právě skript na straně klienta.

Bližší informace k direktivámpro @Page lze najít na MSDN.

Aktuální hodnocení: 4.0 Počet hodnocení: 2

  • Currently 4/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
VI 02 2009

Matematická pohádka 5

Žila, byla malá Karkulačka. Nebyla však úplně obyčejná. Její anomálie spočívala například v nezvykle praktické instrukční sadě, ve schopnosti pojmout až milion konstant a v mnoha jiných přednostech, o možnosti uložení funkčního předpisu ani nemluvě. Není se však čemu divit, neboť maminkou naší malé Karkulačky byla samotná Motorola. A právě tato maminka jednoho dne pravila: "Milá Karkulačko, již jsi plně vyspěla. Tvůj vývoj je u konce a prošla jsi všemi výstupními testy. Nyní tedy můžeš směle opustit svůj domov a vyrazit do světa sama, bez doprovodu. I když používáš pouze omezenou RISCovou sadu instrukcí, zvládneš všechny situace stejnou mírou jako tví protivníci, ba dokonce s rychlejšími reakcemi. Proto se vůbec neobávám, že bys nesplnila poslání, jež na tebe kladu". Maminka Motorola se na okamžik odmlčela, neboť musela dát přednost přerušení s vyšší prioritou, avšak za nepatrnou chvíli opět pokračovala: "Jistě se stále pamatuješ na svého pradědečka Abaka, jenž v současném strojovém čase přebývá za velkým Mořem informací". Karkulačka souhlasně přikývla, Motorola si spokojeně protáhla interní sběrnici a pokračovala:"Nedávno nám totiž dědeček poslal mail, že mu docházejí funkční předpisy a začíná se nudit. A proto tě pověřuji, abys mu doručila nejnovější předpisy, které jsem pro něj právě dokončila. Jsou ještě teplé a krásně voní, tak dej pozor, aby je čerstvý vzduch nezderivoval. A ne aby ses po cestě nechala ovlivňovat nějakým vnějším rušením!". A tak si milá Karkulačka vzala několik záložních baterií na cestu, zkopírovala maminčin funkční předpis do šestnáctibitové paměti a vydala se na cestu.

Plavba Mořem informací nebyla nijak zajímavá, ba naopak. Nuda přímo donutila Karkulačku k její nejneoblíbenější činnosti, totiž ke kontrole parity. Maminka jí vždycky nabádala, aby tuto činnost prováděla dosti často kvůli ochraně dat. "Ale když ono je to tak zdlouhavé", bránila se vždy Karkulačka. Při plavbě však měla času nadbytek a tudíž si po několika opakováních kontroly na celý proces zvykla a stal se pro ni nedílnou součástí každého dne.
Nakonec Karkulačka šťastně přeplula celé Moře informací a ocitla se na pevném Desítkovém základě, jenž je potřeba pro běžný dekadický logaritmus. Díky svým detailním znalostem celého Desítkového základu si spočítala, kudy jim vede cesta k dědečkovi Abakovi. Pohyb po jednotlivých řádech pomocí dekadického logaritmu jí nečinil žádné potíže a tak se blížila velice rychle k cíli ...

"Jsem Karkulačka z druhého břehu Moře informací a jdu za svým dědečkem Abakem. A mohu ti říkat zkráceně Emag?"

Když tu jí zastoupil cestu podivný element. Karkulačka zůstala stát a směle se dotázala: "Kdo jsi a čemu vděčím za tvou přítomnost?". Element se s menším příčným zavlněním představil: "říkají mi Elektromagnetické rušení a náhodou jsem se tady vyskytl vlivem nedaleké bouře. A kdopak jsi ty a kam máš namířeno?", položil Karkulačce otázku onen element. Karkulačka chvíli váhala s odpovědí, neboť maminka ji upozorňovala, že rušení nebývají příliš užitečná, ale nakonec přece jen pravila: "Jsem Karkulačka z druhého břehu Moře informací a jdu za svým dědečkem Abakem. A mohu ti říkat zkráceně Emag?". Emag téměř okamžitě přikývl a když mu Karkulačka po krátké společenské konverzaci nabídla, že mohou jít společně, odvětil: "Nezlob se, ale já se pohybuji rychlostí světla a tvá rychlost pro mne není přiměřená. Raději se půjdu vyskytnout o něco dále". A s rozloučením se vydal na svou další pouť. Jakmile se však ztratil z dohledu, zamnul si ruce a škodolibě se usmál. Věděl totiž, kde starý Abakus bydlí a vytušil, že mu vnučka určitě nese něco, co by jistě stálo za poškození. Vědom si své nepřemožitelnosti v rychlosti přesunu prostorem, přemístil se k Abakovu sídlu.

Mezitím Karkulačka, pokračujíc v cestě k dědečkovi, jen tak pro radost umocňovala a odmocňovala, když najednou zjistila nepatrnou odchylku řádu minus dvacet jedna. Ať pátrala, jak pátrala, nenašla při procházeni celého odmocňovacího procesu jedinou syntaktickou chybu a tak moudře usoudila, že se bude jednat pravděpodobně o poškozená data. A měla pravdu. Při rutinní kontrole prvních několika kilobyte paměti narazila na chybu parity. Odkud se tato chyba vzala, to nevěděla. Ovšem zpětným krokováním událostí dospěla k závěru, že tento stav jí mohl navodit jedině Emag. "Ale vždyť se tvářil tak nevinně", povzdechla si Karkulačka. Usoudila, že si bude muset dát opravdu pozor, s kým se pustí do řeči. Pro jistotu překontrolovala záznam funkce pro dědečka, jenž se naštěstí ukázal být naprosto neporušen.

Karkulačce se podařilo dorazit k dědečkovi včas a bez dalších náhodných setkání s cizinci a po zaklepání na exponenciální dveře ve tvaru Pi se ozvalo: "Dále". Karkulačka vstoupila a když se rozhlédla, uviděla podivné stvoření zachumlané do matematických vzorců. "Že by se dědeček za tu dobu tolik změnil?", uvažovala v duchu a jelikož věděla dobře, že stáří dokáže velice změnit, odpověděla si kladně. Po několika důmyslných konverzačních otázkách typu: "Proč má? tak veliké uši?" se Karkulačka dovtípila, že před ní neleží dědeček, nýbrž onen známý počestný Emag. I nezapomínajíc, co udělal s jejími daty, počala Karkulačka provádět několikanásobné zálohování důležitých dat. Šlo jí to velice rychle (s její RISCovou architekturou není divu) a Emag to ani nepostřehl. Proto se dal okamžitě do záškodnického rušení. Aby mohl výsledek svého vlivu dobře kontrolovat, zadával Karkulačce jednoduché dotazy čekaje, kdy udělá chybu. Avšak Karkulačka byla velice rychlá (zlatý RISC!), dokonce rychlejší než Emag. Než totiž Škodolibec převlečený za dědečka stačil zrušit část jejích dat, stihla to Karkulačka rozpoznat a zavčas poškozená data nahradit ze záložních kopií. A Emag to zkoušel neustále znovu a znovu, až ho to úplně přestalo bavit a zmizel, protože když rušení nemůže nic zlého napáchat, je z toho celé špatné a musí si hledat objekt, jenž není tak odolný.

Karkulačka si oddechla a s úlevou dala mamince za pravdu, že rušení je skutečně jen na obtíž. Co ji to jen stálo energie, nepřetržitě porovnávat několik kopií všech dat a tu poškozenou vždy nahradit. Přepnula tedy napájení na novou nevyčerpanou baterii. Ještě že jich má tolik s sebou. Náhle si však uvědomila, že přišla vlastně za dědečkem. Ale kde je? Snad ho Emag nezrušil? Dědeček nebyl pravděpodobně tak odolný proti rušivým vlivům, jelikož pocházel z let dávno minulých. A milá Karkulačka se dala do usedavého pláče, až jí na displeji blikaly samé osmičky.

Ale co to? Zvenčí je slyšet podivný hluk. že by se vracel Emag? Ale ne! Vždyť to je dědeček. "Dědečku!", zvolala Karkulačka. Samozřejmě, že Emag nemohl dědečka zrušit. Karkulačka si až teď uvědomila svůj omyl způsobený emocionálním přepětím ve svých logických obvodech. Dědeček přece neobsahuje žádné elektronické prvky a tudíž není co rušit! "Tak už jsi tady?", pravil. "Byl jsem si nasbírat nějaké křivkové integrály. Je po dešti a zrovna vylézají". Karkulačka předala dědečkovi funkční předpis, chvíli si s ním povykládala a poté se s uspokojením vypravila na zpáteční cestu.

Aktuální hodnocení: 5.0 Počet hodnocení: 1

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5