Mar 09

Dass meine Beiträge für die Kategorie weekly links eine Zeit lang pausiert haben, lag auch daran, dass mich das Kopieren der Links ziemlich genervt hat.

Was macht man also als Programmierer, wenn der Leidensdruck hoch genug ist – man liest eine API (in diesem Fall die von delicious.com), nimmt die Programmiersprache seiner Wahl (bei mir Groovy) und schafft Abhilfe.

Der Urvater der online Lesezeichenverwalter delicious.com stellt eine REST basierte API bereit. Groovy bietet mit dem Modul HTTPBuilder ein mächtiges Tool, dass einem die Arbeit mit HTTP basierten Resourcen extrem erleichtert.

Nach einer erfolgreichen Authentifizierung und einer gültigen Anfrage erhält man eine XML Antwort, die so aussehen könnte:

1
2
3
4
5
6
7
8
9
10
<posts tag="" user="user">
  <post href="http://www.weather.com/" description="weather.com"
  hash="6cfedbe75f413c56b6ce79e6fa102aba" tag="weather reference"
  time="2005-11-29T20:30:47Z" />
    ...
  <post href="http://www.nytimes.com/"
  description="The New York Times - Breaking News, World News & Multimedia"
  extended="requires login" hash="ca1e6357399774951eed4628d69eb84b"
  tag="news media" time="2005-11-29T20:30:05Z" />
</posts>

Testen kann man erst einmal auf der Kommandozeile mittels curl:

> curl https://user:passwd@api.del.icio.us/v1/posts/recent

Bestimmte URL’s wie z.B. posts/all sollte man nicht zu oft aufrufen, da sie limitiert sind. Macht man es doch (wie ich) erhält man den Fehler 999. Besser ist es da nur die letzten Einträge (per Default 15) über posts/recent anzufragen. Das ganze Programm sah dann bei mir so aus:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import groovyx.net.http.* 
import groovy.util.slurpersupport.GPathResult 
 
class DeliciousBookmarkClient {
 
   static main(args) {
      def dc=new DeliciousBookmarkClient()
      dc.request()
   }
 
   public request () {
      try {
         // Authentifizierung
         def rc = new RESTClient( 'https://username:password@api.del.icio.us/v1/posts/recent' )
         rc.auth.basic "username", "password"
 
         // anfragen und überprüfen der Antwort   
         def resp=rc.get("count":"5")
         assert resp.status == 200
         assert ( resp.data instanceof GPathResult )
 
         def recentPosts=resp.data.post
         println "Anzahl posts "+recentPosts.size()
 
         // HTML Aufbereitung des Links und der Beschreibung
         println "<dl>"
         recentPosts.each{post->
            def desc=post.@description.text()
            def href=post.@href.text()
            println "   <dt><a href=\"$href\">$desc</a></dt>"
            println "      <dd>$desc</dd>"
         }
         println "</dl>"
      } catch (e) {
         println e.response.status
         println e.message
      }
   }   
}

Über die API lassen sich natürlich auch Lesezeichen hinzufügen und löschen. Das gilt auch für Tags und Tag Bundles. Damit bleiben keine Wünsche offen.

Ähnliche Artikel:

geschrieben von gklinkmann \\ tags: , ,

Feb 11

Eclipse ist für mich als Entwickler mein täglich Brot und begleitet mich schon seit Jahren. Das Logo hat sich während dieser Zeit kaum geändert (wieso auch – mir hat es gefallen).

Nun möchte Eclipse mit einem neuen Logo darauf aufmerksam machen, dass im Projekt kein Stillstand herrscht.
Gefragt sind Entwürfe, die im Rahmen eines Wettbewerbs zum neuen Logo führen sollen. Auf den Sieger wartet ein Preisgeld von 500 Dollar.

Die bereits eingereichten Vorschläge kann man sich hier anschauen.

Für welchen würdet Ihr Euch entscheiden?

Ähnliche Artikel:

geschrieben von gklinkmann \\ tags: , ,

Nov 29

grailspodcast logo

Eine der wichtigsten Resourcen, wenn man sich mit Groovy und Grails beschäftigt, ist aus meiner Sicht der Grails Podcast von und mit Sven Haiges und Glen Smith.

Der Podcast, der alle 2 Wochen in englischer Sprache erscheint, hat nun die Folge 100 erreicht.
Alles Gute von meiner Seite zu diesem Ereignis und vielen Dank für die zahlreichen Informationen und News der letzten Jahre rund um die Themen Groovy und Grails.

Macht weiter so.

Ähnliche Artikel:

geschrieben von gklinkmann \\ tags: , , , ,

Nov 23
Groovy Logo

Aus meiner Sicht ist Groovy, die dynamische Sprache für die Java Virtual Machine, auf der großen Hype Kurve am Punkt der technischen Realität angekommen. Mit Scala und Clojure werden statt dessen gerade 2 neue Programmiersprachen durch die Gemeinde der Java Jünger getrieben.

So ist es an der Zeit einmal zu hinterfragen, was man selbst bis jetzt mit Groovy implementiert hat, ob man dabei bleibt oder doch auf den Scala Zug aufspringt.

Dierk König, der Autor von “Groovy in Action” (dem besten Fachbuch, das ich in letzter Zeit gelesen habe), hat einmal folgende 7 Anwendungsmuster für Groovy herausgearbeitet:

Super Glue, Liquid Heart, Keyhole Surgery, Smart Configuration, Unlimited Openness, House-Elf Scripts, Prototype

Oder nicht ganz so prosaisch, als:

  • Bindeglied zwischen Java Komponenten (wie z.B. Spring und Hibernate in Grails)
  • Auslagerung der Buisiness Logik, um sie dynamisch auf Veränderungen anpassen zu können
  • Eingriffsmöglichkeit in laufende Applikationen
  • Erweiterung der Konfiguration mit den Mitteln einer Programmiersprache (um endlich das plumpe XML loszuwerden)
  • die leichte Veränderung von Code zur Laufzeit
  • Hilfe für alle Aufgaben, die durch die Programmierung anfallen (Build automation, continuous integration, deployment, installer, service monitoring, reports, statistics, automated documentation, functional tests, HTML scraping, Web remote control, XML-RPC, WebServices)
  • Tool zur schnellen Erstellung von Prototypen, mit der Möglichkeit diese später auf Java portieren zu können.

Doch zurück zum Ausgangspunkt. Was mache ich mit Groovy?

Zuerst einmal schreibe ich 95 % aller neuen Tests in Groovy. Die knackige Syntax, die perfekte Interoperabilität mit Java und die gute (aber verbesserungsfähige) Integration in Eclipse machen die Erstellung von Tests sehr viel weniger lästig. Zudem gibt es kleinere Web- und Webservices Applikationen auf Basis von Grails (dem Webframwork, das seinerseits ebenfalls auf Groovy basiert), sowie Tools, die rein in Groovy geschrieben sind.

Letztendlich kann man sagen, der Hype ist dem Alltag gewichen und Groovy passt sich perfekt in die tägliche Arbeit ein. Mit Griffon und GPars stehen 2 weitere Frameworks für Swing Applikationen und Nebenläufige Programmierung (Threads) auf Groovy Basis zur Verfügung. Und eine lebendige Community hat sich um diese dynamische Sprache gebildet. Ein Umstieg auf Scala oder Closure kommt somit für mich momentan nicht in Betracht.

Und mal ganz ehlich, wenn die Kinder fragen: “Papa was machst Du?”, klingt “ich programmiere Groovy” viel cooler als “Ich programmiere Scala”. :-)

Links:
Groovy Usage Patterns by Dierk König

Ähnliche Artikel:

geschrieben von gklinkmann \\ tags: , , , , , , , ,

Oct 01
spring-icon

Seit vorgestern steht der erste Release Candidate vom Spring Framework zum Download bereit.
In dieser Version werden erstmalig der JSR-303 (Bean Validation) und JSR-330 (Dependency Injection in Java) unterstützt. Besonders auf die Umsetzung der Bean Validation war ich gespannt, denn dadurch kann man über Annotations seine Beans mit Constraints versehen.

In einer Spring basierten Web Anwendung könnte man die Bean Validation wie folgt nutzen.

1. annotieren der Bean

1
2
3
4
5
6
7
public class Event {
   int id;
 
   @NotNull
   @Size(min=1,max=50)
   String description;
...

Durch die zwei Annotations (in validation-api-1.0.CR3.jar enthalten) wird festgelegt, dass der Wert für das Attribut description nicht null sein darf und minimum 1 Zeichen aber maximal 50 Zeichen enthalten muss.

2. validieren der Bean innerhalb des Controllers

Zur Validierung benötigt man eine Implementierung des JSR-303, wie z.B. den Hibernate Validator (momentan in Version 4.0.0 CR1). Der hat allerdings eine Menge Abhängigkeiten und muss erst über Maven kompiliert werden.
Hat man diese Hürde genommen (und hat die daraus resultierende Jar Datei in sein Projekt eingebunden), benötigt man noch folgende Bibliotheken um keine Runtime Fehler zu produzieren:

  • validation-api-1.0.CR3.jar
  • slf4j-api-1.5.6.jar
  • slf4j-log4j12-1.5.6.jar
  • log4j-1.2.14.jar
  • commons-logging-1.0.4.jar (benötigt man nicht unbedingt, wurde aber im Beispiel verwendet)

diese liegen dann aber sowieso im lokalen Maven Repository vor.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@RequestMapping(value="/event/save", method=RequestMethod.POST)
public String save(Event event,BindingResult bindingResult, Model model) {
   LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
   validator.setProviderClass(HibernateValidationProvider.class);
   validator.afterPropertiesSet();
 
   validator.validate(event,bindingResult);
 
   if (!bindingResult.hasErrors()) {
      // save ...
      model.addAttribute("message", "update successfully");         
   } else {
      for (FieldError e : bindingResult.getFieldErrors()) {
         log.warn(e.getField()+": "+e.getDefaultMessage());            
      }
      model.addAttribute("errors", bindingResult.getFieldErrors());
   }
   model.addAttribute("event", event);
 
   return "update";
}

In den Zeilen 3-5 Wird eine Instanz des Hibernate Validators erzeugt. In Zeile 7 wird dann endlich validiert. Ob bei der Validierung Fehler aufgetreten sind kann man mit der Methode hasErrors() überprüfen (Zeile 9). Zugriff auf alle Fehler (z.B. zum Loggen) erhält man über die Methode getFieldErrors() (Zeile 13-15).
In Zeile 16 werden die Fehler der View übergeben.

3. Ausgabe der Fehler in der View

Zur Ausgabe der Fehler wird die JSP Standard Tag Library verwendet.

1
2
3
4
5
6
7
8
<p>${message}</p>
<c:if test="${!empty errors}">
   <ul>
   <c:forEach var="error" items="${errors}">
      <li>${error.field}: ${error.defaultMessage}</li>         
   </c:forEach>
   </ul>
</c:if>
Ähnliche Artikel:

geschrieben von gklinkmann \\ tags: , ,