<?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.dt.ee/~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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>DT blogi</title>
	
	<link>http://www.dt.ee/blog</link>
	<description>Tarkvara. Veeb. Mobiil. Multimeedia. Tehnoloogia</description>
	<pubDate>Thu, 17 May 2012 10:37:34 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.dt.ee/dtblogi" /><feedburner:info uri="dtblogi" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><image><link>http://www.dt.ee/</link><url>http://www.developers-team.com/images/logo_DT_70x100.gif</url><title>Developers Team</title></image><feedburner:emailServiceId>dtblogi</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.dt.ee%2Fdtblogi" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.dt.ee%2Fdtblogi" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.dt.ee%2Fdtblogi" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.dt.ee/dtblogi" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.dt.ee%2Fdtblogi" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.dt.ee%2Fdtblogi" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.dt.ee%2Fdtblogi" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:browserFriendly>Hei! DT blogi tellimiseks: 1) vali paremalt oma lemmik-RSS-lugeja või 2) kopeeri selle lehekülje aadress oma RSS-lugejasse. E-postiga tellimiseks klikka ümbriku ikooniga linki. Voila! -- maailma parim eestikeelne IT-blogi on nüüd Sinuga.</feedburner:browserFriendly><item>
		<title>Task Parallel Library ja PLINQ aktsioonis</title>
		<link>http://feeds.dt.ee/~r/dtblogi/~3/VfAztOCjQZA/</link>
		<comments>http://www.dt.ee/blog/kood/net/2012/05/task-parallel-library-ja-plinq-aktsioonis/#comments</comments>
		<pubDate>Thu, 17 May 2012 10:37:34 +0000</pubDate>
		<dc:creator>Gunnar</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://www.dt.ee/blog/?p=4665</guid>
		<description><![CDATA[Paralleelarvutus on pühat eesmärki täitev asi – hoiame oma niigi voolu õgivad protsessorid ja arvutustuumad maksimaalselt midagi asjalikku tegemas. Teen selle kohta ühe näite, mis aitab paremini mõista, kuidas .NET raamistikus tänaste vahenditega paralleelarvutus käib. Ühtlasi mõõdame oma tulemusi ja katsed viime läbi reaalelulise koodi peal. 
.NET raamistikus on kaks vahendit paralleelarvutuse jaoks:

Task Parallel Library [...]]]></description>
			<content:encoded><![CDATA[<p>Paralleelarvutus on pühat eesmärki täitev asi – hoiame oma niigi voolu õgivad protsessorid ja arvutustuumad maksimaalselt midagi asjalikku tegemas. Teen selle kohta ühe näite, mis aitab paremini mõista, kuidas .NET raamistikus tänaste vahenditega paralleelarvutus käib. Ühtlasi mõõdame oma tulemusi ja katsed viime läbi reaalelulise koodi peal. </p>
<p>.NET raamistikus on kaks vahendit paralleelarvutuse jaoks:</p>
<ul>
<li><a href="http://msdn.microsoft.com/en-us/library/dd460717.aspx">Task Parallel Library (TPL)</a> </li>
<li><a href="http://msdn.microsoft.com/en-us/library/dd460688.aspx">PLINQ</a> </li>
</ul>
<p>TPL on võimas raamistik, mis muudab paralleelarvutuse meie jaoks palju lihtsamaks ja koodi paremini mõistetavaks. PLINQ toob LINQ peale võimaluse töödelda andmeid paralleelselt. Seega võime öelda, et TPL on ülesannete põhine ja PLINQ on andmepõhine paralleelarvutus.</p>
<h3>RSS-agregaator ja selle mõõtmine</h3>
<p>Meie näite südamikuks on RSS-agregaator, mis loeb andmebaasist sisse blogide loendi, tuvastab nende RSS-i aadressid ning loeb sisse viimased postitused. Positused, mida veel andmebaasis pole, lisatakse sinna ära.</p>
<div class="syntax_hilite">
<div id="csharp-4">
<div class="csharp"><span style="color: #0600FF;">internal</span> <span style="color: #FF0000;">class</span> FeedClient<br />
<span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">private</span> <span style="color: #0600FF;">readonly</span> INewsService _newsService;<br />
&nbsp; &nbsp; <span style="color: #0600FF;">private</span> <span style="color: #0600FF;">const</span> <span style="color: #FF0000;">int</span> FeedItemContentMaxLength = <span style="color: #FF0000;">255</span>;</p>
<p>&nbsp; &nbsp; <span style="color: #0600FF;">public</span> FeedClient<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; ObjectFactory.<span style="color: #000000;">Initialize</span><span style="color: #000000;">&#40;</span>container =&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; container.<span style="color: #000000;">PullConfigurationFromAppConfig</span> = <span style="color: #0600FF;">true</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; _newsService = ObjectFactory.<span style="color: #000000;">GetInstance</span>&lt;INewsService&gt;<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span></p>
<p>&nbsp; &nbsp; <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> Execute<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; var blogs = _newsService.<span style="color: #000000;">ListPublishedBlogs</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">for</span> <span style="color: #000000;">&#40;</span>var index = <span style="color: #FF0000;">0</span>; index &lt;blogs.<span style="color: #000000;">Count</span>; index++<span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ImportFeed<span style="color: #000000;">&#40;</span>blogs<span style="color: #000000;">&#91;</span>index<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span></p>
<p>&nbsp; &nbsp; <span style="color: #0600FF;">private</span> <span style="color: #0600FF;">void</span> ImportFeed<span style="color: #000000;">&#40;</span>BlogDto blog<span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>blog == <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">return</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span>.<span style="color: #000000;">IsNullOrEmpty</span><span style="color: #000000;">&#40;</span>blog.<span style="color: #000000;">RssUrl</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">return</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; var uri = <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> Uri<span style="color: #000000;">&#40;</span>blog.<span style="color: #000000;">RssUrl</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; SyndicationContentFormat feedFormat;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; feedFormat = SyndicationDiscoveryUtility.<span style="color: #000000;">SyndicationContentFormatGet</span><span style="color: #000000;">&#40;</span>uri<span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>feedFormat == SyndicationContentFormat.<span style="color: #000000;">Rss</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ImportRssFeed<span style="color: #000000;">&#40;</span>blog<span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>feedFormat == SyndicationContentFormat.<span style="color: #000000;">Atom</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ImportAtomFeed<span style="color: #000000;">&#40;</span>blog<span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span></p>
<p>&nbsp; &nbsp; <span style="color: #0600FF;">private</span> <span style="color: #0600FF;">void</span> ImportRssFeed<span style="color: #000000;">&#40;</span>BlogDto blog<span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; var uri = <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> Uri<span style="color: #000000;">&#40;</span>blog.<span style="color: #000000;">RssUrl</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; var feed = RssFeed.<span style="color: #000000;">Create</span><span style="color: #000000;">&#40;</span>uri<span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>var item <span style="color: #0600FF;">in</span> feed.<span style="color: #000000;">Channel</span>.<span style="color: #000000;">Items</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SaveRssFeedItem<span style="color: #000000;">&#40;</span>item, blog.<span style="color: #000000;">Id</span>, blog.<span style="color: #000000;">CreatedById</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">private</span> <span style="color: #0600FF;">void</span> ImportAtomFeed<span style="color: #000000;">&#40;</span>BlogDto blog<span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; var uri = <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> Uri<span style="color: #000000;">&#40;</span>blog.<span style="color: #000000;">RssUrl</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; var feed = AtomFeed.<span style="color: #000000;">Create</span><span style="color: #000000;">&#40;</span>uri<span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>var item <span style="color: #0600FF;">in</span> feed.<span style="color: #000000;">Entries</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SaveAtomFeedEntry<span style="color: #000000;">&#40;</span>item, blog.<span style="color: #000000;">Id</span>, blog.<span style="color: #000000;">CreatedById</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
<span style="color: #000000;">&#125;</span></div>
</div>
</div>
<p></p>
<p>Mõõtmiseks kasutame sellist vahendit nagu <a href="http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx">Stopwatch klass</a>. Programmi alguses lööme kella käima ja kui programm lõpetab, paneme kella seisma.<br />
<h3>Seriaalne agregeerimine</h3>
<p>Esiteks mõõdame ära tulemused, mida annab eeltoodud kood. Seal tehakse kõik sammud järjest ja korraga midagi käima ei lasta. See tähendab seda, et kõik RSS-id laetakse alla üksteise järel ja nende sisu salvestatakse andmebaasi samuti üks postitus korraga.</p>
<p>Mõõtmisel saame tulemuseks <strong>25.46</strong> sekundit.</p>
<h3>Task parallelism</h3>
<p>Meie esimene analüüsiülesanne on leida üles punkt, kus me saaksime eraldada muust koodist sõltumatud osad. Need osad koodist võime me käima lasta paralleelselt (me võime ka sõltuvustega osi paralleelselt käivitada, kuid see on oluliselt keerukam ja riskantsem tegevus). Meie juhul on selleks kohaks, kus võiksime kaaluda paralleeltöötlust, näiteks RSS-ide lugemine ja andmebaasi sisestamine.</p>
<div class="syntax_hilite">
<div id="csharp-5">
<div class="csharp"><span style="color: #0600FF;">internal</span> <span style="color: #FF0000;">class</span> FeedClient<br />
<span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">private</span> <span style="color: #0600FF;">readonly</span> INewsService _newsService;<br />
&nbsp; &nbsp; <span style="color: #0600FF;">private</span> <span style="color: #0600FF;">const</span> <span style="color: #FF0000;">int</span> FeedItemContentMaxLength = <span style="color: #FF0000;">255</span>;</p>
<p>&nbsp; &nbsp; <span style="color: #0600FF;">public</span> FeedClient<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; ObjectFactory.<span style="color: #000000;">Initialize</span><span style="color: #000000;">&#40;</span>container =&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; container.<span style="color: #000000;">PullConfigurationFromAppConfig</span> = <span style="color: #0600FF;">true</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; _newsService = ObjectFactory.<span style="color: #000000;">GetInstance</span>&lt;INewsService&gt;<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span></p>
<p>&nbsp; &nbsp; <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> Execute<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; var blogs = _newsService.<span style="color: #000000;">ListPublishedBlogs</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; var tasks = <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> Task<span style="color: #000000;">&#91;</span>blogs.<span style="color: #000000;">Count</span><span style="color: #000000;">&#93;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">for</span> <span style="color: #000000;">&#40;</span>var index = <span style="color: #FF0000;">0</span>; index &lt;blogs.<span style="color: #000000;">Count</span>; index++<span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tasks<span style="color: #000000;">&#91;</span>index<span style="color: #000000;">&#93;</span> = <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> Task<span style="color: #000000;">&#40;</span>ImportFeed, blogs<span style="color: #000000;">&#91;</span>index<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tasks<span style="color: #000000;">&#91;</span>index<span style="color: #000000;">&#93;</span>.<span style="color: #000000;">Start</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; Task.<span style="color: #000000;">WaitAll</span><span style="color: #000000;">&#40;</span>tasks<span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">private</span> <span style="color: #0600FF;">void</span> ImportFeed<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">object</span> blogObject<span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>blog == <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">return</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; var blog = <span style="color: #000000;">&#40;</span>BlogDto<span style="color: #000000;">&#41;</span>blogObject;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span>.<span style="color: #000000;">IsNullOrEmpty</span><span style="color: #000000;">&#40;</span>blog.<span style="color: #000000;">RssUrl</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">return</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; var uri = <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> Uri<span style="color: #000000;">&#40;</span>blog.<span style="color: #000000;">RssUrl</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; SyndicationContentFormat feedFormat;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; feedFormat = SyndicationDiscoveryUtility.<span style="color: #000000;">SyndicationContentFormatGet</span><span style="color: #000000;">&#40;</span>uri<span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>feedFormat == SyndicationContentFormat.<span style="color: #000000;">Rss</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ImportRssFeed<span style="color: #000000;">&#40;</span>blog<span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>feedFormat == SyndicationContentFormat.<span style="color: #000000;">Atom</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ImportAtomFeed<span style="color: #000000;">&#40;</span>blog<span style="color: #000000;">&#41;</span>;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span></p>
<p>&nbsp; &nbsp; <span style="color: #0600FF;">private</span> <span style="color: #0600FF;">void</span> ImportRssFeed<span style="color: #000000;">&#40;</span>BlogDto blog<span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; var uri = <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> Uri<span style="color: #000000;">&#40;</span>blog.<span style="color: #000000;">RssUrl</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; var feed = RssFeed.<span style="color: #000000;">Create</span><span style="color: #000000;">&#40;</span>uri<span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>var item <span style="color: #0600FF;">in</span> feed.<span style="color: #000000;">Channel</span>.<span style="color: #000000;">Items</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SaveRssFeedItem<span style="color: #000000;">&#40;</span>item, blog.<span style="color: #000000;">Id</span>, blog.<span style="color: #000000;">CreatedById</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">private</span> <span style="color: #0600FF;">void</span> ImportAtomFeed<span style="color: #000000;">&#40;</span>BlogDto blog<span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; var uri = <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> Uri<span style="color: #000000;">&#40;</span>blog.<span style="color: #000000;">RssUrl</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; var feed = AtomFeed.<span style="color: #000000;">Create</span><span style="color: #000000;">&#40;</span>uri<span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>var item <span style="color: #0600FF;">in</span> feed.<span style="color: #000000;">Entries</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SaveAtomFeedEntry<span style="color: #000000;">&#40;</span>item, blog.<span style="color: #000000;">Id</span>, blog.<span style="color: #000000;">CreatedById</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
<span style="color: #000000;">&#125;</span></div>
</div>
</div>
<p></p>
<p>Muudatused, mis me tegime, on lihtsad – me defineerisime RSS-ide importimiseks eraldi ülesanded ja lasime need paralleelselt käima. Seejärel jäime ootama, millal kõik ülesanded on tehtud.
<p>Kui aega mõõdame, siis saame tulemuseks <strong>17.57</strong> sekundit.</p>
<h3>Data parallelism</h3>
<p>Järgmiseks vaatame, kas meil on veel kohti, kus võime korraga mitut asja teha. Nagu tellitult vaatab meile vastu RSS-ist loetud postituste loend. Kuna postituste sisestamine andmebaasi on tehtav isolatsioonis (me ei kasuta teiste postituste andmeid), siis proovime, mis juhtub, kui laseme postitused andmebaasi sisestada paralleelselt.</p>
<div class="syntax_hilite">
<div id="csharp-6">
<div class="csharp"><span style="color: #0600FF;">internal</span> <span style="color: #FF0000;">class</span> FeedClient<br />
<span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">private</span> <span style="color: #0600FF;">readonly</span> INewsService _newsService;<br />
&nbsp; &nbsp; <span style="color: #0600FF;">private</span> <span style="color: #0600FF;">const</span> <span style="color: #FF0000;">int</span> FeedItemContentMaxLength = <span style="color: #FF0000;">255</span>;</p>
<p>&nbsp; &nbsp; <span style="color: #0600FF;">public</span> FeedClient<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; ObjectFactory.<span style="color: #000000;">Initialize</span><span style="color: #000000;">&#40;</span>container =&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; container.<span style="color: #000000;">PullConfigurationFromAppConfig</span> = <span style="color: #0600FF;">true</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; _newsService = ObjectFactory.<span style="color: #000000;">GetInstance</span>&lt;INewsService&gt;<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span></p>
<p>&nbsp; &nbsp; <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> Execute<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; var blogs = _newsService.<span style="color: #000000;">ListPublishedBlogs</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; var tasks = <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> Task<span style="color: #000000;">&#91;</span>blogs.<span style="color: #000000;">Count</span><span style="color: #000000;">&#93;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">for</span> <span style="color: #000000;">&#40;</span>var index = <span style="color: #FF0000;">0</span>; index &lt;blogs.<span style="color: #000000;">Count</span>; index++<span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tasks<span style="color: #000000;">&#91;</span>index<span style="color: #000000;">&#93;</span> = <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> Task<span style="color: #000000;">&#40;</span>ImportFeed, blogs<span style="color: #000000;">&#91;</span>index<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tasks<span style="color: #000000;">&#91;</span>index<span style="color: #000000;">&#93;</span>.<span style="color: #000000;">Start</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; Task.<span style="color: #000000;">WaitAll</span><span style="color: #000000;">&#40;</span>tasks<span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">private</span> <span style="color: #0600FF;">void</span> ImportFeed<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">object</span> blogObject<span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>blog == <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">return</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; var blog = <span style="color: #000000;">&#40;</span>BlogDto<span style="color: #000000;">&#41;</span>blogObject;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span>.<span style="color: #000000;">IsNullOrEmpty</span><span style="color: #000000;">&#40;</span>blog.<span style="color: #000000;">RssUrl</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">return</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; var uri = <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> Uri<span style="color: #000000;">&#40;</span>blog.<span style="color: #000000;">RssUrl</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; SyndicationContentFormat feedFormat;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; feedFormat = SyndicationDiscoveryUtility.<span style="color: #000000;">SyndicationContentFormatGet</span><span style="color: #000000;">&#40;</span>uri<span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>feedFormat == SyndicationContentFormat.<span style="color: #000000;">Rss</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ImportRssFeed<span style="color: #000000;">&#40;</span>blog<span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>feedFormat == SyndicationContentFormat.<span style="color: #000000;">Atom</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ImportAtomFeed<span style="color: #000000;">&#40;</span>blog<span style="color: #000000;">&#41;</span>;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span></p>
<p>&nbsp; &nbsp; <span style="color: #0600FF;">private</span> <span style="color: #0600FF;">void</span> ImportRssFeed<span style="color: #000000;">&#40;</span>BlogDto blog<span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; var uri = <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> Uri<span style="color: #000000;">&#40;</span>blog.<span style="color: #000000;">RssUrl</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; var feed = RssFeed.<span style="color: #000000;">Create</span><span style="color: #000000;">&#40;</span>uri<span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; feed.<span style="color: #000000;">Channel</span>.<span style="color: #000000;">Items</span>.<span style="color: #000000;">AsParallel</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #000000;">ForAll</span><span style="color: #000000;">&#40;</span>a =&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SaveRssFeedItem<span style="color: #000000;">&#40;</span>a, blog.<span style="color: #000000;">Id</span>, blog.<span style="color: #000000;">CreatedById</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">private</span> <span style="color: #0600FF;">void</span> ImportAtomFeed<span style="color: #000000;">&#40;</span>BlogDto blog<span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; var uri = <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> Uri<span style="color: #000000;">&#40;</span>blog.<span style="color: #000000;">RssUrl</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; var feed = AtomFeed.<span style="color: #000000;">Create</span><span style="color: #000000;">&#40;</span>uri<span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; feed.<span style="color: #000000;">Entries</span>.<span style="color: #000000;">AsParallel</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #000000;">ForAll</span><span style="color: #000000;">&#40;</span>a =&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SaveAtomFeedEntry<span style="color: #000000;">&#40;</span>a, blog.<span style="color: #000000;">Id</span>, blog.<span style="color: #000000;">CreatedById</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
<span style="color: #000000;">&#125;</span></div>
</div>
</div>
<p></p>
<p>Siin kasutasime TPL asemel PLINQ, sest selle abil on meil mugavam lasta andmete peal operatsioone tööle.</p>
<p>Tulemuseks saame <strong>11.22</strong> sekundit.</p>
<h3>Tulemused</h3>
<p>Kui tulemused graafikule toome, samme sellise graafiku.</p>
<p align="center"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Serial, TPL, PLINQ" border="0" alt="Serial, TPL, PLINQ" src="http://www.dt.ee/blog/wp-content/uploads/2012/05/eneta-feedaggregator-parallel-thumb.png" width="481" height="289" /></p>
<p>Näeme, et RSS-ide allalaadimine paralleelselt annab meile umbes poolteist korda võitu. Kui andmete uuendamise ka paralleelseks muudame saame võrreldes algsega 2.3 kordse võidu. </p>
<h3>Kokkuvõte</h3>
<p>Me alustasime tavalise lihtsa koodiga, mis tegi kõike samme järjest. Esimese muudatusena viisime me paralleelsele kujule andmete allalaadimise ja uuendamise. Andmete uuendamine jäi seejuures ikkagi järjestikuseks. Seejärel viisime ka andmete uuendamise paralleelsele kujule ja saime veel võitu. Meil läks seekord hästi, sest erinevate <em>thread</em>-ide peal jooksev kood ei vajanud midagi, mis sealt välja jääks. </p>
<p>Kui oma lähtekoodi hoolikalt analüüsida, siis võib tihti leida kohti, kus paralleeltöötlus võib rakenduse jõudlust tõsta. Oluline on need kohad tuvastada ja mõõta ära, kas paralleelsus annab midagi juurde või ei.</p>
<p><br /><strong>Loe lisaks</strong><ul><li><a href="http://www.dt.ee/blog/kood/net/2010/01/vordleme-linq-ja-plinq-joudlust/" rel="bookmark" title="Võrdleme LINQ ja PLINQ jõudlust">Võrdleme LINQ ja PLINQ jõudlust</a></li><li><a href="http://www.dt.ee/blog/www/joomla-cms/2007/08/joomla-joomfish-probleem/" rel="bookmark" title="Joomla! 1.0.13 ja Joom!Fish probleem">Joomla! 1.0.13 ja Joom!Fish probleem</a></li><li><a href="http://www.dt.ee/blog/kood/net/2008/03/visual-studio-task-list/" rel="bookmark" title="Visual Studio Task List">Visual Studio Task List</a></li><li><a href="http://www.dt.ee/blog/kood/net/2008/04/kuidas-vigu-mitte-kasitleda-vigade-mahasurumine/" rel="bookmark" title="Kuidas vigu mitte käsitleda - vigade mahasurumine">Kuidas vigu mitte käsitleda - vigade mahasurumine</a></li><li><a href="http://www.dt.ee/blog/kood/net/2009/05/visual-studio-2010-net-framework-4-betad/" rel="bookmark" title="Visual Studio 2010 ja .Net Framework 4.0 betad">Visual Studio 2010 ja .Net Framework 4.0 betad</a></li></ul></p><br /><div class="feedflare">
<a href="http://feeds.dt.ee/~ff/dtblogi?a=VfAztOCjQZA:GxhpKw8WlgU:CrAVEhbAS04"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=CrAVEhbAS04" border="0"></img></a> <a href="http://feeds.dt.ee/~ff/dtblogi?a=VfAztOCjQZA:GxhpKw8WlgU:lvXyGxTQzqQ"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=lvXyGxTQzqQ" border="0"></img></a> <a href="http://feeds.dt.ee/~ff/dtblogi?a=VfAztOCjQZA:GxhpKw8WlgU:jyDof3Xhdmw"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=jyDof3Xhdmw" border="0"></img></a> <a href="http://feeds.dt.ee/~ff/dtblogi?a=VfAztOCjQZA:GxhpKw8WlgU:1mQ1z0kQkz4"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=1mQ1z0kQkz4" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/dtblogi/~4/VfAztOCjQZA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dt.ee/blog/kood/net/2012/05/task-parallel-library-ja-plinq-aktsioonis/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.dt.ee/blog/kood/net/2012/05/task-parallel-library-ja-plinq-aktsioonis/</feedburner:origLink></item>
		<item>
		<title>Kuidas alustada node.js arendust</title>
		<link>http://feeds.dt.ee/~r/dtblogi/~3/dGlJK_oG5Tc/</link>
		<comments>http://www.dt.ee/blog/kood/2012/05/kuidas-alustada-nodejs-arendust/#comments</comments>
		<pubDate>Tue, 15 May 2012 06:38:51 +0000</pubDate>
		<dc:creator>Gunnar</dc:creator>
		
		<category><![CDATA[Kood]]></category>

		<category><![CDATA[Tarkvara]]></category>

		<guid isPermaLink="false">http://www.dt.ee/blog/?p=4661</guid>
		<description><![CDATA[Node.js on Chrome nimelise brauseri JavaScripti mootoril põhinev õhuke platvorm, mille otstarbeks on skaleeritavate võrgurakenduste jooksutamine. Ümar definitsioon küll, kuid kui node.js olemusse süveneme, siis näeme, et selle abil lahendab ära päris palju probleeme. 
Mis on node.js?
Oma sisemuses toimib node.js lihtsasti. Me kirjutame valmis skripti, mis töötleb HTTP-pöördumisi ning saadab neile välja vastuseid. Veebiserver, mis [...]]]></description>
			<content:encoded><![CDATA[<p><img style="background-image: none; border-right-width: 0px; margin: 0px 0px 0px 10px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="node.js" border="0" alt="node.js" align="right" src="http://www.dt.ee/blog/wp-content/uploads/2012/05/nodejs-logo.png" width="207" height="72" /><a href="http://nodejs.org/">Node.js</a> on Chrome nimelise brauseri JavaScripti mootoril põhinev õhuke platvorm, mille otstarbeks on skaleeritavate võrgurakenduste jooksutamine. Ümar definitsioon küll, kuid kui node.js olemusse süveneme, siis näeme, et selle abil lahendab ära päris palju probleeme. </p>
<h3>Mis on node.js?</h3>
<p>Oma sisemuses toimib node.js lihtsasti. Me kirjutame valmis skripti, mis töötleb HTTP-pöördumisi ning saadab neile välja vastuseid. Veebiserver, mis node.js koosseisu kuulub, on äärmiselt lakooniline ja väike. Iga pöördumine töödeldakse ära erineva <em>thread</em>-i peal ja see tähendab võimet vastata korraga suurele arvule pöördumistele. Pöördumised on õhukesed ja jätavad maksimaalselt ruumile tööle, mis nende raames peab juhtuma.</p>
<h3>Kuidas node.js käima saada?</h3>
<p>node.js saamiseks tuleb minna <a href="http://nodejs.org/">node.js kodukale</a> ja see allalaadida. Installer on mõned megad suur ja mingiks suuremaks installiks ja konfimiseks pole seega vaja valmistuda. Failid paigaldatakse kataloogi </p>
<p>C:\Program Files\nodejs</p>
<p>Seal asub ka node.exe, mis on siis protsess, mille all skriptid jooksevad.</p>
<h3>Laiendused ja arendus</h3>
<p>Kuigi node.js jaoks tuleb juba installeriga terve hulk laiendusi, saab neid iseseisvalt juurde laadida <a href="http://search.npmjs.org/">node.js laienduste hoidlast</a>. Laiendusi saab allalaadida ka käsurealt töötava klientrakenduse abil. Kellel huvi, siis vaadaku <a href="http://search.npmjs.org/#/_browse/all">olemasolevate laienduste nimekirja</a>.</p>
<p>Päris hea ülevaate node.js kasutamisest annab Patterns &amp; Practices Symposium Online 2012 raames Yavor Georgievi poolt antud loeng “node.js on Azure”.</p>
<p align="center"><iframe style="width: 480px; height: 272px" src="http://channel9.msdn.com/Events/Patterns-Practices-Symposium-Online/Patterns-Practices-Symposium-Online-2012/node-js-on-Azure/player?w=480&amp;h=272" frameborder="0" scrolling="no"></iframe></p>
<p>Ma arvan, et otste lahti tegemiseks on nüüd piisav info koos ja selleks, et </p>
<h3>Näiterakendus</h3>
<p>Et Node.js pole ressurside osas nõudlik, sobib see ideaalselt näiteks lihtsate HTTP-põhiste rakenduste jaoks, mis jooksevad eraldi <em>thread</em>-ide peal. Kuigi node.js peal saab teha palju muud tarka ja kasulikku, toon ma näitena välja lihtsa skripti, mis kuvab pöördumiste vastuseks pilte veebiserveri juurkataloogist. </p>
<p>Viimistlemata kood, mida mu pisike server kasutab, näeb välja selline:</p>
<div class="syntax_hilite">
<div id="javascript-8">
<div class="javascript"><span style="color: #003366; font-weight: bold;">var</span> sys = require<span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">"sys"</span><span style="color: #66cc66;">&#41;</span>,&nbsp; <br />
&nbsp; &nbsp; http = require<span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">"http"</span><span style="color: #66cc66;">&#41;</span>,&nbsp; <br />
&nbsp; &nbsp; url = require<span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">"url"</span><span style="color: #66cc66;">&#41;</span>,&nbsp; <br />
&nbsp; &nbsp; path = require<span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">"path"</span><span style="color: #66cc66;">&#41;</span>,&nbsp; <br />
&nbsp; &nbsp; fs = require<span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">"fs"</span><span style="color: #66cc66;">&#41;</span>;&nbsp; </p>
<p>
http.<span style="color: #006600;">createServer</span><span style="color: #66cc66;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #66cc66;">&#40;</span>request, response<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; <span style="color: #003366; font-weight: bold;">var</span> uri = url.<span style="color: #006600;">parse</span><span style="color: #66cc66;">&#40;</span>request.<span style="color: #006600;">url</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">pathname</span>;&nbsp; <br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> filename = path.<span style="color: #006600;">join</span><span style="color: #66cc66;">&#40;</span>process.<span style="color: #006600;">cwd</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>, uri<span style="color: #66cc66;">&#41;</span>;&nbsp; <br />
&nbsp; &nbsp; path.<span style="color: #006600;">exists</span><span style="color: #66cc66;">&#40;</span>filename, <span style="color: #003366; font-weight: bold;">function</span><span style="color: #66cc66;">&#40;</span>exists<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>&nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span><span style="color: #66cc66;">&#40;</span>!exists<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>&nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; response.<span style="color: #006600;">writeHead</span><span style="color: #66cc66;">&#40;</span><span style="color: #CC0000;">404</span>, <span style="color: #66cc66;">&#123;</span><span style="color: #3366CC;">"Content-Type"</span>: <span style="color: #3366CC;">"text/plain"</span><span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>;&nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; response.<span style="color: #000066; font-weight: bold;">write</span><span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">"404 Not Found<span style="color: #000099; font-weight: bold;">\n</span>"</span><span style="color: #66cc66;">&#41;</span>;&nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; response.<span style="color: #006600;">end</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;&nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span>;&nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span>&nbsp; </p>
<p>&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span><span style="color: #66cc66;">&#40;</span>path.<span style="color: #006600;">extname</span><span style="color: #66cc66;">&#40;</span>filename<span style="color: #66cc66;">&#41;</span> != <span style="color: #3366CC;">'.jpg'</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; response.<span style="color: #006600;">writeHead</span><span style="color: #66cc66;">&#40;</span><span style="color: #CC0000;">500</span>, <span style="color: #66cc66;">&#123;</span><span style="color: #3366CC;">"Content-Type"</span>: <span style="color: #3366CC;">"text/plain"</span><span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>;&nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; response.<span style="color: #000066; font-weight: bold;">write</span><span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">"Forbidden extension!<span style="color: #000099; font-weight: bold;">\n</span>"</span><span style="color: #66cc66;">&#41;</span>;&nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; response.<span style="color: #006600;">end</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;&nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span>;&nbsp; <br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; fs.<span style="color: #006600;">readFile</span><span style="color: #66cc66;">&#40;</span>filename, <span style="color: #3366CC;">"binary"</span>, <span style="color: #003366; font-weight: bold;">function</span><span style="color: #66cc66;">&#40;</span>err, file<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>&nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span><span style="color: #66cc66;">&#40;</span>err<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>&nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; response.<span style="color: #006600;">writeHead</span><span style="color: #66cc66;">&#40;</span><span style="color: #CC0000;">500</span>, <span style="color: #66cc66;">&#123;</span><span style="color: #3366CC;">"Content-Type"</span>: <span style="color: #3366CC;">"text/plain"</span><span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>;&nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; response.<span style="color: #000066; font-weight: bold;">write</span><span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">"error: "</span> + err + <span style="color: #3366CC;">"<span style="color: #000099; font-weight: bold;">\n</span>"</span><span style="color: #66cc66;">&#41;</span>;&nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; response.<span style="color: #006600;">end</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;&nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span>;&nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span>&nbsp; <br />
&nbsp; <br />
&nbsp; &nbsp;&nbsp; &nbsp; &nbsp;response.<span style="color: #006600;">writeHead</span><span style="color: #66cc66;">&#40;</span><span style="color: #CC0000;">200</span>, <span style="color: #66cc66;">&#123;</span><span style="color: #3366CC;">"Content-Type"</span>: <span style="color: #3366CC;">"image/jpeg"</span><span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>;&nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; response.<span style="color: #000066; font-weight: bold;">write</span><span style="color: #66cc66;">&#40;</span>file, <span style="color: #3366CC;">"binary"</span><span style="color: #66cc66;">&#41;</span>;&nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; response.<span style="color: #006600;">end</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;&nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>;&nbsp; <br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>;&nbsp; </p>
<p><span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">listen</span><span style="color: #66cc66;">&#40;</span><span style="color: #CC0000;">8124</span><span style="color: #66cc66;">&#41;</span>;</p>
<p>console.<span style="color: #006600;">log</span><span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">'Server running at http://127.0.0.1:8124/'</span><span style="color: #66cc66;">&#41;</span>;</div>
</div>
</div>
<p></p>
<p>Selle koodi käivitan käsurealt käsuga node.exe test.js. Järgmiseks ühendan ennast brauseriga aadressile http://localhost:8124/ ja küsin faili nimega something.txt. Tulemus, nagu oodata, on selline:</p>
<p align="center"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="nodejs-something" border="0" alt="nodejs-something" src="http://www.dt.ee/blog/wp-content/uploads/2012/05/nodejs-something.png" width="540" height="284" /></p>
<p>Kui aga küsin rabbit.jpg, siis saan sellise tulemuse:</p>
<p align="center"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="node.js: küsisime lubatud faili" border="0" alt="node.js: küsisime lubatud faili" src="http://www.dt.ee/blog/wp-content/uploads/2012/05/nodejs-rabbit.png" width="540" height="284" /></p>
<h3>Lõpetuseks</h3>
<p>node.js peale saab ehitada erinevaid rakendusi ja saadaval on lausa veebiraamistikud, mille abil saab node.js peale kirjutada MVC-mustrit järgivaid veebirakendusi, kuid peamiselt on node.js eesmärk siiski pakkuda serveripoolset punkti, kus mingeid toiminguid kiiresti ja eriliste ressursikuludeta toime pannakse. Muide, node.js töötab ka Windows Azure peal ja ka Microsoft panustab sellesse, et node.js oleks tulevikus paremini toetatud nii Visual Studio kui ka Windows Azure peal.</p>
<p><br /><strong>Loe lisaks</strong><ul><li><a href="http://www.dt.ee/blog/tehnoloogia/2008/03/pisikeste-inimeste-suured-ideed/" rel="bookmark" title="Pisikeste inimeste suured ideed">Pisikeste inimeste suured ideed</a></li><li><a href="http://www.dt.ee/blog/blogimine/2007/03/3-soovitust-kuidas-luua-edukas-blogi/" rel="bookmark" title="3 soovitust, kuidas luua edukas (firma)blogi">3 soovitust, kuidas luua edukas (firma)blogi</a></li><li><a href="http://www.dt.ee/blog/microsoft/2008/07/microsoft-rahastab-avatud-lhtekoodiga-tarkvara-loomist/" rel="bookmark" title="Microsoft rahastab avatud l&auml;htekoodiga tarkvara loomist">Microsoft rahastab avatud l&auml;htekoodiga tarkvara loomist</a></li><li><a href="http://www.dt.ee/blog/microsoft/2010/07/yahoo-alustab-teste-bingi-otsingutulemustega/" rel="bookmark" title="Yahoo! alustab teste Bingi otsingutulemustega">Yahoo! alustab teste Bingi otsingutulemustega</a></li><li><a href="http://www.dt.ee/blog/internetiturundus/2007/01/google-analytics-sissejuhatus/" rel="bookmark" title="Google Analytics 1: Sissejuhatus">Google Analytics 1: Sissejuhatus</a></li></ul></p><br /><div class="feedflare">
<a href="http://feeds.dt.ee/~ff/dtblogi?a=dGlJK_oG5Tc:JOv7IwWrsA0:CrAVEhbAS04"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=CrAVEhbAS04" border="0"></img></a> <a href="http://feeds.dt.ee/~ff/dtblogi?a=dGlJK_oG5Tc:JOv7IwWrsA0:lvXyGxTQzqQ"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=lvXyGxTQzqQ" border="0"></img></a> <a href="http://feeds.dt.ee/~ff/dtblogi?a=dGlJK_oG5Tc:JOv7IwWrsA0:jyDof3Xhdmw"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=jyDof3Xhdmw" border="0"></img></a> <a href="http://feeds.dt.ee/~ff/dtblogi?a=dGlJK_oG5Tc:JOv7IwWrsA0:1mQ1z0kQkz4"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=1mQ1z0kQkz4" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/dtblogi/~4/dGlJK_oG5Tc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dt.ee/blog/kood/2012/05/kuidas-alustada-nodejs-arendust/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.dt.ee/blog/kood/2012/05/kuidas-alustada-nodejs-arendust/</feedburner:origLink></item>
		<item>
		<title>WiFi-kindel tapeet Prantsusmaalt</title>
		<link>http://feeds.dt.ee/~r/dtblogi/~3/_cuF3GcZFr4/</link>
		<comments>http://www.dt.ee/blog/tehnoloogia/2012/05/wifi-kindel-tapeet-prantsusmaalt/#comments</comments>
		<pubDate>Sat, 12 May 2012 10:00:30 +0000</pubDate>
		<dc:creator>Gunnar</dc:creator>
		
		<category><![CDATA[Tehnoloogia]]></category>

		<guid isPermaLink="false">http://www.dt.ee/blog/?p=4645</guid>
		<description><![CDATA[Ajal, mis küberkaitsekeskuseid rajatakse nii siin- kui sealpool suurt lompi, püüavad teemasse anda oma panuse ka Prantsusmaa teadlased, kes leiutavad WiFi-kindlat tapeeti. Eesmärk – kaitsta oma WiFi-võrku võõraste eest. 
Võlutapeet on tehtud hõbeda kristallidest, mis peatavad raadiolained sagedustel, mida kasutavad WiFi-ruuterid. Grenoble tehnoloogiainstituudi uurija Pierre Lemaitre-Auger näeb tapeedis kaitseinglit WiFi-ruuteritele, mida muidu võidakse häkkida. Kummalisel [...]]]></description>
			<content:encoded><![CDATA[<p>Ajal, mis küberkaitsekeskuseid rajatakse nii siin- kui sealpool suurt lompi, püüavad teemasse anda oma panuse ka Prantsusmaa teadlased, kes leiutavad WiFi-kindlat tapeeti. Eesmärk – kaitsta oma WiFi-võrku võõraste eest. </p>
<p>Võlutapeet on tehtud hõbeda kristallidest, mis peatavad raadiolained sagedustel, mida kasutavad WiFi-ruuterid. <a href="http://www.grenoble-inp.fr/">Grenoble tehnoloogiainstituudi</a> uurija Pierre Lemaitre-Auger näeb tapeedis kaitseinglit WiFi-ruuteritele, mida muidu võidakse häkkida. Kummalisel kombel jääb arutluskäik seinte juurde, kuid laest ja põrandast juttu ei tehta.</p>
<p>Tapeet, millest saaks arvatavasti ka tinamütsikesi teha, tuleb müüki järgmise aasta alguses. Hinnad pidid tulema keskmised ning samas oluliselt odavamad kui varasematel katsetel.</p>
<p>Põhjalikumat lugemist pakub CIO artikkel <a href="http://www.cio.com/article/706255/Wi_Fi_Blocking_Wallpaper_Keeps_Your_Signal_In_Intruders_Out?source=rss_all&amp;utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+cio%2Ffeed%2Farticles+%28CIO.com+Feed+-+Articles%29">Wi-Fi-Blocking Wallpaper Keeps Your Signal In, Intruders Out</a>.</p>
<p><br /><strong>Loe lisaks</strong><ul><li><a href="http://www.dt.ee/blog/ajaviide/2008/01/ja-nuud-checkige-orkutit/" rel="bookmark" title="Ja nüüd checkige Orkutit &#8230;">Ja nüüd checkige Orkutit &#8230;</a></li><li><a href="http://www.dt.ee/blog/tehnoloogia/2007/10/inglismaal-tuleb-wireless-burgs/" rel="bookmark" title="Inglismaal tuleb wireless burgs">Inglismaal tuleb wireless burgs</a></li><li><a href="http://www.dt.ee/blog/ajaviide/2008/04/wifi-t-sark/" rel="bookmark" title="WiFi T-särk">WiFi T-särk</a></li><li><a href="http://www.dt.ee/blog/internetiturundus/2008/02/viiendik-ostaks-auto-internetist/" rel="bookmark" title="Iga viies ostaks auto internetist">Iga viies ostaks auto internetist</a></li><li><a href="http://www.dt.ee/blog/mobiil/2007/09/mcafee-hoiatab-windows-mobiilide-pahavara-eest/" rel="bookmark" title="McAfee hoiatab Windows-i mobiilide pahavara eest">McAfee hoiatab Windows-i mobiilide pahavara eest</a></li></ul></p><br /><div class="feedflare">
<a href="http://feeds.dt.ee/~ff/dtblogi?a=_cuF3GcZFr4:tsTqRoLjouc:CrAVEhbAS04"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=CrAVEhbAS04" border="0"></img></a> <a href="http://feeds.dt.ee/~ff/dtblogi?a=_cuF3GcZFr4:tsTqRoLjouc:lvXyGxTQzqQ"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=lvXyGxTQzqQ" border="0"></img></a> <a href="http://feeds.dt.ee/~ff/dtblogi?a=_cuF3GcZFr4:tsTqRoLjouc:jyDof3Xhdmw"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=jyDof3Xhdmw" border="0"></img></a> <a href="http://feeds.dt.ee/~ff/dtblogi?a=_cuF3GcZFr4:tsTqRoLjouc:1mQ1z0kQkz4"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=1mQ1z0kQkz4" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/dtblogi/~4/_cuF3GcZFr4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dt.ee/blog/tehnoloogia/2012/05/wifi-kindel-tapeet-prantsusmaalt/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.dt.ee/blog/tehnoloogia/2012/05/wifi-kindel-tapeet-prantsusmaalt/</feedburner:origLink></item>
		<item>
		<title>TechEd Europe 2012 sinu taskus</title>
		<link>http://feeds.dt.ee/~r/dtblogi/~3/2DylHrTlmbk/</link>
		<comments>http://www.dt.ee/blog/tarkvara/2012/05/teched-europe-2012-sinu-taskus/#comments</comments>
		<pubDate>Thu, 10 May 2012 07:26:52 +0000</pubDate>
		<dc:creator>Gunnar</dc:creator>
		
		<category><![CDATA[Microsoft]]></category>

		<category><![CDATA[Mobiil]]></category>

		<category><![CDATA[Tarkvara]]></category>

		<category><![CDATA[Üritused]]></category>

		<guid isPermaLink="false">http://www.dt.ee/blog/?p=4635</guid>
		<description><![CDATA[Midagi uut TechEd Europe 2012 külastajatele. Need, kellel Windows Phone 7, Android või iPhone taskus, saavad omale koostada seminaride kava telefoni peal. Selleks on eraldi rakendus, mis jagab seminari kohta ka muud infot, töötavad meeldetuletused ja kuskilt hakkas silma ka live tile tugi. 
Microsoft on teinud diili sellise firmaga nagu Falafel Software, kelle üks teenustest [...]]]></description>
			<content:encoded><![CDATA[<p>Midagi uut TechEd Europe 2012 külastajatele. Need, kellel Windows Phone 7, Android või iPhone taskus, saavad omale koostada seminaride kava telefoni peal. Selleks on eraldi rakendus, mis jagab seminari kohta ka muud infot, töötavad meeldetuletused ja kuskilt hakkas silma ka <em>live tile</em> tugi. </p>
<p><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top: 0px; border-right: 0px; padding-top: 0px" title="EventBoard" border="0" alt="EventBoard" align="right" src="http://www.dt.ee/blog/wp-content/uploads/2012/05/eventboard-my-agenda.jpg" width="200" height="364" />Microsoft on teinud diili sellise firmaga nagu <a href="http://www.falafel.com/">Falafel Software</a>, kelle üks teenustest on <a href="http://www.eventboardmobile.com/">EventBoard</a>. EventBoard on professionaalne organiseerijatele mõeldud teenus oma sündmuste toetamiseks. Osalejatele on <a href="http://www.windowsphone.com/en-US/apps/2fb2f70f-80d5-df11-a844-00237de2db9e">kogu lõbu loomikult tasuta</a>.</p>
<p>Nii palju kui EventBoardiga hommikul mängida jõudsin tundus see igati mugav ja asjalik rakendus olevat. Millestki sellisest olen puudust tundnud mitmetel suurematel sündmustel osaledes.</p>
<p>Vist parim on see, et oma seminarikava saab kokku laduda otse mobiili peal ja selleks saab kasutada igasuguseid hetki, kus midagi tarka niigi teha pole.</p>
<p>Üks hea lisa, mis EventBoardil on, on Twitteri ja mõnede muude infokanalite tugi. Juba praegu saab TechEd Europe 2012 kohta vaadata jooksvat infot, mis uueneb päris tihedalt.</p>
<p><strong>Allalaadimine: </strong><a href="http://www.windowsphone.com/en-US/apps/2fb2f70f-80d5-df11-a844-00237de2db9e"><strong>EventBoard</strong></a></p>
<p><br /><strong>Loe lisaks</strong><ul><li><a href="http://www.dt.ee/blog/microsoft/2012/01/teched-europe-2012-toimub-sellel-aastal-juunis/" rel="bookmark" title="TechEd Europe 2012 toimub sellel aastal juunis">TechEd Europe 2012 toimub sellel aastal juunis</a></li><li><a href="http://www.dt.ee/blog/microsoft/2012/04/teched-europe-2012-miks-minna/" rel="bookmark" title="TechEd Europe 2012 - miks minna?">TechEd Europe 2012 - miks minna?</a></li><li><a href="http://www.dt.ee/blog/tehnoloogia/2012/01/lge-ja-vmware-virtualiseerisid-androidi/" rel="bookmark" title="LGE ja VMware virtualiseerisid Androidi">LGE ja VMware virtualiseerisid Androidi</a></li><li><a href="http://www.dt.ee/blog/mobiil/2006/11/tallinn-on-euroopa-arenenuim-mobiiliteenuste-linn/" rel="bookmark" title="Tallinn on Euroopa arenenuim mobiiliteenuste linn">Tallinn on Euroopa arenenuim mobiiliteenuste linn</a></li><li><a href="http://www.dt.ee/blog/mobiil/2008/12/2012-suveolumpia-tuuakse-mobiilidesse/" rel="bookmark" title="2012 suveolümpia tuuakse mobiilidesse">2012 suveolümpia tuuakse mobiilidesse</a></li></ul></p><br /><div class="feedflare">
<a href="http://feeds.dt.ee/~ff/dtblogi?a=2DylHrTlmbk:8B4OE2jMKv4:CrAVEhbAS04"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=CrAVEhbAS04" border="0"></img></a> <a href="http://feeds.dt.ee/~ff/dtblogi?a=2DylHrTlmbk:8B4OE2jMKv4:lvXyGxTQzqQ"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=lvXyGxTQzqQ" border="0"></img></a> <a href="http://feeds.dt.ee/~ff/dtblogi?a=2DylHrTlmbk:8B4OE2jMKv4:jyDof3Xhdmw"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=jyDof3Xhdmw" border="0"></img></a> <a href="http://feeds.dt.ee/~ff/dtblogi?a=2DylHrTlmbk:8B4OE2jMKv4:1mQ1z0kQkz4"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=1mQ1z0kQkz4" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/dtblogi/~4/2DylHrTlmbk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dt.ee/blog/tarkvara/2012/05/teched-europe-2012-sinu-taskus/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.dt.ee/blog/tarkvara/2012/05/teched-europe-2012-sinu-taskus/</feedburner:origLink></item>
		<item>
		<title>Arenduskeskkonna optimeerimine: Kuidas suurendada paralleelselt kompileeritavate projektide arvu</title>
		<link>http://feeds.dt.ee/~r/dtblogi/~3/4JlVywXUnDM/</link>
		<comments>http://www.dt.ee/blog/tarkvara/2012/05/kuidas-suurendada-paralleelselt-kompileeritavate-projektide-arvu/#comments</comments>
		<pubDate>Fri, 04 May 2012 06:16:05 +0000</pubDate>
		<dc:creator>Gunnar</dc:creator>
		
		<category><![CDATA[Microsoft]]></category>

		<category><![CDATA[Tarkvara]]></category>

		<guid isPermaLink="false">http://www.dt.ee/blog/?p=4631</guid>
		<description><![CDATA[Et reede kiiremini õhtusse saada, siis annan väikse vihje Visual Studio projektide kompileerimise kiirendamiseks. Sedapuhku pole tegu peenema putitamise ja ehitamisega – pääseme optsioonide dialoogiga. 
Visual Studio lubab öelda, et mitu projekti ta korraga kompileerib. Seejuures loomulikult arvestab ta ka projektide sõltuvusi (üks viitab teisele ja seega üks kompileeritakse enne teist valmis). Paralleelselt kompileeritavate projektide [...]]]></description>
			<content:encoded><![CDATA[<p><img style="margin: 5px 10px 5px 0px; display: inline; float: left" title="Keeruline jutt" alt="Keeruline jutt" align="left" src="http://www.dt.ee/blog/wp-content/uploads/2012/01/tech.gif" />Et reede kiiremini õhtusse saada, siis annan väikse vihje Visual Studio projektide kompileerimise kiirendamiseks. Sedapuhku pole tegu <a href="http://www.dt.ee/blog/tarkvara-arendus/2012/01/arenduskeskkonna-optimeerimine-visual-studio-lahenduste-kompileerimine/">peenema putitamise ja ehitamisega</a> – pääseme optsioonide dialoogiga. </p>
<p>Visual Studio lubab öelda, et mitu projekti ta korraga kompileerib. Seejuures loomulikult arvestab ta ka projektide sõltuvusi (üks viitab teisele ja seega üks kompileeritakse enne teist valmis). Paralleelselt kompileeritavate projektide arvu saab määrata Tool =&gt; Options menüü alt.</p>
<p align="center"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Build and Run seadistused" border="0" alt="Build and Run seadistused" src="http://www.dt.ee/blog/wp-content/uploads/2012/05/vs2010-max-no-parallel-build.png" width="540" height="314" />    <br /><em>Visual Studio 2010: Build and Run jaotusest saab määrata korraga     <br />kompileeritavate projektide maksimaalse arvu.</em></p>
<p>See väike optimeerimise trikk töötab hästi lahendustega, kus on mitu sõltumatut projekti. Kõik projektid, mis teineteisest ei sõltu või millel puuduvad omavahelised sõltuvused või on neil ühesugused sõltuvused teistest projektidest, saab samaaegselt kompileerima panna.</p>
<p>Kellele ikka tundub, et justkui asjad masinal ei edene piisavas tempos, siis peenemast optimeerimisest saab lugeda minu postitust <a href="http://www.dt.ee/blog/tarkvara-arendus/2012/01/arenduskeskkonna-optimeerimine-visual-studio-lahenduste-kompileerimine/">Arenduskeskkonna optimeerimine: Visual Studio lahenduste kompileerimine</a>.</p>
<p><br /><strong>Loe lisaks</strong><ul><li><a href="http://www.dt.ee/blog/kood/net/2010/12/aspnet-uldised-moodikud/" rel="bookmark" title="ASP.NET üldised mõõdikud">ASP.NET üldised mõõdikud</a></li><li><a href="http://www.dt.ee/blog/raamatud/2008/12/death-march/" rel="bookmark" title="Death March">Death March</a></li><li><a href="http://www.dt.ee/blog/kood/net/2010/03/sharepoint-spquery-rowlimit/" rel="bookmark" title="SharePoint päringute jõudlus 3: Küsi nii palju üksusi kui vajad">SharePoint päringute jõudlus 3: Küsi nii palju üksusi kui vajad</a></li><li><a href="http://www.dt.ee/blog/kood/net/2010/07/solution-navigator/" rel="bookmark" title="Visual Studio 2010: Solution Navigator saadab Solution Exploreri pensionile">Visual Studio 2010: Solution Navigator saadab Solution Exploreri pensionile</a></li><li><a href="http://www.dt.ee/blog/tarkvara/2006/07/visual-studio-ja-cvs/" rel="bookmark" title="Visual Studio ja CVS">Visual Studio ja CVS</a></li></ul></p><br /><div class="feedflare">
<a href="http://feeds.dt.ee/~ff/dtblogi?a=4JlVywXUnDM:nnaFfsfUW7w:CrAVEhbAS04"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=CrAVEhbAS04" border="0"></img></a> <a href="http://feeds.dt.ee/~ff/dtblogi?a=4JlVywXUnDM:nnaFfsfUW7w:lvXyGxTQzqQ"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=lvXyGxTQzqQ" border="0"></img></a> <a href="http://feeds.dt.ee/~ff/dtblogi?a=4JlVywXUnDM:nnaFfsfUW7w:jyDof3Xhdmw"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=jyDof3Xhdmw" border="0"></img></a> <a href="http://feeds.dt.ee/~ff/dtblogi?a=4JlVywXUnDM:nnaFfsfUW7w:1mQ1z0kQkz4"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=1mQ1z0kQkz4" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/dtblogi/~4/4JlVywXUnDM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dt.ee/blog/tarkvara/2012/05/kuidas-suurendada-paralleelselt-kompileeritavate-projektide-arvu/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.dt.ee/blog/tarkvara/2012/05/kuidas-suurendada-paralleelselt-kompileeritavate-projektide-arvu/</feedburner:origLink></item>
		<item>
		<title>Kuidas ehitada wizard ASP.NET MVC peal</title>
		<link>http://feeds.dt.ee/~r/dtblogi/~3/MnpsoA8qPo8/</link>
		<comments>http://www.dt.ee/blog/kood/aspnet/2012/05/kuidas-ehitada-wizard-aspnet-mvc-peal/#comments</comments>
		<pubDate>Thu, 03 May 2012 21:53:42 +0000</pubDate>
		<dc:creator>Gunnar</dc:creator>
		
		<category><![CDATA[ASP.NET]]></category>

		<guid isPermaLink="false">http://www.dt.ee/blog/?p=4628</guid>
		<description><![CDATA[Ja jõudsingi õhtuga ideelahendusest esimese tulemuseni. Läbi mitmete katsete kirjutasingi valmis ASP.NET MVC jaoks mõeldud wizard-ite baasklassid. Seejuures jäin kenasti püsima raamistiku mängureeglitesse ja mingeid jubedaid häkke ei teinud. Anna oma esimesed bitid-baidid teilegi vaadata ja torkida.  
Esmane lahendus wizarditele
Minu lahendus on lihtne – meil on baasklass wizard-ite kontrollerite jaoks. Kõik need kontrollerid laiendavad [...]]]></description>
			<content:encoded><![CDATA[<p>Ja jõudsingi õhtuga ideelahendusest esimese tulemuseni. Läbi mitmete katsete kirjutasingi valmis ASP.NET MVC jaoks mõeldud <em>wizard</em>-ite baasklassid. Seejuures jäin kenasti püsima raamistiku mängureeglitesse ja mingeid jubedaid häkke ei teinud. Anna oma esimesed bitid-baidid teilegi vaadata ja torkida.  </p>
<h3>Esmane lahendus wizarditele</h3>
<p>Minu lahendus on lihtne – meil on baasklass <em>wizard</em>-ite kontrollerite jaoks. Kõik need kontrollerid laiendavad samat baasklassi ning ütlevad sellele ette oma “suure” mudeli tüübi. </p>
<p align="center"><img src="http://www.dt.ee/blog/wp-content/uploads/2012/05/mvc-wizard-idea.png" width="503" height="230" /></p>
<p>Kontrolleri aktsioonid kasutavad <em>wizard</em>-i sammude kuvamiseks eraldi alammudeleid. Need kõik pärivad ennast <em>wizard-</em>i mudelite jaoks mõeldud baasklassist. Kui pöördumine tuleb kontrollerisse sisse, siis püüab kontroller “suure” mudeli valmis luua kas operaatoriga <em>new</em> või siis serialiseeritud andmetest. </p>
<p>Kui pöördumisele hakatakse vastust saatma, siis otsib baasklass üles mudeli küljest välja, kuhu “suur” mudel maha salvestatakse ning nii elab “suur” mudel üle lehtede vahel liikumise.</p>
<h3>Sammude mudelid</h3>
<p>Wizard-i sammude jaoks mõeldud baasklass on selline:</p>
<div class="syntax_hilite">
<div id="csharp-13">
<div class="csharp"><span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> WizardStepBase<br />
<span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#91;</span>NonSerialized<span style="color: #000000;">&#93;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> SerializedModel;<br />
<span style="color: #000000;">&#125;</span></div>
</div>
</div>
<p></p>
<p>Seda kasutavad mu <em>wizard-</em>i kaks sammu:</p>
<div class="syntax_hilite">
<div id="csharp-14">
<div class="csharp"><span style="color: #000000;">&#91;</span>Serializable<span style="color: #000000;">&#93;</span><br />
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> Step1AskName : WizardStepBase<br />
<span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#91;</span>Required<span style="color: #000000;">&#93;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> FirstName <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">get</span>; <span style="color: #0600FF;">set</span>; <span style="color: #000000;">&#125;</span></p>
<p>&nbsp; &nbsp; <span style="color: #000000;">&#91;</span>Required<span style="color: #000000;">&#93;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> LastName <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">get</span>; <span style="color: #0600FF;">set</span>; <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> SSN <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">get</span>; <span style="color: #0600FF;">set</span>; <span style="color: #000000;">&#125;</span><br />
<span style="color: #000000;">&#125;</span></p>
<p><span style="color: #000000;">&#91;</span>Serializable<span style="color: #000000;">&#93;</span><br />
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> Step2AskPhone : WizardStepBase<br />
<span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#91;</span>Required<span style="color: #000000;">&#93;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> WorkPhone <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">get</span>; <span style="color: #0600FF;">set</span>; <span style="color: #000000;">&#125;</span></p>
<p>&nbsp; &nbsp; <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> HomePhone <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">get</span>; <span style="color: #0600FF;">set</span>; <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> MobilePhone <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">get</span>; <span style="color: #0600FF;">set</span>; <span style="color: #000000;">&#125;</span><br />
<span style="color: #000000;">&#125;</span></div>
</div>
</div>
<p></p>
<p>Siiani peaks kõik lihtne olema – mudelite baasklass sisaldab lihtsalt atribuuti mudeli serialiseeritud versiooni kohta.</p>
<h3>Wizardi kontroller</h3>
<p>Järgmiseks see kõikse keerukam osa – <em>wizard</em>-i baasklass.</p>
<div class="syntax_hilite">
<div id="csharp-15">
<div class="csharp"><span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> WizardControllerBase&lt;t&gt; : Controller where T : <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><br />
<span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">protected</span> T WizardModel <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">get</span>; <span style="color: #0600FF;">set</span>; <span style="color: #000000;">&#125;</span></p>
<p>&nbsp; &nbsp; <span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">override</span> <span style="color: #0600FF;">void</span> Initialize<span style="color: #000000;">&#40;</span>RequestContext requestContext<span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">base</span>.<span style="color: #000000;">Initialize</span><span style="color: #000000;">&#40;</span>requestContext<span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; var serializedModel = requestContext.<span style="color: #000000;">HttpContext</span>.<span style="color: #000000;">Request</span><span style="color: #000000;">&#91;</span><span style="color: #808080;">"SerializedModel"</span><span style="color: #000000;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span>.<span style="color: #000000;">IsNullOrEmpty</span><span style="color: #000000;">&#40;</span>serializedModel<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WizardModel = <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> T<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">return</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; WizardModel = Deserialize<span style="color: #000000;">&#40;</span>serializedModel<span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span></p>
<p>&nbsp; &nbsp; <span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">override</span> <span style="color: #0600FF;">void</span> OnActionExecuting<span style="color: #000000;">&#40;</span>ActionExecutingContext filterContext<span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; var parameters = filterContext.<span style="color: #000000;">ActionParameters</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>parameters.<span style="color: #000000;">Count</span> == <span style="color: #FF0000;">0</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">return</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; var publicPropertyMask = BindingFlags.<span style="color: #000000;">Instance</span> | BindingFlags.<span style="color: #0600FF;">Public</span> | BindingFlags.<span style="color: #000000;">SetProperty</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; var wizardProperties = WizardModel.<span style="color: #000000;">GetType</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #000000;">GetProperties</span><span style="color: #000000;">&#40;</span>publicPropertyMask<span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>wizardProperties.<span style="color: #000000;">Length</span> == <span style="color: #FF0000;">0</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">return</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>var key <span style="color: #0600FF;">in</span> parameters.<span style="color: #000000;">Keys</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>var property <span style="color: #0600FF;">in</span> wizardProperties<span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>property.<span style="color: #000000;">PropertyType</span> == parameters<span style="color: #000000;">&#91;</span>key<span style="color: #000000;">&#93;</span>.<span style="color: #000000;">GetType</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var type = WizardModel.<span style="color: #000000;">GetType</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; type.<span style="color: #000000;">InvokeMember</span><span style="color: #000000;">&#40;</span>property.<span style="color: #000000;">Name</span>, publicPropertyMask, <span style="color: #0600FF;">null</span>, WizardModel, <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> <span style="color: #FF0000;">object</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> <span style="color: #000000;">&#123;</span> parameters<span style="color: #000000;">&#91;</span>key<span style="color: #000000;">&#93;</span> <span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">base</span>.<span style="color: #000000;">OnActionExecuting</span><span style="color: #000000;">&#40;</span>filterContext<span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span></p>
<p>&nbsp; &nbsp; <span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">override</span> <span style="color: #0600FF;">void</span> OnResultExecuting<span style="color: #000000;">&#40;</span>ResultExecutingContext filterContext<span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; var result = filterContext.<span style="color: #000000;">Result</span> <span style="color: #0600FF;">as</span> ViewResult;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>result != <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>result.<span style="color: #000000;">Model</span> <a href="http://www.google.com/search?q=is+msdn.microsoft.com"><span style="color: #008000;">is</span></a> WizardStepBase<span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var stepModel = <span style="color: #000000;">&#40;</span>WizardStepBase<span style="color: #000000;">&#41;</span>result.<span style="color: #000000;">Model</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; stepModel.<span style="color: #000000;">SerializedModel</span> = Serialize<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">base</span>.<span style="color: #000000;">OnResultExecuting</span><span style="color: #000000;">&#40;</span>filterContext<span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span></p>
<p>&nbsp; &nbsp; <span style="color: #000000;">&#91;</span>NonAction<span style="color: #000000;">&#93;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">private</span> <span style="color: #FF0000;">string</span> Serialize<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; var serializer = <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> XmlSerializer<span style="color: #000000;">&#40;</span><a href="http://www.google.com/search?q=typeof+msdn.microsoft.com"><span style="color: #008000;">typeof</span></a><span style="color: #000000;">&#40;</span>T<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; var builder = <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> StringBuilder<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">10000</span><span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">using</span> <span style="color: #000000;">&#40;</span>var writer = <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> StringWriter<span style="color: #000000;">&#40;</span>builder<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; serializer.<span style="color: #000000;">Serialize</span><span style="color: #000000;">&#40;</span>writer, WizardModel<span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; var serializedBytes = Encoding.<span style="color: #000000;">UTF8</span>.<span style="color: #000000;">GetBytes</span><span style="color: #000000;">&#40;</span>builder.<span style="color: #000000;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">return</span> Convert.<span style="color: #000000;">ToBase64String</span><span style="color: #000000;">&#40;</span>serializedBytes<span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span></p>
<p>&nbsp; &nbsp; <span style="color: #000000;">&#91;</span>NonAction<span style="color: #000000;">&#93;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">public</span> T Deserialize<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> serializedModel<span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; var deserializedBytes = Convert.<span style="color: #000000;">FromBase64String</span><span style="color: #000000;">&#40;</span>serializedModel<span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; var modelString = Encoding.<span style="color: #000000;">UTF8</span>.<span style="color: #000000;">GetString</span><span style="color: #000000;">&#40;</span>deserializedBytes<span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; var serializer = <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> XmlSerializer<span style="color: #000000;">&#40;</span><a href="http://www.google.com/search?q=typeof+msdn.microsoft.com"><span style="color: #008000;">typeof</span></a><span style="color: #000000;">&#40;</span>T<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">using</span> <span style="color: #000000;">&#40;</span>var reader = <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> StringReader<span style="color: #000000;">&#40;</span>modelString<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">return</span> <span style="color: #000000;">&#40;</span>T<span style="color: #000000;">&#41;</span>serializer.<span style="color: #000000;">Deserialize</span><span style="color: #000000;">&#40;</span>reader<span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
<span style="color: #000000;">&#125;</span></div>
</div>
</div>
<p></p>
<p>Ja siin on minu lihtne kontroller, mis küsib esimese sammu vaates külastaja nime ja teises sammus tahab teada telefoninumbreid. Sealt liigub see edasi andmete kinnitamise vaatesse, kus saab kontrollida, kas kõik andmed tulid ootuspäraselt kaasa.</p>
<div class="syntax_hilite">
<div id="csharp-16">
<div class="csharp"><span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> HomeController : WizardControllerBase&lt;mywizardmodel&gt;<br />
<span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#91;</span>HttpGet<span style="color: #000000;">&#93;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">public</span> ActionResult Index<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">return</span> View<span style="color: #000000;">&#40;</span><span style="color: #808080;">"Step1AskName"</span>, WizardModel.<span style="color: #000000;">AskNameStep</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span></p>
<p>&nbsp; &nbsp; <span style="color: #000000;">&#91;</span>HttpPost<span style="color: #000000;">&#93;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">public</span> ActionResult Index<span style="color: #000000;">&#40;</span>Step1AskName nameStep<span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>!ModelState.<span style="color: #000000;">IsValid</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">return</span> View<span style="color: #000000;">&#40;</span><span style="color: #808080;">"Step1AskName"</span>, nameStep<span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">return</span> View<span style="color: #000000;">&#40;</span><span style="color: #808080;">"Step2AskPhone"</span>, WizardModel.<span style="color: #000000;">AskPhoneStep</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span></p>
<p>&nbsp; &nbsp; <span style="color: #000000;">&#91;</span>HttpPost<span style="color: #000000;">&#93;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">public</span> ActionResult Step2<span style="color: #000000;">&#40;</span>Step2AskPhone phoneStep<span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>!ModelState.<span style="color: #000000;">IsValid</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">return</span> View<span style="color: #000000;">&#40;</span><span style="color: #808080;">"Step2AskPhone"</span>, phoneStep<span style="color: #000000;">&#41;</span>;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">return</span> View<span style="color: #000000;">&#40;</span><span style="color: #808080;">"Confirm"</span>, WizardModel<span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
<span style="color: #000000;">&#125;</span></div>
</div>
</div>
<p></p>
<p>Sellega on nüüd suurem tegemine möödas. Asi, millele rõhku tuleb pöörata, on see, et kasutage alati WizardModel omadust, kui alammudelitega töötate kontrolleris, sest muidu pole <em>wizard</em>-ite kontroller kursis sellega, et midagi muutus.</p>
<h3>Vaated</h3>
<p>Vaated võite lasta omale Visual Studio poolt genereerida, kuid arvestage sellega, et HTML-i vormidele tuleb ette öelda õige kontrolleri aktsioon, kuhu andmed postitada. Ma tegin viimaseks vaate, kus on näha kõik andmed, mis sai sisestatud:</p>
<p align="center"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="ASP.NET MVC wizard: andmete ülevaade" border="0" alt="ASP.NET MVC wizard: andmete ülevaade" src="http://www.dt.ee/blog/wp-content/uploads/2012/05/mvc-wizard-confirm.png" width="540" height="496" /></p>
<p>Paistab, et saimegi toimima. Teha on veel paar riukalikumat sammu, kuid need jätan järgmisteks päevadeks. </p>
<h3>Kokkuvõtteks</h3>
<p>Kuigi ASP.NET MVC ei paku välja kõiki ASP.NET Forms tugevaid külgi, on raamistik piisavalt paindlik, et sellega kõik viisakalt lahendatud saaks. Tuleb enne vaid võtta pits ja aru pidada. Nagu ennist mainisin, siis inspiratsiooni sain ühest suht jubedast <em>wizard</em>-i lahendusest ja paari tunniga sain valmis oma lahenduse, mis oluliselt viisakam. </p>
<p></mywizardmodel></t></p>
<p><br /><strong>Loe lisaks</strong><ul><li><a href="http://www.dt.ee/blog/kood/aspnet/2012/05/ideelahendus-wizardi-loomine-aspnet-mvc-peal/" rel="bookmark" title="Ideelahendus: Wizardi loomine ASP.NET MVC peal">Ideelahendus: Wizardi loomine ASP.NET MVC peal</a></li><li><a href="http://www.dt.ee/blog/kood/net/2009/03/aspnet-mvc-10/" rel="bookmark" title="ASP.NET MVC 1.0 on valmis">ASP.NET MVC 1.0 on valmis</a></li><li><a href="http://www.dt.ee/blog/kood/net/2010/04/algab-aspnet-mvc-nadal-dt-blogis/" rel="bookmark" title="Algab ASP.NET MVC nädal DT blogis">Algab ASP.NET MVC nädal DT blogis</a></li><li><a href="http://www.dt.ee/blog/kood/net/2011/03/tasuta-aspnet-mvc-oppevideod/" rel="bookmark" title="Tasuta ASP.NET MVC õppevideod">Tasuta ASP.NET MVC õppevideod</a></li><li><a href="http://www.dt.ee/blog/kood/net/2007/11/teched-2007-aspnet-mvc-raamistik/" rel="bookmark" title="TechEd 2007: ASP.NET MVC raamistik">TechEd 2007: ASP.NET MVC raamistik</a></li></ul></p><br /><div class="feedflare">
<a href="http://feeds.dt.ee/~ff/dtblogi?a=MnpsoA8qPo8:wa5NNiB4duk:CrAVEhbAS04"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=CrAVEhbAS04" border="0"></img></a> <a href="http://feeds.dt.ee/~ff/dtblogi?a=MnpsoA8qPo8:wa5NNiB4duk:lvXyGxTQzqQ"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=lvXyGxTQzqQ" border="0"></img></a> <a href="http://feeds.dt.ee/~ff/dtblogi?a=MnpsoA8qPo8:wa5NNiB4duk:jyDof3Xhdmw"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=jyDof3Xhdmw" border="0"></img></a> <a href="http://feeds.dt.ee/~ff/dtblogi?a=MnpsoA8qPo8:wa5NNiB4duk:1mQ1z0kQkz4"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=1mQ1z0kQkz4" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/dtblogi/~4/MnpsoA8qPo8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dt.ee/blog/kood/aspnet/2012/05/kuidas-ehitada-wizard-aspnet-mvc-peal/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.dt.ee/blog/kood/aspnet/2012/05/kuidas-ehitada-wizard-aspnet-mvc-peal/</feedburner:origLink></item>
		<item>
		<title>Ideelahendus: Wizardi loomine ASP.NET MVC peal</title>
		<link>http://feeds.dt.ee/~r/dtblogi/~3/fOuvGn8zsAQ/</link>
		<comments>http://www.dt.ee/blog/kood/aspnet/2012/05/ideelahendus-wizardi-loomine-aspnet-mvc-peal/#comments</comments>
		<pubDate>Thu, 03 May 2012 16:36:47 +0000</pubDate>
		<dc:creator>Gunnar</dc:creator>
		
		<category><![CDATA[ASP.NET]]></category>

		<guid isPermaLink="false">http://www.dt.ee/blog/?p=4625</guid>
		<description><![CDATA[Tänase läbukoodi ülesande lahendusele mõeldes tuli üks päris hea mõte pähe. Kuulasin juttu ühest olemasolevast lahendusest ja mõtlesin vaikselt, et kuidas seal iga samm järgmist keerukamaks muudab. Ja pärast koduteel tuligi vist õige mõte pähe. Proovime nüüd ideelisel tasemel lahendada ära ASP.NET MVC raamistikus wizard-ite loomise. 
Probleemid
ASP.NET Formsi all on wizard-ite tegemine lihtne. Meil on [...]]]></description>
			<content:encoded><![CDATA[<p>Tänase läbukoodi ülesande lahendusele mõeldes tuli üks päris hea mõte pähe. Kuulasin juttu ühest olemasolevast lahendusest ja mõtlesin vaikselt, et kuidas seal iga samm järgmist keerukamaks muudab. Ja pärast koduteel tuligi vist õige mõte pähe. Proovime nüüd ideelisel tasemel lahendada ära ASP.NET MVC raamistikus <em>wizard</em>-ite loomise. </p>
<h3>Probleemid</h3>
<p>ASP.NET Formsi all on <em>wizard</em>-ite tegemine lihtne. Meil on olemas kuvakontroller selle jaoks ning selle sees paneme paika, millist pilti ühe või teise sammu juures kuvatakse ning milliseid toiminguid tehakse. Natukese CSS-iga mängimist ja ongi täitsa nagu päris.</p>
<p>MVC peal meil midagi sellist ettevalmistatud kujul olemas ei ole. On olemas erinevaid lahendusi, mida kaaluda, kuid lõppeks peame ikkagi ise ehitama üles millegi, mis on mõistlik ja inimesi peast halliks ei aja. </p>
<p>Probleemkohad arendaja jaoks on siin järgmised:</p>
<ul>
<li>milline mudel või millised mudelid tuleks koostada <em>wizard</em>-i jaoks?</li>
<li>kuidas mudeli andmeid hoida pöördumiste vahel?</li>
<li>kuidas kirjutada <em>wizard</em>-i jaoks midagi lakoonilist ja lihtsat?</li>
<li>kuidas see miski võiks olla korduvkasutatav?</li>
<li>kuidas teha nii, et selle miski silumine ja parandamine oleks lihtne?</li>
</ul>
<p>Ma leidsin sellele esmase ideelise lahenduse. Panen selle kirja ja siis mõtlen edasi, kuidas asi selliselt vormistada, et nii võikski jääda.</p>
<h3>Minu lahenduse idee</h3>
<p>Ühe pealtnäha lihtsa lahenduse <em>wizard</em>-i ehitamiseks pakub välja Nadeem Afana oma postituses <a href="http://afana.me/post/create-wizard-in-aspnet-mvc-3.aspx">Create a Wizard in ASP.NET MVC 3</a>. Siin kasutatakse AJAX-it, et korjata vormile kogu mudeli jaoks vajalikud andmed kokku. Seejärel alles saadetakse andmed serverisse. Tundub hea lahendus, kuid mida teha suvalise mobiili korral, millel mõni keskmiselt juust mobiilidele mõeldud brauser peal jookseb?</p>
<p>Minu lahenduse skeem on selline.</p>
<p align="center"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 10px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="ASP.NET MVC wizard-i loomise idee" border="0" alt="ASP.NET MVC wizard-i loomise idee" src="http://www.dt.ee/blog/wp-content/uploads/2012/05/mvc-wizard-idea.png" width="503" height="230" /></p>
<p>Me jaotame <em>wizard</em>-i taga oleva mudeli mitmeks pisemaks mudeliks, millele vastavad vaated. Iga vaade tegeleb selle mudeliga, mida temal vaja on. Selleks, et erinevate sammude jooksul sisestatud andmed oleksid meile koguaeg saadaval serveri pooles, siis loome <em>wizard</em>-i mudeli, mille omadusteks on sammude mudelid.</p>
<p>Selleks, et seni kasutaja poolt sisestatu säiliks, võtame ASP.NET Forms maailmast appi ViewState-i idee. Iga sammu mudeli koosseisu kuulub ka meie suur mudel serialiseeritud kujul. Seda hoiame mõnel peidetud väljal krüpteerituna peidus. Sessiooni me midagi ei kirjuta, sest kasutajal võib <em>wizard</em> olla samal ajal avatud rohkem kui ühes brauseri aknas.</p>
<p>Selleks, et saaksime “suure” mudeli tagasi, kasutame <em>model binder</em>-it, mis taastab deserialiseerimise teel suure mudeli ja uuendab seda vormilt tulnud andmetega. Seega me võime kõikide sammude vaadetes tegeleda suure mudeliga ja sealt lihtsalt sammudele vastavaid omadusi vaadetes renderdada. Samuti võime esikohale tuua just alammudelid ja hoida nendel viidet suurele mudelile, kust saame vajadusel andmeid juurde küsida mõne sammu jaoks.</p>
<h3>Mis edasi?</h3>
<p>Edasi ma tuulutan korraks aju ja mõtlen natukene järgi, kuidas see asi valmis kirjutada. Sealt edasi saab mu Visual Studio 11 jälle loovas protsessis osaleda kui koodi kallale asun. Kui midagi üldist siit ei sünni, siis vähemasti saame siit kokku lahenduse, mida kasvõi lahenduse mustri osas annab oma ASP.NET MVC projektides kasutada.</p>
<p>Kui kellelegi mõni kasvõi uitmõte pähe turgatas praegu, siis andke kommentaariumi vahendusel märku. Äkki saame kamba peale midagi veel vingemat kokku. <img src='http://www.dt.ee/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><br /><strong>Loe lisaks</strong><ul><li><a href="http://www.dt.ee/blog/kood/net/2010/04/algab-aspnet-mvc-nadal-dt-blogis/" rel="bookmark" title="Algab ASP.NET MVC nädal DT blogis">Algab ASP.NET MVC nädal DT blogis</a></li><li><a href="http://www.dt.ee/blog/kood/net/2009/03/aspnet-mvc-10/" rel="bookmark" title="ASP.NET MVC 1.0 on valmis">ASP.NET MVC 1.0 on valmis</a></li><li><a href="http://www.dt.ee/blog/kood/net/2011/03/tasuta-aspnet-mvc-oppevideod/" rel="bookmark" title="Tasuta ASP.NET MVC õppevideod">Tasuta ASP.NET MVC õppevideod</a></li><li><a href="http://www.dt.ee/blog/kood/net/2010/07/webmatrix-razor-aspnet-web-pages-ja-aspnet-mvc/" rel="bookmark" title="WebMatrix, Razor, ASP.NET Web Pages ja ASP.NET MVC - mis on mis?">WebMatrix, Razor, ASP.NET Web Pages ja ASP.NET MVC - mis on mis?</a></li><li><a href="http://www.dt.ee/blog/kood/net/2007/11/teched-2007-aspnet-mvc-raamistik/" rel="bookmark" title="TechEd 2007: ASP.NET MVC raamistik">TechEd 2007: ASP.NET MVC raamistik</a></li></ul></p><br /><div class="feedflare">
<a href="http://feeds.dt.ee/~ff/dtblogi?a=fOuvGn8zsAQ:YHMEqBZeEpE:CrAVEhbAS04"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=CrAVEhbAS04" border="0"></img></a> <a href="http://feeds.dt.ee/~ff/dtblogi?a=fOuvGn8zsAQ:YHMEqBZeEpE:lvXyGxTQzqQ"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=lvXyGxTQzqQ" border="0"></img></a> <a href="http://feeds.dt.ee/~ff/dtblogi?a=fOuvGn8zsAQ:YHMEqBZeEpE:jyDof3Xhdmw"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=jyDof3Xhdmw" border="0"></img></a> <a href="http://feeds.dt.ee/~ff/dtblogi?a=fOuvGn8zsAQ:YHMEqBZeEpE:1mQ1z0kQkz4"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=1mQ1z0kQkz4" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/dtblogi/~4/fOuvGn8zsAQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dt.ee/blog/kood/aspnet/2012/05/ideelahendus-wizardi-loomine-aspnet-mvc-peal/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.dt.ee/blog/kood/aspnet/2012/05/ideelahendus-wizardi-loomine-aspnet-mvc-peal/</feedburner:origLink></item>
		<item>
		<title>DevReach 2012 registreerumine on avatud!</title>
		<link>http://feeds.dt.ee/~r/dtblogi/~3/_bjsCwVaSgk/</link>
		<comments>http://www.dt.ee/blog/ajaviide/uritused/2012/05/devreach-2012-registreerumine-on-avatud/#comments</comments>
		<pubDate>Thu, 03 May 2012 08:57:44 +0000</pubDate>
		<dc:creator>Gunnar</dc:creator>
		
		<category><![CDATA[Haridus]]></category>

		<category><![CDATA[Üritused]]></category>

		<guid isPermaLink="false">http://www.dt.ee/blog/?p=4622</guid>
		<description><![CDATA[Eelmisel aastal külastasin elus esimest korda sellist vahvad .NET seminari nagu DevReach 2011, mis toimub meile sobivalt ja soodsalt Bulgaaria pealinnas Sofias. Teleriku eestvedamisel toimuvale seminarile tuuakse kohale mitmed maailma suurnimed. Käesoleva aasta DevReach-ile registreerumine on alanud ja oodatud on kõik huvilised ka Eestist. 
Miks minna?
Toon välja mõned põhjused:

esitajate nimekiri on tavaliselt olnud väga tugev [...]]]></description>
			<content:encoded><![CDATA[<p><a title="DevReach" href="http://www.devreach.com/"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 5px 0px 5px 10px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top: 0px; border-right: 0px; padding-top: 0px" title="devreach2012" border="0" alt="devreach2012" align="right" src="http://www.dt.ee/blog/wp-content/uploads/2012/05/devreach2012.png" width="200" height="50" /></a>Eelmisel aastal külastasin elus esimest korda sellist vahvad .NET seminari nagu DevReach 2011, mis toimub meile sobivalt ja soodsalt Bulgaaria pealinnas Sofias. Teleriku eestvedamisel toimuvale seminarile tuuakse kohale mitmed maailma suurnimed. <a title="DevReach 2012" href="http://www.devreach.com/">Käesoleva aasta DevReach-ile</a> registreerumine on alanud ja oodatud on kõik huvilised ka Eestist. </p>
<h3>Miks minna?</h3>
<p>Toon välja mõned põhjused:</p>
<ul>
<li>esitajate nimekiri on tavaliselt olnud väga tugev (need nimed peaks tuttavad olema kõikidele tõsistele .NET arendajatele: Todd Anglin, Maarten Balliauw, Richard Campbell, Stephen Forte, Scott Hanselman, Tim Huckaby, Jesse Liberty, lisaks kohaliku regiooni staarid),</li>
<li>hinnad on soodsas – VIP-pass, mille koosseisu kuulub osalemine ürituse sulgemispeol, maksab&#160; alla 200EUR (arenenud Lääne-Euroopas tähendab analoogse seminari tavapilet umbes 600-800 EUR suurust väljaminekut),</li>
<li>bulgaarlased on sõbralikud inimesed ja uusi kontakte luua on seal küllaltki lihtne, samuti on head võimalused leida omale uusi sõpru arendajate hulgast,</li>
<li>hinnad on Bulgaarias suhteliselt madalad ja kui hoida turistilõksudest eemale, siis pole ka õhtused õlleringid oluline kulu.</li>
</ul>
<p>Sofia ja Tallinna vahel on lennuühendus päris hea ja hätta ei jää ka kohapealse majutusega. Hotelle on nii vanemast ajastust – rajud raudbetoon monstrumid – kui ka uuemad ja moodsamad (Radisson jt).</p>
<h3>Millal toimub?</h3>
<p>Toimumisajaks on 04.10-05.10.2012. See tähendab seda, et Tallinnast on mõttekas startida 03.10 ja tagasi Tallinnasse võiks ennast sättida 06.10 pealelõunal – jääb natuke aega Sofias ringi kolamiseks ka. Kes muidugi soovib linnaga tutvust teha pikemalt, siis võib ka 07.10.2012 peale tagasituleku plaanida. Mina saaksin omalt poolt rääkida kohalikega, kes meile äkki linna oleks nõus tutvustama.</p>
<p>Kohalik olustik on mulle selge ja kellel on plaani tulla, siis võite julgesti minuga ühenduda. Oskan eelmise aasta põhjalt küsimused ära vastata, mis esimest korda minejatel tekkida võivad.</p>
<h3>On Eestist veel minejaid?</h3>
<p>Peale sinu läheb sinna veel inimesi, kuigi arvatavasti mitte just palju. Loodame, et sellel aastal tuleb minuga kaasa paar kolleegi, kes .NET ja SharePoint arendusega tegelevad. Kui oled ka huviline, siis võtame teisi tulijaid ka hea meelega kampa. <img src='http://www.dt.ee/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>Registreerumine</h3>
<p><a href="http://www.devreach.com/Event/Pricing.aspx">DevReach registreerumise lehel</a> saate valida omale sobiva paketi ning selle eest tasuda. Kohapeal tuleb ennast esimesel päeval kirja panna ning tavaliselt saab registreerumisel ka kotikese nänni. Särk, pastakas, kaustik ja mingid kohalikus keeles värvilised paberid, pluss loomulikult seminari kava. Praegu on hinnad ülisoodsad ja kes kiirustab, see saab ka hea kokkuhoiu!</p>
<p><br /><strong>Loe lisaks</strong><ul><li><a href="http://www.dt.ee/blog/microsoft/2012/01/teched-europe-2012-toimub-sellel-aastal-juunis/" rel="bookmark" title="TechEd Europe 2012 toimub sellel aastal juunis">TechEd Europe 2012 toimub sellel aastal juunis</a></li><li><a href="http://www.dt.ee/blog/ajaviide/uritused/2011/05/sgisel-on-tulemas-devreach-2011/" rel="bookmark" title="S&uuml;gisel on tulemas DevReach 2011">S&uuml;gisel on tulemas DevReach 2011</a></li><li><a href="http://www.dt.ee/blog/mobiil/2008/12/2012-suveolumpia-tuuakse-mobiilidesse/" rel="bookmark" title="2012 suveolümpia tuuakse mobiilidesse">2012 suveolümpia tuuakse mobiilidesse</a></li><li><a href="http://www.dt.ee/blog/microsoft/2011/10/devreach-2011/" rel="bookmark" title="devReach 2011">devReach 2011</a></li><li><a href="http://www.dt.ee/blog/microsoft/2010/04/kutse-seminarile-php-microsofti-maailmas/" rel="bookmark" title="Kutse seminarile: PHP Microsofti maailmas">Kutse seminarile: PHP Microsofti maailmas</a></li></ul></p><br /><div class="feedflare">
<a href="http://feeds.dt.ee/~ff/dtblogi?a=_bjsCwVaSgk:EoSERJsMHd8:CrAVEhbAS04"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=CrAVEhbAS04" border="0"></img></a> <a href="http://feeds.dt.ee/~ff/dtblogi?a=_bjsCwVaSgk:EoSERJsMHd8:lvXyGxTQzqQ"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=lvXyGxTQzqQ" border="0"></img></a> <a href="http://feeds.dt.ee/~ff/dtblogi?a=_bjsCwVaSgk:EoSERJsMHd8:jyDof3Xhdmw"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=jyDof3Xhdmw" border="0"></img></a> <a href="http://feeds.dt.ee/~ff/dtblogi?a=_bjsCwVaSgk:EoSERJsMHd8:1mQ1z0kQkz4"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=1mQ1z0kQkz4" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/dtblogi/~4/_bjsCwVaSgk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dt.ee/blog/ajaviide/uritused/2012/05/devreach-2012-registreerumine-on-avatud/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.dt.ee/blog/ajaviide/uritused/2012/05/devreach-2012-registreerumine-on-avatud/</feedburner:origLink></item>
		<item>
		<title>ASP.NET MVC: Laiendusmeetod kuupäevade vahemiku kuvamiseks</title>
		<link>http://feeds.dt.ee/~r/dtblogi/~3/5M_F0yiLZcM/</link>
		<comments>http://www.dt.ee/blog/kood/aspnet/2012/05/aspnet-mvc-laiendusmeetod-kuupaevade-vahemiku-kuvamiseks/#comments</comments>
		<pubDate>Wed, 02 May 2012 09:55:28 +0000</pubDate>
		<dc:creator>Gunnar</dc:creator>
		
		<category><![CDATA[ASP.NET]]></category>

		<guid isPermaLink="false">http://www.dt.ee/blog/?p=4613</guid>
		<description><![CDATA[Mul oli vaja ühel ASP.NET MVC lehel kuvada sündmuste algus- ja lõpuaegu. Vaja oli pisut peenemat kuupäevade formaati, mis ei kuvaks kuupäeva kaks korda kui sündmus algab ja lõppeb samal päeval. Kirjutasin selle jaoks lihtsa laiendusmeetodi. Kellel vaja, siis võite siit julgelt haarata. 
Väljund on samal päeval algava ja lõppeva sündmuse korral midagi sellist (stiilide [...]]]></description>
			<content:encoded><![CDATA[<p>Mul oli vaja ühel <a href="http://www.asp.net/mvc">ASP.NET MVC</a> lehel kuvada sündmuste algus- ja lõpuaegu. Vaja oli pisut peenemat kuupäevade formaati, mis ei kuvaks kuupäeva kaks korda kui sündmus algab ja lõppeb samal päeval. Kirjutasin selle jaoks lihtsa laiendusmeetodi. Kellel vaja, siis võite siit julgelt haarata. </p>
<p>Väljund on samal päeval algava ja lõppeva sündmuse korral midagi sellist (stiilide abil saate endale sobiva välimuse külge ajada):</p>
<p align="center"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Sündmus algab ja lõppeb samal päeval" border="0" alt="Sündmus algab ja lõppeb samal päeval" src="http://www.dt.ee/blog/wp-content/uploads/2012/04/displaydaterange-short1.png" width="520" height="29" /></p>
<p>Kui algus ja lõpp on erinevatel kuupäevadel, siis on väljund selline:</p>
<p align="center"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Sündmuse algus ja lõpp on erinevatel kuupäevadel" border="0" alt="Sündmuse algus ja lõpp on erinevatel kuupäevadel" src="http://www.dt.ee/blog/wp-content/uploads/2012/04/displaydaterange-long1.png" width="520" height="29" /></p>
<p>Vaate sees on sellist asja niisama lihtsasti ilma loetavust kaotamata ära ei tee. Teine asi, mis räägib vaate sees formaatimise vastu antud juhul, on see, et taolist kuupäevade kuvamise loogikat võib meil kasutada mitu vaadet.</p>
<p>Laiendusmeetod ise on selline:</p>
<div class="syntax_hilite">
<div id="csharp-18">
<div class="csharp"><span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> MvcHtmlString DisplayDateRange<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span> HtmlHelper helper, DateTime from, DateTime to<span style="color: #000000;">&#41;</span><br />
<span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; var buffer = <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> StringBuilder<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">100</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp;<br />
&nbsp; &nbsp; buffer.<span style="color: #000000;">Append</span><span style="color: #000000;">&#40;</span><span style="color: #808080;">@"&lt;div class="</span><span style="color: #808080;">"dateRange"</span><span style="color: #808080;">"&gt;"</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp;<br />
&nbsp; &nbsp; buffer.<span style="color: #000000;">Append</span><span style="color: #000000;">&#40;</span>from.<span style="color: #000000;">ToShortDateString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; buffer.<span style="color: #000000;">Append</span><span style="color: #000000;">&#40;</span><span style="color: #808080;">" "</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; buffer.<span style="color: #000000;">Append</span><span style="color: #000000;">&#40;</span>from.<span style="color: #000000;">ToShortTimeString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; buffer.<span style="color: #000000;">Append</span><span style="color: #000000;">&#40;</span><span style="color: #808080;">" - "</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp;<br />
&nbsp; &nbsp; <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>from.<span style="color: #000000;">Date</span> == to.<span style="color: #000000;">Date</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; buffer.<span style="color: #000000;">Append</span><span style="color: #000000;">&#40;</span>to.<span style="color: #000000;">ToShortTimeString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">else</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; buffer.<span style="color: #000000;">Append</span><span style="color: #000000;">&#40;</span>to.<span style="color: #000000;">ToShortDateString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; buffer.<span style="color: #000000;">Append</span><span style="color: #000000;">&#40;</span><span style="color: #808080;">" "</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; buffer.<span style="color: #000000;">Append</span><span style="color: #000000;">&#40;</span>to.<span style="color: #000000;">ToShortTimeString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp;<br />
&nbsp; &nbsp; buffer.<span style="color: #000000;">Append</span><span style="color: #000000;">&#40;</span><span style="color: #808080;">"&lt;/div&gt;"</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp;<br />
&nbsp; &nbsp; <span style="color: #0600FF;">return</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> MvcHtmlString<span style="color: #000000;">&#40;</span>buffer.<span style="color: #000000;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;<br />
<span style="color: #000000;">&#125;</span></div>
</div>
</div>
<p></p>
<p>Lisa see mõnda staatilisse klassi, et saaksid seda vaadetes kasutada.</p>
<p><br /><strong>Loe lisaks</strong><ul><li><a href="http://www.dt.ee/blog/kood/net/2009/03/aspnet-mvc-10/" rel="bookmark" title="ASP.NET MVC 1.0 on valmis">ASP.NET MVC 1.0 on valmis</a></li><li><a href="http://www.dt.ee/blog/kood/net/2010/04/algab-aspnet-mvc-nadal-dt-blogis/" rel="bookmark" title="Algab ASP.NET MVC nädal DT blogis">Algab ASP.NET MVC nädal DT blogis</a></li><li><a href="http://www.dt.ee/blog/kood/net/2011/03/tasuta-aspnet-mvc-oppevideod/" rel="bookmark" title="Tasuta ASP.NET MVC õppevideod">Tasuta ASP.NET MVC õppevideod</a></li><li><a href="http://www.dt.ee/blog/kood/net/2007/11/teched-2007-aspnet-mvc-raamistik/" rel="bookmark" title="TechEd 2007: ASP.NET MVC raamistik">TechEd 2007: ASP.NET MVC raamistik</a></li><li><a href="http://www.dt.ee/blog/kood/net/2010/07/webmatrix-razor-aspnet-web-pages-ja-aspnet-mvc/" rel="bookmark" title="WebMatrix, Razor, ASP.NET Web Pages ja ASP.NET MVC - mis on mis?">WebMatrix, Razor, ASP.NET Web Pages ja ASP.NET MVC - mis on mis?</a></li></ul></p><br /><div class="feedflare">
<a href="http://feeds.dt.ee/~ff/dtblogi?a=5M_F0yiLZcM:TkDYeXH3PiI:CrAVEhbAS04"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=CrAVEhbAS04" border="0"></img></a> <a href="http://feeds.dt.ee/~ff/dtblogi?a=5M_F0yiLZcM:TkDYeXH3PiI:lvXyGxTQzqQ"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=lvXyGxTQzqQ" border="0"></img></a> <a href="http://feeds.dt.ee/~ff/dtblogi?a=5M_F0yiLZcM:TkDYeXH3PiI:jyDof3Xhdmw"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=jyDof3Xhdmw" border="0"></img></a> <a href="http://feeds.dt.ee/~ff/dtblogi?a=5M_F0yiLZcM:TkDYeXH3PiI:1mQ1z0kQkz4"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=1mQ1z0kQkz4" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/dtblogi/~4/5M_F0yiLZcM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dt.ee/blog/kood/aspnet/2012/05/aspnet-mvc-laiendusmeetod-kuupaevade-vahemiku-kuvamiseks/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.dt.ee/blog/kood/aspnet/2012/05/aspnet-mvc-laiendusmeetod-kuupaevade-vahemiku-kuvamiseks/</feedburner:origLink></item>
		<item>
		<title>Objektipuu laadimine ja salvestamine kettale</title>
		<link>http://feeds.dt.ee/~r/dtblogi/~3/jFvAhGuSijo/</link>
		<comments>http://www.dt.ee/blog/kood/net/2012/05/objektipuu-laadimine-ja-salvestamine-kettale/#comments</comments>
		<pubDate>Wed, 02 May 2012 09:11:43 +0000</pubDate>
		<dc:creator>Gunnar</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://www.dt.ee/blog/?p=4619</guid>
		<description><![CDATA[Kui ehitame mõnda demorakendust, siis pole meil tihti mõtet kulutada aega andmebaasi ehitamisele. Ma näitan ette ühe lihtsa nõksu kuidas oma objektid faili salvestada ja kuidas neid failist laadida. Ühtlasi seletan paari sõnaga ära mõned serialiseerimise nüansid .NET raamistikus. 
Alustuseks veidike serialiseerimisest. Serialiseerimise formaate on .NET-is mitmeid: kahendformaat, XML ja JSON. Kindlasti leidub serialiseerijaid veelgi. [...]]]></description>
			<content:encoded><![CDATA[<p>Kui ehitame mõnda demorakendust, siis pole meil tihti mõtet kulutada aega andmebaasi ehitamisele. Ma näitan ette ühe lihtsa nõksu kuidas oma objektid faili salvestada ja kuidas neid failist laadida. Ühtlasi seletan paari sõnaga ära mõned serialiseerimise nüansid .NET raamistikus. </p>
<p>Alustuseks veidike serialiseerimisest. Serialiseerimise formaate on .NET-is mitmeid: kahendformaat, XML ja JSON. Kindlasti leidub serialiseerijaid veelgi. Viimased kaks kapriissemad, sest ringviiteid objektide graafis esineda ei tohi. See tähendab seda, et invoiceRow.Invoice ja invoice.Rows pole toetatud, sest mööda sama graafi liikudes saame tagasi jõuda algpunkti. <em>Binary format</em> on sellest probleemist vaba ja selle võtame kasutusele ka käesolevas näites.</p>
<p>Enne kui salvestamise kallale asume, on meil vaja klassi, mis hoiaks objekte, mis ei pruugi teineteisega seotud olla. Näiteks arved ja kasutajad võivad täiesti sõltumatut elu elada samas objektmudelis. Meie andmehoidja võiks välja näha midagi sellist:</p>
<div class="syntax_hilite">
<div id="csharp-21">
<div class="csharp"><span style="color: #000000;">&#91;</span>Serializable<span style="color: #000000;">&#93;</span><br />
<span style="color: #0600FF;">internal</span> <span style="color: #FF0000;">class</span> SampleDataHolder<br />
<span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">public</span> IList&lt;Contact&gt; Contacts <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">get</span>; <span style="color: #0600FF;">set</span>; <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">public</span> IList&lt;Invoice&gt; Invoices <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">get</span>; <span style="color: #0600FF;">set</span>; <span style="color: #000000;">&#125;</span></p>
<p>&nbsp; &nbsp; <span style="color: #0600FF;">public</span> SampleDataHolder<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; Contacts = <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> List&lt;Contact&gt;<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; Invoices = <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> List&lt;Invoice&gt;<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
<span style="color: #000000;">&#125;</span></div>
</div>
</div>
<p></p>
<p>Järgmiseks kirjutame klassi, mis andmeid laeb ja maha salvestab. Selle klassi käest saame alati küsida andmeid hoidva objekti:</p>
<div class="syntax_hilite">
<div id="csharp-22">
<div class="csharp"><span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> SampleDataProvider<br />
<span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">private</span> <span style="color: #0600FF;">static</span> SampleDataHolder _dataHolder;<br />
&nbsp; &nbsp; <span style="color: #0600FF;">private</span> <span style="color: #0600FF;">static</span> <span style="color: #FF0000;">string</span> _dataFilePath;</p>
<p>&nbsp; &nbsp; <span style="color: #0600FF;">static</span> SampleDataProvider<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; var path = Path.<span style="color: #000000;">GetDirectoryName</span><span style="color: #000000;">&#40;</span>Assembly.<span style="color: #000000;">GetExecutingAssembly</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #000000;">GetName</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #000000;">CodeBase</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; _dataFilePath = Path.<span style="color: #000000;">Combine</span><span style="color: #000000;">&#40;</span>path, <span style="color: #808080;">"data.dat"</span><span style="color: #000000;">&#41;</span>.<span style="color: #000000;">Replace</span><span style="color: #000000;">&#40;</span><span style="color: #808080;">"file:<span style="color: #008080; font-weight: bold;">\\</span>"</span>, <span style="color: #808080;">""</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> SampleDataHolder DataHolder<br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">get</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>_dataHolder != <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">return</span> _dataHolder;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>!File.<span style="color: #000000;">Exists</span><span style="color: #000000;">&#40;</span>_dataFilePath<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _dataHolder = <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> SampleDataHolder<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">return</span> _dataHolder;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">using</span> <span style="color: #000000;">&#40;</span>var file = File.<span style="color: #000000;">OpenRead</span><span style="color: #000000;">&#40;</span>_dataFilePath<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var formatter = <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> BinaryFormatter<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _dataHolder = <span style="color: #000000;">&#40;</span>SampleDataHolder<span style="color: #000000;">&#41;</span>formatter.<span style="color: #000000;">Deserialize</span><span style="color: #000000;">&#40;</span>file<span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">return</span> _dataHolder;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span></p>
<p>&nbsp; &nbsp; <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> Save<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>File.<span style="color: #000000;">Exists</span><span style="color: #000000;">&#40;</span>_dataFilePath<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; File.<span style="color: #000000;">Delete</span><span style="color: #000000;">&#40;</span>_dataFilePath<span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">using</span> <span style="color: #000000;">&#40;</span>var file = File.<span style="color: #000000;">OpenWrite</span><span style="color: #000000;">&#40;</span>_dataFilePath<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var formatter = <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> BinaryFormatter<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; formatter.<span style="color: #000000;">Serialize</span><span style="color: #000000;">&#40;</span>file, DataHolder<span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
<span style="color: #000000;">&#125;</span></div>
</div>
</div>
<p></p>
<p>Igal korral kui oleme teinud muudatusi objektipuusse kutsume Save() meetodi, et andmed maha salvestada. Kui on piisavalt kindlust rakenduse tulevase ülesehituse osas, siis võib siin ehitatud klassid peita ka andmekihi klassidesse ajutise lahendusena ära. Hiljem, kui rakenduse osas selgus majas on, saab luua päris andmebaasi toe ning rakendus ise ei pruugi sellest muutusest midagi teada.</p>
<p><br /><strong>Loe lisaks</strong><ul><li><a href="http://www.dt.ee/blog/kood/net/2007/05/nhibernate-one-to-one/" rel="bookmark" title="NHibernate ja one-to-one">NHibernate ja one-to-one</a></li><li><a href="http://www.dt.ee/blog/tehnoloogia/2006/04/torts-irooniat-microsofti-arvel/" rel="bookmark" title="Törts irooniat Microsoft&#8217;i arvel">Törts irooniat Microsoft&#8217;i arvel</a></li><li><a href="http://www.dt.ee/blog/tehnoloogia/2008/08/roheline-akude-laadimine/" rel="bookmark" title="Roheline akude laadimine">Roheline akude laadimine</a></li><li><a href="http://www.dt.ee/blog/tarkvara/2012/02/dotproject-lahendus-tootundide-salvestamise-probleemile/" rel="bookmark" title="dotProject - lahendus töötundide salvestamise probleemile">dotProject - lahendus töötundide salvestamise probleemile</a></li><li><a href="http://www.dt.ee/blog/tarkvara/2007/05/package-this-sinu-msdn-library/" rel="bookmark" title="Package This - sinu MSDN Library">Package This - sinu MSDN Library</a></li></ul></p><br /><div class="feedflare">
<a href="http://feeds.dt.ee/~ff/dtblogi?a=jFvAhGuSijo:Ju_5uXa48Pk:CrAVEhbAS04"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=CrAVEhbAS04" border="0"></img></a> <a href="http://feeds.dt.ee/~ff/dtblogi?a=jFvAhGuSijo:Ju_5uXa48Pk:lvXyGxTQzqQ"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=lvXyGxTQzqQ" border="0"></img></a> <a href="http://feeds.dt.ee/~ff/dtblogi?a=jFvAhGuSijo:Ju_5uXa48Pk:jyDof3Xhdmw"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=jyDof3Xhdmw" border="0"></img></a> <a href="http://feeds.dt.ee/~ff/dtblogi?a=jFvAhGuSijo:Ju_5uXa48Pk:1mQ1z0kQkz4"><img src="http://feeds.feedburner.com/~ff/dtblogi?d=1mQ1z0kQkz4" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/dtblogi/~4/jFvAhGuSijo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dt.ee/blog/kood/net/2012/05/objektipuu-laadimine-ja-salvestamine-kettale/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.dt.ee/blog/kood/net/2012/05/objektipuu-laadimine-ja-salvestamine-kettale/</feedburner:origLink></item>
	</channel>
</rss>

