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