VOYAGE GROUP エンジニアブログ

voyagegroup_techのブログ
VOYAGE GROUPエンジニアブログです。

勉強会

第2回 CakePHP2.0 勉強会@Tokyo で会場を提供させていただきました

こんにちは!株式会社adingoのエンジニアで前田(@brtriver)といいます。


写真(2)

2011年10月06日に、第2回 CakePHP2.0 勉強会@Tokyo が開催され、VOYAGE GROUPで勉強会/懇親会会場を提供させていただきました。
また、当日は VOYAGE BB ポイントが溜まるWiMAXこと VOYAGE WiMAX を用意し回線を提供しつつ、Ustreamで勉強会の様子を配信しましたが、最終的に100人以上の視聴者になりました。

キャンセル待ちが出るほど盛況なことからも分かるように、CakePHPは代表的なPHPフレームワークの1つで国内でも多くの利用実績がある点や、もうすぐ正式版がリリースされるCakePHP2の勉強会ということもあり、今回の勉強会もかなり注目度は高かったと思います。

スタッフの皆様、ご参加いただいた皆様ありがとうございました!

全てではありませんが、資料をアップされていた方のリンク先は以下にまとめました(漏れがありましたらご指摘ください)

懇親会の様子はUstreamで配信していませんでしたが、懇親会はAjitoにて開催し、懇親会LTも大盛り上がりでした。

写真(3)


懇親会で個人的に印象的な内容だったのはCandyCaneでした。
CandyCaneはPHP版Redmineであり、CakePHPで開発されています。
最近になり、CakePHPのコアデベロッパーが開発に参加するなど世界的にブレークの兆しがあります。
特徴は、とにかく導入の敷居がRedmineと比べても低い!インストールを動画で紹介していましたがなんと2分掛かっていません。
おそらくCakePHPのキラーアプリになるのではないでしょうか?


最後に、VOYAGE GROUPでは、このように勉強会の会場を無償で提供させていただいています。
もし勉強会を企画していて会場探しにお困りの場合は、私(@brtriver)やVOYAGE GROUPの誰かにご相談いただければと思います。

TDDワークショップを開催しました

株式会社adingo所属かつアジャイル戦略室(勝手メンバー)の@katzchangです。先日、VOYAGE GROUP社内勉強会としてTDDワークショップを開催してみましたので、そのご報告です。

まずは「TDDってなに?」っていうお話をさせていただいたあと、ペアプロでTDDを体験して、最後にどんなコードができたかレビューするという、いわゆるTDD Boot Campスタイルをとりました。課題は「ECナビ会員のグレード(http://ecnavi.jp/mypage/guide/condition/)を判定しよう」。

TDDWSの様子 ペアプロの様子

ふりかえり

Keep

  • ペアプロがよかった、安心できてかつ慎重になる(というのが6票)
  • ECナビネタの課題がFizzBuzzよりも実務に近く感じて勉強になった
  • 進み具合に応じて追加の課題がでてくることがすごくよい
  • 課題の要求があいまいだったので思考できてよかった
  • 数人が教える側に立った
  • テストの価値説明が最初にあるので理解しやすい
  • テストコードは書いた方がいい

Problem

  • OSSだとテストコードがなければ無視されるような話を是非
  • 言語はもっとバラエティに富んでた方がよい
  • 全員ペアプロだったので、ペアプロじゃない人と比較したかった
  • (PHPで)Shift_JISでは日本語メソッドは構文エラーになる
  • パソコンは一人一台あるとよい
  • もう少し時間が長くてもよい
  • 仕様が不明な時に、もっと積極的に出題者に質問できればよかった
  • (コードレビューのとき)ThinkPadがプロジェクターに映らなかった
  • Eclipseよくわからなかった
  • お腹すいた

Try

  • パラメタライズド・テストでテストを書いてみたい
  • ペアプロ大会したい
  • 今日参加できなかったエンジニアのためにまた開催してほしい
  • ピザでも食べながらコードレビュー

これを受けて

ペアプロがとても好評だったのは、想定通りでした(ドヤッ

ペアプロとTDDの相性の良さについては、書籍「ペアプログラミング」(ピアソン・エデュケーション)の中でも触れられています(私の席に置いているので、読みたい方は声をかけてみてください)。

テスト駆動開発を活用してください。(中略)

テストファーストプログラミングと組み合わせると、ペアプログラミングの価値が本当にわかると言った人たちがいます。その人たちは、最初にテストを作成することで、ペアが2人とも、取り組んでいる問題を正確に把握すると述べています。

ペアプログラミング 第11章 ペアプログラミング実践の秘訣 p101

TDDを使わずに作業の結果を確認するためには、ドライバーは黒目を動かして広大なブラウザ画面のどこかの文字列を網膜に写し、それがドライバーの脳内にある意図に沿っているかを検査することなります。当然、横で見ているパートナーには伝わるはずがありません。ドライバーが「ここがゴールド会員だから、このメニューがこうなって…」みたいな独り言を言いながら進めるのはとても良いことですが、なかなか限界があるでしょう。目標(テストコード)を明確にして実装を進めるTDDは、ペア同士のコミュニケーションも促進するということだと思います。

これからのこと

現在、VOYAGE GROUPエンジニアのためのTDD Boot Campを企画中です。社内向けの研修ではあるのですが、外部の方にも参加していただけるような形で開催したいと私個人としては思っていて、おそらく、そのようにできると信じています。

時期は年明けくらい、12月くらいには何かお知らせできればば、順調に進んでると安心していただけるはずです。とりあえずあと2回程度ワークショップを開催してみて、そこから先の「使える武器」をどう増やしていくにフォーカスするという方向もアリかもしれないと思いながら、まーどうしましょうかねぇ。

現状、プロダクトによってはレガシーコードとの熾烈な戦いがあったり、自分も含めてまだまだ経験が足りていない――言い方を変えれば、挑戦すべき多くのことが目の前に転がっています。これはとても恥ずかしい話ではありますが、ただ、それらを一つ一つ片付けながら進むという、泥臭く、かつ人間臭い仕事ができるエンジニアは、プロフェッショナルと呼ばれるにふさわしいのではないかと思うわけです。

というわけで、最速最強の開発を目指して、今の開発を加速していきましょう。

アプリケーションハンガリアンを用いて徳丸本の「様々な列でのソート」のサンプルを改善してみた。

こんにちはCTOの小賀(@makoga)です。今回はアプリケーションハンガリアンを用いて徳丸本のサンプルコードを改善してみます。

--------------------------------------------------
2011/9/22に補足エントリ書きました。
『アプリケーションハンガリアン...改善してみた』のエントリが「わかりやすくなってなさすぎるw」と指摘いただいたので補足します。
--------------------------------------------------

要約

  • 基本的にSQL文を動的に組み立てない。極力やらない方向で考える。
  • どうしても動的に組み立てたいときは、外から渡ってきた値は安全ではないので直接使わない。
  • 安全な値とそうでない値はアプリケーションハンガリアンを用いて可読性を高める。

詳細

弊社では現在徳丸本こと体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践の勉強会が3つ進行中です。その中の1つで「4.4 SQL呼び出しに伴う脆弱性の様々な列でのソート」のサンプルコードをもう少し改善できるよねという話になりました。
$sort_columns = array('id', 'author', 'title', 'price');
$sort_key = $_GET['sort'];
if (array_search($sort_key, $sort_columns) !== false) {
    $sql .= ' ORDER BY ' . $sort_key;
}
上記が136ページに記載されているサンプルコードですが、以下のような改善点があると思います。
  • GETで渡された値をSQL文に連結しているので、パッと見てこのコードが安全か分かりにくい。
そこでアプリケーションハンガリアンを用いて以下のように改善しました。

function SFromUS_SortKey($usKey) {
    $SFromUsSortCol = array(
        'sort_id' => 'id',
        'sort_author' => 'author',
        'sort_title' => 'title',
        'sort_price' => 'price' );
    if(array_key_exists($usKey, $SFromUsSortCol))
    {
        $sSortKey = $SFromUsSortCol[$usKey];
    } else {
        $sSortKey = 'id';
    }
    return $sSortKey;
}
$usSortKey = $_GET['sort_key'];
$sSortKey = SFromUS_SortKey($usSortKey);
$sSql .= ' order by ' . $sSortKey;
これにより安全な値を連結していることが分かりやすくなったと思います。

参考:間違ったコードは間違って見えるようにする


「プロジェクトが失敗する要因 見積り編」という勉強会を行いました。

こんにちは、CTOの小賀(@makoga)です。

ECナビでは「テーマを決めてお話しよう勉強会」とか「テーマを決めてほげほげ勉強会」と呼ばれるエンジニアが自分でテーマを決めて発表する勉強会を行っています。

    第1回 メール配信システム
    第2回 バージョン管理とデプロイ
    第3回 プレゼンテーションにおける提示資料作成技術

第3回の@bash0C7からご指名を受け、第4回目は僕が発表しました。テーマは「プロジェクトが失敗する要因」です。タイトルがつりっぽいところもあり30名以上が参加しました。エンジニア以外の人からもなかなか好評だったので、その後同じ内容でもう1回行ったところ、こちらは半数以上がエンジニア以外となり全体で30名ほどが参加しました。どちらの回でも質問がたくさん出て、僕も理解が深まり、やはり情報は発信するところに集まることを実感しました。

一応そのときの資料をslideshareにアップしてみましたが、説明しないと???な感じに仕上がっておりますw

資料について少し補足します。今回はまず用語の認識をあわせるところから始めました。「プロジェクト」についてはプランニング・オニオンをベースに説明し、「プロジェクトの成功・失敗」についてはCHAOSレポートから引用した文章を元にそこから自社の特性に合わせ説明しました。ようやく認識があったところで今回は特に見積もりに特化するよと宣言し、覚えてほしいこと3つ「不確実性コーン」「規模と期間」「正確さと労力」について説明しました。ここを文章だけでうまく説明するのは難しいので興味のある方は『アジャイルな見積りと計画づくり ~価値あるソフトウェアを育てる概念と技法~』を読んでみてください。とても良い本です。

次回は不確実性に備えるバッファあたりの話をしようと思います。

メタプログラミングRuby:文字列からのオブジェクト生成

こんにちは。ECナビでインフラエンジニアやってます岩本(@masaki925)です。

弊社では週に1度ランチタイムを利用して「メタプログラミングRuby読書会」というものを実施しています。

メタプログラミングRubyメタプログラミングRuby
著者:Paolo Perrotta
アスキー・メディアワークス(2010-08-28)
販売元:Amazon.co.jp
クチコミを見る


今回は、その中で上がった個人的に面白かった話題について簡単に紹介しようと思います。


・オブジェクト指向における多態性について


僕はRubyという言語に興味を持ってはいるのですが、正直「オブジェクト指向」というものがどういうものなのか明確に理解できていません。

そのことを告白すると、先輩エンジニアのみなさんがオブジェクト指向について説明してくれて、その中で「多態性(polymorphism)」というキーワードが上がりました。


そしてその多態性について先輩エンジニアの@unlearned さんが以下のような趣旨で、PHPのコードを書いて説明してくれました。
// 会員のグレードごとに異なるボーナスポイントの付与率を表示するコードの例
<?php
abstract Class Member {
function print_bonus() { print("your bonus is " . $this->bonus . "%.\n"); }
}

Class Gold extends Member { var $bonus = 15; }
Class Silver extends Member{ var $bonus = 10; }

// データベースからユーザのグレードを取得したつもり
//$grade = $db->get_grade(user_id);
$grade1 = "Gold";
$grade2 = "Silver";

// グレード(文字列) からオブジェクトを生成
$member1 = new $grade1;
$member2 = new $grade2;

// ボーナス付与率を表示
$member1->print_bonus(); // your bonus is 15%.
$member2->print_bonus(); // your bonus is 10%.
ということで、
多態性とは
 同じ動作を、違うオブジェクトがすることで、異なった振舞いをさせることができるようになる性質のこと
というように理解できました。
(多態性のメリットに関してはそこら中に情報があると思いますので今回は省きます。)


・文字列からのオブジェクト生成
@unlearned さんのおかげで僕の疑問は晴れたのですが、@unlearned さんは説明を終えただけでは満足せず、説明に用いた下記のようなクラスの生成の仕方はRubyではどのように実現するのか?という疑問を読書会メンバーに向けて投げかけました。
//generate Object by String in php
$obj = new "MyClass";

みんなすぐには回答に辿り着かず、ググったり手を動かしたりしてみて、どうやらObject.const_getを使うらしい。ということがわかりました。

でも読書会の時間内ではなぜそうなるのか?という回答を得ることができず、その場はそれで解散になりました。


・ActiveSupport における文字列からのオブジェクト生成

その後、@tadasy さんがRailsのActiveSupportについて調べてくれました。

ActiveSupportではconstantizeという名前でStringクラスを拡張していました。
"MyClass".constantize.new
実際にソースを見てみると、
StringクラスをInflectorというモジュールを利用して拡張していました。

※便宜上、実際のソースから少し書き換えています。

参考:/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/inflector.rb
//generate Object by String in php
module Inflector
    def constantize(class_name)
      Object.const_get(class_name)  # 注目!
    end
参考:/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/core_ext/string/inflections.rb
//generate Object by String in php
require 'active_support/inflector' unless defined?(ActiveSupport::Inflector)

module String
def constantize
Inflector.constantize(self)
end
受け取った文字列をObject.const_get に渡してクラスへの参照を取り出すことで、クラス.new を実現していました。


また、FAQにも同様の方法が紹介されていました。
6.15 クラス名からクラスを得ることはできますか - FAQ::クラス、モジュール - Rubyリファレンスマニュアル


上記の調査と、本の内容を照らし合わせると、見事に@unlearned さんの疑問を晴らすことができました!
※ページ番号は「メタプログラミングRuby」に関するものです。
  • クラス名はただの定数である。(p.49)
  • クラス名(定数) は、クラスへの参照を持つ。(p.53)
  • クラス.new メソッドを実行するには、クラスへの参照が必要。(p.53)
  • クラス名(文字列) からクラスへの参照を得るには、Object.const_get メソッドを用いる (ActiveSupport, FAQ)

#generate Object by String in ruby!!
obj = Object.const_get("MyClass").new


・メタプログラミングって楽しい!
今回の読書会では、ふとした疑問をきっかけに自分だけでは気が付かなかった点に気付くことができ、
本の内容、Rubyという言語についてより深く理解できました。

引き続きこういった読書会などの機会は積極的に利用し、
少しずつでもメタプログラミングの魔術を自分のものにして、「ビックリすること」ができるようになりたいです!


・宣伝
読書会の発起人である@bash0C7 さんを中心として、「東京Ruby会議05」の開催を予定しています。
tork05_logo
そちらでも、メタプログラミングをテーマとしたセッションを行う予定(あくまで予定ですが。。) ですので、ご興味ある方はぜひご参加ください。

よろしくお願いします:)
記事検索
QRコード
QRコード