<?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>Kruse-Net.dk &#187; Tech</title>
	<atom:link href="http://www.kruse-net.dk/kategorier/tech/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.kruse-net.dk</link>
	<description>Det man blogger er man selv...</description>
	<lastBuildDate>Tue, 22 Nov 2011 15:18:43 +0000</lastBuildDate>
	<language>da</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>JSLint Multi 1.1</title>
		<link>http://www.kruse-net.dk/2009/04/20/jslint-multi-11/</link>
		<comments>http://www.kruse-net.dk/2009/04/20/jslint-multi-11/#comments</comments>
		<pubDate>Mon, 20 Apr 2009 21:02:23 +0000</pubDate>
		<dc:creator>Jakob Kruse</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jslint]]></category>
		<category><![CDATA[widget]]></category>

		<guid isPermaLink="false">http://www.kruse-net.dk/?p=199</guid>
		<description><![CDATA[Michael Schøler og jeg har netop frigivet version 1.1 af vores Yahoo! Widget til kontrol af Javascript filer: JSLint Multi. Vi er meget glade for at kunne meddele at JSLint Multi nu er den &#8220;officielle&#8221; JSLint widget, og der er sket kraftige forbedringer siden version 1.0, hvorfor vi anbefaler at alle opdaterer med det samme. [...]]]></description>
			<content:encoded><![CDATA[<iframe scrolling="no" frameborder="0" src="http://badge.ydp.clientapps.yahoo.com/badge/widgets/badge?aid=w6586&#038;tc=575757&#038;bc=1a1a1a&#038;cn=jslint-multi" style="width:180px;height:190px;padding:0;border:0;float:right" allowTransparency="true"></iframe>

<p>
<a  href="http://michael.hinnerup.net/" onclick="javascript:pageTracker._trackPageview('/external/michael.hinnerup.net/');" >Michael Schøler</a> og jeg har netop frigivet version 1.1 af vores Yahoo! Widget til kontrol af Javascript filer: 
<a  href="http://code.google.com/p/jslint-multi-widget/" onclick="javascript:pageTracker._trackPageview('/external/code.google.com/p/jslint-multi-widget/');" >JSLint Multi</a>. Vi er meget glade for at kunne meddele at JSLint Multi nu er den &#8220;officielle&#8221; JSLint widget, og der er sket kraftige forbedringer siden version 1.0, hvorfor vi anbefaler at alle opdaterer med det samme.</p>

<p>Siden vi frigav version 1.0 har Yahoo! godkendt og inkluderet JSLint Multi på deres widget site. Hvis du 
<a  href="http://widgets.yahoo.com/widgets/jslint-multi" onclick="javascript:pageTracker._trackPageview('/external/widgets.yahoo.com/widgets/jslint-multi');" >henter og installerer JSLint Multi derfra</a>, får du automatisk tilbudt opdateringer for fremtiden. Hvis du bruger en af de få browsere Yahoo&#8217;s inpage installer understøtter kan du også anvende knappen til højre. Bemærk dog at Yahoo! til tider kan være lang tid om at få opdateret deres Widget Gallery, så der kan gå noget tid før version 1.1 dukker op dér.</p>

<p>Nyhederne i version 1.1 er:</p>

<ul>
<li>JSLint er opdateret til 2009-04-19 versionen.</li>
<li>Der er tilføjet understøttelse for den nye &#8220;newcap&#8221; option, som gør det muligt at fravælge kontrol af at constructors starter med stort bogstav.</li>
<li>Der er tilføjet understøttelse for den nye &#8220;immed&#8221; option, som gør det muligt at kontrollere anbefalet syntaks for &#8220;immediate function invocations&#8221;.</li>
<li>Vi har opdaget en alvorlig memory leak i Yahoo! Widget Engine og arbejdet udenom den. Som følge deraf bruger JSLint Multi nu langt mindre hukommelse end før!</li>
<li>Der er bedre understøttelse for Mac, med hjælp fra Harry Whitfield.</li>
<li>Der bruges nu en minified udgave af JSLint (så widget&#8217;en loader lidt hurtigere).</li>
<li>Endelig vises udgaven af JSLint der anvendes nu i titel-linien.</li>
</ul>

<p>Vi ønsker alle Happy Linting!</p>

<p>(men pas på, den <em>vil</em> irritere dig!)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kruse-net.dk/2009/04/20/jslint-multi-11/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>JSON er ikke Javascript</title>
		<link>http://www.kruse-net.dk/2009/03/27/json-er-ikke-javascript/</link>
		<comments>http://www.kruse-net.dk/2009/03/27/json-er-ikke-javascript/#comments</comments>
		<pubDate>Fri, 27 Mar 2009 09:08:48 +0000</pubDate>
		<dc:creator>Jakob Kruse</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[ecmascript]]></category>
		<category><![CDATA[eval]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[json]]></category>

		<guid isPermaLink="false">http://www.kruse-net.dk/?p=241</guid>
		<description><![CDATA[Jeg arbejder en del med både JSON og Javascript, og oplever hyppigt at folk blander de to sammen. Oftest fordi de ikke rigtigt har forstået hvad JSON er. De ved at navnet kommer fra &#8220;JavaScript Object Notation&#8221; og konkluderer hurtigt (og lidt forhastet) at &#8220;JSON jo bare er Javascript objekter&#8221;. Og selvom det er helt [...]]]></description>
			<content:encoded><![CDATA[<p>Jeg arbejder en del med både 
<a  href="http://json.org/" onclick="javascript:pageTracker._trackPageview('/external/json.org/');" >JSON</a> og 
<a  href="http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf" onclick="javascript:pageTracker._trackPageview('/external/www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf');" >Javascript</a>, og oplever hyppigt at folk blander de to sammen. Oftest fordi de ikke rigtigt har forstået hvad JSON er. De ved at navnet kommer fra &#8220;JavaScript Object Notation&#8221; og konkluderer hurtigt (og lidt forhastet) at &#8220;JSON jo bare er Javascript objekter&#8221;. Og selvom det er helt forkert er det svært at bebrejde dem deres opfattelse. Populariseringen af JSON trak i høj grad på at &#8220;JSON er Javascript&#8221; og at enhver Javascript fortolker derfor umiddelbart kunne behandle JSON. Efter at JSON er blevet populært har det også smittet af den modsatte vej, hvor Javascript objekter nu 
<a  href="http://www.hinnerup.net/2008/03/07/javascript_json_selfref_bug_or_not/" onclick="javascript:pageTracker._trackPageview('/external/www.hinnerup.net/2008/03/07/javascript_json_selfref_bug_or_not/');" >ses omtalt som</a> &#8220;JSON objekter&#8221;.</p>

<p>Men JSON er ikke Javascript.</p>

<p>JSON er data. Det er et format hvormed man kan beskrive primitive datatyper og hierarkiske data-strukturer som en simpel tegnsekvens. I alle de velkendte programmeringssprog &#8212; inklusive Javascript &#8212; vil JSON optræde i form af en streng, dvs. imellem citationstegn. Strengen er opbygget efter samme syntaks som den notation hvormed man beskriver datastrukturer i Javascript, deraf navnet.</p>

<p>JSON er dog mere end objekter. Det kommer ofte som en overraskelse for folk at en JSON streng både kan starte med &#8220;{&#8221; og &#8220;[". Sidstnævnte bruges til at beskrive en sorteret sekvens af elementer, typisk kaldt for et array. En JSON datastruktur kan (naturligvis) indeholde primitive data-typer (tal, strenge, boolske værdier og den særlige værdi <code>null</code>), men den kan ikke kun være en primitiv værdi. Den skal starte med enten "{" eller "[".</p>

<p>Under populariseringen af JSON blev det ofte fremhævet at JSON data i en Javascript fortolker let kunne "deserialiseres" (konverteres) til en hierarkisk Javascript datastruktur ved brug af <code>eval(...)</code>. Det er ikke helt korrekt, og jeg har flere gange oplevet overraskelse over at <code>eval(...)</code> fejler på JSON data, hvis ikke man tilføjer et sæt parenteser til strengen. Selv nu, hvor <code>eval(...)</code> af sikkerhedsmæssige årsager frarådes, også til JSON data, lader der til at være ringe forståelse for disse fejl.</p>

<p>Forklaringen er dog ret simpel. <code>eval(...)</code> er lavet til at afvikle et Javascript program. Det er det eneste den kan. Den afvikler et Javascript program som man giver til funktionen i en streng, og så returnerer den værdien af programmets sidste erklæring. Og JSON er jo ikke Javascript. Grunden til at det alligevel virker i nogle tilfælde, og at det (for gyldig JSON) altid kan bringes til at virke ved at tilføje et sæt parenteser, er at en JSON struktur mere eller mindre tilfældigt er meget tæt på at kunne fortolkes som et Javascript program.</p>

<p>I ECMAScript definitionen (ECMA-262), som definerer Javascript sproget, kan man bl.a. læse følgende:</p>

<ol>
<li>"... if the parameter to the built-in eval function is a string, it is treated as an ECMAScript Program."</li>
<li>Et ECMAScript program består af en sekvens af erklæringer ("Statement" eller "FunctionDeclaration").</li>
<li>En erklæring ("Statement") kan være en række forskellige ting (se afsnit 12 i ECMA-262), hvoraf de eneste interessante i denne sammenhæng er en "Block" eller en "ExpressionStatement".</li>
<li>En "Block" er en sekvens af erklæringer imellem et sæt krøllede parenteser: "{ ... }".</li>
<li>En "ExpressionStatement" består af et enkelt udtryk ("Expression") efterfulgt af et valgfrit semikolon.</li>
<li>Et udtryk ("Expression") kan være en række forskellige ting (se afsnit 11 i ECMA-262), hvoraf de eneste interessante i denne sammenhæng er en "ArrayLiteral" ("[ ... ]&#8220;), en &#8220;ObjectLiteral&#8221; (&#8220;{ &#8230; }&#8221;) eller et udtryk i parenteser.</li>
</ol>

<p>Hvis en JSON streng der starter med en &#8220;{&#8221; evalueres med <code>eval(...)</code>, så vil den blive opfattet som en &#8220;Block&#8221; fra punkt 4 ovenfor, fordi denne har højere prioritet i ECMAScript grammatikken end en &#8220;ExpressionStatement&#8221;. Hvis JSON strengen starter med &#8220;[&#8221; vil den blive opfattet som en &#8220;ArrayLiteral&#8221; og vil dermed blive konverteret korrekt, forudsat naturligvis at der er tale om gyldig JSON. Under alle omstændigheder kan man pakke JSON strengen ind i et sæt parenteser. Strengen vil så ikke længere være gyldig JSON, men parenteserne får strengen til at blive opfattet som et udtryk, og får dermed det oprindelige JSON indhold til at blive opfattet korrekt som en &#8220;ArrayLiteral&#8221; eller en &#8220;ObjectLiteral&#8221;, og parenteserne ændrer ikke værdien af udtrykket.</p>

<p>Bemærk at den gyldige syntaks for Javascript arrays (specifikt &#8220;ArrayLiteral&#8221;) og objekter (specifikt &#8220;ObjectLiteral&#8221;) tillader en del mere end den gyldige syntaks for JSON arrays og objekter. F.eks. kan både Javascript arrays og objekter indeholde funktions-erklæringer, variabel-referencer, brug af indbyggede objekter som f.eks. Date og Math, samt den særlige værdi &#8220;undefined&#8221;, ingen af hvilke er gyldige i JSON. Navne på egenskaberne i et JSON objekt skal desuden være i dobbelte citationstegn, hvilke ikke er et krav for Javascript objekter. Gyldig JSON kan valideres med 
<a  href="http://jsonlint.com/" onclick="javascript:pageTracker._trackPageview('/external/jsonlint.com/');" >JSONLint</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kruse-net.dk/2009/03/27/json-er-ikke-javascript/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Kruse-Net præsenterer: Keyboard.js</title>
		<link>http://www.kruse-net.dk/2009/03/02/keyboardjs/</link>
		<comments>http://www.kruse-net.dk/2009/03/02/keyboardjs/#comments</comments>
		<pubDate>Mon, 02 Mar 2009 19:25:11 +0000</pubDate>
		<dc:creator>Jakob Kruse</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[accessibility]]></category>
		<category><![CDATA[events]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[keyboard]]></category>
		<category><![CDATA[prototype]]></category>

		<guid isPermaLink="false">http://www.kruse-net.dk/?p=212</guid>
		<description><![CDATA[En klassisk mangel i browser-baserede applikationer er fornuftige tastatur-genveje. Dette skyldes til dels at alt hvad W3C&#8217;s &#8220;DOM Level 2&#8243; specifikation (fra 2000, men stadig den nyeste der overhovedet nævner events) har at sige om emnet er: The DOM Level 2 Event specification does not provide a key event module. An event module designed for [...]]]></description>
			<content:encoded><![CDATA[<p>En klassisk mangel i browser-baserede applikationer er fornuftige tastatur-genveje. Dette skyldes til dels at alt hvad 
<a  href="http://www.w3.org/TR/DOM-Level-2-Events/events.html" onclick="javascript:pageTracker._trackPageview('/external/www.w3.org/TR/DOM-Level-2-Events/events.html');" >W3C&#8217;s &#8220;DOM Level 2&#8243; specifikation</a> (fra 2000, men stadig den nyeste der overhovedet nævner events) har at sige om emnet er:</p>

<blockquote>The DOM Level 2 Event specification does not provide a key event module. An event module designed for use with keyboard input devices will be included in a later version of the DOM specification.</blockquote>

<p>Som følge heraf håndteres keyboard events vidt forskelligt i forskellige browsere, med kaos til følge for den der måtte ønske at anvende dem.</p>

<p><strong>Keyboard.js</strong> er mit bidrag til at forsøge at bringe orden i dét kaos, og gøre det lettere at implementere tastatur-genveje i browser-baserede applikationer. <strong>Keyboard.js</strong> er én Javascript-fil på 23 KB (12,6 KB minified). Den definerer to globale objekter, &#8220;KEY&#8221; og &#8220;Keyboard&#8221;, som kan bruges til at definere tastatur-genveje. <strong>Keyboard.js</strong> er lavet specielt til danske tastaturer og er testet i Internet Explorer 7, Firefox 2, Firefox 3 og Safari 3 på Windows, og i Safari 3 på Mac. <strong>Keyboard.js</strong> kræver enten 
<a  href="http://www.prototypejs.org/" onclick="javascript:pageTracker._trackPageview('/external/www.prototypejs.org/');" >Prototype</a> eller 
<a  href="http://jquery.com/" onclick="javascript:pageTracker._trackPageview('/external/jquery.com/');" >jQuery</a>.</p>

<h2>Anvendelse</h2>

<p>Definér en global tastatur-genvej:</p>

<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-identifier">Keyboard</span><span class="hl-default">.</span><span class="hl-identifier">registerGlobal</span><span class="hl-brackets">(</span><span class="hl-identifier">KEY</span><span class="hl-code">.</span><span class="hl-identifier">CTRL</span><span class="hl-code"> + </span><span class="hl-identifier">KEY</span><span class="hl-code">.</span><span class="hl-identifier">F</span><span class="hl-code">, </span><span class="hl-identifier">mySpecialFindFunction</span><span class="hl-brackets">)</span><span class="hl-default">;</span></pre></div></div>

<p>Definér en lokal tastatur-genvej, som kun har effekt når fokus er indenfor et givet element. &#8216;myDiv&#8217; kan her være et DOM objekt eller et id. Bemærk at det pågældende element automatisk bliver gjort fokusérbart (i Safari er det dog kun input-elementer der kan tage fokus):</p>

<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-identifier">Keyboard</span><span class="hl-default">.</span><span class="hl-identifier">register</span><span class="hl-brackets">(</span><span class="hl-quotes">'</span><span class="hl-string">myDiv</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-identifier">KEY</span><span class="hl-code">.</span><span class="hl-identifier">CTRL</span><span class="hl-code"> + </span><span class="hl-identifier">KEY</span><span class="hl-code">.</span><span class="hl-identifier">SHIFT</span><span class="hl-code"> + </span><span class="hl-identifier">KEY</span><span class="hl-code">.</span><span class="hl-identifier">ESC</span><span class="hl-code">, </span><span class="hl-identifier">myFingerBreaker</span><span class="hl-brackets">)</span><span class="hl-default">;</span></pre></div></div>

<p>Hvis der skal defineres flere tastatur-genveje på samme objekt kan det betale sig at anvende en &#8220;handler&#8221;:</p>

<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-reserved">var </span><span class="hl-identifier">handler</span><span class="hl-default"> = </span><span class="hl-identifier">Keyboard</span><span class="hl-default">.</span><span class="hl-identifier">handlerFor</span><span class="hl-brackets">(</span><span class="hl-quotes">'</span><span class="hl-string">myMenu</span><span class="hl-quotes">'</span><span class="hl-brackets">)</span><span class="hl-default">;
</span><span class="hl-identifier">handler</span><span class="hl-default">.</span><span class="hl-identifier">register</span><span class="hl-brackets">(</span><span class="hl-identifier">KEY</span><span class="hl-code">.</span><span class="hl-identifier">LEFT</span><span class="hl-code">,  </span><span class="hl-identifier">goLeft</span><span class="hl-brackets">)</span><span class="hl-default">;
</span><span class="hl-identifier">handler</span><span class="hl-default">.</span><span class="hl-identifier">register</span><span class="hl-brackets">(</span><span class="hl-identifier">KEY</span><span class="hl-code">.</span><span class="hl-identifier">RIGHT</span><span class="hl-code">, </span><span class="hl-identifier">goRight</span><span class="hl-brackets">)</span><span class="hl-default">;
</span><span class="hl-identifier">handler</span><span class="hl-default">.</span><span class="hl-identifier">register</span><span class="hl-brackets">(</span><span class="hl-identifier">KEY</span><span class="hl-code">.</span><span class="hl-identifier">UP</span><span class="hl-code">,    </span><span class="hl-identifier">goUp</span><span class="hl-brackets">)</span><span class="hl-default">;
</span><span class="hl-identifier">handler</span><span class="hl-default">.</span><span class="hl-identifier">register</span><span class="hl-brackets">(</span><span class="hl-identifier">KEY</span><span class="hl-code">.</span><span class="hl-identifier">DOWN</span><span class="hl-code">,  </span><span class="hl-identifier">goDown</span><span class="hl-brackets">)</span><span class="hl-default">;</span></pre></div></div>

<p><strong>Keyboard.js</strong> indeholder to kontroller af de registreringer man foretager. For det første får man besked hvis man kommer til at binde den samme tast to gange på samme element. For det andet får man en advarsel hvis der er kendte problemer med den tast man binder. F.eks.:</p>

<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-identifier">Keyboard</span><span class="hl-default">.</span><span class="hl-identifier">registerGlobal</span><span class="hl-brackets">(</span><span class="hl-identifier">KEY</span><span class="hl-code">.</span><span class="hl-identifier">CTRL</span><span class="hl-code"> + </span><span class="hl-identifier">KEY</span><span class="hl-code">.</span><span class="hl-identifier">ZERO</span><span class="hl-code">, </span><span class="hl-identifier">myZeroFunction</span><span class="hl-brackets">)</span><span class="hl-default">;
</span><span class="hl-comment">//=&gt; &quot;Ctrl+0 is unmappable in Win-IE7, Win-Safari3 (reset zoom)&quot;</span></pre></div></div>

<p>Hvis man ønsker at binde en tast trods advarslen skal man tilføje en ekstra parameter &#8216;true&#8217;:</p>

<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-identifier">Keyboard</span><span class="hl-default">.</span><span class="hl-identifier">registerGlobal</span><span class="hl-brackets">(</span><span class="hl-identifier">KEY</span><span class="hl-code">.</span><span class="hl-identifier">CTRL</span><span class="hl-code"> + </span><span class="hl-identifier">KEY</span><span class="hl-code">.</span><span class="hl-identifier">ZERO</span><span class="hl-code">, </span><span class="hl-identifier">myZeroFunction</span><span class="hl-code">, </span><span class="hl-reserved">true</span><span class="hl-brackets">)</span><span class="hl-default">;</span></pre></div></div>

<p>Endelig er det muligt eksplicit at angive kontekst for event handleren (dvs. værdien af &#8220;this&#8221; når funktionen kaldes). Som standard er kontekst det element som tasten er bundet til, men en anden kontekst kan defineres ved at angive et array i stedet for en funktion:</p>

<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-identifier">Keyboard</span><span class="hl-default">.</span><span class="hl-identifier">registerGlobal</span><span class="hl-brackets">(</span><span class="hl-identifier">KEY</span><span class="hl-code">.</span><span class="hl-identifier">F4</span><span class="hl-code">, </span><span class="hl-brackets">[</span><span class="hl-identifier">myContext</span><span class="hl-code">, </span><span class="hl-identifier">myDropDownHandler</span><span class="hl-brackets">])</span><span class="hl-default">;</span></pre></div></div>

<h2>Yderligere detaljer</h2>

<p>For KEY-navne og yderligere detaljer, se toppen af <strong>Keyboard.js</strong>.</p>

<h2>Test-side</h2>

<p>Jeg har lavet en simpel test-side som indeholder alle taster understøttet af <strong>Keyboard.js</strong>, samt de grundlæggende taste-kombinationer. 
<a  href="http://www.kruse-net.dk/wp/wp-content/uploads/2009/03/keyboard.html">Se siden her</a>.</p>

<h2>Download</h2>

<ul>
<li>
<a  href="http://www.kruse-net.dk/wp/wp-content/uploads/2009/03/keyboard.js">keyboard.js</a> (23 KB)</li>
<li>
<a  href="http://www.kruse-net.dk/wp/wp-content/uploads/2009/03/keyboard-min.js">keyboard-min.js</a> (12,6 KB, komprimeret med 
<a  href="http://www.crockford.com/javascript/jsmin.html" onclick="javascript:pageTracker._trackPageview('/external/www.crockford.com/javascript/jsmin.html');" >JSMin</a>)</li>
</ul>

<h2>Licens</h2>

<p><strong>Keyboard.js</strong> frigives under LGPL licensen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kruse-net.dk/2009/03/02/keyboardjs/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>HTML dokumentation i VDF web services</title>
		<link>http://www.kruse-net.dk/2008/05/13/html-dokumentation-i-vdf-web-services/</link>
		<comments>http://www.kruse-net.dk/2008/05/13/html-dokumentation-i-vdf-web-services/#comments</comments>
		<pubDate>Tue, 13 May 2008 19:38:48 +0000</pubDate>
		<dc:creator>Jakob Kruse</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[dataflex]]></category>
		<category><![CDATA[disable-output-escaping]]></category>
		<category><![CDATA[markup]]></category>
		<category><![CDATA[web service]]></category>
		<category><![CDATA[xslt]]></category>

		<guid isPermaLink="false">http://www.kruse-net.dk/?p=155</guid>
		<description><![CDATA[I Visual DataFlex, når man offentliggør en funktion som en Web Service, har man muligheden for at supplere med en &#8220;beskrivelse&#8221; af funktionen: { Published = True } { Description = &#34;This is the web service description&#34; } Function Foo Returns String Function_Return &#34;Foo&#34; End_Function Denne beskrivelse står i WSDL filen der genereres for web [...]]]></description>
			<content:encoded><![CDATA[<p>I Visual DataFlex, når man offentliggør en funktion som en Web Service, har man muligheden for at supplere med en &#8220;beskrivelse&#8221; af funktionen:</p>

<div class="hl-surround" ><div class="hl-main"><pre>{ Published = True  }
{ Description = &quot;This is the web service description&quot;  }
Function Foo Returns String
    Function_Return &quot;Foo&quot;
End_Function</pre></div></div>

<p>Denne beskrivelse står i WSDL filen der genereres for web servicen, og vises på den side der fungerer som oversigt over servicen, når man tilgår denne i en browser. Umiddelbart giver det ikke mening at tilføje markup til beskrivelsen, for HTML tags vises bare som synlige tags i beskrivelsen. Skulle man ønske at tilføje markup til sine beskrivelser, f.eks. for at bruge disse som egentlig dokumentation, så kan det dog let bringes til at virke.</p>

<p>Siden der vises når man tilgår en .wso URI dannes ved en XSL transformation af noget XML data. XSL transformationen styres af den fil der er nævnt ud for <code>ServicePageGenerator=</code> i .wso filen. Som standard hedder den <code>DefaultWebServiceHomePage.xslt</code>, og ligger i <code>Lib</code> mappen under din Visual DataFlex installation.</p>

<p>Ønsker du at gøre brug af HTML i dine funktionsbeskrivelser er der to muligheder: enten retter du i <code>DefaultWebServiceHomePage.xslt</code>, eller også laver du en ændret kopi, og retter i dine .wso filer (bare rolig, dine rettelser bliver ikke overskrevet når filen opdateres ved kompilering). Uanset hvilken løsning du vælger så er ændringen du skal foretage følgende.</p>

<p>Find:</p>

<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-brackets">&lt;</span><span class="hl-reserved">xsl:template </span><span class="hl-var">match</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">wso:documentation</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">&gt;
  &lt;</span><span class="hl-reserved">span</span><span class="hl-brackets">&gt;
    &lt;</span><span class="hl-reserved">xsl:copy-of </span><span class="hl-var">select</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">*|text()</span><span class="hl-quotes">&quot; </span><span class="hl-brackets">/&gt;
  &lt;/</span><span class="hl-reserved">span</span><span class="hl-brackets">&gt;
&lt;/</span><span class="hl-reserved">xsl:template</span><span class="hl-brackets">&gt;</span></pre></div></div>

<p>Ret til:</p>

<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-brackets">&lt;</span><span class="hl-reserved">xsl:template </span><span class="hl-var">match</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">wso:documentation</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">&gt;
  &lt;</span><span class="hl-reserved">span</span><span class="hl-brackets">&gt;
    &lt;</span><span class="hl-reserved">xsl:value-of </span><span class="hl-var">select</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">text()</span><span class="hl-quotes">&quot; </span><span class="hl-var">disable-output-escaping</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">yes</span><span class="hl-quotes">&quot; </span><span class="hl-brackets">/&gt;
  &lt;/</span><span class="hl-reserved">span</span><span class="hl-brackets">&gt;
&lt;/</span><span class="hl-reserved">xsl:template</span><span class="hl-brackets">&gt;</span></pre></div></div>

<p>Den tilføjede attribut forhindrer at specielle XML karakterer som &lt; og > oversættes til &amp;lt; og &amp;gt;, hvormed markup&#8217;en forbliver intakt. Og så kan man skrive beskrivelser som</p>

<div class="hl-surround" ><div class="hl-main"><pre>{ Published = True  }
{ Description = &quot;&lt;a href='/mywsdoc/'&gt;Click here&lt;/a&gt; for the web service documentation&quot;  }
Function Foo Returns String
    Function_Return &quot;Foo&quot;
End_Function</pre></div></div>
]]></content:encoded>
			<wfw:commentRss>http://www.kruse-net.dk/2008/05/13/html-dokumentation-i-vdf-web-services/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JSON Schema</title>
		<link>http://www.kruse-net.dk/2008/01/16/json-schema/</link>
		<comments>http://www.kruse-net.dk/2008/01/16/json-schema/#comments</comments>
		<pubDate>Wed, 16 Jan 2008 09:21:42 +0000</pubDate>
		<dc:creator>Jakob Kruse</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[dokumentation]]></category>
		<category><![CDATA[epiphantastic]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[json.com]]></category>
		<category><![CDATA[Kris Zyp]]></category>
		<category><![CDATA[schema]]></category>
		<category><![CDATA[validering]]></category>
		<category><![CDATA[web service]]></category>

		<guid isPermaLink="false">http://www.kruse-net.dk/2008/01/16/json-schema/</guid>
		<description><![CDATA[I mit arbejde får jeg i stigende grad behov for at web services kommunikerer i JSON formatet, foruden eller i stedet for XML. Det har skabt et tilsvarende behov for at kunne dokumentere disse formater, både med henblik på at andre udviklere kunne få besvaret deres spørgsmål, og med henblik på mulig maskinel validering af [...]]]></description>
			<content:encoded><![CDATA[<p>I mit arbejde får jeg i stigende grad behov for at web services kommunikerer i 
<a  href="http://www.json.org/" onclick="javascript:pageTracker._trackPageview('/external/www.json.org/');" >JSON formatet</a>, foruden eller i stedet for XML. Det har skabt et tilsvarende behov for at kunne dokumentere disse formater, både med henblik på at andre udviklere kunne få besvaret deres spørgsmål, og med henblik på mulig maskinel validering af kommunikationen.</p>

<p>I et forsøg på at opfylde dette behov har jeg kigget mig omkring. Det var et krav (fra mig) at tingene skulle kunne dokumenteres i JSON &#8212; primært for ikke at forvirre folk yderligere med endnu et nyt format. I første omgang faldt jeg over 
<a  href="http://www.epiphantastic.com/?p=22" onclick="javascript:pageTracker._trackPageview('/external/www.epiphantastic.com/');" >en løsning Thomas Messier har lavet til brug i ColdFusion</a>. Strukturen var tillokkende, men desværre virker arbejdet noget ufærdigt. I min videre søgen er jeg kun faldet over 
<a  href="http://www.json.com/json-schema-proposal/" onclick="javascript:pageTracker._trackPageview('/external/www.json.com/json-schema-proposal/');" >Kris Zyp&#8217;s JSON Schema Proposal</a>. Den er noget mere gennemarbejdet og detaljeret, men indeholder til gengæld en række meget alvorlige brister som gør at den er ubrugelig i sin nuværende form.</p>

<p>Da mit dokumentations-behov er ret presserende var der intet andet at gøre &#8212; jeg måtte tage del i arbejdet, og komme med mit eget oplæg. Jeg håber at folk finder det brugbart. Kommentarer er som sædvanlig meget velkomne. Klik videre til min egen 
<a  href="http://www.kruse-net.dk/json-schema/">JSON Schema Proposal</a> (siden er på engelsk med tanke på videre internationalt samarbejde).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kruse-net.dk/2008/01/16/json-schema/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Drilagtige billeder</title>
		<link>http://www.kruse-net.dk/2008/01/07/drilagtige-billeder/</link>
		<comments>http://www.kruse-net.dk/2008/01/07/drilagtige-billeder/#comments</comments>
		<pubDate>Mon, 07 Jan 2008 12:22:34 +0000</pubDate>
		<dc:creator>Jakob Kruse</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[billeder]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[mellemrum]]></category>
		<category><![CDATA[plads]]></category>

		<guid isPermaLink="false">http://www.kruse-net.dk/2008/01/07/drilagtige-billeder/</guid>
		<description><![CDATA[Billeder i tabel-celler i HTML har længe været betragtet som &#8220;dårligt design&#8221;, men det er nemt at arbejde med, og det er meget anvendt, så måske er du stødt på dette problem selv. Billeder, &#60;img&#62; tags altså, placeres som standard på &#8220;baseline&#8221;, dvs. den linie som bogstaverne i en eventuel tilstødende tekst &#8220;står på&#8221;. Eftersom [...]]]></description>
			<content:encoded><![CDATA[<p>Billeder i tabel-celler i HTML har længe været betragtet som &#8220;dårligt design&#8221;, men det er nemt at arbejde med, og det er meget anvendt, så måske er du stødt på dette problem selv.</p>

<p><img alt="Billede med plads under" src="http://www.kruse-net.dk/wp/wp-content/uploads/2008/01/sshot-1.png" align="left" border="0" />Billeder, &lt;img&gt; tags altså, placeres som standard på &#8220;baseline&#8221;, dvs. den linie som bogstaverne i en eventuel tilstødende tekst &#8220;står på&#8221;. Eftersom visse bogstaver, f.eks. &#8220;g&#8221; går nedenunder denne linie, vil der i f.eks. en tabel-celle blive afsat vertikal plads under et billede, hvis cellen også indeholder tekst. Eksempel ses på billedet, hvor tabel-cellen er markeret med rødt.</p>

<p>Eller&#8230; sådan <strong>var</strong> det.</p>

<p>Hidtil har &#8220;problemet&#8221; nemlig kunnet løses ved at sørge for at cellen ikke indeholdt tekst eller whitespace. Nu lader det til (det er sikkert ikke noget der er sket for nylig, jeg har bare ikke bemærket det før nu) at i hvert fald Mozilla har ændret deres rendering engine så pladsen under baseline inkluderes selvom cellen ikke indeholder tekst eller whitespace.</p>

<p><img alt="Billede uden plads under" src="http://www.kruse-net.dk/wp/wp-content/uploads/2008/01/sshot-2.png" align="left" border="0" />Løsningen, ja den er ret enkel. Billedet skal blot have ændret sin vertikale justering til noget andet end &#8220;baseline&#8221;. Det opnås enten ved at give &lt;img&gt; elementet en &#8220;align&#8221; attribut &#8212; alle andre værdier end &#8220;baseline&#8221; og &#8220;bottom&#8221; virker, f.eks. &#8220;top&#8221; eller &#8220;middle&#8221; &#8212; eller ved at style billedet med CSS &#8212; så virker f.eks. &#8220;vertical-align: top&#8221; fint. Resultatet ses på billedet.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kruse-net.dk/2008/01/07/drilagtige-billeder/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Behaviour igen</title>
		<link>http://www.kruse-net.dk/2007/11/30/behaviour-igen/</link>
		<comments>http://www.kruse-net.dk/2007/11/30/behaviour-igen/#comments</comments>
		<pubDate>Fri, 30 Nov 2007 14:16:07 +0000</pubDate>
		<dc:creator>Jakob Kruse</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[behaviour]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.kruse-net.dk/2007/11/30/behaviour-igen/</guid>
		<description><![CDATA[I forbindelse med endnu en opdatering til Behaviour tog jeg konsekvensen af at Ben Nolan stadig ikke ajourfører hans &#8220;officielle&#8221; version. Dermed har Behaviour nu fået sin helt egen side her på Kruse-Net, hvorfra jeg vil udgive mine rettelser og udvidelser. Skulle nogen have ønsker til ændringer er I meget velkomne til at kontakte mig. [...]]]></description>
			<content:encoded><![CDATA[<p>I forbindelse med endnu en opdatering til Behaviour tog jeg konsekvensen af at Ben Nolan stadig ikke ajourfører hans &#8220;officielle&#8221; version. Dermed har Behaviour nu fået sin 
<a  href="http://www.kruse-net.dk/behaviour/">helt egen side her på Kruse-Net</a>, hvorfra jeg vil udgive mine rettelser og udvidelser.</p>

<p>Skulle nogen have ønsker til ændringer er I meget velkomne til at kontakte mig. Bemærk at Behaviour siden er på engelsk af respekt for Ben Nolan og Simon Willison.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kruse-net.dk/2007/11/30/behaviour-igen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ruby on Rails / Apache 2.2 / Windows</title>
		<link>http://www.kruse-net.dk/2007/08/10/ruby-on-rails-apache-22-windows/</link>
		<comments>http://www.kruse-net.dk/2007/08/10/ruby-on-rails-apache-22-windows/#comments</comments>
		<pubDate>Fri, 10 Aug 2007 10:18:30 +0000</pubDate>
		<dc:creator>Jakob Kruse</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[scgi]]></category>

		<guid isPermaLink="false">http://www.kruse-net.dk/2007/08/10/ruby-on-rails-apache-22-windows/</guid>
		<description><![CDATA[Hvis du har prøvet at få disse til at spille pænt sammen, så ved du enten at der langt fra er tale om Den Hellige Treenighed, eller også er du bare heldigere end jeg har været. For mig er tværsummen af ovenstående = 666. Hvis man læser om hvordan man får Ruby on Rails op [...]]]></description>
			<content:encoded><![CDATA[<p>Hvis du har prøvet at få disse til at spille pænt sammen, så ved du enten at der langt fra er tale om 
<a  href="http://en.wikipedia.org/wiki/Trinity" onclick="javascript:pageTracker._trackPageview('/external/en.wikipedia.org/wiki/Trinity');" >Den Hellige Treenighed</a>, eller også er du bare heldigere end jeg har været.</p>

<p>For mig er tværsummen af ovenstående = 
<a  href="http://en.wikipedia.org/wiki/Number_of_the_Beast" onclick="javascript:pageTracker._trackPageview('/external/en.wikipedia.org/wiki/Number_of_the_Beast');" >666</a>.</p>

<p>Hvis man læser om hvordan man får 
<a  href="http://rubyonrails.org/" onclick="javascript:pageTracker._trackPageview('/external/rubyonrails.org/');" >Ruby on Rails</a> op at køre 
<a  href="http://wiki.rubyonrails.org/rails/pages/HowtosInstallation" onclick="javascript:pageTracker._trackPageview('/external/wiki.rubyonrails.org/rails/pages/HowtosInstallation');" >på diverse web servere</a> ser det meget let ud. Der er ingen ende på antallet af fine opskrifter der i udførlige detaljer beskriver hvert eneste skridt på vejen, og tilmed 
<a  href="http://blog.codahale.com/2006/06/19/time-for-a-grown-up-server-rails-mongrel-apache-capistrano-and-you/" onclick="javascript:pageTracker._trackPageview('/external/blog.codahale.com/2006/06/19/time-for-a-grown-up-server-rails-mongrel-apache-capistrano-and-you/');" >lovpriser resultatet</a>. Efterhånden som man prøver opskrifterne ryger de dog alle i en af disse bunker:</p>

<ul>
<li>Mangler en eller flere stumper, som ikke længere er til at opdrive</li>
<li>Virker ikke på Apache 2.2</li>
<li>Virker ikke på Windows</li>
<li>Er uhyggeligt kompliceret</li>
</ul>

<p>Frustrationen har forståeligt nok været stor hos undertegnede den seneste tid. Men når jeg nu tog mig sammen til at skrive om emnet var det ikke for at bidrage med endnu en &#8220;det virker ikke!&#8221; beretning (dem er der nemlig også rigtigt mange af), men derimod for at sige HA! Nu virker det!</p>

<p>Nøglen viste sig at være en rigtigt fin pakke på 
<a  href="http://sourceforge.net/" onclick="javascript:pageTracker._trackPageview('/external/sourceforge.net/');" >sourceforge</a> fra Gael Pourriel. Han kalder den &#8220;
<a  href="http://sourceforge.net/projects/rails-prod-win" onclick="javascript:pageTracker._trackPageview('/external/sourceforge.net/projects/rails-prod-win');" >Rails Prod Machine for Win32</a>&#8220;. Pakken installerer Apache 2.2, Ruby og Rails, og alle de stumper der binder dem sammen, og hvis du ikke allerede har en Apache 2.2 oppe at køre som du gerne vil bruge, så kan du sikkert bare installere pakken, starte serveren og være kørende!</p>

<p>Hvis du allerede har en Apache 2.2, så kommer opskriften her!</p>

<p><strong>Ruby</strong></p>

<p>Hent og kør den anbefalede Windows installer fra 
<a  href="http://rubyonrails.org/down" onclick="javascript:pageTracker._trackPageview('/external/rubyonrails.org/down');" >http://rubyonrails.org/down</a>. I skrivende stund er det 
<a  href="http://rubyforge.org/frs/download.php/17647/ruby185-24.exe" onclick="javascript:pageTracker._trackPageview('/external/rubyforge.org/frs/download.php/17647/ruby185-24.exe');" >1.8.5-24</a>.</p>

<p><strong>Rails</strong></p>

<p>Start &#8220;RubyGems Package Manager&#8221; fra ikonet i start menuen og kør kommandoen:
<div>::HLIGHT<em>BLOCK</em>27::</div></p>

<p><strong>SCGI for Rails</strong></p>

<p>Download 
<a  href="http://www.zedshaw.com/downloads/scgi_rails/scgi_rails-0.4.3.gem" onclick="javascript:pageTracker._trackPageview('/external/www.zedshaw.com/downloads/scgi_rails/scgi_rails-0.4.3.gem');" >scgi_rails-0.4.3.gem</a> fra 
<a  href="http://www.zedshaw.com/projects/scgi_rails/howto.html" onclick="javascript:pageTracker._trackPageview('/external/www.zedshaw.com/projects/scgi_rails/howto.html');" >www.zedshaw.com</a>, og gem den i din ruby installations-mappe (typisk C:\ruby).</p>

<p>Stadigvæk i RubyGems prompten kører du følgende kommandoer, én ad gangen:
<div>::HLIGHT<em>BLOCK</em>28::</div></p>

<p><strong>Din applikation</strong></p>

<ol>
<li><p>Placér en kopi af din applikation i en mappe på serveren, f.eks. C:\myrailsapp.</p></li>
<li><p>Slet filen C:\myrailsapp\public&#46;htaccess (den er kun til CGI eller FastCGI brug, ikke SimpleCGI).</p></li>
<li><p>Åbn en kommando-prompt i mappen C:\myrailsapp og skriv kommandoen</p>

<div class="hl-surround" ><div class="hl-main"><pre>C:\myrailsapp&gt; scgi_ctrl config -S</pre></div></div>

<p>Du bliver bedt om et kodeord. Vælg et der er rimeligt sikkert. Det styrer adgangen til applikationens SCGI opsætning.</p></li>
<li><p>Start SCGI serveren på port 9999 med kommandoen</p>

<div class="hl-surround" ><div class="hl-main"><pre>C:\myrailsapp&gt; scgi_service</pre></div></div>

<p>Kontroller evt. i C:\myrailsapp\log\scgi.log at applikationen starter korrekt. <code>scgi_service</code> kan også installeres som service med f.eks. FireDaemon.</p></li>
</ol>

<p><strong>Apache</strong></p>

<ol>
<li><p>
<a  href="http://www.kruse-net.dk/download/mod_scgi.so">Download mod_scgi.so herfra</a>. Denne udgave er kompileret til Apache 2.2.x og kommer fra Rails Prod Machine (thank you, Gael Pourriel).</p></li>
<li><p>Placér mod_scgi.so i Apache&#8217;s modules mappe.</p></li>
<li><p>Tilføj linien</p>

<div class="hl-surround" ><div class="hl-main"><pre>LoadModule scgi_module modules/mod_scgi.so</pre></div></div>

<p>til httpd.conf, umiddelbart efter <code>LoadModule rewrite_module ...</code> (sidstnævnte skal også være aktiv, dvs. uden en # foran).</p></li>
<li><p>Tilføj linien</p>

<div class="hl-surround" ><div class="hl-main"><pre>SCGIMount / 127.0.0.1:9999</pre></div></div>

<p>det sted hvor du ønsker at installere din Rails app, eller se her for 
<a  href="http://www.zedshaw.com/projects/scgi_rails/apache.html" onclick="javascript:pageTracker._trackPageview('/external/www.zedshaw.com/projects/scgi_rails/apache.html');" >en mere detaljeret Apache opsætning</a>.</p></li>
<li><p>Genstart Apache!</p></li>
</ol>

<p>Et voila. Ruby on Rails oppe at køre på en Windows Apache 2.2.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kruse-net.dk/2007/08/10/ruby-on-rails-apache-22-windows/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Behaviour opdateret</title>
		<link>http://www.kruse-net.dk/2007/05/29/behaviour-opdateret/</link>
		<comments>http://www.kruse-net.dk/2007/05/29/behaviour-opdateret/#comments</comments>
		<pubDate>Tue, 29 May 2007 18:18:09 +0000</pubDate>
		<dc:creator>Jakob Kruse</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[$$]]></category>
		<category><![CDATA[behaviour]]></category>
		<category><![CDATA[Ben Nolan]]></category>
		<category><![CDATA[prototype]]></category>
		<category><![CDATA[Simon Willison]]></category>

		<guid isPermaLink="false">http://www.kruse-net.dk/2007/05/29/behaviour-opdateret/</guid>
		<description><![CDATA[Til dem der måtte bruge Kruse-Net&#8217;s udgave af Ben Nolans &#8220;Behaviour&#8221; er der nu &#8212; forhåbentlig &#8212; godt nyt. Jeg kan nemlig præsentere ikke én men hele to nye udgaver af dette fikse system. Den første udgave, jeg kalder den &#8220;p2&#8243;, fikser en fejl i Bens udgave som man kan støde ind i hvis man [...]]]></description>
			<content:encoded><![CDATA[<p>Til dem der måtte bruge Kruse-Net&#8217;s udgave af 
<a  href="http://bennolan.com/behaviour/" onclick="javascript:pageTracker._trackPageview('/external/bennolan.com/behaviour/');" >Ben Nolans &#8220;Behaviour&#8221;</a> er der nu &#8212; forhåbentlig &#8212; godt nyt. Jeg kan nemlig præsentere ikke én men hele to nye udgaver af dette fikse system.</p>

<p>Den første udgave, jeg kalder den &#8220;p2&#8243;, fikser en fejl i Bens udgave som man kan støde ind i hvis man skriver kode som dette:</p>

<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-default">...
</span><span class="hl-quotes">'</span><span class="hl-string">my selector</span><span class="hl-quotes">'</span><span class="hl-default">: </span><span class="hl-reserved">function</span><span class="hl-brackets">(</span><span class="hl-identifier">element</span><span class="hl-brackets">) {
  </span><span class="hl-identifier">Behaviour</span><span class="hl-code">.</span><span class="hl-identifier">addEventObserver</span><span class="hl-brackets">(</span><span class="hl-identifier">some</span><span class="hl-code">-</span><span class="hl-identifier">other</span><span class="hl-code">-</span><span class="hl-identifier">element</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">event</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-reserved">function</span><span class="hl-brackets">() {</span><span class="hl-code"> ... </span><span class="hl-brackets">})</span><span class="hl-code">;
</span><span class="hl-brackets">}</span><span class="hl-default">
...</span></pre></div></div>

<p>Det centrale værende at der registreres en event observer på et andet element end det der er udpeget af selectoren. Denne fejl er som sagt rettet i p2-udgaven.</p>

<p>Den anden udgave, som jeg meget lidt opfindsomt har navngivet &#8220;p3&#8243;, er magen til p2 bortset fra at p3 udnytter den stærkt reviderede &#8220;
<a  href="http://www.prototypejs.org/api/utility/dollar-dollar" onclick="javascript:pageTracker._trackPageview('/external/www.prototypejs.org/api/utility/dollar-dollar');" >$$</a>&#8221; funktion i 
<a  href="/javascript/lib/prototype-1.5.1.js">Prototype 1.5.1</a>. Da denne forventes at performe en del bedre end den tilsvarende udgave i p2 må anbefalingen herfra være at man bruger 
<a  href="/javascript/lib/behaviour-1.1-p2.js">behaviour-1.1-p2.js</a> sammen med 
<a  href="/javascript/lib/prototype-1.5.0.js">Prototype 1.5.0</a> eller tidligere, og 
<a  href="/javascript/lib/behaviour-1.1-p3.js">behaviour-1.1-p3.js</a> sammen med 
<a  href="/javascript/lib/prototype-1.5.1.js">Prototype 1.5.1</a> eller senere.</p>

<p>Download: 
<a  href="/javascript/lib/behaviour-1.1-p2.js">behaviour-1.1-p2.js</a>, 
<a  href="/javascript/lib/behaviour-1.1-p3.js">behaviour-1.1-p3.js</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kruse-net.dk/2007/05/29/behaviour-opdateret/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Webapp mailer</title>
		<link>http://www.kruse-net.dk/2007/01/25/webapp-mailer/</link>
		<comments>http://www.kruse-net.dk/2007/01/25/webapp-mailer/#comments</comments>
		<pubDate>Thu, 25 Jan 2007 12:50:37 +0000</pubDate>
		<dc:creator>Jakob Kruse</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[cdosys]]></category>
		<category><![CDATA[dataflex]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[webapp]]></category>

		<guid isPermaLink="false">http://www.kruse-net.dk/2007/01/25/webapp-mailer/</guid>
		<description><![CDATA[En af de ting jeg har begået som jeg får flest forespørgsler på hjælp om er en lille stump kode der sender emails fra en Visual Dataflex Webapp via CDO (der findes på langt de fleste nuværende windows servere og workstations). Da forespørgslerne kommer fra udlandet er resten af artiklen &#8212; undtagelsesvis &#8212; på engelsk. [...]]]></description>
			<content:encoded><![CDATA[<p>En af de ting jeg har begået som jeg får flest forespørgsler på hjælp om er en lille stump kode der sender emails fra en Visual Dataflex Webapp via CDO (der findes på langt de fleste nuværende windows servere og workstations). Da forespørgslerne kommer fra udlandet er resten af artiklen &#8212; undtagelsesvis &#8212; på engelsk.</p>

<p><span id="more-84"></span></p>

<p>Without further ado &#8212; how to send email from a VDF Webapp:</p>

<div class="hl-surround" ><div class="hl-main"><pre>Use mailer.pkg

// Now send a mail like this
Set psTo       of (oCDOMessage(Self)) to '&quot;Some recipient&quot; &lt;mail.address@example.com&gt;'
Set psFrom     of (oCDOMessage(Self)) to '&quot;Me&quot; &lt;me@example.com&gt;'
Set psSubject  of (oCDOMessage(Self)) to &quot;Subject line&quot;
Set psHTMLBody of (oCDOMessage(Self)) to &quot;Body of email - can contain &lt;b&gt;HTML markup&lt;/b&gt;&quot;
    
Send CreateComObject to (oCDOMessage(Self))
If (IsComObjectCreated(oCDOMessage(Self))) Begin
    Send ComSend to (oCDOMessage(Self))
End
Else Begin
    Send LogEvent 91101 &quot;Unable to create CDO.Message object&quot;
End</pre></div></div>

<h3>Download</h3>

<ul>
<li>
<a  href="http://www.kruse-net.dk/wp/wp-content/uploads/2008/02/mailer.zip" title="Webapp mailer source code" onclick="javascript:pageTracker._trackPageview('/downloads/wp/wp-content/uploads/2008/02/mailer.zip');" >Zip file</a>, or</li>
<li>
<a id="p85"  href="/wp/wp-content/uploads/2007/01/mailerpkg.txt" title="Objects required to send email">mailer.pkg</a>, 
<a id="p86"  href="/wp/wp-content/uploads/2007/01/cdosyspkg.txt">cdosys.pkg</a>, 
<a id="p87"  href="/wp/wp-content/uploads/2007/01/msado26pkg.txt">msado26.pkg</a> (rename as needed).</li>
</ul>

<p>Should you desire to use this code from a regular VDF application, you would only need to change the LogEvent lines, since these deal with the webapp event logging mechanism which is not available in a non-web application.</p>

<p>Please note that mailer.pkg contains code to read general configuration (mail server, user name and password) from a system file. Change as needed!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kruse-net.dk/2007/01/25/webapp-mailer/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
	</channel>
</rss>

