<?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>Hvem glor - din bror</title>
	<atom:link href="http://dinbror.dk/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://dinbror.dk/blog</link>
	<description>Den ikke-så-personlige blog af Bjørn Klinggaard</description>
	<lastBuildDate>Tue, 31 Aug 2010 17:42:04 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>bPopup</title>
		<link>http://dinbror.dk/blog/bpopup/</link>
		<comments>http://dinbror.dk/blog/bpopup/#comments</comments>
		<pubDate>Wed, 14 Jul 2010 11:00:08 +0000</pubDate>
		<dc:creator>dinbror</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[bpopup]]></category>
		<category><![CDATA[dialog]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[modal]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[popup]]></category>

		<guid isPermaLink="false">http://dinbror.dk/blog/?p=390</guid>
		<description><![CDATA[bPopup is a learning and exploring jQuery project. It&#8217;s a lightweight cross browser jQuery popup plugin. It&#8217;s not creating your popup but doing all the logic as opening, closing, centering on resize &#38; scroll, creating a modal overlay etc. It can open any container you create with all kinds of content.
bPopup has been tested in [...]]]></description>
			<content:encoded><![CDATA[<p>bPopup is a learning and exploring jQuery project. It&#8217;s a lightweight cross browser jQuery popup plugin. It&#8217;s not creating your popup but doing all the logic as opening, closing, centering on resize &amp; scroll, creating a modal overlay etc. It can open any container you create with all kinds of content.<br />
bPopup has been tested in IE6-8, FF2-3.6, Opera 9-10, Safari 4-5 and Chrome 4-5.</p>
<div style="text-align:center;"><a href="http://dinbror.dk/bpopup"><img class="alignnone size-full wp-image-485" title="DEMO" src="http://dinbror.dk/blog/wp-content/uploads/2010/06/Demobtn3.png" alt="DEMO" width="200" height="100" /></a><a href="http://dinbror.dk/bPopup"></a><a href="http://dinbror.dk/downloads/jquery.bpopup-0.3.6.min.js"><img class="alignnone size-full wp-image-490" title="Download" src="http://dinbror.dk/blog/wp-content/uploads/2010/06/DLbtn6.png" alt="Download" width="200" height="100" /></a></div>
<h3><strong>Contents</strong></h3>
<ol>
<li><a href="#Usage">Usage</a></li>
<li><a href="#Options">Options (API)</a></li>
<li><a href="#Changelist">Changelist</a></li>
<li><a href="#WhatCanYouDo">What can you do?</a></li>
<li><a href="#Downloads">Downloads</a></li>
</ol>
<h3 id="Usage">Usage</h3>
<p>This is a really simplified example. For using bPopup I recommend that you&#8217;re familiar with HTML and CSS.</p>
<p><strong>Scripts to include:</strong></p>
<pre>&lt;<span>script</span><span> type</span>=<span>"text/javascript" </span><span>src</span><span>="
   </span><a href="view-source:http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js">http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js</a><span>"</span>&gt;&lt;/<span>script</span>&gt;
&lt;<span>script</span><span> type</span>=<span>"text/javascript" </span><span>src</span><span>="</span><a href="view-source:http://dinbror.dk/downloads/jquery.bpopup-0.3.6.min.js">jquery.bpopup-0.3.6.min.js</a><span>"</span>&gt;&lt;/<span>script</span>&gt;</pre>
<p><strong>HTML:</strong></p>
<pre>&lt;html&gt;
  &lt;head&gt; HeadContent ... &lt;/head&gt;
  &lt;body&gt;
    BodyContent
    ...
    &lt;a id="click" href="some url"&gt;Click here&lt;/a&gt;
    &lt;div id="div_to_popup"&gt;Content of Popup&lt;/div&gt;
  &lt;/body&gt;
&lt;/html&gt;</pre>
<p><strong>CSS:</strong></p>
<pre>#div_to_popup {display:none;}</pre>
<p><strong>The magic:</strong></p>
<pre><span>$(document).ready(function(){
   </span>$("a#click").bind('click', function(){
      $("#div_to_popup").openPopup();
      return false
   });<span> </span>
<span>});
</span></pre>
<p>Or with custom settings</p>
<pre><span>$(document).ready(function(){</span>
   $("a#click").bind('click', function(){<span>
      </span><span>$("#div_to_popup").openPopup({appendTo:'form', zIndex: 2});
   });
</span><span>});</span></pre>
<p id="Options">Enjoy</p>
<h3>Options</h3>
<table style="height: 50px; border: 0px none; width: 595px;" border="0">
<tbody>
<tr>
<td style="background-color: #888;" colspan="2"><span style="color: #ffffff;"><strong>API   – name [<em>type</em>] (default value)</strong></span></td>
</tr>
<tr>
<td width="200"><strong>amsl</strong><strong> </strong>[<em>int</em>] (150)</td>
<td>Above Mean Sea Level. Vertical distance from the middle of the window, + = above, &#8211; = under.</td>
</tr>
<tr>
<td width="200"><strong>appendTo </strong>[<em>string</em>] (’body’)</td>
<td>Element   to append popup (and modal overlay) to. For asp.net sites append to &#8216;form&#8217;.</td>
</tr>
<tr>
<td width="200"><strong>closeClass</strong> [<em>string</em>] (&#8217;bClose&#8217;)</td>
<td>Class to bind the close event to. <strong>Version 0.3.3</strong></td>
</tr>
<tr>
<td width="200"><span style="text-decoration: line-through;"><strong>duration</strong></span> [<em>int/string</em>] (&#8217;normal&#8217;)</td>
<td>Animation speed. <span style="color: #ff0000;"><strong>Removed in version 0.3.6</strong></span></td>
</tr>
<tr>
<td width="200"><strong>escClose</strong> [<em>boolean</em>] (true)</td>
<td>Should popup close when press on escape?</td>
</tr>
<tr>
<td width="200"><strong>fadeSpeed</strong> [<em>int</em>/string] (250)</td>
<td>Animation speed on fadeIn/out. <strong>Version 0.3.6</strong></td>
</tr>
<tr>
<td width="200"><strong>follow</strong> [<em>boolean</em>] (true)</td>
<td>Should the popup follow the screen on scroll/resize? <strong>Version 0.3.6</strong></td>
</tr>
<tr>
<td width="200"><strong>followSpeed</strong> [<em>int/string</em>] (500)</td>
<td>Animation speed for the popup on scroll/resize. <strong>Version 0.3.6</strong></td>
</tr>
<tr>
<td width="200"><strong>loadUrl</strong> [<em>string</em>] (null)</td>
<td>External page or selection to load in popup.  <strong>Version 0.3.4</strong></td>
</tr>
<tr>
<td width="200"><span style="text-decoration: line-through;"><strong>minTop</strong></span> [<em>int</em>] (20)</td>
<td>Minimum distance from top to popup. <span style="color: #ff0000;"><strong>Removed in version 0.3.6</strong></span></td>
</tr>
<tr>
<td width="200"><strong>modal</strong> [<em>boolean</em>] (true)</td>
<td>Should there be a modal overlay behind the popup?</td>
</tr>
<tr>
<td width="200"><strong>modalColor</strong> [<em>string</em>] (&#8217;#000&#8242;)</td>
<td>Which color should the overlay be? <strong>Version 0.3.5</strong></td>
</tr>
<tr>
<td width="200"><strong>opacity</strong> [<em>float</em>] (0.5)</td>
<td>Transparency, from 0.1 to 1.0 (filled). <strong>Version 0.3.3</strong></td>
</tr>
<tr>
<td width="200"><strong>scrollBar</strong> [<em>boolean</em>] (true)</td>
<td>Should scrollbar be visible?</td>
</tr>
<tr>
<td width="200"><strong>vStart</strong> [<em>int</em>] (null)</td>
<td>Vertical start position for popup. <strong>Version 0.3.6</strong></td>
</tr>
<tr>
<td width="200"><strong>xLink</strong> [<em>boolean</em>] (false)</td>
<td>Is the popup a xlink popup? <strong>Version 0.3.4</strong></td>
</tr>
<tr>
<td width="200"><strong>zIndex</strong> [<em>int</em>] (9999)</td>
<td>Popup z-index, modal overlay = popup z-index &#8211; 1.</td>
</tr>
</tbody>
</table>
<h3 id="Changelist">Changelist</h3>
<p><strong>0.3.6 changelist:<br />
</strong></p>
<ul>
<li>New options: fadeSpeed, follow, followSpeed, vStart</li>
<li>Deleted: duration, minTop</li>
<li>Included position:absolute styling on popup in plugin</li>
</ul>
<p><strong>0.3.5 changelist:<br />
</strong></p>
<ul>
<li>New option: modalColor</li>
<li>bPopup can now take callback functions</li>
</ul>
<p><strong>0.3.4 changelist:<br />
</strong></p>
<ul>
<li>New option: loadUrl</li>
<li>The popup can now open an url inside the popup</li>
<li>Implemented x-link feature</li>
<li>Refactored code, created private help functions</li>
<li>Changed default value for scrollBar to true</li>
</ul>
<p><strong>0.3.3 changelist:<br />
</strong></p>
<ul>
<li>New options: opacity, closeClass</li>
<li>Changed modal overlay to position fixed in supported browsers. Non position fixed supported browsers still uses position absolute.</li>
<li>Added default close event</li>
<li>Fixed issue with overlay in IE6+7 and body positioned relative with a width</li>
</ul>
<p><strong>0.3.2 changelist:<br />
</strong></p>
<ul>
<li>Modal overlay width miscalculation on resize.</li>
<li>Auto textfield focus</li>
<li>Resetting textfields before showing popup</li>
</ul>
<p><strong>0.3.1 changelist:<br />
</strong></p>
<ul>
<li>New options: escClose, zIndex and minTop.</li>
<li>Fixed bug with modal overlay when body has position: relative and a  width. Now calculates the distance from the left to the body.</li>
</ul>
<p><strong>0.3.0 changelist:</strong></p>
<ul>
<li>Unbind events on close.</li>
<li>Centering popup on resize.</li>
<li>Centering popup on horizontal scroll.</li>
<li>Refactor code.</li>
</ul>
<h3 id="WhatCanYouDo">What can you do?</h3>
<ul>
<li>Report bugs</li>
<li>Help optimizing code</li>
<li>Give suggestions</li>
</ul>
<h3 id="Downloads">Downloads</h3>
<p><a href="../../downloads/jquery.bpopup-0.3.6.js">v 0.3.6  developer</a><span style="text-decoration: line-through;"><br />
</span><a href="../../downloads/jquery.bpopup-0.3.6.min.js">v 0.3.6 minified</a><span style="text-decoration: line-through;"><br />
v 0.3.6 custom</span><a href="http://dinbror.dk/downloads/jquery.bpopup-0.3.5.js"><br />
v 0.3.5 developer</a><a href="http://dinbror.dk/downloads/jquery.bpopup-0.3.5.min.js"><br />
v 0.3.5 minified</a><br />
<span style="text-decoration: line-through;">v 0.3.5 custom</span></p>
]]></content:encoded>
			<wfw:commentRss>http://dinbror.dk/blog/bpopup/feed/</wfw:commentRss>
		<slash:comments>39</slash:comments>
		</item>
		<item>
		<title>ASP.NET Ajax asynkront postback jQuery problem</title>
		<link>http://dinbror.dk/blog/asp-net-ajax-asynkront-postback-jquery-problem/</link>
		<comments>http://dinbror.dk/blog/asp-net-ajax-asynkront-postback-jquery-problem/#comments</comments>
		<pubDate>Mon, 19 Apr 2010 19:04:08 +0000</pubDate>
		<dc:creator>dinbror</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[asynkront]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[postback]]></category>

		<guid isPermaLink="false">http://dinbror.dk/blog/?p=379</guid>
		<description><![CDATA[Problem: $(document).ready() bliver normalt kaldt, når DOM er klar til at blive manipuleret, men det sker ikke efter, at et UpdatePanel renderer efter et asynkront postback. Det resulterer i, at man mister funktionaliteten, som der skulle være afviklet i $(document).ready().
Løsning: Der findes adskillige work-a-rounds, men fra og med jQuery 1.3 tager jQuery selv hånd om [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Problem:</strong> <code><a href="http://www.learningjquery.com/2006/09/introducing-document-ready">$(document).ready()</a></code> bliver normalt kaldt, når DOM er klar til at blive manipuleret, men det sker ikke efter, at et <a href="http://www.asp.net/Ajax/Documentation/Live/overview/UpdatePanelOverview.aspx"><em>UpdatePanel</em></a> renderer efter et asynkront postback. Det resulterer i, at man mister funktionaliteten, som der skulle være afviklet i <code>$(document).ready()</code>.</p>
<p><strong>Løsning:</strong> Der findes adskillige<em> work-a-rounds</em>, men fra og med jQuery 1.3 tager jQuery selv hånd om sagen og stiller eventen <a href="http://api.jquery.com/live/#typefn">live()</a> til rådighed. Live() sørger for at dine events altid er klar.</p>
<p>Så i stedet for at bruge den &#8220;normale&#8221; <a href="http://api.jquery.com/click/">click()</a></p>
<pre>$(document).ready(function(){
  <span style="text-decoration: line-through;">$("a#klikMig").click(function(event){
     alert("Klik");
   });</span>
 });</pre>
<p>Skal du bruge live(), og sikre dermed at dine events også virker efter et asynkront postback</p>
<pre>$(document).ready(function(){
   $('a#klikMig').live('click', function() {
      alert("Klik");
   });
});</pre>
]]></content:encoded>
			<wfw:commentRss>http://dinbror.dk/blog/asp-net-ajax-asynkront-postback-jquery-problem/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Sådan laver du hurtigere websider</title>
		<link>http://dinbror.dk/blog/sadan-laver-du-hurtigere-websider/</link>
		<comments>http://dinbror.dk/blog/sadan-laver-du-hurtigere-websider/#comments</comments>
		<pubDate>Tue, 13 Apr 2010 20:30:17 +0000</pubDate>
		<dc:creator>dinbror</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[browsere]]></category>
		<category><![CDATA[CSS sprites]]></category>
		<category><![CDATA[guide]]></category>
		<category><![CDATA[HTTP-request]]></category>
		<category><![CDATA[minify]]></category>
		<category><![CDATA[optimering]]></category>
		<category><![CDATA[stylesheet]]></category>

		<guid isPermaLink="false">http://dinbror.dk/blog/?p=310</guid>
		<description><![CDATA[Efter påpegelse af Niels Gamborg og i forlængelse af mit forrige indlæg Sådan laver du perfekt CSS kommer her en tilføjelse, som omhandler performance aspektet. Selvfølgelig skal man ikke være ligeglad med performance, hvorfor man skal huske at optimere sine websider. Hvis det ikke er for din egen skyld og/eller pengepung, så for at brugerne [...]]]></description>
			<content:encoded><![CDATA[<p>Efter påpegelse af <a href="http://www.nielsgamborg.dk/">Niels Gamborg</a> og i forlængelse af mit forrige indlæg<strong> <a href="http://dinbror.dk/blog/css-sadan-laver-du-perfekt-css/">Sådan laver du perfekt CSS</a></strong> kommer her en tilføjelse, som omhandler performance aspektet. Selvfølgelig skal man ikke være ligeglad med performance, hvorfor man skal huske at optimere sine websider. Hvis det ikke er for din egen skyld og/eller pengepung, så for at brugerne får en bedre (og hurtigere) oplevelse. Ligeledes tyder det desuden på, at <a href="http://googlewebmastercentral.blogspot.com/2010/04/using-site-speed-in-web-search-ranking.html">Google</a> vil (og til dels allerede gør) vægte hurtigere hjemmesider højere.<br />
Jeg har opstillet nogle simple punkter, som gerne skulle hjælpe med at opnå hurtigere indlæsningstider på dine websider.</p>
<h3>0: Minimer HTTP-requests</h3>
<p>Jo færre requests jo bedre. Den største og nok nemmest måde at reducere dine indlæsningstider på dine websider ligger i antallet af HTTP-requests, hvorfor du skal eliminere unødvendige requests.</p>
<p><strong>Hvorfor</strong><br />
Browsere bruger i dag cirka 80% af deres tid på at hente eksterne filer såsom stylesheets, scripts, billeder etc. Hver fil er lig med et request, dog henter browsere disse requests parallelt (på nær script-filerne), og alt afhængig af browser, kan de have x antal forbindelser kørende på samme host på samme tid.  Herunder er opstillet nogle eksempler på, hvor mange forbindelser per host samt max forbindelser de mest benyttede browsere kan håndtere:</p>
<pre><strong>    Browser </strong>          |   <strong>Connection per hostname</strong>   |   <strong>Max connections</strong>
Internet Explorer 8                   6                        57
Chrome 4                              6                        55
Chrome 5                              6                        40
Firefox 3.5+3.6                       6                        30
Safari 4                              5                        60
Opera 10                              4                        20
Internet Explorer 7                   2                        60
Internet Explorer 6                   2                        56</pre>
<p>Andre browsere og flere detaljer omkring de enkelte browsere kan findes på <a href="http://www.browserscope.org/">browserscope</a>, som er et open source projekt startet af <a href="http://stevesouders.com/">Steve Souders</a> og Lindsey Simon.</p>
<p><strong>Hvordan</strong><br />
Ja nu ved vi, hvorfor det er en god ide at minimere HTTP-requests, men hvordan gør vi det egentlig i praksis?<br />
Der findes flere måder at gøre det på. Jeg vil her præsentere 2 måder, som jeg selv finder nyttige, brugbare og bruger til dagligt.</p>
<p style="padding-left: 30px;">a) <strong>Kombinerede filer</strong>: Så snart det er muligt, skal man kombinere sine scripts og stylesheets således, at alle ens stylesheets bliver samlet i en fil og ligeledes med sine scripts. På denne måde kan man spare requests.<br />
Det kan dog være svært, hvis scripts og stylesheets varierer meget fra side til side. Her må man gå ind og vurdere den enkelte situation, og kigge på hvad der mest gavner indlæsninghastigheden. Man skal være opmærksom på, at fx billeder i stylesheets også generer requests, så hvis tendensen på din side <span style="text-decoration: underline;">ikke</span> er, at brugeren besøger mange sider, og du har meget forskelligt styling fra side til side, kan man spare requests ved at benytte sig af en side-modulær CSS opbygning. Men som tommelfingerregel skal man samle sine stylesheets samt scripts i en fil.</p>
<p style="padding-left: 30px;">b) <strong>CSS Sprites</strong>: CSS Sprites reducerer antallet af billede requests. Kort fortalt går det ud på, at man samler flere af sine billeder i et billede, og vha. <em>background-position</em> styre hvilken sekvens af billedet, man vil vise. Hvis du ikke kender til sprites, kan du læse mere omkring emnet her:</p>
<p style="padding-left: 60px;">-  <a href="http://www.alistapart.com/articles/sprites/">CSS Sprites: Image Slicing’s Kiss of Death af David Shea</a></p>
<p style="padding-left: 60px;">-  <a href="http://www.smashingmagazine.com/2009/04/27/the-mystery-of-css-sprites-techniques-tools-and-tutorials/">The Mystery Of CSS Sprites af Sven Lennartz</a></p>
<p style="padding-left: 60px;">-  <a href="http://css-tricks.com/css-sprites/">CSS Sprite: What they are &#8230; af Chris Coyier</a></p>
<p style="padding-left: 30px;">Eller kigge nærmere på hvordan jeg har lavet min top menu.</p>
<p style="padding-left: 30px;">
<h3>1: Placerer stylesheets i toppen</h3>
<p>Der er to grunde til at placerer stylesheets i toppen.</p>
<ol>
<li><a href="http://www.w3schools.com/css/css_howto.asp">W3</a> dikterer, at stylesheets skal være i toppen (<em>head</em>), medmindre det er<em> inline-styling</em>.</li>
<li>Ved at placere stylesheets i toppen opnår man, at ens side loader progressivt, hvilket er vigtigt, hvis din side har meget indhold, eller brugeren sidder bag en langsom forbindelse. Siden viser indholdet så snart, det er klart, og brugeren har en indikation af, at siden er ved at loade. Denne indikation er meget vigtig for <a href="http://www.useit.com/papers/responsetime.html">brugervenligheden</a>. Hvis man derimod indsatte stylesheets nær bunden, ville man i mange browsere (eksempelvis Internet Explorer) miste den progressiv hentning og stå tilbage med en hvid blank side, da browsere blokerer renderingen for at forhindre at skulle gentegne elementer, der måtte ændre sig.</li>
</ol>
<h3>2: Placerer scripts i bunden</h3>
<p>Grunden til at scripts skal være i bunden er, at scripts blokerer for den parallelle hentning, hvorfor resten af dit indhold må vente til scriptet er færdighentet. Derfor placerer altid dine scripts i bunden, når det er muligt. Der findes selvfølgelig situationer, hvor du ikke kan, fx hvis du indsætter markup via <code>document.write</code>, hvilket jeg dog ikke er den store fan af eller initialisere ting i dit script i den øvre del af dit HTML dokument.</p>
<h3>3: Stylesheets og scripts skal være eksterne</h3>
<p>Nu kommer jeg til at modsige mig selv, men der er en mening med galskaben. I første punkt fik du at vide, at du skulle spare på HTTP-requests, og undgå dem så snart det var muligt, men nu fortæller jeg dig, at du skal gemme dine stylesheets samt scripts eksternt frem for at gemme dem<em> inline</em>, og dermed generer et ekstra request per fil. Igen kommer det an på situationen, men oftest er der mest at hente ved at gemme dem eksternt. Ved at gemme dem eksternt bruger du som sagt et ekstra request per fil, men da browsere<em> cacher</em> filerne, kan det være en fordel, hvis du eksempelvis bruger de samme filer på flere sider. Ved at gemme dem <em>inline</em> spare du det ekstra request, men HTML dokumentet bliver tungere, og filerne bliver indlæst ved hver <em>page load</em>. Når dine filer derimod er <em>cachet</em> generer de ikke et ekstra request og HTML dokumentet er ligeledes lettere.</p>
<h3>4: Minify</h3>
<p>Ved at <em>minify</em> sine stylesheets og scripts fjerner man unødvendige tegn og luft, og gør dem derved lettere at hente. Der findes forskellige værktøjer til at <em>minify</em> med:</p>
<ol>
<li><a href="http://developer.yahoo.com/yui/compressor/">YUI Compressor</a>: YUI er et af de mest kendte og mest effektive <em>minify</em> værktøjer. Det er skrevet i <a href="http://en.wikipedia.org/wiki/Java_%28programming_language%29">Java</a>, og man skal afvikle det på sin computer. Det gode ved YUI er selvfølgelig den effektive algoritme som <em>minify</em>er, men også at den kan <em>minify</em> scripts såvel som stylesheets.<a href="http://developer.yahoo.com/yui/compressor/"> </a></li>
<li><a href="http://www.csscompressor.com/">CSS Compressor</a>: Online værktøj, som kan <em>minify</em> dit CSS ud fra forskellige indstillinger.</li>
<li><a href="http://closure-compiler.appspot.com/home">Closure compiler</a>: Googles svar på et script <em>minify</em> værktøj, som eftersigende skulle være bedre end YUI. <em>Compileren</em> kan både downloades eller benyttes online samt indstilles efter behov og temperament.</li>
</ol>
<h3>5: Fjern duplikater</h3>
<p>Punktet burde egentligt ikke have været med på listen, da det giver sig selv. Men jeg har set steder, hvor de stadig forekommer, duplikater af scripts. Ved at have duplikater forøges indlæsningstiden. Internet Explorer laver et ekstra unødvendigt request, hvorimod Firefox godt kan se, at det er det samme script. Dog spilder begge browsere tid på at evaluere scriptet to gange, så undgå at have duplikerende scripts.</p>
<h3>6: Reducer DOM-elementer</h3>
<p>En tommelfingerregel er, at jo flere elementer du har på en side, jo tungere er den at renderer. Sørg derfor altid for at have så ren og meningsfuld<em> markup</em> som muligt. Mange elementer på en side gør det ligeledes sværere for JavaScript at tilgå dem. En måde du kan undersøge, hvor mange elementer en side har, er ved hjælp af <a href="http://www.getfirebug.com">Firebug</a>. Skriv blot følgende i konsol vinduet:</p>
<pre>document.getElementsByTagName('*').length</pre>
<h3>7: Brug dine subdomæner</h3>
<p><a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.1.4">HTTP   1.1 specifikationen</a> anbefaler, at browsere ikke downloader mere  end 2 komponenter parallelt  per host. Ved at gemme dine billeder på flere  forskellige hosts, kan du opnå mere end 2 parallelle downloads ad gangen, og dermed gøre din side hurtigere. Steve Souders har lavet et lille <a href="http://stevesouders.com/efws/domains1.php">eksempel</a>, hvor han illustrerer forskellen på at gemme sine billeder på et host kontra to.</p>
<h3>8: Undgå @import</h3>
<p>Brug <code>&lt;link /&gt;</code> frem for @import. Internet Explorer opfatter filer indsat ved hjælp af @import som link-tags, der er indsat i bunden af siden.</p>
<h3>9: Undgå filters</h3>
<p>Hvis du vil have transparente png billeder i Internet Explorer 6, kan du bruge Microsofts eget filter, <a href="http://msdn.microsoft.com/en-us/library/ms532969%28VS.85%29.aspx">AlphaImageLoader</a>. Dette er dog ikke anbefalingsmækværdi! Problemet ligger i at filteret blokerer rendering af siden og fryser browservinduet, mens billedet bliver hentet. Filteret forøger ligeledes brugen af computerens hukommelse. Undgå derfor at bruge dem, og brug i stedet gif eller png8 billeder eller nogle af de andre alternativer der findes, hvis du vil understøtte semi-transparente billeder i IE6.</p>
<h3>10: Undgå tomme billede referencer</h3>
<p>Tomme billede referencer resulterer i ekstra og nytteløse serverkald:</p>
<pre>&lt;img src="" alt="Tomt billede reference" /&gt;</pre>
<p>Nicholas C. Zakas har skrevet en udmærket <a href="http://www.nczonline.net/blog/2009/11/30/empty-image-src-can-destroy-your-site/">artikel</a>, der beskriver problemet rigtig godt.</p>
<h3>11: Komprimerer dine billeder</h3>
<p>Hvis du som jeg ikke altid selv klipper dit grafik og dermed gemmer det, kan der opnås store besparelser ved selv at genkomprimerer billederne. Uden at slå alle designer over en kam, så tænker de ikke på størrelsen.</p>
<h3>12: Komprimerer dine komponenter</h3>
<p>GNU zip eller også kaldet <a href="http://en.wikipedia.org/wiki/Gzip">gzip</a> er en komprimeringsmetode, som kan spare dig adskillige kilo bytes og dermed minimere svar tiderne. Vel og mærket hvis server samt klient understøtter det. Fra og med HTTP/1.1 er web-klienter begyndt at understøtte komprimering med Accept-Encoding i headeren af HTTP-request&#8217;et, fx:</p>
<pre>Accept-Encoding: gzip, deflate</pre>
]]></content:encoded>
			<wfw:commentRss>http://dinbror.dk/blog/sadan-laver-du-hurtigere-websider/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>CSS: Sådan laver du perfekt CSS</title>
		<link>http://dinbror.dk/blog/css-sadan-laver-du-perfekt-css/</link>
		<comments>http://dinbror.dk/blog/css-sadan-laver-du-perfekt-css/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 23:33:27 +0000</pubDate>
		<dc:creator>dinbror</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[andy clarke]]></category>
		<category><![CDATA[guide]]></category>
		<category><![CDATA[hacks]]></category>
		<category><![CDATA[navngivning]]></category>
		<category><![CDATA[reset]]></category>
		<category><![CDATA[shortcase]]></category>
		<category><![CDATA[struktur]]></category>
		<category><![CDATA[stylesheet]]></category>
		<category><![CDATA[styling]]></category>

		<guid isPermaLink="false">http://dinbror.dk/blog/?p=133</guid>
		<description><![CDATA[Igennem mit arbejde og efter kraftig inspiration af Andy Clarke har jeg fundet den &#8220;perfekte&#8221; måde at lave CSS og markup på. I denne artikel vil jeg forsøge kun at koncentrerer mig omkring CSS delen og give dig opskriften, som tager udgangspunkt i solskinsdage. Til den dovne læser har jeg lavet et kort resume til [...]]]></description>
			<content:encoded><![CDATA[<p>Igennem mit arbejde og efter kraftig inspiration af <a href="http://www.stuffandnonsense.co.uk/">Andy Clarke</a> har jeg fundet den &#8220;perfekte&#8221; måde at lave <a title="Hvad er CSS?" href="http://www.w3schools.com/Css/default.asp">CSS</a> og markup på. I denne artikel vil jeg forsøge kun at koncentrerer mig omkring CSS delen og give dig opskriften, som tager udgangspunkt i solskinsdage. Til den dovne læser har jeg lavet et kort resume til sidst under hvert punkt.</p>
<h3>0:  Markup</h3>
<p>Lav altid dit markup før du begynder at style. Sørg for at den er <a href="http://validator.w3.org/">valid</a>, og at den er semantisk opbygget. En god tommelfingerregel er, at ens markup skal give mening uden brug af CSS.</p>
<p><strong>Resume</strong>: <em><span style="color: #0000ff;">Markup før CSS!</span></em></p>
<h3>1: Validering</h3>
<p>Ligesom med dit markup skal dit CSS være valid. Hvis du er i tvivl, kan du validere dine <em>stylesheets</em> via <a title="W3 CSS validator" href="http://jigsaw.w3.org/css-validator/" target="_self">W3&#8217;s CSS validator</a>. Mange undervurderer vigtigheden af valid kode, så længe det bare ser ud, som det skal. Men ved ikke at have valid kode, kan man ikke være sikker på, at ens websider vil blive vist rigtigt i fremtiden, og at mindre og alternative fremvisere kan vise dit indhold. Hvis ingen fulgte en vis standard ville <a href="http://da.wikipedia.org/wiki/Chaos">khaos</a> regerer.</p>
<p><strong>Resume</strong>: <em><span id="reset" style="color: #0000ff;">Lav valid kode!</span></em></p>
<h3>2: Normalisering</h3>
<p>Normaliserer altid dit <em>stylesheet</em> inden du går i gang. Forskellige browsere har forskellige <a href="http://en.wikipedia.org/wiki/Default_%28computer_science%29"><em>default</em></a> værdier til de forskellige elementer, hvorfor det til tider kan være umuligt at lave en side, der opfører sig ens <a title="Cross-browser" href="http://en.wikipedia.org/wiki/Cross-browser">cross-browser</a> uden brug af reset. Hvor meget eller hvor lidt der skal resettes er en temperamentssag. Herunder er listet nogle eksempler:</p>
<ol>
<li><a href="http://meyerweb.com/eric/thoughts/2007/05/01/reset-reloaded/">CSS Reset Reloaded</a> by Eric Meyer</li>
<li><a href="http://developer.yahoo.com/yui/reset/">Yahoo! UI Library: Reset CSS</a></li>
<li><a href="http://warpspire.com/features/css-frameworks/">CSS Global Styles Reset</a> by Kyle Neath</li>
</ol>
<p>Være opmærksom på at det korte og brugte reset: <strong>* { margin: 0; padding: 0; } </strong> er et misforstået reset. Det er tungere at renderer (især med store websider), da det definerer regler for hvert enkelt element i ens dokument og nulstiller alt, hvorfor det <span style="text-decoration: underline;">ikke</span> er anbefalingsværdigt.</p>
<p><strong>Resume</strong>:<em> <span id="strukturel" style="color: #0000ff;">Reset dit stylesheet før start!</span></em></p>
<h3>3: Navngivning</h3>
<p>Navngivning er utrolig vigtig og desværre også utrolig undervurderet. Uanset hvad du vælger så vær konsekvent. Hold dig evt. til engelsk, brug <a href="http://en.wikipedia.org/wiki/CamelCase">camelCaseMedLilleBegyndelsebogstav</a> og giv strukturelle navne frem for <span id="result_box"><span style="background-color: #ffffff;" title="presentational">præsentationsmæssige</span></span>.<br />
Et strukturalt navn beskriver, hvad det er for et element, du vil henvise til frem for et præsentationsmæssigt navn, som beskriver, hvor elementet befinder sig på siden eller hvordan det ser ud.</p>
<p><span style="background-color: #ffffff;" title="presentational">Præsentationsmæssige navne:<br />
</span></p>
<pre><span style="text-decoration: line-through;">topNav, leftTopLogo, footer, leftContent, redBoldLink</span></pre>
<p>Strukturelle navne:</p>
<pre><span style="color: #0000ff;">primaryNav, branding, siteInfo, mainContent, externalLink</span></pre>
<p>De præsentationsmæssige navne låser elementet fast, hvorfor de skal undgås. Hvad nu hvis din top menu (#topNav) pludselig skal ligge til venstre for dit indhold?</p>
<p><strong>Resume</strong>: <span id="strutureret" style="color: #0000ff;"><em>Vær konsekvent og brug camelCaseMedLilleBegyndelsebogstav samt strukturelle navne i din navngivning.</em></span></p>
<h3>4: Struktur</h3>
<p>Ens struktur kan virke utrolig ligegyldig og spild af tid hos mange, men er faktisk et af de vigtigste punkter i perfekt CSS. For din egen skyld, for kundens skyld og for fremtidige udvikleres skyld sørg for at have struktur i dit CSS. Som med navngivningen er det vigtigt at være konsekvent.</p>
<p>a)<strong> Inddel dit <em>stylesheet</em> i afsnit</strong>, fx via sektioner eller <em>selectors</em>.</p>
<pre><span style="color: #0000ff;">/****** STRUCTURE  ******/</span>
#branding, #primaryNav, #mainContent...
<span style="color: #0000ff;">/****** HEADERS  ******/</span>
h1, h2, h3 ...
<span style="color: #0000ff;">/****** ANCHORS  ******/</span>
a, a:hover ...
etc</pre>
<p>b)<strong> Et element pr. linje</strong>.</p>
<pre><span style="color: #0000ff;">#element 1</span> { egenskab 1, egenskab 2 ... egenskab n }
<span style="color: #0000ff;">#element 2</span> { egenskab 1, egenskab 2 ... egenskab n }</pre>
<p>Mange vil måske være uenige, og hælder til den mere fyldige og måske mere overskuelige-ved-første-blik-måde; <em>en egenskab pr. linje</em>:</p>
<pre><span style="text-decoration: line-through;">#element 1 {
    egenskab 1;
    egenskab 2;
    ...
    egenskab n
}</span></pre>
<p>Men her må jeg insister. Min erfaring er, at ved større projekter bliver <em>stylesheets</em> hurtigt store og uoverskuelige ved <em>en egenskab pr. linje</em>, også selvom man deler det op og har et <em>stylesheet</em> pr. side.</p>
<p>c)<strong> Undlad hierarkier i niveauer</strong></p>
<p>Jeg har set folk anbefale, at man inddeler sit <em>stylesheet</em> i et niveau-hierarki, som afspejler sit markup:</p>
<pre><span style="text-decoration: line-through;">div#element { egenskab 1, egenskab 2 ... egenskab n }
  ul { egenskab 1, egenskab 2 ... egenskab n }
    li { egenskab 1, egenskab 2 ... egenskab n }
      a { egenskab 1, egenskab 2 ... egenskab n }</span></pre>
<p>Ideen er rigtig god, men forvirrer mere end den gavner. Desuden kræver det mere vedligeholdelse. Hver gang du ændre det mindste i dit markup, skal du ind og opdatere dit CSS, så de afspejler hinanden.</p>
<p>d) <strong>Opstil dine egenskaber i alfabetisk rækkefølge</strong> for at få et hurtigere overblik:</p>
<pre>#element { <span style="color: #0000ff;">float: left; height: 250px; width: 250px;</span> }</pre>
<p>e) <strong>Vis type på dit element (unikke)</strong>, igen for overblikkets skyld:</p>
<pre><span style="color: #0000ff;">div</span>#element 1 { egenskab 1, egenskab 2 ... egenskab n }
<span style="color: #0000ff;">ul</span>#element 2 { egenskab 1, egenskab 2 ... egenskab n }</pre>
<p>f) <strong>Kombinere elementer med samme regler</strong>. For at undgå redundans skal man samle elementer med samme egenskaber:</p>
<pre><span style="color: #0000ff;">div#element 1, p#element 2</span> { egenskab 1, egenskab 2 ... egenskab n }</pre>
<p><strong>Resume</strong>: <span style="color: #0000ff;"><em>Vær struktureret og konsekvent. Inddel i afsnit, et element pr. linje, sortere egenskaber alfabetisk, illustrer type på dit element og kombinere elementer med samme egenskaber. </em></span></p>
<h3>5: Shortcase</h3>
<p>Brug <em>shortcase</em>. Du kan formindske din kode betydeligt og derved få et bedre overblik. Et eksempel illustrer guleroden meget bedre:</p>
<pre>div#element 1 { margin-bottom: 15px; margin-left: 5px; ...
                ... margin-right: 20px; margin-top: 10px; }</pre>
<p>bliver til</p>
<pre>div#element 1 { <span style="color: #0000ff;">margin: 10px 20px 15px 5px;</span> }</pre>
<p>Du kan bruge <em>shortcase</em> hos følgende egenskaber; <em>background, border, font, list, margin, outline</em> og <em>padding</em>. <a href="http://www.dustindiaz.com/css-shorthand/">Dustin Diaz</a> har skrevet en fremragende guide til emnet.</p>
<p><strong>Resume</strong>: <span style="color: #0000ff;"><em>Brug shortcase!<br />
</em></span></p>
<h3>6: Spring mellemledet over</h3>
<p>Som i den virkelige verden er det oftest bedst for forbrugeren, at mellemledet bliver fjernet, og det er det også hos CSS. Mellemledet er ofte ubrugeligt og fylder kun ekstra i dit <em>stylesheet</em>, hvorfor det skal fjernes. Der findes dog situationer, hvor du kan blive tvungen til at inkluderer det men som udgangspunkt; <em>fjern det</em>:</p>
<pre>div#element ul li a span.class</pre>
<p>bliver til</p>
<pre><span style="color: #0000ff;">.class</span> eller <span style="color: #0000ff;">div#element .class</span> hvis man har behov for at specificere det lidt</pre>
<p><strong>Resume</strong>: <span style="color: #0000ff;"><em>Undgå unødvendige elementer hos en regel!<br />
</em></span></p>
<h3>7: Flere stylesheets</h3>
<p>Det kan være en god ide at have flere mindre <em>stylesheets</em> end kun et samlet, specielt når man udvikler. Udover at det giver et bedre overblik, kan man også undgå at skulle indlæse alle regler på sider, de ikke vedkommer, og have muligheden for at overskrive en regel, som ellers ville forstyrre ens underside eller kræve ekstra og unødvendig markup.<br />
Nogle deler desuden deres <em>stylesheets</em> op i <em>selectors</em>, hvorfor de har et til <em>headers</em>, et til links, et til billeder etc. men det er en smule<em> overkill</em> og gavner ikke just overskueligheden. Desuden resulterer det i en masse ekstra <em>http-requests</em> og dermed længere <em>load time</em>, medmindre man samler og eventuelt <a href="http://en.wikipedia.org/wiki/Minification_%28programming%29"><em>minify</em></a>&#8216;er sit <em>stylesheet</em>, inden man skubber det live. Igen skal opdelingen kun ske, når det giver mening og eventuelt kun i udviklingsøjeblikket.<br />
Ved større projekter har jeg et generelt <em>stylesheet</em>, hvor der defineres de generelle regler inklusiv <a href="#reset">reset</a>, og så et pr. underside med de specifikke regler. Selvfølgelig alle i et <a href="#strutureret">strutureret <em>stylesheet</em></a>.</p>
<p><strong>Resume</strong>: <span style="color: #0000ff;"><em>Adskil i flere stylesheets, men kun når det giver mening!<br />
</em></span></p>
<h3>8: !Hacks</h3>
<p>Hold dig fra at bruge <em>hacks</em>! Hvad enten det er * hack, _ hack eller lignende. Brug i stedet <a href="http://msdn.microsoft.com/en-us/library/ms537512%28VS.85%29.aspx"><em>Conditional Comments</em></a> til fx at indsætte et Internet Explorer 6 specifikt <em>stylesheet</em>.</p>
<pre style="margin-right: -982px;"><span style="color: #0000ff;">&lt;!--[if IE 6]&gt;</span>
&lt;link type="text/css" href="ie6styling.css" rel="stylesheet"&gt;
<span style="color: #0000ff;">&lt;![endif]--&gt;</span></pre>
<p><strong>Resume</strong>: <span style="color: #0000ff;"><em>Undgå hacks, brug conditional comments i stedet.<br />
</em></span></p>
<h3>9: Adskillelse</h3>
<p>Markup og CSS er som <a href="http://en.wikipedia.org/wiki/Batman">Batman</a> og <a href="http://en.wikipedia.org/wiki/Robin_%28comics%29">Robin</a>. De er fantastiske sammen, dog kan Batman fint klare sig alene, hvorimod Robin er ubrugelig uden Batman.<br />
Man må aldrig begynde at sammensmelte markup og CSS og lave noget så uhyggeligt som<a href="http://www.w3schools.com/CSS/css_howto.asp"><em> inline styling</em></a>. For at sikre fleksibilitet og overblik er det vigtigt at alt styling adskilles fra markup og kun styres fra sit <em>stylesheet</em>. Der er dog situationer, hvor <em>inline-styling</em> kan være eneste løsning, men brug det kun som sidste udvej, og ikke fordi du er doven.</p>
<p><strong>Resume</strong>: <span style="color: #0000ff;"><em>Markup og CSS skal adskilles!<br />
</em></span></p>
<h3>10: Divitus, classitis og idikus</h3>
<p>Undgå at få divitus, classitis eller idikus. Generelt for alle 3 sygdomme er, at man overforbruger. Man kan sammenligne det med et <a href="http://www.graenseforeningen.dk/aab98.html">sønderjysk kaffebord</a>, hvor der minimum er 14 forskellige kager, 7 bløde og 7 hårde, hvilket er helt unødvendigt. Derimod ville 1-2 kager fra hver kategori have været rigeligt.<br />
Divitus er når man bruger for mange <em>div</em>&#8216;er. Mange nybegynder har en tendens til at smide en <em>div</em> rundt om alt:</p>
<pre>&lt;div id="mainHeader"&gt;&lt;h1&gt;Min overskift&lt;/h1&gt;&lt;/div&gt;</pre>
<p><em>Div</em>&#8216;en er ikke nødvendig, og man kan i stedet skrive</p>
<pre><span style="color: #0000ff;">&lt;h1&gt;Min overskrift&lt;/h1&gt;</span></pre>
<p>og så style på <em>h1</em> i stedet for #mainHeader.<br />
Classitis og idikus minder meget om divitus:</p>
<pre>&lt;ul id="unsortedList"&gt;
  &lt;li class="listItem"&gt;Item 1&lt;/li&gt;
  &lt;li class="listItem"&gt;Item 2&lt;/li&gt;
  &lt;li class="listItem"&gt;Item 3&lt;/li&gt;
&lt;/ul&gt;</pre>
<p>Det er ikke nødvendigt at overklistre alle <em>selectors</em> med klasser og id&#8217;er:</p>
<pre><span style="color: #0000ff;">&lt;ul&gt;
  &lt;li&gt;Item 1&lt;/li&gt;
  &lt;li&gt;Item 2&lt;/li&gt;
  &lt;li&gt;Item 3&lt;/li&gt;
&lt;/ul&gt;</span></pre>
<p><strong>Resume</strong>: <span style="color: #0000ff;"><em>Minimer dit markup!<br />
</em></span></p>
<h3>11: Centrer med margin</h3>
<p>Centrer med margin: 0 auto; i stedet for fx at <em>hardkode</em> en fast <em>padding</em> i venstre side. For at centrer med margin skal du definerer en bredde:</p>
<pre>div#element { <span style="color: #0000ff;">margin: 0 auto;</span> width: 800px; }</pre>
<p><strong>Resume</strong>: <span style="color: #0000ff;"><em>Brug margin: 0 auto; til at centrer<br />
</em></span></p>
<h3>12: Position og floats</h3>
<p>Brug <em><a href="http://www.w3schools.com/Css/pr_class_position.asp">position</a></em> og <em><a href="http://www.w3schools.com/css/pr_class_float.asp">float</a></em> rigtigt! Lær dem at kende, og brug dem når det passer ind. Lad være med at låse dig fast, hvor du kun bruger <em>float</em> eller <em>position</em>.</p>
<p><strong>Resume</strong>: <span style="color: #0000ff;"><em>Brug position og float når det giver mening.<br />
</em></span></p>
<h3>13: Vær doven</h3>
<p>Sidste punkt som i øvrigt gælder programmering generelt er, at man skal være doven. Hvorfor opfinde den dybe tallerken igen og igen, når den nu er opfundet? Genbrug dine komponenter medmindre du ønsker eller mangler træning i at forstå eller lave dem.<br />
Man støder på mange ens og lignende problemstillinger i CSS, hvorfor det vil være uhensigtsmæssigt, at skulle gennemtænke samt lave samme løsning gang på gang, og da man selvfølgelig har en <a href="#strukturel">strukturel navngivning</a>, er det ikke noget problem at genbruge sin kode.</p>
<p><strong>Resume</strong>: <span style="color: #0000ff;"><em>Genbrug dit veludviklet kode!<br />
</em></span></p>
<h3>&lt; SLUT / &gt;</h3>
<p>Det var mit bud på, hvordan man, ved hjælp af nogle simple principper, opnår bedre og mere overskueligt CSS. Vigtigst af alt er, at man er konsekvent hele vejen igennem og tro mod kode standarderne. Sammen kan vi gøre verden til et bedre sted. Kom gerne med en kommentar, hvad enten det er ris eller ros.</p>
]]></content:encoded>
			<wfw:commentRss>http://dinbror.dk/blog/css-sadan-laver-du-perfekt-css/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>CSS: min-height i IE6</title>
		<link>http://dinbror.dk/blog/css-min-height-i-ie6/</link>
		<comments>http://dinbror.dk/blog/css-min-height-i-ie6/#comments</comments>
		<pubDate>Mon, 04 Jan 2010 10:00:04 +0000</pubDate>
		<dc:creator>dinbror</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[IE6]]></category>
		<category><![CDATA[min-height]]></category>

		<guid isPermaLink="false">http://dinbror.dk/blog/?p=155</guid>
		<description><![CDATA[Igennem mit arbejde er jeg begyndt at rode rigtig meget med CSS igen, på godt og ondt. Det er så meningen, at jeg vil dele nogle af de erfaringer, jeg gør, og ligeledes for at jeg selv hurtigt kan finde de forskellige tips og tricks, at jeg har oprettet en kategori, CSS, på min blog,  [...]]]></description>
			<content:encoded><![CDATA[<p>Igennem mit arbejde er jeg begyndt at rode rigtig meget med <a href="http://www.w3schools.com/Css/default.asp">CSS</a> igen, på godt og ondt. Det er så meningen, at jeg vil dele nogle af de erfaringer, jeg gør, og ligeledes for at jeg selv hurtigt kan finde de forskellige tips og tricks, at jeg har oprettet en kategori, <a href="http://dinbror.dk/blog/category/css/">CSS</a>, på min blog,  som efterhånden også har stået stille hen i lang tid.</p>
<p>Første tip er et &#8220;trick&#8221;, som de fleste webudvikler nok allerede kender, men som er utrolig nyttigt, og som skal være i enhver webudviklers værktøjskasse indtil <a href="http://en.wikipedia.org/wiki/Internet_Explorer_6">IE6</a> dør.<br />
Jeg har tit stået i en situation, hvor mine forskellige undersiders højde har varieret, og hvor kunden har ønsket, at hver side som minimum skulle have en bestemt højde, men på samme tid være dynamiske, så undersiderne kan ekspanderer.<br />
Dette kan nemt løses ved at definere attributten <em><a href="http://www.w3schools.com/CSS/pr_dim_min-height.asp">min-height</a></em> til den ønskede minimum højde, men IE6 understøtter desværre ikke <em>min-height</em>. Dog understøtter den <a href="http://www.w3schools.com/Css/pr_dim_height.asp"><em>height</em></a>, og netop <em>height</em> attributten opføre sig faktisk som <em>min-height</em> i IE6. Ved at sætte en fast højde på fx 1000px, får man overraskende nok en højde på 1000px i IE6.  Dog er højden ikke låst fast, hvorfor man ligeledes får et dynamisk design, som kan udvide sig, men ved at definere en fast højde låses højden fast til de 1000px i nyere browsere, og så er man lige vidt.<br />
Løsningen er tagget <a href="http://www.w3.org/TR/CSS21/cascade.html"><em>!important</em></a>. <em>!important</em> bliver normalt brugt til at beskrive præcedens, hvor det i CSS altid er den sidst specificerende regel. Med tagget <em>!important</em> kan man dog gøre en regel tidligere i sit stylesheet præcedens, og da IE6 ignorer tagget kan man cross-browser sikre<em> min-height</em> effekten på følgende måde:</p>
<blockquote><p><strong>#Elementet-som-skal-have-min-height {<br />
min-height: 1000px;</strong> //Understøttes ikke af IE6<br />
<strong>height: auto !important;</strong> //Understøttes ikke af IE6, men gør denne regel/højde præcedens i alle nyere browsere<br />
<strong>height: 1000px;</strong> //Hos IE6 er denne højde præcedens, men i nyere browsere overskrives attributten<br />
<strong>}</strong></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://dinbror.dk/blog/css-min-height-i-ie6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Validering af e-mail adresser</title>
		<link>http://dinbror.dk/blog/validering-af-e-mail-adresser/</link>
		<comments>http://dinbror.dk/blog/validering-af-e-mail-adresser/#comments</comments>
		<pubDate>Sat, 16 May 2009 20:08:41 +0000</pubDate>
		<dc:creator>dinbror</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[e-mail]]></category>
		<category><![CDATA[expression]]></category>
		<category><![CDATA[reg exp]]></category>
		<category><![CDATA[regular]]></category>
		<category><![CDATA[validering]]></category>

		<guid isPermaLink="false">http://dinbror.dk/blog/?p=106</guid>
		<description><![CDATA[Når jeg udvikler software eller websider, arbejder jeg ofte med formular, hvorfor der forekommer input felter, som en bruger skal udfylde. For at sikre sin data, så det er mest brugbart og korrekt, er det altid en god skik at lave validering. Uden validering kan man risikerer at dataene bliver ubrugelig og dermed værdiløse. Ofte [...]]]></description>
			<content:encoded><![CDATA[<p>Når jeg udvikler software eller websider, arbejder jeg ofte med formular, hvorfor der forekommer input felter, som en bruger skal udfylde. For at sikre sin data, så det er mest brugbart og korrekt, er det altid en god skik at lave validering. Uden validering kan man risikerer at dataene bliver ubrugelig og dermed værdiløse. Ofte er valideringen simpel i form af tjek om et givet felt er udfyldt eller om det er den korrekte datatype. Men når vi snakker e-mail adresser, er det lidt mere kompliceret. En korrekt e-mail adresse består af en række regler:</p>
<blockquote><p>Starter med minimum et tegn efterfulgt af et snabel a, hvor der så igen er minimum et tegn efterfulgt af en prik. Sidste men ikke mindst defineres domænetypen, som er på minimum 2 bogstaver fx dk, de etc.</p></blockquote>
<p>En nem måde at håndtere en række regler for en tekststreng er ved at bruge <em>Regular Expression</em>. Et regulært udtryk er en tekststreng, som beskriver en mængde af tekststrenge og som overholder syntaksen for opstilling af det regulære udtryk. Så for at kunne validere en e-mail adresse vil jeg lave et regulært udtryk:</p>
<blockquote><p>(/^.*?@\w[\w.-]*\.[a-z]{2,4}$/i)</p></blockquote>
<p>Overstående giver måske ikke så meget mening, hvis man ikke kender til regulære udtryk, så jeg vil anbefale, at man læser om det på nettet [<a href="http://en.wikipedia.org/wiki/Regular_expression">1</a>][<a href="http://www.regular-expressions.info/">2</a>][<a href="http://www.zytrax.com/tech/web/regex.htm">3</a>]. Men jeg vil selvfølgelig ikke snyde jer for en forklaring af overstående udtryk.</p>
<blockquote>
<p style="text-align: left;"><strong>^</strong> : Starten af strengen.<br />
<strong>.* </strong>: 0 eller flere tegn.<br />
<strong>? </strong>: Non greedy (dvs. match mindst mulige tegn i stedet for flest mulige, 0 eller 1 gange).<br />
<strong>@</strong> : Et ”@”<br />
<strong>\w</strong> : Et tegn a-z, A-Z eller 0-9 og ”_”<br />
<strong>[\w.-]*</strong> : 0 eller flere tegn, som er a-z, A-Z eller 0-9, foruden ”.” eller ”-”<br />
<strong>\.</strong> : Et ”.”<br />
<strong>[a-z]{2,4}</strong> : 2-4 tegn af typen a-z. For eventuelt at fremtidsikre sine e-mail adresser kan man sætte max antal tegn op.<br />
<strong>$</strong> : Slutningen på strengen.<br />
<strong>i</strong> : ”ignore case”, ingen forskel på store og små bogstaver.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://dinbror.dk/blog/validering-af-e-mail-adresser/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Test din side i forskellige browsere</title>
		<link>http://dinbror.dk/blog/test-din-side-i-forskellige-browsere/</link>
		<comments>http://dinbror.dk/blog/test-din-side-i-forskellige-browsere/#comments</comments>
		<pubDate>Thu, 14 May 2009 15:36:53 +0000</pubDate>
		<dc:creator>dinbror</dc:creator>
				<category><![CDATA[Værktøjer]]></category>
		<category><![CDATA[browsere]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[FF]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[IE]]></category>
		<category><![CDATA[internet explorer]]></category>
		<category><![CDATA[konqueror]]></category>
		<category><![CDATA[opera]]></category>
		<category><![CDATA[safari]]></category>
		<category><![CDATA[webdesign]]></category>

		<guid isPermaLink="false">http://dinbror.dk/blog/?p=89</guid>
		<description><![CDATA[Et almindeligt problem når man designer hjemmesider er, at få dem til at se ud som man ønsker i alle browsere ens målgruppe måtte benytte. En af de vigtigste ting i kampen for ensartet design uafhængigt af browser og god kode er, at følge w3c&#8217;s standarder [link til w3c validator]. Desværre er det ikke altid [...]]]></description>
			<content:encoded><![CDATA[<p>Et almindeligt problem når man designer hjemmesider er, at få dem til at se ud som man ønsker i alle browsere ens målgruppe måtte benytte. En af de vigtigste ting i kampen for ensartet design uafhængigt af browser og god kode er, at følge w3c&#8217;s standarder [<a href="http://validator.w3.org/">link til w3c validator</a>]. Desværre er det ikke altid nok. Nogle browsere følger ikke standarderne 100%, og der er stadig brugere af Internettet, der kan finde på at bruge en forældet browser som Internet Explorer 6, IE6.</p>
<p>Heldigvis findes der en række gratis værktøjer, der gør det muligt at teste sit design i de forskellige browsere. Nogle er online, hvor andre skal installeres på computeren:</p>
<p><strong><a href="http://Browsershots.org">Browsershots.org</a><br />
</strong>En hjemmeside der gør det muligt at teste sine sider i alverdens kombinationer mellem browsere, operativsystemer og ekstra indstillinger. De ekstra indstillinger består af skærm størrelse, farve dybde og om javascript, java eller flash skal være aktiveret eller deaktiveret.<br />
Værktøjet kan ikke bruges lokalt, men kun online. Man indtaster en url og vælger de browsere samt operativsystemer, der skal testes i. Herefter loader programmet din url i de forskellige browsere og tager et screenprint af siden. Værktøjet kræver en smule tålmodighed, da der kan forkomme ventetid på resultatet.</p>
<p><a href="http://ipinfo.info/netrenderer/index.php"><strong>IE NetRenderer</strong></a><br />
Ligesom browsershots.org er dette et online værktøj til at se sine sider i forskellige browsere. Dog kan der kun vælges mellem forskellige versioner af IE ned til version 5.5. Testen renderer med det samme, og er derfor et godt alternativ til browsershots, hvis man kun skal teste IE.</p>
<p><strong><a href="http://tredosoft.com/Multiple_IE?page=1">Multiple versions of IE<br />
</a></strong>Et program udviklet af TredoSoft, som hjælper dig med at installere flere versioner af IE på en gang. Her kan du teste dine sider online såvel som lokalt.</p>
<p><strong><a href="http://www.my-debugbar.com/wiki/IETester/HomePage">IETester</a><br />
</strong>Et program udviklet af My DebugBar, som kan vise dine sider i IE ned til version 5.5. Programmet gør det mulig nemt og hurtigt at skifte mellem de forskellige browsere både lokalt samt online. GUI mæssigt er programmet nok det flottest og det fungere ok, dog skal man stadig tænke på, at det er et alpha release, hvorfor fejl kan opstå. Ligeledes har det stadig nogle begrænsninger, fx kan der forekomme problemer med visning af flashelementernår man tester i IE 6.</p>
<p><a href="http://blogs.msdn.com/xweb/archive/2009/03/18/Microsoft-Expression-Web-SuperPreview-for-Windows-Internet-Explorer.aspx"><strong>MS Expression Web SuperPreview</strong></a><br />
Microsofts eget værktøj til at teste sine designs i forskellige IE versioner. Værktøjet viser dit design i IE 6 og IE 7 eller IE 8, afhængigt af hvilken version du har installeret på computeren. Du kan se siderne ved siden af hinanden eller ovenpå hinanden, og programmet giver dig nogle værktøjer, der kan identificere forskelle helt ned til pixelniveau.</p>
]]></content:encoded>
			<wfw:commentRss>http://dinbror.dk/blog/test-din-side-i-forskellige-browsere/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Test-Driven Development &#8211; hvad, hvordan og hvorfor?</title>
		<link>http://dinbror.dk/blog/test-driven-development-hvad-hvordan-og-hvorfor/</link>
		<comments>http://dinbror.dk/blog/test-driven-development-hvad-hvordan-og-hvorfor/#comments</comments>
		<pubDate>Mon, 27 Apr 2009 22:01:43 +0000</pubDate>
		<dc:creator>dinbror</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Udviklingsmetoder]]></category>
		<category><![CDATA[softwareudvikling]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[test first]]></category>
		<category><![CDATA[test-driven development]]></category>
		<category><![CDATA[testkode]]></category>
		<category><![CDATA[udviklingsteknik]]></category>

		<guid isPermaLink="false">http://dinbror.dk/blog/?p=11</guid>
		<description><![CDATA[Motivation
Efter at have afleveret hovedopgave på datamatikeruddannelsen, som blev lavet sammen med to medstuderende, skulle jeg forberede et 10 minutters oplæg.  Her lå mit interesseområde indenfor optimering. Hvordan kunne vi have gjort vores proces og produkt bedre?
Igennem undervisning var vi blevet introduceret til udviklingsmetoden eXtreme Programming [1]. Vi brugte en del af metodens arbejdspraksisser dog [...]]]></description>
			<content:encoded><![CDATA[<h2>Motivation</h2>
<p>Efter at have afleveret hovedopgave på datamatikeruddannelsen, som blev lavet sammen med to medstuderende, skulle jeg forberede et 10 minutters oplæg.  Her lå mit interesseområde indenfor optimering. Hvordan kunne vi have gjort vores proces og produkt bedre?<br />
Igennem undervisning var vi blevet introduceret til udviklingsmetoden eXtreme Programming <a href="http://www.extremeprogramming.org/">[1]</a>. Vi brugte en del af metodens arbejdspraksisser dog ikke Test-first programmering, selvom det havde været ideen fra starten af. Den manglende erfaring samt manglende viden omkring emnet havde skræmt os, og da vi havde anvendt en del ny teknologi i form af Adobe Flex, Hibernate, BlazeDS mm. var den blevet nedprioteret, hvorfor en fordybelse i emnet forekom naturligt.</p>
<h2>Hvad er Test-Driven Development?</h2>
<p>Test-driven development, herefter forkortet TDD, har været anvendt i årtier. Den er blevet en del af eXtreme Programmings arbejdspraksisser i form af test-first programmering. Det er her jeg er blevet gjort bekendt med teknikken. Det er en softwareudviklingsteknik, og <span style="text-decoration: underline;">ikke</span> blot en test metode, som mange måske tror! Det er en teknik til at programmere med og fastligge krav til sit software. I eXtreme Programming er den med til at understøtte udvikleren med øjeblikkelig feedback på sit arbejde.</p>
<h2>Hvordan bruges Test-Driven Development?</h2>
<p>Nedestående figur illustrerer TDDs anvendelse. Jeg har delt det op i 6 trin:</p>
<div id="attachment_27" class="wp-caption alignnone" style="width: 610px"><img class="size-full wp-image-27" title="Test-driven developments 6 trin." src="http://dinbror.dk/blog/wp-content/uploads/2009/04/tdd6.jpg" alt="Hvordan bruges test-driven development?" width="600" height="224" /><p class="wp-caption-text">Hvordan bruges Test-Driven Development?</p></div>
<ol>
<li><strong>Tilføj en test:</strong> Man starter med at lave sin test. Testkoden laves før selve programkoden, hvorfor udvikleren tvinges til at tænke over kravene inden der udvikles. Dette er den største forskel kontra almindelige unit test.</li>
<li><strong>Kør alle tests</strong>: Herefter køres testen. Vi forventer at den fejler, da programkoden ikke er udviklet endnu, men skulle den mod forventning bestå, går man tilbage til trin 1, da testen tydeligvis ikke virker.</li>
<li><strong>Skriv noget kode</strong>: Nu udvikles programkoden. Her er det vigtigt, at man ikke begynder at forudse problemer, men kun fokuserer på at testen skal lykkes.<br />
Kent Beck, skaberen af eXtreme Programming, skriver om flere strategier for, hvordan man hurtigst muligt få sine tests til at bestå. Bl.a. kommer han med udtalelsen: &#8220;Fake it (till you make it)&#8221;, som går på at man starter med at returner en konstant, og først senere laver den om til en variabel i den endelige kode.</li>
<li><strong>Kør alle tests</strong>: Herefter køres testen igen. Igen er der to mulige output. Fejler testen går man tilbage til trin 3 og kigger sin programkode igennem. Består testen går man videre til trin 5.</li>
<li><strong>Refactor<em>:</em></strong> Test- og program-koden gennemses og eventuelt optimeres. Hvis der er duplikater i form af fx temp værdier og strings fjernes disse. Det er vigtigt at dubleret kode fjernes, da det medvirker til et dårligere design, inkonsistens og mindre tillid til koden, især når udvikleren glemmer, hvor det dublerede kode er.</li>
<li><strong>Kør alle tests</strong>: Testen køres igen. Fejler den vender man tilbage til trin 5, ellers fortsætter man med næste krav og trin 1. Det er vigtigt at man hele tiden får kørt sine test, så en eventuel fejl ikke når at blive stor og ressourcekrævende.</li>
</ol>
<h2>Hvorfor bruge Test-Driven Development?</h2>
<p>Ja, hvorfor skal man bruge Test-Driven Development? Herunder har jeg opridset nogle klare fordele ved TDD og unit testing generelt.</p>
<p><strong>FORDELE<br />
</strong></p>
<ul>
<li><strong>Testkode før programkode:</strong> I og med at testkoden bliver lavet før programkoden, tvinges udvikleren til at tænke over kravene, inden de begynder at udvikle.</li>
<li><strong>Mere produktivt</strong>: Forskning foretaget i 2005 viser at programmør, der skriver flere test er mere produktive <span class="wp-caption-dd"><a href="http://iit-iti.nrc-cnrc.gc.ca/publications/nrc-47445_e.html">[2]</a>. </span> Ved at man tager små bider ad gangen (tester et krav/unit ad gangen) er det nemmere at overskue, og dermed fejlrette. Det er nemmere at skulle rette i en metode på tre linjer kode end en program fil på flere tusind linjer kode.</li>
<li><strong>Mere tillid</strong>: Alle metoder/funktionaliteter er gennemtestet, og det giver en større grad af tillid til koden.</li>
<li><strong>Hurtigere</strong>: TDD giver mere kode i form af testkode &#8211; dog har undersøgelser foretaget af IBM vist, at det tager kortere tid eller lige så lang tid med TDD som uden <a href="http://utopia.csis.pace.edu/dps/2008/mcapellan/projects/TDD/Test-Driven%20Development%20as%20a%20Defect-Reduction%20Practice%20-%2003.pdf">[3]</a>. Desuden viste undersøgelserne at udviklingen med TDD havde resulteret i færre fejl. Mange fejl blev opdaget tidligere, og nåede derfor ikke at blive store og ressourcekrævende (tidskrævende).</li>
<li><strong>Lavere kobling</strong>:  Funktionaliteterne deles op i små bider og testes. De <span style="text-decoration: underline;">skal</span> kunne testes individuelt, og det resulterer i lavere kobling samt mere fokuserede klasser.</li>
<li><strong>Øget programforståelse</strong>: Undersøgelser foretaget af bl.a. Ried Kaufmann har vist at TDD at med til at give en øget programforståelse og dermed mere selvtillid. Udvikleren tør rette i koden, da man hurtigt kan se, hvis og hvor det fejler.</li>
<li><strong>Eksempelkode</strong>: Testkoden er et eksempel på, hvordan udvikleren har tænkt sig at programkoden skal anvendes.</li>
</ul>
<p>Træerne vokser desværre ikke helt ind i himlen, så TDD har også nogle ulemper.</p>
<p><strong>ULEMPER</strong></p>
<ul>
<li><strong>Blind spot</strong>: Ofte samme udvikler som laver testkode og programkode. Det giver den fordel, at man ikke skal sende sine krav ned til test-afdelingen og vente på at de udfærdiger ens tests, men også den ulempe, at du kan stirre dig blind på koden samt overse visse elementer og ligefrem have misforstået opgaven. Den &#8220;blinde vinkel&#8221; kan minimeres ved at bruge en af eXtreme Programmings andre arbejdspraksisser, parprogrammering. På denne måde får man et sæt ekstra øjne på koden.</li>
<li><strong>En for alle, alle for een</strong>: TDD virker kun optimalt, hvis hele udviklingsteamet er indstillet på at bruge det. Hvis man har én der modarbejder det, har man tre muligheder:
<ol>
<li>Man kan forsøge at overbevise personen til at arbejde efter TDDs principper.</li>
<li>Man kan smide personen ud af sit udviklingsteam.</li>
<li>Man kan droppe at bruge TDD.</li>
</ol>
</li>
<li><strong>Falsk sikkerhed</strong>: TDD kan give en falsk følelse af sikkerhed. I og med at man tester og ser sine test bestå, kan det give en følelse af at ens programkode spiller. Der kan dog stadig være masser af fejl, og det er derfor vigtigt ikke at glemme sine andre tests; accepttest, integrationstest etc.</li>
<li><strong>Lang indlæringsproces: </strong>Egne erfaringer har vist, at hele TDD-tankegangen kan være svær at vende sig til og indføre i et udviklingsteam, og at det tager tid før man ser skoven for bare træer.</li>
</ul>
<h2>Afrunding</h2>
<p>TDD ville bestemt have gavnet vores produkt og proces. Når man benytter sig af TDD får man ryddet op i sin kode løbende, og står ikke tilbage med rodet og dubleret kode. Samtidig er det nemt for andre at overtage koden og lave tilføjelser, idet testkoden vil verificere om en rettelse medfører fejl og hvorhenne fejlen opstår. Med TDD får man mere indsigt i koden, da man altid ved hvilken metode, der fejler, når der fejles. Man undgår derved at bruge en masse tid på at debugge sin kode igennem. Samtidig er TDD med til at sikre at din kode kan testes og styrer færdighedsgraden af dit program. Når alle tests/krav gennemføres er man færdig.<br />
Det kan dog være svært at teste på større systemer med database og GUI-elementer. Her kan man laver <em>Mock Objekter </em><a href="http://en.wikipedia.org/wiki/Mock_object">[4]</a> for at simulerer en væremåde. Dog har det den ulempe, at fx vil den faktiske database aldrig være blevet testet af selve TDD processen, hvorfor mange udvikler mener, at man skal adskille disse test fra sine TDD unit tests, og henviser til dem som integrationstests <a href="http://en.wikipedia.org/wiki/Integration_testing">[5]</a>. Når man laver sine tests, er det vigtigt at have styr på sine krav. Uden krav kan man ikke lave sin testkode.</p>
<blockquote><p>Teksten er forfattet på baggrund af at lære mere om TDD, og lagt online for at andre muligvis kunne få glæde af den viden jeg tilegnede mig. Teksten giver ingen dybdegående viden om TDD og dens brug, men kradser lidt i overfalden, og giver forhåbelig læseren en ide om, hvad TDD er.  Jeg har ganske vist lige overstået min afsluttende eksamen, men modtager derfor alligevel gerne ris/ros på det skrevne.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://dinbror.dk/blog/test-driven-development-hvad-hvordan-og-hvorfor/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Unified Process, UP</title>
		<link>http://dinbror.dk/blog/unified-process-up/</link>
		<comments>http://dinbror.dk/blog/unified-process-up/#comments</comments>
		<pubDate>Sun, 28 Dec 2008 09:33:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Udviklingsmetoder]]></category>
		<category><![CDATA[Iterativ]]></category>
		<category><![CDATA[Ivar Jacobson]]></category>
		<category><![CDATA[Kravspecifikation]]></category>
		<category><![CDATA[Objektorienteret]]></category>
		<category><![CDATA[Unified Process]]></category>
		<category><![CDATA[UP]]></category>

		<guid isPermaLink="false">http://dinbror.dk/blog/?p=3</guid>
		<description><![CDATA[


Kort gennemgang af udviklingsmetoden Unified process faser. UP bruger UML som notationsprog, hvilket jeg ikke går yderligere i dybden med. Jeg nævner blot de forskellige diagrammer som et softwareudviklingsprojekt kan inddrage her: use case diagram, use case specifikationer, domænediagram, designdiagram, systemsekvensdiagram, designsekvensdiagram og tilstandsdiagram.





UP er en iterativ udviklingsmetode, som oprindeligt blev udviklet af Ivar Jacobsen, [...]]]></description>
			<content:encoded><![CDATA[<table border="0">
<tbody border="0">
<tr>
<td>Kort gennemgang af udviklingsmetoden Unified process faser. UP bruger UML som notationsprog, hvilket jeg ikke går yderligere i dybden med. Jeg nævner blot de forskellige diagrammer som et softwareudviklingsprojekt kan inddrage her: use case diagram, use case specifikationer, domænediagram, designdiagram, systemsekvensdiagram, designsekvensdiagram og tilstandsdiagram.</td>
</tr>
<tr>
<td></td>
</tr>
<tr>
<td>UP er en iterativ udviklingsmetode, som oprindeligt blev udviklet af Ivar Jacobsen, Grady Booch og James Rumbaugh sidst i 90´erne. De tre samlede hovederne for at definere en ensartet objektorienteret softwareudviklingsmetode, hvilket udmundede i beskrivelsessproget UML samt fire faser:</td>
</tr>
<tr>
<td>
<dl>
<dd>1) Inception</dd>
<dd>2) Elaboration</dd>
<dd>3) Construction</dd>
<dd>4) Transition</dd>
</dl>
</td>
</tr>
<tr>
<td>Hver fase består af en række iterationer. Antallet af iterationer afhænger af udviklingsprojektets kompleksitet.</td>
</tr>
<tr>
<td></td>
</tr>
<tr>
<td>
<h2>Fase 1: Inception (Forberedelsesfasen)</h2>
</td>
</tr>
<tr>
<td>Forberedelsesfasen er ikke lig med kravspecifikation, som det kendes fra vandfladsmodellen. Man analysere i stedet kritiske krav og fastslår de grundlæggende ideer om systemet. Der foretages en risikoanalyse og der vurderes om projektet kan realiseres. Denne fase består som regel af 1-2 iterationer.</td>
</tr>
<tr>
<td></td>
</tr>
<tr>
<td>
<h2>Fase 2: Elaboration (Etableringsfasen)</h2>
</td>
</tr>
<tr>
<td>Fortsættelse på første fase, hvor man fordyber sig i sine krav, man udspecificere dem, beskriver dem og gør dem målbare. De største risici elimineres, og man får sin grundlæggende arkitektur på plads samt programmering og test påbegyndes. Der er en del iterationer i denne fase.</td>
</tr>
<tr>
<td></td>
</tr>
<tr>
<td>
<h2>Fase 3: Construction (Konstruktionsfasen)</h2>
</td>
</tr>
<tr>
<td>Produktet konstrueres. Man udvikler og tester systemets funktioner samt laver brugerorienteret dokumentation og manualer. Construction er fasen, som består af flest iterationer.</td>
</tr>
<tr>
<td></td>
</tr>
<tr>
<td>
<h2>Fase 4: Transition (Overdragelsesfasen)</h2>
</td>
</tr>
<tr>
<td>Systemet udrulles. Man laver de afsluttende tests samt installerer og oplærer brugerne. Herefter kan man evaluere på forløbet og projektet afsluttes. Dette varer normalt 1-2 iterationer.</td>
</tr>
<tr>
<td></td>
</tr>
<tr>
<td>
<dl>
<dt></dt>
<h2>Fordele ved Unified Process:</h2>
<dd>-	UP egner sig til store og tidskrævende projekter med mange udviklere.</dd>
<dd>- Løbende reviews.</dd>
<dd>- Meget dokumentation. UP er arkitekturcentreret og systemet beskrives grundigt, som gerne skulle resultere i, at andre udviklere hurtigt kan få et overblik og overtage systemet.</dd>
</dl>
</td>
</tr>
<tr>
<td>
<dl>
<dt></dt>
<h2>Ulemper ved Unified Process:</h2>
<dd>- Meget dokumentation, i form af use case specifikationer, sekvensdiagrammer mm. Den grundige dokumentation er tidskrævende og resulterer i, at ændringer løbende koster meget tid.</dd>
<dd>- Ufleksibelt, UP er låst fast i sine faser, og det er derfor ikke nemt at lave store ændringer, når man er sidst i en fase eller har afsluttet en fase.</dd>
</dl>
</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://dinbror.dk/blog/unified-process-up/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
