07
Feb
09

javaFX

Jag fick för mig att förstå hypen bakom javaFX. Jag har sen innan förstått att det är en bra ide, samma GUI för mobilen, webben och standalone.
Jag bestämde mig för att prova göra något litet och simpelt. En irc klient helt enkelt.

Det jag konstaterat är att netbeans stöd för javaFX fortfarande har en del att önska. Men det kommer säkert till nästa version. En fx version av deras guibuilder vore inte fel tex…

Efter en timme eller två har jag nu fått ihop en någorlunda fungerande klient. Mina tankar så långt:

  • av någon anledning fick jag inte do{} att fungera. Inte ens när jag kopierade hela exempel. Det ville helt enkelt inte köras. Mycket märkligt?
  • Jag förstår att syntaxen är till mer för designfolk än inbitna javanördar som jag. Men än så länge tycker jag nog bara den är hemsk rakt igenom.
  • Väldigt lätt att få till ”häftiga” effekter. Bra om det används rätt. Kan bli ytterst iriterande om det används fel.
  • När min klient var klar och jag la upp den för att visa mina vänner så funkade varken webstart eller html versionen att ladda. kan ha varit någon port som inte är öppen eller så. Men det känns ändå inte rätt.
  • Av någon anledning fick inte html versionen ansluta till irc servern. Antar att det är en säkerhetsgrej, men det gör den inte mindre iriterande…

Även om det är lite tidigt för mig att ge javaFX ett slutbetyg så lutar det väldigt starkt mot underkännt. Visst det är jättesnyggt osv. Men det är Flash också, visst det är jättebra att samma GUI funkar överallt. Men hur ofta vill man ha samma GUI på mobilens 2″ skärm som på datorns 24″? Neh, det blir svårt att konkurera med flash. För det är väll ändå det som är planen?

03
Feb
09

Kasta exceptions!

Tänk på att kasta exceptions!
Det betyder inte att programmet är trasigt och kommer resultera i en katastrof att ett exception kastas. Det innebär att något inte blev som väntat. Det kan tex vara när något hämtas i en databas:
Skapa ett eget exception (kan även vara en ide att låta dina exceptions ärva varandra om det passar sig, SQLException är en bra förebild där)


Public class NoSuchUserException extends Exception{

Public NoSuchUserException(String msg){

Super(msg);

}

}

Sen när användaren hämtas I database:

Public User getUser(int id) throws NoSuchUserException{

Connection con = getConnection();
PreparedStatement p = con.prepareStatement("Select * from Users where id=?”);
p.setInt(1, id);
ResultSet res = p.executeQuery();
if (res.next())
{

return new User(res.getInt("id"), res.getString("userName"), res.getString("password"));

}

else

{


Throw new NoSuchUserException(”No user with id:”+id);

}

}

Alternativet som jag tycker man ser allt för ofta är att iställer returnera null om användaren inte hittas. Det gör att man måste hålla koll på om det är null, vilket man inte tvingas till utan kan glömma och få runtimeExceptions. Null kan även skickas runt lite hursom och även om man garderar sig i den närmaste omgivningen kanske det blir fel några anrop längre bort i kedjan. Att ta hand om exceptions med tydliga namn ger dessutom mycket mer lättförstådd kod.

För att sedan bygga vidare och jUnitTesta så kan följande kod vara ett exempel på ett test för att se att exceptionet kastas som det ska:

@Test
Public void testGetInvalidUser throws Exception

{

try{

User user = getUser(-1)
fail(“borde kastat exception”);

}

catch(NoSuchUserException ex)

{

assertEquals(ex.getMessage, ”No user with id:-1”);

}

}

30
Jan
09

for får inte får, men for får lokala variabler!

Följande kod är inte direkt ovanlig:

Iterator iter = list.iterator();
while(iter.hasNext()){
String s = iter.next();
}
// lite annan kod
Iterator iter2 = list2.iterator();
while(iter.hasNext()){
String s = iter2.next();
}

Fullt fungerande kod, med problemet att den andra loopen inte kommer köras eftersom iter.hasNext returnerar false (den kördes i första loopen).
Det jag vill påpeka här (ok, egentligen kanske det är boken effective java som vill påpeka det, lite inspiration får man ha…) är att while loopar är farliga, och bör så ofta de kan skrivas om till for loopar.
Varför? jo forLoopar skapar variabler i sin deklaration som bara finns inuti loopen. Medan whileloopen inte gör det. så motsvarande kod som forLoop:

for(Iterator iter = list.iterator();iter.hasNext();){
String s = iter.next();
}

Ingen risk för att jag råkar ta fel iterator 5 rader längre ner när jag behöver en iterator till.
Just i det här fallet kanske

for(String s : list){
}

är effektivast, Men Iterators tex är inte direkt ovanliga, nästa gång ni träffas så prova en for!

30
Jan
09

gwt

jag gissar att det finns fler än jag som alldrig gillat jsp? Utan vill kunna skriva hemsidor i vanlig java. Det är faktiskt möjligt. Google har närmligen utvecklat en java till javascript compiler (ja det låter fel att kalla det compiler när det inte blir binärkod men om google envisas…)

Det hela påminner väldigt mycket om swing, fast med lite mindre finesser och något enklare kod.

en liten knapp som byter text när man klickar blir tex:

private Button button = new Button("klicka på mig");
button.addClickListener(new Clicklistener(){
onClick(Widget sender){
button.setText("du klickade");
}
}

Lätt som en plätt!

Det finns olika layouter för att få ihop sin design som man vill. Allt går att styleas precis som man vill med hjälp av CSS (eller ännu bättre, låta en designer göra det).

Möjligheten att utveckla små widgets som man sedan kan använda på sina hemsidor (eller låta andra använda) är också mycket trevlig. Det gör arbetet ofta mycket lättare, exempel på extra funktionalitet som finns tack vare extra biblotek är tex fler layouter, drag and drop, kalendrar och massa annat trevligt.

Dessutom finns det GWTTestcase så all din hemsidekod kan jUnitTestas. Det är inte fy skam!

28
Jan
09

Gör inget i onödan!

Det är inte ovanligt att jag ser kod som är tänkt att göra saker, eller som har halvklara saker som inte används.

Låt bli det! Jag ser ingen anledning till att skriva något som troligen kommer användas i framtiden, eller att anpassa koden man nu skriver efter vilken funktionalitet som troligen kommer att implementeras senare.

Kod ska göra exakt det som krävs av den just nu. Varken mer eller mindre.

Det enda jag tycker ska vara där för framtiden är att den ska vara enkel att ändra (refactor). Så man i framtiden kan få in det som behövs för den nya funktionaliteten utan några större problem.

26
Jan
09

continus integration med hudson

Sätt upp en CI server med hudson.

Continus Integration underlättar otroligt vid utveckling. Det borde vara det första prioritet när ett nytt projekt skapas. Det behöver inte heller vara svårt att få igång allt. Här kommer några enkla steg för att komma igång:

Allt ska ligga i svn (eller motsvarande versionshanteringssystem som används), Jag brukar samla alla tredjepartsbiblotek och liknande i samma katalog i trunken. Det blir mindre rörigt så. Se sedan till att alla projekt har relativa sökvägar till bibloteken. Jag använder netbeans och brukar försöka se till att projekten bara har jar filer och projekt som beroenden. Med andra ord undviker jag ”Libraries”, även om det ser lite snyggare ut i listan över beroenden så känns det otydligare och det är bra mycket lättare att bara lägga till en jar och få relativ sökväg.

När detta steg är klart ska du på en helt ny dator kunna checka ut trunken, öppna ett projekt i netbeans (eller vad du nu använder) och trycka på kör och programmet ska hoppa igång utan problem.

Ett problem som kan återstå är om ditt program beror på en databas. Det upplever jag personligen som klurigare att få att fungera bra med CI. Det går dock men än så länge får det duga med att ha en databas som CI-servern kommer åt.

Nästa steg är att installera tomcat/glassfish, det låter jag er klara själva då det inte är direkt svårt och det finns tonvis att läsa om det på Internet redan. Se även till att sätta igång autodeploy.

Nu är det bara att ladda hem hudson (https://hudson.dev.java.net/) och lägga i din servers autodeploy katalog. När du gjort det kan du gå till webbgränssnittet (http://dinserver/hudson).

I hudson skapar du ett nytt freeform projekt. Anger hur ofta du vill att svn ska pollas efter förändringar, vilken adress din server har och login till den. Du kan ange flera ant-targets som ska köras, ett exempel kan vara ”clean test dist” som rensar allt, kör alla test och tillslut bygger en dist som du kan låta hudson deploya.

Sist men inte minst vill du såklart att dina projekt ska bli åtkomliga, för webprojekt är det bara att lägga till ett shellcommand som kopierar den färdiga dist-filen till din autodeploykatalog. Ligger appservern på en annan dator än Hudson så finns det tex scp plugins som kan kopiera filerna via scp.

För andra projekt beror det lite på vad du vill, jag har några vanliga jar:ar jag vill ska startas om efter att nya har blivit färdiga. Då kopierar jag helt enkelt över de gamla jar:arna och kör ett startscript jag skrivit.

26
Jan
09

ännu en blogg i mängden

Ännu en blogg ser dagens ljus. Mitt mål är nog mest att formulera mina tankar för min egen skull och samla mina tankar. Om någon får nytta av det så är det mest en bonus. Tyckte dessutom det finns lite dåligt med java bloggar på svenska. Så en till kan knappast skada!