<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-523237888989789073</atom:id><lastBuildDate>Sun, 20 May 2012 05:58:30 +0000</lastBuildDate><category>SOLID</category><category>Principles and Patterns</category><category>VCS</category><category>Git</category><title>solid kod</title><description></description><link>http://www.marcus.solidkod.nu/</link><managingEditor>noreply@blogger.com (Marcus Olsson)</managingEditor><generator>Blogger</generator><openSearch:totalResults>3</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-523237888989789073.post-4489954480762380190</guid><pubDate>Sun, 29 Mar 2009 13:30:00 +0000</pubDate><atom:updated>2009-03-29T16:01:11.641+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Principles and Patterns</category><category domain='http://www.blogger.com/atom/ns#'>SOLID</category><title>Varför man ska följa Liskov Substitution Principle</title><description>Liskov Substitution Principle  (LSP)  säger följande&lt;br /&gt;&lt;br /&gt;"&lt;span style="font-style: italic;"&gt;What is wanted here is something like the following substitution property:&lt;br /&gt;If&lt;/span&gt;&lt;span style="font-style: italic;"&gt; for each object o1 of type S there is an object o2 of type T such that for all&lt;/span&gt; &lt;span style="font-style: italic;"&gt;programs P defined in terms of T, the behavior of P is unchanged when o1 is&lt;/span&gt; &lt;span style="font-style: italic;"&gt;substituted for o2 then S is a subtype of T.&lt;/span&gt;"&lt;br /&gt;BarbaraLiskov, Data Abstraction and Hierarchy, &lt;i&gt;SIGPLAN Notices&lt;/i&gt;, 23,5 (May, 1988).&lt;br /&gt;&lt;br /&gt;Med andra ord så ska en subklass ha samma betende som sin superklassen detta kan annars leda till märkliga beteende och kan vara svårt att hitta vad som egentligen orsakar felet i ett program.&lt;br /&gt;&lt;br /&gt;Detta fick jag och en kollega nyligen erfara när vi jobbar med en produkt som använder sig av .net remoting och en egen implementerad IServerChannelSink för att kryptera data som skickas mellan klient och server.&lt;br /&gt;&lt;br /&gt;Vårt problem var att vi fick ett MethodNotSupportedException när vi gjorde anrop från klienten till servern. Till en början trodde vi att det berodde på att .net cachade proxyn vi använde då vi oftast fick fellen i samband vi gjorde förändringar i kontraktet. Felet kunde helt plötsligt uppstå och sedan försvinna helt utan anledning. Om man debugade så kunde det först smälla och om man körde samma metod en gång till direkt efter så fungerade det. Vi testade att först anropa metoden och sedan fånga exceptionet för att sedan göra samma anrop en gång till som för det mesta gick igenom utan något problem.&lt;br /&gt;&lt;br /&gt;Till slut kom vi fram till att det uppstod när metoden man anropades namn och hur parametrarna man skickade in såg ut. Så tex. om vi skickade in en 8 tecken lång sträng till en metod så slutade den fungera och vi fick MethodNotSupportedException. Om vi anropade samma metod med sju eller nio tecken låg sträng så fungerade det, vi kunde också byta namn på metoden så började det fungera igen. Vi märkte också om man stängde av krypteringen så fungerade det helt felfritt vilket ledde oss till att tro att det var något med krypteringen som ställde till det.&lt;br /&gt;Efter att ha undersökt hur krypteringen fungerar och kommit fram till att vi fick samma resultat på båda klienten och server sidan så vi kunde konstatera att det inte var något med krypteringen i sig. Efter ytterligare testningar så kom vi fram till att det var CryptoStream som kastade exceptionet när en del metoder och propertys anropades på den. Eftersom vi skickade in den som en Stream till ProcessMessage i System.Runtime.Remoting.BinaryServerFormatterSink så antar den att den kan använda strömen som en vanlig Stream. Vi gjorde ingen vidare efterforskning till varför det bara inträffade vid vissa tillfällen utan löste problemet med att läsa över CryptoStreamen till en MemoryStream.&lt;br /&gt;&lt;br /&gt;Att CryptpStrem inte har samma beteende som sin superklass Stream är ett tydligt exempel på att bryta mot LSP och i detta fallet kostade swt oss säkert  20+ timmar och mycket irritation.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_bVG7XWZFgcE/Sc99hdvsVHI/AAAAAAAAAAU/H0lqZDR2-o0/s1600-h/LiskovSubtitutionPrinciple_52BB5162.jpg"&gt;&lt;img style="cursor: pointer; width: 400px; height: 320px;" src="http://3.bp.blogspot.com/_bVG7XWZFgcE/Sc99hdvsVHI/AAAAAAAAAAU/H0lqZDR2-o0/s400/LiskovSubtitutionPrinciple_52BB5162.jpg" alt="" id="BLOGGER_PHOTO_ID_5318607698821665906" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Bild av &lt;a href="http://www.lostechies.com/blogs/derickbailey/archive/2009/02/11/solid-development-principles-in-motivational-pictures.aspx"&gt;Derick Bailey &lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/523237888989789073-4489954480762380190?l=www.marcus.solidkod.nu' alt='' /&gt;&lt;/div&gt;</description><link>http://www.marcus.solidkod.nu/2009/03/varfor-man-ska-folja-liskov.html</link><author>noreply@blogger.com (Marcus Olsson)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_bVG7XWZFgcE/Sc99hdvsVHI/AAAAAAAAAAU/H0lqZDR2-o0/s72-c/LiskovSubtitutionPrinciple_52BB5162.jpg' height='72' width='72'/><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-523237888989789073.post-7332059820143903119</guid><pubDate>Sat, 14 Mar 2009 15:00:00 +0000</pubDate><atom:updated>2009-03-14T15:50:51.957+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Git</category><category domain='http://www.blogger.com/atom/ns#'>VCS</category><title>Första intryck av Git</title><description>Jag har bestämt mig för att se vad allt detta pratet om Git är. Git är ett versions hanterings system (VCS) så som subversion eller CVS. Men med en stor skillnad mot ett vanliga VCS är att man inte har ett centralt repository utan det är distribuerat vilket innebär att alla har ett eget repository lokalt på sin dator sedan kan man synka det med hjälp av en central server. Detta innebär att du inte behöver vara uppkopplad mot någon server för att komma åt en tidigare version av koden du jobbar med. Git hanterar inte filer som vanliga VCSer utan innehållet istället, vilket innebär att den kan följa om en metod har flyttat från en fil till en annan.&lt;br /&gt;&lt;br /&gt;Att installera Git lokalt är busenkelt. Eftersom jag till största del är Windows användare så använde jag &lt;a href="http://code.google.com/p/msysgit/"&gt;MSysGit&lt;/a&gt; för att installera.&lt;br /&gt;De konfigurationer man behöver göra är sätta namn och email.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;prompt&gt;git config --global user.name "Marcus"&lt;br /&gt;prompt&gt;git config --global user.email "myMail@solidkod.nu"&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;För att verifiera inställningarna&lt;br /&gt;&lt;code&gt;&lt;br /&gt;prompt&gt;git config --global --list&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Om man vill ha färgkodning på outputen från Git, fungerar inte i cmd utan man behöver köra Git Bach&lt;br /&gt;&lt;code&gt;&lt;br /&gt;prompt&gt;git config --global color.ui "auto"&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;För att skapa ett repository så ställer man sig på katalogen man vill ha som rot och skriver&lt;br /&gt;&lt;code&gt;&lt;br /&gt;prompt&gt;git init&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Och det är allt som behövs för att skapa ett repository =)&lt;br /&gt;&lt;br /&gt;Så till lite grundläggande kommandon&lt;br /&gt;&lt;br /&gt;För att lägga till en fil och commita den till repositoryt&lt;br /&gt;&lt;code&gt;&lt;br /&gt;prompt&gt;git add myfile.txt&lt;br /&gt;prompt&gt;git commit -m "komentar"&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;För att få ut log från Git&lt;br /&gt;&lt;code&gt;&lt;br /&gt;prompt&gt;git log&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;eller om man bara vill ha ut de sista&lt;br /&gt;&lt;code&gt;&lt;br /&gt;prompt&gt;git log 1&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Än så länge har jag bara kört Git med lokalt repository och det har varit en trevlig upplevelse.&lt;br /&gt;Kommer mer om mina framsteg och upplevelser av Git i senare inlägg.&lt;br /&gt;&lt;br /&gt;/Marcus&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/523237888989789073-7332059820143903119?l=www.marcus.solidkod.nu' alt='' /&gt;&lt;/div&gt;</description><link>http://www.marcus.solidkod.nu/2009/03/forsta-intryck-av-git.html</link><author>noreply@blogger.com (Marcus Olsson)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-523237888989789073.post-5008535552977587884</guid><pubDate>Fri, 06 Mar 2009 11:49:00 +0000</pubDate><atom:updated>2009-03-06T13:07:06.458+01:00</atom:updated><title>Så var det tid...</title><description>att börja blogga på riktigt.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/523237888989789073-5008535552977587884?l=www.marcus.solidkod.nu' alt='' /&gt;&lt;/div&gt;</description><link>http://www.marcus.solidkod.nu/2009/03/sa-var-det-tid.html</link><author>noreply@blogger.com (Marcus Olsson)</author><thr:total>2</thr:total></item></channel></rss>
