函数プログラミングの集い 2012 in Tokyo

関数型言語は実務では全く使った事無いですが、1年ほど前に実践F#を買って、とりあえずひと通り読んだ程度の人間ですが面白そうなので参加しました。
名古屋のかたも多く参加されていたそうで。
F#導入についての話とか、Erlangでネットワークソフトを開発している方は100%テスト自動化していたり、Haskellで個人用Webサイトをつくってしまったり、Web画面の状態管理にパターンマッチうまいことつかってみたりと、いろいろな話を聞けて楽しかったです。
早いとこF#を実務で使ってみないとな。

第5回アジャイルサムライ読書会inファンコミュニケーションズ道場

今回が最後の回。
第五部ということで、技術的なところですね。
自動テスト、リファクタリング、TDD、CIという4つの章。


今回は複数のテーブルにわかれるのではなく、1つのテーブルでのディスカッション。
ファンコミュニケーションズさんでCIやTDDを導入されたレポートの発表があり、それを受けての議論もあり興味深かったです。
あと最後にはオフレコで実際の案件でのJenkinsやソースを披露した人もいました。


毎回、場所の提供、段取り準備、飲食(!!ピザやビールがついてくる!!)まで用意いただき本当にありがとうございました!
最後に主催の@shitai246_さんが、あまり社内の人間を巻き込むのには成功しなかったと言っていましたが、全5回、来るたびに社員の人が増えている(それも社員じゃない立場で道場に参加していた人が)感じで、リクルートツールとしては十分効力を発揮したのでは、と思いました。
ファンコミュニケーションズさんの社員取り込み力、ぱねえっす。


今後もいろいろな勉強会をされるそうです。
直近はScala入門の勉強会をする予定とのことでした。おそらく@fantechstudyにて告知されるとのことで、すでにでてますねー。

2012前半ふりかえり

すっかりはてな記法を忘れてしまうくらい更新していない。。。
腰を怪我して2〜3週ほど会社も休み、幾つか勉強会キャンセルした。

  • デブサミ参加
    • 及川さんの話を初めて聞けて良かった
    • 角谷さんの話を聞けずに残念
  • QConTokyo参加
  • AWS、DynamoDBハンズオン参加
  • AgileSamuraiファンコミュニケーションズ道場1〜4参加中
  • Jenkins Conf.
    • 申し込みするも家族が風邪のため不参加

こんな感じでした。
これからは通常運転に戻します。
買ったけど読んでない本も結構あるしなー。


あ、そうそうC# AdventCalendar2011のエントリが電子書籍になりました。
それもTDDのにも番外編として載っています。すげー。
https://gihyo.jp/dp/sp/advent2011/G11C22
https://gihyo.jp/dp/sp/advent2011/G11C28


C#はneueccさんのModern C# Programming Style Guideが必読です!
TDDはさすがに皆さん良記事ばかり。一緒に載ってしまっていいのだろうかという感じです。


仕事のほうは、1年ほどやってきていたものがリリースされてとりあえずは区切りができた感じ。
それと大量データ(世間で言うほど大量ではないですが)の集計をしなきゃいけない案件をAWSつかって
やりたいなーというところに仕掛かっているところ。
あと1,2ヶ月で動かさないと。

メッセージボックスのテスト(Windows.Forms)

先々週末に腰を怪我して自宅療養中のmasakitkです。
そういえばメッセージボックスのテストについては、一部分だけを追記しただけで、NUnitFormTestを継承してる部分とか何も説明していなかったので、http://d.hatena.ne.jp/masakitk/20111218/1324234876で作ったgithubリポジトリにテストを追加しました。
ちょっとテストもリファクタしてます。

テストコードはこんな感じになりました。

using System.Windows.Forms;
using NUnit.Extensions.Forms;
using NUnit.Framework;
using TddFizzBuzz;

namespace TddFizzBuzzTest
{
    [TestFixture]
    public class TddFizzBuzzTest : NUnitFormTest
    {
        [Test]
        public void Test01_10までのFizzBuzz結果の確認()
        {
            var target = new FizzBuzzForm();
            target.Show();

            new TextBoxTester("maxNumberTextBox", target).Enter("10");
            new ButtonTester("fizzBuzzButton", target).Click();
            var dataGrid = new Finder<DataGridView>("fizzBuzzDataGridView", target).Find();

            var expectedList = new[] {
                new { Number = 1, Text = "1" },
                new { Number = 2, Text = "2" },
                new { Number = 3, Text = "Fizz" },
                new { Number = 4, Text = "4" },
                new { Number = 5, Text = "Buzz" },
                new { Number = 6, Text = "Fizz" },
                new { Number = 7, Text = "7" },
                new { Number = 8, Text = "8" },
                new { Number = 9, Text = "Fizz" },
                new { Number = 10, Text = "Buzz" },
            };

            foreach (var expected in expectedList)
                AssertForOneRow(dataGrid, expected.Number, expected.Text);
        }

        [Test]
        public void Test02_数値以外の入力時をチェックしているか()
        {
            バリデーションメッセージ確認("aaa", "1以上の数値を入力してください。");
            バリデーションメッセージ確認("01a", "1以上の数値を入力してください。");
        }

        [Test]
        public void Test03_0以下の入力時をチェックしているか()
        {
            バリデーションメッセージ確認("0", "1以上の数値を入力してください。");
            バリデーションメッセージ確認("-3", "1以上の数値を入力してください。");
        }

        private void バリデーションメッセージ確認(string text, string message)
        {
            var target = new FizzBuzzForm();
            target.Show();

            DialogBoxHandler = (title, handle) =>
            {
                var messageBox = new MessageBoxTester(handle);
                Assert.That(messageBox.Text, Is.EqualTo(message));
                messageBox.ClickOk();
            };

            new TextBoxTester("maxNumberTextBox", target).Enter(text);
            new ButtonTester("fizzBuzzButton", target).Click();
        }

        private static void AssertForOneRow(DataGridView dataGrid, int rowIndex, string expected)
        {
            Assert.That(dataGrid["FizzBuzzValue", ToZeroBased(rowIndex)].Value, Is.EqualTo(expected));
        }

        private static int ToZeroBased(int rowIndex)
        {
            return rowIndex - 1;
        }
    }
}


デブサミも1日半参加したんだけど、まだレポート書いてないや。
(一応メモとったノートが会社にあるからという言い訳)
Jenkins勉強会は補欠から繰り上がったけど腰の怪我のため参加できず。

第8回スクラムプロダクトオーナー勉強会

第8回スクラムプロダクトオーナー勉強会


参加してきました。
第4回に参加したあと、ちょっと出れてなかったのですが、今回単発での川口さんの仕様化のワークショップということもあり当日申し込みで参加することに。
ワークショップ中心なので、メモはなく記憶を頼りに書きます。

すでにshio2006さんがレポート書かれてますね。


まず昨年参加した時とは場所が変更し、竹芝から西新宿になりました。
自分としては会社から近くなったので参加しやすくなったのだけど、1名竹芝に行ってしまっている人がいました。(無事、途中参加できましたが)


まずはNHKのプロフェッショナルの動画を見ました。
山田日登志さん(トヨタ生産方式大野耐一さんのお弟子さんとのこと)の回で、工場のムダをなくして、沢山の赤字工場を黒字化してきた方なのですが、そのやり方を取り上げていました。
(ちなみにプロフェッショナルは、この前録画してあったGoogleの及川さんの回を見て、これもすごく沢山の示唆に満ちているなと思った。)


スタジオで一般的な工場の配置図の例について、工場のムダを指摘していましたが、具体的には

  • 荷物が置いてあるところから、作業する場所まで荷物を移動する
    • →そもそも近いところに置いとけ
  • 材料を機械にて加工して、処理が終わるのを監視&加工済仕掛品をラインに流す人を貼りつけている
    • →機械がやってるんだから常に監視する必要はない。ラインの近くで加工すればその人いらないかも
  • ラインから仕掛品をライン脇の作業台似とって作業し、作業後ラインに戻す
    • →体の向きを変えないで、ラインの上に作業台を作り、そこで作業できるようにすれば作業時間短縮できる
    • 1個の作業の短縮時間は少なくても積み上げれば大きい。(映像の例では2%程度は改善できるとのことでした)
  • ラインの終わりから、トラックに積むため台車で運搬している
    • →ラインの終わりをトラックに積む場所の近くにすれば運搬しなくて良い
  • トラックに積むための完成品がトラックの近くに沢山置かれている。
    • →実際にその日に積むトラック毎に仕分けしておいておけば効率的。
    • また、その日に積まない分は不要


といったものをあげていました。


こんな感じで、システム開発の日常の業務にもいろんなムダがあるんだろうなー、とか思いながら見てました。
システム開発の世界で、山田さんみたいな存在はいるのだろうか?
まさに川口さんみたいなアジャイルコーチ的な方かな?もしくは各ベンダーの精鋭の火消し部隊?


そして最終的には指示待ちではなく自己組織型のチームにするというところがまさにアジャイルと同じだなと思いました。


その後、川口さんから、じゃあシステム開発の一般的な工程の流れにおいて、無駄はあるだろうか?ということで挙手で意見を募りました。

  • 詳細設計書はいるの? 使われないことが多いし誰のためのドキュメントなの?
    • 目的がよくわからないドキュメントができてしまうことも
  • 上の人のレビュー待ちで作業が滞ることがある。
    • 責任所在明確化としての上の人の承認行為と、2人で不備をなくすためのチェックと2つの目的をこのレビューでやっているのでは?との指摘。後者は上の人のレビューでなくてもよい?
  • 大量のレポーティング
    • レポーティング自体は、価値を生み出さない
  • ちゃぶ台返し>ユーザテストの時に、これ違うんだけどといって手戻りになる。
    • 早めの段階からユーザに関わってもらえればい。例えばちゃぶ台返されても2週間分の手戻りとなるように。
  • 企画、設計、開発、テスト、QA、デプロイなど、各工程が別々の人で行われている。いちいち説明しなければいけない。
    • 同じ人がやればいいのでは?セル生産方式はラインをU字型にして、1人、あるいは1つのチームで複数作業をできるようにした。


といった話が出ました。
自分からは割と直面してる課題として「お客様の中で仕様がなかなか決まらない(全国の各拠点で使用するシステムだが、各拠点で運用が統一できない)」というのがあったんだけど時間的にそろそろ次に行きそうなタイミングだったので挙手は控えました。


ここで川口さんより、ドキュメントには「コミュニケーション」、「記憶」という2つの目的があるのだけど、スクラムではどちらかの目的のためにドキュメントを使用しません。それはどちら?という問がありました。
挙手してみると、「コミュニケーション」が自分を含め2名で「記憶」が大多数。
答えはコミュニケーションのためにはドキュメントは使用しないということでした。
1つのチームで全部やってしまえば、次工程への作業指示のための資料はたしかにいらないですよね。
ただ、記憶のためにはドキュメント残す(プロダクトバックログなど)んだけどそこはいろいろちゃんとやらないといけないので大変とのこと。


その後にワークショップ。
内容は、4人1チームで、ある絵描提示され、2人がその絵を文章で表現し、残りの2人がその文章から絵を再現する、というもの。
2回行い、1回目よりも2回目のほうが複雑な絵になってました。


自分は、1回目は絵かき担当、2回目は仕様の文章書き担当になりました。
1回目に絵を描く時には、

  • 指示が小出しで待ち時間が多かった
  • 指示に不整合な内容があり戸惑った
  • 位置、形、大きさなど複数の解釈ができるようなものがあり、仕様を書く人との認識がずれてしまった

という課題がありました。


また1回目の反省として、他チームでまず概要を説明されたのがすごくわかりやすかったという話が出て、それはそのとおりだなと思い2回目に生かしました。


2回目は、まず仕様を書く2人のうち相方の人が全体の概要を書いて、あとは個別に手分けして仕様を書くという方式出やろうということに。
そのやり方は、絵かき担当の人からもわかりやすかったとのこと。これはOK。
ただ、仕様チームの2人の間(概要の仕様と、自分の個別仕様)で表現が共通できていなかったり、個別の指示で大きさの指示が漏れていたり、指示が不整合な内容となっていたりとイマイチな結果に。
(そしてKPTの写真はまた撮り忘れた。。。)
しかしうちのチーム以外、他のチームの絵が見事でした。みんなすごいなぁ。
もっとが鍛錬必要だなあ。


ワークショプが終わって簡単なまとめがあり終了。
前回参加時は懇親会も出ましたが、今回は家都合もあり本編のみで切り上げました。
その後新宿まで、横浜方面に帰る参加者の人と感想を話しながら歩いて京王線で帰宅しました。


普段当たり前のように作業していることで、無駄なことってたくさんあるんだろうな。
でもなかなか気づかないんだろうな。


今回もいろいろな気づきがあり、考えさせられる良い勉強会でした。
講師の@kawagutiさん、主催の@fullvirtueさん、参加者の皆さん、どうもありがとうございました!

第2回 ビギナー編 AWS User Group - Japan 東京勉強会

昨年、2回ほど行こうと思っていたけど行けなかったAWSの勉強会に初参加。
(Web無料セミナーは2回ほど受けたけど)

・KenTamagawaさんの話(概要)
 ちょいちょいブログ、入門資料は見させていただいているが、生KenTamagawaさんは初めて。
 講演(公園)ねた、楽天ねたは定番とのこと。
 発電機、最初はビール工場が自前でもってたけど発電所が整備されて自前では持たなくなった。クラウド発電所と同じ。
 サービス全体の概要をわかりやすく話されてました。
 でもそういえば新しいStorage Gateway、DynamoDBは資料になかった。


・李さんの話(S3)
 EMRの青いガイド本が2/23に発売されるということ。
 これは買わないと。
 S3をCloudBerryで操作して、アクセス権を設定してHttpでアクセスしたり、CloudFrontに載せたりと色々デモされてました。
 エクスプローラとかWinSCPみたいな感じで、お手軽にS3を使える感じがよくわかった。
 無料範囲でCloudBerryで使ってみよう。 


・柳瀬さんの話(EC2)
 EC2のでも中心のお話。
 インスタンスを立ち上げて、EIP、ELBのデモでした。
 が、ELBのデモは間に合わず。
 しかしこんな簡単にLB環境が作れちゃうんだ、やっぱすごいな。


・Q&Aタイム
 なかなか質問が出なかったこともあり質問しました。
 ・自分で試しに上げた会社アカウントのWindowsのmicroが30GBだったので、WindowsLinuxを両方あげたら、EBS無料範囲を超える?
  玉川さん:Windowsインスタンス上げるときにEBSの容量指定に気をつけて!30Gで立ち上げるとLinuxと合わせると超えます。
      でもそんな高くないよ。1G/月で10円くらいだから、35Gとかなら5G分50円。(30Gまで無料)


 ・EIPを取得後、インスタンスに割り当てる間は課金?
  (試しにアカウント作った人がちょっとだけ課金されてしまったことがあったので)
  玉川さん:課金されたとしてもとても安いです。(AWSページ見たら1時間あたり0.01$でした。課金されても1円ですね)


 ・DynamoDBのページはいつ頃日本語化されますか?
  玉川さん:なってませんでしたっけ?あとで資料とかアップします。
      (今見てみましたが英語でした。まあ、早く試したいならこのくらい読まないとだけど)

そのあと何人か質問したけど、李さんいるのにS3に関する質問がなく、玉川さんからS3の質問した人にガイド本プレゼントとの太っ腹な発言がでましたが、自分はすぐに質問は浮かばず。。残念。

会場提供していただいた富士ソフトさん、講師、スタッフのかた、どうもありがとうございました!

感想


AWSは取り組まないとと思っていた課題。


昨年末、Webをみながら個人でアカウント作成し、j-waveのOz Meetz Jazzを毎週聴こうと思ってなかなか聞けていない(子供の寝かしつけ中に自分も寝てしまう事が多い)ので、スケジュール録音して、mp3をWebから取得できるように用に無料利用範囲でサーバを設定した。とても便利。
Linuxなんて久しぶりだし、運用で少し触っただけの人間だけどWebをみて少し試行錯誤すればこのくらいはできる時代だ。


また、会社でも法人のクレジットカードを作ってもらってEMRの評価を始めた。
Hadoopあまり理解できてないけど、評価してもらった人からは、S3からHDFSに転送する所が遅いみたいでリアルタイムに帳票作成とかは難しい感じとのこと。
でもDynamoDBはリアルタイムな用途向けでスケールするのでこちらも評価しようと思っている。


全体を通して、EC2にしろS3にしろ手軽に色々できちゃうのがすごいなーと思った。
例えはおかしいかもしれないけど、Cで書いてたのがJavaで書けるようになった、みたいな感じで、エンジニアが注力すべきポイントが変わってくるような感じをうけた。
なんとか時間作ってDynamoDB使ってみよう。


サインアップして、Blog書くまでが勉強会だそうですが、サインアップはすでにしているので、これで勉強会終了です。