<?xml version="1.0" encoding="UTF-8"?>
<posts type="array">
  <post>
    <body>Titlen p&#229; denne post har jeg snuppet fra et &#8221;white paper&#8221; om hastighedsoptimeringer i forskellige J2e applikationsserverer. For nogle &#229;r tilbage stod den helt store kamp p&#229; applikations markedet mellem ret enkelte egenskaber s&#229;som hastighed, kapacitet eller robusthed. 

Denne gang har jeg kun fokus p&#229; hastighed og specielt en applikationsserver har fors&#248;gt at markere sig som den absolut hurtigste. Under udviklingen nedsatte de nogle gruppe som udelukkende koncentrerede om at finde og afhj&#230;lpe hotspots for at finde yderligere hastighed. Under denne arbejdsindsats fandt de p&#229; mange tricks og metoder man kan g&#248;re for at optimere b&#229;de selve serveren men ogs&#229; i de applikationer som hostes af serveren. 

Konklusionerne er omfattende og komplekst men en enkelt tese munder ud i denne s&#230;tning: &#8221;Det koster mere at skabe en ny instans af en klasse, end det koster at have en instans og lave et antal kopier.&#8221;

Det konkredte problem er at jeg har et &#8221;Command Pattern&#8221; der har indkapslet et beregningsmodul. En hver beregning er isoleret og kan leve uden sideeffekter eller delt hukommelse under afvikling. Det uheldige er at beregningerne er koblede gennem et lag med serialisering/deserialisering. Som serialisering tool er valgt XMLBeans og mere end 95 procent af tiden g&#229;r med at instantiere XMLBeans objekter. 

Det er ikke et problem jeg vil l&#248;se ved at konstruere en ny applikationsserver men blot bruge samme analogi. Jeg har med succes implementering metoden flere gange og fundet betragtelige hastighedsoptimeringer. 

Hemmeligheden er hotspot compileren. Jeg vil ha hotspot til at clone objekter fremfor at new objekter. Metoden provokere hotspot til at lave effektive genveje melle bytecoden og basic CPU instruktioner. 

&lt;pre&gt;
/**
 * Static references optimizer
 * @see http://en.wikipedia.org/wiki/Java_bytecode
 */
class StaticReferencesOptimizer {
    private static XMLBean xmlbean = new XMLBeansDummey.create \AllBeans();
}
&lt;/pre&gt;

Ved applikations start vil disse notificeret beans blive instantieret og ved service kald vil compileren blot lave en kopi. Millionvis af kopier med 90 til 95 procent bedre hastighed end ved at lave nye instanser. Det var alt. Alle de XML beans som skal benyttes skal ind i s&#229;dan en klasse i en statisk kontekst og den hastighedsoptimering du kan opn&#229; ved s&#229; simpelt indgreb vil overraske dig. 

Selv om dette trick er utroligt enkelt er det langt fra alle mainstream Java programm&#248;rer som forst&#229;r de mekanismer som sker i hotspot compileren. Og heldigvis for det. Fra Java's perspektiv ses en klasse som ikke har referencer til eller fra andre klasser. Det mest normale er at en novice programm&#248;r sletter filen. 

Her kommer disciplin og dokumentation ind i billedet men det er en anden sag. 


</body>
    <category-id type="integer" nil="true"></category-id>
    <created-at type="datetime">2009-02-01T04:38:56Z</created-at>
    <id type="integer">133</id>
    <post-id type="NilClass">133</post-id>
    <published type="boolean">true</published>
    <tag-id type="NilClass">37</tag-id>
    <title>Static References Optimizer</title>
    <updated-at type="datetime">2009-02-01T08:08:52Z</updated-at>
  </post>
  <post>
    <body>Something is not working, yaaaa i know. I finally pulled myself together to a total rewrite on my website. I do not have time enough to do it for real, but anyway. Don't ever do total rewrites in software development! Yaa I know. But, i have to rewrite everything to be completely restful. All services is now running full REST mode. Representational State Transfer. 

h4. Old services

This mens that a few services not are working anymore like fx Atom protocol, RSS feed are all gone. I am sorry. Temporary I have a method caching all calls the old services like this. It returns an 301 and a new location. Don't know if this works whit google? We will see.   
&lt;pre&gt;
  def redirection
    render :text =&gt; &quot;Moved Permanently!&quot;, :status =&gt; 301, :location =&gt; '/posts'
  end
&lt;/pre&gt;
I got a problem. Google is still pumping the googlebot spinder robot on my pages. So I will try something else and see if I can keep google out. 
&lt;pre&gt;
  def redirection
    render :text =&gt; &quot;Gone&quot;, :status =&gt; 410 
  end
&lt;/pre&gt; 


h4. Representations

All services can return more than one representation. Services deliver Javascript, JSON, XML and pure HTML. 

h4. Feeds

The new feed address are: http://www.frankvilhelmsen.com/posts.atom or http://www.frankvilhelmsen.com/posts with the content-type set to atom

h4. REST API

* &quot;curl -i -X GET -H 'Accept: text/html'  /posts/1 &quot;:/posts/1-My-new-website-
* &quot;curl -i -X GET -H 'Accept: application/js' /posts/1 &quot;:/posts/1-My-new-website-.js
* &quot;curl -i -X GET -H 'Accept: application/xml' /posts/1 &quot;:/posts/1-My-new-website-.xml
* &quot;curl -i -X GET -H 'Accept: application/json' /posts/1 &quot;:/posts/1-My-new-website-.json
* &quot;curl -i -X GET -H 'Accept: application/atom+xml' /posts/1 &quot;:/posts/1-My-new-website-.atom

h4. REST Nouns 

This page has nouns like fx /posts /comments or /titles. 

h4. REST Verbs 

All nouns can bee accessed with GET verb. Note that there are restrictions on all PUT, POST and DELETE verbs. 

This output are the rake routes command in rails 2.0.2.
&lt;pre&gt;
                        GET    /posts                           {:controller=&gt;&quot;posts&quot;, :action=&gt;&quot;index&quot;}
        formatted_posts GET    /posts.:format                   {:controller=&gt;&quot;posts&quot;, :action=&gt;&quot;index&quot;}
                        POST   /posts                           {:controller=&gt;&quot;posts&quot;, :action=&gt;&quot;create&quot;}
                        POST   /posts.:format                   {:controller=&gt;&quot;posts&quot;, :action=&gt;&quot;create&quot;}
     formatted_new_post GET    /posts/new.:format               {:controller=&gt;&quot;posts&quot;, :action=&gt;&quot;new&quot;}
              edit_post GET    /posts/:id/edit                  {:controller=&gt;&quot;posts&quot;, :action=&gt;&quot;edit&quot;}
    formatted_edit_post GET    /posts/:id/edit.:format          {:controller=&gt;&quot;posts&quot;, :action=&gt;&quot;edit&quot;}
                   post GET    /posts/:id                       {:controller=&gt;&quot;posts&quot;, :action=&gt;&quot;show&quot;}
         formatted_post GET    /posts/:id.:format               {:controller=&gt;&quot;posts&quot;, :action=&gt;&quot;show&quot;}
                        PUT    /posts/:id                       {:controller=&gt;&quot;posts&quot;, :action=&gt;&quot;update&quot;}
                        PUT    /posts/:id.:format               {:controller=&gt;&quot;posts&quot;, :action=&gt;&quot;update&quot;}
                        DELETE /posts/:id                       {:controller=&gt;&quot;posts&quot;, :action=&gt;&quot;destroy&quot;}
                        DELETE /posts/:id.:format               {:controller=&gt;&quot;posts&quot;, :action=&gt;&quot;destroy&quot;}
&lt;/pre&gt;


When you call the old RSS or Atom protocol something like this happens. Replay with 301 Moved Permanently and u get one new header Location to hit. 
&lt;pre&gt;
frank@howdy:~\&gt; curl -I -X GET localhost:3000/feed
HTTP/1.1 301 Moved Permanently
Connection: close
Date: Sun, 13 Jan 2008 17:39:42 GMT
Set-Cookie: _blog_session=BAh7BiIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNo%250ASGFzaHsABjoKQHVzZWR7AA%253D%253D--830361ac99d21fe1231dde1ab3fc6f515599537d; path=/
Status: 301 Moved Permanently
Location: /posts.atom
X-Runtime: 0.00239
Cache-Control: no-cache
Server: Mongrel 1.0.1
Content-Type: text/html; charset=utf-8
Content-Length: 18
&lt;/pre&gt;

The content are maybe changing a bit, but what the hell, you will live. I hope that you will be some what provoked by the content and you are most welcome to comment. For the most part I write about stuff that I find stupid or just something around my job as software developer. I feel myself inspired from cssgarden website and want to fix it together with static and dynamic content and test out some ajax components.

A few funny links
 
* &quot;Google fight&quot;:http://googlefight.com
* &quot;Labs google com&quot;:http://labs.google.com
* &quot;Goggles&quot;:http://www.isoma.net/games/goggles.html


</body>
    <category-id type="integer">12</category-id>
    <created-at type="datetime">2008-01-10T13:57:00Z</created-at>
    <id type="integer">1</id>
    <post-id type="NilClass">1</post-id>
    <published type="boolean">false</published>
    <tag-id type="NilClass">37</tag-id>
    <title>My new website!</title>
    <updated-at type="datetime">2008-02-15T04:38:21Z</updated-at>
  </post>
  <post>
    <body>XML har v&#230;ret p&#229; banen I lang tid nu og er blevet brugt til n&#230;sten alt. Faktisk en hel del mere end det var beregnet til. XML er godt til noget og noget lort til andet.

* XML er velegnet til tekstredigering
* XML er t&#229;lelig til at beskrive hierarkisk data. Brugen af start og slut tags g&#248;r det ret larmende, specielt hvis der kun bruges elements frem for attributter for simple v&#230;rdier. Standarden overvejer dog de negative sider
* XML er frygtelig for programmeringssprog. N&#229;r XML bliver en del af kontrol strukturen i programmeringssproget g&#229;r det helt galt og XML bliver ulidelig at arbejde med

Umiddelbart kan jeg forst&#229; at man benytter XML til udveksling af data mellem forskellige institutioner som er fysisk adskilt og jeg gl&#230;der mig ogs&#229; over at h&#248;re om l&#248;s kobling mellem systemer. 

Der hvor vi efter min mening fejler er n&#229;r vi aftaler en protocol gennem en WSDL fil og derefter autokompilerer b&#229;de vores afsender og modtager system. Nu har begge parter samme nye problem. De skal fors&#248;ge at mappe deres eksisterede data til den kontrakttuelle gr&#230;nseflade. 

S&#229; hvad har vi vundet? 

En god ting er at vi har flytte problemdom&#230;net t&#230;ttere p&#229; vores organisation, hver is&#230;r. I udviklingsprocessen er det vigtig at man kan arbejde t&#230;t sammen lokalt. Forretningen og udviklerne kan arbejde i samr&#229;d.   

Vores udgangspunkt var et klart &#248;nske om l&#248;s koblede systemer hvor man kan &#230;ndre delapplikationen uden implikationer for andre dele af systemet. Desv&#230;re er vi nu endt i fastbundnet system hvor enhver &#230;ndring skal gennemf&#248;res som en sektor l&#248;sning med deploy politiker og alt hvad der medf&#248;lger.  

Hvordan kan det v&#230;re? Hvordan bygger man robuste system som kan &#230;ndres tilhver en tid uden at skabe problemer for resten af applikationerne?

Svaret er enkelt: Det kan vi ikke. Vi kan ikke bygge systemer som b&#229;de er distribueret og monolitisk. 




</body>
    <category-id type="integer">13</category-id>
    <created-at type="datetime">2007-08-20T05:59:00Z</created-at>
    <id type="integer">60</id>
    <post-id type="NilClass">60</post-id>
    <published type="boolean">false</published>
    <tag-id type="NilClass">37</tag-id>
    <title>XML design</title>
    <updated-at type="datetime">2008-04-08T07:29:54Z</updated-at>
  </post>
  <post>
    <body>Det var Dave Thomas der under en tale p&#229; RubyConf i London udtalte de ber&#248;mte ord som senere skabte det mentale fundament der nu forst&#229;s ved ducktyping. 

&quot;If it walks like a duck and quacks like a duck, it must be a duck&quot;

Ikke mere pjat men direkte til koden: 

&lt;pre&gt;
class Elephant { 
  wash_dish() {} 
} 

class Man { 
  taking_a_nap() {} 
} 

class Woman { 
  wash_dish() {} 
} 
&lt;/pre&gt;

Tre klasser der p&#229; udem&#230;rket vis repr&#230;sentere et stykke virklighed. Det er &quot;design by capability&quot; og nogen vil sikkert nikke genkendende til de egenskaber der er langt v&#230;gt p&#229;. 

Hvis jeg som bruger af disse klasser og skal have hj&#230;lp med opvasken, kan jeg kalde metoden(wash_dish) p&#229; hver af de tre instanser. Kun de to besidder evnen til at hj&#230;lpe mig. Manden lader jeg sove, ingen grund til at smide en exception af den grund ham. 

* &quot;Duck typing er at bruge objekter ud fra deres adf&#230;rd og ikke deres type&quot; 

I dynamiske programmeringssprog kigger man alts&#229; ikke p&#229; klasse typen men mere om de har den &#248;nskede aff&#230;rd i form af metoder. WS-duck-typing er lidt det samme dog uden programmeringssproget. 

Men hvad har de kornfede &#230;nder i det hele tage med webservices af g&#248;re kunne man sp&#248;rge? Jo det bunder i en f&#230;lles holdning hos medlemmerne af &quot;http://soa-manifesto.org&quot;:http://soa-manifesto.org og hos mange andre software trendss&#230;ttere. 

* &quot;Service orienteret software er det rigtige at str&#230;be efter og Service Orienteret Arkitektur(SOA) opst&#229;r som afledt effekt af service orientering&quot; 

Med andre ord er de alle enige om at SOA som princip er godt for alle service orienteret applikationer men de er ogs&#229; samtidig enige om at SOAP og andre WS* (d&#248;dsstjerne teknologer) stinker. Det viser sig at WS-duck-typing er en fin m&#229;de at udveksle information p&#229;, endda mellem meget forskellige systemer. Det essentielle ved en webservice er at dele information og s&#229; l&#230;nge den g&#229;r som en and ,,,, osv

Der er lidt forskellige meninger omkring hvor mange, eller rettere sagt hvor f&#229; steps der skal til for at skabe webservice docktyping. Jeg bruger den lette model der best&#229;r af tre enkle skridt. 

# Validere ikke indkommende beskeder. 
# Brug XPath til udtr&#230;kning af information. 
# Generer aldrig stubs og skeletons. 

1. Validere ikke indkommende beskeder. 

Der ingen som gider bruge tid p&#229; at validere dine beskeder. Der er heller ikke noget som gider definere dem, opdatere dem eller overholde dem og de s&#230;tter un&#248;digt meget fokus p&#229; maskinkraft. Har du nogen sinde set en komma separeret fil med typer? 

Her kommer det n&#230;ste citat fra Postel lov:

* &quot;be conservative in what you do; be liberal in what you accept from others&quot;

2. Brug XPath til udtr&#230;kning af information. 

XPath er en fremragende m&#229;de at udtr&#230;kke information fra et XML dokument. Kode skrevet fra XML API'er er ofte for urobust n&#229;r det kommer til element ordning, nestede fragmenter og ikke forventede elementer. N&#229;r man bruger XPath opdager man ikke hvilken orden elementer kommer i ej heller om det er f&#248;rste eller andet element. De tider hvor XPath var langsom er over. 

3. Generer aldrig stubs og skeletons. 

Det er med sikkerhed det mest kontroversielle punkt af dem alle. Hvis du opretter flere klient side &quot;stubs&quot; eller flere server side &quot;skeletons&quot; i et typet sprog som Java, mister du muligheden for at v&#230;re liberal omkring dine XML beskeder. Til trods for at SOA WS produkt s&#230;lgerne p&#229;st&#229;r at du er l&#248;s koblet systemer har du med den fremgangsm&#229;de oprette et st&#230;rkt typet API der ovenik&#248;bet er st&#230;rkt bundet til WSDL kontrakten. Hvis en af disse parameter ikke findes, er forkert forkert type eller der er indsat en ekstra kommentar  vil informations udvekslingen fejle.  

Anbefalingen lyder p&#229; at behandle web tjenester som XML beskeder i stedet for RPC kald. P&#229; den m&#229;de kan man skabe XML services der er mere fleksible og interoperable. </body>
    <category-id type="integer">13</category-id>
    <created-at type="datetime">2007-02-25T13:20:00Z</created-at>
    <id type="integer">21</id>
    <post-id type="NilClass">21</post-id>
    <published type="boolean">true</published>
    <tag-id type="NilClass">37</tag-id>
    <title>WS-Duck-typing</title>
    <updated-at type="datetime">2009-10-28T06:18:50Z</updated-at>
  </post>
</posts>
