Stacktrace

Sida 2/21:123451020...21

Det är vanligt förekommande att utvecklare behöver skriva kod för att konvertera listor. Listor kan behöva filtreras eller konverteras mellan olika format. Ett vanligt förekommande mönster när en lista ska konverteras är att skapa en ny lista för resultatet, iterera över ett givet data-set, konvertera varje post och lägga det till resultat-listan. Det är inte helt ovanligt att resultatet också filtreras i denna process. Nedan är ett exempel i Java:

Collection<String> c = new ArrayList<String>();
for (Person person : persons) {
  if (person.getAge() >= 18) {
    c.add(person.getName());
  }
}

Ovanstående exempel kan tyckas både enkelt och funktionellt men jämför med hur detta kan lösas i Python:

l = [person.name for person in persons if person.age >= 18]

Alternativt genom att använda filter och lambda kan det också skrivas så här:

l = [person.name for person in filter(lambda person: person.gender >= 18, persons)]

I Java finns tyvärr inte motsvarande funktionalitet. Det finns däremot alternativ för att lösa det på ett liknande sätt. Guava är ett projekt och innehåller flera bibliotek som Google använder till sina Java-projekt. Bland annat erbjuder dessa bibliotek funktioner för att filtrera och transformera listor på ett mer ‘funktionellt’ sätt. Nedan är en lösning som löser samma problem som ovan implementerad med hjälp av dessa funktioner:

Function<Person, String> f = new Function<Person, String>() {
  @Override
  public String apply(Person input) {
    return input.getName();
  }
};

Predicate<Person> p = new Predicate<Person>() {
  @Override
  public boolean apply(Person input) {
    return input.getAge() >= 18;
  }
};

Collection<String> c = Collections2.transform(Collections2.filter(persons, p), f);

Enklare exempel som detta blir möjligtvis varken mer kompakta eller lättlästa. När konverteringar som denna däremot upprepas så blir detta alternativ genast mer attraktivt. Jämför till exempel med JDBC-mappers som inte helt sällan återanvänds. Guava är licensierat under Apache License 2.0 och innehåller flertalet användbara funktioner. Ett alternativ är också Apache Commons, värt att nämna är att Apache Commons för närvarande tyvärr inte stödjer Java generics.

Lägg till följande beroende i din Maven-pom för att testa Guava:

<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>10.0.1</version>
</dependency>

I väntan på en Java-version (Java 8?) som stödjer closures och lambda-funktioner går det också att använda lambdaj. Med lambdaj kan en lista till exempel konverteras och filtreras på följande sätt:

import static ch.lambdaj.Lambda.*;
import static org.hamcrest.Matchers.*;
...
Collection<String> c = collect(filter(having(on(Person.class).getAge(), greaterThanOrEqualTo(18)), persons), on(Person.class).getName());

Lägg till följande Maven-beroende för att använda lambdaj:

<dependency>
  <groupId>com.googlecode.lambdaj</groupId>
  <artifactId>lambdaj</artifactId>
  <version>2.3.1</version>
</dependency>

JRebel är ett trevligt utvecklingsverktyg som gör det möjligt att omedelbart testa ändringar i en applikation som körs utan att starta om applikationsservern (ex Tomcat, Jetty, Glassfish, JBoss, WebSphere etc). Denna JVM-plugin stödjer omladdning av allt från JPA-entiteter, Session beans, JSP:er till resurs- och konfigurationsfiler. Förändringar i klasshierarkier stöds dock inte för tillfället. Det finns plugins till de populäraste utvecklingsmiljöerna och flertalet Java-ramverk stöds.

JRebel kostar en slant men kan spara tid och effektivisera utvecklingsarbetet, framförallt när det gäller större och tyngre applikationer som tar lång tid att bygga och/eller deploya.

Läs mer om JRebel på http://www.zeroturnaround.com/jrebel/

I dagens utvecklingsklimat med smidiga, lättlärda ramverk för att bygga rika gränssnitt med JavaScript är det lätt att underskatta vikten av en förståelse för språket som t ex populära jQuery bygger på.

JavaScript är ett kraftfullt språk, och i nuläget ett av världens mest använda, och Douglas Crockford är den guru (eller mahatma som han själv titulerar sig) som axlat ansvaret att hjälpa världens webbutvecklare att bygga snabba, snygga webbapplikationer på rätt sätt.

I hans numera klassiker, ”Javascript – The Good Parts”, belyser han det bra jämte med det mindre bra i språket Mocha, som blev LiveScript, som blev JavaScript.

Exempelvis illustrerar han fall som t ex nedan där alla returnerar true:

'' == 0
0 == '0'
'' != '0'
NaN != NaN

Men också hur man strukturerar sin kod rätt, vad i språket som bör undvikas och mycket mer.

Utöver hans bok har mannen bakom b la JSON och JSLint givit ett flertal föreläsningar som alla är sevärda. Både bok och föreläsningar rekommenderas varmt för alla webbutvecklare, oavsett språk.

Tidigare idag fick jag tips från min kollega Mikael Elm om ramverket JSefa som de använder för att skapa fixed length records vid kommunikation med ett legacy-system.

JSefa är ett litet och smidigt ramverk för strömmande serialisering av javaobjekt till XML, CSV och FLR.

Nedanstående exempel visar FLR-användningen av JSefa

Objektet som ska serialiseras

@FlrDataType()
public class Person {
    @FlrField(pos = 1, length = 30)
    private String name;

    @FlrField(pos = 2, length = 10, format = "dd.MM.yyyy", align = Align.RIGHT)
    private Date birthDate;
}

Serialisering

Serializer serializer = FlrIOFactory.createFactory(Person.class).createSerializer();
StringWriter writer = new StringWriter();
serializer.open(writer);

// call serializer.write for every object to serialize...

serializer.close(true);

Resultatet blir då:

Erwin Schmidt                 23.05.1964
Thomas Stumm                  12.03.1979

Deserialisering

Deserializer deserializer = FlrIOFactory.createFactory(Person.class).createDeserializer();
StringReader reader = new StringReader(writer.toString());
deserializer.open(reader);
while (deserializer.hasNext()) {
    Person p = deserializer.next();
    // do something useful with it...
}
deserializer.close(true);

För att serialisera XML eller CSV används liknande konstruktioner med annotationer och Serializers/Deserializers.

Eclipse plockar per default det inloggade namnet och sätter i @author-taggen i all javadoc som man skriver. Jag personligen vill oftast att mitt riktiga namn skrivs där istället. Ett sätt att få till det är att man editerar code templates, Inställningar -> Java -> Code Style -> Code Templates. Detta känns ju inte helt optimalt så istället brukar jag editera eclipse.ini filen och lägga till följande fetmarkerade variabel:

-Xms256m

-Xmx1024m

-Duser.name=Anders Hedström

och vips så plockar Eclipse upp det värdet när jag skapar ny javadoc

Du har just klickat dig in på den första delen i min samling artiklar om Python – detta dynamiska högnivåspråk som både jag, många andra utvecklare samt organisationer som Google och YouTube tycker är grymt att utveckla i. I de kommande artiklarna tar jag upp bakomliggande filosofier, egenskaper hos språket, hantering av datatyper och allmänna tips och tricks som kan vara till hjälp för dig som är ny i språket. Läs mer >>

Jag har tidigare skrivit om hur man kan använda yUML för att generera diagram online.

Det finns så klart även en hel del offline-verktyg för detta och ett enkelt, snabbt och väldokumenterat verktyg är Graphviz. För att generera samma information som i yUML-exemplet så kan följande Dot-kod användas:

digraph G {
  Konsult1 -> Delicious1 -> Rss1 -> Twitterfeed;
  Konsult2 -> Delicious2 -> Rss2 -> Twitterfeed;
  Konsult3 -> Delicious3 -> Rss3 -> Twitterfeed;

  Twitterfeed -> Twitter;

  /* Node names can not contains dots, hence the labels */
  paper [label="paper.li"];
  cygni [label="cygni.se"];

  Twitter -> paper;
  Twitter -> cygni;
}

Genom att exekvera nedanstående kommande så kommer filen diagram.png att genereras (Graphviz måste först installeras och ovanstående Dot-kod måste finnas i filen diagram.dot):

dot -Tpng diagram.dot -o diagram.png

Resultatet blir så här:

Dot-diagram

Dokumentationen är superb och visar bland annat på olika layout-alternativ och hur pilar, boxar, texter mm kan stajlas.

Rekommenderas!

Den här artikeln handlar om hur man på lite olika sätt kan bli en bättre programmerare. Artikelförfattaren ger tio olika mer eller mindre enkla tips på vad man kan göra, från att lära sig ett nytt programmeringsspråk till att lösa programmeringspussel. Inget revolutionerande kanske, men ändå en trevlig liten artikel med en del bra saker att tänka på.

Artikeln finns att läsa här.

Jag hittade ett skönt verktyg för att generera UML-diagram online. Det heter yUML och kan generera klass-, aktivitets- och användningsfallsdiagram genom enkel pseudokod.

Vi har nyligen lagt upp ett nytt informationsflöde på cygni.se som kallas Läst på Cygni. Det innehåller länkar till olika artiklar som konsulterna på Cygni läst den senaste tiden och baseras på en feed från twitter.com/cygniab (detaljer om hur flödet är uppbyggt finns på Cygnibloggen). Nedanstående yUML-pseudokod beskriver flödet:

[Konsult3]->[Delicious for K3]
[Konsult2]->[Delicious for K2]
[Konsult1]->[Delicious for K1]
[Delicious for K3]->[RSS 3]
[Delicious for K2]->[RSS 2]
[Delicious for K1]->[RSS 1]
[RSS 3]->[Twitterfeed]
[RSS 2]->[Twitterfeed]
[RSS 1]->[Twitterfeed]
[Twitterfeed]->[Twitter]
[Twitter]->[cygni.se]
[Twitter]->[paper.li]

Resultatet blir enligt nedan – snyggt och enkelt…

Infoflöde för Twitterintegration
Sida 2/21:123451020...21