Google Chart Toolsで遊んでみた。

表題の通りです。

google様が公開している、グラフ作成APIであるGoogle Chart Toolsで折れ線グラフを書いてみました。

とりあえず、何かグラフ化に適したデータはないかと探しつつ・・・

というか、ごめんなさい。グラフ化したいデータがあったのでグラフ化する方法を探していたら、これに行き当たったのです(※1)。

というわけで、やってみた結果がこれ↓

NBA Eastern Conference 2009-2010 until 2010/03/09
NBA Eastern Conference 2009-2010

今(2009-2010)シーズンの、アメリカプロバスケットリーグNBA東地区の、順位変動グラフです。

知っている方は知っていると思いますが、元ネタは、”元祖 勢いとゲーム差がわかるプロ野球順位変動グラフ“さん。このコンセプトがとても好きで、以前よりよく閲覧させていただいていたのですが、これをNBAでやってみたらどうだろうと思って、やってみたのが今回のグラフです。

最初なので色々試行錯誤はあったのですが(細切れ時間を使って作ったとはいえ、ここまでに3日掛かりました)、その中で最も苦労したのはURIの文字列長制限。このURI、2Kまでという制限があるのですが(2Kというのが2000なのか2048なのかは未確認)、NBAの東西各地区には15チームあり、それぞれ82ゲームを行うため、データ数としては15×82で1230個となります。2Kの制限を考慮すると1データにつき1バイト使ったとしても1230バイト。それにLabelやLegend分として数百バイトは使用しますから、このあたりをどうにかする必要があります。

ちなみにデータフォーマットは下記の4通り。
参考:http://code.google.com/intl/ja/apis/chart/docs/data_formats.html

Basic Text Format

単純にデータを”chd=t:val,val,val|val,val,val…”としていする形式。単純だけど、データは0から100までの間でしか指定できない。

Text Format with Custom Scaling

Basic Text Formatの形式に、各データ範囲を”chds=,,…,,“として指定する形式。汎用性は高いが、文字列長が最も長くなってしまう。

Simple Encoding Format

A-Z,a-z,0-9を0から61に変換。62種類しか指定できないが、1データ=1バイトと文字列長としては最も短くできる。

Extended Encoding Format

A-Z,a-z,0-9,.-の64種を2文字重ねることで0から4095まで指定できる。1データ=2バイト。精度は高くなるがデータの解読性が低い。
 
 
 
このうち、まず最初に”Simple Encoding Format”を検討しましたが、ちょっと精度に難があり、次いで”Basic…”や”Text Format with Custom Scaling”を使ってみましたが、どうしても文字列長が長くなってしまい、最終的に”Extended Encoding Format”を使いました。とはいえ、1データ2バイトとなると2K制限を超えてしまうため、ここはデータ量でコントロール、82ゲーム全てではなく、2ゲーム毎、つまり半分の41ゲーム分をグラフ化することで対応としました。

結果として出来たグラフを見る限り、閲覧上の問題はないため、とりあえずはこんなところかなと思います。今後、もうちょっといじってみることにします。

 
 
ちなみに西地区分はこちら。
NBA Eastern Conference 2009-2010 until 2010/03/09
NBA Western Conference 2009-2010 
 
という感じで趣味に走ってみました。また次回。
 
 
 
 


※1 余談ですが、「やりたいことがあって、それを実現する技術や方法を模索する人」と「とある技術があって、それを活かせる分野を探す人」の間には、大きな差があるように感じます。私個人は完全に前者のタイプですが、優秀といわれるプログラマには後者のタイプが多いような。どちらが優れているかという議論に興味はありませんが、結果として出来上がるモノは同じであったとしても、そこに至るアプローチの違いはとても興味深いです。

1 Comment

Apache Tilesを動かせるところまで設定する。

個人的なメモエントリー。

Google App Engine for Java(GAE/J)を触り始めた影響で、過去の記憶を久々に掘り起こすシリーズ第二弾。Strutsを現役バリバリ(表現が古い)で使っていた時に使用していたテンプレートエンジンであるTilesを再現してみます。どうも最近の主流はVelocityとかいうらしいのだけど、まあ、馴染みのある方いいかと気にしないことにします。

とりあえず、公式サイト(http://tiles.apache.org/)から、ブツをダウンロードするのだけど、Ver.2.2がBeta版らしいので、ひとつ前のVer.2.1.4を選択しました。

落としてきたtiles-2.1.4-bin.zipの

  • tiles-api-2.1.4.jar
  • tiles-compat-2.1.4.jar
  • tiles-core-2.1.4.jar
  • tiles-jsp-2.1.4.jar
  • tiles-portlet-2.1.4.jar
  • tiles-servlet-2.1.4.jar

をWEB-INF/libへ放り込みます。ただ、色々入れていくとごちゃごちゃしそうだったので実際は”WEB-INF/lib/tiles”に配置。

あとはがりがり設定&設定&設定。。。必要な部分だけ抜粋して列記。

WEB-INF/web.xml

<servlet>
 <servlet-name>TilesDispatchServlet</servlet-name>
 <servlet-class>org.apache.tiles.web.util.TilesDispatchServlet</servlet-class>
</servlet>

<servlet>
 <servlet-name>tiles</servlet-name>
 <servlet-class>org.apache.tiles.web.startup.TilesServlet</servlet-class>
 <init-param>
  <param-name>org.apache.tiles.definition.DefinitionsFactory.DEFINITIONS_CONFIG</param-name>
  <param-value>/WEB-INF/tiles-defs.xml</param-value>
 </init-param>
 <load-on-startup>2</load-on-startup>
</servlet>

<servlet-mapping>
 <servlet-name>TilesDispatchServlet</servlet-name>
 <url-pattern>*.tiles</url-pattern>
</servlet-mapping>

WEB-INF/tiles-defs.xml

<tiles-definitions>
 <!-- 基本レイアウト -->
 <definition name="main.layout" template="/WEB-INF/tiles/layouts/main_layout.jsp">
  <put-attribute name="header" value="/WEB-INF/tiles/common/header.jsp" />
  <put-attribute name="body" value="/WEB-INF/tiles/common/body.jsp" />
  <put-attribute name="footer" value="/WEB-INF/tiles/common/footer.jsp" />
 </definition>

 <!-- 個別ページ1 -->
 <definition name="main.page1" extends="main.layout">
  <put-attribute name="body" value="/WEB-INF/tiles/body/body1.jsp" />
 </definition>

 <!-- 個別ページ2 -->
 <definition name="main.page2" extends="main.layout">
  <put-attribute name="body" value="/WEB-INF/tiles/body/body2.jsp" />
 </definition>
</tiles-definitions>

/WEB-INF/tiles/layouts/main_layout.jsp

<html><body>
<tiles:insertAttribute name="header" />
<hr>
<tiles:insertAttribute name="body" />
<hr>
<tiles:insertAttribute name="footer" />
</body></html>

header.jsp、footer.jsp、body1.jsp、body2.jspは省略。それっぽいものを配置すればOK。

src/TilesServlet.java

public class TilesServlet extends HttpServlet
{
 public void doGet(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException
 {
  // TilesDispatchServletに拾ってもらうために末尾を".tiles"とする
  String nextPage = "main.page1.tiles";

  // 必要であれば、表示先を条件分岐させる。
  if ( hogehoge ) { nextPage = "main.page2.tiles"; }

  RequestDispatcher dispatcher = request.getRequestDispatcher(nextPage);
  dispatcher.forward(request, response);
 }
}

ざっとこんな感じで。昔はもうちょっと細かいところまで駆使してた記憶があるけど、とりあえずは動くところまで。やっていくうちに必要なものもでてくるでしょう。

次は、Tilesの細かい部分か、Taglibsを思いだそうと思います。

webサービスを主たる業務にしたいと思っているのです

会社用に管理しているドメインや、そのドメインで運用しているサイト/システムの情報を整理してみたら、思っていた以上の数になってちょっと意外な感じがしました。

とはいえ、未だ社内システムを含めても実運用に至っているものは10件に達していないので、まだまだこれからな状態であるのに変わりはないのですが、構想段階であったり、開発中であったりするものを含めれば二桁に届きます。webサービスを本業としている訳ではない中で、それなりの成果も出始めています。

次のステップは、それを体系化して、とにかく離陸を早くすること。小さく始めて大きく育てる、とよく言われますが、その”小さく始める”ためのノウハウを貯めていくことと、大きく育てるための仮説を立てることを、2009年後半あたりから行ってきたので、2010年前半は実践に移って、とにかく複数のサービスを立ち上げることに注力しようと思います。

まずは3つ。がんばろう。