<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Balássy György szakmai blogja</title>
	
	<link>http://balassygyorgy.wordpress.com</link>
	<description>Harctéri tapasztalatok</description>
	<lastBuildDate>Tue, 18 Jun 2013 19:28:46 +0000</lastBuildDate>
	<language>hu</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain="balassygyorgy.wordpress.com" port="80" path="/?rsscloud=notify" registerProcedure="" protocol="http-post" />
<image>
		<url>http://0.gravatar.com/blavatar/63e8ba8b57a7b7dd58c8c9906016ebda?s=96&amp;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Balássy György szakmai blogja</title>
		<link>http://balassygyorgy.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://balassygyorgy.wordpress.com/osd.xml" title="Balássy György szakmai blogja" />
	
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/BalassyGyorgyDevportal" /><feedburner:info uri="balassygyorgydevportal" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://balassygyorgy.wordpress.com/?pushpress=hub" /><item>
		<title>Tetszőleges kiterjesztés megadása fájl mentésekor</title>
		<link>http://feedproxy.google.com/~r/BalassyGyorgyDevportal/~3/19-1jBjgdM0/</link>
		<comments>http://balassygyorgy.wordpress.com/2013/06/17/tetszoleges-kiterjesztes-megadasa-fajl-mentesekor/#comments</comments>
		<pubDate>Mon, 17 Jun 2013 14:12:12 +0000</pubDate>
		<dc:creator>Balássy György</dc:creator>
				<category><![CDATA[Windows 8]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[WinJS]]></category>

		<guid isPermaLink="false">https://balassygyorgy.wordpress.com/?p=2347</guid>
		<description><![CDATA[Windows 8 alatt a File Open Picker dialógusablaknak viszonylag egyszerűen megadhatjuk, hogy tetszőleges típusú fájlt kiválaszthat a felhasználó, egyszerűen használjuk a szokásos csillagot: var openPicker = new Windows.Storage.Pickers.FileOpenPicker(); openPicker.fileTypeFilter.replaceAll([&#34;*&#34;]); Ha azt szeretnénk, hogy a felhasználó tetszőleges kiterjesztéssel menthesse el a fájlt, a fentiek alapján megpróbálkozhatunk ezzel: var savePicker = new Windows.Storage.Pickers.FileSavePicker(); savePicker.fileTypeChoices.insert(&#34;Tetszőleges&#34;, [&#34;*&#34;]); Ám ez [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=balassygyorgy.wordpress.com&#038;blog=16172306&#038;post=2347&#038;subd=balassygyorgy&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Windows 8 alatt a File Open Picker dialógusablaknak viszonylag egyszerűen megadhatjuk, hogy tetszőleges típusú fájlt kiválaszthat a felhasználó, egyszerűen használjuk a szokásos csillagot:</p>
<pre class="code"><span style="color:blue;">var </span><span style="color:black;">openPicker = </span><span style="color:blue;">new </span><span style="color:black;">Windows.Storage.Pickers.FileOpenPicker();
openPicker.fileTypeFilter.replaceAll([</span><span style="color:#a31515;">&quot;*&quot;</span><span style="color:black;">]);</span></pre>
<p>Ha azt szeretnénk, hogy a felhasználó tetszőleges kiterjesztéssel menthesse el a fájlt, a fentiek alapján megpróbálkozhatunk ezzel:</p>
<pre class="code"><span style="color:blue;">var </span><span style="color:black;">savePicker = </span><span style="color:blue;">new </span><span style="color:black;">Windows.Storage.Pickers.FileSavePicker();
</span><span style="color:black;">savePicker.fileTypeChoices.insert(</span><span style="color:#a31515;">&quot;Tetszőleges&quot;</span><span style="color:black;">, [</span><span style="color:#a31515;">&quot;*&quot;</span><span style="color:black;">]);</span></pre>
<p>Ám ez hibára vezet:</p>
<blockquote>
<p>0&#215;80070057 – JavaScript runtime error: The parameter is incorrect.</p>
<p>WinRT information: This file picker does not allow the all files extension.</p>
</blockquote>
<p>No, ez pech. Szerencsére van megoldás, írjuk ezt:</p>
<pre class="code"><span style="color:black;">savePicker.fileTypeChoices.insert(</span><span style="color:#a31515;">&quot;Tetszőleges&quot;</span><span style="color:black;">, [</span><span style="color:#a31515;">&quot;.&quot;</span><span style="color:black;">]);</span></pre>
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:fa8c2311-abcd-407f-8d02-d25eebb215b1" class="wlWriterEditableSmartContent" style="float:none;margin:0;display:inline;padding:0;">Technorati-címkék: <a href="http://technorati.com/tags/Windows+8" rel="tag">Windows 8</a>,<a href="http://technorati.com/tags/file+picker" rel="tag">file picker</a>,<a href="http://technorati.com/tags/JavaScript" rel="tag">JavaScript</a>,<a href="http://technorati.com/tags/WinJS" rel="tag">WinJS</a></div>
<br />Kategória:<a href='http://balassygyorgy.wordpress.com/category/windows-8/'>Windows 8</a> Tagged: <a href='http://balassygyorgy.wordpress.com/tag/javascript/'>JavaScript</a>, <a href='http://balassygyorgy.wordpress.com/tag/windows-8/'>Windows 8</a>, <a href='http://balassygyorgy.wordpress.com/tag/winjs/'>WinJS</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/balassygyorgy.wordpress.com/2347/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/balassygyorgy.wordpress.com/2347/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=balassygyorgy.wordpress.com&#038;blog=16172306&#038;post=2347&#038;subd=balassygyorgy&#038;ref=&#038;feed=1" width="1" height="1" /><img src="http://feeds.feedburner.com/~r/BalassyGyorgyDevportal/~4/19-1jBjgdM0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://balassygyorgy.wordpress.com/2013/06/17/tetszoleges-kiterjesztes-megadasa-fajl-mentesekor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/e46495cefe8761794595b7f2323f5ffe?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">balassygyorgy</media:title>
		</media:content>
	<feedburner:origLink>http://balassygyorgy.wordpress.com/2013/06/17/tetszoleges-kiterjesztes-megadasa-fajl-mentesekor/</feedburner:origLink></item>
		<item>
		<title>Ajaxos fájl feltöltés</title>
		<link>http://feedproxy.google.com/~r/BalassyGyorgyDevportal/~3/sGutO5AAuFU/</link>
		<comments>http://balassygyorgy.wordpress.com/2013/04/17/ajaxos-fajl-feltoltes/#comments</comments>
		<pubDate>Wed, 17 Apr 2013 02:00:00 +0000</pubDate>
		<dc:creator>Balássy György</dc:creator>
				<category><![CDATA[Webfejlesztés]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[MVC]]></category>

		<guid isPermaLink="false">https://balassygyorgy.wordpress.com/?p=2338</guid>
		<description><![CDATA[Időnként felmerül, hogy jó lenne úgy feltölteni egy fájlt, hogy közben az oldal többi része nem változik, magyarul Ajaxosan. Rossz hírem van, az XMLHttpRequest objektum Level 1 változata ezt nem tudja, tehát ha régebbi böngészőkre is tekintettel kell lennünk, akkor nincs mese trükközni kell. A legelterjedtebb trükközési módszer az iframe alkalmazása, azt ugyanis bátran lehet [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=balassygyorgy.wordpress.com&#038;blog=16172306&#038;post=2338&#038;subd=balassygyorgy&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Időnként felmerül, hogy jó lenne úgy feltölteni egy fájlt, hogy közben az oldal többi része nem változik, magyarul Ajaxosan. Rossz hírem van, az XMLHttpRequest objektum Level 1 változata ezt nem tudja, tehát ha régebbi böngészőkre is tekintettel kell lennünk, akkor nincs mese trükközni kell.</p>
<p>A legelterjedtebb trükközési módszer az iframe alkalmazása, azt ugyanis bátran lehet postbackelni, az egyetlen szépséghiba, hogy a válasz, például validációs hibák is az iframe-be fognak megérkezni. Tehát ha rejtett iframe-mel dolgozunk, akkor a választ onnan ki kell venni, és az oldal megfelelő részén meg kell jeleníteni. Van tehát feladat bőven, szerencsére a <a href="http://malsup.com/jquery/form/" target="_blank">jQuery Form Plugin</a> sokat tud segíteni a megvalósításban.</p>
<p>Először is készítsünk egy view-modelt szerver oldalon, amiben egy <strong>HttpPostedFileBase</strong> típusú tulajdonság fogja képviselni a feltöltött fájlt. Mellécsaptam még egy kötelező <strong>Name</strong> tulajdonságot, csak úgy a demonstráció kedvéért:</p>
<pre class="code"><span style="color:blue;">public class </span><span style="color:#2b91af;">UploadVM
</span><span style="color:black;">{
    [</span><span style="color:#2b91af;">Required</span><span style="color:black;">( ErrorMessage = </span><span style="color:#a31515;">"Please enter a name!" </span><span style="color:black;">)]
    </span><span style="color:blue;">public string </span><span style="color:black;">Name { </span><span style="color:blue;">get</span><span style="color:black;">; </span><span style="color:blue;">set</span><span style="color:black;">; }

    [</span><span style="color:#2b91af;">Attachment</span><span style="color:black;">]
    </span><span style="color:blue;">public </span><span style="color:#2b91af;">HttpPostedFileBase </span><span style="color:black;">Attachment { </span><span style="color:blue;">get</span><span style="color:black;">; </span><span style="color:blue;">set</span><span style="color:black;">; }
}</span></pre>
<p>Az <strong>[Attachment]</strong> a <a href="http://balassygyorgy.wordpress.com/2013/04/15/feltoltott-fajl-validalasa-aspnet-mvc-ben/" target="_blank">korábbi cikkben bemutatott</a>, fájl validálásra használt attribútum. Ellenőrzi, hogy van-e feltöltve fájl, illetve hogy helyes a kiterjesztése és nem túl nagy-e a mérete.</p>
<p>Ehhez a modellhez már készíthetünk egy űrlapot, ami fel fogja küldeni a fájlt és a megadott nevet:</p>
<pre class="code"><span style="background:yellow;color:black;">@</span><span style="color:blue;">using</span><span style="color:black;">( Html.BeginForm( </span><span style="color:#a31515;">"Index"</span><span style="color:black;">, </span><span style="color:#a31515;">"Home"</span><span style="color:black;">, </span><span style="color:#2b91af;">FormMethod</span><span style="color:black;">.<strong><span style="text-decoration:underline;">Post</span></strong>, 
        </span><span style="color:blue;">new </span><span style="color:black;">{ id = </span><span style="color:#a31515;">"<strong><span style="text-decoration:underline;">myForm</span></strong>"</span><span style="color:black;">, <strong><span style="text-decoration:underline;">enctype = </span></strong></span><span style="color:#a31515;"><strong><span style="text-decoration:underline;">"multipart/form-data"</span></strong> </span><span style="color:black;">} ) )
{
    </span><span style="color:blue;">&lt;</span><span style="color:maroon;">p</span><span style="color:blue;">&gt;
        &lt;</span><span style="color:maroon;">label </span><span style="color:red;">for</span><span style="color:blue;">="txtName"&gt;</span><span style="color:black;">Name:</span><span style="color:blue;">&lt;/</span><span style="color:maroon;">label</span><span style="color:blue;">&gt;
        &lt;</span><span style="color:maroon;">input </span><span style="color:red;">type</span><span style="color:blue;">="text" </span><span style="color:red;">id</span><span style="color:blue;">="txtName" </span><span style="color:red;">name</span><span style="color:blue;">="Name" /&gt;
    &lt;/</span><span style="color:maroon;">p</span><span style="color:blue;">&gt;

    &lt;</span><span style="color:maroon;">p</span><span style="color:blue;">&gt;
        &lt;</span><span style="color:maroon;">label </span><span style="color:red;">for</span><span style="color:blue;">="fupAttachment"&gt;</span><span style="color:black;">File:</span><span style="color:blue;">&lt;/</span><span style="color:maroon;">label</span><span style="color:blue;">&gt;
        &lt;</span><span style="color:maroon;">input </span><span style="color:red;">type</span><span style="color:blue;">="file" </span><span style="color:red;">id</span><span style="color:blue;">="fupAttachment" </span><span style="color:red;">name</span><span style="color:blue;">="<strong><span style="text-decoration:underline;">Attachment</span></strong>" /&gt;
    &lt;/</span><span style="color:maroon;">p</span><span style="color:blue;">&gt;

    &lt;</span><span style="color:maroon;">p</span><span style="color:blue;">&gt;
        &lt;</span><span style="color:maroon;">input </span><span style="color:red;">type</span><span style="color:blue;">="submit" </span><span style="color:red;">value</span><span style="color:blue;">="Upload" /&gt;
    &lt;/</span><span style="color:maroon;">p</span><span style="color:blue;">&gt;    

    &lt;</span><span style="color:maroon;">div </span><span style="color:red;">id</span><span style="color:blue;">="<strong><span style="text-decoration:underline;">errors</span></strong>"&gt;&lt;/</span><span style="color:maroon;">div</span><span style="color:blue;">&gt;
</span><span style="color:black;">}</span></pre>
<p>Fontos, hogy a generált formnak <strong>multipart/form-data</strong> értékű enctype attribútuma legyen, mert azzal tud csak fájl utazni, illetve létrehoztam még egy <strong>errors</strong> azonosítójú div-et is, ahol majd a hibaüzeneteket fogjuk megjeleníteni.</p>
<p>Ez az űrlap a <strong>HomeController</strong> <strong>Index</strong> nevű actionjére lő, amit így implementálhatunk:</p>
<pre class="code"><span style="color:black;">[</span><span style="color:#2b91af;">HttpPost</span><span style="color:black;">]
</span><span style="color:blue;">public </span><span style="color:#2b91af;">ActionResult </span><span style="color:black;">Index( </span><span style="color:#2b91af;">UploadVM </span><span style="color:black;">model )
{
  </span><span style="color:blue;">if</span><span style="color:black;">( !</span><span style="color:blue;">this</span><span style="color:black;">.ModelState.IsValid )
  {
    </span><span style="color:blue;">string </span><span style="color:black;">firstError = ModelState.First( m =&gt; m.Value.Errors.Any() )
                                  .Value.Errors[ 0 ].ErrorMessage;
    </span><span style="color:blue;">return this</span><span style="color:black;">.FileUploadFailure( firstError );
  }

  </span><span style="color:#83b377;">// Process the file here

  </span><span style="color:blue;">string </span><span style="color:black;">message = </span><span style="color:#2b91af;">String</span><span style="color:black;">.Format( </span><span style="color:#a31515;">"The file '</span><span style="color:#3cb371;">{0}</span><span style="color:#a31515;">' is successfully uploaded."</span><span style="color:black;">, 
                                  model.Name );
  </span><span style="color:blue;">return this</span><span style="color:black;">.FileUploadSuccess( message );
}</span></pre>
<p>Ha a view-model valamelyik tulajdonsága hibás, akkor az attribútumoknak köszönhetően a hibák bekerülnek a <strong>ModelState</strong>be, amit a metódus elején szokás szerint ellenőrzünk. Ha van hiba, akkor az első hibaüzenettel térünk vissza, ha nincs, akkor pedig feldolgozzuk a fájlt és egy siker üzenettel térünk vissza.</p>
<p>A visszatérési érték egy JSON objektum, mert ezt tudjuk kliens oldalon barátságosan feldolgozni. Csakhogy ne feledjük, hogy a válasz egy <strong>iframe-</strong>be fog beíródni, és nem minden böngésző szeret iframe-be <strong>application/json</strong> típusú tartalmat kapni. Szerencsére a jQuery Form Plugin támogatja azt a trükköt, hogy a JSON tartalmat egy <strong>&lt;textarea&gt;</strong> elembe ágyazva küldjük vissza a szerverre <strong>text/html</strong> típusú válaszként, onnan ő majd kiveszi a JSON tartalmat.</p>
<p>Hogy ez a csomagolás egyszerű legyen, készítettem egy saját result típust:</p>
<pre class="code"><span style="color:blue;">public class </span><span style="color:#2b91af;">FileUploadJsonResult </span><span style="color:black;">: </span><span style="color:#2b91af;">JsonResult
</span><span style="color:black;">{
</span><span style="color:blue;">  public override void </span><span style="color:black;">ExecuteResult( </span><span style="color:#2b91af;">ControllerContext </span><span style="color:black;">context )
  {
    </span><span style="color:blue;">this</span><span style="color:black;">.ContentType = </span><span style="color:#a31515;">"text/html"</span><span style="color:black;">;
    context.HttpContext.Response.Write( </span><span style="color:#a31515;">"&lt;textarea&gt;" </span><span style="color:black;">);
    </span><span style="color:blue;">base</span><span style="color:black;">.ExecuteResult( context );
    context.HttpContext.Response.Write( </span><span style="color:#a31515;">"&lt;/textarea&gt;" </span><span style="color:black;">);
  }
}</span></pre>
<p>Az egyszerű példányosításhoz pedig két bővítő metódust, melyek közül az egyikkel sikert, a másikkal hibát lehet jelezni:</p>
<pre class="code"><span style="color:blue;">public static </span><span style="color:#2b91af;">FileUploadJsonResult </span><span style="color:black;">FileUploadSuccess( 
  </span><span style="color:blue;">this </span><span style="color:#2b91af;">Controller </span><span style="color:black;">controller, </span><span style="color:blue;">string </span><span style="color:black;">successMessage = </span><span style="color:blue;">null </span><span style="color:black;">)
{
  </span><span style="color:blue;">return new </span><span style="color:#2b91af;">FileUploadJsonResult
  </span><span style="color:black;">{
    Data = </span><span style="color:blue;">new </span><span style="color:black;">{ Success = </span><span style="color:blue;">true</span><span style="color:black;">, Message = successMessage }
  };
}

</span><span style="color:blue;">public static </span><span style="color:#2b91af;">FileUploadJsonResult </span><span style="color:black;">FileUploadFailure( 
  </span><span style="color:blue;">this </span><span style="color:#2b91af;">Controller </span><span style="color:black;">controller, </span><span style="color:blue;">string </span><span style="color:black;">errorMessage )
{
  </span><span style="color:blue;">return new </span><span style="color:#2b91af;">FileUploadJsonResult
  </span><span style="color:black;">{
    Data = </span><span style="color:blue;">new </span><span style="color:black;">{ Success = </span><span style="color:blue;">false</span><span style="color:black;">, Message = errorMessage }
  };
}</span></pre>
<p>Itt a <strong>Data</strong> tulajdonságban bármilyen szerkezetű objektumot összerakhatunk, az fog megérkezni válaszként a kliensre JSON formátumban. Itt most az egyszerűség kedvéért egy <strong>Success</strong> tulajdonságban jelzem, hogy a feltöltés hibátlanul megtörtént-e, és egy <strong>Message</strong> tulajdonságban hibaüzenetet vagy sikeres feltöltésre utaló üzenetet küldök vissza, amit a böngésző megjeleníthet.</p>
<p>Készen vagyunk tehát a szerver oldallal: van egy formunk, ami elPOSTolható egy actionnek, ami validálja a feltöltött tartalmat, és ha minden mező érvényes adatot tartalmaz, akkor feldolgozza őket, és az eredményt JSON válaszban jelzi.</p>
<p>Már csak a kliens oldal van hátra, amit természetesen a jQuery Form Plugin segítségével valósítunk meg. Ahogy a neve is mutatja, ez egy jQuery plugin, amit a <strong>form</strong> elemet burkoló jQuery objektumra (itt épp <strong>$form</strong>) kell ráhúznunk:</p>
<pre class="code"><span style="color:black;">$form.ajaxForm({
    iframe: </span><span style="color:blue;">true</span><span style="color:black;">,
    dataType: </span><span style="color:#a31515;">"json"</span><span style="color:black;">,
    beforeSubmit: </span><span style="color:blue;">function </span><span style="color:black;">() {
      <span style="color:#83b377;">// TODO </span></span><span style="color:black;">    },
    success: </span><span style="color:blue;">function </span><span style="color:black;">(result) {
<span style="color:#83b377;">      // TODO 
</span></span><span style="color:black;">    },
    error: </span><span style="color:blue;">function </span><span style="color:black;">() {
<span style="color:#83b377;">      // TODO 
</span></span><span style="color:black;">    }
});</span></pre>
<p>Az alábbi eseménykezelőket célszerű megvalósítanunk:</p>
<ul>
<li><strong>beforeSubmit</strong>: ez a POST elküldése előtt fut le, itt írhatjuk ki például, hogy a feltöltés folyamatban van, vagy például a <a href="http://balassygyorgy.wordpress.com/2010/08/31/blokkolas-aszinkron-postback-idejere/" target="_blank">jQuery BlockUI plugin</a> segítségével letilthatjuk az űrlapon lévő vezérlőket.</li>
<li><strong>success</strong>: ez akkor hívódik meg, ha látszólag hibátlan volt a feltöltés, bár tapasztalatom szerint akkor is meg tud hívódni, ha a szerver valamilyen hibát jelez. Ha nem volt hiba, akkor a paraméterül kapott változóban a szerverről visszaküldött JSON objektum jelenik meg, de számítsunk rá, hogy hiba esetén ez lehet undefined is!</li>
<li><strong>error</strong>: hiba esetén ez fut le.</li>
</ul>
<p>Íme egy példa a <strong>success</strong> callback implementálására:</p>
<pre class="code"><span style="color:blue;">if </span><span style="color:black;">(<strong><span style="text-decoration:underline;">!result</span></strong>) {
</span><span style="color:black;">$errors.html(</span><span style="color:#a31515;">'&lt;div class="validation-summary-errors"&gt;&lt;ul&gt;&lt;li&gt;Oooops....
                &lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;'</span><span style="color:black;">);
}
</span><span style="color:blue;">else </span><span style="color:black;">{
  $form.<strong><span style="text-decoration:underline;">resetForm</span></strong>();

  </span><span style="color:blue;">if </span><span style="color:black;">(result.<strong><span style="text-decoration:underline;">Success</span></strong> === </span><span style="color:blue;">true</span><span style="color:black;">) {
</span><span style="color:blue;">    var </span><span style="color:black;">message = result.<strong><span style="text-decoration:underline;">Message</span></strong>;
    </span><span style="color:blue;">if </span><span style="color:black;">(message &amp;&amp; message.length &gt; 0) {
      $errors.html( message );
    }
  }
  </span><span style="color:blue;">else </span><span style="color:black;">{
</span><span style="color:black;">    $errors.html(</span><span style="color:#a31515;">'&lt;div class="validation-summary-errors"&gt;&lt;ul&gt;&lt;li&gt;{0}
                  &lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;'</span><span style="color:black;">.<strong><span style="text-decoration:underline;">format</span></strong>(result.Message));
  }
}</span></pre>
<p>Ebben a kódban a hibák megjelenítését egy kicsit összetett HTML darabkával végezzük. Ennek az a jelentősége, hogy a klasszikus ASP.NET MVC-s validálás is pont ilyen HTML-t generál magából, tehát a mi Ajaxos hibáink is pont ugyanolyan stílussal fognak megjelenni.</p>
<p>A <strong>format</strong> egy a szerver oldali <strong>String.Format</strong>hoz hasonló függvény, amit például így implementálhatunk JavaScriptben:</p>
<pre class="code"><span style="color:black;">String.prototype.format = </span><span style="color:blue;">function </span><span style="color:black;">() {
</span><span style="color:blue;">  var </span><span style="color:black;">args = arguments;
  </span><span style="color:blue;">return this</span><span style="color:black;">.replace(</span><span style="color:maroon;">/\{\{|\}\}|\{(\d+)\}/g</span><span style="color:black;">, </span><span style="color:blue;">function </span><span style="color:black;">(m, n) {
    </span><span style="color:blue;">if </span><span style="color:black;">(m === </span><span style="color:#a31515;">"{{"</span><span style="color:black;">) { </span><span style="color:blue;">return </span><span style="color:#a31515;">"{"</span><span style="color:black;">; }
    </span><span style="color:blue;">if </span><span style="color:black;">(m === </span><span style="color:#a31515;">"}}"</span><span style="color:black;">) { </span><span style="color:blue;">return </span><span style="color:#a31515;">"}"</span><span style="color:black;">; }
    </span><span style="color:blue;">return </span><span style="color:black;">args[n];
  });
};</span></pre>
<p>Ha a szerverről nem csak az első, hanem összes <strong>ModelState</strong> hibát visszaadnánk, akkor egy ciklusban renderelhetnénk ki őket.</p>
<p>A cikkhez tartozó forráskód rengeteg kommenttel letölthető innen: <a title="http://sdrv.ms/10QQLSp" href="http://sdrv.ms/10QQLSp">http://sdrv.ms/10QQLSp</a></p>
<p>&nbsp;</p>
<div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:d2c96617-821f-478d-91ec-6978a89e1ce1" style="float:none;margin:0;display:inline;padding:0;">Technorati-címkék: <a href="http://technorati.com/tags/ASP.NET" rel="tag">ASP.NET</a>,<a href="http://technorati.com/tags/MVC" rel="tag">MVC</a></div>
<br />Kategória:<a href='http://balassygyorgy.wordpress.com/category/webfejlesztes/'>Webfejlesztés</a> Tagged: <a href='http://balassygyorgy.wordpress.com/tag/asp-net/'>ASP.NET</a>, <a href='http://balassygyorgy.wordpress.com/tag/javascript/'>JavaScript</a>, <a href='http://balassygyorgy.wordpress.com/tag/jquery/'>jQuery</a>, <a href='http://balassygyorgy.wordpress.com/tag/mvc/'>MVC</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/balassygyorgy.wordpress.com/2338/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/balassygyorgy.wordpress.com/2338/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=balassygyorgy.wordpress.com&#038;blog=16172306&#038;post=2338&#038;subd=balassygyorgy&#038;ref=&#038;feed=1" width="1" height="1" /><img src="http://feeds.feedburner.com/~r/BalassyGyorgyDevportal/~4/sGutO5AAuFU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://balassygyorgy.wordpress.com/2013/04/17/ajaxos-fajl-feltoltes/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/e46495cefe8761794595b7f2323f5ffe?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">balassygyorgy</media:title>
		</media:content>
	<feedburner:origLink>http://balassygyorgy.wordpress.com/2013/04/17/ajaxos-fajl-feltoltes/</feedburner:origLink></item>
		<item>
		<title>Feltöltött fájl validálása ASP.NET MVC-ben</title>
		<link>http://feedproxy.google.com/~r/BalassyGyorgyDevportal/~3/GVYDIodt_mE/</link>
		<comments>http://balassygyorgy.wordpress.com/2013/04/15/feltoltott-fajl-validalasa-aspnet-mvc-ben/#comments</comments>
		<pubDate>Mon, 15 Apr 2013 02:00:00 +0000</pubDate>
		<dc:creator>Balássy György</dc:creator>
				<category><![CDATA[Webfejlesztés]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">https://balassygyorgy.wordpress.com/?p=2335</guid>
		<description><![CDATA[Az ASP.NET MVC egyik szépségét a kód tisztasága adja, ami részben a model validálásnak köszönhető. Az ember fogja a System.ComponentModel.DataAnnotations névtérben lévő attribútumokat, teleaggatja velük a modellt vagy a view-modelt, és máris működik a validálás, ráadásul a kód egyéb részeit sem zavarja össze. Mindez szép és jó, ha egy string értékét vagy hasonlóan egyszerű inputot [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=balassygyorgy.wordpress.com&#038;blog=16172306&#038;post=2335&#038;subd=balassygyorgy&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Az ASP.NET MVC egyik szépségét a kód tisztasága adja, ami részben a model validálásnak köszönhető. Az ember fogja a <a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.aspx" target="_blank">System.ComponentModel.DataAnnotations névtér</a>ben lévő attribútumokat, teleaggatja velük a modellt vagy a view-modelt, és máris működik a validálás, ráadásul a kód egyéb részeit sem zavarja össze. </p>
<p>Mindez szép és jó, ha egy string értékét vagy hasonlóan egyszerű inputot szeretnénk vizsgálni, de például egy feltöltött fájl ellenőrzésére nem sok lehetőségünk van. .NET 4.5-től kezdve ugyan már van <a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.fileextensionsattribute.aspx" target="_blank">FileExtensionAttribute</a>, de gyakran ennél többre van szükségünk. </p>
<p>Amire szinte mindig szükség van:</p>
<ul>
<li>Töltött-e fel fájlt a felhasználó? </li>
<li>A feltöltött fájl kiterjesztése megfelel-e? </li>
<li>A feltöltött fájl mérete a meghatározott maximumon belül van-e? </li>
</ul>
<p>De lehet néhány extrább igény is:</p>
<ul>
<li>Létezik-e már ez a fájl a szerveren? </li>
<li>Fájl típusa megfelel-e (nem csak a kiterjesztése)? (ld. <a href="http://www.garykessler.net/library/file_sigs.html" target="_blank">File signatures table</a>, <a href="http://filetypedetective.codeplex.com/" target="_blank">FileTypeDetective</a> project) </li>
</ul>
<p>Készítsünk magunknak saját attribútumot! Arra kell csak figyelnünk, hogy a <a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.validationattribute.aspx" target="_blank">ValidationAttribute</a> ősosztályból származzon, és hogy a feltöltésnél használatos <a href="http://msdn.microsoft.com/en-us/library/system.web.httppostedfilebase.aspx" target="_blank">HttpPostedFileBase</a> típusú változókat validáljuk vele.</p>
<p>Íme egy megoldás:</p>
<pre class="code"><span style="color:black;">[</span><span style="color:#2b91af;">AttributeUsage</span><span style="color:black;">( </span><span style="color:#2b91af;">AttributeTargets</span><span style="color:black;">.Property )]
</span><span style="color:blue;">public sealed class </span><span style="color:#2b91af;">AttachmentAttribute </span><span style="color:black;">: </span><span style="color:#2b91af;">ValidationAttribute
</span><span style="color:black;">{
</span><span style="color:blue;">  protected override </span><span style="color:#2b91af;">ValidationResult </span><span style="color:black;">IsValid( </span><span style="color:blue;">object </span><span style="color:black;">value, <br />    </span><span style="color:#2b91af;">ValidationContext </span><span style="color:black;">validationContext )
  {
    </span><span style="color:#2b91af;">HttpPostedFileBase </span><span style="color:black;">file = value </span><span style="color:blue;">as </span><span style="color:#2b91af;">HttpPostedFileBase</span><span style="color:black;">;

    </span><span style="color:green;">// A fájl kötelező.
    </span><span style="color:blue;">if</span><span style="color:black;">( file == </span><span style="color:blue;">null </span><span style="color:black;">)
    {
      </span><span style="color:blue;">return new </span><span style="color:#2b91af;">ValidationResult</span><span style="color:black;">( </span><span style="color:#a31515;">&quot;Tölts fel fájlt!&quot; </span><span style="color:black;">);
    }

    </span><span style="color:green;">// A fájl max. 10MB-os lehet.
    </span><span style="color:blue;">if</span><span style="color:black;">( file.ContentLength &gt; 10 * 1024 * 1024 )
    {
      </span><span style="color:blue;">return new </span><span style="color:#2b91af;">ValidationResult</span><span style="color:black;">( </span><span style="color:#a31515;">&quot;A fájl túl nagy!&quot; </span><span style="color:black;">);
    }

    </span><span style="color:green;">// A fájl csak PDF lehet.
    </span><span style="color:blue;">string </span><span style="color:black;">ext = </span><span style="color:#2b91af;">Path</span><span style="color:black;">.GetExtension( file.FileName );
    </span><span style="color:blue;">if</span><span style="color:black;">( </span><span style="color:#2b91af;">String</span><span style="color:black;">.IsNullOrEmpty( ext ) || 
       !ext.Equals( </span><span style="color:#a31515;">&quot;.pdf&quot;</span><span style="color:black;">, </span><span style="color:#2b91af;">StringComparison</span><span style="color:black;">.OrdinalIgnoreCase ) )
    {
      </span><span style="color:blue;">return new </span><span style="color:#2b91af;">ValidationResult</span><span style="color:black;">( </span><span style="color:#a31515;">&quot;A fájl nem PDF!&quot; </span><span style="color:black;">);
    }

    </span><span style="color:green;">// Minden rendben.
    </span><span style="color:blue;">return </span><span style="color:#2b91af;">ValidationResult</span><span style="color:black;">.Success;
  }
}</span></pre>
<p>Ha ezzel megvagyunk, akkor már csak rá kell aggatnunk az <strong>[Attachment]</strong> attribútumot a modell megfelelő tulajdonságára, és a hibák máris be fognak kerülni a <strong>ModelState</strong>-be.</p>
<p>Ha a webalkalmazásunkban több helyen, többféle fájlt is fel lehet tölteni, akkor bevezethetünk rájuk egy enumot, amit átadunk az <strong>AttachmentAttribute</strong> konstruktorának. Így minden fájl ellenőrzése egy helyen, központosítva történhet.</p>
<p>&#160;</p>
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:ead8644f-2dec-483e-9a37-1b746b86c92e" class="wlWriterEditableSmartContent" style="float:none;margin:0;display:inline;padding:0;">Technorati-címkék: <a href="http://technorati.com/tags/ASP.NET" rel="tag">ASP.NET</a>,<a href="http://technorati.com/tags/MVC" rel="tag">MVC</a>,<a href="http://technorati.com/tags/security" rel="tag">security</a></div>
<br />Kategória:<a href='http://balassygyorgy.wordpress.com/category/webfejlesztes/'>Webfejlesztés</a> Tagged: <a href='http://balassygyorgy.wordpress.com/tag/asp-net/'>ASP.NET</a>, <a href='http://balassygyorgy.wordpress.com/tag/mvc/'>MVC</a>, <a href='http://balassygyorgy.wordpress.com/tag/security/'>security</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/balassygyorgy.wordpress.com/2335/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/balassygyorgy.wordpress.com/2335/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=balassygyorgy.wordpress.com&#038;blog=16172306&#038;post=2335&#038;subd=balassygyorgy&#038;ref=&#038;feed=1" width="1" height="1" /><img src="http://feeds.feedburner.com/~r/BalassyGyorgyDevportal/~4/GVYDIodt_mE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://balassygyorgy.wordpress.com/2013/04/15/feltoltott-fajl-validalasa-aspnet-mvc-ben/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/e46495cefe8761794595b7f2323f5ffe?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">balassygyorgy</media:title>
		</media:content>
	<feedburner:origLink>http://balassygyorgy.wordpress.com/2013/04/15/feltoltott-fajl-validalasa-aspnet-mvc-ben/</feedburner:origLink></item>
		<item>
		<title>Sok helyet foglalnak a Windows Store alkalmazások</title>
		<link>http://feedproxy.google.com/~r/BalassyGyorgyDevportal/~3/66Pqvygb3-g/</link>
		<comments>http://balassygyorgy.wordpress.com/2013/04/12/sok-helyet-foglalnak-a-windows-store-alkalmazasok/#comments</comments>
		<pubDate>Fri, 12 Apr 2013 02:00:00 +0000</pubDate>
		<dc:creator>Balássy György</dc:creator>
				<category><![CDATA[Windows 8]]></category>

		<guid isPermaLink="false">https://balassygyorgy.wordpress.com/?p=2333</guid>
		<description><![CDATA[A Windows Store alkalmazások egyik szépsége, hogy viszonylag egyszerűen tudnak frissülni: szinte automatikusan, rendszergazdai jog nélkül. Az egyszerűséget szeretik is kihasználni a fejlesztők, és nem múlik el hét úgy, hogy ne frissíthetnék pár alkalmazást a gépemen. Mindennek persze van némi hátránya is, konkrétan a diszkigény. A Store alkalmazások a C:\Program Files\WindowsApps rejtett mappába települnek, melyet [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=balassygyorgy.wordpress.com&#038;blog=16172306&#038;post=2333&#038;subd=balassygyorgy&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>A Windows Store alkalmazások egyik szépsége, hogy viszonylag egyszerűen tudnak frissülni: szinte automatikusan, rendszergazdai jog nélkül. Az egyszerűséget szeretik is kihasználni a fejlesztők, és nem múlik el hét úgy, hogy ne frissíthetnék pár alkalmazást a gépemen.</p>
<p>Mindennek persze van némi hátránya is, konkrétan a diszkigény. A Store alkalmazások a C:\Program Files\WindowsApps rejtett mappába települnek, melyet alapértelmezés szerint csak a Trusted Installer felhasználó érhet el. Ha adunk magunknak jogosultságokat, természetesen belekukkanthatunk ebbe a mappába, és kideríthetjük, hogy mi foglal nálam például közel 3GB-ot. </p>
<p>Valami hasonlóval fogunk találkozni:</p>
<p><a href="http://balassygyorgy.files.wordpress.com/2013/04/metro-apps-versions.png"><img title="metro-apps-versions" style="background-image:none;float:none;padding-top:0;padding-left:0;margin:0 auto;display:block;padding-right:0;border-width:0;" border="0" alt="metro-apps-versions" src="http://balassygyorgy.files.wordpress.com/2013/04/metro-apps-versions_thumb.png?w=369&#038;h=215" width="369" height="215" /></a></p>
<p>Ha belenézünk a mappákba, akkor megtaláljuk az alkalmazásokhoz tartozó fájlokat: HTML5+JavaScript alkalmazások esetén ott a teljes forráskód, .NET-ben készült alkalmazások esetén pedig a lefordított DLL-eket és az egyéb fájlokat találjuk mappákban.</p>
<p>Feltűnhet, hogy minden alkalmazásnak minden verziója külön mappában lakik, így azok teljesen elkülönülnek egymástól. Így már könnyen megmérhetjük, hogy melyik alkalmazás mennyi helyet foglal. Ha ezt összevetjük a PC Settings –&gt; General –&gt; View app sizes listával, akkor azt fogjuk tapasztalni, hogy az a lista csak az adott felhasználó által telepített alkalmazások legfrissebb verzióinak méreteit mutatja.</p>
<p>De miért van egy alkalmazásból több verzió?</p>
<p>Egyrészt azért, hogy az egy gépen dolgozó felhasználók ne legyenek hatással egymásra. Amíg két felhasználó egy alkalmazásnak ugyanazt a verzióját telepíti, addig természetesen a program fájlok csak egy példányban lesznek a gépen. Azonban ha ezek után az egyik felhasználó frissíti a saját profiljában az appot, akkor már a gépen megtalálható lesz a régi és az új verzió is. Ily módon a felhasználók egyáltalán nincsenek hatással egymásra. </p>
<p>Ezen kívül az a verzió is rendelkezésre áll, ami az operációs rendszerrel együtt települt, hogy ha új felhasználót hozunk létre a rendszerben, akkor ő azt a verziót fogja megkapni.</p>
<p>Felmerülhet persze a kérdés, hogy mindez szép és jó, de hogy szabadulhatunk meg a felesleges verzióktól?</p>
<p>Bevallom, erre nem találtam hivatalos megoldást. Ha valaki tud ilyet, kérem írja meg nekem. Találtam viszont egy utalást arra, hogy a Windows takarítja ezt a mappát, “when needed”. Tudja valaki, hogy ez pontosan mit jelent?</p>
<p>&#160;</p>
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:a7c6120f-fcec-4301-9e95-aebdeda2189e" class="wlWriterEditableSmartContent" style="float:none;margin:0;display:inline;padding:0;">Technorati-címkék: <a href="http://technorati.com/tags/Windows+8" rel="tag">Windows 8</a></div>
<br />Kategória:<a href='http://balassygyorgy.wordpress.com/category/windows-8/'>Windows 8</a> Tagged: <a href='http://balassygyorgy.wordpress.com/tag/windows-8/'>Windows 8</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/balassygyorgy.wordpress.com/2333/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/balassygyorgy.wordpress.com/2333/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=balassygyorgy.wordpress.com&#038;blog=16172306&#038;post=2333&#038;subd=balassygyorgy&#038;ref=&#038;feed=1" width="1" height="1" /><img src="http://feeds.feedburner.com/~r/BalassyGyorgyDevportal/~4/66Pqvygb3-g" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://balassygyorgy.wordpress.com/2013/04/12/sok-helyet-foglalnak-a-windows-store-alkalmazasok/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/e46495cefe8761794595b7f2323f5ffe?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">balassygyorgy</media:title>
		</media:content>

		<media:content url="http://balassygyorgy.files.wordpress.com/2013/04/metro-apps-versions_thumb.png" medium="image">
			<media:title type="html">metro-apps-versions</media:title>
		</media:content>
	<feedburner:origLink>http://balassygyorgy.wordpress.com/2013/04/12/sok-helyet-foglalnak-a-windows-store-alkalmazasok/</feedburner:origLink></item>
		<item>
		<title>Meglepő kapcsolat bontások SQL Azure-ban</title>
		<link>http://feedproxy.google.com/~r/BalassyGyorgyDevportal/~3/wE1h0UPTLEE/</link>
		<comments>http://balassygyorgy.wordpress.com/2013/04/10/meglepo-kapcsolat-bontasok-sql-azure-ban/#comments</comments>
		<pubDate>Wed, 10 Apr 2013 02:00:00 +0000</pubDate>
		<dc:creator>Balássy György</dc:creator>
				<category><![CDATA[Adatkezelés]]></category>
		<category><![CDATA[Felhő]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[error]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">https://balassygyorgy.wordpress.com/?p=2324</guid>
		<description><![CDATA[Gyakran lehet találkozni azzal a ténnyel, hogy mivel az SQL Azure ugyanazt a tabular data stream (TDS) protokollt támogatja, mint a teljes SQL Server, a programozási modell teljesen azonos a két esetben. Ebből viszont – a közhiedelemmel ellentétben – nem következik az, hogy az alkalmazásunk felhőbe költöztetése mindössze annyiból áll, hogy átállítjuk a connection stringet! [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=balassygyorgy.wordpress.com&#038;blog=16172306&#038;post=2324&#038;subd=balassygyorgy&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Gyakran lehet találkozni azzal a ténnyel, hogy mivel az SQL Azure ugyanazt a tabular data stream (TDS) protokollt támogatja, mint a teljes SQL Server, a programozási modell teljesen azonos a két esetben. Ebből viszont – a közhiedelemmel ellentétben – nem következik az, hogy az alkalmazásunk felhőbe költöztetése mindössze annyiból áll, hogy átállítjuk a connection stringet!</p>
<p>Az SQL Azure ugyanis számos olyan esetben is hajlamos bontani a kapcsolatot, amihez nem vagyunk hozzászokva a saját szervereinken. Íme két példa:</p>
<ul>
<li>40197 &#8211; The service has encountered an error processing your request. Please try again. </li>
<li>40501 &#8211; The service is currently busy. Retry the request after 10 seconds. </li>
</ul>
<p>Ennek az alapvető okai a hibatűrésben és a rendelkezésre állásban keresendőek. Ha a kérés kiszolgálásában részt vevő valamelyik szereplő hibás lesz vagy épp frissül, akkor a felhőnek köszönhetően nem lesz tartós leállásunk, de szolgáltatás visszaállásáig (ami rövid idő) a kapcsolatokat bontani fogja a szerver. A másik ok, hogy mivel az adatbázisok osztoznak bizonyos erőforrásokon, az SQL Azure query és connection throttling szolgáltatásai biztosítják, hogy egyik ügyfél se akaszthassa le teljesen a kiszolgálást. Ha túllépjük a limitet, hibát fogunk kapni.</p>
<p>Mindennek az az eredménye, hogy időnként elszállnak az adatbázis lekérdezéseink, de mivel ezek okai alapvetően átmeneti jelenségek, bátran megismételhetjük a lekérdezést kicsit később. Ez sajnos nagyon kellemetlen, mert általában arra számítva írjuk meg az adatelérési rétegünket, hogy ha az adatbázis nem elérhető, akkor nagy baj van, és nem szoktunk arra számítani, hogy a hiba másodperceken belül megszűnik magától.</p>
<p>Magyarul: SQL Azure-on futó alkalmazások esetén gondoskodnunk kell ezeknek a hibáknak a kezeléséről, és a hiba jellegétől függően meg kell ismételnünk a lekérdezést. Ha korábban nem volt az alkalmazásunkban ilyen intelligens retry-logika, akkor a felhőbe költöztetéskor ezt bele kell tennünk.</p>
<p>Néhány segítség:</p>
<ul>
<li><a href="http://msdn.microsoft.com/en-us/library/ff394106.aspx" target="_blank">SQL Azure hibakódok, a végén egy fejezet a throttling hibákról</a> </li>
<li><a href="http://social.technet.microsoft.com/wiki/contents/articles/1541.windows-azure-sql-database-connection-management.aspx" target="_blank">Windows Azure SQL Database Connection Management: TechNet wiki cikk a throttling limitekről</a> </li>
<li><a href="http://blogs.msdn.com/b/sqlazure/archive/2010/05/11/10011247.aspx" target="_blank">Connections and SQL Azure</a>: régebbi SQL Azure Team blogbejegyzés, az okok leírása használható, a kódrészletet már nem érdemes nézni, van jobb. </li>
<li>Transient Fault Handling Application Block:
<ul>
<li><a href="http://msdn.microsoft.com/en-us/library/hh680934(v=pandp.50).aspx" target="_blank">Patterns and Practices leírás</a> </li>
<li><a href="http://nuget.org/packages/EnterpriseLibrary.WindowsAzure.TransientFaultHandling" target="_blank">NuGet package</a> </li>
</ul>
</li>
</ul>
<p>&#160;</p>
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:147625ce-7e64-4d2b-aa3f-b81df2eac9c8" class="wlWriterEditableSmartContent" style="float:none;margin:0;display:inline;padding:0;">Technorati-címkék: <a href="http://technorati.com/tags/SQL" rel="tag">SQL</a>,<a href="http://technorati.com/tags/Azure" rel="tag">Azure</a>,<a href="http://technorati.com/tags/SQL+Azure" rel="tag">SQL Azure</a>,<a href="http://technorati.com/tags/error" rel="tag">error</a></div>
<br />Kategória:<a href='http://balassygyorgy.wordpress.com/category/adatkezeles/'>Adatkezelés</a>, <a href='http://balassygyorgy.wordpress.com/category/felho/'>Felhő</a> Tagged: <a href='http://balassygyorgy.wordpress.com/tag/azure/'>Azure</a>, <a href='http://balassygyorgy.wordpress.com/tag/error/'>error</a>, <a href='http://balassygyorgy.wordpress.com/tag/sql/'>SQL</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/balassygyorgy.wordpress.com/2324/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/balassygyorgy.wordpress.com/2324/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=balassygyorgy.wordpress.com&#038;blog=16172306&#038;post=2324&#038;subd=balassygyorgy&#038;ref=&#038;feed=1" width="1" height="1" /><img src="http://feeds.feedburner.com/~r/BalassyGyorgyDevportal/~4/wE1h0UPTLEE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://balassygyorgy.wordpress.com/2013/04/10/meglepo-kapcsolat-bontasok-sql-azure-ban/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/e46495cefe8761794595b7f2323f5ffe?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">balassygyorgy</media:title>
		</media:content>
	<feedburner:origLink>http://balassygyorgy.wordpress.com/2013/04/10/meglepo-kapcsolat-bontasok-sql-azure-ban/</feedburner:origLink></item>
		<item>
		<title>Virtuális gépek védelme a felhőben</title>
		<link>http://feedproxy.google.com/~r/BalassyGyorgyDevportal/~3/rHpu-ibhbuE/</link>
		<comments>http://balassygyorgy.wordpress.com/2013/04/08/virtualis-gepek-vedelme-a-felhoben/#comments</comments>
		<pubDate>Mon, 08 Apr 2013 02:00:00 +0000</pubDate>
		<dc:creator>Balássy György</dc:creator>
				<category><![CDATA[Biztonság]]></category>
		<category><![CDATA[Felhő]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">https://balassygyorgy.wordpress.com/?p=2323</guid>
		<description><![CDATA[Mikor a rendszereinket a felhőbe költöztetjük, annyira meg szoktunk örülni annak, hogy minden “megy magától”, hogy gyakran megfeledkezünk az alapvető biztonsági teendőkről (amiket pedig a saját gépeinken amúgy meg szoktunk tenni). Az első öröm általában akkor ér minket, amikor a varázslóval pikk-pakk létrehozunk egy új virtuális gépet az Azure-ban: A problémák – legalábbis részben – [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=balassygyorgy.wordpress.com&#038;blog=16172306&#038;post=2323&#038;subd=balassygyorgy&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Mikor a rendszereinket a felhőbe költöztetjük, annyira meg szoktunk örülni annak, hogy minden “megy magától”, hogy gyakran megfeledkezünk az alapvető biztonsági teendőkről (amiket pedig a saját gépeinken amúgy meg szoktunk tenni). Az első öröm általában akkor ér minket, amikor a varázslóval pikk-pakk létrehozunk egy új virtuális gépet az Azure-ban:</p>
<p><a href="http://balassygyorgy.files.wordpress.com/2013/03/create-vm.png"><img title="create-vm" style="background-image:none;float:none;padding-top:0;padding-left:0;margin:0 auto;display:block;padding-right:0;border-width:0;" border="0" alt="create-vm" src="http://balassygyorgy.files.wordpress.com/2013/03/create-vm_thumb.png?w=380&#038;h=363" width="380" height="363" /></a></p>
<p>A problémák – legalábbis részben – ebből az egyszerűségből fakadnak:</p>
<ul>
<li>A rendszergazda felhasználónevet nem kell megadnunk, sőt nem is lehet (lásd fent, disabled), hiszen az minden esetben Administrator. </li>
<li>A gép IP címét nem kell megadnunk, hiszen az <a href="http://www.microsoft.com/en-us/download/details.aspx?id=29840" target="_blank">Azure a saját tartományából</a> ad majd neki egyet. </li>
<li>A RDP-t nem kell beállítanunk, hiszen az minden esetben engedélyezve lesz az alapértelmezett 3389-es porton. </li>
</ul>
<p>Sajnos ez a kényelem jelentősen megkönnyíti a támadók dolgát: csak végig kell nézniük az <a href="http://www.microsoft.com/en-us/download/details.aspx?id=29840" target="_blank">Azure IP tartományát</a> és be kell próbálkozniuk a 3389-es porton az Administrator felhasználóval és valamilyen jelszóval. Ilyen RDP brute force támadásra <a href="https://www.google.hu/search?q=remote+desktop+brute+force+tool" target="_blank">számos eszköz létezik</a> már, és sajnos van már hír olyan esetről is, amikor a támadók <a href="http://itproctology.blogspot.hu/2012/12/securing-azure-virtual-machines-or-i.html" target="_blank">sikerrel jártak</a>.</p>
<p>Amit mindenképp érdemes megtenni:</p>
<ul>
<li>Az RDP ne az alapértelmezett porton fusson. </li>
<li>Célszerű beállítani, hogy milyen kliens IP címekről lehet RDP-zni a gépre. </li>
<li>A rendszergazda felhasználóneve ne az alapértelmezett legyen. </li>
<li>Az admin jelszó legyen erős. </li>
</ul>
<p><a href="http://fabriccontroller.net/blog/posts/securing-access-to-your-windows-azure-virtual-machines/" target="_blank">Sandrino Di Mattia cikke</a> részletesen leírja, hogy mindezt hogyan tehetjük meg.</p>
<p>&#160;</p>
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:b821628f-5dc0-4259-adbc-e9ebcf65e674" class="wlWriterEditableSmartContent" style="float:none;margin:0;display:inline;padding:0;">Technorati-címkék: <a href="http://technorati.com/tags/Azure" rel="tag">Azure</a>,<a href="http://technorati.com/tags/security" rel="tag">security</a>,<a href="http://technorati.com/tags/virtual+machine" rel="tag">virtual machine</a></div>
<br />Kategória:<a href='http://balassygyorgy.wordpress.com/category/biztonsag/'>Biztonság</a>, <a href='http://balassygyorgy.wordpress.com/category/felho/'>Felhő</a> Tagged: <a href='http://balassygyorgy.wordpress.com/tag/azure/'>Azure</a>, <a href='http://balassygyorgy.wordpress.com/tag/security/'>security</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/balassygyorgy.wordpress.com/2323/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/balassygyorgy.wordpress.com/2323/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=balassygyorgy.wordpress.com&#038;blog=16172306&#038;post=2323&#038;subd=balassygyorgy&#038;ref=&#038;feed=1" width="1" height="1" /><img src="http://feeds.feedburner.com/~r/BalassyGyorgyDevportal/~4/rHpu-ibhbuE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://balassygyorgy.wordpress.com/2013/04/08/virtualis-gepek-vedelme-a-felhoben/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/e46495cefe8761794595b7f2323f5ffe?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">balassygyorgy</media:title>
		</media:content>

		<media:content url="http://balassygyorgy.files.wordpress.com/2013/03/create-vm_thumb.png" medium="image">
			<media:title type="html">create-vm</media:title>
		</media:content>
	<feedburner:origLink>http://balassygyorgy.wordpress.com/2013/04/08/virtualis-gepek-vedelme-a-felhoben/</feedburner:origLink></item>
		<item>
		<title>UX tippek és olvasnivalók</title>
		<link>http://feedproxy.google.com/~r/BalassyGyorgyDevportal/~3/8VEKmlnBp7s/</link>
		<comments>http://balassygyorgy.wordpress.com/2013/04/04/ux-tippek-es-olvasnivalok/#comments</comments>
		<pubDate>Thu, 04 Apr 2013 02:00:00 +0000</pubDate>
		<dc:creator>Balássy György</dc:creator>
				<category><![CDATA[Webfejlesztés]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[UX]]></category>

		<guid isPermaLink="false">https://balassygyorgy.wordpress.com/?p=2319</guid>
		<description><![CDATA[Mióta nagyobb arányban használok kisebb kijelzős és érintőképernyős eszközöket, gyakrabban villan belém a felismerés, hogy a user experience, és a felhasználói felületek valóban barátságos, használható formára tervezése mennyire fontos – lenne. Sajnos azt tapasztalom, hogy számos olyan szoftver van, ahol az ötlet kiváló, de a felhasználói felület teljesen elrontja az élményt, és megy az alkalmazás [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=balassygyorgy.wordpress.com&#038;blog=16172306&#038;post=2319&#038;subd=balassygyorgy&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Mióta nagyobb arányban használok kisebb kijelzős és érintőképernyős eszközöket, gyakrabban villan belém a felismerés, hogy a user experience, és a felhasználói felületek valóban barátságos, használható formára tervezése mennyire fontos – lenne. Sajnos azt tapasztalom, hogy számos olyan szoftver van, ahol az ötlet kiváló, de a felhasználói felület teljesen elrontja az élményt, és megy az alkalmazás vagy a website a süllyesztőbe. </p>
<p>Sokakkal beszélgetve arra jutottam, hogy ennek egyik oka természetesen a projektek költségérzékenysége (lásd még unit testelés), a másik, hogy egyszerűen nincs UX designer a fejlesztőcsapatokban. (Ez a két dolog persze összefügg, de nem csak a pénz miatt nincs ilyen szakember a projektekben.) Egyik sem fog egyik napról a másikra megváltozni, így nincs más lehetőség, mint saját erőből megoldani és erre két megoldást látok:</p>
<ol>
<li>Másolás. Az ötletek másolását általában rossz szemmel nézzük, de a felhasználói élmény terén szerintem ez nem egészen van így. Sőt, ha egy megoldás beválik, elterjed és az ismertsége még jobban megkönnyíti a használhatóságát. Persze az is lehet, hogy nem válik be, vagy még nem bizonyított, de kényszerből elterjed és ezért lesz közismert. Ezt a mintát követik a standardek és az ajánlások. Például az érintőkijelzős eszközöknél a “behúzom az ujjam a széléről” gesztus egyáltalán nem logikus, csak azért próbálkozunk vele, mert arra többnyire történni szokott valami. </li>
<li>A meglévő szakembereink kiokosítása. Na, ez sem zökkenőmentes, mert nem minden programozót lehet rávenni arra, hogy a GUI-val foglalkozzon, de szerencsére akadnak olyanok, akiknek igenis van érzékük hozzá. Őket már csak idővel és forrásokkal kell ellátni. <a href="http://ambroselittle.com/" target="_blank">Ambrose Little</a> (az ő nevével a <a href="http://balassygyorgy.wordpress.com/2013/03/11/mockupkeszito-eszkozok/" target="_blank">korábbi bejegyzésben</a> említett Infragistics Indigo Studio kapcsán találkozhattunk) blogjában például találhatunk egy <a href="http://ambroselittle.com/2012/08/22/ux-book-list/" target="_blank">UX Book List</a> cikket, ami jó kiindulás lehet.</li>
</ol>
<p>És ha már kiindulás, íme <a href="http://www.infragistics.com/community/blogs/ambrose_little/archive/2012/07/01/ux-for-devs-manifesto.aspx" target="_blank">Ambrose UX for Devs Manifesto</a>ja:</p>
<ol>
<li>A tervezést kezdd az ember irányából.</li>
<li>Hagyj időt a kutatásra.</li>
<li>Ne írj, rajzolj.</li>
<li>Próbálj ki sok variációt, majd egyesítsd a hasznos részleteket.</li>
<li>Tesztelj a felhasználókkal.</li>
<li>Csak akkor kódolj, ha nincs más mód.</li>
<li>Végül ügyelj a részletekre is.</li>
</ol>
<p>Ti mit gondoltok?</p>
<p>&#160;</p>
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:5ac22dfa-8f02-40b6-b767-f506a0fdfb78" class="wlWriterEditableSmartContent" style="float:none;margin:0;display:inline;padding:0;">Technorati-címkék: <a href="http://technorati.com/tags/user+experience" rel="tag">user experience</a>,<a href="http://technorati.com/tags/UX" rel="tag">UX</a>,<a href="http://technorati.com/tags/design" rel="tag">design</a></div>
<br />Kategória:<a href='http://balassygyorgy.wordpress.com/category/webfejlesztes/'>Webfejlesztés</a> Tagged: <a href='http://balassygyorgy.wordpress.com/tag/design/'>design</a>, <a href='http://balassygyorgy.wordpress.com/tag/ux/'>UX</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/balassygyorgy.wordpress.com/2319/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/balassygyorgy.wordpress.com/2319/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=balassygyorgy.wordpress.com&#038;blog=16172306&#038;post=2319&#038;subd=balassygyorgy&#038;ref=&#038;feed=1" width="1" height="1" /><img src="http://feeds.feedburner.com/~r/BalassyGyorgyDevportal/~4/8VEKmlnBp7s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://balassygyorgy.wordpress.com/2013/04/04/ux-tippek-es-olvasnivalok/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/e46495cefe8761794595b7f2323f5ffe?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">balassygyorgy</media:title>
		</media:content>
	<feedburner:origLink>http://balassygyorgy.wordpress.com/2013/04/04/ux-tippek-es-olvasnivalok/</feedburner:origLink></item>
		<item>
		<title>Content Injector for ASP.NET MVC</title>
		<link>http://feedproxy.google.com/~r/BalassyGyorgyDevportal/~3/bfzA7l1FL_0/</link>
		<comments>http://balassygyorgy.wordpress.com/2013/04/02/content-injector-for-aspnet-mvc/#comments</comments>
		<pubDate>Tue, 02 Apr 2013 02:00:00 +0000</pubDate>
		<dc:creator>Balássy György</dc:creator>
				<category><![CDATA[.NET 4.5 és Visual Studio 2012]]></category>
		<category><![CDATA[Webfejlesztés]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[NuGet]]></category>

		<guid isPermaLink="false">https://balassygyorgy.wordpress.com/?p=2318</guid>
		<description><![CDATA[Aki készített már újrafelhasználható elemeket ASP.NET MVC-ben, bizonyára találkozott már azzal a problémával, hogy egy partial view vagy egy HTML helper működéséhez szükséges egy CSS stíluslap vagy egy külső JavaScript fájl. Ha odafigyelünk a kódunk minőségére, akkor a CSS-t mindig az oldal tetején, a szkriptet pedig mindig az oldal alján töltjük be, gondosan ügyelve arra, [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=balassygyorgy.wordpress.com&#038;blog=16172306&#038;post=2318&#038;subd=balassygyorgy&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Aki készített már újrafelhasználható elemeket ASP.NET MVC-ben, bizonyára találkozott már azzal a problémával, hogy egy partial view vagy egy HTML helper működéséhez szükséges egy CSS stíluslap vagy egy külső JavaScript fájl. Ha odafigyelünk a kódunk minőségére, akkor a CSS-t mindig az oldal tetején, a szkriptet pedig mindig az oldal alján töltjük be, gondosan ügyelve arra, hogy ezek a külső erőforrások akkor is csak egyszer töltődjenek be az oldalra, ha több helyen is szükség van rájuk. Viszont ezt csöppet sem egyszerű megoldani, hiszen a partial view-k és a HTML helperek teljesen önállóan, egymástól függetlenül renderelődnek. Bár a probléma egyáltalán nem újkeletű, még ASP.NET WebFormsban sem egyszerű megoldani, MVC-ben viszont kifejezetten nehéz.</p>
<p>Talán nem is meglepő, hogy a készre sütött megoldást <a href="http://www.peterblum.com/Home.aspx" target="_blank">Peter Blum</a> tálalja nekünk a <a href="https://github.com/plblum/ContentInjector" target="_blank">Content Injector for ASP.NET MVC</a> formájában. Az öreg motoros ASP.NET fejlesztők már sokszor találkozhattak Peter nevével, aki <a href="http://www.peterblum.com/AboutTheCompany.aspx" target="_blank">egyszemélyes cégében</a> leginkább ASP.NET web controlokat készít. Ezek közül a legismertebb a <a href="http://www.peterblum.com/des" target="_blank">Peter’s Data Entry Suite</a>, amely több, mint 100 WebForms vezérlőt tartalmaz, melyek elsősorban az adatbevitelt és a validációt teszik egyszerűbbé. Igen hasznos csomagról van szó, nem véletlenül kapott már értük számos pozitív <a href="http://www.asp.net/community/control-gallery/Item.aspx?i=397" target="_blank">értékelést</a>.</p>
<p>Így csöppet sem csodálkoztam, amikor pár héttel ezelőtt Peter bukkant fel egy ötlettel az <a href="http://aspinsiders.com/" target="_blank">ASPInsiders</a> listán, ami nagyon kényelmesen megoldja a fenti problémát. Sokan kipróbáltuk, kapott is pár visszajelzést, amit villámgyorsan át is vezetett a kódon, így most már bátran merem ajánlani a <a href="https://github.com/plblum/ContentInjector" target="_blank">Content Injector for ASP.NET MVC</a> projektet, leginkább <a href="https://www.nuget.org/packages/ContentInjector/" target="_blank">NuGet csomag</a> formájában.</p>
<p>A használata pofonegyszerű. Először is jelöljük meg az oldalunkon, tipikusan a Layout.cshtml fájlban, azokat a helyeket, ahova majd beszúródnak a tartalmak:</p>
<pre>@Injector.InjectionPoint(&quot;ScriptFiles&quot;)</pre>
<p>Ezek után ha például egy view-nak szüksége van a jQuery Validate szkript fájljaira, akkor a view-ból szúrjuk be őket a korábban megjelölt helyekre:</p>
<pre>@Injector.ScriptFile(&quot;~/Scripts/jquery.validate.min.js&quot;);
@Injector.ScriptFile(&quot;~/Scripts/jquery.validate.unobtrusive.min.js&quot;);</pre>
<p>Ez persze csak a legegyszerűbb használati eset, meg lehet adni még további paramétereket (például sorrend), valamint beszúrhatunk stíluslapot, szkriptet, meta tag-et, rejtett mezőt, szkript blokkot, vagy bármi mást, hiszen a rendszer jól kiterjeszthető és konfigurálható (például tracing). Minderről elég részletesen tájékoztat a 23 oldalas <a href="https://github.com/plblum/ContentInjector/blob/master/Users%20Guide.pdf?raw=true" target="_blank">User’s Guide</a>.</p>
<p>További érdekesség, hogy a visszajelzések alapján Peter összekapcsolta a Content Injectort a <a href="http://aspnetoptimization.codeplex.com/" target="_blank">Microsoft Web Optimization Framework</a>kel, így a <a href="https://github.com/plblum/ContentInjector.WOF" target="_blank">ContentInjector.WOF</a> NuGet csomag telepítése után már StyleBundle is ScriptBundle is beszúrható.</p>
<p>Letöltések:</p>
<ul>
<li><a href="https://github.com/plblum/ContentInjector" target="_blank">Content Injector for ASP.NET MVC forráskód és dokumentáció (GitHub)</a> </li>
<li><a href="https://www.nuget.org/packages/ContentInjector/" target="_blank">Content Injector for ASP.NET MVC NuGet csomag (ContentInjector)</a> </li>
<li><a href="https://github.com/plblum/ContentInjector.WOF" target="_blank">Content Injector support for Web Optimization Framework forráskód és dokumentáció (GitHub)</a> </li>
<li><a href="https://www.nuget.org/packages/ContentInjector.WOF" target="_blank">Content Injector support for Web Optimization Framework NuGet csomag (ContentInjector.WOF)</a> </li>
</ul>
<p>&#160;</p>
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:192e2140-dca9-477d-a66d-1adcc940d57d" class="wlWriterEditableSmartContent" style="float:none;margin:0;display:inline;padding:0;">Technorati-címkék: <a href="http://technorati.com/tags/ASP.NET" rel="tag">ASP.NET</a>,<a href="http://technorati.com/tags/MVC" rel="tag">MVC</a>,<a href="http://technorati.com/tags/NuGet" rel="tag">NuGet</a></div>
<br />Kategória:<a href='http://balassygyorgy.wordpress.com/category/net-4-5-es-visual-studio-2012/'>.NET 4.5 és Visual Studio 2012</a>, <a href='http://balassygyorgy.wordpress.com/category/webfejlesztes/'>Webfejlesztés</a> Tagged: <a href='http://balassygyorgy.wordpress.com/tag/asp-net/'>ASP.NET</a>, <a href='http://balassygyorgy.wordpress.com/tag/mvc/'>MVC</a>, <a href='http://balassygyorgy.wordpress.com/tag/nuget/'>NuGet</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/balassygyorgy.wordpress.com/2318/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/balassygyorgy.wordpress.com/2318/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=balassygyorgy.wordpress.com&#038;blog=16172306&#038;post=2318&#038;subd=balassygyorgy&#038;ref=&#038;feed=1" width="1" height="1" /><img src="http://feeds.feedburner.com/~r/BalassyGyorgyDevportal/~4/bfzA7l1FL_0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://balassygyorgy.wordpress.com/2013/04/02/content-injector-for-aspnet-mvc/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/e46495cefe8761794595b7f2323f5ffe?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">balassygyorgy</media:title>
		</media:content>
	<feedburner:origLink>http://balassygyorgy.wordpress.com/2013/04/02/content-injector-for-aspnet-mvc/</feedburner:origLink></item>
		<item>
		<title>Rejtett repülőszimulátor a Windows 8-ban</title>
		<link>http://feedproxy.google.com/~r/BalassyGyorgyDevportal/~3/QQhlhkGK_z4/</link>
		<comments>http://balassygyorgy.wordpress.com/2013/04/01/rejtett-reploszimultor-a-windows-8-ban/#comments</comments>
		<pubDate>Mon, 01 Apr 2013 05:23:14 +0000</pubDate>
		<dc:creator>Balássy György</dc:creator>
				<category><![CDATA[Humor]]></category>
		<category><![CDATA[Windows 8]]></category>
		<category><![CDATA[humor]]></category>

		<guid isPermaLink="false">https://balassygyorgy.wordpress.com/?p=2329</guid>
		<description><![CDATA[Update: Windows 7-en is működik, ha telepítve van az Internet Explorer 10! Akik régi motorosok a szakmában, biztosan emlékeznek még rá, hogy az Excel 97-ben volt egy kissé szokatlan funkció, úgy hívták: repülőszimulátor. Ez egy olyan rejtett funkció (ún. easter egg) volt az alkalmazásban, amit csak egy ügyes lépéssorozattal lehetett előhozni, utána viszont egy 3D-s [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=balassygyorgy.wordpress.com&#038;blog=16172306&#038;post=2329&#038;subd=balassygyorgy&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><strong>Update: Windows 7-en is működik</strong>, ha telepítve van az <a href="http://windows.microsoft.com/en-us/internet-explorer/downloads/ie-10/worldwide-languages" target="_blank">Internet Explorer 10</a>!</p>
<p>Akik régi motorosok a szakmában, biztosan emlékeznek még rá, hogy az Excel 97-ben volt egy kissé szokatlan funkció, úgy hívták: repülőszimulátor. Ez egy olyan rejtett funkció (ún. easter egg) volt az alkalmazásban, amit csak egy <a href="http://www.eggheaven.com/eggs/software/137-excel" target="_blank">ügyes lépéssorozattal</a> lehetett előhozni, utána viszont egy 3D-s táj felett repülhettünk, ami 15 évvel ezelőtt még igen menőnek számított:</p>
<p><a href="http://balassygyorgy.files.wordpress.com/2013/04/excel-97-flight-simulator.jpg"><img title="excel-97-flight-simulator" style="background-image:none;float:none;padding-top:0;padding-left:0;margin:0 auto;display:block;padding-right:0;border-width:0;" border="0" alt="excel-97-flight-simulator" src="http://balassygyorgy.files.wordpress.com/2013/04/excel-97-flight-simulator_thumb.jpg?w=543&#038;h=256" width="543" height="256" /></a></p>
<p>A Wikipedia <a href="http://en.wikipedia.org/wiki/Easter_eggs_in_Microsoft_products" target="_blank">Easter eggs is Microsoft products</a> c. cikkében megtalálható még számos ilyen easter egg, megjegyezve, hogy a Microsoft a <a href="http://en.wikipedia.org/wiki/Trustworthy_Computing" target="_blank">Trustworthy Computing</a> program keretében 2002-től megszűntette az ilyen ellenőrizetlen kódokat az alkalmazásaiban.</p>
<p>Ehhez képest a JavaScript csapatnak köszönhetően a Windows 8-ban mégis van (legalább) egy, konkrétan az Exceles repülőszimulátornak a reinkarnációja. Állítólag eredetileg példaalkalmazásnak készült, amely a Chakra JavaScript motor képességeit lett volna hivatott bemutatni, hogy még ilyen komplex teret is képes a platform (Internet Explorer 10, Windows 8) valós időben renderelni (érdemes összevetni mindezt a <a href="http://doom.pdox.net/" target="_blank">Doom for Chrome</a>-mal, amihez Native Client kellett). </p>
<p>A teljesítmény mellett a másik érdekesség, hogy bemutatja, milyen jól kezeli a platform a hardver szenzorokat, azaz ha tableten játszunk, akkor az eszköz mozgatásával, forgatásával tudjuk irányítani a repülőnket. Ez egyébként így 3D-ben óriási élmény, még azoknak is, akik játszottak már tableten versenyautósat.</p>
<p>Mivel ez az easter egg a rendszer mélyén található, nem fogjuk tudni varázs-billentyűkombinációkkal előhozni, kicsit kódolnunk kell hozzá. Másoljuk be az alábbi kódot egy szövegfájlba és mentsük el például a desktopunkra <strong>flight.js</strong> néven:</p>
<pre>var r = &quot;&quot;;
var e = &quot;426F63732C206E696E637320656173746572206567672061204D6963726F736F&quot;+<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;6674207465726D656B656B62656E2E0D0A412063696B6B20323031332E206170&quot;+<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;72696C697320312E20616C6B616C6D61626F6C206B65737A756C74203A290D0A&quot;+<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;687474703A2F2F62616C6173737967796F7267792E776F726470726573732E636F6D&quot;;<br />for ( var i = 0; i &lt; e.length; ) { <br />&#160; var l = e.charAt( i ) + e.charAt( i + 1 ); <br />&#160; r += String.fromCharCode( parseInt( l, 16 ) ); <br />&#160; i += 2; <br />} <br />WScript.Echo(r);</pre>
<p>Majd nyissunk egy parancssort, és indítsuk el:</p>
<pre>wscript flight.js</pre>
<p>Íme a végeredmény:</p>
<p><a href="http://balassygyorgy.files.wordpress.com/2013/04/flight-simulator-tablet.png"><img title="flight-simulator-tablet" style="background-image:none;float:none;padding-top:0;padding-left:0;margin:0 auto;display:block;padding-right:0;border-width:0;" border="0" alt="flight-simulator-tablet" src="http://balassygyorgy.files.wordpress.com/2013/04/flight-simulator-tablet_thumb.png?w=400&#038;h=284" width="400" height="284" /></a></p>
<p>Nekem 13401 pont a rekordom, hát neked?</p>
<p>&#160;</p>
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:a5e05397-c24d-456a-aad2-a54abc1e0a9f" class="wlWriterEditableSmartContent" style="float:none;margin:0;display:inline;padding:0;">Technorati-címkék: <a href="http://technorati.com/tags/Windows+8" rel="tag">Windows 8</a>,<a href="http://technorati.com/tags/easter+egg" rel="tag">easter egg</a></div>
<br />Kategória:<a href='http://balassygyorgy.wordpress.com/category/humor/'>Humor</a>, <a href='http://balassygyorgy.wordpress.com/category/windows-8/'>Windows 8</a> Tagged: <a href='http://balassygyorgy.wordpress.com/tag/humor-2/'>humor</a>, <a href='http://balassygyorgy.wordpress.com/tag/windows-8/'>Windows 8</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/balassygyorgy.wordpress.com/2329/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/balassygyorgy.wordpress.com/2329/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=balassygyorgy.wordpress.com&#038;blog=16172306&#038;post=2329&#038;subd=balassygyorgy&#038;ref=&#038;feed=1" width="1" height="1" /><img src="http://feeds.feedburner.com/~r/BalassyGyorgyDevportal/~4/QQhlhkGK_z4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://balassygyorgy.wordpress.com/2013/04/01/rejtett-reploszimultor-a-windows-8-ban/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/e46495cefe8761794595b7f2323f5ffe?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">balassygyorgy</media:title>
		</media:content>

		<media:content url="http://balassygyorgy.files.wordpress.com/2013/04/excel-97-flight-simulator_thumb.jpg" medium="image">
			<media:title type="html">excel-97-flight-simulator</media:title>
		</media:content>

		<media:content url="http://balassygyorgy.files.wordpress.com/2013/04/flight-simulator-tablet_thumb.png" medium="image">
			<media:title type="html">flight-simulator-tablet</media:title>
		</media:content>
	<feedburner:origLink>http://balassygyorgy.wordpress.com/2013/04/01/rejtett-reploszimultor-a-windows-8-ban/</feedburner:origLink></item>
		<item>
		<title>Forráskód source control mentesítése</title>
		<link>http://feedproxy.google.com/~r/BalassyGyorgyDevportal/~3/rwdEGI4i4GU/</link>
		<comments>http://balassygyorgy.wordpress.com/2013/03/31/forraskod-source-control-mentesitese/#comments</comments>
		<pubDate>Sun, 31 Mar 2013 05:22:49 +0000</pubDate>
		<dc:creator>Balássy György</dc:creator>
				<category><![CDATA[.NET 4.5 és Visual Studio 2012]]></category>
		<category><![CDATA[CodePlex]]></category>
		<category><![CDATA[TFS]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">https://balassygyorgy.wordpress.com/?p=2317</guid>
		<description><![CDATA[Van úgy, hogy az ember egy source controlhoz (pl. TFS-hez) kapcsolt projektet source control nélkül szeretne megnyitni. Akár például azért, mert meg kellene osztani valakivel a kódot, aki nem fér hozzá a forráskódkezelő szerverünkhöz, vagy egyszerűen épp úgy akarunk garázdálkodni a kódban, hogy a source control kapcsolat csak zavarna. Persze a Studioban van Unbind lehetőség, [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=balassygyorgy.wordpress.com&#038;blog=16172306&#038;post=2317&#038;subd=balassygyorgy&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Van úgy, hogy az ember egy source controlhoz (pl. TFS-hez) kapcsolt projektet source control nélkül szeretne megnyitni. Akár például azért, mert meg kellene osztani valakivel a kódot, aki nem fér hozzá a forráskódkezelő szerverünkhöz, vagy egyszerűen épp úgy akarunk garázdálkodni a kódban, hogy a source control kapcsolat csak zavarna. Persze a Studioban van Unbind lehetőség, de ahhoz, hogy odáig eljussunk, át kell verekednünk magunkat számos furcsa hibaüzeneten. </p>
<p>Én ilyenkor eddig mindig azt csináltam, hogy letöröltem a .vssscc és a .vspscc fájlokat, majd töröltem az Scc-vel kezdődő sorokat a projekt fájlokból, és csak ezek után nyitottam meg a projektet. Ez működő megoldás, de sok projekt esetén fájdalmas. Ezért is örültem nagyon, amikor <a href="http://www.msdnkk.hu/Users/kovacsf" target="_blank">Kovács Ferenc</a> barátom figyelmembe ajánlotta a CodePlexen elérhető <a href="http://vsunbindsourcecc.codeplex.com/" target="_blank">VS Unbind Source Control</a> nevű eszközt, amivel mindezt egy csapásra elvégezhetjük parancssorból:</p>
<pre>  VSUnbindSourceControl.exe W:\MyFolder</pre>
<p>&#160;</p>
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:719d4404-576a-4dfc-9247-a0c4a7ac1ba4" class="wlWriterEditableSmartContent" style="float:none;margin:0;display:inline;padding:0;">Technorati-címkék: <a href="http://technorati.com/tags/Visual+Studio" rel="tag">Visual Studio</a>,<a href="http://technorati.com/tags/TFS" rel="tag">TFS</a>,<a href="http://technorati.com/tags/source+control" rel="tag">source control</a>,<a href="http://technorati.com/tags/CodePlex" rel="tag">CodePlex</a></div>
<br />Kategória:<a href='http://balassygyorgy.wordpress.com/category/net-4-5-es-visual-studio-2012/'>.NET 4.5 és Visual Studio 2012</a> Tagged: <a href='http://balassygyorgy.wordpress.com/tag/codeplex/'>CodePlex</a>, <a href='http://balassygyorgy.wordpress.com/tag/tfs/'>TFS</a>, <a href='http://balassygyorgy.wordpress.com/tag/visual-studio/'>Visual Studio</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/balassygyorgy.wordpress.com/2317/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/balassygyorgy.wordpress.com/2317/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=balassygyorgy.wordpress.com&#038;blog=16172306&#038;post=2317&#038;subd=balassygyorgy&#038;ref=&#038;feed=1" width="1" height="1" /><img src="http://feeds.feedburner.com/~r/BalassyGyorgyDevportal/~4/rwdEGI4i4GU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://balassygyorgy.wordpress.com/2013/03/31/forraskod-source-control-mentesitese/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/e46495cefe8761794595b7f2323f5ffe?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">balassygyorgy</media:title>
		</media:content>
	<feedburner:origLink>http://balassygyorgy.wordpress.com/2013/03/31/forraskod-source-control-mentesitese/</feedburner:origLink></item>
	</channel>
</rss>
