合同勉強会 in 大都会2013でKotlinの話してきた。

これはKotlin Advent Calendar 2013の12月15日分記事です。

これは12月15日のAdvent Calendarですが、実は12月14日に合同勉強会が行われました。
そこで、KotlinのWebフレームワーク探訪という話をしてきました。

Kotlinは先日M6.2にアップデートされたのですが、誤って(?)アップデートをしてしまったせいで、デモで動かそうと思っていたKaraとWasabiのコードが動かなくなってしまいました…。さすが、かわいいKotlin勉強会のときにライブラリが動かないと言われていただけあって、やっちまった感がひどかった
…。朝4時くらいまでなんとか動かないかとチャレンジしていたのですが、直りませんでした。

仕方が無いのでそのまま話してきました。

ちゃんと動かしたことがあるのは、KaraとWasabi。
Karaは(M)VCのRailsライクなフレームワークで、最近更新が滞り気味です。
html,css,jsをKotlinで書く事ができるようになっています。
html,cssはそれ用のDSLが準備されているため、htmlもcssもKotlinで書く事ができるのです!
って言ったら、

という反応が…。

はい、ちょっと辛めです。Rubyのslimで書くのとあんまり違わない感じの書き方なはずなのに、型に厳しいため、文字列で済ませたいところでも型を求められます(URLのルーティングとか、要素のid,classとか)。初めて書いたときは、もうこれは一旦JSP書きたい…と思いました…。

あと、更新処理をPUTメソッドで/items/1に送ったらエラーで落ちてしまったという問題の話もしました。やっぱりまだまだ未完成なフレームワークだなと思いました。

そして、Node.kt。これは以前にブログに書いた事があるのですが、KotlinのバージョンがM5.3以降でメンテナンスされていないようです。

最後に、Wasabi。WasabiはRuby製のフレームワークであるSinatraにインスパイアされたシンプルなフレームワークです。Web APIを作るのに適したシンプルな構成でクライアントサイドJavaScriptのMVCフレームワークのAngularJSやember.jsなどと組み合わせて使う事を想定しています。
型安全かつシンプルなAPIを提供できるフレームワークで、メンテナンスもされているので期待できます。

しかし結論としては、本命になるというフレームワークはまだわからないという状態です。
(メンテナンスがよく滞ってるし…)

Androidアプリを開発するにはそこまで問題にならないKotlinなんですが、いざ既存のKotlin製ライブラリを使うと使えなかったりして、よくモニョってしまいます。やはりもっともっとみんなでKotlinのプロジェクトにコントリビュートしていこうってことですよ!!

とりあえず、岡山の勉強会ではKotlinの知名度を上げる事はできたと思います。
来年は岡山でKotlinのハンズオンを開催したいと思ってます!


書評:CakePHP2定番レシピ119

Webアプリ開発を加速するCakePHP2定番レシピ119

Webアプリ開発を加速するCakePHP2定番レシピ119
著者:長谷川智希
価格:2,520円(税込、送料込)
楽天ブックスで詳細を見る

著者の長谷川さんから献本していただきましたので、遅くなりましたがレビューを書かせてもらいます。最近ずっとRuby on Railsばかりやってる自分としては久々のCakePHPでした。
想定している対象読者層は、こうなると思います。

  • CakePHPの設置・初期設定の一部はできる。
  • PHPは多少わかる。
  • CakePHPは多少わかるが、よくつまづく。

私は特によくつまづくので、こういう本が手元にあると安心感があります。
この本は逆引き辞典のようになっていてわかりやすいです。
ただ、CakePHPの導入部分とかの説明はないのでそれはその他の書籍か、CakePHPのサイトもしくはぐぐったほうがいいでしょう。

全部やってみたわけではなく、twitterでOAuthログインをして、そのアカウントでブログを書くミニアプリを作ってみたのですが、サンプルコードがとても参考になったし、今後発展させていくとしたらきっと必要だろうな、と思える項目が目白押しだったので、CakePHPでよく開発している人にとってはすごく『使える』本だと思います。

CakePHPを体系的に学びたいということだったら、CakePHP2実践入門を読むほうがわかると思います。しかし、よく使う機能はすぐ覚えられるのだけれど、時々使う機能というのは忘れてしまいがちで、毎回、調べては書いて、また同じようなシチュエーションになって、調べては書いて…となります。そういう項目についてサクッとわかるというのはストレスなく開発するために重要だと思いますし、そういうことで毎回困っている人のためにこの本は書かれたのだと思います。

もし自分がCakePHP開発するのであれば、Webアプリ開発を加速するCakePHP2定番レシピ119CakePHP2実践入門の2冊を手元においてやるでしょう。

それにしても自分がCakePHPでガリガリ書いていたときにはあんまり本がなかったので、今から始める人は情報がたくさんあっていいですねぇ…。


gemのテストにTravis CIを導入してみた。

足跡機能を実装できるacts_as_footprintableというgemを作ったのですが、テストを自動化したかったのでTravis CIを導入してみました。

Travis CIはgithubにpushしたらテストを自動的に行ってくれるサービスです。サイン インはgithubアカウントでできます。テストの導入は、言語別に方法が書かれています。私の場合はRuby。

Travis CIにログインして、アカウント情報より、どのリポジトリの自動テストを有効にするかを確認します。
スクリーンショット 2013-10-08 1.21.47

サービス側はこれだけ。

そしてソース側。
まずは.travis.ymlを定義します。
言語を指定し、rvmでRubyのバージョンを指定しました。色んなバージョンのRubyを指定することができますが、とりあえず2つにしました。また、Railsのサポートバージョンは3.2以上を想定していたので4.0.0と3.2.0を指定。

language: ruby
rvm:
  - 2.0.0
  - 1.9.3
env:
  - "RAILS_VERSION=4.0.0"
  - "RAILS_VERSION=3.2.0"

Travis CIが実行してくれるrakeのデフォルトコマンドを、Rakefileで指定します。

# coding: utf-8
require "bundler/gem_tasks"

require 'rspec/core/rake_task'

desc "Run specs"
RSpec::Core::RakeTask.new(:spec)

desc 'Default: run specs.'
task :default => :spec

あとはpushするだけ。放っておいたら自動でテストが実行されます。

Travis-CIのテスト結果を画像で表示するコードをREADME.markdownファイルに書いておくと、gemを使うユーザーに安心感を与える事ができると思うので、書いておくといいでしょう。画像はこういうやつです。

スクリーンショット 2013-10-08 1.25.42

コードは、Markdownの場合はこう。

[![Build Status](https://travis-ci.org/[github_username]/[repository].png?branch=master)](https://travis-ci.org/[github_username]/[repository])

色んな環境のテストを行うのは正直面倒ですが、Travis-CIを使えば一通りの環境でのテストができるから、環境依存のテストが楽になります。ライブラリを作る場合はどんどん使っていきたいと思いました。


AxlsxでExcel上にグラフを作ってみた。

個人的に、といっても会社用のツールだけれど、Excelファイルを作る機能が必要だったのでそういう機能をAxlsxを使って作っていました。
会社に資料を作っている人がいるのですが、毎回手作業でデータをコピーしていたので、プログラムでなんとかしてあげんとなーと思ってました。なかなかやるキッカケがなかったのですが、さっさとやってしまおう!と思って一気にやってみました。

railsで作っていたのでaxlsx_railsを使いました。
axlsxは既存のファイルを読み込んでテンプレートのようにはめ込み型で処理する、ということができないので一から全部作ります。

axlsxでのデータ入力は簡単です。

値を入力するには?

基本的には配列を作ってadd_rowに渡せばよいだけです。

workbook = xlsx_package.workbook
workbook.add_worksheet(name: '概要') do |sheet|
  sheet.add_row ["aaa", "bbb", "ccc"]
end

既に存在するデータを利用するには?

データの参照も簡単で、普通に式を渡すだけです。既にデータの入っているセルを指定することもできます。

workbook = xlsx_package.workbook
workbook.add_worksheet(name: '概要') do |sheet|
  sheet.add_row [1, 2, 3]
  sheet.add_row ["=A1+A2+A3"]
end

範囲指定してループするには?

また、シートの範囲のループも簡単です。sheet[座標:座標]で範囲指定できます。

workbook = xlsx_package.workbook
workbook.add_worksheet(name: '概要') do |sheet|
  sheet.add_row [1, 2, 3]
  sheet["A1:A3"].each do |cell|
    puts cell.value
  end
end

シートの範囲指定は、グラフを作るときの値の指定の際などに使えます。

グラフ(チャート)を作るには?

チャートを作るのも比較的簡単でした。
チャート毎に、チャート作成用クラスがあるのでそれを指定してブロックを作ります。

workbook = xlsx_package.workbook
workbook.add_worksheet(name: '概要') do |sheet|
  # 事前にセルにデータが入っているとして…
  sheet.add_chart(Axlsx::LineChart, title: 'グラフタイトル') do |chart|
    chart.catAxis.gridlines = false # 横方向のラインを表示しない
    chart.valAxis.gridlines = true # 縦方向のラインを表示する
    chart.start_at 0, 10 # グラフを置く位置の始点(0,10 => A10)
    chart.end_at 8, 33   # グラフを置く位置の終点(8,33 => I33)
    chart.add_series(
        data: sheet["B2:Y2"],
        title: '売上',
        color: '6296C7',
        show_marker: true,
        labels: sheet["B1:Y1"]) # 横軸のラベル
    chart.add_series(
        data: sheet["B3:Y3"],
        title: '客単価',
        color: 'C86560',
        show_marker: true)
    chart.d_lbls.show_val = true # グラフ中に実数をプロットするか否か
    chart.catAxis.label_rotation = -45 # 横軸のラベルの表示角度を指定
    chart.catAxis.crosses = :autoZero # 開始点を0にするか等
  end
end

グラフが簡単に作成できるのはとても嬉しいですね!
グラフによっては、存在する項目やそうでない項目もあるかもしれませんが、axlsxのgithubにあるexample.rbが結構詳しく書いてくれています(説明がないものもある)。自分はググりまくって調べたり、ソースコードを読んで調べたりしたのですが、なかなか気づけなかったものもあるので、この記事が参考になったら幸いです。


Cookie Clickerと投資の話

最近Cookie Clickerにハマってます。クッキーをクリックして増やしてそのクッキーを資金に設備を買ってまた増やして…というゲームです。最近話題になっているので知っている人も多いのではないでしょうか?

twitterを見ていると、このゲームは経営に似ているという人がいたりします。私もそう思いますが、どちらかというと投資に似ていると思います。そんな話をTLでしたら、ナイナイと言われてしまいましたが、いや、やっぱり似てるなーと思います。

まず、最初は自分でクリックしないといけない点。
投資はお金がある程度ないと始めることができません。
効率のよい投資先を見つけるまでは、自分で稼いだ方が速いという点も似ています。
(Cookie Clickerはちょっと条件が違うけど、それについては後述)

そして、次はどこに投資するか、ですね。
利益率の高いものと低いものがありますから、むやみに低いものばかりに投資していると、なかなか増えません。

さらに、時間を味方にできる点。
投資は時間を味方につけたものが勝つと思っています。というのも、複利効果が狙えるからです。一攫千金を狙うと、リスクが跳ね上がってだいたい損をします。焦っていると、画面に張り付く事になってしまい、一番大事である「時間」を奪われてしまいます。まぁそれ自身が楽しくてストレス解消になってということだったら別にいいと思いますけどね。

そして最後に、クッキーを大量に持っているものが有利という点です。
結構な人がcps(cookie per second)に気を取られてしまうのですが、実はこのゲームはここが肝であるということに気づきました。cpsを上げて、時間をかけて力技で解決することもできますが、文字通り時間がかかります。

ここで重要になってくるのが、ゴールデンクッキーの存在です。

ゴールデンクッキーは

  1. 一定時間の生産性を7倍にする
  2. 持っているクッキーの1割か20分で生産できる量のクッキーを貰える
  3. 13秒間だけ、クリックしたときのクッキーが劇的に増える
  4. ゴールデンクッキーのチェーン(貰えるクッキーが1桁ずつが増えていく)

という効果があるのですが、この中で注目するべきは、
持っているクッキーの1割か20分で生産できる量のクッキーを貰える
です。
投資も、原資が多い人が圧倒的に有利です。同じ1割を得られるにしても、
1兆個しかクッキーを持ってない場合は、1千億個のクッキーしか得られませんが、
10兆個のクッキーを持っていたら、1兆個のクッキーを得られるのです。
桁が違うと得られるものの大きさが違うのですね。
効率は変わらないにしても絶対数が全く異なってくるのです。

ゴールデンクッキーで得られる最大値をキープできるようにクッキーを持ちつつ、設備を買うと、一番効率よくcpsも増やせると気づいたのですが、これって本当の投資にも似てるなーと思ったのです。

一気に投資して使えるお金が殆どなくなったら、チャンスのときに投資できなくなる(ゴールデンクッキーで得られるクッキー量が減る)。しかし余裕をもって投資をすれば、チャンスの際に大きな利益を得られる。

まぁ実際の投資とCookie Clickerの違いは、投資はリスクがあるけどCookie Clickerはリスクがない点ですね。だいたいクッキー増えるし。減る事があっても大した量じゃないし。実際の投資は増えるどころか減る事もあるし。

話は変わるけど、twitterのTLではプログラマの人達が『クリックを自動化する』というのをやってる人が多かったのですが、それって楽しいですかね?プログラムを書き換えて、っていうのと、ほとんど変わらない気がするんすよね。

「俺のはちゃんとクリックさせてる。プログラムは変えてない」っていうの。

まぁ私もプログラマなので、もちろんそういうプログラミング自体は楽しいと思いますが、クリックを自動化するのって、ゲームを楽しんでないと思うんですよね…。なんか老害っぽい感じになったけど、それってRPGでレベル上げやっといて〜と同じというか。ゲームはゲームとして楽しんだらいいのに…と思います。