VOYAGE GROUP エンジニアブログ

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

2010年12月

Google Waveで情報共有してたけど、今後どうしよう!?

こんにちは、ECナビのサービス比較事業本部という部署でシステムを担当している松本です。
私の部署では、プロバイダ比較ナビというサービスを運用しています。

ところで皆さん、部署や会社内での情報共有にどんなツールを使っていますか?
私の部署では、主に次のようなツールを使って、情報共有・案件の管理をしています。

  1. サイボウズ ガルーン
  2. IP Messanger
  3. Redmine
  4. IRC
  5. Skype
  6. Google Wave

野口さんのエントリにもあったように、システムの仕様や開発案件、タスクの管理など、恒久的にデータを残す必要のあるものについては、全てRedmineに情報を蓄積しています。
が、チケットを切るまえにちょっと要件をまとめたい時や、wikiに残しておくほどじゃないけど、ある程度まとまった情報を皆に共有したい、ということってありませんか?
例えば、

  • サービスの改善案がぼんやりと頭にあるんだけど、みんなの意見を貰いながら整理したいとき。
  • デザイン改修してリリースしたんだけど、みんなあまり気付いてくれないので、変更のポイントを共有して「すごい!」と言って欲しいとき。
  • クライアントに提案している新しい案件や施策がまだ本決まりじゃなくてスケジュール引けないんだけど、どんな状況で進んでるか伝えたいとき。
  • 飲み会のお店候補がいっぱいあるんだけど、どれが良いかちょっとアンケートをとってみたいとき。

私の部署では、このような場合にGoogle Waveを活用してきました。
今年の2月から本格的に部署内で使用しはじめ、これまでに作成したWave数はおよそ100、コメント数は3000ほどになります。
ブラウザ上から簡単な操作でコメントの階層構造を作れるので、エンジニアではないメンバーにも操作が覚えやすく重宝していました。

なのですが、ご存知の方も多いように、残念ながらGoogle Waveは、Googleによるプロジェクトが終了する旨のアナウンスがすでに発表されています。
また、Wave自体はオープンソース化され、Wave In A BoxとしてApache Software Foundation(ASF)のもとでApache Incubatorとして開発プロジェクトが継続することが決まっています。
これはこれで喜ばしい事なのですが、Google Waveサービス自体はいつまで使えるの?というところがはっきりしていません。

7月にGoogle Waveプロジェクト中止のアナウンスがされた際には、

・少なくとも、年内はwave.google.comが継続すること
・年内に、Waveデータをエクスポートする手段を用意すること

通知されていました

そろそろ年も押し迫ってきたので、結局いつまでGoogle Waveは使えるのよ?データのエクスポートってどうやるのよ?と探してみたところ、下のようなエントリが見つかりました。



やはり12月31日でサービス終了するんだ!データエクスポートどうすればいいの?
と慌ててエントリ読んでみたところ、

  • Waveデータを代替サーバに適切に移行できるようになるまで、2010年12月31日を過ぎてもwave.google.comは継続する
  • 今は、10Waveまで一括でzip圧縮された形でデータエクスポートできる

ということでした。
人騒がせなタイトルですね、一瞬焦りました。

ということで、結局いつまでGoogle Waveが使えるのか、明確な期限はまだアナウンスされていないようです。
代替手段へのデータ引継ぎについても、用意するという方針は変わらないようですが、まだ最終的なアナウンスはされていません。
突然サービスが使えなくなるということは無いと思いますが、はっきりしたアナウンスが出るまでは注意してみておいた方がよさそうです。

ということで、今回のエントリはGoogle Waveの現状についてでした。

2泊3日の合宿でiPhoneアプリをリリース!

こんにちは、子会社genesixの上杉(@unlearned)です。

先日genesixでは開発合宿を行ないました。

開発合宿を行なったのは新卒2人を含む、次の3人組です。(残念ながら私は参加できませんでした)

  • 徐(@TonnyXu)
  • 荒井(@cutmail)
  • 加藤(@guruguruman)
  • 2泊3日の開発合宿でiPhoneアプリを2本リリースすると言う目標で行ないました。

     

    開発環境

    合宿2


    iPhoneアプリ開発なので、開発環境を整える準備は少なくてすみました。

    MacBook proとインターネットにつなげる環境さえあれば、とりあえず開発をはじめることができます。リポジトリはgithubを利用しました。

    宿泊施設

    より集中できる環境を求めなければいけません。当たり前ですが静かな場所で少し広めでゆったりとリラックスしながら開発が出来る場所が良いのではないでしょうか。

    今回はECナビで借りているシェアハウスPORTを利用して合宿を行ないました。

    開発

    合宿1


    この短期集中でiPhoneアプリを完成させるためには 事前にアプリの仕様を固めておき、合宿中はプログラミングに集中する必要があります。

    参加者曰く 「合宿中は本当に朝から晩までコードのことばかり考え、起きて5分後には既にモニターを見つめていました。」 とのこと。

    普段の職場とは違った環境でひたすらプログラミングをすることはかなり刺激的だったようです。

    宣伝

    今回開発したアプリは既にリリースされていますので、ぜひ使ってみてください。

    楽しそう。うらやましい。私も次回こそは参加したい!!

     

    メタプログラミング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
    そちらでも、メタプログラミングをテーマとしたセッションを行う予定(あくまで予定ですが。。) ですので、ご興味ある方はぜひご参加ください。

    よろしくお願いします:)

    Rails(Web)アプリケーションのセキュリティ(ログファイル編)

    はじめまして、ジョニー・デップに激似の山口(@tadasy)と申します。

    僕はPeXという部署で働いておりまして、
    PeXpaycaグルピの運営に携わっております。

    ECナビではサービスを作るときは、よくPHPを使われるのですが、
    PerlやPython,Rubyなどで構築されているサービスもちょいちょいあります。

    僕が所属しているPeXという部署でも、主力サービスであるPeXはPHP(symfony)で構築されていますが
    payca、グルピはRuby(Ruby on Rails)で構築しました。

    そのRailsのwebアプリケーションを構築・運用していく中で、セキュリティ的に気をつけたポイントを
    何回かにわけて心折れるまで(おそらく2,3回)書いていこうと思います。

    というわけで第1回はログファイルについてです。

    ログファイルのセキュリティ?

    ログファイルのセキュリティって言われてもあまりピンとこないかもしれませんが、Railsではproduction環境でもデフォルトで、HTTPのパラメータが全部ログに出力されてしまうとこです。そりゃもう全部です。
    ログイン画面のパスワードはもちろん、会員情報登録画面の個人情報も当然、ログファイルの書かれます。

    せっかくDBに会員パスワード情報を復号できない形でハッシュ化して保存していても、ログファイルに書かれてしまったら、もろもろ台無しです。

    回避方法

    action packのaction_controllerには filter_parameter_logging というクラスマクロが定義されています。
    これを使うことでログファイルへの書き出しを抑止できます。

    上記のように記述するとログファイルに記載される該当するパラメータ値が[FILTERED]という文字に置き換えられます。

    • filter適用前のログファイル
      Parameters: {..."user"=>{"password_confirm"=>"naisho", "last_name"=>"石鍋", "password"=>"naisho", "login"=>"loginid", "first_name"=>"太郎"}...}
    • filter適用後のログファイル
      Parameters: {..."user"=>{"password_confirm"=>"[FILTERED]", "last_name"=>"石鍋", "password"=>"[FILTERED]", "login"=>"loginid", "first_name"=>"太郎"}...}

    適用後のログファイルをみると"password_confirm"というパラメータも置き換得られていることがわかります。
    これは、
    filter_parameter_logging :password
    と書くことで
    /password/i

    という正規表現でパラメータ名をチェックされるためです。

    詳しい使い方

    詳しい使い方についてはaction_controller/base.rbにfilter_parameter_logging定義されていますので
    そちらのコメント欄が参考になります。
    一応コメントを引用しておきます。

    # Replace sensitive parameter data from the request log.
    # Filters parameters that have any of the arguments as a substring.
    # Looks in all subhashes of the param hash for keys to filter.
    # If a block is given, each key and value of the parameter hash and all
    # subhashes is passed to it, the value or key
    # can be replaced using String#replace or similar method.
    #
    # Examples:
    #   filter_parameter_logging
    #   => Does nothing, just slows the logging process down
    #
    #   filter_parameter_logging :password
    #   => replaces the value to all keys matching /password/i with "[FILTERED]"
    #
    #   filter_parameter_logging :foo, "bar"
    #   => replaces the value to all keys matching /foo|bar/i with "[FILTERED]"
    #
    #   filter_parameter_logging { |k,v| v.reverse! if k =~ /secret/i }
    #   => reverses the value to all keys matching /secret/i
    #
    #   filter_parameter_logging(:foo, "bar") { |k,v| v.reverse! if k =~ /secret/i }
    #   => reverses the value to all keys matching /secret/i, and
    #replaces the value to all keys matching /foo|bar/i with "[FILTERED]"
    ブロックも渡せるらしく、かなり柔軟な使い方ができそうですが
    特に使い道が思いつかないので、今はシンプルに利用しています。


    注意
    Rails3系ではfilter_parameter_loggingはdeprecatedになっており、別の使い方が推奨されているようです。

    Ruby DSLを定義してPowerPointスライドを自動生成する話

    こんにちは、モバイルショッピング事業室で働いている小芝です。

    先日、NTTレゾナント社のRubyコミュニティ「職場.rb」で講演する機会をいただきまして、Ruby DSLとPowerPointスライドの自動生成についてお話させていただきました。

    概要

    最近DSLという言葉をよく耳にするようになりました。
    しかし具体的にいつどんなときにどのように作ればいいかという情報は少ないように思います。
    この講演では、簡単にDSLを定義し扱う事ができるようになる事を狙いとして、下記2点の紹介・解説を行いました。
    1. プレゼン資料を表すDSLを定義し、PowerPointスライドを生成する事例の紹介
    2. 簡単にRubyでDSLを作成・活用するためのポイントの解説

    提示資料

    またhttp://www.ipad-zine.com/b/814/ にも登録しております。

    実はこの資料自体が、このお話の中で解説しているDSLから生成したPowerPointスライドを使っています。(ソースの公開については少々お待ち下さい)

    DSL楽しいよ

    DSLを定義し動かせるようになると、この手法を様々な状況で応用する可能性が見えてきてとても楽しくなりますので、是非お試し下さい!

    もし、いい応用例を見つけたり、逆にうまくいかなかったりしたら、是非その内容を共有してもらえるととてもうれしいです。
    一緒にDSLトークをしましょう。

    【告知】東京Ruby会議05を開催します

    2011年2月4日(金)にECナビを会場として、プログラミング言語Rubyについてのカンファレンスの一つである、東京Ruby会議05を開催します。
    まずは2011年2月4日の夜の予定を空けておいて下さい。

    最新情報は、東京Ruby会議05公式サイトRuby会議日記にて随時お知らせいたしますので、是非チェックしてください! 
     
    記事検索
    QRコード
    QRコード