<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>ICoder</title>
    <description>Implementing all day...</description>
    <link>http://www.icoder.dk/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 1.5.0.7</generator>
    <language>da-DK</language>
    <blogChannel:blogRoll>http://www.icoder.dk/opml.axd</blogChannel:blogRoll>
    <dc:creator>ICoder</dc:creator>
    <dc:title>ICoder</dc:title>
    <geo:lat>556,818.000000</geo:lat>
    <geo:long>93,515.000000</geo:long>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Icoder" /><feedburner:info uri="icoder" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
      <title>Mit web–mit dogme</title>
      <description>&lt;p&gt;I slutningen af forrige årtusinde, sad jeg i en fugtig kælder, og kodede løs på min første rigtige webapplikation. Den havde en backend, der var lavet i Concorde XAL og en frontend der var lavet i statisk Html og Javascript. Det var en rigtig webshop, med varegrupper, beskrivelser, billeder og en indkøbskurv. Nøjagtig som vi kender dem i dag.&lt;/p&gt;  &lt;p&gt;Det var kompliceret at få XAL script til at generere Html og få timet sit Javascript i browseren (IE 3.02). Jeg udtænkte derfor en XAL-Html-template, der gjorde genereringen af nye sider (og nyt design) til en leg. Nu skulle jeg blot vælge publicér i XAL, og så blev de nye Html filer genereret, og uploadet til webserveren via FTP. Skulle der lige snige sig en fejl ind, kunne man hurtigt rette koden i Notepad, og uploade sin patch.&lt;/p&gt;  &lt;p&gt;Men – Microsft havde jo arbejdet i et par år med ASP, og udgav i slutningen af 2000 version 3.0. Springet fra mine XAL-templates og over til ASP var ikke langt – nu kunne man lade webserveren generere sin Html, og nøjes med at hente data via Odbc forbindelser. Jeg kunne endda bruge mine Javascript kundskaber på serveren – Microsoft kaldt det godt nok JScript, men det var jo det samme.&lt;/p&gt;  &lt;p&gt;Her efter kom et par år, hvor jeg var utroligt produktiv, og jeg fremstillede et hav af webapplikationer: CMS, CRM og webshops – alt kunne lade sig gøre. Samtidig var der masser af virksomheder, der havde de utroligste forretningsideer, som bare skulle omsættes til web. Mit foretrukne værktøj blev Allaire Homesite.&lt;/p&gt;  &lt;p&gt;Ind kom ASP.NET. Microsofts nye webudviklingsplatform. Nu kunne man kompilerer sin kode, og man havde hele systemet til sin rådighed. Det var utroligt tiltalende at pakke al sin kode ind i klasser, og begynde at tænke på arkitektur. Jeg skulle pludselig til at tænke i meget mere abstrakte baner. Genbrug og afkobling var den helt store gevinst. Produktiviteten gik helt ned! På trods af at ASP.NET skulle øge produktiviteten, fik det den modsatte effekt. Man kunne bare ikke komme i gang, uden at man skulle lave en flot arkitektur først. Her stoppede utroligt mange projekter – det var simpelthen for dyrt.&lt;/p&gt;  &lt;p&gt;Det bringer os frem til i dag, hvor vi jo sidder med Visual Studio 2010, og alligevel er produktive. Ikke fordi vi er blevet mere innovative, eller bedre kodere, men fordi ASP.NET platformen er modnet, og der er kommet en lang række frameworks der hjælper os med de fleste ting. Man skal ikke tænke på databaser – de er mappede til objekter i ORM frameworks. Man skal ikke tænke på autorisation – det klarer Membershipprovideren. Man skal ikke tænke på Html – det klarer Webkontrollerne. Man skal blot hooke de forskellige moduler sammen. Nemt og hurtigt. Så længe det opfører sig som man har forventet, for sker der først fejl, så kommer problemerne. Det er blevet utroligt komplekst at finde en fejl i en ASP.NET applikation i 2010. Man er mange gange nødt til at gå på serveren, og lave et dump, som man kan analyserer for at finde fejl. Ja man bruger nu ikke længere sine udvikler ressourcer til at udvikle, men til at rette fejl. &lt;/p&gt;  &lt;p&gt;Her står vi så i dag. Hvordan kommer vi videre, og hvordan bliver vi bedre og mere produktive? Bruger vi flere frameworks, og flere abstarktionslag? Skal vi bruge Sharepoint eller xRM, for overhovedet at få noget fra hånden?&lt;/p&gt;  &lt;p&gt;Jeg tror at applikationsudvikling, er blevet for kompliceret, og vil forsøge at stræbe efter mere simple løsninger. “Simpelt er smukt”. Jeg har derfor besluttet at fremsætte en række regler for mit fremtidige arbejde med webapplikationer. Det er min opfattelse, at en webapplikation, der er udviklet efter disse regler, vil være optimal både at udvikle, videreudvikle, drifte og fejlfinde. Første udkast ser således ud:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;Ingen servergenereret Html – &lt;/strong&gt;Al Html skal komme fra statiske filer, eller klientside script. Det er forbundet med et unødvendigt overhead både på server cpu, memory og responsstrøm. Det er langt smartere at lade klienternes datakraft bruge energi på at manipulere Html og styling. Det frigiver ressourcer på serveren, der kan bruges langt smartere på forretningslogik.&amp;#160; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Json respons fra servervicekald – &lt;/strong&gt;Json er det naturlige data format for webapplikationer, samtidig er det langt mere komprimeret en Xml. Ingen klientside overhead i forbindelse med parsning af overflødig og tung Xml. Vi taler om en faktor 1:10 på almindelige Xml-dokumenter, og 1:x så snart der introduceres namespaces. Man sparer responsstrøm, og klientside ressourcer. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Minimér relationel data – &lt;/strong&gt;Data der ikke er relationel, skal gemmes som f.eks. Json. Det åbner databasen for hurtigere og senere ændringer i databærende klasser. Konceptuelt som en dokumentdatabase - i praksis gerne som felter i en relationel database. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Autorisation via Http digest – &lt;/strong&gt;Implementeret af alle browsere, og niveauet kan skrues op og ned efter behov og temperament. Minimal payload, og dermed formindsket respons- og requeststrøm &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Nogle tanker ideer?&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Icoder/~4/SvHlr1GWnMQ" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/Icoder/~3/SvHlr1GWnMQ/post.aspx</link>
      <author>The IMan</author>
      <comments>http://www.icoder.dk/post/2010/12/20/Mit-webe28093mit-dogme.aspx#comment</comments>
      <guid isPermaLink="false">http://www.icoder.dk/post.aspx?id=2d4bb877-964f-4097-9768-f05c7d50dde9</guid>
      <pubDate>Mon, 20 Dec 2010 13:56:49 +0100</pubDate>
      <dc:publisher>The IMan</dc:publisher>
      <pingback:server>http://www.icoder.dk/pingback.axd</pingback:server>
      <pingback:target>http://www.icoder.dk/post.aspx?id=2d4bb877-964f-4097-9768-f05c7d50dde9</pingback:target>
      <slash:comments>3</slash:comments>
      <trackback:ping>http://www.icoder.dk/trackback.axd?id=2d4bb877-964f-4097-9768-f05c7d50dde9</trackback:ping>
      <wfw:comment>http://www.icoder.dk/post/2010/12/20/Mit-webe28093mit-dogme.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.icoder.dk/syndication.axd?post=2d4bb877-964f-4097-9768-f05c7d50dde9</wfw:commentRss>
    <feedburner:origLink>http://www.icoder.dk/post.aspx?id=2d4bb877-964f-4097-9768-f05c7d50dde9</feedburner:origLink></item>
    <item>
      <title>Start med MicroDal</title>
      <description>&lt;p&gt;Hvordan kommer man i gang med at bruge &lt;a href="http://microdal.codeplex.com/" target="_blank"&gt;MicroDal&lt;/a&gt; i mit web-projekt?&lt;/p&gt;
&lt;p&gt;N&amp;aring;r klassebiblioteket (microdal.dll), er downloadet og inkluderet i projektet, er man klar, og mangler blot at konfigurere sin databaseforbindelse. Man skal kun huske at kvalificerer den med provider navn. F.eks.:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;connectionstrings&amp;gt;
  &amp;lt;add name="MyDb" 
          connectionstring="data source=|DataDirectory|\cmsdata.s3db;New=true" 
          providername="System.Data.SQLite" /&amp;gt;
&amp;lt;/connectionstrings&amp;gt;&lt;/pre&gt;
&lt;p&gt;Nu kan man bruge MicroDal med manuel sessions-management. Det vil sige man angiver navn p&amp;aring; forbindelsen hver gang man bruger bruger en session:&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;using (var ses = new DataSession("MyDb")){
    var idx = ses.ExecuteScalar&amp;lt;int&amp;gt;("SELECT @@IDENTITY");
    //.... 
}&lt;/pre&gt;
&lt;p&gt;&amp;Oslash;nsker man at lade MicroDal administrere databaseforbindelsen, og p&amp;aring; den m&amp;aring;de optimerer brugen af forbindelser, skal man blot tilf&amp;oslash;je en appsetting med n&amp;oslash;glen: &lt;em&gt;MicroDalConnectionName&lt;/em&gt;:&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;&amp;lt;appsettings&amp;gt;
  &amp;lt;add value="MyDb" key="MicroDalConnectionName" /&amp;gt;
&amp;lt;/appsettings&amp;gt;&lt;/pre&gt;
&lt;p&gt;S&amp;aring; ligger al funktionalitet i en statisk property p&amp;aring; &lt;em&gt;DataSession &lt;/em&gt;objektet &amp;ndash; &lt;em&gt;Current&lt;/em&gt;. Man kan s&amp;aring; bare bruge sessionen, n&amp;aring;r man &amp;oslash;nsker det &amp;ndash; MicroDal lukker og rydder op automatisk.&lt;/p&gt;
&lt;p&gt;Databinding er nu en simpel sag:&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;list1.DataSource = DataSession.Current
    .Fetch&amp;lt;Address&amp;gt;(
        "SELECT * FROM Address WHERE id=@1",
        Request["ID"])
   .ToArray();
list1.DataBind();&lt;/pre&gt;
&lt;p&gt;Her er foruds&amp;aelig;tningen, at &lt;em&gt;Address&lt;/em&gt; objektet har en parameterl&amp;oslash;s konstrukt&amp;oslash;r, og at der er sammenfald mellem kolonnenavne og egenskaber p&amp;aring; objektet. Hvis ikke, skal man kvalificerer sin SQL s&amp;oslash;gning med alias der passer p&amp;aring; egenskabsnavnene.&lt;/p&gt;
&lt;p&gt;Code on&amp;hellip;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Icoder/~4/EgToxX7hK0M" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/Icoder/~3/EgToxX7hK0M/post.aspx</link>
      <author>The IMan</author>
      <comments>http://www.icoder.dk/post/2010/08/02/Start-med-MicroDal.aspx#comment</comments>
      <guid isPermaLink="false">http://www.icoder.dk/post.aspx?id=d8b7f7f8-747e-43e9-9a67-9bb0a5393a5a</guid>
      <pubDate>Mon, 02 Aug 2010 12:04:00 +0100</pubDate>
      <dc:publisher>The IMan</dc:publisher>
      <pingback:server>http://www.icoder.dk/pingback.axd</pingback:server>
      <pingback:target>http://www.icoder.dk/post.aspx?id=d8b7f7f8-747e-43e9-9a67-9bb0a5393a5a</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.icoder.dk/trackback.axd?id=d8b7f7f8-747e-43e9-9a67-9bb0a5393a5a</trackback:ping>
      <wfw:comment>http://www.icoder.dk/post/2010/08/02/Start-med-MicroDal.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.icoder.dk/syndication.axd?post=d8b7f7f8-747e-43e9-9a67-9bb0a5393a5a</wfw:commentRss>
    <feedburner:origLink>http://www.icoder.dk/post.aspx?id=d8b7f7f8-747e-43e9-9a67-9bb0a5393a5a</feedburner:origLink></item>
    <item>
      <title>Faldgruber i JavaScript</title>
      <description>&lt;h3&gt;parceInt bruger octet som standard&lt;/h3&gt;  &lt;p&gt;Man må bare elske den måde hvorpå &lt;em&gt;parseInt&lt;/em&gt; virker på. Ikke så meget vrøvl – bare resultater. &lt;/p&gt;  &lt;p&gt;var width = parseInt(“153px”);&lt;/p&gt;  &lt;p&gt;giver helt som forventet: 153. Ingen behov for at fjerne enheder fra strengen først, som i c#. Det virker bare.&lt;/p&gt;  &lt;p&gt;Men hvad sker der så når man prøver med:&lt;/p&gt;  &lt;p&gt;var id = parseInt(“009”);&lt;/p&gt;  &lt;p&gt;Man får “0” – det viser sig nemlig at &lt;em&gt;parseInt &lt;/em&gt;bruger octet som udgangspunkt, og det første tal fra systemet er “0”, da 9 jo ikke er et tal i octet, ignoreres det blot, som var det en hvilken som helst anden enhedsangivelse. Man kan tvinge 10-talsystemet ved at angive radix:&lt;/p&gt;  &lt;p&gt;var id = parseInt(“009”, 10);&lt;/p&gt;  &lt;h3&gt;En streng er ikke en streng&lt;/h3&gt;  &lt;p&gt;Ikke alle er klar over at JavaScript faktisk kan representerer en streng på to forskellige måder: Som en primitiv og som et objekt.&lt;/p&gt;  &lt;pre class="brush: js;"&gt;var a = &amp;quot;Jeg er en primitiv&amp;quot;;
var b = new String(&amp;quot;Jeg er et objekt&amp;quot;);

alert(typeof a == typeof b); // Vil alerte 'false'&lt;/pre&gt;

&lt;p&gt;Hvis man har kode der laver type-check, kan man altså ikke bare nøjes med:&lt;/p&gt;

&lt;pre class="brush: js;"&gt;if (typeof var1 == &amp;quot;string&amp;quot;)
    ...&lt;/pre&gt;

&lt;h3&gt;DOM id’er&lt;/h3&gt;

&lt;p&gt;Brug ikke DOM id’er som variabelnavn. Det giver “object undefined” fejl i IE. Brug namespacing…&lt;/p&gt;

&lt;h3&gt;&lt;/h3&gt;

&lt;h3&gt;Replace er ikke global&lt;/h3&gt;

&lt;p&gt;Hvis du vil foretage en udskiftning af karakterer i en streng, skal du bruge en RegExp som parameter, ellers er det kun første forekomst der udskiftes:&lt;/p&gt;

&lt;pre class="brush: js;"&gt;var headline = &amp;quot;Min overskrift på artiklen&amp;quot;;

var itemname = headline.replace(&amp;quot; &amp;quot;, &amp;quot;_&amp;quot;);
// Giver: Min_overskrift på artiklen

var itemname = headline.replace(/ /g, &amp;quot;_&amp;quot;);
// Giver: Min_overskrift_på_artiklen

Coder on..&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/Icoder/~4/eGLwUBfuTf4" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/Icoder/~3/eGLwUBfuTf4/post.aspx</link>
      <author>The IMan</author>
      <comments>http://www.icoder.dk/post/2009/11/30/Faldgruber-i-JavaScript.aspx#comment</comments>
      <guid isPermaLink="false">http://www.icoder.dk/post.aspx?id=5b8ad4d5-7d1c-4b85-bbd7-44bebb966f77</guid>
      <pubDate>Mon, 30 Nov 2009 13:53:05 +0100</pubDate>
      <category>JavaScript</category>
      <dc:publisher>The IMan</dc:publisher>
      <pingback:server>http://www.icoder.dk/pingback.axd</pingback:server>
      <pingback:target>http://www.icoder.dk/post.aspx?id=5b8ad4d5-7d1c-4b85-bbd7-44bebb966f77</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.icoder.dk/trackback.axd?id=5b8ad4d5-7d1c-4b85-bbd7-44bebb966f77</trackback:ping>
      <wfw:comment>http://www.icoder.dk/post/2009/11/30/Faldgruber-i-JavaScript.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.icoder.dk/syndication.axd?post=5b8ad4d5-7d1c-4b85-bbd7-44bebb966f77</wfw:commentRss>
    <feedburner:origLink>http://www.icoder.dk/post.aspx?id=5b8ad4d5-7d1c-4b85-bbd7-44bebb966f77</feedburner:origLink></item>
    <item>
      <title>Betinget scriptinkludering</title>
      <description>&lt;p&gt;Hvis man indsætter klientside script på sine websider med Xslt transformeringer, kan man af ukendte årsager få problemer med den resulterende html. Jeg har oplevet (&lt;a href="http://www.sitecore.net/" target="_blank"&gt;Sitecore&lt;/a&gt;) at hvis jeg forsøger at indsætte en række scripttags med reference til eksterne javascriptfiler. Ja, så bliver de indlejret i hinnanden, og resulterer i scriptfejl:&lt;/p&gt;  &lt;pre class="brush: xml;"&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;/script/jquery.cycle.all.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;/script/jquery.easing.1.3.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;/script/jquery.easing.compatibility.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;

&lt;p&gt;Bliver til:&lt;/p&gt;

&lt;pre class="brush: xml;"&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;/script/jquery.cycle.all.js&amp;quot;&amp;gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;/script/jquery.easing.1.3.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;/script/jquery.easing.compatibility.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/script&amp;gt;&lt;/pre&gt;

&lt;p&gt;Jeg opgav at finde den dybere forklaring på problemet, og lavede en lille funktion i stedet:&lt;/p&gt;

&lt;pre class="brush: js;"&gt;var loader = function(url) {
    var tag = document.createElement(&amp;quot;script&amp;quot;);
    tag.attributes.setNamedItem(&amp;quot;type&amp;quot;, &amp;quot;text/javascript&amp;quot;);
    tag.attributes.setNamedItem(&amp;quot;src&amp;quot;, url);
    document.getElementsByTagName(&amp;quot;head&amp;quot;)[0].appendChild(tag);
}&lt;/pre&gt;

&lt;p&gt;I sin enkelthed, så tager den en script-url, og konstruerer en DOM-node af typen: &lt;em&gt;SCRIPT&lt;/em&gt;. De ønskede attributter sættes på noden, for til sidst at indsætte den i head-sektionen. Nu kan jeg så blot lave en lille initialiceringsblok:&lt;/p&gt;

&lt;pre class="brush: js;"&gt;loader(&amp;quot;/script/jquery.cycle.all.js&amp;quot;);
loader(&amp;quot;/script/jquery.easing.1.3.js&amp;quot;);
loader(&amp;quot;/script/jquery.easing.compatibility.js&amp;quot;);&lt;/pre&gt;

&lt;p&gt;Og jeg er fri for scriptfejl…&lt;/p&gt;

&lt;p&gt;Man kan også bruge funktionen, hvis man ønsker at loade sine scripts dynamisk/konditionelt. Inkluderer en type script hvis brugeren har Silverlight installeret, eller loade script ud fra browsertypen. På den måde kan man minimerer de bytes der sendes til klienten.&lt;/p&gt;

&lt;pre class="brush: js;"&gt;loader(navigator.appName.indexOf(&amp;quot;Microsoft&amp;quot;) != -1 ? &amp;quot;ie.js&amp;quot; : &amp;quot;fox.js&amp;quot;);&lt;/pre&gt;

&lt;p&gt;Mulighederne er uendelige.&lt;/p&gt;

&lt;p&gt;Code on…&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Icoder/~4/eVdYBUfpz1U" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/Icoder/~3/eVdYBUfpz1U/post.aspx</link>
      <author>The IMan</author>
      <comments>http://www.icoder.dk/post/2009/11/26/Betinget-scriptinkludering.aspx#comment</comments>
      <guid isPermaLink="false">http://www.icoder.dk/post.aspx?id=2a74be93-7d65-47e8-9e33-c15def5daf72</guid>
      <pubDate>Thu, 26 Nov 2009 08:43:14 +0100</pubDate>
      <dc:publisher>The IMan</dc:publisher>
      <pingback:server>http://www.icoder.dk/pingback.axd</pingback:server>
      <pingback:target>http://www.icoder.dk/post.aspx?id=2a74be93-7d65-47e8-9e33-c15def5daf72</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.icoder.dk/trackback.axd?id=2a74be93-7d65-47e8-9e33-c15def5daf72</trackback:ping>
      <wfw:comment>http://www.icoder.dk/post/2009/11/26/Betinget-scriptinkludering.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.icoder.dk/syndication.axd?post=2a74be93-7d65-47e8-9e33-c15def5daf72</wfw:commentRss>
    <feedburner:origLink>http://www.icoder.dk/post.aspx?id=2a74be93-7d65-47e8-9e33-c15def5daf72</feedburner:origLink></item>
    <item>
      <title>Funktionskæder</title>
      <description>&lt;p&gt;Teknikken bag funktionskædning, også kendt som currying, kan med stor fordel anvendes i JavaScript applikationer. Jeg ved godt at de fleste webudviklere render skrigende bort, og flamer en med etiketter som: Übergeek og akademiker-wannabe, når man nævner funktionel programmering, men hvis man piller lidt af den værste matematik-teori væk, og tager et par simple eksempler, så kan de fleste vist godt se fordelene. &lt;/p&gt;  &lt;p&gt;Currying er den teknik man bruger, når man fylder de første parametre ud i en funktion, og returnerer en ny funktion.&lt;/p&gt;  &lt;pre class="brush:js"&gt;var add = function(x, y){ 
    return x + y; 
} 
var add5 = function(x){ 
    return add(5, x); 
}&lt;/pre&gt;

&lt;p&gt;Så burde de fleste jo nok genkende teknikken. &lt;a href="http://osteele.com/sources/javascript/functional" target="_blank"&gt;Oliver Steele&lt;/a&gt;har lavet en lille fix funktion, som gør currying, eller funktionssammenkædning meget lettere. Lad os sige vi f.eks vil lave en partiel funktion, der hooker op på click-events. Så kan vi deffinerer den således:&lt;/p&gt;

&lt;pre class="brush:js"&gt;var hookupClick = document.body.addEventListener
	.partial(&amp;quot;click&amp;quot;, undefined, false);&lt;/pre&gt;

&lt;p&gt;Og kalde den sådan:&lt;/p&gt;

&lt;pre class="brush:js"&gt;hookupClick(function(){
	alert(&amp;quot;Hello!&amp;quot;);
});&lt;/pre&gt;

&lt;p&gt;Det smarte her, er at man blot udfylder parametrene med &lt;em&gt;undefined &lt;/em&gt;på de pladser, som den nye funktion skal udfylde. Funktionen er for så vidt rimelig simpel:&lt;/p&gt;

&lt;pre class="brush:js"&gt;Function.prototype.partial = function(){
    var fn = this, args = Array.prototype.slice.call(arguments);
    return function(){
      var arg = 0;
      for ( var i = 0; i &amp;lt; args.length &amp;amp;&amp;amp; arg &amp;lt; arguments.length; i++ )
        if ( args[i] === undefined )
          args[i] = arguments[arg++];
      return fn.apply(this, args);
    };
  };&lt;/pre&gt;

&lt;p&gt;Den inplementeres som prototype på &lt;em&gt;Function&lt;/em&gt; objektet. 

  &lt;br /&gt;I første linie initialiceres de private variabler, som kommer til at holde reference til henholdsvis den kaldende funktion (fn) og til de medfølgende argumenter (args). Det smarte her er at funktionen i sig selv returnerer en funktion, som selv har en potentiel argument array, men som samtidig får de oprindelige argumenter med via closure i den private variabel: args. 

  &lt;br /&gt;På kaldetidspunktet laves der et gennemløb af disse argumenter, og den kaldende funktions argumenter indsættes på de pladser hvor man har udfyldt med: &lt;em&gt;undefined&lt;/em&gt;.

  &lt;br /&gt;Til sidst afsluttes med et kald til den oprindelige funktion med den nye funktion som &lt;em&gt;this&lt;/em&gt; parameter og den nye sammensatte argument array (args) som parameter arry.&lt;/p&gt;

&lt;p&gt;Med den funktion, er det super let at lave sine funktionskæder, og husk at funktionen returnerer en funktion, så der er ikke overhead forbundet med at kalde den igen og igen.&lt;/p&gt;

&lt;p&gt;Code on…&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Icoder/~4/NDyclsG4u7Q" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/Icoder/~3/NDyclsG4u7Q/post.aspx</link>
      <author>The IMan</author>
      <comments>http://www.icoder.dk/post/2009/11/24/Funktionskc3a6der.aspx#comment</comments>
      <guid isPermaLink="false">http://www.icoder.dk/post.aspx?id=259a8734-f677-4840-9217-b711dad4b9a7</guid>
      <pubDate>Tue, 24 Nov 2009 08:50:36 +0100</pubDate>
      <dc:publisher>The IMan</dc:publisher>
      <pingback:server>http://www.icoder.dk/pingback.axd</pingback:server>
      <pingback:target>http://www.icoder.dk/post.aspx?id=259a8734-f677-4840-9217-b711dad4b9a7</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.icoder.dk/trackback.axd?id=259a8734-f677-4840-9217-b711dad4b9a7</trackback:ping>
      <wfw:comment>http://www.icoder.dk/post/2009/11/24/Funktionskc3a6der.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.icoder.dk/syndication.axd?post=259a8734-f677-4840-9217-b711dad4b9a7</wfw:commentRss>
    <feedburner:origLink>http://www.icoder.dk/post.aspx?id=259a8734-f677-4840-9217-b711dad4b9a7</feedburner:origLink></item>
    <item>
      <title>Hjælp til IL</title>
      <description>&lt;p&gt;Jeg arbejder for tiden på et lille fritidsprojekt, hvor en af sideeffekterne er at jeg kommer til at lære lidt IL og i særdeleshed; Blive fortrolig med namespacet: System.&lt;em&gt;Reflection.Emit&lt;/em&gt;. &lt;/p&gt;  &lt;p&gt;Min fremgangsmåde har hidtil været at bygge koden op i et demo-projekt, og så bruge Reflector til at se den resulterende IL. Ud fra IL’en, har jeg så forsøgt mig frem, til at &lt;em&gt;Emit’te &lt;/em&gt;instruktioner der kan fremstille den ønskede IL. Lærrerigt, men meget besværligt.&lt;/p&gt;  &lt;p&gt;Så faldt jeg over en pudsig lille plugin til &lt;a href="http://reflector.red-gate.com" target="_blank"&gt;Reflector&lt;/a&gt;:&lt;a href="http://reflectoraddins.codeplex.com/wikipage?title=ReflectionEmitLanguage&amp;amp;referringTitle=Home" target="_blank"&gt;ReflectionEmitLanguage&lt;/a&gt;plugin. &lt;/p&gt;  &lt;p&gt;Når man har dll’en åben i Reflector, kan man vælge: Reflection.Emit i sprogmenuen. I modsætning til de andre sprog der er understøttet, vises der her C# kode, der konstruerer IL til de valgte objekter. Det er uhyre smart..&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.icoder.dk/image.axd?picture=image_9.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.icoder.dk/image.axd?picture=image_thumb_9.png" width="685" height="395" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Her har jeg valgt sæt-metoden på en property, og voilla: BuildMethod&lt;strong&gt;set_Name.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Man må undres over at den plugin overhovedet findes, da publikum må være uhyre lille, men ikke desto mindre findes den, og den har været en stor hjælp på mit projekt. Min nye ven..&lt;/p&gt;  &lt;p&gt;Code on…&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Icoder/~4/ThtvpB5-8Qc" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/Icoder/~3/ThtvpB5-8Qc/post.aspx</link>
      <author>The IMan</author>
      <comments>http://www.icoder.dk/post/2009/11/18/Hjc3a6lp-til-IL.aspx#comment</comments>
      <guid isPermaLink="false">http://www.icoder.dk/post.aspx?id=b2448243-9f1d-4b8d-99f0-f4dcd531e6f9</guid>
      <pubDate>Wed, 18 Nov 2009 09:10:11 +0100</pubDate>
      <category>C#</category>
      <category>Tip</category>
      <dc:publisher>The IMan</dc:publisher>
      <pingback:server>http://www.icoder.dk/pingback.axd</pingback:server>
      <pingback:target>http://www.icoder.dk/post.aspx?id=b2448243-9f1d-4b8d-99f0-f4dcd531e6f9</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.icoder.dk/trackback.axd?id=b2448243-9f1d-4b8d-99f0-f4dcd531e6f9</trackback:ping>
      <wfw:comment>http://www.icoder.dk/post/2009/11/18/Hjc3a6lp-til-IL.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.icoder.dk/syndication.axd?post=b2448243-9f1d-4b8d-99f0-f4dcd531e6f9</wfw:commentRss>
    <feedburner:origLink>http://www.icoder.dk/post.aspx?id=b2448243-9f1d-4b8d-99f0-f4dcd531e6f9</feedburner:origLink></item>
    <item>
      <title>Dynamiske delegates</title>
      <description>&lt;p&gt;Har du nogensinde set Java’s &lt;em&gt;DynamicProxy&lt;/em&gt;, så må du være lidt midsundelig. Man forstår simpelthen ikke, hvorfor folkene bag .NET, ikke har stillet den feature til rådighed. Men hov – det har de! Godt nok ikke så fint indpakket, som i Java, men den er der via &lt;em&gt;Reflection.Emit&lt;/em&gt;. En statisk metode, der lader dig tilføje IL til en assembly runtime. Ret mig hvis jeg har opfattet det forkert, men for mig ser det sådan ud.&lt;/p&gt;  &lt;p&gt;Jeg havde lavet forsøg med &lt;em&gt;CodeDom&lt;/em&gt;, men kan ikke lide det overhead der er med runtime kompilering af kildekode. Så &lt;em&gt;Emit&lt;/em&gt; er blevet min nye ven. Jeg starter ud med en opgave der er meget simpel, men som ikke kan lade sig gøre i Java: Dynamisk delegate. Lad os sige vi har brug for at hooke dynamisk kode op på en klik event – for eksemplets skyld, skal min dynamiske kode blot skrive: Hello world, men det kunne være hvad som helst.&lt;/p&gt;  &lt;p&gt;Man starter et proxy objekt: &lt;em&gt;DynamicMethod&lt;/em&gt;, som man så kan føje IL til via en &lt;em&gt;ILGenerator&lt;/em&gt;.&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;var method = new DynamicMethod(&amp;quot;&amp;quot;, null, null);
var il = method.GetILGenerator();&lt;/pre&gt;

&lt;p&gt;I eksemplet her, vil jeg blot lave en delegate, så derfor er det ikke nødvendigt at angive et navn til metoden, ligesom retur type og parametre angives til &lt;em&gt;null&lt;/em&gt;. Med &lt;em&gt;ILGenerator’&lt;/em&gt;en, kan man nu “Emitte” IL til metoden:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;il.EmitWriteLine(&amp;quot;Hello world&amp;quot;);
// ldstr &amp;quot;HelloWorld&amp;quot;
// call void [mscorlib]System.Console::WriteLine(string)
il.Emit(OpCodes.Ret);
// ret&lt;/pre&gt;

&lt;p&gt;Nu har vi dannet vores IL dynamisk, og så er der ikke andet tilbage, end at hooke metoden op på en event:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;var myEvent = (Action)method.CreateDelegate(typeof(Action));
// Og så rejser vi eventen:
myEvent();&lt;/pre&gt;

&lt;p&gt;Det her er virkelig en kraftfuld feature, og er endnu et værktøj i C# (og VB.NET) udviklerens værktøjskasse med dynamiske muligheder. Eneste ulempe, som jeg ser det, er at man ikke kan debugge i VS.NET, og at man skal til at lære IL.&lt;/p&gt;

&lt;p&gt;Jeg vil spike lidt på C# 4.0, og se om der er kommet features, der kan lette ovenstående.&lt;/p&gt;

&lt;p&gt;Code on…&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Icoder/~4/kVYgiLs_XQo" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/Icoder/~3/kVYgiLs_XQo/post.aspx</link>
      <author>The IMan</author>
      <comments>http://www.icoder.dk/post/2009/11/03/Dan-delegates-dynamisk-med-ReflectionEmit.aspx#comment</comments>
      <guid isPermaLink="false">http://www.icoder.dk/post.aspx?id=ac0a8013-dc62-45f1-9167-7794d8bd0be4</guid>
      <pubDate>Tue, 03 Nov 2009 08:49:00 +0100</pubDate>
      <category>C#</category>
      <dc:publisher>The IMan</dc:publisher>
      <pingback:server>http://www.icoder.dk/pingback.axd</pingback:server>
      <pingback:target>http://www.icoder.dk/post.aspx?id=ac0a8013-dc62-45f1-9167-7794d8bd0be4</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.icoder.dk/trackback.axd?id=ac0a8013-dc62-45f1-9167-7794d8bd0be4</trackback:ping>
      <wfw:comment>http://www.icoder.dk/post/2009/11/03/Dan-delegates-dynamisk-med-ReflectionEmit.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.icoder.dk/syndication.axd?post=ac0a8013-dc62-45f1-9167-7794d8bd0be4</wfw:commentRss>
    <feedburner:origLink>http://www.icoder.dk/post.aspx?id=ac0a8013-dc62-45f1-9167-7794d8bd0be4</feedburner:origLink></item>
    <item>
      <title>Handy extension</title>
      <description>&lt;p&gt;Når man arbejder med anonyme klasser, kommer man fra tid til anden, ud for at skulle udlæse properties fra et anonymt objekt. Hvad gør man så, når man ikke har en type at caste til? &lt;/p&gt;  &lt;p&gt;Ja, principielt er der kun een ting at gøre: Reflection. Det er jo en anelse besværligt, og jeg har derfor lavet en lille extension på object. Den tilføjer metoden: &lt;em&gt;Get,&lt;/em&gt;&amp;#160; på alle objekter. Metoden tage et property-navn som input og returnerer et typen&lt;em&gt; T &lt;/em&gt;eller &lt;em&gt;default(T)&lt;/em&gt; hvis propertien ikke findes. &lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;public static class ObjectExtension
{
    public static T Get&amp;lt;T&amp;gt;(this object container, string propertyName) where T: class
    {
        PropertyDescriptor descriptor = TypeDescriptor.GetProperties(container).Find(propertyName, true);
        if (descriptor == null)
        {
            return default(T);
        }

        return descriptor.GetValue(container) as T;
    }
}&lt;/pre&gt;

&lt;p&gt;Nu er det muligt at tilgå egenskaberne fra de anonyme objekter via en simpel metode:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;var obj = new { 
    Name = &amp;quot;Jesper&amp;quot;, 
    Answer = 43 
};

obj.Get&amp;lt;string&amp;gt;(&amp;quot;Name&amp;quot;)&lt;/pre&gt;

&lt;p&gt;Code on…&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Icoder/~4/wSNxiwMW794" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/Icoder/~3/wSNxiwMW794/post.aspx</link>
      <author>the iman</author>
      <comments>http://www.icoder.dk/post/2009/10/19/Handy-extension.aspx#comment</comments>
      <guid isPermaLink="false">http://www.icoder.dk/post.aspx?id=966170ee-08a8-4f9a-b745-8971622bec19</guid>
      <pubDate>Mon, 19 Oct 2009 08:48:38 +0100</pubDate>
      <category>C#</category>
      <dc:publisher>the iman</dc:publisher>
      <pingback:server>http://www.icoder.dk/pingback.axd</pingback:server>
      <pingback:target>http://www.icoder.dk/post.aspx?id=966170ee-08a8-4f9a-b745-8971622bec19</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.icoder.dk/trackback.axd?id=966170ee-08a8-4f9a-b745-8971622bec19</trackback:ping>
      <wfw:comment>http://www.icoder.dk/post/2009/10/19/Handy-extension.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.icoder.dk/syndication.axd?post=966170ee-08a8-4f9a-b745-8971622bec19</wfw:commentRss>
    <feedburner:origLink>http://www.icoder.dk/post.aspx?id=966170ee-08a8-4f9a-b745-8971622bec19</feedburner:origLink></item>
    <item>
      <title>Hvordan lusker man…</title>
      <description>&lt;h2&gt;Hvordan lusker man personlige oplysninger ud af en Facebook bruger? &lt;/h2&gt;  &lt;p&gt;Hvor alle autorisations- og genkendelses services har haft ekstrem modvind i forsøget på at nå ud til en bred kreds af brugere, såer det helt anderledes ud for Facebook. Jeg har talt med mange gennemsnits brugere, der bare nægter at oprette en LiveID eller en OpenID, da de er meget skeptiske over for sikkerheden – godt hjulpet på vej af advarsler fra de forskellige mediers fantastiske IT redaktioner. De samme brugere har ingen problemer med at klikke på f.eks. &lt;a href="http://www.eb.dk"&gt;www.eb.dk&lt;/a&gt; ’s&amp;#160; &lt;em&gt;Connect with Facebook&lt;/em&gt; knap.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.icoder.dk/image.axd?picture=WindowsLiveWriter/Hvordanluskerman/33A43B37/connect_light_medium_long.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="connect_light_medium_long" border="0" alt="connect_light_medium_long" src="http://www.icoder.dk/image.axd?picture=WindowsLiveWriter/Hvordanluskerman/397EDED0/connect_light_medium_long_thumb.gif" width="169" height="21" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Trods advarslen skulle være åbenbar:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.icoder.dk/image.axd?picture=WindowsLiveWriter/Hvordanluskerman/383A45F1/image.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.icoder.dk/image.axd?picture=WindowsLiveWriter/Hvordanluskerman/6E5BBE40/image_thumb.png" width="244" height="212" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Forbind til Facebook, men accepter betingelserne, og lad den forbundne site få adgang til alle dine oplysninger og alle dine venners oplysninger! I betingelserne står der blandt andet:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;you grant us a non-exclusive, transferable, sub-licensable, royalty-free, worldwide license to use any IP content that you post on or in connection with Facebook (&amp;quot;IP License&amp;quot;).&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Du giver altså i dette tilfælde Ekstrabledet ret til, at bruge alt dit meteriale og alle dine oplysninger! Hvordan der er nogen der accepterer disse betingelser fatter jeg ikke. (Ekstrabladet er blot nævnt her for eksemplet, det kunne lige så godt have været en af de 1000 andre Facebook applikationer der er der ude).&lt;/p&gt;  &lt;p&gt;Hvor svært er det så at lokke de oplysninger ud af brugeren? Er det kun dygtige hackere der kan få disse oplysninger? Nej – det er alle der kan læse en API dokumentation… Via API’et kan man itererer igennem alle billeder, venner eller videoer uden problemer. Her står jeg midt i en for-each løkke, og har adgang til: politisk overbevisning, religion, sexuel observans og billeder. Man har adgang til alt undtagen e-mail adressen – den holder de (Facebook) for sig selv.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.icoder.dk/image.axd?picture=WindowsLiveWriter/Hvordanluskerman/03F5F6DE/image.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.icoder.dk/image.axd?picture=WindowsLiveWriter/Hvordanluskerman/3AEFD517/image_thumb.png" width="310" height="276" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Ikke så ringe, når man tænker på jeg kun har brugt omkring 1 dag på at få en komplet applikation op og køre…&lt;/p&gt;  &lt;p&gt;Hvorfor er der nogle websites, der kan tillade sig alt, uden at nogen stiller spørgsmål, og andre er under ekstrem granskning hele tiden – google.com &amp;lt;—&amp;gt; bing.com.&lt;/p&gt;  &lt;p&gt;Nå – jeg må videre i mit beskidte arbejde med at luske personlige oplysninger ud af de godtroende brugere. &lt;/p&gt;  &lt;p&gt;MUA-HA-HAAAaaa.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Icoder/~4/Ad8sBzvGiiM" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/Icoder/~3/Ad8sBzvGiiM/post.aspx</link>
      <author>The IMan</author>
      <comments>http://www.icoder.dk/post/2009/10/16/Kann-man-hente-personlige-oplysninger-om-en-Facebook-bruger.aspx#comment</comments>
      <guid isPermaLink="false">http://www.icoder.dk/post.aspx?id=94957dc5-bc6b-414d-8fe2-bad51678f1b3</guid>
      <pubDate>Fri, 16 Oct 2009 08:55:06 +0100</pubDate>
      <category>Facebook</category>
      <dc:publisher>The IMan</dc:publisher>
      <pingback:server>http://www.icoder.dk/pingback.axd</pingback:server>
      <pingback:target>http://www.icoder.dk/post.aspx?id=94957dc5-bc6b-414d-8fe2-bad51678f1b3</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.icoder.dk/trackback.axd?id=94957dc5-bc6b-414d-8fe2-bad51678f1b3</trackback:ping>
      <wfw:comment>http://www.icoder.dk/post/2009/10/16/Kann-man-hente-personlige-oplysninger-om-en-Facebook-bruger.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.icoder.dk/syndication.axd?post=94957dc5-bc6b-414d-8fe2-bad51678f1b3</wfw:commentRss>
    <feedburner:origLink>http://www.icoder.dk/post.aspx?id=94957dc5-bc6b-414d-8fe2-bad51678f1b3</feedburner:origLink></item>
    <item>
      <title>Hvordan: $.databind</title>
      <description>&lt;p&gt;Jeg har &lt;a href="http://www.icoder.dk/post/2009/07/30/Clientside-databinding.aspx"&gt;tidligere&lt;/a&gt; vist hvordan man kan skrue et simpelt klientside databindings framework sammen med &lt;a title="Wiki artikel" target="_blank" href="http://da.wikipedia.org/wiki/JavaScript"&gt;JavaScript&lt;/a&gt; og &lt;a target="_blank" href="http://jquery.com/"&gt;jQuery&lt;/a&gt;. Her vil jeg vise hvordan jeg bruger det til løsningen af simple som i komplekse opgaver.&lt;/p&gt;  &lt;h2&gt;Scenarie: Visning af data i en tabel&lt;/h2&gt;  &lt;p&gt;Jeg starter med at hente de data jeg skal bruge. Her foretrækker jeg at modtage data der er serialiceret som &lt;a href="http://www.json.org"&gt;JSON&lt;/a&gt;, men Xml kunne lige så godt have været brugt. Oftest bruger jeg en &lt;em&gt;Controller&lt;/em&gt;, der sættes til at returnerer et &lt;em&gt;ActionResult&lt;/em&gt; af typen: &lt;em&gt;JsonResult&lt;/em&gt;. Det har vist sig at være den nemmeste måde, og den understøttes direkte i &lt;em&gt;MVC frameworket&lt;/em&gt;. En typisk implementering:&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;public ActionResult GetAppointments(int userid, DateTime date)
{
     var result = new JsonResult();
     result.Data = model.GetAppointments(userid, date);
     return result;
}&lt;/pre&gt;

&lt;p&gt;Andet skal der ikke til for at returnerer data i et kompakt og hurtigt format. Ovenstående kontroler vil give et resultat af formen:&lt;/p&gt;

&lt;pre class="brush: javascript;"&gt;[
{uid: &amp;quot;12-aa-234&amp;quot;, time: &amp;quot;9:00&amp;quot;, subject: &amp;quot;Morgenmad&amp;quot;, description: &amp;quot;Fælles spisning i kantinen&amp;quot; },
{uid: &amp;quot;12-aa-235&amp;quot;, time: &amp;quot;12:30&amp;quot;, subject: &amp;quot;Frokost&amp;quot;, description: &amp;quot;Fælles spisning i kantinen&amp;quot; },
{uid: &amp;quot;12-aa-236&amp;quot;, time: &amp;quot;13:45&amp;quot;, subject: &amp;quot;Sprint planning I&amp;quot;, description: &amp;quot;Vi skal have planlagt næste måneds sprint\nProductowner: Henning&amp;quot; }&lt;br /&gt;];&lt;/pre&gt;

&lt;p&gt;Vi kan altså i vores JavaScript kode, kalde kontrolleren, og få data retur. Det gøres nemt med jQuery:&lt;/p&gt;

&lt;pre class="brush: js;"&gt;$.getJSON(
    &amp;quot;/Schedule/GetAppointments&amp;quot;, 
    {userid: &amp;quot;JJ&amp;quot;, date: new Date()},
    onDataRecieved
);&lt;/pre&gt;

&lt;p&gt;Læg mærke til at man i metodekaldet kan angive en callback funktion, der skal udføres, når data kommer retur. Metoden kan have to parametre;&lt;em&gt;&amp;#160; data og status&lt;/em&gt;. Data er det Json objekt der returneres fra servicen, og status er en streng der blandt andet kan have værdien “success” og “failed”, alt efter hvordan kaldet forløb, men går alt godt, har man nu det dataobjekt, der blev genereret på serveren, som parameter i callbackmetoden. Vi kan nu tage skridt til at vise data.&lt;/p&gt;

&lt;p&gt;Her er det min databind extension kommer ind i billedet. Jeg starter med at lave Html til visningen:&lt;/p&gt;

&lt;pre class="brush: xml;"&gt;&amp;lt;table id=&amp;quot;myGrid&amp;quot;&amp;gt;
    &amp;lt;tr&amp;gt;
        &amp;lt;td&amp;gt;&amp;lt;a href=&amp;quot;/Schedule/Detail/{uid}&amp;quot; title=&amp;quot;{description}&amp;quot;&amp;gt;{time}&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;{subject}&amp;lt;/td&amp;gt;
    &amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;&lt;/pre&gt;

&lt;p&gt;Læg mærke til “tuborg”-klamme syntaksen. Det er databindingssyntaksen for mit lille framework, og vi kan nu kalde extensionen via jQuery:&lt;/p&gt;

&lt;pre class="brush: js;"&gt;function onDataRecieved(data) {
    $(&amp;quot;#myGrid tr&amp;quot;).databind(data);
}&lt;/pre&gt;

&lt;p&gt;Voilla – vi viser data i tabel-html’en. Læg mærke til at metoden tager udgangspunkt i det element som jQuery selectoren rammer. Havde jeg brugt: $(&amp;quot;#myGrid&amp;quot;), var det hele tabellen der var blevet gentaget for hver record. I det jeg rammer TR, fungerer den dynamiske tabel.&lt;/p&gt;

&lt;p&gt;Code on… &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Icoder/~4/ChyEf3eBQiw" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/Icoder/~3/ChyEf3eBQiw/post.aspx</link>
      <author>the iman</author>
      <comments>http://www.icoder.dk/post/2009/10/01/Klientside-databinding.aspx#comment</comments>
      <guid isPermaLink="false">http://www.icoder.dk/post.aspx?id=3ee05ef5-7e03-4384-9482-51ee7c8f20b4</guid>
      <pubDate>Thu, 01 Oct 2009 11:16:30 +0100</pubDate>
      <category>jQuery snippet</category>
      <category>jQuery</category>
      <category>Hvordan</category>
      <dc:publisher>the iman</dc:publisher>
      <pingback:server>http://www.icoder.dk/pingback.axd</pingback:server>
      <pingback:target>http://www.icoder.dk/post.aspx?id=3ee05ef5-7e03-4384-9482-51ee7c8f20b4</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.icoder.dk/trackback.axd?id=3ee05ef5-7e03-4384-9482-51ee7c8f20b4</trackback:ping>
      <wfw:comment>http://www.icoder.dk/post/2009/10/01/Klientside-databinding.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.icoder.dk/syndication.axd?post=3ee05ef5-7e03-4384-9482-51ee7c8f20b4</wfw:commentRss>
    <feedburner:origLink>http://www.icoder.dk/post.aspx?id=3ee05ef5-7e03-4384-9482-51ee7c8f20b4</feedburner:origLink></item>
    <item>
      <title>Arrays er objekter</title>
      <description>&lt;p&gt;&lt;em&gt;Eller: Hvordan begrænser man virkeområdet for sine klasser i JavaScript?&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Bruger du mit &lt;a href="http://www.icoder.dk/page/jsCoreExtensions.aspx"&gt;jsCoreExtensions&lt;/a&gt;, eller prototyper du &lt;em&gt;Array eller Object&lt;/em&gt; i dine &lt;a title="Wiki artikel" target="_blank" href="http://da.wikipedia.org/wiki/JavaScript"&gt;JavaScript&lt;/a&gt;, så vil du på et eller andet tidspunkt løbe ind i det problem jeg taler om her (hvis du da ikke allerede er det).&lt;/p&gt;  &lt;p&gt;Hvis du f.eks. bruger en &lt;em&gt;for(in)&lt;/em&gt; løkke, eller kalder &lt;em&gt;Array.push&lt;/em&gt;, så får du &lt;em&gt;Objektet understøtter ikke denne metode&lt;/em&gt; fejl. Fejlen opstår når man laver udviddelser til &lt;em&gt;Array&lt;/em&gt; via &lt;em&gt;prototype&lt;/em&gt; egenskaben. Så er arrayen nemlig ikke længere at betragte som en array, men som et objekt. Derfor har man ikke længere de specielle metoder fra array objektet til rådighed. Hvad gør man så, hvis man bruger mit lille bibliotek for at kunne “LINQ’e” i JavaScript?&lt;/p&gt;  &lt;pre class="brush: js;"&gt;myArray
	.where(&amp;quot;itm.age &amp;gt; 35&amp;quot;)
	.select(function(itm){
        	return {
			name: itm.name,
			isApproved : true
		};
    	});&lt;/pre&gt;

&lt;p&gt;Her kan vi ikke nøjes med at &lt;a href="http://www.icoder.dk/post/2009/06/24/Namespace-i-JavaScript.aspx"&gt;namespace&lt;/a&gt; sig ud af problemerne. Man har brug for at indkredse sit virkeområde, og fremstille en ny klasse (objekt). Mine array extensions er inspireret af LINQ, og bruger derfor &lt;a href="http://stackoverflow.com/questions/1119799/method-chaining-in-c"&gt;method-chaining&lt;/a&gt;, for at opnå den “rigtige” LINQ feel. Mit nye objekt skal altså returnerer en instans af sig selv ved hver metodekald:&lt;/p&gt;

&lt;pre class="brush: js;"&gt;var Chain = function(array) {
    // privat medlem
    var _array = array;
    return {
        metode1: function(arg) {
            // Impl. af metode 1 funktionalitet der arbejder med _array
            // returner frisk Chain
            return new Chain(_array);
        },
        metode2: function(arg) {
            // Impl. af metode 2 funktionalitetder arbejder med _array
            // returner frisk Chain
            return new Chain(_array);
        }
    }
}&lt;/pre&gt;

&lt;p&gt;På den måde får man pakket sin array logik ind, og man får ikke problemer med 3. parts kode, der arbejder med Arrays. Det eneste minus ved dette mønster, er at man nu er tvunget til at konstruerer et nyt objekt, for at kunne benytte funktionaliteten:&lt;/p&gt;

&lt;pre class="brush: js;"&gt;var myArray = [1, 2, 3, 6, 9 ,8];

// Tidligere: 
myArray.metode1().metode2();

// Med indkapsling
var chain = new Chain(myArray);

chain.metode2().metode1();&lt;/pre&gt;

&lt;p&gt;Den pris finder jeg lille nok til at jeg nu vil implementerer det på mine Array-prototype-extensions. Da man så ikke længere kan kalde metoderne for core-extensions, vil jeg flytte dem ud af jsCoreExtensions, og ind i et nyt array-linq bibliotek. Jeg vender tilbage når arbejdet er afprøvet.&lt;/p&gt;

&lt;p&gt;Code on…&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Icoder/~4/gGGzbXtGkjo" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/Icoder/~3/gGGzbXtGkjo/post.aspx</link>
      <author>the iman</author>
      <comments>http://www.icoder.dk/post/2009/09/28/JavaScript-sandboxing.aspx#comment</comments>
      <guid isPermaLink="false">http://www.icoder.dk/post.aspx?id=9f549d0a-044f-4f0b-add8-2ab427cb70b1</guid>
      <pubDate>Mon, 28 Sep 2009 08:39:46 +0100</pubDate>
      <category>JavaScript</category>
      <dc:publisher>the iman</dc:publisher>
      <pingback:server>http://www.icoder.dk/pingback.axd</pingback:server>
      <pingback:target>http://www.icoder.dk/post.aspx?id=9f549d0a-044f-4f0b-add8-2ab427cb70b1</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.icoder.dk/trackback.axd?id=9f549d0a-044f-4f0b-add8-2ab427cb70b1</trackback:ping>
      <wfw:comment>http://www.icoder.dk/post/2009/09/28/JavaScript-sandboxing.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.icoder.dk/syndication.axd?post=9f549d0a-044f-4f0b-add8-2ab427cb70b1</wfw:commentRss>
    <feedburner:origLink>http://www.icoder.dk/post.aspx?id=9f549d0a-044f-4f0b-add8-2ab427cb70b1</feedburner:origLink></item>
    <item>
      <title>Dato SQL roundtrip</title>
      <description>&lt;p&gt;Jeg var måske lidt forvirret da jeg skrev min &lt;a href="http://www.icoder.dk/post/2009/09/21/Hvilken-dato-gemmer-du.aspx"&gt;post om datoer i går&lt;/a&gt;, så jeg kommer lige med en specificering af mine undersøgelser. Jeg tager udgangspunkt i følgende lille konsol app:&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;var sel = new SqlCommand(&amp;quot;SELECT TOP 1 * FROM DatoTabel order by id desc&amp;quot;, forbindelse);
var insert = new SqlCommand(&amp;quot;INSERT INTO DatoTabel (Dato) VALUES (@dato)&amp;quot;, forbindelse);

var dato = new DateTime(2009, 9, 21, 12, 0, 0);

Console.WriteLine(&amp;quot;DateTime instans&amp;quot;);
Console.WriteLine(&amp;quot;Værdi: {0:o}&amp;quot;, dato);
Console.WriteLine(&amp;quot;Kind: {0}&amp;quot;, dato.Kind);
Console.WriteLine(&amp;quot;====================&amp;quot;);

insert.Parameters.AddWithValue(&amp;quot;@dato&amp;quot;, dato);
forbindelse.Open();
insert.ExecuteNonQuery();

using (var r = sel.ExecuteReader())
    if (r.Read())
        dato = r.GetDateTime(1);

forbindelse.Close();

Console.WriteLine(&amp;quot;SQL roundtripped instans&amp;quot;);
Console.WriteLine(&amp;quot;Værdi: {0:o}&amp;quot;, dato);
Console.WriteLine(&amp;quot;Kind: {0}&amp;quot;, dato.Kind);&lt;/pre&gt;

&lt;p&gt;Den giver følgende output:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.icoder.dk/image.axd?picture=image_5.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.icoder.dk/image.axd?picture=image_thumb_5.png" width="290" height="126" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Her skal man bemærke at variablen: dato, bliver instantieret til et specifik dato-klokkeslæt. &lt;em&gt;Kind&lt;/em&gt; er som default &lt;em&gt;Unspecified, &lt;/em&gt;og SQL roundtrippet returnerer også &lt;em&gt;Unspecified. &lt;/em&gt;Helt som man kunne forvente (men var det det man forventede?).&lt;/p&gt;

&lt;p&gt;Hvis vi prøver med den overload, hvor man kan specificerer &lt;em&gt;Kind&lt;/em&gt;:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;var dato = new DateTime(2009, 9, 21, 12, 0, 0, DateTimeKind.Local);
// DateTime.Now har også Kind=Local&lt;/pre&gt;

&lt;p&gt;Så får man følgende overraskende resultat:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.icoder.dk/image.axd?picture=image_6.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.icoder.dk/image.axd?picture=image_thumb_6.png" width="351" height="146" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vi gemmer en dato med tids-zone, men får en “DK-UTC” værdi tilbage – altså det samme klokkeslæt, men man har mistet zone informationen. Nu er man altså overladt til konventioner, når man hiver datoer ud af databasen. Det viser sig at vi helt upåagtet har en&amp;#160; konvention der siger:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Når vi gemmer en DateTime i databasen, så gemmer vi den med dansk zone-offset som udgangspunkt.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Man bør derfor rette sin udlæsningskode til på følgende måde, når man har den konvention:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;dato = DateTime.SpecifyKind(r.GetDateTime(1), DateTimeKind.Local);&lt;/pre&gt;

&lt;p&gt;Det vil give følgende output:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.icoder.dk/image.axd?picture=image_7.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.icoder.dk/image.axd?picture=image_thumb_7.png" width="373" height="120" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Så er der styr på zonen… så længe klienten har dansk som lokal indstilling… Man kan altså få overraskende resultater, hvis man f.eks. har en webserver der står i USA, og man bruger ovenstående konvention, for så bliver man offsat med 6 timer.&lt;/p&gt;

&lt;p&gt;Hvis man starter på en ny database, vil den rigtige løsning være at vedtage en konvention, der siger at alle DateTime værdier der gemmes i databasen, skal tolkes som UTC. På den måde vil man ikke blive snydt af klienter/servere med forskellige zoner. Man skal så sørge for at konverterer DateTime objektet inden man gemmer, og så skal man specificerer Utc når man henter:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;Console.WriteLine(&amp;quot;DateTime instans&amp;quot;);
Console.WriteLine(&amp;quot;Værdi: {0:o}&amp;quot;, dato);
Console.WriteLine(&amp;quot;Kind: {0}&amp;quot;, dato.Kind);
Console.WriteLine(&amp;quot;====================&amp;quot;);

insert.Parameters.AddWithValue(&amp;quot;@dato&amp;quot;, dato.ToUniversalTime());
forbindelse.Open();
insert.ExecuteNonQuery();

using (var r = sel.ExecuteReader())
    if (r.Read())
        dato = DateTime.SpecifyKind(r.GetDateTime(1), DateTimeKind.Utc);

forbindelse.Close();&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Det giver følgende output:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.icoder.dk/image.axd?picture=image_8.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.icoder.dk/image.axd?picture=image_thumb_8.png" width="352" height="127" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nu kan ma så lade klienten tage stilling til hvilken tids-zone der skal vises, og man kan kalde &lt;em&gt;ToLocalTime&lt;/em&gt; metoden, hvis man vil udlæse i den aktuelle tids-zone.&lt;/p&gt;

&lt;p&gt;Alternativt, kan man vælge en af de nye felttyper i SQL Server 2008, hvor man har DateTimeOffset, som jo gemmer zone info. Husk bare at en konvertering fra DateTime, skal tage højde for den implicitte konvention på de eksisterende felter.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Icoder/~4/_7NaE5n5SXw" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/Icoder/~3/_7NaE5n5SXw/post.aspx</link>
      <author>the iman</author>
      <comments>http://www.icoder.dk/post/2009/09/22/Dato-SQL-roundtrip.aspx#comment</comments>
      <guid isPermaLink="false">http://www.icoder.dk/post.aspx?id=5946e05b-bc6f-4d6e-94a7-47d3ba69575f</guid>
      <pubDate>Tue, 22 Sep 2009 11:28:06 +0100</pubDate>
      <category>C#</category>
      <dc:publisher>the iman</dc:publisher>
      <pingback:server>http://www.icoder.dk/pingback.axd</pingback:server>
      <pingback:target>http://www.icoder.dk/post.aspx?id=5946e05b-bc6f-4d6e-94a7-47d3ba69575f</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.icoder.dk/trackback.axd?id=5946e05b-bc6f-4d6e-94a7-47d3ba69575f</trackback:ping>
      <wfw:comment>http://www.icoder.dk/post/2009/09/22/Dato-SQL-roundtrip.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.icoder.dk/syndication.axd?post=5946e05b-bc6f-4d6e-94a7-47d3ba69575f</wfw:commentRss>
    <feedburner:origLink>http://www.icoder.dk/post.aspx?id=5946e05b-bc6f-4d6e-94a7-47d3ba69575f</feedburner:origLink></item>
    <item>
      <title>Hvilken dato gemmer du?</title>
      <description>&lt;p&gt;Jeg sidder for tiden og arbejder med en applikation, der håndterer kalender events. Applikationen er gammel, og har masser af data. Den gamle data ligger i SQl server, så vi får ingen problemer når vi skal til at håndterer tids-zoner…øhh vel?&lt;/p&gt;  &lt;p&gt;Hvordan er det lige at vi gemmer DateTime med &lt;em&gt;SqlClient&lt;/em&gt; i .NET frameworket?&lt;/p&gt;  &lt;p&gt;Jeg har prøvet at undersøge sagen lidt nærmere, og jeg må sig jeg blev lidt overrasket. Når man instantierer en &lt;em&gt;DateTime&lt;/em&gt; struct, får den automatisk sat egenskaben; &lt;em&gt;Kind&lt;/em&gt;&amp;#160; til &lt;em&gt;Local.&lt;/em&gt; Det vil sige at følgende kode:&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;var dato = new DateTime(2009, 9, 22, 12, 0, 0);
Console.Write(dato.ToString(&amp;quot;o&amp;quot;));&lt;/pre&gt;

&lt;p&gt;Giver følgende output: &lt;strong&gt;2009-09-22T12:00:00+2&lt;/strong&gt; (når det bliver kørt i dag 21/9 2009)&lt;/p&gt;

&lt;p&gt;Når jeg så gemmer værdien i Sql-server med &lt;em&gt;SqlClient&lt;/em&gt;, og læser den ud igen, så er &lt;em&gt;Kind&lt;/em&gt; egenskaben gået tabt. Den er nu angivet til &lt;em&gt;Unspecified, &lt;/em&gt;og tidspunktet er stadig &lt;strong&gt;12:00.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Man putter altså tids-zone info ind, men den forsvinder i databasen. Det skyldes at Sql servers felttype, kun indeholder en dato-tid værdi – ikke tids-zone værdi. Den kan altså ikke bare lade udlæsninger fra klienten blive angivet til &lt;em&gt;Local&lt;/em&gt; – det har den simpelthen ikke viden om. &lt;/p&gt;

&lt;p&gt;Hvad gør man så når man vil kode en applikation, der kan håndterer forskellige tids-zoner?&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Man skal vedtage en konvention, om at DateTime kolonnerne i databasen, skal tolkes som UTC. &lt;/li&gt;

  &lt;li&gt;Man skal koverterer inputdatoer til UTC når man sætter &lt;em&gt;SqlParameter&lt;/em&gt; værdier. &lt;/li&gt;

  &lt;li&gt;Man skal specificerer &lt;em&gt;Kind&lt;/em&gt; til &lt;em&gt;Utc&lt;/em&gt;, når man udlæser fra databasen &lt;/li&gt;
&lt;/ol&gt;

&lt;pre class="brush: csharp;"&gt;ins.Parameters.AddWithValue(&amp;quot;@dato&amp;quot;, dato.ToUniversalTime());&lt;/pre&gt;

&lt;pre class="brush: csharp;"&gt;var dato = DateTime.SpecifyKind(sqlReader.GetDateTime(1), DateTimeKind.Local)&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Følger man de retningslinier, får ma ingen problemer.&lt;/p&gt;

&lt;p&gt;Har man et legacy system, hvor man har gemt datoer i dansk zone, skal man enten&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Konverterer alle datofelter til UTC &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;eller &lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Isolerer koden der læser/skriver til kolonnerne, og tvinge dem til at angive &lt;em&gt;Kind til Local, &lt;/em&gt;ved alle læsninger. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hvad vælger du?&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Icoder/~4/omq5l3XdW98" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/Icoder/~3/omq5l3XdW98/post.aspx</link>
      <author>the iman</author>
      <comments>http://www.icoder.dk/post/2009/09/21/Hvilken-dato-gemmer-du.aspx#comment</comments>
      <guid isPermaLink="false">http://www.icoder.dk/post.aspx?id=60ba46b6-c656-4760-bf1f-3f8f091882d7</guid>
      <pubDate>Mon, 21 Sep 2009 15:30:09 +0100</pubDate>
      <category>C#</category>
      <dc:publisher>the iman</dc:publisher>
      <pingback:server>http://www.icoder.dk/pingback.axd</pingback:server>
      <pingback:target>http://www.icoder.dk/post.aspx?id=60ba46b6-c656-4760-bf1f-3f8f091882d7</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.icoder.dk/trackback.axd?id=60ba46b6-c656-4760-bf1f-3f8f091882d7</trackback:ping>
      <wfw:comment>http://www.icoder.dk/post/2009/09/21/Hvilken-dato-gemmer-du.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.icoder.dk/syndication.axd?post=60ba46b6-c656-4760-bf1f-3f8f091882d7</wfw:commentRss>
    <feedburner:origLink>http://www.icoder.dk/post.aspx?id=60ba46b6-c656-4760-bf1f-3f8f091882d7</feedburner:origLink></item>
    <item>
      <title>2 teams – 2 parsere</title>
      <description>&lt;p&gt;Eller: Hvorfor ved højre hånd ikke hvad venstre gør?&lt;/p&gt;  &lt;p&gt;Jeg har tidligere &lt;a href="http://www.icoder.dk/post/2009/08/20/Json-datoer-er-sexede.aspx"&gt;plederet&lt;/a&gt; for at man skulle ligge sig op ad MS’s &lt;em&gt;System.Web.Script.JavaScriptSerializer &lt;/em&gt;til serialicering af Json objekter, og specielt datoer. Det virker super fint, selvom jeg har været noget ked af formatets læsbarhed (en egenskab som ikke er helt ubetydelig). Nu bliver jeg så opmærksom på at alle de store browsere: IE, Firefox og Chrome er begyndt at understøtte native Json serialicering. Ja man kan nu skrive følgende, uden at inkluderer 3. parts biblioteker:&lt;/p&gt;  &lt;pre class="brush: js;"&gt;var json = JSON.stringify(new Date());
alert(json);&lt;/pre&gt;

&lt;p&gt;Men hvordan serialicerer den nye parser så datoer? Jo resultatet er overraskende: &lt;strong&gt;2009-09-16T22:00:00Z&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Implementeringen understøtter iso datoer som også kendes fra xml!&lt;/p&gt;

&lt;p&gt;Det er jo dyb krise at man på den ene side har en server teknologi der serialicerer datoer på en måde, og en klient teknologi der serialicerer på en anden.&lt;/p&gt;

&lt;p&gt;Bruger man &lt;em&gt;System.Web.Script.JavaScriptSerializer &lt;/em&gt;på serveren, kan man ikke udnytte den overlegne performance som serializeren har på klienten.&lt;/p&gt;

&lt;p&gt;Heldigvis understøtter &lt;em&gt;JSON.parse &lt;/em&gt;en mulighed for at man efterbehandler resultatet, inden objektet returneres. Man giver bare metoden en funktion som 2. parameter:&lt;/p&gt;

&lt;pre class="brush: js;"&gt;var date = JSON.parse(json, function(key, value){
    // Implementer efterbehandling
});&lt;/pre&gt;

&lt;p&gt;Det åbner muligheden for at man på klienten kan understøtte MS’s specielle format, og Rick Stahl har implementeret den form for efterbehandling i et &lt;a href="http://www.west-wind.com/weblog/posts/729630.aspx"&gt;minimalt bibliotek&lt;/a&gt;, så man kan håndterer MS dato serialicering.&lt;/p&gt;

&lt;p&gt;Det løser problemet, men havde højre hånd bare vidst hvad venstre foretog sig…&lt;/p&gt;

&lt;p&gt;Code on…&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Icoder/~4/yy31XDt9Obw" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/Icoder/~3/yy31XDt9Obw/post.aspx</link>
      <author>the iman</author>
      <comments>http://www.icoder.dk/post/2009/09/16/2-teams-e28093-2-parsere.aspx#comment</comments>
      <guid isPermaLink="false">http://www.icoder.dk/post.aspx?id=b060fd51-5aef-4ae7-88f0-cdc8b0a1b408</guid>
      <pubDate>Wed, 16 Sep 2009 09:37:15 +0100</pubDate>
      <category>JavaScript</category>
      <dc:publisher>the iman</dc:publisher>
      <pingback:server>http://www.icoder.dk/pingback.axd</pingback:server>
      <pingback:target>http://www.icoder.dk/post.aspx?id=b060fd51-5aef-4ae7-88f0-cdc8b0a1b408</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.icoder.dk/trackback.axd?id=b060fd51-5aef-4ae7-88f0-cdc8b0a1b408</trackback:ping>
      <wfw:comment>http://www.icoder.dk/post/2009/09/16/2-teams-e28093-2-parsere.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.icoder.dk/syndication.axd?post=b060fd51-5aef-4ae7-88f0-cdc8b0a1b408</wfw:commentRss>
    <feedburner:origLink>http://www.icoder.dk/post.aspx?id=b060fd51-5aef-4ae7-88f0-cdc8b0a1b408</feedburner:origLink></item>
    <item>
      <title>En ikke helt problemfri opdatering</title>
      <description>Jeg er faldet over et website, der bruger jQuery til at styre forskellige layout ønsker, og til at hooke forskellige handlere op på events. Det sprang mig i øjnene, at sitet havde reference til JQuery 1.1, og jeg opdaterede selvfølgelig straks. Jeg havde brug for nogle af de animations effekter der kom med 1.3 - Det skulle jo ikke være noget problem vel? EEEEIk! Wrong answer. Hele skidtet brager ned, og primært på grund af nøglefunktionen i JQuery - &lt;em&gt;$(exp)&lt;/em&gt;. Den melder: &lt;em&gt;Objektet understøtter ikke denne egenskab eller metode&lt;/em&gt;, når koden forsøger at lave følgende udvælgelse: &lt;em&gt;$(&amp;quot;*[@behaviours='inputInitValue']&amp;quot;)&lt;/em&gt;.   &lt;p&gt;Det viser sig nemlig at &lt;a target="_blank" href="http://jquery.com/"&gt;jQuery&lt;/a&gt; tidligere brugte XPath til at udfører sine søgninger i DOM’en med. Man fandt bare ud af at en mere optimeret søgning i kilde-html’en med regulære udtryk, performede langt bedre. Det jeg oplever her, er blot et grænsetilfælde af konverteringen, som den nye parser ikke kan håndterer. &lt;/p&gt;  &lt;p&gt;Men hvad gør man så, når man har kode der tidligere kunne udvælge på tilstedeværelsen af en bestemt attribut værdi?&lt;/p&gt;  &lt;p&gt;Det viser sig at man har valgt en syntaks, der er lidt mindre kryptisk – man har fjernet @ fra syntaksen, og så har man jo lige tilføjet et par ekstra features.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Den simple: [attr], som udvælger elementer med den angivne attribut uanset værdi &lt;/li&gt;    &lt;li&gt;[attr=value], udvælger elemeter der har en attribut med en bestemt &lt;em&gt;value&lt;/em&gt; &lt;/li&gt;    &lt;li&gt;[[attr!=value], som udvælger de elementer der har attributten, men som ikke har den angivne &lt;em&gt;value&lt;/em&gt; &lt;/li&gt;    &lt;li&gt;Mere eksotisk: [attr^=value], som udvælger de elemeter der har en attributværdi der starter med &lt;em&gt;value&lt;/em&gt; &lt;/li&gt;    &lt;li&gt;Endnu mere eksotisk: [attr$=value], som udvælger de attributter der har en værdi der ender med &lt;em&gt;value&lt;/em&gt; &lt;/li&gt;    &lt;li&gt;[attr*=value], som udvælger elementer med en attributværdi der indeholder &lt;em&gt;value&lt;/em&gt; &lt;/li&gt;    &lt;li&gt;Flere attributfiltre kan tilføjes ved at man kæder dem: [attr1=value][attr2=value] osv. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Ved første øjekast, ser det måske lidt kryptisk ud, men kender man RegExp, kan man hurtigt se at der er en linje i syntaksen, og den er ret nem at huske.&lt;/p&gt;  &lt;p&gt;Det API er bare så fyldt med gode sager, og jeg bliver dagligt forundret over de måder man kan kode &lt;a title="Wiki artikel" target="_blank" href="http://da.wikipedia.org/wiki/JavaScript"&gt;JavaScript&lt;/a&gt; på med hjælp fra jQuery.&lt;/p&gt;  &lt;p&gt;Code on…&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Icoder/~4/9z9Ojl1l7qM" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/Icoder/~3/9z9Ojl1l7qM/post.aspx</link>
      <author>the iman</author>
      <comments>http://www.icoder.dk/post/2009/09/15/En-ikke-helt-problemfri-opdatering.aspx#comment</comments>
      <guid isPermaLink="false">http://www.icoder.dk/post.aspx?id=7f91f6df-6c58-4613-9501-eb93f77c7aeb</guid>
      <pubDate>Tue, 15 Sep 2009 09:00:44 +0100</pubDate>
      <category>jQuery</category>
      <dc:publisher>the iman</dc:publisher>
      <pingback:server>http://www.icoder.dk/pingback.axd</pingback:server>
      <pingback:target>http://www.icoder.dk/post.aspx?id=7f91f6df-6c58-4613-9501-eb93f77c7aeb</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.icoder.dk/trackback.axd?id=7f91f6df-6c58-4613-9501-eb93f77c7aeb</trackback:ping>
      <wfw:comment>http://www.icoder.dk/post/2009/09/15/En-ikke-helt-problemfri-opdatering.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.icoder.dk/syndication.axd?post=7f91f6df-6c58-4613-9501-eb93f77c7aeb</wfw:commentRss>
    <feedburner:origLink>http://www.icoder.dk/post.aspx?id=7f91f6df-6c58-4613-9501-eb93f77c7aeb</feedburner:origLink></item>
  </channel>
</rss>
