Groovyではてブカウンター風はてなスターカウンターを作成する   1)調査・準備編

はてなブックマークのカウンターのはてなモジュールはある。

でも、はてなスターカウンターのはてなモジュールはない。なんでだろうか?
作りたいのは、以下のようなはてなスター版のカウンター。


これを作ろうと思ったきっかけは、Hatena::Star::Counterが「0」しか表示してくれなかったからなのだが、
今は正常に動作してる。
はてなスターの仕様変更の影響を受けてのか、一時的に停止していただけだったのかな。。。


面白そうだから、作ってみよう。
はてなスターカウンターを目指して。



Java2Dってどんなものか?

Javaでイメージ・図形描画、画像処理と言ったらJava2Dだろうか。
でも、聞いたことある程度で、使ったことはない。
第18章 クラス Graphicsアプレットで試せるので、実験〜。

setColor (new Color(255,149,43));
fill3DRect(0,0,80,15,true);
fill3DRect(15,0,2,15,false);

Java2Dだと、この3つでやりたいことの下地となる長方形は書けるようだ。
ソースを見るとそんなに難しくはなさそうだ。



Groovyでもっと楽にできないか?

せっかくGroovyで作るんだからもっと、簡単にできないものだろうか。
Groovy Japanese Homeを見るとGraphicsBuilderってのがあるようだ。

  • GraphicsBuilder - GraphicsBuilder is a Groovy builder for Java 2D


これを試してみるか



GraphicsBuilderってなんぞや

http://groovy.codehaus.org/GraphicsBuilder


GraphicsBuilderでググるとGraphicsRendererを使ってるページがヒットする。
画像処理についてあれこれ


GraphicsRendererはGraphicsBuilderパッケージの中のクラスなのか?
もしくは、GraphicsBuilderとは別のパッケージなのか?

先程のサイトでは、groovy.swing.j2d.* をインポートしてるから、おそらくは同じパッケージだろう。

groovy.swing.j2d.GraphicsRenderer
groovy.swing.j2d.GraphicsBuilder

とりあえずダウンロードして解凍

bin
      graphicsPad
      graphicsPad.bat
      svg2groovy
      svg2groovy.bat

lib
      batik-anim-1.7.jar
      batik-awt-util-1.7.jar
      batik-bridge-1.7.jar
      batik-codec-1.7.jar
      batik-css-1.7.jar
      batik-dom-1.7.jar
      batik-ext-1.7.jar
      batik-extension-1.7.jar
      batik-gui-util-1.7.jar
      batik-gvt-1.7.jar
      batik-parser-1.7.jar
      batik-script-1.7.jar
      batik-svg-dom-1.7.jar
      batik-svggen-1.7.jar
      batik-swing-1.7.jar
      batik-transcoder-1.7.jar
      batik-util-1.7.jar
      batik-xml-1.7.jar
      Filters.jar
      graphicsbuilder-0.6.1.jar
      graphicsbuilder-ext-animation-0.6.1.jar
      graphicsbuilder-ext-jdk6-0.6.1.jar
      graphicsbuilder-ext-jhlabs-0.6.1.jar
      graphicsbuilder-ext-substance-0.6.1.jar
      graphicsbuilder-ext-svg-0.6.1.jar
      graphicsbuilder-ext-swf-0.6.1.jar
      graphicsbuilder-ext-swingx-0.6.1.jar
      jsilhouette-geom-0.2.jar
      MultipleGradientPaint.jar
      substance-5.0.jar
      substance-extras-5.0.jar
      swingx-0.9.2.jar
      timingframework-1.0.jar
      transformSWF-2.3.jar
      xml-apis-ext-1.3.04.jar


あれ? javadocがない・・・。



javapでGraphicsRendererが一応あることを確認

[D:\MyDoc\Soft\graphicsbuilder\graphicsbuilder\lib]javap -classpath graphicsbuilder-0.6.1.jar groovy.swing.j2d.GraphicsRenderer
Compiled from "GraphicsRenderer.groovy"
public final class groovy.swing.j2d.GraphicsRenderer extends java.lang.Object implements groovy.lang.GroovyObject{
    transient groovy.lang.MetaClass metaClass;
    public static java.lang.Long __timeStamp;
    public static java.lang.Long __timeStamp__239_neverHappen1223610614328;
    static java.lang.Class class$java$awt$Rectangle;
    static java.lang.Class class$groovy$lang$GroovyObject;
    static java.lang.Class class$org$codehaus$groovy$runtime$ScriptBytecodeAdapter;
    static java.lang.Class class$0;
    static java.lang.Class class$groovy$lang$MetaClass;
    static java.lang.Class class$java$awt$RenderingHints;
    static java.lang.Class class$java$io$File;
    static java.lang.Class class$javax$imageio$ImageIO;
    static java.lang.Class class$groovy$swing$j2d$GraphicsBuilder;
    static java.lang.Class class$groovy$swing$j2d$GraphicsBuilderHelper;
    static java.lang.Class class$java$awt$image$BufferedImage;
    static java.lang.Class class$java$lang$Integer;
    static java.lang.Class class$groovy$swing$j2d$GraphicsContext;
    public groovy.swing.j2d.GraphicsRenderer();
    public groovy.swing.j2d.GraphicsBuilder getGraphicsBuilder();
    public java.awt.image.BufferedImage render(int, int, groovy.lang.Closure);
    public java.awt.image.BufferedImage render(int, int, groovy.swing.j2d.GraphicsOperation);
    public java.awt.image.BufferedImage render(java.awt.Rectangle, groovy.lang.Closure);
    public java.awt.image.BufferedImage render(java.awt.Rectangle, groovy.swing.j2d.GraphicsOperation);
    public java.awt.image.BufferedImage render(java.awt.image.BufferedImage, groovy.lang.Closure);
    public java.awt.image.BufferedImage render(java.awt.image.BufferedImage, groovy.swing.j2d.GraphicsOperation);
    public java.awt.image.BufferedImage render(java.awt.image.BufferedImage, java.awt.Rectangle, groovy.lang.Closure);
    public java.awt.image.BufferedImage render(java.awt.image.BufferedImage, java.awt.Rectangle, groovy.swing.j2d.GraphicsOperation);
    public java.io.File renderToFile(java.lang.String, int, int, groovy.lang.Closure);
    public java.io.File renderToFile(java.lang.String, int, int, groovy.swing.j2d.GraphicsOperation);
    public java.io.File renderToFile(java.lang.String, java.awt.Rectangle, groovy.lang.Closure);
    public java.io.File renderToFile(java.lang.String, java.awt.Rectangle, groovy.swing.j2d.GraphicsOperation);
    public java.io.File renderToFile(java.lang.String, java.awt.image.BufferedImage, groovy.lang.Closure);
    public java.io.File renderToFile(java.lang.String, java.awt.image.BufferedImage, groovy.swing.j2d.GraphicsOperation);
    public java.io.File renderToFile(java.lang.String, java.awt.image.BufferedImage, java.awt.Rectangle, groovy.lang.Closure);
    public java.io.File renderToFile(java.lang.String, java.awt.image.BufferedImage, java.awt.Rectangle, groovy.swing.j2d.GraphicsOperation);
    public groovy.lang.MetaClass getMetaClass();
    public java.lang.Object invokeMethod(java.lang.String, java.lang.Object);
    public java.lang.Object getProperty(java.lang.String);
    public void setProperty(java.lang.String, java.lang.Object);
    static {};
    public java.awt.RenderingHints getRenderingHints();
    public void setRenderingHints(java.awt.RenderingHints);
    public void setMetaClass(groovy.lang.MetaClass);
    void super$1$wait();
    java.lang.String super$1$toString();
    void super$1$wait(long);
    void super$1$wait(long, int);
    void super$1$notify();
    void super$1$notifyAll();
    java.lang.Class super$1$getClass();
    boolean super$1$equals(java.lang.Object);
    java.lang.Object super$1$clone();
    int super$1$hashCode();
    void super$1$finalize();
    static java.lang.Class class$(java.lang.String);
}

インストール

Drop all jar files into $GROOVY_HOME/lib
Drop the scripts into $GROOVY_HOME/bin

関連するjarが多いのと、Groovyだけで使うライブラリだと思うので、
通常のJavaライブラリ用のディレクトリではなく、指示通り$GROOVY_HOMEの下にいれた。



試しに円を書いてみる

丸です。○。\じゃないです。円高は関係ないです。

ソース
import groovy.swing.j2d.*

gr = new GraphicsRenderer()
gr.renderToFile("circle.png", 160, 160){
antialias("on")
circle( cx: 80, cy: 80, radius: 40, 
    borderColor: 'red', 
    borderWidth:2, 
    fill: 'orange' )
}
実行結果
groovy:000> load GraphicCircle.groovy
===> [import groovy.swing.j2d.*]
===> groovy.swing.j2d.GraphicsRenderer@11bfcbe
===> circle.png
作成された画像


おおぉ、簡単なじゃないか