223 Software

主に勉強したことなどを記録するログです。 最近はRuby, Railsなどが多め。

移転してます。

http://satococoa.hatenablog.com/

↑今後はこっちに書きますので引き続きよろしくお願いします!

ハッカソンを開催しました

12/4(日)に僕の主催するP4D(デザイナー向けプログラム部)主催でデザイナーxエンジニアハッカソンを開催しました。

当日まで

11月の初旬から準備を始めました。11/6(日)にいつものフィヨルドオフィスに集まって当日の企画を練り、そこから参加者やスタッフの募集などをコツコツ行いました。

こういうイベントを行うときに一番気がかりなのが会場なのですが、今回もそのへんは @machida さんにおまかせして余裕で30人ほどが入れて無線LANもあるベンチャーカフェ様を借りられることになりました。

参加者集めも工夫しました。

このイベントの一番の特長はエンジニアとデザイナーをペアにして1日で動くものを作ってもらう、という点です。

エンジニアには1日でシステムを組み上げるという開発スキルだけではなく、(大体)初対面のデザイナーさんとコミュニケーションしながら、時にはレクチャーをしながら開発するというハイスキルが要求されてしまいます。このことから、今回エンジニアは広く告知をして希望者を集めることをせず身の回りの知り合いに協力を仰ぐという集め方をしました。

幸い僕の身の回りにはとても優秀なエンジニアの方ばかりでしたので、エンジニアの方は問題なく集まりました。

募集開始

やはりコラボレーションをスムーズに進めるにはGitの使えるデザイナーさんを優先して集めたい、という狙いがあり、まずは先日開催したWebデザイナーのためのGit勉強会に参加された方にgithub上でメッセージを送って参加を募りました。

しかし、残念ながらこれは全然反応がありませんでした。そもそも普段からgithubを使っている人以外はgithub上でメッセージを送られても気づかないおそれがあります。ということで急遽ATNDを立てて募集しました。

出足こそ悪かったもののなんとか9人のデザイナーさんが集まり、「デザイナーさんは来てくれるかな・・・」という一番の心配事は解消されました。

デザイナー、エンジニアともに9人の参加者が集まった時点で締め切ったのですが、欠席者が出ることを考えて念のためにサポートエンジニアとしてtwitterや社内で追加のエンジニアを募集しました。ありがたいことにすぐに4人の方に手を挙げていただいてあっという間にサポートスタッフまで集まりました。

当日

なんと欠席者0人。しかもほぼ全員が10時の時間通りに来ていただけました。嬉しかったです。

おかげで急遽ペアにサポートをつけなければならない事態にもならず、逆にサポートエンジニアで来ていただいた方にはあまりやることがなくなってしまって申し訳ない気持ちにもなりましたが、それでも準備から片付けまで色々手伝っていただきました。本当にありがとうございました。

会場が休日のため入退場に若干手間がかかり少し開始時刻を押してしまったりとバタバタしたものの、自己紹介と開発するネタの発表まで無事に終わらせてあとはひたすら開発でした。

このイベント、デザイナー側から見てもノートPCのみでデザインを仕上げなければならないというかなり厳しい制約が課せられ、また時間の制約から考えてHTML納品というのも考えにくく、狙い通りほとんどのペアがgithubを用いたコラボレーションを行っていました。

そして活発にペアでコミュニケーションをとっていたのも印象的でした。サービスの名称から細かい仕様まで、お互いに話し合いながら、それでも手を動かせる者同士ということもあり簡潔なディスカッションを繰り返しながらテンポよくどのペアも開発を進めていた印象です。ちゃんとspecまで書いていたペアがいることは驚きでした。

開発言語は全ペアがRuby+JavaScriptを使っていました。この事実だけで、いかに偏った空間かということがわかるかと思います。そしてなぜかこの日に限ってherokuの調子が悪く、全ペアに大打撃を与えていました。

自分のペア

主催者でありながら、ちゃっかり開発もしました。僕は@saucerjpさんと組んでwebsocketを使ったアプリを開発しました。当日のうちにコアな機能はほぼほぼできたのですが、正式リリースに向けてもうちょっと機能追加+調整を行いたいので詳細は後日。

発表LT

懇親会を兼ねて、ビールを片手に各ペアの発表を聞きました。

これがまたどのペアも完成度が高い!デザインがきちんと入るとこんなにもレベルが高くなるんだなぁと感心しました。

成果物はwikiのOutputのページでも見られますし、きっとさらに完成度をあげて正式リリースされることと思います。各々のサービスについての詳細はそのときに発表されると思います。

まとめ

自分で言ってしまうのもアレですが、想像以上にいいイベントにできたと思います。これも準備段階から協力していただいたスタッフのみなさん、サポートエンジニアの方々、会場を提供していただいたベンチャーカフェ様、そして当日惜しみなくそのスキルを発揮していただいた参加者のみなさんのおかげです。

本当に開催して良かったと思います。またこういったイベントを開催していきたいと思いますので、今回惜しくも参加できなかった方もぜひ次回を楽しみにお待ちいただければ幸いです。

これをきっかけに毎月のP4Dの活動もますます盛り上げていきたいと思います。どうぞよろしくお願いします。

TDDBC横浜に参加しました

11/5(土)に開催されたTDDBC横浜にスタッフ、そしてJavaScriptのTAとして参加してきました。
遅ればせながらエントリーにしたいと思います。

参加のきっかけ

Yokohama.rbで@setoazusaさんがスタッフの募集を告知されて、それに乗っかった形で参加させていただきました。

TDDBCといえば毎回告知から数時間ですぐに参加枠がいっぱいになってしまうような人気イベントです。僕も過去参加申し込みをしたことがありましたが、絶望的なキャンセル待ちとなり参加できずじまいでした。
そんなTDDBCに参加できるとあればやらない手はありません。

予習

そして開催日の数日前にRubyではなくJavaScriptのTAを依頼され、正直JSのTDDを教えられるほどの自信はあまりなかったのですが、いい勉強の機会だと思って引き受けさせていただきました。(そのため、突然QUnitのエントリを書いたのでした→QUnit + QUnit-TAPでJSのTDDをしてみた

JSのTAをするにあたって事前に予習したのはQUnit+QUnit-TAPでのnode.jsを使ったTDDだったのですが、ブラウザでのTDDの動作も確認しておかねば、と思い当日の電車の中でQUnit on ブラウザの環境を整えながら会場へ向かいました。
とはいえ結局テストの書き方はほとんど変わらないので、ブラウザでもguard-livereloadなどを併用すれば十分テンポよくTDDできますね。

また、QUnitと並んでJasmineの方もとても人気のあるJSのテスト用ライブラリです。今回は使いませんでしたがrspecのような書き方ができ、業務でも使っているので個人的にももっと使い込んでいきたいと思います。

当日

イベント自体の当日の様子などは既にwikiにまとめられているので、そちらをご参照ください。
TDDBC横浜/記録

今の職場では幸い業務でTDDできているのですが、やはりt-wadaさんの(RedBull片手の)基調講演を聴き、他の方のテストや今まで触れたことの無かった言語のテストなどを見ることにより、だいぶ自分のテストの書き方もブラッシュアップすることができました。

たった1日のイベントではありましたがずいぶんテストに対する考え方が整理されました。

  • red -> greenにするだけではなく、きちんとリファクタリングをしよう
  • テストすべきは自分が不安に感じるところである
  • 自分が最初のユーザーになる気持ちで、APIをどう使いたいかという視点からテストを書く
  • テストは目的ではなく手段であるということ

ペアプロやりたい

久しぶりにペアプロをやってみて感じたのですが、他の方がどんなことを考えながらどういう書き方で実装するのか、をライブで見るのは非常に面白いですし、勉強になります。

いいコードはgithubでいつでもたくさん読むことができますが、やはりライブは完成品に至るまでの過程が見えるあたり情報量が違いますよね。

他にも使っているエディタやプラグインの話をしたり、同じ実装をするにしても書き方の流儀が違ったり(JSのオブジェクトの作り方とか)そんなやりとりもペアプロの魅力だと思います。

ハッカソンの企画が終わったらペアプロも企画してみようかなぁ・・・などと画策中です。

やはりTDDBootCampですからね。Bootしただけじゃなくて、今後はそのスキルを上げていないといけません。TDDはスキルであり、そして量は質に転化する。積極的に機会を見つけて今後もスキルアップしていきたいと思います。

素晴らしいイベントでした。参加させていただいて、そしてスタッフ・TAやらせていただいて光栄です。ありがとうございました。

社内Scala勉強会始めました

Twitter社の公開したScala教育用のコンテンツである Scala School! を使って社内Scala勉強会を始めました。

第一回は先週の11/2で、Basicsのページを進めました。

形式はみんなで顔を合わせつつ、同時にSkypeもつないでハマったところを共有しながら各自進める、という形式でやってみました。残念ながら僕は序盤に打ち合わせが入ってしまい抜けたのですが、一応全員Basicsのページは一通り進めたようです。

というわけでちょっと間が空いてしまいましたが、第一回で学んだことを簡単にメモします。

valとvar

変数の宣言の仕方が2通りです。valにすると再代入ができません。

scala> val two = 1 + 1
two: Int = 2

scala> two = 3
<console>:8: error: reassignment to val
       two = 3
           ^

メソッド

色んな定義の仕方があってややこしい。

基本?

def addOne(m: Int): Int = m + 1
def メソッド名(仮引数: 仮引数の型): 返り値の型 = 処理内容

処理内容が複数の表現を含むときは、{}で囲むことができる

def timesTwo(i: Int): Int = {
  println("hello world")
  i * 2
}

最後に評価した値が返り値となるのはrubyっぽい。
追記:上記、誤解でした。 @bleisさんに『最後に評価した値が戻り値になるわけではないです。それだと型を付けることができないので』と教えていただきました。以下のように書くとエラーになりました。

scala> def two: Int = {
     | 2
     | "string"
     | }
<console>:9: error: type mismatch;
 found   : java.lang.String("string")
 required: Int
       "string"
       ^

ちなみにLLの感覚で文字列をシングルクォーテーションで囲むとエラー。Char型を表すのですね。

無名関数

scala> (x: Int) => x + 1

CoffeeScriptっぽい。もちろん変数に入れることも可能。

scala> val addOne = (x: Int) => x + 1

無名関数も{}で囲むことができる。

scala> { i: Int =>
  println("hello world")
  i * 2
}

引数を取らない場合はかっこを省略できる。

scala> def three() = 1 + 2
scala> three
res3: Int = 3

部分適用

メソッドの引数のうち、一部だけを与えて新しいメソッドを作ることができる。

scala> def adder(m: Int, n: Int) = m + n
scala> val add2 = adder(2, _:Int)
scala> add2(3)
res19: Int = 7

まだ使いどころがよくわからない。

カリー化

メソッドを返すメソッドを作ることができる?

scala> def multiply(m: Int)(n: Int): Int = m * n
scala> multiply(2)(3)
res0: Int = 6
scala> val timesTwo = multiply(2)(_)
scala> timesTwo(3)
res1: Int = 6

これも使いどころがよくわからない。
以下も同じような使い方ができると思うけど、使い分けは?

scala> def multiply(m:Int, n:Int) = m * n
multiply: (m: Int, n: Int)Int
scala> val timesThree = multiply(3, _:Int)
timesThree: Int => Int = <function1>
scala> timesThree(5)
res20: Int = 15

上記のメソッドは以下のようにしてカリー化できる。

scala> (multiply(_, _)).curried
res21: Int => Int => Int = <function1>

可変引数

def capitalizeAll(args: String*) = {
  args.map { arg =>
    arg.capitalize
  }
}

次のrubyコードと動作は同じ。よく似てる。

def capitalizeAll(*args)
  args.map {|arg|
    arg.capitalize
  }
end

クラス

class Calculator {
  val brand: String = "HP"
  def add(m: Int, n: Int): Int = m + n
}

scala> val calc = new Calculator
scala> calc.brand
res23: String = HP
scala> calc.add(4, 3)
res24: Int = 7

プロパティとメソッドの定義。

コンストラクタは特定の名前のメソッドを定義するのではなく、クラス内のメソッド定義の外側のコードがコンストラクタ。

class Calculator {
  /**
   * コンストラクタ
   */
  val color: String = if (brand == "TI") {
    "blue"
  } else if (brand == "HP") {
    "black"
  } else {
    "white"
  }

  // インスタンスメソッド
  def add(m: Int, n: Int): Int = m + n
}

継承

class ScientificCalculator(brand: String) extends Calculator(brand) {
  def log(m: Double, base: Double) = math.log(m) / math.log(base)
}

オーバーロード

class EvenMoreScientificCalculator(brand: String) extends ScientificCalculator(brand) {
  def log(m: Int) = log(m, math.exp(1))
}

書いていないけど、オーバーライドのときはoverrideとつけないといけない。
いい例が思いつかなかったので、処理内容が同一です。

class MyScientificCalculator(brand: String) extends ScientificCalculator(brand) {
  override def log(m: Double, base: Double) = math.log(m) / math.log(base)
}

トレイト

PHPでも5.4から使えるあれですね。

trait Car {
  var brand: String
}

class BMW extends Car {
  var brand: "BMW"
}

インターフェイスとは違って抽象メソッドじゃなくても入れておけます。とか、複数のトレイトを使用する場合のこととか、そういうのはあとから出てくるのでしょうか。

型引数、とかジェネリクスとか言われると、Javaをやっていない身からするとちょっと厳しいです。
次のように、型引数を使用できます。

trait Cache[K, V] {
  def get(key: K): V
  def put(key: K, value: V)
  def delete(key: K)
}

メソッドも型引数をつけられるそう。

def remove[K](key: K)

まとめ

後半の内容は、正直使いどころとかが理解できていません。
頑張って引き続き学んでいこうと思います。

実は去年にコップ本は一通り読んだのですが、残念ながらほとんど覚えていませんでした・・・。
一通りこのScala Schoolが終わったら読み直さないとダメかな。

ちなみに僕が持っているのは第1版です。

QUnit + QUnit-TAPでJSのTDDをしてみた

JavaScriptでTDDするにはどうすればいいのかな・・・と思い、TDDBCではQUnit + QUnit-TAPが使われていたようなので、とりあえずその環境を整えてみました。

普段rspecを使っている自分としてはrspecっぽく書けるJasmineも気になっているのですが、とりあえずはQUnitを。

インストール

QUnit-TAPはnpmで提供されているので、それで入れるのが簡単そう。globalに入れることもできますが、とりあえずカレントディレクトリのnode_module/に入る以下のコマンドでインストール。

 $ npm install qunit-tap

設定

まずは設定とか必要なモジュールのrequire等を行うtest_helperを作ります。

QUnit-TAPにサンプルでついてくるtest_helper.jsをほぼそのまま、パスのあたりだけ調節して使っています。

exports = module.exports = global;

var tryRequireThese = function() {
  var args = Array.prototype.slice.apply(arguments);
  for(var i=0; i < args.length; i+=1) {
    try {
      return require(args[i]);
    } catch(e) {
      // ignore
    }
  }
  throw new Error("cannot find moduele: " + args);
};

QUnit = require('qunit-tap/vendor/qunit/qunit/qunit.js').QUnit;
var qunitTap = require('qunit-tap').qunitTap;

var sys = tryRequireThese("sys", "system");
for (var i in sys) exports[i] = sys[i];
puts = (typeof sys.puts === 'function') ? sys.puts : sys.print;

qunitTap(QUnit, puts, {noPlan: true});

QUnit.init();
QUnit.config.updateRate = 0;

exports.assert = QUnit;

テストを書いてみる

このへん利点がよくわかっていないのですが、TAPという形式での出力はproveというperl製のコマンドを使って実行するのが便利らしいので、それに従っておこうと思います。

すると、t/というディレクトリ以下にテストファイルを置いておくとproveコマンドが自動的にそのディレクトリ以下のファイルを自動的にテストファイルとして扱ってくれるらしいので、従います。

t/array_test.js

require('../test_helper.js');

QUnit.module('Module Array');
QUnit.test('#length', function() {
  var ary = new Array(5);
  assert.equal(ary.length, 5);
});

QUnit.test('#push', function() {
  var ary = new Array();
  ary.push('first');
  assert.equal(ary.length, 1);

  ary.push(2);
  assert.equal(ary.length, 2);
});

QUnit.test('#concat', function() {
  var ary1 = [1, 2, 3];
  var ary2 = [4, 5, 6];
  var res = ary1.concat(ary2);
  // assert.equal(res, [1, 2, 3, 4, 5, 6]); # => fail
  assert.deepEqual(res, [1, 2, 3, 4, 5, 6]);
});

QUnit.start();

実行してみます。

$ prove -vc --exec=node --ext=.js
t/array_test.js .. 
# module: Module Array
# test: #length
ok 1
# test: #push
ok 2
ok 3
# test: #concat
ok 4
1..4
ok
All tests successful.
Files=1, Tests=4,  0 wallclock secs ( 0.04 usr  0.00 sys +  0.12 cusr  0.01 csys =  0.17 CPU)
Result: PASS

proveコマンドの-vは結果の表示を詳細に、-cは色を付けて、--execはテストコードの実行コマンド、--extはテストコードの拡張子ですね。

ちょっとハマったのが、配列同士をassert.equal()で比較するとfalseになってしまうこと。確かにnodeコマンドのコンソールで[1,2] == [1,2]と打ってもfalseが返ってきます。このへん、JavaScriptの動作としては配列の中身までは比較せずに、同じオブジェクトへの参照を持っているかどうか、ということを比較しているからfalseなのでしょうか。assert.deepEqualを使うことで意図通りのテストができました。

せっかくなのでもう一つテストファイルを足してみます。

t/string_test.js

require('../test_helper.js');

QUnit.module('Module String');
QUnit.test('#match', function() {
  var str = 'test';
  assert.ok(str.match(/te.{2}/));
});

QUnit.test('#split', function() {
  var str = 't,e,s,t';
  assert.deepEqual(str.split(','), ['t', 'e', 's', 't']);
});

QUnit.start();

Greenでした。OKですね。

では、独自に作ったJSをテストすることにします。
テストファーストということで、テストファイルから。

t/calculator_test.js

require('../test_helper.js');
var cal = require('../lib/calculator.js').Calculator;

QUnit.module('Module Calculator');
QUnit.test('#initialize', function() {
  assert.ok(cal);
});

QUnit.start();

この時点でテストを実行すると当然Red。
実装しましょう。

lib/calculator.js

var Calculator = {
};

exports.Calculator = Calculator;

JSのモジュールとか、やったことは無いのですがこんなやり方でいいのかな?とにかくGreenになったので、テストコードを足して失敗になったことを確認した後、実装します。

t/calculator_test.js

QUnit.test('#sum', function() {
  assert.equal(10, cal.sum(5, 5));
  assert.equal(15, cal.sum(5, 5, 5));
});

lib/calculator.js

var Calculator = {
  sum: function() {
    var result = 0;
    for (var i = 0, l = arguments.length; i < l; i++) {
      result += arguments[i];
    }
    return result;
  }
};

GreenになったのでOKのようですね。

自動でテストを実行

やっぱりテストファイルを更新したら自動的に更新されて欲しいですよね。
とりあえずrubyですがguardを使ってみました。

$ gem install guard guard-shell growl rb-fsevent
$ guard init shell

生成されたGuardfileを以下のように書き換えて、lib/, t/以下のファイルが更新されたら自動的にproveコマンドを実行するようにしました。

guard 'shell' do
  watch(%r{lib|t/(.+)\.js}) {|m| `prove -vc --ext=.js --exec=node` }
end

結果、JSとperlとrubyを駆使した(?)面白い環境になりました。
色がつかないのでなんとかしたいのですが、どうすればいいのかよくわからなかったです。

まとめ

今回はnode.jsを使って、簡単なモジュールのテストをしてみました。

一口にJSのテストと言っても、サーバーサイドのJSをテストしたいのか、ブラウザ上のJS(特にDOM操作が入ったりするもの)をテストしたいのか、JS含めたアプリケーションの動き全体をテストしたいのか、そのへんを見極めておかないといったい自分が何をしたいのかを見失ってしまいそうで、要注意ですね。

Rubyを始めたい方向けまとめ(2011年秋版)

最近gitやrubyなど、プログラミング関連のあれこれを教える機会が増えてきました。

今自分が一番使っているプログラミング言語はRubyですが、これをどうやって効率的に学習すればいいのかなぁということを考えてみました。

情報の入手の仕方なども盛り込んで、今後自力で使いこなしていくために必要そうなノウハウをなるべく盛り込んでみました。
これからrubyを学ぼうという方の参考になれば幸いです。

また「これからプログラミングを覚えて何かWebアプリを作ってみたいけれど、とっかかりが見つからない。」という方にとっても何かしらきっかけを与えることができたなら幸いです。

ご注意

  • 僕自身はWeb系のプログラマのため、そちらの分野に偏った内容となっています。
  • この分野の情報はすぐに古くなります。1ヶ月後にはトレンドが全く変わってしまっている可能性がありますので、新しい情報を常に参照するように気をつけてください。(自戒をこめて)

目次

開発環境の構築

まずは開発できる環境を整えたいと思います。

ここでは執筆時点で最もモダンだと僕の考える方法で環境構築をしてみます。

マシンの準備

Windowsでも動きますが、Macユーザーが極端に多いです。特に初級者の場合は教えてくれる人がなるべく多い環境を選ぶ方がいいのでMacをおすすめします。

勉強会で大人気のMacBook Airですが、だいぶ安く買えるようになりました。
ruby系の勉強会に行くと、参加者の9割はMacで、そのうち半数以上がAirということもざらです。

ここから先はMac OS X 10.7 (Lion)の環境を対象にして進めてしまいます。

Xcode

rubyのコンパイルや、一部のライブラリのインストール時に必要になります。
また、データベースなどの開発に必要なミドルウェアのインストールにも使われます。
デフォルトでは入っていませんので、App StoreからXcodeをインストールしてください。(無料です。)

App Storeへのリンク

Homebrew

Homebrew

パッケージ管理システムと呼ばれるソフトウェアの一つで、開発に必要なソフトウェアの管理に使います。

従来はMacPortsが主流だったのですが、今はかなり多くの開発者がHomebrewに移行しています。

ターミナルで以下のように打ち込むことでインストールできます。

$ /usr/bin/ruby -e "$(curl -fsSL https://raw.github.com/gist/323731)"
バージョン管理

rubyの場合、実質gitがデファクトスタンダードです。GitHub上で開発されているライブラリもたくさんありますし。

Lionの場合、Xcodeをインストールすれば一緒に入るはずです。

コマンドラインでの操作が苦手な方も、GUIのGitクライアントも増えてきましたので安心です。

あとはgit guiとすると、GUIのクライアントが立ち上がると思います。

rubyのインストール

現在最新の安定版のrubyはバージョン1.9.2ですが、まだまだ1.8.7も多い状況です。OS Xに始めから入っているrubyも1.8.7です。
これから何か新しいプログラムを書くのであれば、1.9.2で問題ないと思います。

追記: 先ほど1.9.3がリリースされたらしいので、そっちが最新ですね。ちゃんと確認していないので取り急ぎ。

ちなみにrubyのインタプリタ(ソースコードを解釈して実行してくれるプログラム)にはいくつかの種類があります。

特に理由が無ければMRIを入れておけば間違いないです。

rubyに限らず最近のスクリプト系言語(LL: Lightweight Languageと呼ばれたりする。perlとか、pythonとか、node.jsとか)の開発者の多くは複数のバージョンを切り替えて扱えるようなツールを使っています。

rubyで言うと、以下の2つが主流です。

最近人気が高まってきているのはrbenvの方ですが、まだまだユーザーはrvmの方が多いと思います。
身近に教えてくれる人がいるのなら、その方に合わせてください。
いないようなら、とりあえずはユーザーの多いrvmがいいと思います。

RVM: Ruby Version Manager - Installing RVM のページの"Single-User installations"の手順に従って作業をすれば、それだけでruby 1.9.2を使うモダンな環境が出来上がります。

またrbenv + ruby-buildは僕の個人的なおすすめです。こちらにチャレンジする方は以下のエントリーを参考にしてください。

rbenv + ruby-buildのインストール方法

エディタ

以下のものが人気が高いみたいです。自分に合ったエディタを探してください。

サーバー

Webアプリケーションを作ったとして、それを動作させるサーバーがないと一般公開できません。
幸い、今は無料でアプリケーションを素早く公開することもできるようになりました。

今ruby開発者の間でもっとも広く愛用されているのはherokuです。
gitでpushするだけでアプリケーションを公開でき、無料でもかなり使えますのでまずはこれを使う方向でいいと思います。

サーバー構築ができる方はVPSやIaaSも検討されるといいと思います。
apache or nginx + passengerがお手軽です。

ちなみにこのブログはさくらのVPS にインストールしたapache + passengerで動いています。

おすすめの学習方法

手っ取り早く体系立てて学ぶには本を読むのがいいと思います。rubyの書籍はたくさんありますが、中でもおすすめの2冊を紹介します。

他の言語を学んだことがある方は、「初めてのRuby」がおすすめです。薄い本なのですが、rubyらしい考え方のエッセンスが詰まっています。

rubyの文法や文字列操作、配列、メソッド定義などの基本的な内容に加え、ブロックやメタプログラミングの入り口まで含まれています。

基礎を固めたあとは「メタプログラミングRuby」がおすすめです。

例えばActiveRecordなど、rubyのよく使われるライブラリはメタプログラミング(通称:黒魔術)を駆使して書かれていることが多く、メタプログラミングの知識無しでは使いこなすことが困難です。

あとはせっかくherokuもあるしアプリケーションを書いてみるのがいいのですが、いきなりrailsにいくと覚えることの多さに挫折してしまうかもしれません。
個人的にはまずsinatraで作った簡単なマッシュアップ程度のアプリケーションを公開してみるのが手軽かつ面白いと思います。
例えば以下のようなアプリケーションを作ってみるのはいかがでしょうか?

  • ATNDのイベントを検索するサイト - APIはここ
  • 楽天やYahooショッピング, amazonを横断して商品検索ができるサイト
  • 自分のツイートからURL付きのツイートを抜き出すサイト
  • Instagramに投稿された写真をタグや位置情報をもとに検索するサイト

初級レベルではsinatraだとDBに接続するまでがちょっと難しいので、DBを使う段階になったらrailsやpadrinoに行くといいかもしれません。

DBを使うプログラムの場合、ブログや一行チャット、Todoを作ってみるのが定番だと思います。
ただ、ログインの機能をつけようと思うととたんに難しくなりますので、とりあえずbasic認証とか、認証無しで。

実際、一番いいのは教えてくれる人を早めに見つけることです。
身近でruby勉強会などが開催されていないか、ぜひ探してみてください。
あとはtwitterやfacebookなどで教えてくれる人を探すのもいいかもしれません。

知っておくべきライブラリやフレームワークの軽い紹介

アプリケーションを作ろうとしたとき、必ずしも全機能を自分で実装する必要はありません。すでに色んな種類の定番ライブラリがありますので、その辺をうまく活かしていくのも素早くアプリケーションを作るコツです。

基本編

RubyGems

ライブラリの管理ツールです。1.9以降はruby本体に付属しているので特にインストールせずに使えます。

$ gem search [検索文字列] -r # ライブラリの検索
$ gem install [ライブラリ名]
$ gem update # ライブラリのアップデート
$ gem uninstall [ライブラリ名]

Bundler

これもライブラリの管理ツールですが、アプリケーション固有で必要になるライブラリの管理に使います。
railsをやるときや、herokuにアップロードするアプリケーションを作るときに触れることになります。

簡単に説明すると、Gemfileというファイルにそのアプリケーションを動かすのに必要なライブラリを列挙します。
そしてbundle installコマンドでそれらのライブラリがインストールされます。
そのライブラリはカレントディレクトリ以下の任意のディレクトリにインストールすることができるので、システムにごちゃごちゃとライブラリがインストールされること無く、アプリケーションごとにきれいに管理できるという利点もあります。


rack

直接rackを意識することはあまりないかもしれませんが、sinatraやrailsといったWebアプリケーションフレームワークはこれを利用して作られています。
rackのおかげで、thinやpassenger, unicornなどのどのサーバーを利用してもちゃんとアプリケーションを動かせるわけです。

Webアプリケーションフレームワーク編

Ruby on Rails

言わずと知れた超有名ruby製フレームワーク。これを使いたいがためにrubyを勉強しようという方も多いのではないでしょうか。
簡単なブログ程度ならあっという間に作れるのですが、ちょっと踏み込むと高機能であるが故に覚えることもたくさんあります。

書籍もたくさんありますが、バージョンに気をつけて選んでください。今の段階だとおすすめは以下です。

あと、公式のGuidesは必読です。


Sinatra

非常にシンプルなフレームワークです。

railsで挫折してしまった人もこちらなら十分理解できるくらい覚えることが少なく、とっつきやすいです。

個人的には、これからプログラムを勉強してみたいという人にはこれを一番に推します。Webアプリの仕組みを勉強するのにもとても向いていると思います。
ちなみに次点はレンタルサーバーを借りることを前提としてPHPでしょうか。


Padrino

最近これをテーマとした勉強会も開かれ、勢いがあります。

railsでは大きすぎるし、sinatraではちょっと足りない、そんなニーズに応えるものです。管理画面が作りやすいのも特長ですね。

データベースアクセス編

ActiveRecord

railsの一部のように思われがちですが、単独で使うこともできます。なのでsinatraで利用することなどもできます。


DataMapper

特長はMongoDBやredisなどのNoSQLのアダプタもあることでしょうか。
ruby製の人気CMSであるLokkaでもこのライブラリを使っています。


Sequel

ActiveRecordやDataMapperよりももうちょっと生のSQLに近いAPIのライブラリという印象です。
SQLがわかっていると、とてもわかりやすいAPIだと思います。

cheat sheet


Mongoid

MongoDBを使う際、今一番使われているライブラリだと思います。

ほぼActiveRecordと同じようなAPIが準備されているので、すんなり使い始めることができます。
それでいて、ちゃんとEmbedded DocumentなどのMongoDBの特長も活かせるような作りになっています。


Redis

高機能NoSQLのRedisのアダプタです。

テンプレートエンジン編

ERB

railsのデフォルトのテンプレートエンジンがこれです。
PHPみたいに、HTMLの中にrubyのコードを混ぜて書くことができます。

<div id="profile">
  <div class="left column">
    <div id="date"><%= print_date %></div>
    <div id="address"><%= current_user.address %></div>
  </div>
  <div class="right column">
    <div id="email"><%= current_user.email %></div>
    <div id="bio"><%= current_user.bio %></div>
  </div>
</div>

Haml

慣れると簡潔にHTMLが書けるようになります。階層関係をインデントで表すので、あとからのメンテナンスもしやすいです。

好き嫌いはあると思いますが、僕はこれを使い始めたらhtmlを書くのがめんどくさくなりました。

上のERBのサンプルコードは実はhttp://haml-lang.com/から持ってきたもので、hamlで書くと以下のようになります。

#profile
  .left.column
    #date= print_date
    #address= current_user.address
  .right.column
    #email= current_user.email
    #bio= current_user.bio

Slim

Hamlから記号などを除いたらslimになるイメージです。
Node.jsでよく使われるjadeと似ているので、そっちもやっている人にはおすすめかも。

ちなみに、hamlっぽく#とか.とかを使って書くこともできます。

div id="profile"
  div class="left column"
    div id="date"= print_date
    div id="address"= current_user.address
  div class="right column"
    div id="email"= current_user.email
    div id="bio"= current_user.bio

Sass

CSSをよりスマートに書くための文法です。

Sassでは、hamlみたいにインデントで階層構造を表現するsassという書き方と、従来のCSSとほぼ同じように書けるscssという書き方の2種類があり、rails 3.1から標準でサポートされたのはscssの方です。

セレクタの入れ子ができたり、mix-inという関数みたいな仕組みや、変数をCSS中で使うことができるのが特長です。

同種のものにlessというものもあります。

テストフレームワーク編

rubyはソフトウェアテストの文化がとても深く根付いている言語だと思います。

勉強会などに参加しても必ずテストが話題にのぼるくらいです。テストでよく使われるライブラリのうち、いくつか定番を挙げます。

RSpec

現状、rubyでテストと言ったらこれがデファクトスタンダードのようになっています。うかつに検索すると古いサイトが出てきてしまいますので、これを学ぶには以下のサイトがおすすめです。

"RSpecの写経"と言われたら、上記のサイトのことです。一通りこなすといいと思います。

あとはRSpecのAPIなどは以下を見ましょう。

個人的にはRelishを一番頻繁に見ていて、モックを使おうとしたときにMocksを参照することがたまにある感じです。

追記: 上記、rubydoc.infoへのリンクが2.4.0という古いバージョンへのリンクになっていました。修正しました。


test-unit

他言語のxUnit(PHPUnitとか、JUnitとか)にあたるのがこれです。

ruby 1.8の頃は標準添付でしたが、今は代わりにminitestというのが標準添付となっています。

標準添付ではなくなってからも活発に更新されているようです。


shoulda

shoulda-matcherとshoulda-contextの2つのgemに分かれているのですが、Test::Unitでもcontextを使ってRSpecみたいにテストケースを整理することができたり、rails開発に便利なマッチャー(検証用のメソッド)が提供されていたりします。

僕は使っていないので詳しくわからないのですが、根強いファンがいるようです。


Capybara

ブラウザでの動作をエミュレートしてくれるライブラリです。テストフレームワーク?って感じですが一応ご紹介。

visit '/top'
fill_in_with 'email', :with => 'user@example.com'
fill_in_with 'password', :with => 'password'
click_button 'Login'

こんな感じに書けます。seleniumを使うことにより、実際にFirefoxが立ち上がって動いたりして、なかなか面白いです。


他にもmockのライブラリとかテストデータの作成に便利なライブラリとか色々ありますが、そこまで進む頃にはすでに初心者じゃないと思いますので割愛します。

情報の入手方法

オブジェクト指向スクリプト言語 Ruby リファレンスマニュアル

まずは公式のドキュメントです。

文法などの確認はこちらで。あと、標準添付ライブラリも便利なものがたくさんあるのでどんなものがあるのか、一通り見ておくといいです。


最速Rubyリファレンスマニュアル検索! | るりまサーチ

マニュアルの検索はこちら。


Rubyist Magazine

通称るびま。

Webで発行されているRubyist向け雑誌です。
技術的な情報のみならず、インタビューやエッセイが掲載されていたりもします。


The Ruby Toolbox

人気のあるライブラリを探すことができます。

最近リニューアルされて、カテゴリ検索に加えてキーワード検索もついて使いやすくなりました。

追記: Toolboxを間違ってToolkitって書いてました。ご指摘ありがとうございました。


RubyDoc.info

ライブラリのAPIドキュメントが見られるサイトです。個人的にとても重宝しています。


Ruby5

英語ですが、ruby関連の情報を流しているPodcastです。
英語の勉強を兼ねて通勤中によく聴いています。


RailsCasts

これも英語ですが、railsのスクリーンキャストです。
これもiPhoneに入れて通勤中に見たりしています。


あとは勉強会やコミュニティに参加するようになると、新しい情報や実務に基づいた詳しい情報なども入手することができるようになります。
あとはブログなどで自分からも情報を発信するようにすることで、色んな人とのコミュニケーションができるようになり、結果色んな情報が集まるようになったりもします。

あんまり優良な情報を発信しようと無理に意気込むのではなく、とりあえず自分が試してみたことやうまくいかなかったことなどを気軽にメモるようにしておくと、結構教えてもらえたりします。

コミュニティ/勉強会

ということで、コミュニティや勉強会です。

まずは 地域Rubyの会 を探してみるといいと思います。
まぁ、やっぱり首都圏が多いですよね。

遠方の方は、自分で始めちゃうのが一番いいのかもしれません。あとはオンラインでしょうか・・・。ちょっとオンラインで継続されているコミュニティの例を僕が知らないのでこの辺はよくわかりません。

僕は横浜在住ではないのですが、Yokohama.rbによく参加しています。片道1時間以上かかりますが。

rubyにこだわらずに勉強会に参加してみるのもいいと思います。そこから得られる刺激は他では得難いものですし、人とのつながりが増えていくのはとても楽しいことです。

勉強会を探すなら、IT勉強会カレンダーをチェックです。

あとはTwitter経由で勉強会の情報を得ることが多いので、ブログなどで見かけた活発に活動されている人を片っ端からフォローするのがいいのではないでしょうか。

まとめ

思いついたことをどんどん書いていたら結構長くなってしまいましたが、少しでも参考になりましたら幸いです。
ここに書いたくらいの内容を事前に知っておけば、突然rubyの人の中に放り込まれても話が全く分からなくてぼっちというおそれは無いと思います。

あとはブログ + twitter + githubは現代のWeb系プログラマにとっては必須だと思います。たとえ趣味のプログラムだとしても。

ブログは無料のレンタルブログでかまいません。プログラマにははてなダイアリーが人気です。もうすぐ"はてなブログ"になるそうですが。

勉強会などに行って名刺を交換しても、twitterとかfacebookとかのアカウントが書いていない場合はあんまりその後の交流が持てないことが多いです。
正直、twitterアカウントはメールアドレスよりも重要かもしれません。

ということで、このエントリをきっかけに自分でWebサービスを作ってみようと思う人や勉強会やコミュニティに参加してみようという人、面白いサービスが増えたりすると嬉しいなと思います。

第3回デザイナー向けプログラム部

開催してきました!

まとめは前回同様、GitHubのwikiにまとめましたのでご覧ください。

https://github.com/prog4designer/meetups/wiki/第3回

はじめての欧文書体 - 欧文書体の種類と歴史について

セリフ / サンセリフとありますが、その歴史の長さには大きな違いがあることを初めて知り、驚きました。
またTimes RomanやHelveticaとか、なんとなく使っていましたがそれぞれの書体にもやはり開発された背景や歴史、そして性格(見出し向きとか本文向きとか)があり、それぞれを知ることでWebのコンテンツにも活かせるのかな、と感じました。

同じ書体でも間隔や太さを変えるだけでも全然違う書体に見えるところも意外でした。

次回以降には実際にWebデザインに活かす方法なども話していただけるようで、そちらも楽しみです。

WebデザイナーのためのWeb(HTTP)入門

急遽資料を作っていただき、お話していただきました。

内容はHTTPの基礎を理解する、ということでしたがsinatraでその場で簡単なアプリを書いて、そのアプリに対してブラウザではなくtelnetコマンドを使って黒い画面でブラウザの行っている動作を再現する、というなかなか硬派な内容でした。

そこから派生してRESTfulやrailsの思想などの話にも話題が広がったり、とプログラマーから見ても大変興味深い内容でした。

今日お話しいただいたHTTPについてをもっと詳しく知りたい場合は以下の書籍が最適かと思います。

ライブコードレビュー

既にJSをバリバリと使っている@saucerjpさんですが、2本ほどJSで書いたプログラムを持ってきていただき、それをスクリーンに移しながらみんなで意見を出し合う、というコードレビューを行いました。

モジュール化に関しては一応プログラマとして色々アイディアを出させていただきましたが、そもそも今後の再利用性を始めからきちんと考えて組もう、という考えにご自分で至るあたりがすごいと思いました。

コードレビューの中ではJSの var self = this; のイディオムについてや、call(), apply()メソッドについての話、CoffeeScriptについての話までに発展して盛り上がりました。

次回以降の話

来月中旬 or 下旬に30人規模のハッカソンを企画しています。興味のある方はぜひGoogleグループの方に参加していただけると幸いです。

また1〜3回まで開催してみて、ここまでは開発環境構築やWebアプリの仕組みなどのWeb開発に必須の内容を発表メインの形式で活動を行ってきましたが、そろそろ実際に手を動かすような活動をもっと取り入れていきたいと考えています。
次回の第4回からは、例えばチャットを作る、掲示板を作る、twitter連携サービスを作る、といった簡単なテーマを設けて、少しずつ実践的なプログラミングをステップアップで学んでいける内容にしてみようかと思います。

なかなか全員のニーズを満たす活動というのは難しいですが、少しずつ内容を充実させてエンジニア・デザイナをつなぐ架け橋として機能する活動というかコミュニティを作れるように頑張りたいと思います。

#pyfes 2011.10に参加しました

Pythonを全然やっていないくせに、Python Developers Festa 2011.10に参加してきました。

rubyとpythonだとどちらもオブジェクト指向のスクリプト言語ということで特長がよく似ていますし、どちらか片方だけできればいいのかもしれませんが、他の言語の文化を学ぶことでさらにプログラミングへの理解が深まると思い・・・。

環境構築

席について、すぐにpythonの開発環境の構築を始めました。

最初はbrewでpythonをインストールしたのですがMacには最初からPythonも入っていて、よく見るとバージョンも2.7.1でbrewで入る2.7.2とあまり変わらないです。
なので、実際に環境構築に必要なコマンドは以下の2つくらいだったので楽々でした。

$ sudo each_install pip
$ sudo pip install virtualenv

ハンズオン

初心者ハンズオンもありそちらに行くべきか悩んだのですが、一応pythonもチュートリアル程度はやったことがあるので大丈夫かと思い、@voluntasさんが講師のdjango + heroku組へと参加しました。
djangoもインストールすらしてないのに参加して講師側のハードルを上げてしまいましたが、一応virtualenvのインストールやらgemのインストールで他の参加者の方のお手伝いもできたので良かったと思います。

virtualenvやheroku gemのインストールが終わった後は、Heroku 上で Django を動かすの手順に従ってコマンドを打っていくだけであっさりとできてしまいました。ネットワークの関係上、heroku run コマンドが実行できなかったのがちょっと残念でしたが、とりあえずトップページの表示までは問題なくできました。

やってみてしまえば簡単でしたが、なかなか実際にやってみるきっかけがなくてpythonはほとんど触らずじまいだったので、きっかけを得ることができてとても良かったです。

午後の部

発表を聴きながら、Objective-Cを書いてiPhoneアプリの開発を勉強していました。
あとは初心者ハンズオンの資料が公開されていましたので、一通りやってみました。

発表の方はpythonの話もありましたが、ネットワーク、hadoop、DBなど話題が幅広く、今まで参加した勉強会の中で一番置いてけぼり感を感じるものでした。まだまだ勉強することたくさんあるなぁと感じました。

全体を通じて

ハンズオン、発表を通じてgitの話題も多かったのが印象に残りました。
個人的にもgitを教える活動をしていたりするので興味深く聴いていました。

gitも多人数で使いだすとやはりgit-flowとかgit-dailyみたいなブランチの扱い方というのも考える必要があるのですね。

自分のチームはまだ開発者も4人と少なく、幸いgithubを使った開発ができており、さらに幸いなことに全員がコマンドラインからgitを使うことに不自由しないスキルを持っているため、あまり意識したことがありませんでした。

「基本的にトピックブランチを切って、masterにマージをするときにはpull request使いましょうか?」程度の打ち合わせでブランチの運用の仕方が決まっています。

今後人数が増えたり運用フェーズに入ったりしたときには、多分もう一度考える必要があると思うので、参考にしたいと思います。

参加している方が多様なのも印象に残りました。pythonの方ばかりかと思いきや、組み込み、java、PHPなど色んな方と出会い、情報交換をすることができました。

あと女性も多かったです。IT系の勉強会としては珍しいのではないでしょうか。女性枠のおかげなのでしょうか?

ということでまとまりなく書いてきましたが、楽しい勉強会を企画してくださった@voluntasさんはじめ、スタッフの方々、そして素晴らしい会場を提供してくださったオラクルさんに感謝したいと思います。ありがとうございました。

Yokohama.rb 第13回に参加しました

もう何回目になったのかあまり覚えていませんが参加してきました。

発表(転職とコミュニティ)

今回は発表の時間を頂いたので転職活動を通じて感じたことなどを発表してきました。
技術的なネタも一応考えてはみたのですが、転職ラッシュの今しか話せないかな、と思いこのネタです。

  • 資料
  • 動画 (miyohideさん、ありがとうございます)

質疑応答でもお話ししたのですが、決して転職という選択肢が全員にとって良いものとは限りません。現在転職を検討されている方も、ぜひ慎重にじっくりと考えて欲しいと思います。

Yokohama.rbメンバーはちょうど転職ラッシュの最中です。みなさんがよりよい仕事に就けるよう応援したいと思っています。

レシピブック読書会

この本をみんなで読み進めています。

これが予想以上に濃いんですよね。一人で読んでいると読み飛ばしてしまうようなところまで、深く掘り下げることができます。

少し読んではコードを書き、議論し、そしてまた進むという。

まさに初心者にとっても上級者にとっても面白い企画になっていると思います。

スティーブ・ジョブズの演説

追悼として、伝説のスピーチとされるスティーブ・ジョブズのスタンフォード大学での卒業式式辞をみんなで鑑賞しました。

http://www.youtube.com/watch?v=OaMT8fZpEXA

僕は今回初めてこの動画を見たのですが、「点をつなげること」、「愛と喪失」、「死について」いずれのテーマも経験に基づいた話で、非常に勇気づけられ、背中を押してもらえるような内容でした。

  • 「今日で死ぬとしたら、今日は本当にすべきことをするのか。その答えがNoである日が続くようなら、何かを変える時だ。」
  • 「他人の人生を生きないこと」

何かを決断するとき、勇気をもらえそうな言葉ですね。

ところで、転職の話題の後でこの動画を見るとうっかり転職してしまいそうな人が多発しそうです・・・。

TDDBC横浜

TDDBC横浜 にスタッフとして参加することにしました。
うちから会場まで1時間半以上かかってしまい結構遠いのですが、いつも定員オーバーでなかなか参加することのできないTDDBCに確実に参加するチャンスでもあると思いますし。

幸い業務でrspecを使用していますが、この機会にrspecの復習をしておきたいと思います。

rbenv + ruby-buildのインストール方法

rbenv, TextMateで開発環境をシンプルにしてみたでも書いたrbenvですが、最近rvmからの乗り換え先として検討している方が多いようです。

僕もあれから1ヶ月半ほど継続して使っていますが、特に困ったこともなく快適に使っています。

そこで、2011年10月5日現在の最も簡単だと思われるrbenv + ruby-buildの導入方法を書いてみようと思います。

rbenv, ruby-buildのインストール

$ brew install rbenv
$ brew install ruby-build

Homebrewから入れるのが一番簡単だと思う。

rbenvの設定

.bash_profileに以下のように書きます。

eval "$(rbenv init -)"
source ~/.rbenv/completions/rbenv.bash

if以下はタブ補完のための設定です。シェルでrbenv まで打ってタブキーを打つとサブコマンドが保管されますので便利です。

zshの人は.zshrcへ多分こんな感じ。

eval "$(rbenv init -)"
source ~/.rbenv/completions/rbenv.zsh

rubyのインストール

ここではとりあえず1.9.2-p290を入れてみます。
rbenv installコマンドはruby-buildをインストールすることによって使えるようになります。

$ rbenv install 1.9.2-p290
$ rbenv global 1.9.2-p290
$ rbenv rehash
$ ruby -v
ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-darwin11.1.0]

新しいバージョンのrubyや、バイナリを提供するgem(sassとか、railsとか)をインストールした後は$ rbenv rehashして下さい。そうしないとコマンドが見つかりません。

ちなみに、$ rbenv installだけ打ってエンターキーを打つとインストールできるバージョンがずらっと表示されます。

また、MacVimを使っている場合など、libruby.dylibが欲しい場合は./configure時に--enable-sharedを指定する必要があります。これは、"CONFIGURE_OPTS"という環境変数に指定することで可能となります。

$ CONFIGURE_OPTS=--enable-shared rbenv install 1.9.2-p290

簡単な使い方

$ rbenv global 1.9.3-rc1 # 使用するrubyのバージョン切り替え
$ rbenv local 1.9.3-rc1 # このディレクトリ以下で使用するrubyのバージョン切り替え
$ rbenv versions # インストールされてるrubyのバージョン一覧
$ rbenv version # 現在有効になっているrubyのバージョン

$ rbenv localするとカレントディレクトリに.rbenv-versionというテキストファイルが作られます。rvmで言う.rvmrcみたいなものですね。

公式リポジトリ