<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>IOCORE</title>
	<atom:link href="http://iocore.se/feed/" rel="self" type="application/rss+xml" />
	<link>http://iocore.se</link>
	<description>C#, PHP, Shell scripts m.m</description>
	<lastBuildDate>Fri, 14 Oct 2011 23:42:07 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Hämta information från ett körande objekt</title>
		<link>http://iocore.se/ppen-kllkod/hamta-information-fran-ett-korande-objekt/</link>
		<comments>http://iocore.se/ppen-kllkod/hamta-information-fran-ett-korande-objekt/#comments</comments>
		<pubDate>Fri, 26 Aug 2011 12:27:55 +0000</pubDate>
		<dc:creator>Dennis Sangmo</dc:creator>
				<category><![CDATA[Öppen källkod]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[asp.net-mvc]]></category>

		<guid isPermaLink="false">http://iocore.se/?p=447</guid>
		<description><![CDATA[Detta är en uppföljning på ett tidigare inlägg som ni kan finna här:
http://iocore.se/ppen-kllkod/crawla-en-lista-av-adresser-med-microsoft-web-management-seo-crawler-2/
Där pratade jag om hur man kan använda sig av Microsofts ramverk &#8220;Management.SEO.Crawler” utan att få användaren att fastna i laddning undertiden &#8220;ListCrawler&#8221;:en arbetade med att söka igenom respektive adress. Detta löstes genom att öppna upp en tråd (Thread) som arbetar parallellt som [...]]]></description>
			<content:encoded><![CDATA[<p>Detta är en uppföljning på ett tidigare inlägg som ni kan finna här:</p>
<p><a href="http://iocore.se/ppen-kllkod/crawla-en-lista-av-adresser-med-microsoft-web-management-seo-crawler-2/">http://iocore.se/ppen-kllkod/crawla-en-lista-av-adresser-med-microsoft-web-management-seo-crawler-2/</a></p>
<p>Där pratade jag om hur man kan använda sig av Microsofts ramverk &#8220;Management.SEO.Crawler” utan att få användaren att fastna i laddning undertiden &#8220;ListCrawler&#8221;:en arbetade med att söka igenom respektive adress. Detta löstes genom att öppna upp en tråd (Thread) som arbetar parallellt som webbapplikationen. Men för att kunna presentera hur det går för den så måste information hämtas undertiden den körs. Jag kommer nu presentera min lösning på detta problem.</p>
<p><span id="more-447"></span></p>
<h2>Göra trådarna tillgängliga</h2>
<p>När väl användaren har sagt åt &#8220;ListCrawler&#8221;:en att arbeta med att analysera adresserna i en parallell tråd, och sedan skickats vidare till nästa vy, så kan det vara problem att veta vilket &#8220;Thread&#8221;-objekt som är det intressanta. Om ni läst förra inlägget och analyserat koden så har du säkert lagt märke till att det objekt identifierar sig med en av sina egenskaper som utgör sig att vara av typen &#8220;Guid&#8221;. Den &#8216;id&#8217;-nyckeln skickar vi med användaren till den vyn som jag tidigare nämnde. För när användaren väl är där så kommer vi hämta den intressanta informationen med hjälp av Ajax. &#8220;Straightforward&#8221; kan tyckas, vilket det också är, men där finns en sista sak att nämna innan vi hoppar in i koden.</p>
<p>Nu när användaren har sitt guid och anropar efter information med hjälp av Ajax så måste objektet också finnas tillgängligt. Jag löste detta genom att skapa ett statiskt bibliotek som tar hand om alla användarnas sådana &#8220;ListCrawler&#8221; objekt, indexerade med deras Guid objekt. Detta bibliotek befinner sig i ett statiskt objekt som hanterar förfrågningar mot biblioteket. There we have it!</p>
<div class="dean_ch" style="white-space: wrap;">public <span class="kw4">static</span> class JobHandler<br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; private <span class="kw4">static</span> readonly Dictionary&lt;Guid, ListCrawler&gt; Jobs = new Dictionary&lt;Guid, ListCrawler&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">// Biblioteket med alla Crawler objekt</span></p>
<p>&nbsp; &nbsp; <span class="co1">// Metod som hämtar ett ListCrawlerobjekt med en Duid</span><br />
&nbsp; &nbsp; private <span class="kw4">static</span> ListCrawler GetWorkingListCrawler<span class="br0">&#40;</span>Guid id<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> Jobs.<span class="me1">ContainsKey</span><span class="br0">&#40;</span>id<span class="br0">&#41;</span> ? Jobs<span class="br0">&#91;</span>id<span class="br0">&#93;</span> : <span class="kw2">null</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; public <span class="kw4">static</span> bool HasWorkingCrawler<span class="br0">&#40;</span>Guid id<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; var wlc = GetWorkingListCrawler<span class="br0">&#40;</span>id<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> wlc != <span class="kw2">null</span> &amp;amp;&amp;amp; wlc.<span class="me1">HasWorkingCrawler</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; public <span class="kw4">static</span> ProgressInformationDTO GetProgressInformation<span class="br0">&#40;</span>Guid id<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> GetWorkingListCrawler<span class="br0">&#40;</span>id<span class="br0">&#41;</span>.<span class="me1">ProgressInformation</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; public <span class="kw4">static</span> <span class="kw4">string</span> GetBaseDirectoryPath<span class="br0">&#40;</span>Guid id<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> GetWorkingListCrawler<span class="br0">&#40;</span>id<span class="br0">&#41;</span>.<span class="me1">FullDirectoryPath</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; public <span class="kw4">static</span> <span class="kw4">void</span> Start<span class="br0">&#40;</span>Guid id<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>HasWorkingCrawler<span class="br0">&#40;</span>id<span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var lc = GetWorkingListCrawler<span class="br0">&#40;</span>id<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lc.<span class="me1">Start</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; public <span class="kw4">static</span> <span class="kw4">void</span> Stop<span class="br0">&#40;</span>Guid id<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>HasWorkingCrawler<span class="br0">&#40;</span>id<span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var lc = GetWorkingListCrawler<span class="br0">&#40;</span>id<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lc.<span class="me1">Stop</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp;public <span class="kw4">static</span> <span class="kw4">void</span> AddListCrawler<span class="br0">&#40;</span>ListCrawler lc<span class="br0">&#41;</span><br />
&nbsp; &nbsp;<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;Jobs.<span class="me1">Add</span><span class="br0">&#40;</span>lc.<span class="me1">Id</span>, lc<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp;<span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
<h2>JavaScript</h2>
<p>Till detta så är det också en del javascript som arbete i användarens webbläsare. Koden består av ett intervall som kör fuktionen &#8220;DoIt&#8221; varje sekund. &#8220;DoIt&#8221; gör ett Ajax-anrop till kontrollern som i sin tur hämtar informationen från rätt &#8220;ListCrawler&#8221;-objekt och skickar tillbaka den till användarens webbläsare som i sin tur trycker ut den informationen till rätt element.</p>
<div class="dean_ch" style="white-space: wrap;">$<span class="br0">&#40;</span>document<span class="br0">&#41;</span>.<span class="me1">ready</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; <span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; setInterval<span class="br0">&#40;</span>DoIt, <span class="nu0">1000</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&quot;#continue&quot;</span><span class="br0">&#41;</span>.<span class="me1">hide</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&quot;#abortTakeMeBack&quot;</span><span class="br0">&#41;</span>.<span class="me1">hide</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&quot;#abortBtn&quot;</span><span class="br0">&#41;</span>.<span class="me1">click</span><span class="br0">&#40;</span><span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $.<span class="me1">getJSON</span><span class="br0">&#40;</span><span class="st0">&quot;/Home/Abort&quot;</span>, <span class="br0">&#123;</span> <span class="st0">&quot;jobId&quot;</span>: <span class="st0">&quot;@ViewBag.jobId&quot;</span> <span class="br0">&#125;</span>, <span class="kw2">function</span> <span class="br0">&#40;</span>data, textStatus, jqXHR<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>data.<span class="me1">status</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&quot;#abortTakeMeBack&quot;</span><span class="br0">&#41;</span>.<span class="me1">show</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; window.<span class="me1">clearInterval</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">function</span> DoIt<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $.<span class="me1">getJSON</span><span class="br0">&#40;</span><span class="st0">&quot;/Home/Status&quot;</span>, <span class="br0">&#123;</span> <span class="st0">&quot;jobId&quot;</span>: <span class="st0">&quot;@ViewBag.jobId&quot;</span><span class="br0">&#125;</span>, <span class="kw2">function</span> <span class="br0">&#40;</span>data, textStatus, jqXHR<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>data.<span class="me1">complete</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; window.<span class="me1">clearInterval</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&quot;#infoText&quot;</span><span class="br0">&#41;</span>.<span class="me1">html</span><span class="br0">&#40;</span><span class="st0">&quot;Your analize is now complete!&quot;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&quot;#continue&quot;</span><span class="br0">&#41;</span>.<span class="me1">show</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&quot;#infoText&quot;</span><span class="br0">&#41;</span>.<span class="me1">html</span><span class="br0">&#40;</span><span class="st0">&quot;Your analize is in progress! This could take several minutes. &quot;</span> + textStatus<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>data.<span class="me1">error</span> != <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&quot;#progressError&quot;</span><span class="br0">&#41;</span>.<span class="me1">html</span><span class="br0">&#40;</span>data.<span class="me1">error</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&quot;#CurrentUri&quot;</span><span class="br0">&#41;</span>.<span class="me1">html</span><span class="br0">&#40;</span>data.<span class="me1">CurrentUri</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&quot;#BytesDownloaded&quot;</span><span class="br0">&#41;</span>.<span class="me1">html</span><span class="br0">&#40;</span>data.<span class="me1">BytesDownloaded</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&quot;#UrlCounter&quot;</span><span class="br0">&#41;</span>.<span class="me1">html</span><span class="br0">&#40;</span>data.<span class="me1">UrlCounter</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&quot;#TotalUrls&quot;</span><span class="br0">&#41;</span>.<span class="me1">html</span><span class="br0">&#40;</span>data.<span class="me1">TotalUrls</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>data.<span class="me1">Percent</span> != undefined<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&quot;#progressText&quot;</span><span class="br0">&#41;</span>.<span class="me1">html</span><span class="br0">&#40;</span>data.<span class="me1">Percent</span> + <span class="st0">&quot;%&quot;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&quot;#progressBar&quot;</span><span class="br0">&#41;</span>.<span class="me1">width</span><span class="br0">&#40;</span>data.<span class="me1">Percent</span> + <span class="st0">&quot;%&quot;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
]]></content:encoded>
			<wfw:commentRss>http://iocore.se/ppen-kllkod/hamta-information-fran-ett-korande-objekt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Crawla en lista av adresser med &#8220;Microsoft.Web.Management.SEO.Crawler&#8221;</title>
		<link>http://iocore.se/ppen-kllkod/crawla-en-lista-av-adresser-med-microsoft-web-management-seo-crawler-2/</link>
		<comments>http://iocore.se/ppen-kllkod/crawla-en-lista-av-adresser-med-microsoft-web-management-seo-crawler-2/#comments</comments>
		<pubDate>Fri, 19 Aug 2011 09:26:54 +0000</pubDate>
		<dc:creator>Dennis Sangmo</dc:creator>
				<category><![CDATA[Öppen källkod]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[asp.net-mvc]]></category>

		<guid isPermaLink="false">http://iocore.se/?p=440</guid>
		<description><![CDATA[Jag fick i uppdrag att bygga en applikation som skulle kunna söka igenom hemsidor efter valideringsfel, punkter som inte följde generella standarder exempelvis ut en sökmotoroptimerings vinkel. Eftersom jag tidigare haft mycket erfarenhet av att använda mig av ett tillägg i IIS server vid namn &#8220;Microsoft SEO Toolkit&#8221;, så valde jag att bygga denna applikation [...]]]></description>
			<content:encoded><![CDATA[<p>Jag fick i uppdrag att bygga en applikation som skulle kunna söka igenom hemsidor efter valideringsfel, punkter som inte följde generella standarder exempelvis ut en sökmotoroptimerings vinkel. Eftersom jag tidigare haft mycket erfarenhet av att använda mig av ett tillägg i IIS server vid namn &#8220;Microsoft SEO Toolkit&#8221;, så valde jag att bygga denna applikation kring det bibliotek som tillkommer när tillägget installeras. De kallar ramverket &#8220;Microsoft.Web.Management.SEO.Crawler&#8221; och har faktiskt många fördelar, men också många brister&#8230; Bara det faktum att Inga metoder är dokumenterade, så man får till viss det testa sig fram.</p>
<p>För att komma igång med biblioteket kan ni läsa en artikel som tar upp några av grunderna här: <a rel="nofollow" href="http://blogs.iis.net/carlosag/archive/2009/11/18/iis-seo-toolkit-start-new-analysis-automatically-through-code.aspx">http://blogs.iis.net/carlosag/archive/2009/11/18/iis-seo-toolkit-start-new-analysis-automatically-through-code.aspx</a></p>
<p>Problemet med resultatet i den guiden är det faktum att i en MVC lösning så vill man inte att en webbsida skall stå still och ladda undertiden analysen genomförs. En laddnings-vy hade kanske varit en bättre ide, vilket är det jag kommer fokusera mig på i detta inlägg.</p>
<p>Hemligheten bakom denna lösning är baserad på en teknik som kallas &#8220;Threading&#8221; som tillåter dig att köra flera processer parallellt istället för att behöva vänta på att hela analysen är utförd. Till detta använder jag mig av Ajax för att hämta ut nuvarande status på det arbetande objektet samtidigt som den arbetar i en annan tråd.</p>
<p>Och nu till lite kod:</p>
<div class="dean_ch" style="white-space: wrap;">using System;<br />
using System.<span class="me1">Collections</span>.<span class="me1">Generic</span>;<br />
using System.<span class="me1">Threading</span>;<br />
using Microsoft.<span class="me1">Web</span>.<span class="me1">Management</span>.<span class="me1">SEO</span>.<span class="me1">Crawler</span>;<br />
using System.<span class="me1">IO</span>;</p>
<p>public class ListCrawler<br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; public Guid Id <span class="br0">&#123;</span> get; private set; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; public <span class="kw4">string</span> DirectoryPath <span class="br0">&#123;</span> get; set; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; public ProgressInformationDTO ProgressInformation <span class="br0">&#123;</span> get; set; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; public <span class="kw4">string</span> FullDirectoryPath<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span>!SettingIsApplied || !ProgressInformation.<span class="me1">IsComplete</span><span class="br0">&#41;</span> ? <span class="st0">&quot;&quot;</span> : Path.<span class="me1">Combine</span><span class="br0">&#40;</span>DirectoryPath,Id.<span class="me1">ToString</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; public bool HasWorkingCrawler <span class="br0">&#123;</span> get <span class="br0">&#123;</span> <span class="kw1">return</span> WorkingCrawler != <span class="kw2">null</span>; <span class="br0">&#125;</span> <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; public bool WorkingCrawlerIsActive <span class="br0">&#123;</span> get <span class="br0">&#123;</span> <span class="kw1">return</span> ProcessThread.<span class="me1">IsAlive</span>; <span class="br0">&#125;</span> <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; private WebCrawler WorkingCrawler <span class="br0">&#123;</span> get; set; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; private List CrawlerList <span class="br0">&#123;</span> get; set; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; private bool SettingIsApplied <span class="br0">&#123;</span> get; set; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; private Thread ProcessThread <span class="br0">&#123;</span> get; set; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; private CrawlerSettings Settings <span class="br0">&#123;</span> get; set; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; public ListCrawler<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Settings = new CrawlerSettings<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CrawlerList = new List<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ProcessThread = new Thread<span class="br0">&#40;</span>Execute<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SettingIsApplied = <span class="kw2">false</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Id = Guid.<span class="me1">NewGuid</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; public bool Start<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>SettingIsApplied<span class="br0">&#41;</span> ProcessThread.<span class="me1">Start</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> SettingIsApplied;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; public <span class="kw4">void</span> Stop<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>ProcessThread.<span class="me1">IsAlive</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ProcessThread.<span class="me1">Abort</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WorkingCrawler = <span class="kw2">null</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; private <span class="kw4">void</span> Execute<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ProgressInformation.<span class="me1">TotalUrlCount</span> = CrawlerList.<span class="me1">Count</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ProgressInformation.<span class="me1">UrlCounter</span> = <span class="nu0">0</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach <span class="br0">&#40;</span>var item in CrawlerList<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ProgressInformation.<span class="me1">UrlCounter</span>++;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var dir = Path.<span class="me1">Combine</span><span class="br0">&#40;</span>DirectoryPath, Id.<span class="me1">ToString</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Settings.<span class="me1">StartUrl</span> = item.<span class="me1">Uri</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Settings.<span class="me1">Name</span> = ProgressInformation.<span class="me1">UrlCounter</span>.<span class="me1">ToString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; item.<span class="me1">Crawler</span> = new WebCrawler<span class="br0">&#40;</span>Settings<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WorkingCrawler = item.<span class="me1">Crawler</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; item.<span class="me1">Crawler</span>.<span class="me1">Start</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ProgressInformation.<span class="me1">CurrentUrl</span> = item.<span class="me1">Crawler</span>.<span class="me1">Settings</span>.<span class="me1">StartUrl</span>.<span class="me1">AbsoluteUri</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ProgressInformation.<span class="me1">TotalBytesDownloaded</span> += WorkingCrawler.<span class="me1">BytesDownloaded</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>item.<span class="me1">Crawler</span>.<span class="me1">IsRunning</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ProgressInformation.<span class="me1">TotalBytesDownloaded</span> += WorkingCrawler.<span class="me1">BytesDownloaded</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Thread.<span class="me1">Sleep</span><span class="br0">&#40;</span><span class="nu0">500</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; item.<span class="me1">Crawler</span>.<span class="me1">Report</span>.<span class="me1">Save</span><span class="br0">&#40;</span>dir<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ProgressInformation.<span class="me1">IsComplete</span> = <span class="kw2">true</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
<p>Vad är det då som händer här?</p>
<p>Detta är ett objekt som tillhandahåller en lista med adresser och &#8220;Crawler&#8221;-objekt som skall sökas igenom. Den har också en egenskap som är av typen &#8220;Thread&#8221; som jag kallar &#8220;ProgressThread&#8221; som instansieras i objektets konstruktor med metoden &#8220;Execute&#8221;. Det betyder att när tråden körs så kommer metoden &#8220;Execute&#8221; köras i den tråden ifrån rätt scope, vilket den gör när &#8220;Start&#8221;-metoden anropas.</p>
<p>I metoden &#8220;Execute&#8221; så händer en del saker men det som jag vill trycka på är att vi kan få &#8220;Thread&#8221;-objektet att sova utan att beröra resten av applikationen och det faktum att jag loopar igenom och analyserar alla objekt i listan.</p>
<p>Enkelt, eller hur?</p>
<p>Nästa vecka tar jag upp hur man kan göra för att hämta ut data från det körande objektet.</p>
]]></content:encoded>
			<wfw:commentRss>http://iocore.se/ppen-kllkod/crawla-en-lista-av-adresser-med-microsoft-web-management-seo-crawler-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ASP.NET MVC &#8211; komprimera html med actionfilter</title>
		<link>http://iocore.se/utveckling/aspnet-mvc-komprimera-html-med-actionfilter/</link>
		<comments>http://iocore.se/utveckling/aspnet-mvc-komprimera-html-med-actionfilter/#comments</comments>
		<pubDate>Thu, 18 Feb 2010 15:56:38 +0000</pubDate>
		<dc:creator>Alexander Nyquist</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Utveckling]]></category>
		<category><![CDATA[asp.net-mvc]]></category>

		<guid isPermaLink="false">http://iocore.se/?p=429</guid>
		<description><![CDATA[Genom att komprimera sin html kan man spara åtskillig datamängd. Jag tänkte här dela med mig av ett Actionfilter till ASP.NET MVC för att komprimera all output (genom att strippa bort onödig whitespace). Med nedanstående filter sparade jag 46kb per sidvisning, vilket blir relativt mycket om man har en välbesökt sida.
Först kommer definitionen av attributet [...]]]></description>
			<content:encoded><![CDATA[<p>Genom att komprimera sin html kan man spara åtskillig datamängd. Jag tänkte här dela med mig av ett Actionfilter till ASP.NET MVC för att komprimera all output (genom att strippa bort onödig whitespace). Med nedanstående filter sparade jag 46kb per sidvisning, vilket blir relativt mycket om man har en välbesökt sida.</p>
<p>Först kommer definitionen av attributet som används för att kunna anropa filtret.</p>
<div class="dean_ch" style="white-space: wrap;">
public class OptimizeHtmlOutputAttribute : ActionFilterAttribute<br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; public override <span class="kw4">void</span> OnResultExecuting<span class="br0">&#40;</span>ResultExecutingContext filterContext<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; HttpResponseBase response = filterContext.<span class="me1">HttpContext</span>.<span class="me1">Response</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; response.<span class="me1">Filter</span> = new OptimizeHtmlFilter<span class="br0">&#40;</span>response.<span class="me1">Filter</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp;</div>
<p>Filtret består utav lite mer kod, dock är funktionen som utför allt arbete den överlagrade metoden &#8220;Write&#8221;.</p>
<div class="dean_ch" style="white-space: wrap;">
public class OptimizeHtmlFilter : Stream<br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; private readonly StringBuilder _responseHtml;<br />
&nbsp; &nbsp; &nbsp; &nbsp; private readonly Stream _responseStream;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; public OptimizeHtmlFilter<span class="br0">&#40;</span>Stream inputStream<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _responseStream = inputStream;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _responseHtml = new StringBuilder<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">#region Filter overrides</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; public StringBuilder ResponseHtml<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get <span class="br0">&#123;</span> <span class="kw1">return</span> _responseHtml; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; public override bool CanRead<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get <span class="br0">&#123;</span> <span class="kw1">return</span> <span class="kw2">true</span>; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; public override bool CanSeek<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get <span class="br0">&#123;</span> <span class="kw1">return</span> <span class="kw2">true</span>; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; public override bool CanWrite<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get <span class="br0">&#123;</span> <span class="kw1">return</span> <span class="kw2">true</span>; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; public override <span class="kw4">long</span> Length<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get <span class="br0">&#123;</span> <span class="kw1">return</span> <span class="nu0">0</span>; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; public override <span class="kw4">long</span> Position <span class="br0">&#123;</span> get; set; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; public override <span class="kw4">void</span> Close<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _responseStream.<span class="me1">Close</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; public override <span class="kw4">void</span> Flush<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _responseStream.<span class="me1">Flush</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; public override <span class="kw4">long</span> Seek<span class="br0">&#40;</span><span class="kw4">long</span> offset, SeekOrigin origin<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> _responseStream.<span class="me1">Seek</span><span class="br0">&#40;</span>offset, origin<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; public override <span class="kw4">void</span> SetLength<span class="br0">&#40;</span><span class="kw4">long</span> length<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _responseStream.<span class="me1">SetLength</span><span class="br0">&#40;</span>length<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; public override <span class="kw4">int</span> Read<span class="br0">&#40;</span>byte<span class="br0">&#91;</span><span class="br0">&#93;</span> buffer, <span class="kw4">int</span> offset, <span class="kw4">int</span> count<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> _responseStream.<span class="me1">Read</span><span class="br0">&#40;</span>buffer, offset, count<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">#endregion</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; public override <span class="kw4">void</span> Write<span class="br0">&#40;</span>byte<span class="br0">&#91;</span><span class="br0">&#93;</span> buffer, <span class="kw4">int</span> offset, <span class="kw4">int</span> count<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">string</span> stringBuffer = Encoding.<span class="kw1">Default</span>.<span class="me1">GetString</span><span class="br0">&#40;</span>buffer<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var sb = new StringBuilder<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var lines = stringBuffer.<span class="me1">Split</span><span class="br0">&#40;</span>Environment.<span class="me1">NewLine</span>.<span class="me1">ToCharArray</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, StringSplitOptions.<span class="me1">RemoveEmptyEntries</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach <span class="br0">&#40;</span>var line in lines<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sb.<span class="me1">Append</span><span class="br0">&#40;</span>line.<span class="me1">Trim</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buffer = Encoding.<span class="kw1">Default</span>.<span class="me1">GetBytes</span><span class="br0">&#40;</span>sb.<span class="me1">ToString</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _responseStream.<span class="me1">Write</span><span class="br0">&#40;</span>buffer, <span class="nu0">0</span>, buffer.<span class="me1">Length</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp;</div>
<p>Filtret används sedan genom att dekorera Actions (eller för den delen controllers) med [OptimizeHtmlOutput], exempelvis:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="br0">&#91;</span>OptimizeHtmlOutput<span class="br0">&#93;</span><br />
public ActionResult Html<span class="br0">&#40;</span><span class="kw4">int</span> id<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;var report = _repository.<span class="me1">GetReport</span><span class="br0">&#40;</span>id<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">return</span> View<span class="br0">&#40;</span><span class="st0">&quot;Csv&quot;</span>, new CsvReport<span class="br0">&#40;</span>report<span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span><br />
&nbsp;</div>
<p>Dock bör man komma ihåg att inte optimera där det inte behövs. Man bör alltid profilera koden för att se vart flaskhalsarna sitter.</p>
]]></content:encoded>
			<wfw:commentRss>http://iocore.se/utveckling/aspnet-mvc-komprimera-html-med-actionfilter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Visual Studio 2010 RC släppt</title>
		<link>http://iocore.se/allmant/visual-studio-2010-rc-slappt/</link>
		<comments>http://iocore.se/allmant/visual-studio-2010-rc-slappt/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 10:02:11 +0000</pubDate>
		<dc:creator>Alexander Nyquist</dc:creator>
				<category><![CDATA[Allmänt]]></category>

		<guid isPermaLink="false">http://iocore.se/?p=427</guid>
		<description><![CDATA[Äntligen är RC-versionen av Visual Studio 2010 släppt för oss &#8220;vanliga&#8221; utvecklare. Jag har nyss avinstallerat Beta 2:an och kan inte göra annat än att verkligen hålla tummarna för att RC-versionen är både snabbare och stabilare än betan.
Betaversionen läckte verkligen minne. Så fort man öppnade ett projekt med ett stort antal projekt (50+) eller försökte [...]]]></description>
			<content:encoded><![CDATA[<p>Äntligen är RC-versionen av Visual Studio 2010 släppt för oss &#8220;vanliga&#8221; utvecklare. Jag har nyss avinstallerat Beta 2:an och kan inte göra annat än att verkligen hålla tummarna för att RC-versionen är både snabbare och stabilare än betan.</p>
<p>Betaversionen läckte verkligen minne. Så fort man öppnade ett projekt med ett stort antal projekt (50+) eller försökte köra något större WPF-projekt med diverse kontroller och funktioner tog det ofta inte länge innan applikationen kraschade.</p>
<p>En annan (för mig) väldigt viktig punkt var att MVC 2 RC 2 fungerar att köra under Visual Studio 2010 RC. Detta har tidigare inte gått men skall nu vara möjligt.</p>
<p>Mer information:</p>
<p><a href="http://blogs.msdn.com/jasonz/archive/2010/02/10/visual-studio-2010-net-framework-4-rc-ready-for-general-download.aspx">Jason Zander om släppet av Visual Studio 2010 RC.</a></p>
<p><a href="http://haacked.com/archive/2010/02/10/installing-asp-net-mvc-2-rc-2-on-visual-studio.aspx">Phil Haack bloggpost om ASP.NET MVC 2 RC 2 på Visual Studio 2010 RC.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://iocore.se/allmant/visual-studio-2010-rc-slappt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hämta ut &#8220;slöa&#8221; queries ur mssql</title>
		<link>http://iocore.se/allmant/hamta-ut-sloa-queries-ur-mssql/</link>
		<comments>http://iocore.se/allmant/hamta-ut-sloa-queries-ur-mssql/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 08:14:37 +0000</pubDate>
		<dc:creator>Alexander Nyquist</dc:creator>
				<category><![CDATA[Allmänt]]></category>

		<guid isPermaLink="false">http://iocore.se/?p=424</guid>
		<description><![CDATA[Min morgon började roligt med en väldigt slö applikation. Jag misstänkte att flaskhalsen låg i databaslagret, och mycket riktigt hade jag rätt. Hur kom jag då fram till detta? Datbasservern jag använder är en MsSql 2008.
Efter lite sökande hittade jag en mycket användbar query för att plocka ur de dyraste frågorna som ställts mot databasen [...]]]></description>
			<content:encoded><![CDATA[<p>Min morgon började roligt med en väldigt slö applikation. Jag misstänkte att flaskhalsen låg i databaslagret, och mycket riktigt hade jag rätt. Hur kom jag då fram till detta? Datbasservern jag använder är en MsSql 2008.</p>
<p>Efter lite sökande hittade jag en mycket användbar query för att plocka ur de dyraste frågorna som ställts mot databasen sedan den startades:</p>
<div class="wp_syntax">
<div class="code">
<pre class="sql" style="font-family: monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> TOP <span style="color: #cc66cc;">20</span> SUBSTRING<span style="color: #66cc66;">(</span>qt<span style="color: #66cc66;">.</span>text<span style="color: #66cc66;">,</span> <span style="color: #66cc66;">(</span>qs<span style="color: #66cc66;">.</span>statement_start_offset<span style="color: #66cc66;">/</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">)</span><span style="color: #66cc66;">+</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span>
        <span style="color: #66cc66;">(</span><span style="color: #66cc66;">(</span>CASE qs<span style="color: #66cc66;">.</span>statement_end_offset
          WHEN <span style="color: #66cc66;">-</span><span style="color: #cc66cc;">1</span> THEN DATALENGTH<span style="color: #66cc66;">(</span>qt<span style="color: #66cc66;">.</span>text<span style="color: #66cc66;">)</span>
         ELSE qs<span style="color: #66cc66;">.</span>statement_end_offset
         END <span style="color: #66cc66;">-</span> qs<span style="color: #66cc66;">.</span>statement_start_offset<span style="color: #66cc66;">)</span><span style="color: #66cc66;">/</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">)</span><span style="color: #66cc66;">+</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">)</span><span style="color: #66cc66;">,</span>
qs<span style="color: #66cc66;">.</span>execution_count<span style="color: #66cc66;">,</span>
qs<span style="color: #66cc66;">.</span>total_logical_reads<span style="color: #66cc66;">,</span> qs<span style="color: #66cc66;">.</span>last_logical_reads<span style="color: #66cc66;">,</span>
qs<span style="color: #66cc66;">.</span>min_logical_reads<span style="color: #66cc66;">,</span> qs<span style="color: #66cc66;">.</span>max_logical_reads<span style="color: #66cc66;">,</span>
qs<span style="color: #66cc66;">.</span>total_elapsed_time<span style="color: #66cc66;">,</span> qs<span style="color: #66cc66;">.</span>last_elapsed_time<span style="color: #66cc66;">,</span>
qs<span style="color: #66cc66;">.</span>min_elapsed_time<span style="color: #66cc66;">,</span> qs<span style="color: #66cc66;">.</span>max_elapsed_time<span style="color: #66cc66;">,</span>
qs<span style="color: #66cc66;">.</span>last_execution_time<span style="color: #66cc66;">,</span>
qp<span style="color: #66cc66;">.</span>query_plan
<span style="color: #993333; font-weight: bold;">FROM</span> sys<span style="color: #66cc66;">.</span>dm_exec_query_stats qs
<span style="color: #993333; font-weight: bold;">CROSS</span> APPLY sys<span style="color: #66cc66;">.</span>dm_exec_sql_text<span style="color: #66cc66;">(</span>qs<span style="color: #66cc66;">.</span>sql_handle<span style="color: #66cc66;">)</span> qt
<span style="color: #993333; font-weight: bold;">CROSS</span> APPLY sys<span style="color: #66cc66;">.</span>dm_exec_query_plan<span style="color: #66cc66;">(</span>qs<span style="color: #66cc66;">.</span>plan_handle<span style="color: #66cc66;">)</span> qp
<span style="color: #993333; font-weight: bold;">WHERE</span> qt<span style="color: #66cc66;">.</span>encrypted<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">0</span>
<span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> qs<span style="color: #66cc66;">.</span>total_logical_reads <span style="color: #993333; font-weight: bold;">DESC</span></pre>
</div>
</div>
<p>Detta är ett väldigt smidigt sätt för att hitta flaskhalser i sin databas, en viktig detalj när man <a href="http://www.mediaanalys.se">arbetar med sökmotoroptimering</a>.</p>
<p>För er som använder MySql kan jag rekommendera motsvarigheten <a href="http://dev.mysql.com/doc/refman/5.0/en/server-options.html#option_mysqld_log-slow-queries">log_slow_queries</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://iocore.se/allmant/hamta-ut-sloa-queries-ur-mssql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dependency Injection med PHP</title>
		<link>http://iocore.se/allmant/dependency-injection-med-php/</link>
		<comments>http://iocore.se/allmant/dependency-injection-med-php/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 15:53:11 +0000</pubDate>
		<dc:creator>Alexander Nyquist</dc:creator>
				<category><![CDATA[Allmänt]]></category>

		<guid isPermaLink="false">http://iocore.se/?p=413</guid>
		<description><![CDATA[Vid utveckling vill man alltid skapa så löst kopplade system som möjligt. Detta speciellt om man skriver enhetstester eller tillämpar testdriven utveckling. För att underlätta för sig själv skall man försöka följa de &#8220;SOLID&#8221;a principerna så gott det går.
D:et i SOLID står för Dependency Inversion, och betyder, enkelt sagt, att en klass inte skall vara [...]]]></description>
			<content:encoded><![CDATA[<p>Vid utveckling vill man alltid skapa så löst kopplade system som möjligt. Detta speciellt om man skriver enhetstester eller tillämpar testdriven utveckling. För att underlätta för sig själv skall man försöka följa de &#8220;SOLID&#8221;a principerna så gott det går.</p>
<p>D:et i SOLID står för Dependency Inversion, och betyder, enkelt sagt, att en klass inte skall vara hårt kopplad till en annan klass. För att lösa detta brukar man tillämpa en teknik som ofta kallas dependency injection, vilket innebär att klasser som skall instansieras får sina beroenden från den som instansierar klassen.</p>
<p>Ett exempel på en klass som inte följer Dependency Inversion är följande:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw2">&lt;?php</span><br />
<span class="kw2">class</span> HtmlParser<br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> GetTitle<span class="br0">&#40;</span><span class="re0">$url</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$downloader</span> = <span class="kw2">new</span> HtmlDownloader<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$content</span> = <span class="re0">$downloader</span>-&gt;<span class="me1">download</span><span class="br0">&#40;</span><span class="re0">$url</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$title</span> = <a href="http://www.php.net/preg_match"><span class="kw3">preg_match</span></a><span class="br0">&#40;</span><span class="st0">&#8216;~&lt;title&gt;(.*?)&lt;/title&gt;~&#8217;</span>, <span class="re0">$content</span>, <span class="re0">$match</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$match</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
<span class="kw2">?&gt;</span><br />
&nbsp;</div>
<p>Denna klassen har ett beroende av HtmlDownloader, vilket innebär att man inte kan återanvända klassen HtmlParser från ett annat ställe. Vad händer om vi istället för att ladda ner filen via HTTP vill hämta innehållet från en lokal fil? Då måste vi antingen skapa en ny klass för detta, eller en ny metod för att göra detta.</p>
<p>En annan, och bättre, lösning på detta är att låta klassen HtmlParser ta en klass som implementerar ett gemensamt interface, som inparameter i konstruktorn, till exempel:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw2">&lt;?php</span><br />
<span class="kw2">interface</span> IHtmlProvider<br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">function</span> getHtml<span class="br0">&#40;</span><span class="re0">$path</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></p>
<p><span class="kw2">class</span> LocalFileHtmlProvider implements IHtmlProvider<br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">function</span> getHtml<span class="br0">&#40;</span><span class="re0">$path</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Läs och returnera från filsystemet</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw2">class</span> RemoteHtmlProvider implements IHtmlProvider<br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">function</span> getHtml<span class="br0">&#40;</span><span class="re0">$path</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Ladda ner via HTTP</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
<span class="kw2">?&gt;</span><br />
&nbsp;</div>
<p>Detta gör att vi kan modifiera vår parser till att se ut enligt följande: </p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw2">&lt;?php</span><br />
<span class="kw2">class</span> HtmlParser<br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">private</span> <span class="re0">$provider</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> __construct<span class="br0">&#40;</span>IHtmlProvider <span class="re0">$provider</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">provider</span> = <span class="re0">$provider</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> GetTitle<span class="br0">&#40;</span><span class="re0">$path</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$content</span> = <span class="re0">$this</span>-&gt;<span class="me1">provider</span>-&gt;<span class="me1">getHtml</span><span class="br0">&#40;</span><span class="re0">$path</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$title</span> = <a href="http://www.php.net/preg_match"><span class="kw3">preg_match</span></a><span class="br0">&#40;</span><span class="st0">&#8216;~&lt;title&gt;(.*?)&lt;/title&gt;~&#8217;</span>, <span class="re0">$content</span>, <span class="re0">$match</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$match</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
<span class="kw2">?&gt;</span><br />
&nbsp;</div>
<p>Nu kan vi enkelt byta källa för vår html, och återanvända koden precis var vi vill, så länge får källa implementerar IHtmlProvider. Vill vi bygga en FtpHtmlProvider är detta inga som helst problem.</p>
<p>I ett kommande inlägg kommer jag visa en teknik som kallas för Inversion of Control, och är nära besläktat med Dependency Injection.</p>
<p>Externa länkar med mer informtion:</p>
<p><a href="http://en.wikipedia.org/wiki/Dependency_injection">Wikipedia om Dependency Injection</a></p>
<p><a href="http://en.wikipedia.org/wiki/Dependency_inversion_principle">Wikipedia om Dependency Inversion Principle</a></p>
<p><a href="http://en.wikipedia.org/wiki/Solid_(Object_Oriented_Design)">Wikipedia om SOLID Principles</a></p>
]]></content:encoded>
			<wfw:commentRss>http://iocore.se/allmant/dependency-injection-med-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Användares statusuppdateringar på twitter</title>
		<link>http://iocore.se/allmant/anvandares-statusuppdateringar-pa-flickr/</link>
		<comments>http://iocore.se/allmant/anvandares-statusuppdateringar-pa-flickr/#comments</comments>
		<pubDate>Thu, 09 Apr 2009 13:11:01 +0000</pubDate>
		<dc:creator>Alexander Nyquist</dc:creator>
				<category><![CDATA[Allmänt]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://iocore.se/?p=403</guid>
		<description><![CDATA[Tänkte dumpa en kodsnutt som hämtar en användares statusuppdateringar på twitter. No more no less.

$data = file_get_contents&#40;&#8216;http://twitter.com/statuses/user_timeline/26553013.json&#8217;&#41;;
$json = json_decode&#40;$data&#41;;
foreach&#40;$json as $message&#41;
&#123;
&#160; &#160; if&#40;$message-&#62;in_reply_to_screen_name === null&#41;
&#160; &#160; &#160; &#160; echo $message-&#62;text;
&#125;
&#160;
Byt ut idt(26553013) mot den användaren du vill hämta datan för.
]]></description>
			<content:encoded><![CDATA[<p>Tänkte dumpa en kodsnutt som hämtar en användares statusuppdateringar på twitter. No more no less.</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="re0">$data</span> = <a href="http://www.php.net/file_get_contents"><span class="kw3">file_get_contents</span></a><span class="br0">&#40;</span><span class="st0">&#8216;http://twitter.com/statuses/user_timeline/26553013.json&#8217;</span><span class="br0">&#41;</span>;<br />
<span class="re0">$json</span> = json_decode<span class="br0">&#40;</span><span class="re0">$data</span><span class="br0">&#41;</span>;</p>
<p><span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$json</span> <span class="kw1">as</span> <span class="re0">$message</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$message</span>-&gt;<span class="me1">in_reply_to_screen_name</span> === <span class="kw2">null</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="re0">$message</span>-&gt;<span class="me1">text</span>;<br />
<span class="br0">&#125;</span><br />
&nbsp;</div>
<p>Byt ut idt(26553013) mot den användaren du vill hämta datan för.</p>
]]></content:encoded>
			<wfw:commentRss>http://iocore.se/allmant/anvandares-statusuppdateringar-pa-flickr/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Listen up!</title>
		<link>http://iocore.se/allmant/listen-up/</link>
		<comments>http://iocore.se/allmant/listen-up/#comments</comments>
		<pubDate>Wed, 18 Mar 2009 10:48:43 +0000</pubDate>
		<dc:creator>Alexander Nyquist</dc:creator>
				<category><![CDATA[Allmänt]]></category>

		<guid isPermaLink="false">http://iocore.se/?p=399</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><a href="http://iocore.se/wp-content/uploads/2009/03/greatest_programming_tip_ever_pic.jpg"><img class="alignnone size-medium wp-image-400" title="greatest_programming_tip_ever_pic" src="http://iocore.se/wp-content/uploads/2009/03/greatest_programming_tip_ever_pic-300x231.jpg" alt="" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://iocore.se/allmant/listen-up/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>FireUnit &#8211; Smidigare enhetstestning i JavaScript</title>
		<link>http://iocore.se/allmant/fireunit-smidigare-enhetstestning-i-javascript/</link>
		<comments>http://iocore.se/allmant/fireunit-smidigare-enhetstestning-i-javascript/#comments</comments>
		<pubDate>Thu, 12 Feb 2009 09:18:41 +0000</pubDate>
		<dc:creator>Alexander Nyquist</dc:creator>
				<category><![CDATA[Allmänt]]></category>

		<guid isPermaLink="false">http://iocore.se/?p=394</guid>
		<description><![CDATA[För oss som gillar enhetstestning har det nu kommit en riktigt smidigt plugin till Firebug &#8211; FireUnit. Pluginet möjliggör smidigare enhetstestning för JavaScript, vilket tidigare har varit ganska trivialt.
FireUnit är som sagt helt integrerat i FireBug, och placerar vid installation en ny flik vid namn &#8216;Test&#8217; i fliksystemet.
Någonting som jag inte gillar är vissa namnkonventioner, [...]]]></description>
			<content:encoded><![CDATA[<p>För oss som gillar enhetstestning har det nu kommit en riktigt smidigt plugin till Firebug &#8211; <a href="http://fireunit.org/">FireUnit</a>. Pluginet möjliggör smidigare enhetstestning för JavaScript, vilket tidigare har varit ganska trivialt.</p>
<p>FireUnit är som sagt helt integrerat i FireBug, och placerar vid installation en ny flik vid namn &#8216;Test&#8217; i fliksystemet.</p>
<p>Någonting som jag inte gillar är vissa namnkonventioner, till exempel har man bytt ut ordet &#8216;assert&#8217; mot &#8216;ok&#8217;, vilket kan ses som väldigt trivialt, men enligt mig bör följa de andra unit-testningramverken(?).</p>
<p>För mer information om FireUnit hänvisar jag till skaparen John Resig&#8217;s <a href="http://ejohn.org/blog/fireunit/">blogg</a>.</p>
<p><img class="alignnone" title="FireUnit" src="http://fireunit.org/fireunit-ui-thumb.png" alt="" width="520" height="212" /></p>
]]></content:encoded>
			<wfw:commentRss>http://iocore.se/allmant/fireunit-smidigare-enhetstestning-i-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Serialisera array till XML</title>
		<link>http://iocore.se/php/serialiseara-array-till-xml/</link>
		<comments>http://iocore.se/php/serialiseara-array-till-xml/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 08:24:45 +0000</pubDate>
		<dc:creator>Alexander Nyquist</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://iocore.se/?p=389</guid>
		<description><![CDATA[För tillfället sitter jag och skriver en REST-service för en viss tjänst, och var i behov av en klass eller funktion för att serialisera en php-array till XML. Efter lite googlande hade jag dock inte hittat någon simpel klass för att göra detta, förrutom en PEAR-klass. Dock valde jag att inte använda denna då det [...]]]></description>
			<content:encoded><![CDATA[<p>För tillfället sitter jag och skriver en REST-service för en viss tjänst, och var i behov av en klass eller funktion för att serialisera en php-array till XML. Efter lite googlande hade jag dock inte hittat någon simpel klass för att göra detta, förrutom en PEAR-klass. Dock valde jag att inte använda denna då det inte finns stöd för PEAR där tjänsten kommer att hostas. Jag bestämde mig då för att knåpa ihop en egen klass, och detta är resultatet:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw2">Class</span> XmlSerializer <span class="kw2">Extends</span> XmlWriter<br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; protected <span class="re0">$rootnode</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> __construct<span class="br0">&#40;</span><span class="re0">$rootnode</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Use memory output</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; parent::<span class="me2">openMemory</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; parent::<span class="me2">setIndent</span><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/* Use four spaces as indent */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; parent::<span class="me2">setIndentString</span><span class="br0">&#40;</span><a href="http://www.php.net/chr"><span class="kw3">chr</span></a><span class="br0">&#40;</span>0&#215;20<span class="br0">&#41;</span> .<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/chr"><span class="kw3">chr</span></a><span class="br0">&#40;</span>0&#215;20<span class="br0">&#41;</span> .<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/chr"><span class="kw3">chr</span></a><span class="br0">&#40;</span>0&#215;20<span class="br0">&#41;</span> .<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/chr"><span class="kw3">chr</span></a><span class="br0">&#40;</span>0&#215;20<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">rootnode</span> = <span class="re0">$rootnode</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; parent::<span class="me2">startElement</span><span class="br0">&#40;</span><span class="re0">$this</span>-&gt;<span class="me1">rootnode</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> startElement<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; parent::<span class="me2">startElement</span><span class="br0">&#40;</span><span class="re0">$this</span>-&gt;<span class="me1">rootnode</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> <a href="http://www.php.net/serialize"><span class="kw3">serialize</span></a><span class="br0">&#40;</span><span class="re0">$data</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$data</span> <span class="kw1">as</span> <span class="re0">$key</span> =&gt; <span class="re0">$value</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><a href="http://www.php.net/is_array"><span class="kw3">is_array</span></a><span class="br0">&#40;</span><span class="re0">$value</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; parent::<span class="me2">startElement</span><span class="br0">&#40;</span><span class="re0">$key</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">serialize</span><span class="br0">&#40;</span><span class="re0">$value</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; parent::<span class="me2">endElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">continue</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; parent::<span class="me2">writeElement</span><span class="br0">&#40;</span><span class="re0">$key</span>, <span class="re0">$value</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1">// Override function so that we dont need to call endElement by ourselves</span><br />
&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> output<span class="br0">&#40;</span><span class="re0">$flush</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; parent::<span class="me2">endElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> parent::<span class="me2">outputMemory</span><span class="br0">&#40;</span><span class="re0">$flush</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
&nbsp;</div>
<p>Som ni ser är den välidgt, väldigt simpel, enbart med funktioner för att serialisera en array till php &#8211; inte vice versa. Kanske något att bygga in stöd för dock.</p>
<p>Här är ett simpelt exempel:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="re0">$data</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><br />
&nbsp; &nbsp; <span class="st0">&#8217;status&#8217;</span> =&gt; <span class="st0">&#8216;Success&#8217;</span>,<br />
&nbsp; &nbsp; <span class="st0">&#8216;data&#8217;</span> =&gt; <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;username&#8217;</span> =&gt; <span class="st0">&#8216;Alexander Nyquist&#8217;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;password&#8217;</span> =&gt; <span class="st0">&#8216;password&#8217;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;apikey&#8217;</span> =&gt; <a href="http://www.php.net/md5"><span class="kw3">md5</span></a><span class="br0">&#40;</span><span class="st0">&#8216;password&#8217;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#41;</span><br />
<span class="br0">&#41;</span>;</p>
<p><span class="re0">$serializer</span> = <span class="kw2">new</span> XmlSerializer<span class="br0">&#40;</span><span class="st0">&#8216;response&#8217;</span><span class="br0">&#41;</span>;<br />
<span class="re0">$serializer</span>-&gt;<span class="me1">serialize</span><span class="br0">&#40;</span><span class="re0">$data</span><span class="br0">&#41;</span>;<br />
<a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="re0">$serializer</span>-&gt;<span class="me1">output</span><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span>;<br />
&nbsp;</div>
<p>Ovan resulterar i följande XML:</p>
<div class="dean_ch" style="white-space: wrap;">
&lt;response&gt;<br />
&nbsp; &nbsp; &lt;status&gt;Error&lt;/status&gt;<br />
&nbsp; &nbsp; &lt;data&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;username&gt;Alexander Nyquist&lt;/username&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;password&gt;password&lt;/password&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;apikey&gt;5f4dcc3b5aa765d61d8327deb882cf99&lt;/apikey&gt;<br />
&nbsp; &nbsp; &lt;/data&gt;<br />
&lt;/response&gt;<br />
&nbsp;</div>
<p>Tack o hej!</p>
]]></content:encoded>
			<wfw:commentRss>http://iocore.se/php/serialiseara-array-till-xml/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

