Når timeregistrering bliver sjovt

Alle der har været i nærheden af et timeregistreringsystem ved hvor kedeligt det kan være. Nåja – det kan være effektivt ifbm. at forbedre ens udviklingsteknik – men det er stadigvæk KEEDELIGT .

Det har jeg heldigvis nu mulighed for at lave om på vha fogbugz ! Fogbugz tilbyder et REST api så det er fleksibelt i den forstand at jeg kan benytte et selvvalgt sprog til at kode en applikation op imod det på en enkelt facon.

For ruby kan man f.eks gøre således vha rubygems:

gem sources -a http://gems.github.com
gem install austinmoody-fogbugz-api

for derefter at skrive flg vha ruby:


require 'rubygems'
require 'fogbugz-api'
fb = FogBugz.new("stureaps.fogbugz.com", true)
fb.logon("jacob@stureaps.dk", "mitkodeord")
mycases = fb.search("AssignedTo:\"Jacob Andresen\"")
mycases.each {|c| print c.to_s + "\n" }
fb.logoff

Derfra er det jo så meget sjovt at kigge på resultatet på kommandolinjen! Et lidt mere seriøst brug kunne være at udtrække rapporter over tidsforbrug.

Lowpro og behaviour

Det er meget vigtigt at udskille javascript fra HTML når man koder webapplikationer. På den facon bliver koden nemmere at vedligeholde og overskue. Prøv at søge efter “unobtrusive javascript”.

Morgan Roderick har givet en introduktion til “Lowpro” . Morgan har bemærket at selv om Dan Webb kommer fra den rigtige side af bæltet, så staver han “Behavior” forkert . Hvis du har de tilbøjeligheder så kan du hente en ny udgave af Ben Nolans “Behaviour” , der er tilrettet af Jakob Kruse her : http://www.kruse-net.dk/behaviour/.

Begge biblioteker gør nogenlunde det samme. Det ser dog ud til at man kan pille event callbacks væk fra “lowpro” efter at man har puttet dem på. Det kan man vist ikke i “Behaviour”.

Bemærk at begge biblioteker er gode at anvende sammen med prototypejs.

Introduktion til Ext.Direct

Jeg har lavet en præsentation af hovedtrækkene i Extjs 3.0 :  Extjs 3.0  The good stuff

Der er mange flotte farver og kode i ! ;)

ext 2009 konference

Jeg er iøjeblikket i Orlando til den første extjs brugerkonference. extjs blev startet af Jack Slocum mens han var hos Yahoo   – biblioteket er nu kommet i 3. version . Hele vejen igennem har det været Jacks vision at skabe et sammenhængende rammeværktøj  til at lave komplekse webapplikationer.

extjs 3.0 RC1 er tilgængelig  fra http://extjs.com/products/extjs/download.php

Den største nyhed for extjs 3.0 er introduktionen af Ext.direct , der introducerer en sammenhængende model for at opdatere data vha forskellige serverside teknologier . Ifbm launch af 3.0 vil der blive præsenteret Routers for Ruby/merb , java, C# og php.  Jeg snakker iøjeblikket med Data access om at de bør introducere en ext 3.0 router  for visual dataflex..

En af de mere visuelt imponerende ting er introduktionen af en RowEditor , der introducerer inplace redigering i et extjs grid vha extjs DataStore arkitektur .

Mit indtryk herfra er at extjs firmaet har gode forbindelser til Adobe , Sun  og Dell samt en større liste af amerikanske virksomheder (bestbuy som et eksempel) . Det virker som at  folk begyndte at bruge extjs for omkring et år siden ifbm extjs 2.0..

Lego rocks!

Imens vi venter på at Metallica kommer til Forum den 22/7 2009 og AC/DC kommer til Parken den 19/6 2009 , så er der jo youtube!

Prøv at søge efter et bandnavn og “LEGO” så er der en del videoer lavet af fans. Her er et par stykker :

Derer  også andre hits som “Feuer frei” fra Rammstein:

og “Ace of Spades” fra Motorhead

afprøvning af groovy på tomcat5.5 på ubuntu vha mysql

Jeg har iøjeblikket brug for at kunne afprøve flere forskellige måder at implementere ting i java ifbm prototypning.  Under prototypning kan det være forbundet med ulemper at benytte hele J2EE stakken under udvikling da det kan tage unødigt lang tid at kompilere og deploye Derfor har jeg valgt at kigge på groovy .

Da det iøjeblikket er for webapplikationer jeg undersøger , så har jeg valgt at køre under tomcat5.5 på min testmaskine.
tomcat5.5 og groovy kan nemt installeres sammen på ubuntu. Det gøres sådan her (jeg antager at du allerede har installeret mysql og den virker)


sudo apt-get install tomcat5.5 tomcat5.5-admin groovy

For at få tomcat5.5 til at køre groovy til demonstrationsformål har jeg sat “TOMCAT5_SECURITY=no” i filen “/etc/init.d/tomcat5.5″. I et produktionsmiljø bør man gøre sig overvejelser om brugen af classloaders.

Jeg har til demonstrationsformål valgt at rette filen /etc/tomcat5.5/tomcat-users.xml til således at bruger “tomcat” har roles=”tomcat,admin,manager” – derved kan jeg logge ind i  /manager/ vha ‘tomcat’ og ‘tomcat’ .Bemærk at der nederst på manager-siden står “WAR file to deploy”. Her kan du uploade flg. fil : groovytest.war

Herefter kan der ses et resultat i  /groovytest/ på testmaskinen. groovy testkoden ser således ud:


Sql.loadDriver("com.mysql.jdbc.Driver");
sql = Sql.newInstance("jdbc:mysql://localhost:3306/test", "web","sockmonkey");

sql.eachRow("select * from test") {
println it.id + " " + it.name
}
print "mere test"

“test.groovy”  henviser til en database “test” med tabellen “test”. Disse kan skabes vha filen “test.sql” der er vedlagt i groovytest.war

war-filen indeholder mysql-driveren , så forbindelsen mellem mysql og groovy skulle fungere der. Men hvis du vil forsøge dig med at køre test.groovy fra kommandolinjen , så kan du også det , hvis du kopierer mysql-connector-java-3.1.14-bin.jar over i din ~/.groovy/lib/ . På den facon kan du afvikle testen på serveren uden om tomcat.

om autoriteter i brugerskabt indhold

Den bedste internet søgemaskine på markedet idag er baseret på begreberne ‘hubs’ og ‘authorities’. En ‘authority’ opfattes som en side der er central i et netværk for et givent emne og opfattes af netværket som centralt for emnet. En ‘hub’ er et knudepunkt i netværket der indeholder mange henvisninger til øvrige steder.

Efterhånden som flere og flere steder på internettet tillader brugerskabt indhold så mener jeg at vi må ændre på beregning af autoritet vha af henvisninger i et netværk. F.eks på ‘blogs’ så indeholder kommentarer typisk en henvisning tilbage til hjemmesiden til ham eller hende der har skrevet kommentaren, derved vender vi op og ned på hvad en ‘hub’ og en ‘authority’ er – idet linket nu går den anden vej i kommentaren.

Den traditionelle ‘hubs’ and ‘authorities’ model

Hvis vi i den traditionelle situation betragter et endeligt antal websider uden brugerskabt indhold i et sæt {1,2, … ,n} så kan vi opstille en matrice B med links i mellem de forskellige websider hvor 1 markerer at der link mens 0 markerer intet link – indgang (i,j) i B markerer så at der er et link fra i til j.

Hvis vi så yderligere betragter ‘hubs’  som og authorities

Så kan vi beregnene vægtene i netværket således :

og     

Hvis vi itererer en gang så når vi

og  

næste iteration giver

og

Den matematisk kyndige læser vil her indse at at resultaterne vil konvergere imod de principielle egenvektorer for og

Rent intuitivt ses det at samlingen af autoritetsvægte for siderne i netværket udtrykker at en gennemsøgning i netværket vil have større sandsynlighed for at ende på en side hvor vægten er større end på en side hvor vægten er lille.

Google har benyttet princippet til at opstille deres PageRank

Hvor er antallet af links ud fra side og d er valgt til 0.85.

Min mulige ændring af beregning af autoriteter

Når vi betragter modeller hvor “autoritet” tages som et udtryk for at en læser vil have høj sandsynlighed for at opleve en henvisning fra side A til side B som autoritet, så vil et brugerskabt links fra A til B have mulighed for at vende situationen om. Et kendt eksempel er ved brugen af blogs, hvor en hyppig bruger af mange blogs vil opnå mange indgående links (Man kunne kalde det en ‘invers hub’). Brugen af henvisninger i brugerskabt indhold går nu fra at være en måde at udtrykke mening om relevans inden for et emne til at udtrykke interesse for et emne.

Det er så her at jeg tænker på om man kan finde de typiske steder hvor brugeren af blogs skriver på og foretage tilpasninger af link-beregningen der. Lad os antage at vi kunne finde en passende måde at beregne om der er tale om lille koncentreret klynge af websteder der henviser til hinanden . Efter at have opnået listen af sider kunne vi ændre på den vægt der tilføjes pr iteration ved betragtninger over linkafstanden til klyngecenteret. Altså at hvis vi betrager et websted , der er inde i den lille klynge, så har et link ikke så stor betydning som hvis det optrådte udenfor.

Stackoverflow!

Normalt forbinder jeg stackoverflow med noget negativt – men her for nyligt , så har jeg fundet gode svar på en del spørgsmål på http://stackoverflow.com

se eksempelvis:

Bemærk at der er angivet et antal votes for hvert svar. Her er det angivet hvor mange der har syntes at svaret er godt .  På den facon får du en ledetråd om hvilket svar der er mest accepteret blandt de andre der læser på webstedet.

Brug af java reflection til at generere JSON data

Jeg arbejder iøjeblikket på en opgave , hvor jeg har behov for at bringe datamodellen ud til behandling i javascript på en nem facon . Ifbm med denne opgave har jeg tænkt på hvordan man kunne gøre det vha reflection.

Hvis vi antager flg klasser :


class A{
public int B;
public int C;
public D F;
public D G;
};

class D {
public String E;
}

og at de var initialiseret således:

A a=new A();
a.B=1;
a.C=2;
a.F=new D();
a.F.E="test";
a.G=new D();
a.G.E="test2";

Så kunne man kigge på selve java objekterne vha reflection for at generere JSON output til bruge i javascript således:


public class JsonEmit{
public static String emit(Object target) throws Exception{
StringBuilder sb=new StringBuilder();
sb.append("{");
Class targetClass=target.getClass();
Field[] publicFields = targetClass.getFields();
for (int i=0;i String sFieldName = publicFields[i].getName();
Class typeClass = publicFields[i].getType();
String sFieldType = typeClass.getName();
Object value = publicFields[i].get(target);
if(value!=null){
sb.append(sFieldName+":");
if(typeClass.isPrimitive()
||sFieldType=="java.lang.String"){
sb.append("""+value.toString()+""");
}else{
sb.append(JsonEmit.emit(value));
}
}
if(i!=(publicFields.length-1))
sb.append(",");
}
sb.append("}");
return(sb.toString());
}

På den facon vil man kunne genere JSON ved et simpelt kald til

JsonEmit.emit(a)

hvorefter man vil se

{B:"1",C:"2",F:{E:"test"},G:{E:"test2"}}

ATI catalyst install manager problemer på vista med visual c++

Jeg kører nu windows vista på min stationære computer derhjemme igen . Performance på vista er blevet lidt bedre i løbet af 2008 – og det er lykkedes mig at finde veje veje uden om de fleste codec problemer jeg har oplevede i 2007.  Mit windows xp arbejdsimage kører iøjeblikket på min ubuntu-labtop og vil blive flyttet over til min stationære maskine.

Ifbm med at køre vista igen så har jeg oplevet problemer med at skulle installere ATI catalyst driverne  – her nægtede ATI catalyst install manager konsekvent at starte.

Efter at kigget lidt i ATI installer folderen bemærkede jeg flg. filer :

  • msvp80.dll
  • msvcr80.dll

Dernæst kiggede jeg på stien for ATI’s CCC :  c:\Program Files\ATI Technologies\ATI.ACE\Core.Static

Dette kunne tyde på uklarheder om hvordan lækningen til c++ runtimen er foretaget. Her indså jeg så at jeg havde “Microsoft Visual C++ 2008 express edition” og “Visual c++ 2005″ runtimen installeret og tilgængelig vha kommandolinjen. Da jeg ikke har brug for en microsoft specifik kompiler længere ( der er andre c++ kompilere til rådighed , eks.  g++ vha http://www.mingw.org/ ) så valgte jeg at deinstallere Visual C++ 2008 og visual c++ 2005 runtimen på vista. Et mindre drastisk valg kunne selfølgeligt være at sørge for at der ikke er overlap mellem de forskellige dll’er  – men det mener jeg nu er ATI’s problem. Mit valg virker for mig iøjeblikket da jeg ikke har brug for Visual c++  lige nu.

Hvis du kender til en bedre løsning , så skriv evt en kommentar her. Jeg kan forestille mig at der kan være lignende issues med lænkning, hvis visual c++ runtimen er tilgængelig fra andre programmer end Visual Studio, men jeg har ikke lige gennemsøgt ATI’s forum for fejlbeskrivelser .

Efter at have fået mit ATI Radeon 2400 xt kort til at køre grafikken pænt over mine 2 skærme, så gik jeg videre til få lyden til at få  HD Audio til at fungere sammen med kortet. Først eksperimenterede jeg med at slå onboard audio fra i bios  (jeg har et integreret lydkort i bundkortet på min stationære maskine). Dette virkede ikke umiddelbart  (det ser ud som at listning af devices ikke umiddelbart blev opdateret ved genstart af vista) så jeg valgte at slå onboard audio til igen. Derefter gættede jeg og prøvede at fjerne HD audio driveren – her “opdagede” vista så at driveren var der og tilkoblede den. Så virkede min lyd igen.

Det virker iøvrigt som at det ikke længere er helt umuligt at lave fejlsøgning på Vista  og performance virker nu kun lidt ringere end på xp. Mit bud er at Microsoft har foretaget en del performanceforbedringer i Vista servicepack 1.

Opdatering 2009-01-11: Jeg har nu geninstalleret Visual C++ 2008 igen (ifbm med at kompilere tortoise-git ). Både ATI catalyst install manager og visual c++ 2008 express edition kører.  Mon det var visual c++ 2005 runtimen der skabte fejlen?