Git 道場に参加して思ったこと

縁あって Git 道場にチューターとして参加したので、思ったことなどを書いておきます。

Git道場 - Git道場 (Git Dojo) | Doorkeeper
Git道場 - ホーム | Facebook

参加した理由

実は Git 道場というイベントのことは結構前から知っていたけど、扱う内容がそんなに難しくなさそうだったので参加申し込みをするつもりはありませんでした。ただ、申し込みを開始したのを偶然 Twitter で見かけたので、どれくらいの申し込みがあるのか気になって申し込みページを何度かリロードしたりして。で、最終的には上限の2倍弱の人数が申し込んでいて、結構人気があることに少し驚いたり。

その後、主催の方から「チューターの人数に余裕があれば、枠を増やすかも」という発言があったので、キャンセル待ちも多いことだしチューターやるか、という気持ちで応募しました(チューター募集は Git を使って行われていて、正しく応募できないと reject されるという形式でした)。

チューターとしての準備

当日、実技の時間が設けられていて、チューターは実技の際に参加者の質問に答えるなどの役割を担うため、実際の実技の内容について事前に共有を受けて自分たちで試したりしていました。難易度だったり進め方だったり意見を交わして、内容(主に実技でやってもらうことの順番)を少し変えたりしました。

個人的には、結構簡単な内容だし、参加者の大半はこれくらいできるんじゃないかなー、などと思ったりしてました。

実際やってみて

Git 道場は「道場」というスタイルで開催されました(タイムテーブルは上記ページから確認できます)。

『Git によるバージョン管理』の執筆者でもある岩松さん、小川さんの講義があり、その後に実技として実際にグループ(3〜6人)で Git を使ってみる、という内容です。

参加者の中には、「むしろチューターで参加してください」というくらい詳しい方もいらっしゃいましたが、大半は「使ってる(使ったことはある)けど、一人で使っている」という方でしたので、実技の内容は conflict や merge/rebase を経験する丁度良いものになっていたと思います。講師陣の豪華さと実技の内容を考えれば、多くの方が満足できたのではないかと思っています。

あと、皆が実技をやってる横で行われた「Git ラジオ」なるニコニコ生放送の内容はとても面白かったです。チューターだったので、ちょっとしか聞けませんでしたが(同じ部屋でやっていたので、手が空いているときは近くで放送の様子を見れた)。

手を動かすということの重要さ

で、 Git 道場に参加して、強く思ったことが一つあります。

それは、ソフトウェアエンジニアリングの世界でも「実際に手を動かすことがとても重要」だということ。

たとえば、今回の内容に関していえば、『入門 Git』『Git によるバージョン管理』を読んでいれば知っていることばかりでした。また、インターネット上で検索すれば merge/rebase について解説しているページはそれなりに見つかります(もちろん日本語で書かれたものも)。
なので、きっと今回参加された方で、これらの本も Web ページも見たことがない、という方はほとんどいないと思います。

rebase するとブランチがどうなってコミットがどうなって、ということは調べれば解説されていますが、実際に普段から使っている方以外で、それをちゃんと理解している方はほとんどいなかったのではないでしょうか。実際に使ってみようとすると、どうしたらいいのかわからなくなったり、操作を間違えてエラーが出てしまって対処に困ったりした、という方もいると思います。情報は探せばたくさんでてくるけど、それらに対して実際に手を動かして使った人とそうでない人の理解の差はきっと大きなものなのでしょう。

言い換えれば、本を読んだり、あるいは勉強会に出席して話を聞くだけでは真には理解できないことがある、ということだと思います。
写経は意味があるし、己の理解のための車輪の再発明は無駄ではないのです(生産性とかは別の話です)。

そういう意味でも今回のイベントで最も重要だったのは、やはり実技の時間だったのではないでしょうか。あの実技を経験することによって、 merge と rebase の違いを理解できた方は多かったと思いますし、グループ内でも Git に詳しい方からそうでない方への解説があったりして、得るものが多かったと思います。

Git 道場は自分にとっても良いイベントでしたし、また開催されるのであれば、なんらかの形で参加したいなーと思っています。その際は、 Git に興味がある方は是非参加してみてください。

TOLOT を使ってみた感想など

TOLOT とは

 TOLOT とは、スマートフォンや PC からフォトブックを作成するサービス、あるいはそのサービスによって作られたフォトブックのことです。

高品質フォトブック・写真プリントサービス 送料無料 250円〜 TOLOT

 今年の夏頃に iPhone アプリとして公開されたのですが、今回このサービスを使う良い機会があったのでちょっと試してみました。

どういう使い方をしたか

 友人の結婚式 & 披露宴の写真を新郎新婦と列席した友人たちにフォトブックとして送るために使いました。皆から写真をいただき、(当時は PC 版はなかったので) iPhone に写真を転送し、 iPhone から注文するという流れ。

良かった点

1冊500円の手軽さ

 部数が多くなければ1冊500円はとても魅力的です。実際、これより高ければ今回試さなかったかもしれません。今回は2種類7冊ずつで14冊お願いしましたが、10000円でお釣りがでるのであまり負担になりませんでした。

結構早い

 サイトには5日〜2週間程度と書いてありますが、実際早い人で注文の5日後、遅い人でも2週間以内には届いていたようです。注文が早ければ熱が冷める前に届きます。

写真だけでなく文字も入れられる

 中には最大で62枚の写真を入れることができますが、一部のページを何もなしにしたり文字を入れることもできます。写真の掲載順に合わせて適宜文字を入れることでアクセントをつけたりできます。

残念だった点

選択できる写真が多いとアプリが落ちる

 最新のバージョンでは改善している可能性がありますが、今回750枚の写真から使いたいものを選ぶ際にプレビューしてから写真の一覧に戻るを何度か繰り返しているとアプリが落ちてしまい注文まで行けませんでした。しかたないので、750枚のうち掲載する60枚程度だけを抽出して、それだけを iPhone に入れ直し、そこから写真を選んで注文しました。

製本時に綴じてある部分が見れない

 写真は縦横比を変えずに紙面上で最大になるように印刷されているようですが、この時に見開きの中央に相当する部分(左ページの右端、右ページの左端)が少し見えなくなってしまいます。写真を選ぶ際にはどこまでが見えるのかわからなかったので、集合写真で端の人が見えなかったり、ということがありました。プレビューの時点で補助線のようなものが出ると嬉しいですね。

できれば欲しい機能

画像の回転

 iPhone を横向きにして撮った写真が90度傾いて保存されていたりすると、写真を回転させる必要があります。 TOLOT アプリ上ではこれができないため、写真を回転させるためにはその機能がある iPhone アプリを使うか一度 PC に転送して回転させてから iPhone に戻す必要があります。90度、180度、270度回転があるといいなあ、と思います。

写真内に文字を入れたい

 これは TOLOT のサービスの手軽さに合わないかもしれませんが、写真に一言そえたい時に、ページの端に文字を入れたり、写真上に白抜き文字などを入れれるといいなあ、というのはちょっと思ったところ。

表紙に写真を使いたい

 現在のところ、写真は既存のデザインから選ぶようになっていると思いますが、個人的には表紙にも写真を使えたらなあ、と思いました。その方がオリジナルのフォトブックという感じがでますし。でもまあ、表紙のデザインが煩雑になりますが。

感想

 内容も金額も良いサービスだし、今後も機会があれば使うと思います。写真の回転や画像の加工などしたくなることもありますが、今は PC 版が出ているので PC で加工→注文という流れがより簡単にできそうです。

 また、フォトブックといっても写真である必要はないので、色んな使い方ができると思います。謎を仕込んだフォトブックを作って、一人500円で参加できる謎解きイベントとか楽しそうだなあ(なんて妄想してみたり)。

Perl 6 の Sigil と特殊変数

はじめに

 この記事は、 Perl6 Advent Calendar 2011 (日本版)の18日目の記事です。

 以下で説明するもののうちのいくつかは、環境によってはまだ動かない(未実装)こともあります。

Perl6 の Sigil

 Perl の見た目にも表れる特徴の1つとして、 Sigil があります。Perl 6 の Sigil は、ベースは Perl と同様ですが、一部に変更があります。

Perl と同様のもの

 基本は Perl と全く同じですので、安心して書いていただけます。

スカラ変数 $
配列変数 @
ハッシュ変数 %
Perl と異なるもの

 配列とハッシュの内容へのアクセス少し変わりました。

Perl Perl6
配列の要素へのアクセス $x[n] @x[n]
ハッシュの要素へのアクセス $x{key} %x{'key'}

 ハッシュにアクセスするキーの文字列は明示的にシングルクォーテーションで囲う必要があります。 %x{'key'} は %x と書くこともできます(<>の場合シングルクォーテーションは不要です)。

twigil

 twigil は2つの記号( sigil )を用いた表記です。クラスのフィールドのアクセシビリティは twigil によって設定できます。

$!private # 2つ目がエクスクラメンションの変数はクラス内からのみアクセスできる
$.public # 2つ目がドットの変数はクラスの外からでも参照できる(入力はできない)
$.public is rw # クラスの外から入力したい場合は is で writable 指定を行う

 $^ と $: は引数として使えます。 $^ は変数名の並び順(辞書順)に、 $: は変数名指定で扱えます。

sub name {
     $:b ~ ',' ~ $:c ',' ~$:a;
}
sub dict {
     $^a ~ ',' ~ $^c ~ ',' $^:b;
}

say name(:c('az'), :b('AZ'), :a('09')); # AZ,az,09
say dict(1, 2, 3); # 1,3,2

 $? はコンパイル時に値が確定する変数です。たとえば $?FILE でファイル名が、 $?LINE で行番号が取得できます。$= は POD の内容を取得できます。

 最後に、動的かつグローバルな変数を表す twigil として $* があります。基本的なものをいくつかあげると、

@*ARGS コマンドライン引数
$*IN 標準入力
$*OUT 標準出力
$*ERR 標準エラー出力
@*INC モジュールのパス一覧

 などがあります。

特殊変数

 先にいくつか出ていますが、代表的な特殊変数について、 Perl との 違いをリストアップします。

Perl Perl6
STDIN $*IN
STDOUT $*OUT
STDERR $*ERR
$_ $_
$_[1], $_[2] ... $^a, $^b ...
$& $<>
@ARGV @*ARGS
@INC @*INC

 他にもたくさんありますので、必要に応じて Synopsis 28 をご覧ください。

余談

 先のリンク先を見てて思いましたが、コードゴルフで有効だった特殊変数のいくつかが長くなりすぎちゃって使えなくなってますね。

Perl 6 のテストを書く

はじめに

 この記事は、 Perl6 Advent Calendar 2011 (日本版)の7日目の記事です。

テストは重要です

 Perl 6 では Test モジュールが用意されています。 Test モジュールが提供するテスト機能は、 Test Anything Protocol ( TAP ) の形式で使用できます。

 ご存知の方も多いかと思いますが、 Perl 5 にも Test::More というモジュールがあり、 TAP 形式のテストを簡単に書くことができます。 Perl 6 の Test も、基本的には Perl 5 のテストと同じように書くことができます。

Test モジュールの基本的な機能

 まずは簡単なところから。 ok() と nok() は第一引数が真か偽かを判断します。

ok $cond; # $cond が真なら OK
nok $cond; # $cond が偽なら OK

 値の比較をしたい時は、 is() と isnt() でできます。

is func($param), 'expected'; # func($param) の戻り値が 'expected' なら OK
isnt func($param), 'expected?'; # func($param) の戻り値が 'expected' でなければ OK

 データ構造の比較は、 is_deeply() でできます。

is_deeply $struct, $expected;

 オブジェクトが想定するクラスのインスタンスかテストしたい時は、 isa_ok() が使えます。

isa_ok("string", Str); # "string" オブジェクトは Str クラスのインスタンスなので OK

 クラスの継承関係も適切に判定できます。

class Parent {};
class Child {};
isa_ok(Parent.new, Child); # not ok
isa_ok(Child.new, Parent); # ok

今はまだ使えない機能

 将来的には実装される予定ではありますが、まだ実装されていない機能もあります。 Test::More にもある like() や unlike() 、 use_ok() などがそうです( rakudo-star-2011.07 で確認)。

さいごに

 言語を問わず、テストは大切です。だからこそ、テストが書きやすいことも重要ですし、テスト関連の機能は充実していることが望ましいでしょう。

 ここでは簡単な説明しかしていませんが、 Perl 6 でのテストについては、過去に Day 4: Testing | Perl 6 Advent Calendar でも書かれています。

 私は使ったことがありませんが、 Perl 6 Modules Directory には、テスト関連のモジュールもいくつかあります。先に説明した機能やこれらのモジュールを用いることで、より良いテストを行いましょう。

スタート Perl 6

はじめに

 この記事は、 Perl6 Advent Calendar 2011 (日本版)の1日目の記事です。

Perl 6 をはじめよう

 Perl 6 は、オブジェクト指向スクリプト言語の一つです。2000年に Perl の次期メジャーバージョンとして設計が始められましたが、現在までの Perl (〜 Perl 5 ) とは互換性がないため、今では Perl (〜 Perl 5 ) とは異なる系統のものとして位置づけられています。ですので、 Perl 5 のユーザが Perl 6 を学ばなければならない、ということはありません。

 Perl 6 は設計開始から11年になりますが、未だ完成されていません。 Perl 6 を実行するための環境が現在、いくつか開発されています。

Pugs

 PugsHaskell で実装されたインタプリタコンパイラです。 Pugs については、 http://hackage.haskell.org/package/Pugs から入手できます。

Rakudo

 Rakudo は元々、 Perl 6 on Parrot と呼ばれたプロジェクトから生まれたもので、開発中の Perl 6 実装の一つです。 Rakudo は2010年の7月に Rakudo Star と呼ばれるアーリーアダプター向けの(これまで以上に)実用的な実装をリリースし、その後定期的に新しいバージョンをリリースしています。現在入手可能な Rakudo Star のパッケージは https://github.com/rakudo/star/downloads/ にあります。より最新のものを入手したい場合は https://github.com/rakudo/rakudo からソースを手に入れてビルドするのがよいでしょう。

Niecza

 Niecza は、 .NET 環境で使える Perl 6 の実装です。 Niecza は Rakudo Star ではまだ実装されていないいくつかの機能を使うことができますが、逆に Rakudo Star では実装されているいくつかの機能はまだ使えません。 .exe で提供される Perl 6 としては Rakudo Star (2011/04) か Niecza のどちらかになるでしょう。 Niecza のパッケージは https://github.com/sorear/niecza/downloads から入手できます。

どれを使えば良いか

 これは環境と好みに寄るところが大きいと思います。それぞれ実装済みの実装がバラバラですし、インストールに必要な環境も異なります。好きなものを試してみるのが良いと思います。ちなみに私は Rakudo Star を使っています。

Perl 6 を試してみる

 実際に Perl 6 のコードを書くにあたって、色々と情報が必要になるかと思います。そこで参考になりそうなサイトをいくつか列挙しておきます。

Perl 6 Advent Calendar | Something cool about Perl 6 every day

 2009 年から毎年 Advent Calendar が実施されているので既に50以上の記事があがっています。もちろん今年もあります。

JPerl Advent Calendar 2010 Perl6 Trac

 昨年実施された日本語の Perl 6 Advent Calendar 。こちらは13日分しか記事がありませんが、入門としては一番やさしいと思います。

UsingPerl6-draft

 Rakudo Star のパッケージに同梱されている PDF です。英語ですが比較的読みやすいので英語が苦手な方にもお勧めです。

http://d.hatena.ne.jp/uasi/searchdiary?word=%2A%5BPerl6%5D

 日本語で Perl 6 の記事がたくさん読めるブログ。コードもたくさん掲載されているので参考にしやすいと思います。

http://perlcabal.org/syn/

 Perl 6 の公式な仕様一覧。仕様であって、各実装でその通りに動くことが保証されているわけではありませんが、迷ったらここの情報が一番正確です。ただし、情報量が多いので欲しい情報を探すのは簡単ではありません。

YAPC::Asia TOKYO 2011 の個人的メモ

 前夜祭から後夜祭(非公式)まで楽しませていただきました。今年もとても楽しかった。運営関係者の皆様、本当にありがとうございました。

 見れなかったトークもたくさんあって、それが動画であがっているのだから、見ない手はない。が、まだ今はそのための時間が確保できないので、後で見るために URL をメモっておこう。

YAPC::Asia Tokyo 2011 Timetable

 今年は知らない人やネット上でしかやり取りをしたことのない人とのコミュニケーションが比較的多くとれてよかった。一番の収穫はこれかな。

 あと、何人かの方に「今年は Perl 6 の話はしないの」的な言葉をいただきました。本当にすいません。まあリジェクトされましたので……。 Perl 6 はとても興味深いと思ってるけど、今必要とされてるのはそれじゃない、ということも理解しているつもりではある。

 あとまあ、自分のプライベートな事柄についてありがたいお説教をいただきました。前向きに検討します。いや、ほんと。

 どのトークが良かったとか、そういうのは動画全部見てから考えたいので書くつもりはありませんが、 takesako さんのトークは内容も話し方も良かったです。ちょっと学生の頃を思い出したり。

 来年もどうやらあるみたいなので、楽しみにしておきます。あと、1年の間に精進しておきます。いろいろと。

git submodule で苦労した記録

 git submodule というコマンドを使うことで、レポジトリにサブモジュールを追加・調査することができる。

 僕が今回使ったのは、 Vimプラグインを pathogen.vim を用いて Git で管理するため。

 正確には、 pathogen.vim を使い始めたのは半年ほど前のことなのですが、その時は特に問題は起きなかった。 pathogen.vim を用いたプラグインの管理については、ググればたくさん情報が出てくると思うので省略。

git submodule を使うために

 問題がおきたのは、新しい環境で Vim の設定を行った時。 Git のレポジトリで管理しているプラグインを取得するために、以下のコマンドを実行しました。

git submodule update --init

 ここでエラーが出た。どうやら git submodule が使えない様子。

 この環境は Debian GNU/Linux 5.0 (Lenny) だった。 Lenny で aptitude install git-core をしたときに入る Git のバージョンは 1.5.6 だが、実は git submodule は、古い Git では動かない。バージョン 1.7.0 以降で使える機能ですので、バージョンをあげる必要があります(正確にはバージョン 1.6.6 くらいから使えるらしい)。 1.7 は Lenny では aptitude でインストールできないバージョンなので、手動でダウンロードしてきて、インストールする必要あり。

 僕はここで、何も考えずに ./configure して、 make && make install してしまったため、余計に時間をかけてしまった。

 インストールしたあと、 /usr/bin/git をシンボリックリンクとして追加。そして git submodule update を再実行。しかしやはり上手くいかない。 HTTPS でこけていたので、 SSL 周りが怪しいかと思い、 curl や openssl などを調べるはめに。それでもわからなかったので、同じような現象で困っている人を探していろいろ検索。検索して見つけた中で、同じと思われる現象について書かれたものをいくつか見つけ、日本語で書かれているものについて全部読んでみたけど、解決策は得られず。結局、一晩置くことに。

 次の日、自分の危うい英語力で英語サイトを読んでいって、やっと原因を理解した。簡単に言うと、 /usr/bin/git 以外の実行ファイルが最新化されていなかったのが原因だった。 /usr/bin 以下には git* な名前の実行ファイルがたくさんあります。これらをちゃんと最新化しないといけない。ということで、今入っている Git を remove して、再度インストール。今度は /usr/bin 以下に関連ファイルがインストールされるように。

 そして再実行。やっと submodule が正しくダウンロードできた。我ながらしょぼいミスだが、いつかまたやったりしたら(同じミスをするつもりはないけど)流石に自己嫌悪しそうなので、一応記録しておく。