<?xml version="1.0" encoding="UTF-8"?>
<posts type="array">
  <post>
    <body>Jeg har to problemer! Jeg vil kunne tilf&#248;re nye regler og undtagelser dynamisk i en process. Min kode, eller notation skal v&#230;re sprogneutral og den skal uden videre kunne l&#230;ses af forretningskyndige.   

Dette er et par ydmyg krav og opgaven er at overf&#248;re policer fra et system til et andet. Konverteringsprocessen l&#248;ber over flere dage og undervejs vil der komme undtagelser p&#229; enkelte policer og nye forretningsregler vil opst&#229;. Det er ikke en option at stoppe, restarte eller deploye applikationen igen for at realisere evt nye regler.  

Jeg har valgt at isolere en process omkring en pensions-regel p&#229; laveste niveau. En pension kan best&#229; af dusinvis af disse niveauer og en samling af dem udg&#248;r en fuld pension.  

Jeg tager udspring en den eksisterende kode. Det kan v&#230;re Java, .NET eller andre sprog som er konstrueret i samme programmering model.   

&lt;pre&gt;
DummyPolice police = new DummyPolice();
PoliceLevel level = new PoliceLevel();
level.setPolice(&#8220;150364xxxx&#8221;);
level.setGrundlag(&#8220;omregning&#8221;);
level.setProcent(3);
level.setGrundform(212);
level.setYdelse(123.340,25);
police.add(level);
&lt;/pre&gt;

Udviklere fra den dynamiske eller funktionelle verden er ikke imponeret. En af de f&#248;rste ting man kunne fornemme er en h&#248;j grad af syntaktisk st&#248;j. I denne situation findes to slags st&#248;j, un&#248;dvendige forstyrrende elementer, som parenteser, semikolon og lodret skrivemaskineapostrof/tegns&#230;tningsapostrof, og en del repeterende kode som fx &#8220;set&#8221;. 

&lt;pre&gt;
level.police &#8220;150364xxxx&#8221;
level.grundlag &#8220;omregning&#8221;
level.procent 3 
level.grundform 212 
level.ydelse 123.340,25
&lt;/pre&gt;

Hvordan skeler man mellem &#8220;set&#8221; kontra &#8220;get&#8221; metode signaturer. En &#8220;set&#8221; metode modtager input hvorimod en get metode afgiver output!  Hvordan bestemmes hvilken type som bliver overf&#248;rt i beskeden mellem objekterne? N&#229;r man arbejder med dynamiske sprog er en af de f&#248;rste ting man bem&#230;rker og s&#230;tter pris p&#229;, den mindre betydning som typer udg&#248;r. Med mindre systemet fejler er man faktisk ligeglad. Fx police identifikator er en integer, biginteger eller en streng n&#229;r man som her indf&#248;re &#8220;xxx&#8221; som erstatning for de 4 sidste tal. Hvis man vil have en numerisk v&#230;rdi skulle &#8220;xxxx&#8221; udskiftes med &#8220;0000&#8221;.    

Denne kode er en Intern DSL hovedsagligt opbygget gennem &#8220;DSL Method Chaining&#8221; med en tydelig kontekst(DSL Context). Konteksten er en police p&#229; laveste niveau. Det betyder at n&#229;r linjen &#8220;procent 3&#8221; eksekveres er det af en regel p&#229; et police niveau. 

&lt;pre&gt;
police 150364xxxx
grundlag omregning
procent 3
grundform 212
ydelse 123.340,25
&lt;/pre&gt;

Ved denne transformation har jeg nu noget business like kode som forretningens domain eksperter kan fortolke. Det er sprog neutralt og fungere som en pensions DSL input. Nu mangler jeg blot at skrive selve DSL fortolker koden, men det vil jeg ikke komme ind p&#229; i denne post.  

De yder omst&#230;ndigheder g&#248;r at dette skal eksekveres p&#229; en JVM og med Java SE kan det ikke lade sig g&#248;re. Med Java&#8217;s Scripting API JSR223 kan det lade sig g&#248;re. 

JSR223

Scripting API&#8217;et g&#248;r det muligt at eksekvere mange former script-sprog p&#229; Java platformen. Jeg gider ikke fort&#230;lle om de sm&#229; detaljer da frameworket er ganske lille og super enkelt. Java SE 6 indeholder en javascript-engine baseret p&#229; Rhino og det betyder at man kan fortolke dynamisk javascript i Java koden uden at addere ekstra jars. 

Hvorfor vil man eksekvere script kode internt i Java kode? 

* Java mangler en dynamiske tilgang
* Man kan skabe nye variabler uden at definere en type, man kan skifte type undervejs, typekonvertering sker i mange tilf&#230;lde helt automatisk. 
* Man kan edittere kode og eksekvere, uden brug af rekompilering.
* Man kan eksekvere konfiguration scripts, forretningslogik/regler og matematiske udtryk for finansielle applikationer fra en ekstern kontekst. 
* Man kan invokere &#8220;shell&#8221; scriptsekvenser i k&#248;rende applikationer. 

Hvis man vil have fortolket andre script-sprog, fx ruby i Java applikationen kr&#230;ver det at man l&#230;gger en jar fil med ruby-script engine i classpath. se nederst p&#229; siden for andre muligheder. 

N&#229;r man skal fortolke script sprog undervejs er hastigheden ikke fantastisk! Derfor er der indbygget mulighed for at kompilere et script til bytecode og optimere hotspots. 

Alle bin&#230;re script-engiens er bygget med Java SE 6 hvilket g&#248;r bagudkompatibilitet irriterende besv&#230;rligt. Med Java 1.4 er det n&#230;rmest umuligt idet der i implementationen er brugt varargs fra Java 5. I Java7 er flere dynamiske API&#8217;er p&#229; vej fx JRuby, Jython og Beanshell. Det betyder at det er muligt at skrive fx ruby kode i Java kode. Faktisk mangler man s&#229; kun at kunne at kunne markere blokke med ruby koden med tags direkte i Java koden. P&#229; samme m&#229;de som Pascal kunne h&#229;ndtere assembler i sin tid.  

Tilbage til eksemplet. Jeg vil udnytte groovy&#8217;s smarte og lette notation til denne opgave i en k&#248;rende Java applikation s&#229; lad os antage at jar filer og fortolker er tilstede i projekt konfigurationen. I teorien kunne det v&#230;re hvilken af de scriptsprog som underst&#248;ttes. 

Nu vil det v&#230;re muligt at skrive denne kode:

&lt;pre&gt;
public void run_groovy_code(Sting code) throws Exception { 
	ScriptEngineManager factory = new ScriptEngineManager(); 
	ScriptEngine engine = factory.getEngineByName(&quot;groovy&quot;); 
	Object ret = engine.eval(code); 
	assertEquals('this is groovy code', ret); 
} 
run_groovy_code(&quot;return 'this is groovy code'&quot;)
&lt;/pre&gt;

Nu er det alts&#229; muligt at overf&#248;re kode som eksekveres &#8220;on the fly&#8221;. 

Lad os nu antage at Java processen har k&#248;rt i flere timer og der kommer forskellige fejl. De bliver listet i en k&#248; og kan browses med en gui. Man kan hente hver enkelt ind og se beskeden og fejl beskeden. Der er ogs&#229; mulighed for at indtaste en regel som kan l&#248;se netop denne situation. Det modtagende system kan ikke modtage 212 for &#230;gtef&#230;lder, den skal konverteres til 216. 

&lt;pre&gt;
rule if grundlag == omregning &amp;&amp; grundform == 212 then grundform 216
&lt;/pre&gt;

Nu findes den nye regel i systemet og policen kan reeksekveres igen. Hvis k&#248;en er smart konstrueret opdager den selv at en &#230;ndring er sket og policen submittes ind i systemet mens den nye regel bytter 212 ud til 216 som det modtagne system kan h&#229;ndtere. 

Hvis man betragter applikationen som ren scaffolding for forretningsprocesser og forretningsregler kan man invokere et meget t&#230;ttere samarbejde med de forretningskyldige. Ligeledes kan man separerer/abstrahere forretningsspecifikke regler fra applikationer og dermed ogs&#229; de lange round-trips som vi lider under. En af de store n&#248;gler er at isolere enkelte processer til en niveau hvor det er muligt at skrive en DSL og skabe en mere deklarativ m&#229;de at anskue problemerne p&#229;-. Processen kan ovenik&#248;bet v&#230;re interaktiv og tillade at tilf&#248;re regler undervejs, m&#229;ske af forretningen selv. Sk&#248;nt!

JSR223 g&#248;r det muligt! 

Her er en kort liste med et par af de script-sprog som kan eksekveres i Java med JavaScripting API. 

* BeanShell - Small, free, embeddable Java interpreter
* FreeMarker - Java-based general purpose template engine
* Groovy - Groovy is an agile dynamic language for the Java
* Jaskell - Lazy functional programming language
* JavaScript 	Rhino 1.6R7 based JavaScript script engine. 	
* JEP - Parsing and evaluating mathematical expressions
* Jexl - Java Expression Language, expression language engine
* JudoScript - Scripting language built on top Java
* JUEL - Java Unified Expression Language
* OGNL - Object-Graph Navigation Language
* Ruby - Best language ever
* Scheme - multi-paradigm programming language, one of two main dialects of Lisp
* Tcl - Tool Command Language
* XPath - Finding information in an XML document
* XSLT - language for transforming XML
* JavaFX Script - Declarative scripting language
* AppleScript - The Language of Automation 
* Bex script 
* OCaml - fast, concise and powerful language 
* PHP 
* PHP 
* Python
* Smalltalk - Dynamically typed, reflective programming language
* CajuScript - Powerfull script to use with Java.  </body>
    <category-id type="integer" nil="true"></category-id>
    <created-at type="datetime">2009-01-16T01:28:21Z</created-at>
    <id type="integer">131</id>
    <post-id type="NilClass">131</post-id>
    <published type="boolean">true</published>
    <tag-id type="NilClass">10</tag-id>
    <title>JSR223 &amp; DSL</title>
    <updated-at type="datetime">2009-03-21T01:40:47Z</updated-at>
  </post>
  <post>
    <body>Jeg sider p&#229; et projekt og abstrahere nogle skatteberegninger som skal eksekveres i Java. Alt det kryptiske g&#248;jl omkring ops&#230;tning og sm&#229; ligegyldige spidsfindigheder er p&#229; plads. Det som holder mig v&#229;gen er hvordan jeg skal synligg&#248;re eller promote gr&#230;nsefladen til disse beregninger for en stribe udviklere.  

Jeg kan jo bare lade dem konstruere en stribe objekter og invokere set metoder p&#229; objekterne. Det er bare s&#229; almindeligt og jeg er d&#248;dtr&#230;t af hele termologien omkring set og get metoder. Jeg kunne ogs&#229; bruge injection framework eller m&#229;ske factory metoden.  

Flere af beregninger kan udf&#248;re alene men nogle andre er afh&#230;ngige af delberegninger. Hvordan udtrykker jeg det p&#229; en simple og hensynsfuld m&#229;de? Alle beregninger kr&#230;ver forskellige input og nogle resultater er input til andre hvilket medf&#248;rer en bestemt r&#230;kkef&#248;lge. 

Fluent interface kunne v&#230;re en l&#248;sning nu da platformen er Java. Martin Fowler har skrevet flere blogs omkring emnet og de er for det meste fornuftige. Et sandt fluent interface kan v&#230;re en forn&#248;jelse at bruge. Man beh&#248;ver ikke huske alle mulige ting om implementeringen og man kan direkte fortolke lingo&#8217;en. 

Fluent interface har levet i lange tider i dynamiske sprog men gode eksempler er der ikke mange af. 

Fluent interface kan tvinge en til at t&#230;nke h&#229;rdt over selve forretningen og det det er der jo aldrig tid til. S&#229; hellere lave &#233;n d&#229;rlig l&#248;sning. N&#229; det handler om Lingo.   
&lt;pre&gt;
        Beregn beregn new BeregnImpl();
        beregn.befordring().
        beregn.fribil().
        beregn.skat();
&lt;/pre&gt;
Dette er en fin l&#248;sning og n&#230;sten helt deklarativ programmering, men tager ikke h&#248;jde for input/output og heller ikke for selve eksekveringen. Fluent interface er m&#229;ske den bedste metode til at g&#248;re statiske Java til et DSL sprog? M&#229;ske ikke helt men n&#230;sten, der er stadig de grimme parenteser alle vegne og lidt gentagelse men det kan lade sig g&#248;re at skrive noget kode som n&#230;sten lader sig l&#230;se som plain sprog. 

N&#229;r man arbejder med fluent interface drejer det sig om at opbygge en kontekst der kan opereres p&#229;. S&#229; fribil er alts&#229; en metode p&#229; beregn og fribil returnere samme kontekst osv.   

At designe et fluent interface er sv&#230;rt, at implementere bibliotekerne bag er endnu sv&#230;rere. 

* Skjul dit arbejde. Hvis du hele tiden f&#248;ler dig n&#248;dsaget til at fort&#230;lle hvor langt du er kommet er der noget galt. 
* Hold din kontekst for dig selv. Klienten m&#229; naturligt kunne fornemme konteksten. 
* Eksponer ikke din implementation. Klienten m&#229; kun se de valg som findes netop i denne kontekst. 
* Brug lang tid p&#229; navn konvention. Perspektivet er klientens og DSL&#8217;en skal udtrykke forst&#229;elige koncepter.  
* Lav flere design. Fly ikke med det f&#248;rste. 
* Lad aldrig klienter gentage sig selv. 

Lad mig pr&#248;ve at g&#248;re det lidt bedre:
&lt;pre&gt;
        Beregn().befordring().fribil().skat();
&lt;/pre&gt;

Gentagelserne er v&#230;k. Desv&#230;rre kan jeg ikke styre eksekveringen, skal hver metoder invokere en del beregning? Og hvad med input og det faktum at befordring er en del af skatberegningen. 

Vil jeg s&#230;tte input p&#229; Beregn(), s&#229; input g&#230;lder alle beregninger? Beh&#248;ver jeg en metode til sidst som eksekvere koden? Hvad er output? 

Mens jeg t&#230;nker over dette har min kollega lavet denne presentation om fluent interfaces. 

&quot;Fluent interface for SQL in Java&quot;:http://docs.google.com/Presentation?id=dckns5q8_86hff23tcw

</body>
    <category-id type="integer">11</category-id>
    <created-at type="datetime">2008-05-16T05:44:00Z</created-at>
    <id type="integer">111</id>
    <post-id type="NilClass">111</post-id>
    <published type="boolean">true</published>
    <tag-id type="NilClass">10</tag-id>
    <title>Fluent interface</title>
    <updated-at type="datetime">2008-05-27T00:45:10Z</updated-at>
  </post>
  <post>
    <body>N&#229;r man laver en DSL (Domain Specific Language) er der flere forskellige patterns man kan benytte. 

Men f&#248;rst kan man dele DSL'er op i to grupper. En intern og en ekstern. Den interne bliver til i host programmeringssproget. Den mest almindelige eksterne DSL er en samling af unix programmer som i en bestemt sammenl&#230;gning udg&#248;r et st&#230;rkt DSL. I dette tilf&#230;lde drejer det sig kun om intern DSL. 

En DSL er et subset af et programmeringssprog der er forenklet p&#229; en m&#229;de s&#229; forretningsdrivende der arbejder i domainet umiddelbart kan genkende og validere de enkelte sprogkonstruktioner. En DSL er enkel og kan udtrykke selve forretningen. 

Et af de mest kendte DSL eksempler p&#229; blog niveau er kaffe testen. Jeg er rigtig glad for dette eksemple da jeg drak meget Starbucks kaffe da jeg arbejdede i New York. Alle Starbucks forretninger har deres egen sprog n&#229;r der bestilles kaffe. Som kunde modtager man en veritabel byge af sp&#248;rgsm&#229;l om alt fra vandkvalitet til vaniljesmag. Det drejer sig alts&#229; om at skabe en bestilling p&#229; en eller flere kopper kaffe. 

Grammatikken for en kaffeordre er st&#248;rrelse, tilbeh&#248;r og typen af kaffe. S&#229; p&#229; baggrund af dette vil jeg kunne bestille s&#229;dan. 

&lt;pre&gt;
Starbucks.order do
    grande.coffee
    short.americano
    venti.breve.half_caff
end
&lt;/pre&gt;

Okey det kan vel n&#230;sten alle l&#230;se. Hver linje er en kop kaffe, s&#229; her er alts&#229; en ordre p&#229; tre kopper. Et normalt morgenforbrug. Hvis vi kigger n&#230;rmere p&#229; ord som forretningen ikke kender finders der kun nogle f&#229;. 

En af de st&#248;rste styrker ved DSL er l&#230;sbarheden. M&#229;ske kan forretningen ikke selv skrive den konkrete kode men de kan nemt l&#230;se og forst&#229; den, evt i samr&#229;d med de udviklere som fors&#248;ger at validere deres implementering. 

Det ser ud som ordre objektet laver alt arbejdet. Ordre har ansvar for fortolkningen af DSL'en. Modulet ordre laver en instans af Ordre og kalder metoden instance_eval p&#229; det. Det f&#229;r blokken til at eksekvere med ordre som binding. Derefter vil alle metoder v&#230;re brugbare p&#229; ordre via blokken. 

Det fortolkerne objekt kan udf&#248;re en masse tricks en mens det eksekvere DSL'en, i dette tilf&#230;lde generere det en overs&#230;ttelse. Kombinationer er dog utallige. Hvis du har sv&#230;rt ved at v&#230;nne dig til context kan man parse et objekt med ind i blokken men jeg elsker den DRY kode med meget lidt repetition.    

I nogle &#229;r har jeg haft den tanke at konstruere en ny webbank light til de almindelige bankkunder som har normale krav, de 10 mest brugte features taget ud fra en eksisterende prioriteret liste. 

Webbank light udnytter i h&#248;j grad DSL. Selv det at oprette testdata er blevet til et specifikt sprog. Problemet er at applikationen kr&#230;ver det som en bank har som k&#230;rneforretning. 

At vedligeholder en konto med kontobev&#230;gelser over tid. 

Kort sagt skal jeg popurlere databasen med konto balance og konto bev&#230;gelser tilbage i tiden og jeg vil gerne kunne finde p&#229; nye scenarier efterh&#229;nden.  

&lt;pre&gt;
trans = Bank.transaction |account| do 
  account.deposit.everly.month.amount 27500 &quot;Salary&quot;
  account.withdraw.everly.month.amount 8000 &quot;Rent&quot;
  account.withdraw.amount 50 &quot;Irma&quot;
  account.balance.amount  
end
&lt;/pre&gt;

Men det kan nemt g&#248;res bedre. For det f&#248;rste er der for meget repetition i koden, flere ord st&#229;r p&#229; hver linje og udg&#248;r ikke noget ekstra information for mig. Ved at fjerne ord som amount og account bliver DSL&#8217;en mere l&#230;sbar for mennesker. Til geng&#230;ld kan nogle muligheder i DSL&#8217;en v&#230;re forst&#229;et eksplicit. 

h4. Java fluentinterface

Man kan ogs&#229; lave n&#230;sten det samme med Java. M&#229;ske bliver koden en smule mere verbose men meningen skulle v&#230;re der. Jeg benytter fluentinterface til at f&#229; syntaksen p&#229; plads.  

&lt;pre&gt;      
Payment payment = new Payment()
        .transation()
        .whitdraw()
        .currency(Currency.DKK)
        .amount(50)
        .text(&quot;Irma&quot;);
&lt;/pre&gt;

Det er samme teknik som kan g&#248;re lej med dato objekter nemmere. Her addere et fluentinterface nye metoder til en Date klasse. 
&lt;pre&gt;
      Dato dato = new Dato();

      dato.at_beginning_of_day();
      dato.advance();
      dato.end_of_day();
      dato.midnight();
      
      dato.ago(84000);
&lt;/pre&gt;
</body>
    <category-id type="integer">4</category-id>
    <created-at type="datetime">2008-01-31T03:19:00Z</created-at>
    <id type="integer">95</id>
    <post-id type="NilClass">95</post-id>
    <published type="boolean">false</published>
    <tag-id type="NilClass">10</tag-id>
    <title>DSL</title>
    <updated-at type="datetime">2008-02-04T05:22:51Z</updated-at>
  </post>
  <post>
    <body>Obscure Data Formats, Workflow, and Remote Synchronization

Ved RailsConf i Berlin talte jeg med Chad Thatcher om et projekt hvor han har konverteret et stort katalog der indenholder musik manuscripter fra det 16ende og 18ende &#229;rhundrede. Musikken ligger i det anerkende format MARK som blev udviklet i 1960erne for digital lager. Formatet er komplekst herakttisk opbygget og bruges stadig overalt hvor kunstv&#230;rker gemmes i digital form.     

&quot;R&#233;pertoire International des Sources Musicales&quot;:http://www.rism-ukie.org

Chad har konstrueret ny gr&#230;nseflade til systemet i Rails med fuld udnyttelse af Ajax, fx Drag and drop and auto-completion af de meget komplekse MARK records hvilket er en stor hj&#230;lp for de folk som tilf&#248;re data til disse records da de i selv indeholder mere end 2500 keywords. Selve MARK formatet er bibehold men der er tilf&#248;jet en ny model som mappe til en en mere normal RDMS l&#248;sning som giver flere fordele i henhold til s&#248;gninger og editering af records. P&#229; grund af den r&#229; m&#230;ngde af data s&#229; man ingen mulighed for at flytte til andet format.  

Hver MARC record er nu gemt som tekst i databasen og bliver mappet i real-time til en tree struktur, ved hj&#230;lp af composed_of property indbygget ActiveRecord. P&#229; denne m&#229;de kan navigation og s&#248;gning ske umiddelbart i MARK data. Dette har forbedret en s&#248;gning fra ca. 43 sekunder til 0.003 sekund. 


Jet Fighter Fuel


En sen aften time talte jeg med Rich Kilmer fra Virginia-based InfoEther. Han tale p&#229; JAOO om Ruby and the Art of Domain Specific Languages. Han anses som den f&#248;rende indefor DSL og desktop-based Ruby + Flash applikation. Rich er aktiv medlem af Ruby community har lavet fx. FreeRIDE Ruby IDE, RubyGems package manager, Ruby Java Debugging Library and the Jabber4R Jabber library. Rich hostser ogs&#229; RubyForge.org projekt siden for Ruby community og er medlem af Ruby Central.

Rich viste nogle slides omkring et projekt i 2003 hvor han var indkaldt som redningsmand da projektet var stagneret pga kompleksitet. Systemet skulle h&#229;ndtere USA's milit&#230;r fly br&#230;ndstof p&#229;fyldning simulationer der ligger til grund for hvor og hvorn&#229;r jet fly tanker i luften. 

Rich besluttede at skrive l&#248;sningen i Ruby, og g&#248;re det Domain Specific. S&#229; koden blev skrevet i samr&#229;d med den ene milit&#230;r mand som viste helt pr&#230;cist hvordan denne proces skal forl&#248;be. P&#229; tre uger kunne de begge l&#230;se den samme kode som ethvert andet A4 dokument med en tekstuel repr&#230;sentation af systemets adf&#230;rd. Koden skrive i det sprog som forretning eller processen bruger og alle kan derfor forst&#229; forl&#248;bet.  


&quot;Rich Kilmers blog&quot;:http://richkilmer.blogs.com/
</body>
    <category-id type="integer">3</category-id>
    <created-at type="datetime">2007-10-04T09:01:00Z</created-at>
    <id type="integer">74</id>
    <post-id type="NilClass">74</post-id>
    <published type="boolean">false</published>
    <tag-id type="NilClass">10</tag-id>
    <title>Ruby applications</title>
    <updated-at type="datetime">2008-04-08T07:04:39Z</updated-at>
  </post>
  <post>
    <body>The way you writing efficient, effective code are changing. Domain Specific Languages are one of the key factors driving this &quot;Shifting Paradigm&quot;. DSL allow you to incorporate highly specialized tasks into your projects, tasks that otherwise could not be accomplished by general purpose programming languages like Java. 

bq. DSL can perspectives complexity. 
DSL can escalate the abstraction layer.
DSL are less comprehensive.
DSL are much more expressive in their domain.
DSL are more agile, reusable and manageable applications

Domain Specific Languages

En DSL kan beskrives som et begr&#230;nset computersprog designet for et specielt problem. DSL kan v&#230;re et kraftfuldt v&#230;rkt&#248;j til at lukke det ocean som findes mellem udviklere og dom&#230;ne eksperter. DSL udtrykker information og adf&#230;rd p&#229; en klar og tydelig m&#229;de og samtidig kan koden l&#230;ses som almindeligt sprog. Dom&#230;ne eksperterne kan nemt l&#230;se DSL for at fastsl&#229; at forst&#229;elsen af forretningen er korrekt, i et traditionelt system kan dette typisk ikke lade sig g&#248;re. DSL har stor indflydelse p&#229; mange omr&#229;der af applikationsudvikling og frameworks hvor l&#248;sninger kan blive b&#229;de kraftige og elegante. 


</body>
    <category-id type="integer">11</category-id>
    <created-at type="datetime">2007-05-31T02:58:00Z</created-at>
    <id type="integer">43</id>
    <post-id type="NilClass">43</post-id>
    <published type="boolean">false</published>
    <tag-id type="NilClass">10</tag-id>
    <title>Domain Specific Languages</title>
    <updated-at type="datetime">2008-04-03T09:21:51Z</updated-at>
  </post>
</posts>
