最近すっかりグラフ厨になってるんですが、ちょっとした解析ツールとかにグラフあったらいいなーなんて思う事ありますよね?

webアプリで使うならjsでグラフ書けると色々使い勝手がいいんですけど、毎回どのライブラリがいいかなー?と悩む訳ですよ。Highcharts.jsは格好いいけど、商用利用は有料だし・・しかも結構高いし・・

そんな中、「これでFAで良いんじゃないの?」ってのがあったので紹介してみます。

dygraphs.jsといいます。他にも幾つかライブラリを試してみたんですが、これはかなりシンプルに書けるわりに、高機能だったのが良かった。なかなか書き方の参考になりそうなところ見つからなかったので、幾つかサンプル残しておこうと思います。

一番シンプルなグラフ

こんな感じに書くだけです。データはCSV形式でシンプルな受け渡し。

<script type="text/javascript" src="dygraph-combined.js"></script>
<script type="text/javascript">
  container = document.getElementById("graphdiv");
  g = new Dygraph(container,
    "Date,Temperature\n" +
    "20121128,12\n" +
    "20121129,16\n" +
    "20121130,14\n" +
    "20121201,12\n" +
    "20121202,9\n" +
    "20121203,13\n" +
    "20121204,14\n"
  );
</script>

デフォルトでドラック&ドロップで範囲を絞ることができます。

複数行のケース

複数のグラフ書くのは、CSVに列追加するだけ。

<script type="text/javascript" src="dygraph-combined.js"></script>
<script type="text/javascript">
  container = document.getElementById("graphdiv");
  g = new Dygraph(container,
    "Date,Tokyo,NewYork\n" +
    "20121128,12,5\n" +
    "20121129,16,6\n" +
    "20121130,14,6\n" +
    "20121201,12,6\n" +
    "20121202,9,8\n" +
    "20121203,13,12\n" +
    "20121204,14,10\n"
  );
</script>

沢山のデータ表示

ベタに書かなくてもcsvファイルを指定することも可能

<script type="text/javascript" src="dygraph-combined.js"></script>
<script type="text/javascript">
  container = document.getElementById("graphdiv");
  g = new Dygraph(container,"graph3.csv");
</script>

使ったCSVはこんな感じです

Date,Data1,Data2,Data3,Data4,Data5,Data6,Data7,Data8,Data9,Data10
20121120,0,0,0,0,0,875,25,80,3035,0
20121121,0,2575,0,2950,0,1775,0,250,5900,4475
20121122,0,5725,0,3000,0,2000,0,145,9510,9350
20121123,0,4325,0,2525,0,2000,0,150,7735,5375
20121124,0,3750,0,2425,0,1600,1150,165,7330,5175
20121125,0,3075,0,2000,0,800,2125,925,6885,4800
20121126,0,2400,0,1400,0,675,1800,1485,6350,4275
20121127,0,2100,125,1525,0,2725,1250,1150,5950,3200
20121128,0,2475,1625,1125,0,2885,1350,1140,5725,2775
20121129,0,2525,1805,775,1510,2425,1650,820,5290,2575
20121130,560,2125,2050,800,3020,2650,975,880,5865,2900
20121201,975,1900,1840,850,2510,2525,700,1130,5320,2525
20121202,1000,1650,1810,750,2810,2325,1825,900,5330,2250
20121203,1200,1900,2020,700,2785,2575,1075,935,4690,2375
20121204,1075,2025,1860,700,2045,2425,1225,720,5065,2100

より複雑な例

上のケースだとデータ量が多すぎて視認性が悪いので、色々オプションを加えます

  1. グラフのハイライト
  2. クリック時のハイライト固定
  3. ラベルリストの外だし
  4. データのオン/オフスイッチ
  5. レンジセレクタ

色々触ったりクリックしたりすると感じが解ると思います。

若干コードが長くなりますが、一つ一つはシンプルです。CSVは上の例からヘッダ行とっただけ(ラベルの外だしするため)。

<script type="text/javascript" src="dygraph-combined.js"></script>
<script type="text/javascript">
  // クリック時に実行されるcallback、ハイライトを固定する
  var makeClickCallback = function(graph) {
    var isLocked = false;
    return function(ev) {
      if (isLocked) {
        graph.clearSelection();
        isLocked = false;
      } else {
        graph.setSelection(graph.getSelection(), graph.getHighlightSeries(), true);
        isLocked = true;
      }
    };
  };

  // グラフ描画ロジック
  container = document.getElementById("graphdiv");
  labels = document.getElementById("labels");
  labels_arr = ['Date','Data1','Data2','Data3','Data4','Data5','Data6','Data7','Data8','Data9','Data10'];
  g = new Dygraph(
    container,
    "graph4.csv",
    {
       labels: labels_arr, // ラベル名指定
       labelsDiv: labels,  // ラベル表示位置
       showRangeSelector: true, // 表示範囲セレクターを表示
       labelsSeparateLines: true, // ラベルの後ろに改行挟む
       highlightSeriesOpts: {  // ハイライトの設定
         strokeWidth: 3,
         strokeBorderWidth: 1,
         highlightCircleSize: 5
       }
  });
  // クリック時のcallback指定
  g.updateOptions({clickCallback: makeClickCallback(g)}, true);

  // 表示非表示切り替え
  function change(el) {
    g.setVisibility(parseInt(el.id), el.checked);
  }
</script>

コールバックや表示切り替え部分はそのまま流用できるし、その他はオプションだけで設定できます。ライブラリ自体がかなり大きくて、他にも色々な機能があるのでデモを見ると解ると思います。ここで紹介した以外に、グラフの特定箇所に記しをつけるannotationなんかを使っています。

デモが幾つか分散していて、ギャラリータイプのと独立しているものがあります。お目当てを探すのが面倒なのですが、始めにざっと見て何ができるか把握すると良さそうです。

オススメです。

このエントリーをはてなブックマークに追加

運用に携わっていると、何かの数値をグラフ化しておきたいなんてことが良くあります。

グラフ化しておくメリットは

  • 視覚化することで変化を見やすくする
  • 異常な数値があればすぐに気がつくことが出来る
  • 複数の値の関係を見つけやすい
  • 非エンジニアでも直感的に解りやすい
  • エライ人が喜ぶので評価される(かもしれない)

辺りでしょうか。最後のやつは実際どうかは解りませんが、上4つだけでもかなりのメリットがあります。

ただ、結構描画系ツールの選定やら準備やらが面倒だったりします。が、最近はではkazeburoさんが作ったGrowthForecastHRForecastがあって、すっごく簡単にグラフ生成ができるのでかなりお手軽になりました。今年のYAPCでも良く名前が出ていました。

Perl言語圏だったらおそらく聞いたことはあるんじゃないかな?と思うんですが、先月別の言語圏の方達と話をしていたら知らないという人が居たので、紹介エントリ書こうかなと思った次第です。

GrowthForecast

27

Cronなどで定期的にデータを投げてあげれば上記のようなグラフを良い感じに表示してくれます。複合グラフも簡単に作れるのがとても素敵。特徴としては、

  • 定期的にAPI叩くことで簡単にデータを登録できる
  • RRDToolを使ったカッコイイグラフ表示
  • 過去にさかのぼってデータを投入出来ない
  • 扱えるのは整数のみ

上のグラフは適当に投入したPVのデータとUUのデータを一つにグラフに表示している例。実際はPVとか取るならUUは後述のHRForecastの方が向いています。あくまでグラフとして見る物を投入するのが良くて、特定の箇所のイベント数とか、エラー数、たとえばログインユーザーと非ログインユーザーの比率など、数値として持っておくことが必ずしも重要で無いものが向いているような気がします。

データの投入は本当に簡単でcurl辺りで

$curl -F number=10 http://hf.example.com/api/[大カテゴリ]/[中カテゴリ]/[項目名]

インストール

githubに詳しく書いてあったのでそちらを参照。ちなみに、自分でsakuraVPSに入れたときはパッケージ群はcairo-devel入れたぐらいだった気がします。

cpanm無ければ入れておくとインストールが楽になります。perlbrewなんかでシステムperlと分けておくのが最近の主流ですけど、その辺りはperlbrewあたりで探して貰うと出てくると思います。(書くと長い・・・)

HRForecast

00

HRForecastは過去にさかのぼってデータ登録出来たり、CSVダウンロードやグラフの埋め込みが出来たりします。

  • 定期的にAPI叩くことで簡単にデータを登録できる
  • javascriptを使った動的なグラフ表示
  • 過去にさかのぼってデータを投入出来る
  • データダウンロードやグラフの埋め込みが出来る
  • データの丸めが発生する
  • 扱えるのは整数のみ

前述のGrowthForecastとの違いは遡ってデータを投入できることと、丸めが発生(もっとも細かい粒度で1時間でまとめられる)することです。またグラフ自体もRRDtoolとJavascriptとの違いがあります。こちらはある程度数値が指標となるようなデータPVとかUUとかを取っておくのに向いています。丸めは発生しますが、むしろdailyで取っておきたい事が多いでしょう。

インストール

自分のやった手順を書いておきます。mysqlが入っている前提なので無ければ入れてください。

$git clone git://github.com/kazeburo/HRForecast.git
$cd HRForecast
$cpanm --installdeps .

データベースの作成と権限の追加をしておきます

CREATE DATABASE hrforecast;
GRANT  CREATE, ALTER, DELETE, INSERT, UPDATE, SELECT \\
         ON hrforecast.* TO 'www'\@'localhost' IDENTIFIED BY xxxxx;

付属するschema.sqlを実行

$mysql -D hrforecast -u www < schema.sql

後は設定をいじるだけ

$vi config.pl
{
    dsn => 'dbi:mysql:hrforecast;hostname=127.0.0.1',
    username => 'www',
    password => 'xxxxxx',
    port => '5127',
    host => '127.0.0.1',
    front_proxy => [],
    allow_from => [],
};

リバースプロキシを使う場合はfront_proxyにipを設定します。自分はdaemontoolsでプロセスを起動して、nginxをフロントにしてます。

どちらもPSGIアプリとして書かれていて、起動するためのHTTPサーバまで付属しているので簡単に試すことができると思います。ドキュメントは起動後アクセスしたページにDocsがついているので(これスバラシイと思いました)、それを見れば簡単に使えると思います。

とにかく便利なのでオススメです。

このエントリーをはてなブックマークに追加

10月末から沖縄に約一週間(正確には10/29~11/3の5泊6日)行っていたんですが、数人に幾らぐらいかかったのか聞かれたのでプラン詳細と金額を書いておこうかと思います。

IMG_7432

プランを探している当初から、色々こだわった結果、何点か選ぶ基準にした点があります。

ざっくり言うと

  1. 時期は10月
  2. 子ども連れでも楽しみ易いリゾートホテル
  3. 海が目の前にあること
  4. 5泊以上ですべて同じホテル
  5. レンタカー付き

時期は10月

沖縄で、ビーチで遊びつつ安い期間は9月か10月辺りがかなりお安いです。ただし、10月末は天気が崩れると寒いです。逆に9月〜10月は台風に当たる危険性があるので、ベストは10月中旬です。1年を通してみると、梅雨明け後から夏前が狙い目らしいとも聞きました(*未確認)。我が家は子供の幼稚園のイベント都合で10月末になってしまったので、来年沖縄行くなら6月辺りを狙います。

子ども連れでも楽しみ易いリゾートホテル

子供連れなので、色々移動して遊ぶよりはホテルでもずっと遊べてしまうようなリゾート系のホテルを探していました。この点で那覇市内のホテルが殆ど候補から消えます。

海が目の前にある

ホテルからそのまま海に遊びに行ける環境の方が、ロッカールームや更衣室、シャワールームという点で圧倒的に楽ちんです。また子供をちょっと海辺で散歩させたり、眠くなったらすぐ部屋に戻れるなど子連れにはかなりの恩恵があります。

5泊以上ですべて同じホテル

個人的な都合なんですが、5泊以上は泊まりたいなって思ってたんですが意外とツアーが無い。はじめは6泊を考えていたんですが、既存のパッケージでは5泊がMAXでした。

レンタカー付き

沖縄本島に行くと絶対行きたい場所に美ら海水族館と美浜アメリカンビレッジがあります。あと子供つれての移動はやっぱり車あると、移動中に安定して昼寝させられるので、色々都合がよくなります。本島のプランには結構レンタカー付きプランがあるので、これは使うことにしました。

こんな条件で選んでみた結果

今回選んだホテルはルネッサンスリゾートオキナワです。

IMG_7092

リゾート型のホテルでプライベートビーチがあります。このホテルのウリは豊富なマリンメニューとイルカを初めとした海の生物をホテルで沢山飼育しているので、その生き物とのふれあいメニューが豊富な所です。

もう一点決め手になったところがあって、このホテルは連泊3泊 or 4泊以上(時期によって違う)すると、ClubSavvyというサービスが使えるようになって、これがかなり魅力的だったのです。どんなサービスかというと

  • マリンメニューが一部無料 or 割引になる
  • ホテルでの昼食が無料になる
  • ホテルの有料温泉が無料になる
  • 専用ラウンジが使える

他にもあるんですが、ほぼこの辺りがメインです。特にマリンメニューと昼食は結構お金かかってくるところなので、大分インパクトあります。

無料のマリンメニューもなかなか豪華で

IMGA0060

こんな朝のクルージングは毎日乗っても無料。1回限定ですが、シュノーケリングも無料になったりします。有料メニューも50%offか20%offになったりして結構変わってきます。

ホテルの料理は朝は和食 or 洋食選べて

IMGA0534

和食はこんな豪勢な限定の琉球朝食なんてのがあります。限定なんですが、早く行かなくても普通に食べれました。

IMG_6876

洋食はバイキング形式で、焼きたてのクルミデニッシュが最高に旨かったです。Club Savvyの無料ランチにも同じく洋食のバイキングなので、朝は和食、昼は洋食とすと飽きづらいかもしれません。

IMG_7243

洋食のレストランは海に面したテラス席があって、すごく気持ちいいです。朝和食をたべてから、ここでコーヒーや紅茶を飲みつつデザート食べるなんて事も出来ちゃいます。食べ終わったらそのままビーチへGo!なんてのがとても良かったです。

IMGA0941

プールは室内と室外2つあって、どっちもウォータースライダー付き。室内は子供向けな感じです。

IMG_7116

ホテルのビーチ。綺麗でしょ?すぐ近くに青の洞窟なんかもあります。

IMG_7227

11月からはイルミネーションが綺麗でした。一年中ってわけでは無いらしい。

IMGA0493

家族4人(大人2人+子供1人+添い寝の子1人)で申し込んだので、シングルベッド2つに4人でねるのかなーと覚悟してたら、なんと2段ベッド付きの部屋でした。全体的に広めだったので、4人部屋なのかな。よい部屋でした。細かい事言うと、おむつのゴミ箱が用意されてたら最高だった。

IMG_7073

今回JTBを利用したんですが、ホテル内にJTBラウンジってのがあって、コーヒーや紅茶、おまけにケーキまで食べ放題です。他の旅行社のラウンジがあるわけはなさそうだったので、JTBの影響力の大きさを感じます。Club Savvyで利用出来るラウンジはコーヒーとかケーキとか無いので、これはちょっとありがたかったです。このホテル使うならJTBは真っ先に検討して良いと思います。

ただ、1つ残念な事があって、このホテル、イルカを飼育していることがウリなのですが、9月末の大型台風で施設に損傷を受けて、イルカが逃げてしまったそうです。

なので、残念ながらドルフィンプログラムと沖にあるオーシャンステージプログラムは中止中でした。今イルカは調教中(調教してるところを近くで見たら凄い迫力でした)なので、来年には復活するんじゃないかと思います。上と下のリンク先のページや公式ページに情報あると思うので、これから行く人は確認した方がよいと思います。

さて気になるお値段ですが、7-10月のプランで一番安い時期を選択しました。月曜出発だけど、会社は一週間休みにしたので、問題無し。

大人2人パッケージ78,800円 × 2
幼児往復飛行機代40,800円
幼児ホテル代3,675円 × 4
マリンアクティビティ3,000円
早期申し込み割引-1,000円 × 2 × 4
トータル208,100

次男は3歳になってないので、旅費等一切かかりません。早期申し込み特典として、幼児ホテル代1泊分と、大人は1泊に付き1000円割引が最大4日分ついていました。あとホテルでのディナー1回無料券がついてました。

パッケージについていたオプションで、プリウスが旅行期間中ずっと使えて、さらに燃料満タン返し必要無し(ハイブリッドなので350km走ったけど給油無しで8割ぐらい残った)でした。もしかするとホテルで充電してくれていたのかも・・。あと前述のJTB専用ラウンジ。ホテル以外にも各地にあるようなんですが、ホテルのしか使わなかったです。

他にも沖縄の色々なところで使えるサービスチケットがあって、おきなわワールド入園料無料に、シークワーサージュースとマンゴーケーキ、ブルーシールアイスを2人分をタダで貰いました。もっと色々使えたけど、今回は出番が無かった。それでも2000円分ぐらいにはなりました。

IMG_6875

ホテルの昼食がClub Savvyで無料になるのが大きくて、夕食を外で4回(1回は早期申し込み特典の無料券を使用)食べただけで済みました。外で食べると1食3,000円は行っちゃうのでかなりデカイです。

夕食やお土産、観光費や雑費であと5万ぐらい消費しています。でも期間考えるとかなりお得に済んだと思います。

それなりに色々探して選んだプランなので、次回行くときはこれと同等かさらに安い値段で行けるようにしたいと思います。

楽天トラベルへのリンク→

写真や細かい情報も結構載っているので参考までに。

レビューも☆4.5位とハイレートです。

このエントリーをはてなブックマークに追加

↑このページのトップヘ