<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DUQESXo_cSp7ImA9WxBbEkg.&quot;"><id>tag:blogger.com,1999:blog-72294588039662900</id><updated>2010-03-10T22:41:48.449+01:00</updated><title>öt perc dotnet</title><subtitle type="html">put your slogan {here}</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://otperc.net/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://otperc.net/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Molnár Gergő</name><uri>http://www.blogger.com/profile/05139074877599679722</uri><email>gergo.molnar@otperc.net</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>67</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/OtPercDotnet" /><feedburner:info uri="otpercdotnet" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;DUQESXo-fip7ImA9WxBbEkg.&quot;"><id>tag:blogger.com,1999:blog-72294588039662900.post-858062266129351226</id><published>2010-03-10T22:33:00.004+01:00</published><updated>2010-03-10T22:41:48.456+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-10T22:41:48.456+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="állásajánlat" /><category scheme="http://www.blogger.com/atom/ns#" term="SQL" /><title>MS-SQL developer wanted</title><content type="html">&lt;p&gt;
Ez úton is köszönöm mindenkinek, aki jelentkezett &lt;a href="http://otperc.net/2010/02/meg-tobb-net-fejleszto-kerestetik.html"&gt;.NET fejlesztőnek&lt;/a&gt;. (tesztelők jelentkezését még mindig várom!)&lt;br /&gt;
Ezúttal egy SQL gurut keresek:
&lt;/p&gt;
&lt;p&gt;
 &lt;h4&gt;SQL Fejlesztő&lt;/h4&gt;
 &lt;ul&gt;
  &lt;li&gt;Legalább 3 év SQL Server / T-SQL fejleszési tapasztalat&lt;/li&gt;
  &lt;li&gt;Műszaki végzettség&lt;/li&gt;
  &lt;li&gt;Angol nyelvtudás írásban és szóban&lt;/li&gt;
  &lt;li&gt;.NET / ASP.NET ismeret előny&lt;/li&gt;
 &lt;/ul&gt;
&lt;p&gt;

&lt;p&gt;
A munkavégzés helye Budapest belvárosa.&lt;br /&gt;
Jelentkezni a &lt;a href="mailto:geri@otperc.net"&gt;geri@otperc.net&lt;/a&gt; címre küldött önéletrajzzal lehet.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/72294588039662900-858062266129351226?l=otperc.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OtPercDotnet/~4/9L4BGMhB5uU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://otperc.net/feeds/858062266129351226/comments/default" title="Megjegyzések küldése" /><link rel="replies" type="text/html" href="http://otperc.net/2010/03/ms-sql-developer-wanted.html#comment-form" title="0 megjegyzés" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/858062266129351226?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/858062266129351226?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OtPercDotnet/~3/9L4BGMhB5uU/ms-sql-developer-wanted.html" title="MS-SQL developer wanted" /><author><name>Molnár Gergő</name><uri>http://www.blogger.com/profile/05139074877599679722</uri><email>gergo.molnar@otperc.net</email><gd:extendedProperty name="OpenSocialUserId" value="15966951835176790603" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://otperc.net/2010/03/ms-sql-developer-wanted.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUECQH8_cSp7ImA9WxBUFk0.&quot;"><id>tag:blogger.com,1999:blog-72294588039662900.post-5058729904980003807</id><published>2010-03-03T10:03:00.003+01:00</published><updated>2010-03-03T10:14:21.149+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-03T10:14:21.149+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tips'N'Tricks" /><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><title>Windows 7 multi-monitor trükkök</title><content type="html">&lt;p&gt;
Tudta Ön, hogy Windows 7-en, ha több monitort használ, a &lt;tt&gt;WIN + SHIFT + Bal / Jobb kurzormozgató&lt;/tt&gt; kombinációkkal ide-oda lehet dobálni az aktív ablakot a monitorok között?&lt;br /&gt;
Én eddig a zseniális &lt;a href="http://www.realtimesoft.com/ultramon/"&gt;UltraMon&lt;/a&gt;-t használtam (amit eztán is használni fogok, pl. a multi-taskbar támogatás miatt), de ez elég kényelmes, és out-of-the-box.
&lt;/p&gt;
&lt;p&gt;
Az eredeti forrás (és további hotkey-ek lelőhelye) &lt;a href="http://bienor.spaces.live.com/Blog/cns!4BF2B7C0C88086AC!6088.entry"&gt;Bienor blogja&lt;/a&gt;.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/72294588039662900-5058729904980003807?l=otperc.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OtPercDotnet/~4/2wCNLjJWKHs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://otperc.net/feeds/5058729904980003807/comments/default" title="Megjegyzések küldése" /><link rel="replies" type="text/html" href="http://otperc.net/2010/03/windows-7-multi-monitor-trukkok.html#comment-form" title="2 megjegyzés" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/5058729904980003807?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/5058729904980003807?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OtPercDotnet/~3/2wCNLjJWKHs/windows-7-multi-monitor-trukkok.html" title="Windows 7 multi-monitor trükkök" /><author><name>Molnár Gergő</name><uri>http://www.blogger.com/profile/05139074877599679722</uri><email>gergo.molnar@otperc.net</email><gd:extendedProperty name="OpenSocialUserId" value="15966951835176790603" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://otperc.net/2010/03/windows-7-multi-monitor-trukkok.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkEERnY6eSp7ImA9WxBUFU4.&quot;"><id>tag:blogger.com,1999:blog-72294588039662900.post-2260389198430735162</id><published>2010-03-02T13:55:00.002+01:00</published><updated>2010-03-02T13:56:47.811+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-02T13:56:47.811+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="caching" /><category scheme="http://www.blogger.com/atom/ns#" term="architecture" /><category scheme="http://www.blogger.com/atom/ns#" term=".NET Framework 4.0" /><title>Megjelent az AppFabric Beta 2</title><content type="html">&lt;p&gt;Nemrégiben írtam &lt;a title="Distributed Cache (former Velocity) in AppFabric" href="http://otperc.net/2009/11/velocity-is-dead-long-live-appfabric.html"&gt;az AppFabric-ba integrálódott Velocity&lt;/a&gt;-ről. Most ennek az &lt;a title="Windows Server AppFabric Beta 2 released" href="http://blogs.msdn.com/endpoint/archive/2010/02/26/windows-server-appfabric-beta-2-available.aspx"&gt;AppFabric-nak jelent meg a második bétája&lt;/a&gt; – ez a kiadás támogatja a .NET 4 / Visual Studio 2010 duó Release Candidate verzióját.&lt;/p&gt;  &lt;p&gt;A distributed cache vonalon az üzemeltetést könnyítő változásokat találhatunk(event log támogatás, PowerShell cmdletek cluster adminisztáláshoz) , illetve szofisztikáltabbá vált a memória kezelése azokban az esetekben, amikor sokkal több adatot próbálunk a cache-ünkbe gyömöszölni, mint amennyit annak fizikai memóriája elbírna.&lt;/p&gt;  &lt;p&gt;Letöltés a &lt;a title="Download AppFabric" href="http://msdn.microsoft.com/appfabric"&gt;http://msdn.microsoft.com/appfabric&lt;/a&gt; címről.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/72294588039662900-2260389198430735162?l=otperc.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OtPercDotnet/~4/ENrZa99sR-0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://otperc.net/feeds/2260389198430735162/comments/default" title="Megjegyzések küldése" /><link rel="replies" type="text/html" href="http://otperc.net/2010/03/appfabric-beta-2-released.html#comment-form" title="0 megjegyzés" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/2260389198430735162?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/2260389198430735162?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OtPercDotnet/~3/ENrZa99sR-0/appfabric-beta-2-released.html" title="Megjelent az AppFabric Beta 2" /><author><name>Molnár Gergő</name><uri>http://www.blogger.com/profile/05139074877599679722</uri><email>gergo.molnar@otperc.net</email><gd:extendedProperty name="OpenSocialUserId" value="15966951835176790603" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://otperc.net/2010/03/appfabric-beta-2-released.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEEFSX0_eyp7ImA9WxBUEE8.&quot;"><id>tag:blogger.com,1999:blog-72294588039662900.post-1710327654421866945</id><published>2010-02-23T16:22:00.011+01:00</published><updated>2010-02-24T16:50:18.343+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-24T16:50:18.343+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="állásajánlat" /><title>Még több .NET fejlesztő kerestetik - Frissítve!</title><content type="html">&lt;p&gt;
Újfent .NET fejlesztőt keresek. Nem is csak egyet, sőt, nem is csak egy területre:
&lt;/p&gt;
&lt;p&gt;
 &lt;h4&gt;ASP.NET Engineer (meglepő módon webes területre)&lt;/h4&gt;
 &lt;ul&gt;
  &lt;li&gt;Legalább 3 év C# / .NET fejleszési tapasztalat&lt;/li&gt;
  &lt;li&gt;Kliensoldali webes technológiák (HTML, JavaScript, CSS) ismerete&lt;/li&gt;
  &lt;li&gt;Angol nyelvtudás írásban és szóban&lt;/li&gt;
  &lt;li&gt;SQL ismeret előny&lt;/li&gt;
 &lt;/ul&gt;
&lt;p&gt;

&lt;p&gt;
 &lt;h4&gt;.NET Developer (tesztelési területre)&lt;/h4&gt;
 &lt;ul&gt;
  &lt;li&gt;Erős C#, .NET Framework (2.0-3.5) ismeretek&lt;/li&gt;
  &lt;li&gt;SQL ismeretek&lt;/li&gt;
  &lt;li&gt;Szoftverfejlesztési és -tesztelési módszertanok ismerete&lt;/li&gt;
  &lt;li&gt;Webes technológiák általános ismerete&lt;/li&gt;
  &lt;li&gt;Angol nyelvtudás írásban és szóban&lt;/li&gt;
  &lt;li&gt;Szoftvertesztelési tapasztalat előny&lt;/li&gt;
  &lt;li&gt;C++ tapasztalat előny&lt;/li&gt;
 &lt;/ul&gt;
&lt;/p&gt;

&lt;p&gt;
 &lt;br /&gt;
 &lt;b&gt;Update!&lt;/b&gt; További embereket is keresek, teszt területre. Ez nem annyira .NET, de hátha érdekel valakit... Nagy vonalakban teszt esetek kidolgozásáról és végrehajtásáról, a teszt konfigurációk telepítéséről és karbantartásáról, dokumentálásról szól.&lt;br /&gt;
 &lt;h4&gt;QA Engineer&lt;/h4&gt;
 Az ideális jelölt
 &lt;ul&gt;
  &lt;li&gt;néhány év szoftver tesztelési tapasztalat rendelkezik&lt;/li&gt;
  &lt;li&gt;jó általános informatikai "rálátása" van (szoftverek, rendszerek működése, Windows adminisztráció, hálózati ismeretek)&lt;/li&gt;
  &lt;li&gt;automatizálási ismeretekkel rendelkezik (scriptelés, programozói tudás)&lt;/li&gt;
  &lt;li&gt;angol és magyarul egyaránt jól kommunikál írásban és szóban&lt;/li&gt;
 &lt;/ul&gt;
&lt;p&gt;

&lt;p&gt;
&lt;br /&gt;
A munkavégzés helye Budapest belvárosa.&lt;br /&gt;
Jelentkezni a &lt;a href="mailto:geri@otperc.net"&gt;geri@otperc.net&lt;/a&gt; címre küldött önéletrajzzal lehet.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/72294588039662900-1710327654421866945?l=otperc.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OtPercDotnet/~4/bzyE2-lXJU4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://otperc.net/feeds/1710327654421866945/comments/default" title="Megjegyzések küldése" /><link rel="replies" type="text/html" href="http://otperc.net/2010/02/meg-tobb-net-fejleszto-kerestetik.html#comment-form" title="0 megjegyzés" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/1710327654421866945?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/1710327654421866945?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OtPercDotnet/~3/bzyE2-lXJU4/meg-tobb-net-fejleszto-kerestetik.html" title="Még több .NET fejlesztő kerestetik - Frissítve!" /><author><name>Molnár Gergő</name><uri>http://www.blogger.com/profile/05139074877599679722</uri><email>gergo.molnar@otperc.net</email><gd:extendedProperty name="OpenSocialUserId" value="15966951835176790603" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://otperc.net/2010/02/meg-tobb-net-fejleszto-kerestetik.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU8ESH07fip7ImA9WxBVGUw.&quot;"><id>tag:blogger.com,1999:blog-72294588039662900.post-8589746583652954299</id><published>2010-02-22T23:56:00.006+01:00</published><updated>2010-02-23T10:36:49.306+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-23T10:36:49.306+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SQL" /><title>Szóvégi üres karakterek SQL-ben</title><content type="html">&lt;p&gt;
Ebből mi lesz?&lt;br /&gt;

&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="rem"&gt;-- Nincs space a szavakban&lt;/span&gt;
&lt;span class="kwrd"&gt;IF&lt;/span&gt; &lt;span class="str"&gt;'test'&lt;/span&gt; = &lt;span class="str"&gt;'test'&lt;/span&gt;
    &lt;span class="kwrd"&gt;PRINT&lt;/span&gt; &lt;span class="str"&gt;'Igaz'&lt;/span&gt;
&lt;span class="kwrd"&gt;ELSE&lt;/span&gt;
    &lt;span class="kwrd"&gt;PRINT&lt;/span&gt; &lt;span class="str"&gt;'Hamis'&lt;/span&gt;
    

&lt;span class="rem"&gt;-- Vegyük észre a szó eleji space-t&lt;/span&gt;
&lt;span class="kwrd"&gt;IF&lt;/span&gt; &lt;span class="str"&gt;'test'&lt;/span&gt; = &lt;span class="str"&gt;' test'&lt;/span&gt;
    &lt;span class="kwrd"&gt;PRINT&lt;/span&gt; &lt;span class="str"&gt;'Igaz'&lt;/span&gt;
&lt;span class="kwrd"&gt;ELSE&lt;/span&gt;
    &lt;span class="kwrd"&gt;PRINT&lt;/span&gt; &lt;span class="str"&gt;'Hamis'&lt;/span&gt;
    

&lt;span class="rem"&gt;-- Vegyük észre a szó végi space-t&lt;/span&gt;
&lt;span class="kwrd"&gt;IF&lt;/span&gt; &lt;span class="str"&gt;'test'&lt;/span&gt; = &lt;span class="str"&gt;'test '&lt;/span&gt;
    &lt;span class="kwrd"&gt;PRINT&lt;/span&gt; &lt;span class="str"&gt;'Igaz'&lt;/span&gt;
&lt;span class="kwrd"&gt;ELSE&lt;/span&gt;
    &lt;span class="kwrd"&gt;PRINT&lt;/span&gt; &lt;span class="str"&gt;'Hamis'&lt;/span&gt;
&lt;/pre&gt;
&lt;br /&gt;
Ebből az lesz, hogy:&lt;br /&gt;
&lt;br /&gt;
&lt;tt&gt;Igaz&lt;br /&gt;
Hamis&lt;br /&gt;
&lt;b&gt;Igaz&lt;/b&gt;&lt;/tt&gt;
&lt;/p&gt;
&lt;p&gt;
Meglepő? &lt;a href="http://support.microsoft.com/kb/316626"&gt;Ezért&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/72294588039662900-8589746583652954299?l=otperc.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OtPercDotnet/~4/Gy3J0FJjOh4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://otperc.net/feeds/8589746583652954299/comments/default" title="Megjegyzések küldése" /><link rel="replies" type="text/html" href="http://otperc.net/2010/02/sql-server-trailing-spaces.html#comment-form" title="0 megjegyzés" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/8589746583652954299?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/8589746583652954299?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OtPercDotnet/~3/Gy3J0FJjOh4/sql-server-trailing-spaces.html" title="Szóvégi üres karakterek SQL-ben" /><author><name>Molnár Gergő</name><uri>http://www.blogger.com/profile/05139074877599679722</uri><email>gergo.molnar@otperc.net</email><gd:extendedProperty name="OpenSocialUserId" value="15966951835176790603" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://otperc.net/2010/02/sql-server-trailing-spaces.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUAEQn8yeip7ImA9WxBVFEQ.&quot;"><id>tag:blogger.com,1999:blog-72294588039662900.post-7156623792230699062</id><published>2010-02-17T21:57:00.008+01:00</published><updated>2010-02-18T12:48:23.192+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-18T12:48:23.192+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tips'N'Tricks" /><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><category scheme="http://www.blogger.com/atom/ns#" term="SQL" /><title>Saving changes is not permitted (SQL Server 2008)</title><content type="html">&lt;p&gt;&lt;/p&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_hb-k5lQC-M8/S3xaQdlCjvI/AAAAAAAAAtA/4lq1XaYp-N0/s1600-h/SqlManCantSave.jpg"&gt;&lt;img style="margin: 0px 20px 10px 0px; width: 161px; float: left; height: 131px; cursor: hand" id="BLOGGER_PHOTO_ID_5439321688821108466" border="0" alt="" src="http://2.bp.blogspot.com/_hb-k5lQC-M8/S3xaQdlCjvI/AAAAAAAAAtA/4lq1XaYp-N0/s320/SqlManCantSave.jpg" width="169" height="138" /&gt;&lt;/a&gt; Aki SQL Management Studio 2008-cal dolgozik, az belefuthatott már a jelenségbe, hogy bizonyos táblaséma-módosító műveleteket nem képes a grafikus felületen elvégezni. Például ha egy NULL értéket felvenni képes mezőtől szeretnénk elvenni ezt a képességét, akkor a sémamódosítás helyett jön az ábrán látható dialógus, ami aztán a &lt;i&gt;&amp;quot;User canceled out of save dialog (MS Visual Database Tools)&amp;quot;&lt;/i&gt; című üzenetbe, majd az addigi módosításaink elvesztésébe torkollnak.   &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Ezzel azért örvendeztet meg minket a Management Studio, hogy emlékeztessen: ami a felületről 1-2 kattintás, az a rideg valóságban nem mindig olyan egyszerű. Az alábbi séma-módosító műveletek végrehajtása nem triviális: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Új mező beszúrása létező oszlopok közé &lt;/li&gt;    &lt;li&gt;Oszlop törlése &lt;/li&gt;    &lt;li&gt;NULL érték engedélyezése/tiltása &lt;/li&gt;    &lt;li&gt;Oszlop adattípusának megváltoztatása &lt;/li&gt;    &lt;li&gt;Oszlopok sorrendjének megváltoztatása &lt;/li&gt; &lt;/ul&gt; A végrehajtásuk annyira nem triviális, hogy igazából lehetetlen - az, hogy mégis elvégezhetők, annak köszönhető, hogy a Management Studio a háttérben egy ügyes scriptet generál és futtat. A script egy új táblát hoz létre a kívánt sámával, majd átbűvészkedi bele a régi táblában található adatainkat. Innentől az már csak névdonornak kell: eldobásra kerül, az újonnan létrejött tábla pedig felveszi a személyazonosságát. Pont olyan, &lt;i&gt;mintha&lt;/i&gt;.   &lt;br /&gt;A GUI felől ebből semmi nem látszik, egy esetet kivéve: ha egy éles, terhelés alatt álló adatbázis sok rekordot tartalmazó tábláján machinálunk, mert azt tuti észre lehet majd venni a GUI felől is. Csak nem afelől a GUI felől, amelyik felől mi szeretnénk. &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_hb-k5lQC-M8/S3xkH6_4YFI/AAAAAAAAAtI/NahoN5EB7Lg/s1600-h/PreventSaving.jpg"&gt;&lt;img style="text-align: center; margin: 10px 0px 0px 45px; width: 400px; display: inline; height: 242px; cursor: hand" id="BLOGGER_PHOTO_ID_5439332537215770706" border="0" alt="" align="right" src="http://2.bp.blogspot.com/_hb-k5lQC-M8/S3xkH6_4YFI/AAAAAAAAAtI/NahoN5EB7Lg/s400/PreventSaving.jpg" /&gt;&lt;/a&gt;   &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Ezt a működést hívhatjuk mondjuk &amp;quot;üzemeltető-barát&amp;quot; beállításnak (nehezebb nagy hülyeséget csinálni), fejlesztési időben viszont mezők jönnek-mennek, közelező adatokról derül ki, hogy nem mindig ismertek, és más anomáliák is gyakran történnek - tehát jól esne, ha nem szopatna minket még a Management Studio is.    &lt;br /&gt;Szerencsére néhány (hat) kattintással "fejlesző-baráttá" tehető a működés: a &lt;i&gt;&lt;b&gt;Tools -&amp;gt; Options -&amp;gt; Designers -&amp;gt; Table and Database Designers&lt;/b&gt;&lt;/i&gt; fülön a &lt;i&gt;&lt;b&gt;Prevent saving changes that require table re-creation&lt;/b&gt;&lt;/i&gt; opció elől ki vell venni a pipát:&amp;#160; Így már vidáman módosíthatunk a sémánkon. Érdemes néha a Generate Change Script gombra is rábökni, hogy miket gépel helyettünk össze a Management Studio. Köszönjük! &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/72294588039662900-7156623792230699062?l=otperc.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OtPercDotnet/~4/UgJDAxNqfvI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://otperc.net/feeds/7156623792230699062/comments/default" title="Megjegyzések küldése" /><link rel="replies" type="text/html" href="http://otperc.net/2010/02/saving-changes-is-not-permitted-sql.html#comment-form" title="1 megjegyzés" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/7156623792230699062?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/7156623792230699062?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OtPercDotnet/~3/UgJDAxNqfvI/saving-changes-is-not-permitted-sql.html" title="Saving changes is not permitted (SQL Server 2008)" /><author><name>Molnár Gergő</name><uri>http://www.blogger.com/profile/05139074877599679722</uri><email>gergo.molnar@otperc.net</email><gd:extendedProperty name="OpenSocialUserId" value="15966951835176790603" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_hb-k5lQC-M8/S3xaQdlCjvI/AAAAAAAAAtA/4lq1XaYp-N0/s72-c/SqlManCantSave.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://otperc.net/2010/02/saving-changes-is-not-permitted-sql.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkENSHg_fCp7ImA9WxBVE0k.&quot;"><id>tag:blogger.com,1999:blog-72294588039662900.post-7301407666110581826</id><published>2010-02-16T17:53:00.003+01:00</published><updated>2010-02-16T18:18:19.644+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-16T18:18:19.644+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="windows 7" /><category scheme="http://www.blogger.com/atom/ns#" term="visual studio" /><title>Windows 7 (vs. VS)</title><content type="html">&lt;p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_hb-k5lQC-M8/S3rNo_eHXrI/AAAAAAAAAsg/8e2-_cRF5Fo/s1600-h/VsMemory.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 255px;" src="http://3.bp.blogspot.com/_hb-k5lQC-M8/S3rNo_eHXrI/AAAAAAAAAsg/8e2-_cRF5Fo/s320/VsMemory.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5438885604119502514" /&gt;&lt;/a&gt;
A Windows 7 ezzel sokkol mostanában (mióta felkerült a Visual Studio 2010 RC). Van 3 &lt;a href="http://en.wikipedia.org/wiki/Gibibyte"&gt;Gibi&lt;/a&gt; RAM-om (igazából 4, de a 32 bites OS abból valamivel több, mint 3-at lát).
&lt;/p&gt;
&lt;p&gt;
Elismerem, lehet olyan szituáció, amikor hasznos, hogy szól, hogy közel a vég - de nálam a devenv.exe 284 MB-ot eszik, ami ugyan nem kevés, de még mindig kevesebb, mint tizede az összes memóriának.&lt;br /&gt;
1.5G cache mellett is van még 800 mega szabad RAM-om.
&lt;/p&gt;
&lt;p&gt;
Szerencsére (kis registry trükközéssel) kikapcsolható a dolog: &lt;a href="http://www.kylirhorton.com/2009/disabling-low-memory-messages/"&gt;Disabling the “Your computer is low on memory” and “Close programs to prevent information loss” dialogs&lt;/a&gt;.&lt;br /&gt;
Peace!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/72294588039662900-7301407666110581826?l=otperc.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OtPercDotnet/~4/yqHAr_9uc0M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://otperc.net/feeds/7301407666110581826/comments/default" title="Megjegyzések küldése" /><link rel="replies" type="text/html" href="http://otperc.net/2010/02/windows-7-vs-vs.html#comment-form" title="0 megjegyzés" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/7301407666110581826?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/7301407666110581826?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OtPercDotnet/~3/yqHAr_9uc0M/windows-7-vs-vs.html" title="Windows 7 (vs. VS)" /><author><name>Molnár Gergő</name><uri>http://www.blogger.com/profile/05139074877599679722</uri><email>gergo.molnar@otperc.net</email><gd:extendedProperty name="OpenSocialUserId" value="15966951835176790603" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_hb-k5lQC-M8/S3rNo_eHXrI/AAAAAAAAAsg/8e2-_cRF5Fo/s72-c/VsMemory.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://otperc.net/2010/02/windows-7-vs-vs.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QMRHY4fip7ImA9WxBVEkw.&quot;"><id>tag:blogger.com,1999:blog-72294588039662900.post-4988471364498494919</id><published>2010-02-15T07:20:00.005+01:00</published><updated>2010-02-15T07:29:45.836+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-15T07:29:45.836+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="állásajánlat" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term=".NET Framework 4.0" /><title>Senior .NET fejlesztő kerestetik</title><content type="html">&lt;p&gt;Szolgálati közlemény: webes területen tapasztalt .NET fejlesztő kerestetik, .NET 3.5 / C# 3.0+, ASP.NET (MVC és/vagy WebForms, Web Services), verziókezelő-rendszer használati tapasztalattal.&lt;br&gt;
Bővebb információ, kapcsolat: &lt;a href="http://ssp.cloudapp.net/dotnet"&gt;http://ssp.cloudapp.net/dotnet&lt;/a&gt;.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/72294588039662900-4988471364498494919?l=otperc.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OtPercDotnet/~4/gBVWrkqOWdo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://otperc.net/feeds/4988471364498494919/comments/default" title="Megjegyzések küldése" /><link rel="replies" type="text/html" href="http://otperc.net/2010/02/senior-net-fejleszto-kerestetik.html#comment-form" title="0 megjegyzés" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/4988471364498494919?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/4988471364498494919?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OtPercDotnet/~3/gBVWrkqOWdo/senior-net-fejleszto-kerestetik.html" title="Senior .NET fejlesztő kerestetik" /><author><name>Molnár Gergő</name><uri>http://www.blogger.com/profile/05139074877599679722</uri><email>gergo.molnar@otperc.net</email><gd:extendedProperty name="OpenSocialUserId" value="15966951835176790603" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://otperc.net/2010/02/senior-net-fejleszto-kerestetik.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8CRX08cSp7ImA9WxBVEUU.&quot;"><id>tag:blogger.com,1999:blog-72294588039662900.post-7289476400165688743</id><published>2010-02-14T23:10:00.004+01:00</published><updated>2010-02-15T00:07:44.379+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-15T00:07:44.379+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mvc" /><category scheme="http://www.blogger.com/atom/ns#" term="asp.net" /><category scheme="http://www.blogger.com/atom/ns#" term=".NET Framework 4.0" /><title>ASP.NET 4.0 Request Validation</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://stephenwalther.com/blog/images/stephenwalther_com/blog/WindowsLiveWriter/Tip48DisableRequestValidation_114C1/clip_image002_thumb.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 461px; height: 371px;" src="http://stephenwalther.com/blog/images/stephenwalther_com/blog/WindowsLiveWriter/Tip48DisableRequestValidation_114C1/clip_image002_thumb.jpg" alt="" border="0" /&gt;&lt;/a&gt;
&lt;p&gt;
Történt, hogy a &lt;a href="http://tinymce.moxiecode.com/"&gt;Moxicode TinyMCE editor&lt;/a&gt;-ját szerettem volna használni egy MVC alkalmazásban - a válaszott platform és az IDE pedig természetesen mi más is lehetett volna, mint a .NET Framework 4.0 RC, illetve a Visual Studio 2010 RC.
&lt;/p&gt;
&lt;p&gt;
Némi plumbing kód megírása után az elgondolás életre is kelt és prímán működött - egészen az első POST-ig, amiután a "&lt;tt&gt;System.Web. HttpRequestValidationException: A potentially dangerous Request.Form value was detected from the client (&lt;i&gt;form-elem-neve&lt;/i&gt;="&lt;i&gt;veszélyes-dolgok-pl-html&lt;/i&gt;").&lt;/tt&gt;" üzenettel elragadott a Sárga Halál. Hát, persze, ilyesmit nem lehet POST-olni, mert a HTTP request validációja során az ASP.NET motor megtagadja a kérés viszolgálását, ha valami potenciálisan veszélyeset (pl. HTML kódot) talál a POST-olt értékek közt. Ki kell kapcsolni a validációt az adott oldalra.
&lt;/p&gt;
&lt;p&gt;
Mi sem egyszerűbb ennél, az .aspx oldalunk @Page direktívájánál megmondjuk, hogy &lt;tt&gt;ValidateRequest="false"&lt;/tt&gt;, és kész is vagyunk.

Illetve lennénk, ha ez egy WebForms alkalmazás lenne. Az MVC applikációnkat teljes mértékben hidegen hagyja ez a beállítás, és továbbra is validál. Kis keresés, és halleluja: az MVC motor máshol validál, mint a WebForms, &lt;a href="http://stephenwalther.com/blog/archive/2009/02/20/tip-48-ndash-disable-request-validation.aspx"&gt;itt a Controller feladata a validálás, és az Action-ökre rakott &lt;tt&gt;[ValidateInput]&lt;/tt&gt; attribútummal szabályozhatjuk&lt;/a&gt;, hogy szeretnénk-e validálást, vagy sem. Editálás esetén nem akartam:
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
[ValidateInput(&lt;span class="kwrd"&gt;false&lt;/span&gt;)]
&lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult Edit(&lt;span class="kwrd"&gt;string&lt;/span&gt; id)
{
    &lt;span class="kwrd"&gt;return&lt;/span&gt; View();
}&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
Egyszerű - viszont ugyanúgy nem működött, mint az előző megközelítés. Itt már hosszabb és keservesebb nyomozás következett, de végül meglett az ok: &lt;a href="http://www.asp.net/learn/whitepapers/aspnet4/breaking-changes/#_TOC4"&gt;ASP.NET 4.0 Beta 2-től megváltozott a default request-validálási módszer, már a BeginRequest alatt megtörténik&lt;/a&gt;. A változtatás azt célozza, hogy a request validation áldásos tevékenységét ne csak .aspx oldalakon, hanem webservice híváson, handlereken, egyebeken is élvezhessük.&lt;br /&gt;
Hogy ezt az új fajta validációt hogy lehet kikapcsolni, nem tudom; de vissza lehet térni a "régihez", ami tiszteletben tartja a direktívákat és attribútumokat, mindössze egy sort kell elhelyeznünk a &lt;tt&gt;Web.config&lt;/tt&gt;unkban:
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;httpRuntime&lt;/span&gt; &lt;span class="attr"&gt;requestValidationMode&lt;/span&gt;&lt;span class="kwrd"&gt;="2.0"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
Szintén 4.0-ás újdonság, hogy &lt;a href="http://msmvps.com/blogs/luisabreu/archive/2010/01/05/oh-gosh-validating-user-input-is-extensible.aspx"&gt;saját validátort is készíthetünk&lt;/a&gt;, amit szintén a httpRuntime elem attribútumaként adhatunk meg:
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;httpRuntime&lt;/span&gt; &lt;span class="attr"&gt;requestValidationType&lt;/span&gt;&lt;span class="kwrd"&gt;="MyValidator, MyAssembly"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
Végezetül, ha kikapcsoljuk a "gyári" validációt, ne feledkezzünk meg helyette saját ellenőrző kódokat beépíteni.&lt;br /&gt;
Boldog Validálást!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/72294588039662900-7289476400165688743?l=otperc.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OtPercDotnet/~4/JOWkMIDKbTs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://otperc.net/feeds/7289476400165688743/comments/default" title="Megjegyzések küldése" /><link rel="replies" type="text/html" href="http://otperc.net/2010/02/aspnet-40-request-validation.html#comment-form" title="0 megjegyzés" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/7289476400165688743?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/7289476400165688743?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OtPercDotnet/~3/JOWkMIDKbTs/aspnet-40-request-validation.html" title="ASP.NET 4.0 Request Validation" /><author><name>Molnár Gergő</name><uri>http://www.blogger.com/profile/05139074877599679722</uri><email>gergo.molnar@otperc.net</email><gd:extendedProperty name="OpenSocialUserId" value="15966951835176790603" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://otperc.net/2010/02/aspnet-40-request-validation.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMHR3w7fip7ImA9WxBWGUo.&quot;"><id>tag:blogger.com,1999:blog-72294588039662900.post-3414029338044874749</id><published>2010-02-12T11:25:00.001+01:00</published><updated>2010-02-12T11:27:16.206+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-12T11:27:16.206+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="CLR" /><title>flee - Fast Lightweight Expression Evaluator</title><content type="html">&lt;p&gt;
A &lt;a href="http://flee.codeplex.com/"&gt;flee (Fast Lightweight Expression Evaluator)&lt;/a&gt; pont az, ami a neve. Egy gyors, pehelysúlyú kifejezés kiértékelő - aki dolgozott már &lt;a href="http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx"&gt;LINQ Dynamic Query Library&lt;/a&gt;-vel, annak nagyjából érthető miről van szó. Erről:
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)
{
    var ctx = &lt;span class="kwrd"&gt;new&lt;/span&gt; ExpressionContext();
    ctx.Variables.Add(&lt;span class="str"&gt;"now"&lt;/span&gt;, DateTime.Now);
    var expression = ctx.CompileGeneric&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;(&lt;span class="str"&gt;"now.ToString(\"yyyy-MMMM-dd (dddd)\").ToUpper()"&lt;/span&gt;);
    var result = expression.Evaluate();
    Console.WriteLine(result); &lt;span class="rem"&gt;// Output: "2010-FEBRUÁR-12 (PÉNTEK)"&lt;/span&gt;
}&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
Azaz egy sztring-kifejezésből, mint pl. a "&lt;tt&gt;sqrt(a^2 + b^2)&lt;/tt&gt;" vagy a "&lt;tt&gt;now.ToString("yyyy-MMMM-dd (dddd)").ToUpper()&lt;/tt&gt;" képes IL kódot előállítani. A kifejezésünk nyelve kicsit C#, kicsit VB, erősen típusos, de nem case sensitive...
&lt;/p&gt;
&lt;p&gt;
A flee LGPL licencelésű, ami praktikusan azt jelenti, hogy ha (az egyébként letölthető) forráskódján nem módosít az ember, csak a lefordított assemblyt referenciálja, akkor szabadon használható akár nyílt, akár zárt, non-profit vagy for-profit feljesztésekben egyaránt.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/72294588039662900-3414029338044874749?l=otperc.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OtPercDotnet/~4/BS3fyXp-wrM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://otperc.net/feeds/3414029338044874749/comments/default" title="Megjegyzések küldése" /><link rel="replies" type="text/html" href="http://otperc.net/2010/02/flee-fast-lightweight-expression.html#comment-form" title="0 megjegyzés" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/3414029338044874749?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/3414029338044874749?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OtPercDotnet/~3/BS3fyXp-wrM/flee-fast-lightweight-expression.html" title="flee - Fast Lightweight Expression Evaluator" /><author><name>Molnár Gergő</name><uri>http://www.blogger.com/profile/05139074877599679722</uri><email>gergo.molnar@otperc.net</email><gd:extendedProperty name="OpenSocialUserId" value="15966951835176790603" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://otperc.net/2010/02/flee-fast-lightweight-expression.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUMMSHkzfip7ImA9WxBWGEQ.&quot;"><id>tag:blogger.com,1999:blog-72294588039662900.post-2937033822496835635</id><published>2010-02-11T11:33:00.002+01:00</published><updated>2010-02-11T15:11:29.786+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-11T15:11:29.786+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><category scheme="http://www.blogger.com/atom/ns#" term=".NET Framework 4.0" /><title>Process Monitor vs. Visual Studio 2010</title><content type="html">&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_hb-k5lQC-M8/S3Pdv8RD1dI/AAAAAAAAAsQ/pkysId70CbA/s1600-h/VS2010B2-Uninstall%5B15%5D.jpg"&gt;&lt;img style="border-right-width: 0px; margin: 0px 0px 0px 5px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="VS2010B2-Uninstall" border="0" alt="VS2010B2-Uninstall" align="right" src="http://lh6.ggpht.com/_hb-k5lQC-M8/S3PdwVZRfmI/AAAAAAAAAsU/Hw3Mg4-10E8/VS2010B2-Uninstall_thumb%5B13%5D.jpg?imgmax=800" width="244" height="185" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Természetesen engem sem hagyott hidegen a Visual Studio 2010 kiadásra jelölt verziójának megjelenése. A letöltés gyorsan megvolt, az telepítéshez azonban el kellett távolítani az előző, Beta 2-es verziót – az upgrade lehetőség hiánya megszokott a beta vagy CTP jelölésű termékeknél. Nosza, uninstalláljunk!&lt;/p&gt;  &lt;p&gt;Control Panel, Programs and Features, VS 2010, remove. A fenti állapotig sikerült eljutni körülbelül 1 perc alatt, aztán vége. Vártam 10 percet, hátha lesz valami, de nem. Hát jó, akkor elő kell venni a sok éves szakmai tapasztalatot és profizmust: ezt bizony újra köll indítani!&lt;/p&gt;  &lt;p&gt;Sajnos a csodafegyver nem segített. Ugyanebbe az állapotba jutottunk. Ide finomabb műszerek fognak kelleni!&lt;/p&gt;  &lt;p&gt;Az feltűnt, hogy az alkalmazás nem fagy le a szó klasszikus értemében: valószínű mindenki ismeri a “nem válaszol” állapotot, amikor se kép, se hang. Na, itt nem ez volt: ez valamit molyolhat a háttében, de se a procit nem tekeri, se a memóriát nem zabálja, se őrületes I/O-t nem produkál a Task Manager szerint.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_hb-k5lQC-M8/S3PdwgglxuI/AAAAAAAAAsY/-yHS0wFskpc/s1600-h/VS2010B2-Uninstall-ProcMon%5B5%5D.jpg"&gt;&lt;img style="border-right-width: 0px; margin: 0px 10px 0px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="VS2010B2-Uninstall-ProcMon" border="0" alt="VS2010B2-Uninstall-ProcMon" align="left" src="http://lh6.ggpht.com/_hb-k5lQC-M8/S3PdxDOO99I/AAAAAAAAAsc/3NM0itMnx1c/VS2010B2-Uninstall-ProcMon_thumb%5B3%5D.jpg?imgmax=800" width="244" height="79" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Meg kéne tudni, mivel molyol az alkalmazás. Erre kiváló eszköz a &lt;a href="http://technet.microsoft.com/sysinternals/"&gt;Sysinternals&lt;/a&gt; utilitik közül a &lt;a href="http://technet.microsoft.com/hu-hu/sysinternals/bb896645%28en-us%29.aspx"&gt;Process Monitor&lt;/a&gt;. A mellékelt képen látszik, hogy a setup.exe valamiért szerelembe esett a Z: meghajtómmal, és mindenféle temp fileokat pakol oda. A dolog szépséghibája, hogy az én Z:-m egy WebDav-on keresztül hálózati meghajtóként felmappelt dokumentumtár, ami sok mindenre jó, speciel nagy mennyiségű, relative kis fájl tömeges, gyors létrehozására, olvasására, törlésére teljes mértékben alkalmatlan.&lt;/p&gt;  &lt;p&gt;Az igazi vicc, hogy amolyan harctéri sebész módjára szépen lecsatoltam a Z: meghajtóm – a setup.exe leállítása nélkül. Az még kicsit próbálkozott, aztán mikor belátta, hogy volt zé, nincs zé, szó nélkül továbbfutott, és néhány perc alatt eltakarította a Visual Studio 2010 Beta 2-t.&lt;/p&gt;  &lt;p&gt;Remélem így én is hamarosan csatlakozhatok az RC sebességéről, stabilitásáról áradozók egyre népesebb csoportjához! :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/72294588039662900-2937033822496835635?l=otperc.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OtPercDotnet/~4/DyWbeVOgJUY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://otperc.net/feeds/2937033822496835635/comments/default" title="Megjegyzések küldése" /><link rel="replies" type="text/html" href="http://otperc.net/2010/02/visual-studio-2010-vs-process-monitor.html#comment-form" title="1 megjegyzés" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/2937033822496835635?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/2937033822496835635?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OtPercDotnet/~3/DyWbeVOgJUY/visual-studio-2010-vs-process-monitor.html" title="Process Monitor vs. Visual Studio 2010" /><author><name>Molnár Gergő</name><uri>http://www.blogger.com/profile/05139074877599679722</uri><email>gergo.molnar@otperc.net</email><gd:extendedProperty name="OpenSocialUserId" value="15966951835176790603" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://otperc.net/2010/02/visual-studio-2010-vs-process-monitor.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEIARXc7eCp7ImA9WxBWF08.&quot;"><id>tag:blogger.com,1999:blog-72294588039662900.post-9193911388497183255</id><published>2010-02-09T15:41:00.002+01:00</published><updated>2010-02-09T15:42:24.900+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-09T15:42:24.900+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="visual studio" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term=".NET Framework 4.0" /><title>Tuple</title><content type="html">&lt;blockquote&gt;   &lt;p&gt;&lt;q&gt;- Mit tettek értünk a &lt;del&gt;ró&lt;/del&gt; redmondiak? Semmit!         &lt;br /&gt;- &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/02/08/vs-2010-net-4-release-candidate.aspx"&gt;Visual Studio 2010 Relase Candidate!&lt;/a&gt;         &lt;br /&gt;- Mit?         &lt;br /&gt;- VS2010 RC.         &lt;br /&gt;- Ó, igen, ezt ők adták, ez igaz.         &lt;br /&gt;- És &lt;a href="http://otperc.net/2009/12/covariance-and-contravariance-in-c-40.html"&gt;variancia-támogatást a nyelvbe.&lt;/a&gt;         &lt;br /&gt;- Igen, relase candidate-et, és variancia támogatást, igen, de ezektől eltekintve...         &lt;br /&gt;- Az &lt;a href="http://otperc.net/2009/11/velocity-is-dead-long-live-appfabric.html"&gt;AppFabricot&lt;/a&gt;!         &lt;br /&gt;- Jól van, de eltekintve a release candide-től, a variancia-támogatástól, az AppFabrictól, a dinamikus nyelvek támogatásától, az újraírt workflowtól eltekintve... mit adtak nekünk a &lt;del&gt;ró&lt;/del&gt;redmondiak?&lt;/q&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;img style="margin: 5px 15px 5px 0px; display: inline" align="left" src="http://i.telegraph.co.uk/telegraph/multimedia/archive/01173/arts-graphics-2006_1173697a.jpg" width="185" height="132" /&gt; Hát a &lt;a href="http://msdn.microsoft.com/en-us/magazine/dd942829.aspx"&gt;Tuple&lt;/a&gt;-t.     &lt;br /&gt;A tuple egy olyan adatszerkezet, ami több, különböző típusú &amp;quot;al-elemet&amp;quot; fog össze. Kb. mint egy tömb, aminek mindegyik eleme más-más típusú lehet. &lt;/p&gt;  &lt;p&gt;Képzeljük el, hogy egy metódusban vissza kell adnunk egy string-et és egy int-et. Több lehetőségünk is van, pl. string visszatérési érték + 1 out int paraméter használata, vagy egy egyszerű, &amp;quot;adathordozó&amp;quot; oszály legyártása, ami pont egy string-et és egy int-et tud getelni-setelni. Lehetőleg inkább csak getelni, setelni csak a létrehozásakor. Na a Tuple pont ez utóbbit tudja. &lt;/p&gt;  &lt;p&gt;A Tuple egy generikus adatszerkezet, ami a generikus típusparamétereinek megfelelő adatokat tudja tárolni. Az adattagokat csak létrehozáskor lehet beállítani, a tuple példány életciklusában később már csak getelni lehet az tuple által biztosított Item1, Item2, Item&lt;i&gt;n&lt;/i&gt; propertyken keresztül. Mivel ez legalább olyan érthetetlen lett, mint a többi magyarázatom, jöjjön a példa: &lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;/p&gt;  &lt;pre class="csharpcode"&gt;var tuple = &lt;span class="kwrd"&gt;new&lt;/span&gt; Tuple&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;(&lt;span class="str"&gt;&amp;quot;otperc&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;.net&amp;quot;&lt;/span&gt;, 42);
&lt;span class="kwrd"&gt;string&lt;/span&gt; s1 = tuple.Item1;
&lt;span class="kwrd"&gt;string&lt;/span&gt; s2 = tuple.Item2;
&lt;span class="kwrd"&gt;int&lt;/span&gt; i = tuple.Item3;&lt;/pre&gt;

&lt;br /&gt;Még elegánsabb, ha a Tuple.Create() statikus metódussal gyártjuk le a Tuple példányunkat, ekkor ugyanis a fordító képes a generikus típusparamétereket a metódushívás paramétereinek típusából kiinferálni. Magyarul, nem kell kiírni a kacsacsőrös rész: &lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;

&lt;pre class="csharpcode"&gt;var tuple = Tuple.Create(&lt;span class="str"&gt;&amp;quot;otperc&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;.net&amp;quot;&lt;/span&gt;, 42);&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Ennyi. Nem rakétatudomány, de hasznos kis tool. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/72294588039662900-9193911388497183255?l=otperc.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OtPercDotnet/~4/zNPKibmc-N0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://otperc.net/feeds/9193911388497183255/comments/default" title="Megjegyzések küldése" /><link rel="replies" type="text/html" href="http://otperc.net/2010/02/tuple.html#comment-form" title="0 megjegyzés" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/9193911388497183255?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/9193911388497183255?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OtPercDotnet/~3/zNPKibmc-N0/tuple.html" title="Tuple" /><author><name>Molnár Gergő</name><uri>http://www.blogger.com/profile/05139074877599679722</uri><email>gergo.molnar@otperc.net</email><gd:extendedProperty name="OpenSocialUserId" value="15966951835176790603" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://otperc.net/2010/02/tuple.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEFQng_eip7ImA9WxBQFUo.&quot;"><id>tag:blogger.com,1999:blog-72294588039662900.post-3014216988991608468</id><published>2010-01-15T19:00:00.002+01:00</published><updated>2010-01-15T19:03:33.642+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-15T19:03:33.642+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="padlófék" /><category scheme="http://www.blogger.com/atom/ns#" term=".NET Framework 4.0" /><title>Visual Studio 2010 Sexy Edition</title><content type="html">&lt;p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_hb-k5lQC-M8/S1Cssz5lH-I/AAAAAAAAAp8/E1OCdlCTpqU/s1600-h/Visual_Studio_Sexy_Edition.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 230px;" src="http://3.bp.blogspot.com/_hb-k5lQC-M8/S1Cssz5lH-I/AAAAAAAAAp8/E1OCdlCTpqU/s320/Visual_Studio_Sexy_Edition.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5427027436827385826" /&gt;&lt;/a&gt;

A közelgő Visual Studio 2010 releassel kapcsolatban egy érdekes pletyka szivárgott ki a napokban a Microsofttól. A szoftverfejlesztő keretrendszernek egy  speciális kiadása is elérhetővé válik majd 2010 április 12.-én: a Visual Studio Sexy Edition. A programról a splash screen mellett néhány technikai információ is napvilágot látott.
&lt;/p&gt;
&lt;p&gt;
A kiadás érdekessége, hogy a már megszokott programnyelveket - a C#-ot, illetve Visual Basic .NET-et - nem támogatja a kiadás, és az újdonságként érkező F# nyelven sem tudunk alkalmazásokat fejleszteni segítségével, mindössze egyetlen programnyelvet, az abszolút újdonságként debütáló L#-ot fogja támogatni.
&lt;/p&gt;
&lt;p&gt;A Comenius Logo fejlesztői közösség máris azzal vádolja a redmondiakat, hogy az L# tulajdonképpen egy nagy nyúlás, egy az egybe' a logóról, mindössze a bonyolultabb nyelvi elemeket hagyták el. Egyesek jogi lépéseket, mások öri harit fontolgatnak.&lt;br /&gt;
A &lt;a href="http://en.wikipedia.org/wiki/LOLCODE"&gt;LOLCODE&lt;/a&gt; fejlesztők viszont üdvözölték az újonnan megjelenő lehetőséget, mert bár &lt;a href="http://code.google.com/p/lolcode-dot-net/"&gt;.NET LOLCODE compiler&lt;/a&gt; eddig is létezett, de most végre ők is a .NET ecosystem first class citizenjei lehetnek - igaz, ehhez egy új nyelvet kell elsajátítaniuk. Szerencsére ebben segít a közeljövőben megjelenő &lt;a href="http://norvig.com/21-days.html"&gt;Teach yourself L# in one hour (including a 10 minutes long coffee break)&lt;/a&gt; című könyv.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/72294588039662900-3014216988991608468?l=otperc.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OtPercDotnet/~4/ocZgcjoOW1U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://otperc.net/feeds/3014216988991608468/comments/default" title="Megjegyzések küldése" /><link rel="replies" type="text/html" href="http://otperc.net/2010/01/visual-studio-2010-sexy-edition.html#comment-form" title="0 megjegyzés" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/3014216988991608468?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/3014216988991608468?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OtPercDotnet/~3/ocZgcjoOW1U/visual-studio-2010-sexy-edition.html" title="Visual Studio 2010 Sexy Edition" /><author><name>Molnár Gergő</name><uri>http://www.blogger.com/profile/05139074877599679722</uri><email>gergo.molnar@otperc.net</email><gd:extendedProperty name="OpenSocialUserId" value="15966951835176790603" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_hb-k5lQC-M8/S1Cssz5lH-I/AAAAAAAAAp8/E1OCdlCTpqU/s72-c/Visual_Studio_Sexy_Edition.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://otperc.net/2010/01/visual-studio-2010-sexy-edition.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYCRnkyeSp7ImA9WxBRGUs.&quot;"><id>tag:blogger.com,1999:blog-72294588039662900.post-8082423188871659445</id><published>2010-01-08T16:20:00.001+01:00</published><updated>2010-01-08T16:22:47.791+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-08T16:22:47.791+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term=".NET Framework 4.0" /><title>Enum.TryParse</title><content type="html">&lt;p&gt;
Tegyük fel, hogy van egy ilyen enumerációnk:
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;enum&lt;/span&gt; Fruit
{
    Apple,
    Pear,
    Grape
}&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
Amennyiben valahonnan egy ilyen enum értéket sztringként kaptunk meg (tehát pl. volt egy olyan sztringünk, hogy "Apple"), és azt szerettük volna a konkrét enum értékke alakítani, az &lt;tt&gt;Enum.Parse()&lt;/tt&gt; statikus metódushoz fordulhattunk segítségért:
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ParseEnum(&lt;span class="kwrd"&gt;string&lt;/span&gt; fruitName)
{
    Fruit fruit = &lt;span class="kwrd"&gt;default&lt;/span&gt;(Fruit);
    &lt;span class="kwrd"&gt;bool&lt;/span&gt; parsingSuccesful;

    &lt;span class="kwrd"&gt;try&lt;/span&gt;
    {
        fruit = (Fruit)Enum.Parse(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(Fruit), fruitName);
        parsingSuccesful = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
    }
    &lt;span class="kwrd"&gt;catch&lt;/span&gt; (ArgumentException)
    {
        parsingSuccesful = &lt;span class="kwrd"&gt;false&lt;/span&gt;;
    }

    &lt;span class="kwrd"&gt;if&lt;/span&gt; (parsingSuccesful)
    {
        Console.WriteLine(&lt;span class="str"&gt;"Enum parsed succesfully, value: {0}."&lt;/span&gt;, fruit);
    }
    &lt;span class="kwrd"&gt;else&lt;/span&gt;
    {
        Console.WriteLine(&lt;span class="str"&gt;"Enum couldn't be parsed."&lt;/span&gt;);
    }
}&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
Működni működik, de elég cifra kód. A Framework 4.0 Base Class Library-jében kapunk egy új, generikus metódust, a &lt;tt&gt;TryParse()&lt;/tt&gt;, amivel jóval egyszerűbbé és érthetőbbé válik a kód:
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ParseEnum40(&lt;span class="kwrd"&gt;string&lt;/span&gt; fruitName)
{
    Fruit fruit;

    &lt;span class="kwrd"&gt;if&lt;/span&gt; (Enum.TryParse(fruitName, &lt;span class="kwrd"&gt;out&lt;/span&gt; fruit))
    {
        Console.WriteLine(&lt;span class="str"&gt;"Enum parsed succesfully, value: {0}."&lt;/span&gt;, fruit);
    }
    &lt;span class="kwrd"&gt;else&lt;/span&gt;
    {
        Console.WriteLine(&lt;span class="str"&gt;"Enum couldn't be parsed."&lt;/span&gt;);
    }
}&lt;/pre&gt;
Külön szépség, hogy bár az &lt;tt&gt;Enum.TryParse()&lt;/tt&gt; egy generikus metódus (tehát valójában az &lt;tt&gt;Enum.TryParse&amp;lt;Fruit&amp;gt;()&lt;/tt&gt;-ot hívjuk), de a típusparamétert - mivel az ugyanaz, mint a második függvényparaméter, az out fruit típusa -, nem kell kiírnunk, a fordító &lt;i&gt;kiinferálja&lt;/i&gt; nekünk.
&lt;/p&gt;
&lt;p&gt;
Mindennek ellenére, hogy most már ilyen rettenetesen könnyű és szép enumokkal dolgozni, azért azt tartsuk észben, hogy az enum-sztring konverzió elég lassúcska, teljesítményérzékeny alkalmazásokban néha &lt;a href="http://soci.hu/blog/index.php/2009/02/05/net-teljesitmenyhangolasi-tapasztalatok-4/"&gt;rá kell programoznunk&lt;/a&gt;, ha nem akarunk odaborostásodni a gép elé.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/72294588039662900-8082423188871659445?l=otperc.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OtPercDotnet/~4/_2eG_hc-zBg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://otperc.net/feeds/8082423188871659445/comments/default" title="Megjegyzések küldése" /><link rel="replies" type="text/html" href="http://otperc.net/2010/01/enumtryparse.html#comment-form" title="2 megjegyzés" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/8082423188871659445?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/8082423188871659445?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OtPercDotnet/~3/_2eG_hc-zBg/enumtryparse.html" title="Enum.TryParse&lt;TEnum&gt;" /><author><name>Molnár Gergő</name><uri>http://www.blogger.com/profile/05139074877599679722</uri><email>gergo.molnar@otperc.net</email><gd:extendedProperty name="OpenSocialUserId" value="15966951835176790603" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://otperc.net/2010/01/enumtryparse.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4BQ306eSp7ImA9WxBRGEo.&quot;"><id>tag:blogger.com,1999:blog-72294588039662900.post-3087259120339299276</id><published>2010-01-07T15:23:00.004+01:00</published><updated>2010-01-07T15:35:52.311+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-07T15:35:52.311+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term=".NET Framework 4.0" /><title>.NET Framework 4 poszter</title><content type="html">&lt;p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_hb-k5lQC-M8/S0Xv27MeHYI/AAAAAAAAAo4/DoIDPT2zBLs/s1600-h/FW4Poster.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 132px;" src="http://1.bp.blogspot.com/_hb-k5lQC-M8/S0Xv27MeHYI/AAAAAAAAAo4/DoIDPT2zBLs/s200/FW4Poster.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5424005053119602050" /&gt;&lt;/a&gt;
A "fejlesztői poszterek" az internet feltalálása óta valószínűleg a világ leghaszontalanabb dolgai közé számítanak, ennek ellenére szeretjük őket.&lt;br /&gt;
Egy fejlesztői szoba osztályokat ábrázoló poszterek nélkül olyan, mint egy lakatosműhely &lt;a href="http://blogs.coventrytelegraph.net/passtheremote/samfox.jpg"&gt;Samantha Fox&lt;/a&gt; poszter nélkül: jó, jó, de nem igazán kelt professzionális hatást.
&lt;/p&gt;
&lt;p&gt;
A Framework 4.0-ás verziójának közelgő megjelenésével egyúttal a szabad falfelületek további apadására is lehet számítani: &lt;a href="http://download.microsoft.com/download/E/6/A/E6A8A715-7695-493C-8CFA-8E0C23A4BE1D/098-115952-NETFX4-Poster.pdf"&gt;NETFX4-Poster.pdf&lt;/a&gt;!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/72294588039662900-3087259120339299276?l=otperc.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OtPercDotnet/~4/0jZTKkIl_w8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://otperc.net/feeds/3087259120339299276/comments/default" title="Megjegyzések küldése" /><link rel="replies" type="text/html" href="http://otperc.net/2010/01/net-framework-4-poszter.html#comment-form" title="0 megjegyzés" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/3087259120339299276?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/3087259120339299276?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OtPercDotnet/~3/0jZTKkIl_w8/net-framework-4-poszter.html" title=".NET Framework 4 poszter" /><author><name>Molnár Gergő</name><uri>http://www.blogger.com/profile/05139074877599679722</uri><email>gergo.molnar@otperc.net</email><gd:extendedProperty name="OpenSocialUserId" value="15966951835176790603" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_hb-k5lQC-M8/S0Xv27MeHYI/AAAAAAAAAo4/DoIDPT2zBLs/s72-c/FW4Poster.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://otperc.net/2010/01/net-framework-4-poszter.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8ERHY_fip7ImA9WxBRGEs.&quot;"><id>tag:blogger.com,1999:blog-72294588039662900.post-3254898300286232662</id><published>2010-01-06T18:24:00.006+01:00</published><updated>2010-01-07T11:40:05.846+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-07T11:40:05.846+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SQL" /><title>Miért pont 1753-01-01?</title><content type="html">&lt;p&gt;
Vajon miért pont 1753 január 1. a legkorábbi dátum, amit az SQL Server a datetime típusban tárolni képes? &lt;i&gt;For some historical reasons&lt;/i&gt; - jelen esetben szó szerint.
&lt;/p&gt;
&lt;p&gt;
Bár az embernek könnyen úgy tűnhet, hogy az, hogy mi most 2010-et írunk, valami egyetemleges reprezentációja az idő múlásának, igazából számos naptár-rendszer létezett, és létezik ma is (az ortodox zsidók szerint pl. most 5770 van).&lt;br /&gt;
Európa nagy részén már a mai időszámítás kezdetétől a Juliánusz-naptárat használták, ami körülbelül ugyanaz, mint a ma is használatos naptár, leszámítva, hogy nincsenek benne szökőévek. (update: Voltak benne szökőévek - pont az volt a baj, hogy túl sok. A Julián-naptár éve mintegy 11 perccel hosszabb, mint a tropikus év.) Emiatt viszont lassan "csúszkálni" kezdtek az évszakok, ami nem volt túl kellemes. A tarthatatlan helyzetet megoldandó, XIII. Gergely pápa kidolgozta a Gregorián- (Gergely-) naptárat, amiben egyrész már voltak szökőnapok, másrészt a bevezetésének volt egy kis trükkje, mert az addig összeszedett csúszást át kellett "időugrani".
&lt;/p&gt;
&lt;p&gt;
Nem is volt zökkenőmentes a bevezetés, az országok szinte egyenként vezették csak be. Az angolszász világ pl. 1752 szeptember 4.-én - másnap már egy szép őszi szeptember 14 virradt rájuk. Az 1752 szeptember 14 előtti dátumok kezelése így több szempontból is problémás: egyrészt a hiányzó 10 nap miatt, másrészt kultúrától függően mást-mást jelent egy dátum, meg aztán az se világos, hogy előtte akkor kell-e számolni a szökőévekkel, vagy sem...
&lt;/p&gt;
&lt;p&gt;
A SQL Server fejlesztő a &lt;del&gt;Microso&lt;/del&gt; Sybase-nél pedig egy huszárvágással letudták a nehézségeket: nem kezelnek 1753 előtti dátumokat.
&lt;/p&gt;
&lt;p&gt;
Persze voltak államok, ahol még ennél is később vezették be a Gergely-naptárat, a nagy Szovjetúnióban pl. csak az első világháború után - nem véletlenül volt a Nagy &lt;i&gt;Októberi&lt;/i&gt; Szocialista Forradalom évfordulója november 7.-én...
&lt;br /&gt;
&lt;i&gt;By the way&lt;/i&gt;, azt tudják, hogy miért 31 napos július meg augusztus is, miközben a február meg ilyen rövidke? Hát mert augusztust Augustus császárról nevezték el, egészen konkrétan ő maga nevezte át a nyilvánvalóan sokkal bénább Sextilius (update: helyesen: Sextilis) névről - viszont ez a hónap csak 30 napos volt, szemben a Julius caesarról elnevezett szomszéd Júliussal, ami meg 31, úgyhogy az amúgy is kicsit rövidebbre sikerült februárból (annak már úgy is mindegy) egy nap le lett csípve, és &lt;del&gt;Sextil&lt;/del&gt; augusztushoz adva. Hiába, no, &lt;a href="http://www.youtube.com/watch?v=AVZ-BOfC5fI"&gt;a szerénység&lt;/a&gt; gyakran együtt jár az ilyen pozíciókkal!
&lt;/p&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/72294588039662900-3254898300286232662?l=otperc.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OtPercDotnet/~4/3np4gdGh55g" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://otperc.net/feeds/3254898300286232662/comments/default" title="Megjegyzések küldése" /><link rel="replies" type="text/html" href="http://otperc.net/2010/01/miert-pont-1753-01-01.html#comment-form" title="3 megjegyzés" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/3254898300286232662?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/3254898300286232662?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OtPercDotnet/~3/3np4gdGh55g/miert-pont-1753-01-01.html" title="Miért pont 1753-01-01?" /><author><name>Molnár Gergő</name><uri>http://www.blogger.com/profile/05139074877599679722</uri><email>gergo.molnar@otperc.net</email><gd:extendedProperty name="OpenSocialUserId" value="15966951835176790603" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://otperc.net/2010/01/miert-pont-1753-01-01.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUABR3ozcCp7ImA9WxBRFkw.&quot;"><id>tag:blogger.com,1999:blog-72294588039662900.post-7318052933064259302</id><published>2010-01-04T15:59:00.006+01:00</published><updated>2010-01-04T16:09:16.488+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-04T16:09:16.488+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="gotchas" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>Klasszikus (módú) szívás</title><content type="html">&lt;p&gt;
Ha egy webalkalmazásunkban szeretnénk a HTTP response-hoz saját header érték(ek)et fűzni, kézenfekvő&lt;i&gt;(nek tűnik)&lt;/i&gt; a megoldás: elérjük a HttpResponse példányunkat, azon van egy Headers kollekció, annak meg van Add metódusa:
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
Response.Headers.Add(&lt;span class="str"&gt;"MyHeaderInfo"&lt;/span&gt;, &lt;span class="str"&gt;"XY"&lt;/span&gt;);&lt;/pre&gt;
&lt;p&gt;
&lt;/p&gt;
Erre IIS 5 / 6 / 7 Classic Mode alatt egy PlatformNotSupportedException-t kapunk, merthogy &lt;i&gt;"This operation requires IIS integrated pipeline mode."&lt;/i&gt;. Mifene, classic módban nem tudunk headereket hozzáadni a response-hoz? Természetesen de, csak másképp:
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
Response.AddHeader(&lt;span class="str"&gt;"MyHeaderInfo"&lt;/span&gt;, &lt;span class="str"&gt;"XY"&lt;/span&gt;);&lt;/pre&gt;
Vagy használhatjuk az AppendHeader() metódust is, pont ugyanazt csinálja, mint az AddHeader (az AddHeader valójában egyszerűen csak továbbhív az AppendHeaderre, ami a valódi mágiát csinálja, &lt;a href="code://System.Web:2.0.0.0:b03f5f7f11d50a3a/System.Web.HttpResponse/AppendHeader(String,String)"&gt;érdemes megreflektorozni&lt;/a&gt;).
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/72294588039662900-7318052933064259302?l=otperc.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OtPercDotnet/~4/-qTKz9CLRzA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://otperc.net/feeds/7318052933064259302/comments/default" title="Megjegyzések küldése" /><link rel="replies" type="text/html" href="http://otperc.net/2010/01/klasszikus-modu-szivas.html#comment-form" title="0 megjegyzés" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/7318052933064259302?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/7318052933064259302?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OtPercDotnet/~3/-qTKz9CLRzA/klasszikus-modu-szivas.html" title="Klasszikus (módú) szívás" /><author><name>Molnár Gergő</name><uri>http://www.blogger.com/profile/05139074877599679722</uri><email>gergo.molnar@otperc.net</email><gd:extendedProperty name="OpenSocialUserId" value="15966951835176790603" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://otperc.net/2010/01/klasszikus-modu-szivas.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0MMRnk7fCp7ImA9WxBSGE4.&quot;"><id>tag:blogger.com,1999:blog-72294588039662900.post-4699335806978128227</id><published>2009-12-26T14:27:00.006+01:00</published><updated>2009-12-26T14:51:27.704+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-26T14:51:27.704+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="private life" /><title>Community Powa</title><content type="html">&lt;p&gt;Kerestem fülbe dugható fülhallgatót. Szerencse, hogy az Interneten számos ár-összehasonlító oldal létezik, így a keresgélés jóval egyszerűbb - ráadásul a legtöbb helyen pontozni, kommentezni is lehet az egyes termékeket, így már vásárlás előtt teljes képet kaphat a megvásárolni kívánt portákáról. Találtam is egy elég szimpatikus darabot, a &lt;a href="http://www.argep.hu/product_380921.html"&gt;Sennheiser CX 300-as modelljét&lt;/a&gt;, nézzük, mit írnak róla!

&lt;blockquote&gt;
&lt;i&gt;"Ma vettem és elsőre letaglózott. ...10-es skálán 8-ast adnék neki, de így 5-ös skálán legyen 5-ös. Jó érték-arány, professzionális hangzás. Csak ajánlani tudom!"&lt;/i&gt;
&lt;/blockquote&gt;

Na, hát ez kiváló, bár a 10-es skálán 8-as eredményt ötös skálán ötössé konvertálni elég furcsa, lehet, hogy inkább egy másik értékelő véleményére kéne hallgatni. Nézzük mit ír a következő!

&lt;blockquote&gt;
&lt;i&gt;"Egy olcsóbb Panasonic inear-t szerettem volna leváltani vele. Nem sikerült. Annak ellenére, hogy Sennheiser, a hangja borzalmas, egyszerűen sérti a fület. Mindenféle EQ beállítással kipróbáltam, de egyik sem jött be. A közepei üvöltenek, a magas is sok, mélye pedig egyáltalán nincs. Nagyot csalódtam a gyártóban."&lt;/i&gt;
&lt;/blockquote&gt;

Ajaj, hát ezek szerint ez mégsem annyira tökéletes. De várjunk csak, nézzük mit írnak még:

&lt;blockquote&gt;
&lt;i&gt;"A legjobb! Ez előtt kb. 20-30 fülest kipróbáltam, de egyik se váltotta be a hozzá fűzött reményeket... Már fél éve használom a CX300-at és bátran kijelenthetem, hogy ez a legjobb ár/érték téren. Gyönyörűen szól! A 25Hz-es szinuszhullámtól, amit ráadtam, azt hittem, hogy fölrobbantja a fejem."&lt;/i&gt;
&lt;/blockquote&gt;

Hát akkor mégis elég jó lehet, bár itt megint számolni azoknak az embereknek a beszámíthatósági faktorával, akik 25Hz-es szinuszt hallgatnak.&lt;br /&gt;
Jobb lenne valami zenei műveltséggel bíró személy tapasztalataira... de hoppá, hát itt van!

&lt;blockquote&gt;
&lt;i&gt;"zenélek már 16 éve,és ugyan abszolút hallásom nincs,de tökéletes zenei relatív hallásom van,ilyen képességek birtokába mondom erről a fülesről hogy egy minőségi darab.csak akik a sok rosszon éltek előtte,azoknak ez most túl erős /gyenge lehet attól függ ogy előtte milyen fülesük volt. érdemes az eq-val próbálkozni,kiválló hangzást lehet elérni vele."&lt;/i&gt;
&lt;/blockquote&gt;

Na, hát jó ez az írástudók szerint is. Akkor most már biztos, hogy jó lesz. Na még egy véleményt elolvasok...

&lt;blockquote&gt;
&lt;i&gt;"Egyszerüen nem szól tisztán. Kár, hogy megvettem. Kásás és a magas az szörnyű. Próba kell mindenképpen mielött megveszed, mert ha valaki erre 16 év zenélés után rámondja, hogy minőségi, akkor tényleg megosztja rendesen az embereket. Az ilyen vélemény maximum egy utalás arra aki zenéhez értőnek tartja magát."&lt;/i&gt;
&lt;/blockquote&gt;

Hajjaj, akkor most mégsem?

&lt;blockquote&gt;
&lt;i&gt;"Kitűnő hangzás, kitűnő dinamika, kitűnő kivitelezés! Ezzel lehetne jellemezni a CX300-at! Bődületesen jól szól! Mindenkinek csak ajánlani tudom!"&lt;/i&gt;
&lt;/blockquote&gt;

De, jó ez, kitűnő!

&lt;blockquote&gt;
&lt;i&gt;"Nulla a cucc! Sajnálom, hogy megvettem. Ami ebből szól, azt ne nevezzük hangzásnak."&lt;/i&gt;
&lt;/blockquote&gt;

Jajj, nem. Mégsem. Vagy...?

&lt;blockquote&gt;&lt;i&gt;"A Sennheiser cx300 a legjobb ami valaha a fülemben volt!!! Leginkább a munkahelyemen használom a fülest, hogy "gyorsabban teljen az idő"."&lt;/i&gt;&lt;/blockquote&gt;

Na, akkor most jó ez...

&lt;blockquote&gt;
&lt;i&gt;"Egy hifi üzletben volt lehetőségem vásárlás előtt meghallgatni. Ezek után a vásárlás elmaradt!"&lt;/i&gt;
&lt;/blockquote&gt;

Nem, mégsem, vagy...?

&lt;/p&gt;
&lt;p&gt;
És így tovább, a végtelenségig. Műértők szakvéleményei, majd a műértők hozzá nem értését leleplező műértő írások, szépen, sorban, egymás alatt, a személyeskedő anyázás határmezsgyéjét még épp át nem lépve (amivel ez a fórum egyébként a kultúráltabbak közé pozícionálódik).&lt;br /&gt;
Ráadásul a kis füldugasz ára elég szép szórást mutat, 6.734 Ft-tól kerek 12.000 Ft-ig kapható, ami a következő, a széles nyilvánosság számára elérhető felületeken óhatatlanul felbukkanó kaszt, a &lt;i&gt;beavatottak&lt;/i&gt; számára olyan magas labda, amit nem lehet nem lecsapni. Megtudhatjuk, hogy ezt a modellt hamisítják, sok helyen a boltokban is hamisítványt kapni, 8000 alatt biztos, afölött meg ki tudja, hát ki, ki más tudná, mint a nagybetűs FÓRUMOZÓ, csak szét kell bontani a borítást, és lesz ott egy szám, ami ha négyessel kezdődik, akkor eredeti, ha hatos, akkor hamis, és mint ilyen, kerülendő, sz*r, értéktelen szemét.
&lt;/p&gt;
&lt;p&gt;
Végül az lett, hogy legutóbb, mikor a szokásos ünnepek előtti nagybevásárlást intéztem egy hyperben (fel kellett tölteni az égetettszesz-készleteket), leakasztottam a szögről egy Panasonic fülest, 1990 Ft, nem egy audiophile cucc, de a célnak megfelel, az &lt;a href="http://www.youtube.com/watch?v=49LWy8rzW6E"&gt;Asian Dub Foundation&lt;/a&gt; egész meggyőzően dörren meg rajta reggel a négyeshatoson.&lt;br /&gt;
Mi lett volna velem a Közösség nélkül? Valószínű egy háromszor (esetleg négyszer, ötször, vagy hatszor) ilyen drága fülest tömködnék reggelente a fülembe, aztán gondolkozhatnék erősen, hogy most amit hallok, az tetszik-e nekem, vagy sem.
&lt;/p&gt;
&lt;p&gt;
Community power, köszönöm!
&lt;/p&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/72294588039662900-4699335806978128227?l=otperc.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OtPercDotnet/~4/M2vx1U4YtJM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://otperc.net/feeds/4699335806978128227/comments/default" title="Megjegyzések küldése" /><link rel="replies" type="text/html" href="http://otperc.net/2009/12/community-powa.html#comment-form" title="10 megjegyzés" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/4699335806978128227?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/4699335806978128227?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OtPercDotnet/~3/M2vx1U4YtJM/community-powa.html" title="Community Powa" /><author><name>Molnár Gergő</name><uri>http://www.blogger.com/profile/05139074877599679722</uri><email>gergo.molnar@otperc.net</email><gd:extendedProperty name="OpenSocialUserId" value="15966951835176790603" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">10</thr:total><feedburner:origLink>http://otperc.net/2009/12/community-powa.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU4BQ388eCp7ImA9WxBSEUk.&quot;"><id>tag:blogger.com,1999:blog-72294588039662900.post-1153961684605027134</id><published>2009-12-18T14:42:00.002+01:00</published><updated>2009-12-18T14:45:52.170+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-18T14:45:52.170+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="CLR" /><title>Kovariancia és kontravariancia C# 4.0-ban</title><content type="html">&lt;h4&gt;Miről beszélünk?&lt;/h4&gt;  &lt;p&gt;C#-ban egy referencia típusú változó mindig a saját típusára, vagy az abból leszármazott típusra mutathat. Ez teljesen transzparens, amikor egy object referencián meghívsz egy metódust, mindegy, hogy a referencia tényleg egy object-re, string-re, Kiskutya-ra mutat-e. Ezzel valószínűleg mindenki találkozott már az első &amp;quot;Objektum-orientált programozás&amp;quot; órán, valamint azóta kb. egycsilliárdszor.    &lt;br /&gt;Nevezzük ezt mondjuk &amp;quot;egyes számú szabály&amp;quot;-nak.&lt;/p&gt;  &lt;p&gt;Ha két típust (mondjuk T-t és U-t) egymáshoz hasonlítunk, az alábbi négy lehetőségből pontosan egy lesz igaz:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;T nagyobb, mint U (OOP terminológiával: T őse U-nak - a System.Object őse a System.String-nek, tehát az object nagyobb, mint a string) &lt;/li&gt;    &lt;li&gt;T kisebb, mint U (OOP terminológiával: T leszármazottja U-nak - a System.String a System.Object leszármazottja, tehát a string kisebb, mint az object) &lt;/li&gt;    &lt;li&gt;T egyenlő U-val (OOP terminológiával: T és U ugyanaz a típus) &lt;/li&gt;    &lt;li&gt;T-nek nincs kapcsolata U-val (OOP terminológiával: navajon?) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Vegyünk egy műveletet, ami a típusokkal mókol valamit, egy adott típusból egy másikat csinál valamilyen szabály alapján: T-ból T'-t, U-ból U'-t.&lt;/p&gt;  &lt;p&gt;Hogyha a T' ugyanolyan relációban lesz U'-vel (a fenti négyből), mint T volt U-val, akkor a művelet kovariáns. Ha a művelet megfordítja a relációt (pontosabban: a kisebbséget-nagyobbságot megfordítja, az egyenlőséget és a &amp;quot;közömbösséget&amp;quot; változatlanul hagyja), akkor a művelet kontravariáns.&lt;/p&gt;  &lt;h4&gt;Érthetetlen, ugye? Nézzünk egy példát!&lt;/h4&gt;  &lt;p&gt;Adott két típus, mondjuk a System.Object és a System.String (közülük az object a &amp;quot;nagyobb&amp;quot;). Most vegyünk egy &amp;quot;műveletet&amp;quot;, ami csinál valamit a típusokkal. Ilyen művelet például a &amp;quot;képezzünk T tömböt&amp;quot;, vagy a &amp;quot;képezzünk T listát&amp;quot;. Lesz tehát object[] (aka. T'), string[] (aka. U'), List&amp;lt;object&amp;gt; (legyen mondjuk T''), List&amp;lt;string&amp;gt; (logikusan U'') típusunk.&lt;/p&gt;  &lt;p&gt;Milyen viszonban vannak ezek a típusok egymással? Az object[] nagyobb, mint a string[]? Hát nézzük meg, az egyes számú szabály értelmében, ha az, akkor értékül lehet neki adni:&lt;/p&gt;  &lt;p&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;// C# 1.0 kód&lt;/span&gt;
&lt;span class="kwrd"&gt;string&lt;/span&gt;[] stringArray = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;[] { &lt;span class="str"&gt;&amp;quot;http://&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;otperc&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;.net&amp;quot;&lt;/span&gt; };
&lt;span class="kwrd"&gt;object&lt;/span&gt;[] objectArray = stringArray;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;A C#-ban a tömbképzés már a nyelv legelső verziója óta kovariáns.&lt;/p&gt;

&lt;p&gt;És a List&amp;lt;string&amp;gt; castolható List&amp;lt;object&amp;gt;-té?&lt;/p&gt;

&lt;p&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;// C# 2.0 kód&lt;/span&gt;
var stringList = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; { &lt;span class="str"&gt;&amp;quot;http://&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;otperc&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;.net&amp;quot;&lt;/span&gt; };
var objectList = (List&amp;lt;&lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;)stringList; // ez nem fordul!&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Erre bizony még a nyelv 3.0-ás változatában is egy &amp;quot;Cannot convert type 'System.Collections.Generic.List&amp;lt;string&amp;gt;' to 'System.Collections.Generic.List&amp;lt;object&amp;gt;'&amp;quot; a fordító válasza.&lt;/p&gt;

&lt;h4&gt;Veszélyes utakon&lt;/h4&gt;

&lt;p&gt;De vajon ha a tömböknél meg tudták oldani a dolgot már az 1.0-ban, akkor miért nem ment a genericnél a másodiknál? &lt;a href="http://blogs.msdn.com/ericlippert/about.aspx"&gt;Eric Lippert&lt;/a&gt; azt mondja erről: &amp;quot;&lt;em&gt;az a mód, ahogy a C# támogatja a tömböknél a kovarianciát, &lt;/em&gt;broken&lt;em&gt;. 
    &lt;br /&gt;Azért került be a CLR-be, mert a CLR tervezői képessé akarták tenni azt a Java(-szerű) nyelvek támogatására, és ehhez szükség volt rá. Aztán mi beraktuk a C#-ba, ha már a CLR-ben bent volt. Sokat vitatkoztunk ezen a döntésen, és ma már nem örülök neki túlságosan, hogy így alakult, de most már nem sok mindent tudunk csinálni.&lt;/em&gt;&amp;quot; &lt;/p&gt;

&lt;p&gt;Miről beszél Lippert? Lássunk egy példakódot:&lt;/p&gt;

&lt;p&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; GetDataMethod(&lt;span class="kwrd"&gt;object&lt;/span&gt;[] objectArrayParam)
{
    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var item &lt;span class="kwrd"&gt;in&lt;/span&gt; objectArrayParam)
    {
        Console.WriteLine(item);
    }
}

&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SetDataMethod(&lt;span class="kwrd"&gt;object&lt;/span&gt;[] objectArrayParam)
{
    objectArrayParam[0] = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;();
}

&lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)
{
    &lt;span class="kwrd"&gt;string&lt;/span&gt;[] stringArray = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;[] { &lt;span class="str"&gt;&amp;quot;http://&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;otperc&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;.net&amp;quot;&lt;/span&gt; };
    &lt;span class="kwrd"&gt;object&lt;/span&gt;[] objectArray = stringArray;

    GetDataMethod(objectArray);
    SetDataMethod(objectArray);
}&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Az első metódus lefut, de a második futtatásakor egy &amp;quot;ArrayTypeMismatchException: Attempted to access an element as a type incompatible with the array.&amp;quot; üzenetet kapunk. A hangsúly a futtatásakoron van: sikerült egy erősen típusos nyelvbe egy olyan konstrukciót beemelni, ami remek lehetőséget ad a compile-time típusbiztosság-ellenőrzés kikerülésére - amivel pedig megnyílnak a pokol kapui.&lt;/p&gt;

&lt;h4&gt;A helyes út&lt;/h4&gt;

&lt;p&gt;A C# 2.0-tól van olyan variancia-támogatás is a nyelvben, ami nem “&lt;em&gt;broken&lt;/em&gt;”, méghozzá a generikus delegate-ek:&lt;/p&gt;

&lt;p&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; GetString()
{
    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;http://otperc.net&amp;quot;&lt;/span&gt;;
}

&lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)
{
    Func&amp;lt;&lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt; functionThatReturnsObject;
    functionThatReturnsObject = GetString;
    &lt;span class="kwrd"&gt;object&lt;/span&gt; o = functionThatReturnsObject();
}&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;A Func&amp;lt;T&amp;gt; egy T típust visszaadó metódust reprezentál - tehát a Func&amp;lt;object&amp;gt; egy olyat, ami object-et ad vissza. Ez a &amp;quot;metódusreferencia&amp;quot; bátran mutathat olyan metódusra, ami string-et ad vissza. Mi baj lehet? Semmi. A hívó ugy is object-et vár, nem érheti meglepetés. Bármi olyanra mutathatunk, ami specializáltabb, mint mi (az object-es példa esetében praktikusan bármire). Visszafele viszont nem megy a dolog, ha a hívó string-et vár, nem adhatunk object-et.&lt;/p&gt;

&lt;p&gt;A generikus delegate-ek a castolása visszaadott típusokra nézve kovariáns.&lt;/p&gt;

&lt;p&gt;Nézzük a másik esetet, mikor a típusparaméter nem a visszaadott típust, hanem a paraméter típusát mondja meg. Az Action&amp;lt;T&amp;gt; delegate egy visszatérési érték nélküli, egy T típusú paramétert váró metódust reprezentál. Ha egy metódus mondjuk object-et vár, bátran elérhetjük egy olyan Action-ön keresztül, ami string-et (vagy bármi már specializáltabbat) vár, mert az &amp;quot;alatta lévő&amp;quot;, object-et váró metódus simán meg fogja enni:&lt;/p&gt;

&lt;p&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ConsumeObject(&lt;span class="kwrd"&gt;object&lt;/span&gt; obj)
{
    Console.WriteLine(obj);
}

&lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)
{
    Action&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; methodThatConsumesString = ConsumeObject;
    methodThatConsumesString(&lt;span class="str"&gt;&amp;quot;http://otperc.net&amp;quot;&lt;/span&gt;);
}&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;A generikus delegate-ek castolása a paraméterek típusára nézve kontravariáns - a típusbiztosság pedig mindkét esetben compile-time ellenőrzött.&lt;/p&gt;

&lt;h4&gt;Variancia a C# 4.0-ban&lt;/h4&gt;

&lt;p&gt;Eddig láttunk példát a kontra- és kovarianciára is, annak jó és kevésbé jó implementációjára tömböknél, delegate-eknél. Egy valamit nem láttunk általános generikus típusoknál, pl. egy List&amp;lt;T&amp;gt;-nél a variancia használatára. Azért nem láttunk, mert nincs. C# 3.0-ig nem volt lehetőségünk mondjuk egy List&amp;lt;string&amp;gt;-et List&amp;lt;object&amp;gt;-té castolni - C# 4.0-tól majd lesz. Bizonyos esetekben.&lt;/p&gt;

&lt;p&gt;Nem meglepő, hogy ezt a fajta támogatást a nyelvbe &amp;quot;nem-broken&amp;quot; módon igyekeznek behozni - a klasszikus kecskés-káposztás felállásban, miszerint használhassunk kontra- vagy kovariáns hozzárendeléseket ott, ahol azok működőképesek és hasznosak, de maradjon meg a fordításidejű típusbiztosság-ellenőrzés is. Hogy tudjuk szétszeparálni az működő eseteket a nem-működőktől? Nézzük meg újra a legelső példakódunkat:&lt;/p&gt;

&lt;p&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;GetDataMethod(objectArray); &lt;span class="rem"&gt;// ez a metódus lefut&lt;/span&gt;
SetDataMethod(objectArray); // ez ArrayTypeMismatchException-t dob&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Miért tud futni az első, és miért nem a második? Mi a különbség? 
  &lt;br /&gt;Mondjuk első közelítésben az &amp;quot;adatáramlás iránya&amp;quot;. Az elsőben csak iterálunk, &amp;quot;kiveszünk&amp;quot; adatokat, míg a másodikban &amp;quot;berakni&amp;quot; próbálunk.&lt;/p&gt;

&lt;p&gt;A delegate-es példánál is, a visszatérési érték típusa (&amp;quot;kimenő irány&amp;quot;) kovariáns - ami X típust ad vissza, az visszaadhat X-et, vagy bármi specializáltabbat. A másik irányba meg fordítva.&lt;/p&gt;

&lt;p&gt;A C# 4.0-ba két új kulcsszó került be a variancia támogatására: az in és az out varianciamódosítót (jó, egyikük kulcsszó-pályafutásának sem ez a kezdete, de ez most egy új szerepkör). Ezzel a két kulcsszóval generikus interface-ek típusparamétereit jelölhetjük meg, mint &amp;quot;bemeneti&amp;quot; (kontravariáns) vagy &amp;quot;kimeneti&amp;quot; (kovariáns) paraméter.&lt;/p&gt;

&lt;p&gt;Egy példa talán érthetőbbé teszi a dolgot: vegyük például az IEnumerable&amp;lt;T&amp;gt; generikus interfészt. Egy ilyen osztályból T típusú elemek &amp;quot;jönnek ki&amp;quot; - tehát T-nél &amp;quot;nagyobb&amp;quot;, általánosabb elemeket is kivehetünk. Egy IEnumerable&amp;lt;string&amp;gt; vígan tud IEnumerable&amp;lt;object&amp;gt;-ként is viselkedni. Bajt nem csinálhatunk, mert &amp;quot;befele&amp;quot; nem megy adat, nem fordulhat elő, hogy egy, magát IEnumerable&amp;lt;object&amp;gt;-nek mutató IEnumerable&amp;lt;string&amp;gt;-be egy int típusú adatot rakunk, merthogy az object megbírja azt is.&lt;/p&gt;

&lt;p&gt;A .NET Framework 4.0-ban ennek az interfésznek így néz ki a definíciója:&lt;/p&gt;

&lt;p&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; IEnumerable&amp;lt;&lt;span class="kwrd"&gt;out&lt;/span&gt; T&amp;gt; : IEnumerable
{
    IEnumerator&amp;lt;T&amp;gt; GetEnumerator();
}&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Azzal, hogy ki lett rakva az out, a T paraméter kovariánssá vált:&lt;/p&gt;

&lt;p&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;// C# 4.0 kód:&lt;/span&gt;
IEnumerable&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; enumerableOfString =
    &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;[] { &lt;span class="str"&gt;&amp;quot;http://&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;otperc&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;.net&amp;quot;&lt;/span&gt; };
IEnumerable&amp;lt;&lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt; enumerableOfObject = enumerableOfString;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Annak pedig, hogy az out-ot ki lehetett rakni, egy előfeltétele volt: a T csak a &amp;quot;kimeneti oldalon&amp;quot; szerepelt az interfész definíciójában. 
  &lt;br /&gt;Most nézzünk meg egy másik interfészt:&lt;/p&gt;

&lt;p&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; IComparer&amp;lt;&lt;span class="kwrd"&gt;in&lt;/span&gt; T&amp;gt;
{
    &lt;span class="kwrd"&gt;int&lt;/span&gt; Compare(T x, T y);
}&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Itt most az &amp;quot;in&amp;quot; módosítót használták, a T paramétert kontravariánssá téve - talán most már nem túl meglepő a felfedezés, hogy a T csak bemenő paraméterként használt. T helyére bepasszol T, vagy bámi nála specializáltabb: egy comparer, ami össze tud hasonlítani két object-et, két stringet is össze tud.&lt;/p&gt;

&lt;p&gt;Természetesen az in és az out típusparaméterek használata nem csak a framework fejlesztők kiváltsága, mi is használhatjuk őket a saját &lt;strong&gt;interfészeinkben&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Osztályokon nem, azt egy &amp;quot;&lt;em&gt;Invalid variance modifier. Only interface and delegate type parameters can be specified as variant.&lt;/em&gt;&amp;quot; üzenettel jutalmazza a fordító. A variancia ugyanis műveleteken értelmezett, a műveleteket pedig leginkább a delegate-ek és az interfészek írják le. Az List&amp;lt;T&amp;gt; típusparaméterére nem rakhattak ilyen módosítót, mert a T ki- és bemenő oldalon is használt. Viszont az List&amp;lt;T&amp;gt; egyben IEnumerable&amp;lt;T&amp;gt; is (illetve IEnumerable&amp;lt;out T&amp;gt;), úgyhogy ha &amp;quot;azt az arcát mutatja&amp;quot;, akkor használhatjuk úgy.&lt;/p&gt;

&lt;p&gt;Szintén ellenőrzi a fordító, hogy ha in vagy out varianciamódosítót használsz, akkor a típusparamétered tényleg csak a megfelelő helyen bukkanjon fel, out paramétert bemenőként használva &amp;quot;&lt;em&gt;Invalid variance: The type parameter 'T' must be contravariantly valid on '&amp;lt;metódusnév&amp;gt;'. 'T' is covariant&lt;/em&gt;.&amp;quot; üzenetet kapunk, in-t kimenőként használva pedig &amp;quot;&lt;em&gt;Invalid variance: The type parameter 'T' must be covariantly valid on '&amp;lt;metódusnév&amp;gt;'. 'T' is contravariant&lt;/em&gt;.&amp;quot;-et.&lt;/p&gt;

&lt;h4&gt;A teljes és kendőzetlen igazság&lt;/h4&gt;

&lt;p&gt;Be kell vallanom: a fenti postból sok minden nem igaz. Illetve igaz, csak nem úgy. Néhol egyszerűsítésekkel éltem, pl. a “kisebbség-nagyobbság”, “hozzárendelhetőség” és a “leszármazás” fogalmait illene jobban tisztába rakni. Belátható, hogy a kettő nem ugyanaz, mert bár fentebb láttuk, hogy az IEnumerable&amp;lt;object&amp;gt;-nek símán értékül adhatjuk az IEnumerable&amp;lt;string&amp;gt;-et, ez az “egyes számú szabály” értelmében azt is jelenti, hogy az IEnumerable&amp;lt;string&amp;gt; öröklési láncában (bocs, megint pongyola vagyok, interfészről beszélünk: öröklési fájában) valahol szerepelnie kéne az IEnumerable&amp;lt;object&amp;gt;-nek. Egyet biztosíthatok: nem szerepel.&lt;/p&gt;

&lt;p&gt;Ha ezek a részletek is a helyükön lennének, akkor korrekt lenne az írás, viszont érthetetlen. A neten rengeteg anyag fellelhető, but I won’t bring it to you – you have to &lt;em&gt;bing&lt;/em&gt; it for yourself. :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/72294588039662900-1153961684605027134?l=otperc.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OtPercDotnet/~4/o3J5YeS6kKI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://otperc.net/feeds/1153961684605027134/comments/default" title="Megjegyzések küldése" /><link rel="replies" type="text/html" href="http://otperc.net/2009/12/covariance-and-contravariance-in-c-40.html#comment-form" title="0 megjegyzés" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/1153961684605027134?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/1153961684605027134?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OtPercDotnet/~3/o3J5YeS6kKI/covariance-and-contravariance-in-c-40.html" title="Kovariancia és kontravariancia C# 4.0-ban" /><author><name>Molnár Gergő</name><uri>http://www.blogger.com/profile/05139074877599679722</uri><email>gergo.molnar@otperc.net</email><gd:extendedProperty name="OpenSocialUserId" value="15966951835176790603" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://otperc.net/2009/12/covariance-and-contravariance-in-c-40.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUAR3czeyp7ImA9WxBTFEs.&quot;"><id>tag:blogger.com,1999:blog-72294588039662900.post-6968191924207301590</id><published>2009-12-10T16:47:00.006+01:00</published><updated>2009-12-10T17:24:06.983+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-10T17:24:06.983+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tips'N'Tricks" /><category scheme="http://www.blogger.com/atom/ns#" term="SQL" /><title>Összes tábla összes adatának törlése SQL Serverben</title><content type="html">&lt;p&gt;
Fejleszési-tesztelési időben előfordul, hogy szeretnénk "nyomni egy resetet" az adatbázisunkon: a séma marad, de ki szeretnék dobni minden adatot. TRUNCATE-eljünk mindent!
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="rem"&gt;-- disable all constraints&lt;/span&gt;
&lt;span class="kwrd"&gt;EXEC&lt;/span&gt; sp_MSForEachTable "&lt;span class="kwrd"&gt;ALTER&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt; ? &lt;span class="kwrd"&gt;NOCHECK&lt;/span&gt; &lt;span class="kwrd"&gt;CONSTRAINT&lt;/span&gt; &lt;span class="kwrd"&gt;all&lt;/span&gt;"

&lt;span class="rem"&gt;-- delete data in all tables&lt;/span&gt;
&lt;span class="kwrd"&gt;EXEC&lt;/span&gt; sp_MSForEachTable "&lt;span class="kwrd"&gt;DELETE&lt;/span&gt; &lt;span class="kwrd"&gt;FROM&lt;/span&gt; ?"

&lt;span class="rem"&gt;-- enable all constraints&lt;/span&gt;
&lt;span class="kwrd"&gt;EXEC&lt;/span&gt; sp_MSForEachTable "&lt;span class="kwrd"&gt;ALTER&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt; ? &lt;span class="kwrd"&gt;WITH&lt;/span&gt; &lt;span class="kwrd"&gt;CHECK&lt;/span&gt; &lt;span class="kwrd"&gt;CHECK&lt;/span&gt; &lt;span class="kwrd"&gt;CONSTRAINT&lt;/span&gt; &lt;span class="kwrd"&gt;all&lt;/span&gt;"
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
A középső sor a tényleges truncate, a kezdő-záró ALTER TABLE-ök csak a kényszerek betartatását kapcsolják ki, majd vissza - így a FOREIGN KEY-ek sem akadályozzák meg az adatok törlését.
&lt;/p&gt;
&lt;p&gt;
&lt;br /&gt;
az eredeti script és további bölcsességek a témában:&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/155246/how-do-you-truncate-all-tables-in-a-database-using-tsql"&gt;
How do you truncate all tables in a database using TSQL? @ StackOverflow&lt;/a&gt;&lt;br/&gt;
&lt;br /&gt;
az &lt;tt&gt;sp_MSforeachtable&lt;/tt&gt; tárolt eljárás további hasznos felhasználási lehetőségei:&lt;br /&gt;
&lt;a href="http://www.sqlservercurry.com/2009/04/8-common-uses-of-undocumented-stored.html"&gt;8 Common Uses of the undocumented Stored Procedure sp_MSforeachtable @ SQLServerCurry&lt;/a&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/72294588039662900-6968191924207301590?l=otperc.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OtPercDotnet/~4/0tlkDD37big" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://otperc.net/feeds/6968191924207301590/comments/default" title="Megjegyzések küldése" /><link rel="replies" type="text/html" href="http://otperc.net/2009/12/truncate-all-tables-sql-server.html#comment-form" title="2 megjegyzés" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/6968191924207301590?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/6968191924207301590?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OtPercDotnet/~3/0tlkDD37big/truncate-all-tables-sql-server.html" title="Összes tábla összes adatának törlése SQL Serverben" /><author><name>Molnár Gergő</name><uri>http://www.blogger.com/profile/05139074877599679722</uri><email>gergo.molnar@otperc.net</email><gd:extendedProperty name="OpenSocialUserId" value="15966951835176790603" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://otperc.net/2009/12/truncate-all-tables-sql-server.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4BQnw5fSp7ImA9WxBTEk0.&quot;"><id>tag:blogger.com,1999:blog-72294588039662900.post-9092359292281725556</id><published>2009-12-07T17:10:00.001+01:00</published><updated>2009-12-07T17:22:33.225+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-07T17:22:33.225+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><title>Forráskód másolása HTML-ként Visual Studio-ból</title><content type="html">&lt;p&gt;
Ha valamilyen technikai irományt (dokumentációt, blogbejegyzést, stb...) készítünk, gyakran lehet szükség arra, hogy abba forráskódot illesszünk be. Ez még nem agysebészet, Visual Studióban kódrészlet kijelöl, CTRL+C, CTRL+V, és kész, átmegy a szöveg.&lt;br /&gt;
Egy dolog viszont nem megy át: az a gyönyörű syntax highlight (na jó, Word-be átmegy). Pedig a Studio kódkiemelős funkciója remek, jó lenne azt úgy például HTML-ként kiemelni.
&lt;/p&gt;
&lt;p&gt;
Pont ezt tudja a CopySourceAsHtml nevű Visual Studio add-on, amit ingyenesen le lehet tölteni a &lt;a href="http://copysourceashtml.codeplex.com/"&gt;http://copysourceashtml.codeplex.com/&lt;/a&gt;-ról.&lt;br /&gt;
A 3.0-ás verzióban már egy .msi installert kapunk, next-next-finish telepítéssel. Utána egy egy VS újraindítás, és a File, Edit menükben, illetve a kijelölt szöveg context menüjében egy új elem bukkan fel: a Save/Copy as HTML.&lt;br /&gt;
Ha már vannak saját CSS stílusaink, azok használatára is beidomíthatjuk.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/72294588039662900-9092359292281725556?l=otperc.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OtPercDotnet/~4/ueugGcL4mNI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://otperc.net/feeds/9092359292281725556/comments/default" title="Megjegyzések küldése" /><link rel="replies" type="text/html" href="http://otperc.net/2009/12/copy-source-html-visual-studio.html#comment-form" title="2 megjegyzés" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/9092359292281725556?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/9092359292281725556?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OtPercDotnet/~3/ueugGcL4mNI/copy-source-html-visual-studio.html" title="Forráskód másolása HTML-ként Visual Studio-ból" /><author><name>Molnár Gergő</name><uri>http://www.blogger.com/profile/05139074877599679722</uri><email>gergo.molnar@otperc.net</email><gd:extendedProperty name="OpenSocialUserId" value="15966951835176790603" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://otperc.net/2009/12/copy-source-html-visual-studio.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MEQnc_eip7ImA9WxBTEE0.&quot;"><id>tag:blogger.com,1999:blog-72294588039662900.post-8620802403831214269</id><published>2009-12-05T08:00:00.002+01:00</published><updated>2009-12-05T11:36:43.942+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-05T11:36:43.942+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Patterns" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>Nullérték-vizsgálat egyszerűen</title><content type="html">&lt;p&gt;
Eredeti (Java-s) ötlet itt: &lt;a href="http://cesjava.freeblog.hu/archives/2009/10/13/a_NUllPointerException_transzparens_kezelese/"&gt;http://cesjava.freeblog.hu/archives/2009/10/13/a_NUllPointerException_transzparens_kezelese/&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Saját továbbgondolás (C#):
&lt;div style="font-family: Consolas; font-size: 10pt; color: black; background: white;"&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NullReferenceCheckExtensions&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; CheckIfNull&amp;lt;T&amp;gt;(&lt;span style="color: blue;"&gt;this&lt;/span&gt; T instance)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;where&lt;/span&gt; T : &lt;span style="color: blue;"&gt;class&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (instance == &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;string&lt;/span&gt; argumentInfo = TryGetArgumentInfo();&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (argumentInfo == &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; argumentInfo = &lt;span style="color: blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;&amp;quot;An instance of type '{0}'.&amp;quot;&lt;/span&gt;, &lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(T).FullName);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;throw&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ArgumentNullException&lt;/span&gt;(argumentInfo);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; TryGetArgumentInfo()&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;try&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; st = &lt;span style="color: blue;"&gt;new&lt;/span&gt; System.Diagnostics.&lt;span style="color: #2b91af;"&gt;StackTrace&lt;/span&gt;(&lt;span style="color: blue;"&gt;true&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; callerFrame = st.GetFrame(2);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; fileName = callerFrame.GetFileName();&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; fullSource = System.IO.&lt;span style="color: #2b91af;"&gt;File&lt;/span&gt;.ReadAllLines(fileName);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; info = fullSource[callerFrame.GetFileLineNumber() - 1].Trim();&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; info;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;catch&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;
Használat:
&lt;div style="font-family: Consolas; font-size: 10pt; color: black; background: white;"&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; MyMethod(&lt;span style="color: blue;"&gt;string&lt;/span&gt; name, &lt;span style="color: #2b91af;"&gt;Uri&lt;/span&gt; uri)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; name.CheckIfNull();&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; uri.CheckIfNull();&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
&lt;/div&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/72294588039662900-8620802403831214269?l=otperc.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OtPercDotnet/~4/vewzikieb5k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://otperc.net/feeds/8620802403831214269/comments/default" title="Megjegyzések küldése" /><link rel="replies" type="text/html" href="http://otperc.net/2009/12/null-checking-of-method-arguments-in-c.html#comment-form" title="2 megjegyzés" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/8620802403831214269?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/8620802403831214269?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OtPercDotnet/~3/vewzikieb5k/null-checking-of-method-arguments-in-c.html" title="Nullérték-vizsgálat egyszerűen" /><author><name>Molnár Gergő</name><uri>http://www.blogger.com/profile/05139074877599679722</uri><email>gergo.molnar@otperc.net</email><gd:extendedProperty name="OpenSocialUserId" value="15966951835176790603" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://otperc.net/2009/12/null-checking-of-method-arguments-in-c.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcDQXw6fSp7ImA9WxNaGU8.&quot;"><id>tag:blogger.com,1999:blog-72294588039662900.post-6647567195559445957</id><published>2009-12-04T07:50:00.005+01:00</published><updated>2009-12-04T11:37:50.215+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-04T11:37:50.215+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="CLR" /><title>Osszunk nullával!</title><content type="html">&lt;div style="font-family: Consolas; font-size: 10pt; color: black; background: white;"&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;double&lt;/span&gt; one = 1;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;double&lt;/span&gt; zero = 0;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;try&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; x = one / zero;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;catch&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;DivideByZeroException&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515;"&gt;&amp;quot;Csak hiszed...&amp;quot;&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515;"&gt;&amp;quot;&lt;a href="http://www.blackwasp.co.uk/CSharpInfinity.aspx"&gt;http://www.blackwasp.co.uk/CSharpInfinity.aspx&lt;/a&gt;&amp;quot;&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/72294588039662900-6647567195559445957?l=otperc.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OtPercDotnet/~4/SLx5Fo_AtFs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://otperc.net/feeds/6647567195559445957/comments/default" title="Megjegyzések küldése" /><link rel="replies" type="text/html" href="http://otperc.net/2009/12/c-sharp-infinity-double.html#comment-form" title="1 megjegyzés" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/6647567195559445957?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/6647567195559445957?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OtPercDotnet/~3/SLx5Fo_AtFs/c-sharp-infinity-double.html" title="Osszunk nullával!" /><author><name>Molnár Gergő</name><uri>http://www.blogger.com/profile/05139074877599679722</uri><email>gergo.molnar@otperc.net</email><gd:extendedProperty name="OpenSocialUserId" value="15966951835176790603" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://otperc.net/2009/12/c-sharp-infinity-double.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUIAQnc7cCp7ImA9WxNaGEs.&quot;"><id>tag:blogger.com,1999:blog-72294588039662900.post-4084597901879825892</id><published>2009-12-03T19:02:00.001+01:00</published><updated>2009-12-03T19:05:43.908+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-03T19:05:43.908+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="architecture" /><title>WCF exception faultá alakítása háziassszonyoknak</title><content type="html">&lt;p&gt;
Adott a szituáció, hogy van egy üzleti logia / üzleti folyamat rétegünk, amiből szeretnénk néhány dolgot publikálni a külvilág felé - ehhez a WCF a választott technológiánk. Néhány dolgot nem publikálunk, azokat csak a service réteget assemblyként referenciáló kódok érik el (ők is a sajátjaink, a rendszer többi komponense).&lt;br /&gt;
A WCF remek választás, hisz pont erről szól: úgy implementálhatod a service rétegedet, hogy arra koncentrálsz, amit csinálni akarsz - azzal meg nem kell törődnöd, hogy hogy lesz ez a szolgáltatás távolról elérhető. Nem kell a kommunikációval foglalkozó kódot írnod, csak felpattintasz néhány attribútumot (&lt;i&gt;, átfusz néhány ezer sor XML-t&lt;/i&gt;), és kész. Eddig hurrá.
&lt;/p&gt;
&lt;p&gt;
A feketeleves ott kezdődik, hogy az üzleti folyamatok végrehajtása nem mindig sikeres (akár azért, mert nem álltunk a helyzet magaslatán, mikor implementáltunk, akár azért, mert valami külső körülmény - pl. egy elhalálozott adatbázisszerver - miatt nem tudjuk teljesíteni kliensünk kérését).&lt;br /&gt;
Vegyük pl. a jó öreg számológép szolgáltatást - jelen esetben a megvalósításunk, a &lt;tt&gt;FawltyCalculator&lt;/tt&gt; kicsit bugos. A metódusunk hívása egy kövér DivideByZeroException-t fog dobni.

&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;
&lt;p style="margin: 0px;"&gt;[&lt;span style="color: #2b91af;"&gt;ServiceContract&lt;/span&gt;]&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;interface&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ICalculator&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style="color: #2b91af;"&gt;OperationContract&lt;/span&gt;]&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; Divide(&lt;span style="color: blue;"&gt;int&lt;/span&gt; dividend, &lt;span style="color: blue;"&gt;int&lt;/span&gt; divisor);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FawltyCalculator&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;ICalculator&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; Divide(&lt;span style="color: blue;"&gt;int&lt;/span&gt; dividend, &lt;span style="color: blue;"&gt;int&lt;/span&gt; divisor)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; result;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; result = dividend / (divisor * 0); &lt;span style="color: green;"&gt;//buggy&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; result;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;
A dolgok ilyentén való félremenésére a kliensoldalon is fel kell készülni. A WCF megteszi nekünk azt a szivességet, hogy a szolgáltatások futása közben dobott, &lt;a href="http://msdn.microsoft.com/en-us/library/aa480591.aspx"&gt;kezeletlen kivételeket szépen megeszi, és a szervíz hívásra küldött válaszban jelzi, hogy baj van&lt;/a&gt; (volt).&lt;br /&gt;
A túloldalon (a kliensnél) ez egy &lt;a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.faultexception.aspx"&gt;FaultException&lt;/a&gt; képében fog materializálódni. Ott tehát nem egy DivideByZeroException elkapására kell felkészülni, hanem egy FaultException-ére, amivel egy baj lesz: semmit nem fogunk tudni arról, hogy mi is ment félre, kifutottunk a memóriából, nullával osztottunk, vagy kihalt alólunk valami egyéb szoftverkomponens. Megtehetjük ugyan, hogy arra instruáljuk a WCF-et, hogy adja vissza a kliensoldalnak a részletes exception-t, ami development-time hasznos feature, de produkciós környezetben nem túl szerencsés (egyrészt nem túl user friendly megoldás, másrész túl sok mindent köthetünk így a klienseink orrára, amit esetleg nem szeretnénk).
&lt;/p&gt;
&lt;p&gt;
A megoldás: dobjunk magunk is FaultException-t, már a service oldali kódban! Annak megadhatunk FaultReason-t, FaultCode-ot, az szépen át fog menni a kliens oldalra:
&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; Divide(&lt;span style="color: blue;"&gt;int&lt;/span&gt; dividend, &lt;span style="color: blue;"&gt;int&lt;/span&gt; divisor)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; result;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;try&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; result = dividend / (divisor * 0); &lt;span style="color: green;"&gt;//buggy&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;catch&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;DivideByZeroException&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;throw&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FaultException&lt;/span&gt;(&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FaultReason&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;&amp;quot;A null&amp;#225;val val&amp;#243; oszt&amp;#225;s nem men&amp;#337;.&amp;quot;&lt;/span&gt;),&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FaultCode&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;&amp;quot;DIVIDE_BY_ZERO&amp;quot;&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; result;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;
Ez eddig remek. Mi vele a gond? Az, hogy a WCF azt ígérte nekünk, hogy úgy kódolhatunk szolgáltatást, hogy közben nem kell ilyesmivel törődni. Márpedig ha a Divide() metódus nem egy WCF-en át elérhető szolgáltatás lenne, hanem csak úgy meghívnánk kódból, akkor még úgy is nehezen indokolható a fenti try-catch blokk, ha nem véletlenül vagyunk mi a FawltyCalculator dedikált fejlesztői.&lt;br /&gt;
Mi történik itt? Ez &lt;a href="http://hungarian.joelonsoftware.com/Articles/LeakyAbstractions.html"&gt;az absztrakció szivárog&lt;/a&gt;.&lt;br /&gt;
Sőt, ez inkább már folyik.
&lt;/p&gt;
&lt;p&gt;
Az lenne a jó, ha nem kéne FaultException-t dobnunk, de mégis, akkor, és csakis akkor, ha a metódunkat WCF-en keresztül, távolról hívják, valahogy mégis úgy legyen minden, minthacsak azt dobtunk volna.&lt;br /&gt;
Szerencsére van megoldás, úgy hívják, hogy &lt;a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.ierrorhandler.aspx"&gt;IErrorHandler&lt;/a&gt; (a System.ServiceModel.Dispatcher névtér alatt lakik). Nem túl meglepő módon ez egy interface, ami két metódus megvalósítását írja elő: a HandleError()-ban a szervízoldalon dobott, kezeletlen kivétellel kezdhetünk valamit (logging, alkalmazás meghalasztása, stb.), a ProvideFault() pedig pont az, ami nekünk kell: az exception ismeretében megkonstruálhatjuk a kliensünknek adandó választ. Ezt akár bit (na jó: &lt;i&gt;XML element&lt;/i&gt;) szinten is kontrollálhatjuk, de ha lustábbak vagyunk, rábízhatjuk a Frameworkre is a legyártását:&lt;br /&gt;
&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; ProvideFault(&lt;span style="color: #2b91af;"&gt;Exception&lt;/span&gt; error, System.ServiceModel.Channels.&lt;span style="color: #2b91af;"&gt;MessageVersion&lt;/span&gt; version, &lt;span style="color: blue;"&gt;ref&lt;/span&gt; Message fault)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;FaultException&lt;/span&gt; faultException = &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (error &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ApplicationException&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; faultException = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FaultException&lt;/span&gt;(&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FaultReason&lt;/span&gt;(&lt;span style="color: blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;&amp;quot;Alkalmaz&amp;#225;shiba t&amp;#246;rt&amp;#233;nt ('{0}').&amp;quot;&lt;/span&gt;, error.Message)),&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FaultCode&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;&amp;quot;APPLICATION_ERROR&amp;quot;&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;/span&gt; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (error &lt;span style="color: blue;"&gt;is&lt;/span&gt; System.Data.Linq.ChangeConflictException)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; faultException = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FaultException&lt;/span&gt;(&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FaultReason&lt;/span&gt;(&lt;span style="color: blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;&amp;quot;T&amp;#246;bb felhaszn&amp;#225;l&amp;#243; pr&amp;#243;b&amp;#225;lta p&amp;#225;rhuzamosan m&amp;#243;dos&amp;#237;tani ugyanazt az adatot.&amp;quot;&lt;/span&gt;)),&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FaultCode&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;&amp;quot;DATABASE_CONCURRENCY_ERROR&amp;quot;&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// Still unhandled - provide some default...&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (faultException == &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; faultException = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FaultException&lt;/span&gt;(&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;&amp;quot;Kezeletlen kiv&amp;#233;tel t&amp;#246;rt&amp;#233;nt.&amp;quot;&lt;/span&gt;,&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FaultCode&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;&amp;quot;UNHANDLED_ERROR&amp;quot;&lt;/span&gt;));&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; messageFault = faultException.CreateMessageFault();&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// ref Message fault&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fault = Message.CreateMessage(&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; version,&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; messageFault,&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;&amp;quot;http://www.w3.org/2005/08/addressing/soap/fault&amp;quot;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
&lt;/div&gt;
&lt;br /&gt;
[Felhívnám a figyelmet a "http://www.w3.org/2005/08/addressing/soap/fault" sorra, azt magában fél nap volt kififikázni.]
&lt;/p&gt;
&lt;p&gt;
Ezek után már csak rá kell vennünk a WCF-et, hogy használja is az errorhandlerünket.&lt;br /&gt;
Ehhez készítenünk kell egy osztályt, ami implementálja az &lt;a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.description.iservicebehavior.aspx"&gt;IServiceBehavior&lt;/a&gt; interfészt. Ennek az osztálynak a ApplyDispatchBehavior() metódusában fogjuk az ErrorHandlerünket befűzni a WCF folyamatába. Ezután három út van: a) programozottan bepéldányosítjuk a service behaviorunkhat, és megetetjük a service host objektummal, b) az IServiceBehavior megvalósításon kívül leszármazunk az Attribute-ból is, és attribútumként felpattintjuk a szervizünkre c) az IServiceBehavior megvalósításon kívül leszármazunk a BehaviorExtensionElement-ből, és az app.configban konfiguráljuk az error handlingot. (Ez mekkora!)&lt;br /&gt;
Én a b)-t választottam:
&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;sealed&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ErrorBehaviorAttribute&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Attribute&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;IServiceBehavior&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Type&lt;/span&gt; _typeErrorHandler;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; ErrorBehaviorAttribute(&lt;span style="color: #2b91af;"&gt;Type&lt;/span&gt; typeErrorHandler)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _typeErrorHandler = typeErrorHandler;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Validate(&lt;span style="color: #2b91af;"&gt;ServiceDescription&lt;/span&gt; description, &lt;span style="color: #2b91af;"&gt;ServiceHostBase&lt;/span&gt; serviceHostBase) { }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; AddBindingParameters(&lt;span style="color: #2b91af;"&gt;ServiceDescription&lt;/span&gt; description, &lt;span style="color: #2b91af;"&gt;ServiceHostBase&lt;/span&gt; serviceHostBase, System.Collections.ObjectModel.&lt;span style="color: #2b91af;"&gt;Collection&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;ServiceEndpoint&lt;/span&gt;&amp;gt; endpoints, BindingParameterCollection parameters) { }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IErrorHandler&lt;/span&gt; CreateTypeHandler()&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; typeErrorHandler = (&lt;span style="color: #2b91af;"&gt;IErrorHandler&lt;/span&gt;)&lt;span style="color: #2b91af;"&gt;Activator&lt;/span&gt;.CreateInstance(_typeErrorHandler);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; typeErrorHandler;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; ApplyDispatchBehavior(&lt;span style="color: #2b91af;"&gt;ServiceDescription&lt;/span&gt; description, &lt;span style="color: #2b91af;"&gt;ServiceHostBase&lt;/span&gt; serviceHostBase)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;IErrorHandler&lt;/span&gt; typeErrorHandler = &lt;span style="color: blue;"&gt;this&lt;/span&gt;.CreateTypeHandler();&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;var&lt;/span&gt; channelDispatcher &lt;span style="color: blue;"&gt;in&lt;/span&gt; serviceHostBase.ChannelDispatchers)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; (channelDispatcher &lt;span style="color: blue;"&gt;as&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ChannelDispatcher&lt;/span&gt;).ErrorHandlers.Add(typeErrorHandler);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;
Ennyi. Megy. Persze lehet még tovább cifrázni, pl. hosszú távon a ProvideError() jó eséllyel hízik túl minden vállalható méreten, de ez már egy másik sztori.&lt;br /&gt;
Mára ennyit!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/72294588039662900-4084597901879825892?l=otperc.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OtPercDotnet/~4/1BZHnwPaaOA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://otperc.net/feeds/4084597901879825892/comments/default" title="Megjegyzések küldése" /><link rel="replies" type="text/html" href="http://otperc.net/2009/12/wcf-exception-shielding-fault.html#comment-form" title="2 megjegyzés" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/4084597901879825892?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/4084597901879825892?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OtPercDotnet/~3/1BZHnwPaaOA/wcf-exception-shielding-fault.html" title="WCF exception faultá alakítása háziassszonyoknak" /><author><name>Molnár Gergő</name><uri>http://www.blogger.com/profile/05139074877599679722</uri><email>gergo.molnar@otperc.net</email><gd:extendedProperty name="OpenSocialUserId" value="15966951835176790603" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://otperc.net/2009/12/wcf-exception-shielding-fault.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YNRHw8eSp7ImA9WxNaE04.&quot;"><id>tag:blogger.com,1999:blog-72294588039662900.post-2303848747540378062</id><published>2009-11-27T17:06:00.006+01:00</published><updated>2009-11-27T17:26:35.271+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-27T17:26:35.271+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="SQL" /><title>SQL Server High Availability megoldások</title><content type="html">&lt;p&gt;
Az SQL Server több lehetőséget is biztosít számunkra, hogy magas rendelkezésre állású környezeteket alakíthassunk ki vele. Alapvetően négy út van, amin elindulhatunk:
&lt;ul&gt;

&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Failover clustering&lt;/span&gt;: ez a lehetőség egy kicsit kilóg a sorból, mert igazából nem (csak) SQL Server szolgáltatás: megosztott diszk(ek)en és azokat közösen használó cluster node-okon alapuló megoldás. Ezeket az erőforrásokat a &lt;a href="http://msdn.microsoft.com/en-us/library/ms952401.aspx"&gt;Microsoft Cluster Service (MSCS)&lt;/a&gt; segítségével egyetlen virtuális erőforrássá gyúrhatjuk egybe a külvilág számára - ez a virtuális erőforrás saját azonosítóval (IP címmel, hosztnévvel, stb) rendelkezik, klienseink ehhez kapcsolódnak, és nem is tudják, hogy a clusteren belül melyik gép szolgálja ki őket.&lt;br /&gt;
Ez egyben azt is jelenti, hogy ez egy szerver-szintű megoldás, tehát nincs lehetőség arra, hogy egy SQL Server instance csak bizonyos adatbázisán használjuk, míg másokon ne.&lt;br /&gt;
Hátránya, hogy a közös disk &lt;i&gt;single point of failure&lt;/i&gt;: ha az meghal, oda a cluster (tehát minimum érdemes valamilyen RAID megoldásban gondolkodni adattárolás szinten). Géphalál esetén, vagy ha az oprendszer megáll vagy megállítottuk (lásd: patchelés), a cluster többi gépe pillanatok alatt át tudja venni a kiszolgálást a működésképtelen node-tól, miközben a kliensek ebből jó esetben semmit nem vesznek észre.&lt;br /&gt;&lt;br /&gt;
&lt;/li&gt;

&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Database mirroring&lt;/span&gt;: ez esetben két adatbázisunk van, egy éles (&lt;i&gt;principal&lt;/i&gt;), és annak egy készenléti tükre (&lt;i&gt;mirror&lt;/i&gt;).&lt;br /&gt;
Látható, hogy ez egy database-level HA megoldás, tehát egy instance-on belül eldönthetjük, hogy mely adatbázisokat szeretnénk tükrözni, és melyeket nem.&lt;br /&gt;
A tükrözést kétféleképp is megvalósíthatjuk: szinkron (egy művelet akkor tekinthető végrehajtottnak, ha az élesről a tüköradatbázisba is átkerült az adat), illetve aszinkron módon (az tranzakciók az éles adatbázisban kommitálódnak, a tükör a háttérben szinkronizálódik). Az előbbi nagyobb adatbiztonságot, de rosszabb teljesítményt, míg az utóbbi az esetleges adatvesztés (a élesen már igen, de a tükrön még nem commitálódott tranzakciók) kockázata melletti jobb  performanciát biztosít.&lt;br /&gt;
A mirror adatbázis a kliensek számára nem használhatók, de készíthetők róla &lt;i&gt;snapshot&lt;/i&gt;-ok, amik az adatbázis adott időpillanatbeli, csak olvasható verziói - reporting feladatokra ideális lehet, ha nem szeretnék az éles szervert report-lekérdezésekkel terhelni, és nincs szükség abszolút real-time adatokra.&lt;br /&gt;&lt;br /&gt;
&lt;/li&gt;

&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Log shipping&lt;/span&gt;:
A log shipping némileg hasonlatos a mirroring-hoz, ahelyett vagy amellett is használható. A mirroringgal szemben egynél több másodlagos adatbázist is támogat.&lt;br /&gt;
Gyakorlatilag arról van szó, hogy az éles adatbázisról készítünk egy backup-ot, azt visszaállítjuk, mint másodlagos, majd (konfigurálható) időnként automatikusan log backup készül az élesről, ami a másodlagos adatbázis(ok)on visszaállításra kerül. Így lesz egy (konfigurálható) delay az éles és a tükrök között, ez néha nem jó, néha meg de: például ha egy kikommentezett WHERE feltétellel az összes munkavállalónk nevét &lt;i&gt;Kovács Józsefnévá&lt;/i&gt; UPDATE-eljük, nem rossz, ha megvan az eredeti állapot.&lt;br /&gt;&lt;br /&gt;
&lt;/li&gt;

&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Replication&lt;/span&gt;: A replikáció szintén adatbázis-szintű megoldás, sőt: lehetőségünk van csak az adatbázis bizonyos részeit replikálni. A replikáció a &lt;i&gt;publisher-subscriber&lt;/i&gt; modellre épül, az elsődleges adatbázisunk publikálja az adatokat (vagy azoknak egy részét), amire a másodlagos adatbázis(ok) "előfizetnek". A másodlagos adatbázisok használhatók lekérdezésre, vagy bármilyen reporting funkcióra. A replikáción belül három al-típus létezik:
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-style:italic;"&gt;&lt;span style="font-weight:bold;"&gt;snapshot&lt;/span&gt;&lt;/span&gt;: minden egyes szinkronizációkor egy "fénykép" (&lt;i&gt;snapshot&lt;/i&gt;) készül a publisher sémájáról és adatairól az adott időpillanatban és jut el a subscriberekhez. Ebben az esetben a másodlagos adatbázisok csak a szintkronizáció pillanatában lesznek up-to-datek (mint a megállt óra,ami napjában kétszer pontos). Akkor alkalmazható, ha ez megengedhető, vagy csak kis mennyiségű adatot mozgatunk. Hasznos lehet akkor is, hogy az éles adatbázisban rengeteg művelet történik, de minket igazából csak a végeredmény érdekel ("nap végi zárás" - mennyi lett a záróegyenleg?).&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style="font-style:italic;"&gt;&lt;span style="font-weight:bold;"&gt;transactional&lt;/span&gt;&lt;/span&gt;: itt az első lépés egy snapshot replikáció (ezzel áll elő a "tükör"), majd a publisher összes séma- és adatmódosítása real-time eljut a subscriberek felé is, így a tranzakcionalitás biztosított.&lt;br /&gt;A subscriber adatbázis(ok) írhatók ugyan, de ezek a módosítások nem jutnak vissza a publisher felé, szóval gondoljuk át, hogy mit csinálunk.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style="font-style:italic;"&gt;&lt;span style="font-weight:bold;"&gt;merge&lt;/span&gt;&lt;/span&gt;: itt is egy snapshot-tal indulunk, de mind a publisher, mint a subscriber(ek) módosításai követésre kerülnek, és alkalomadtán szinkronizálódnak (ez remek lehetőség konfliktusok kialakulására, amikor több subscriber próbálja ugyanazt az adatot módosítani).&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;
Bár ez egy relatíve hosszú post, mégis nagyon (nagyon-nagyon-nagyon) csak a felszínét kapargatja a magas rendelkezésre állás, megbízhatóság, skálázhatóság témakörének. Szerencsére elég sok szakirodalom található a témában (én most épp &lt;a href="http://www.amazon.com/Microsoft-Server-2008-Management-Administration/dp/067233044X/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1259337597&amp;sr=8-1"&gt;ezt gyúrom&lt;/a&gt;, ez ugyan nem csak HA témákat jár körül, de elég jó, küldeném mindenkinek aki szereti; de ezen felül sok más könyv, vagy akár a &lt;a href="http://msdn.microsoft.com/en-us/library/ms130214.aspx"&gt;BOL&lt;/a&gt; is rengeteg információval szolgál).&lt;br /&gt;
Ennek ellenére szerettem volna összeszedni legalább nagy vonalakban a lehetőségeket, merthogy annyi van, hogy az ember könnyen eltévedhet, még mielőtt egyáltalán elindult volna - ami nem túl szerencsés.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/72294588039662900-2303848747540378062?l=otperc.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OtPercDotnet/~4/uO6QK7lcRno" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://otperc.net/feeds/2303848747540378062/comments/default" title="Megjegyzések küldése" /><link rel="replies" type="text/html" href="http://otperc.net/2009/11/sql-clustering-mirroring-replication.html#comment-form" title="0 megjegyzés" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/2303848747540378062?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/72294588039662900/posts/default/2303848747540378062?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OtPercDotnet/~3/uO6QK7lcRno/sql-clustering-mirroring-replication.html" title="SQL Server High Availability megoldások" /><author><name>Molnár Gergő</name><uri>http://www.blogger.com/profile/05139074877599679722</uri><email>gergo.molnar@otperc.net</email><gd:extendedProperty name="OpenSocialUserId" value="15966951835176790603" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://otperc.net/2009/11/sql-clustering-mirroring-replication.html</feedburner:origLink></entry></feed>
