ESM アジャイル事業部 開発者ブログ

永和システムマネジメント アジャイル事業部の開発者ブログです。

RubyWorld Conference 2016 に参加しました

こんにちは、 @junk0612 です。

11/3(木・祝) と 11/4(金) に島根県松江市で行われた、RubyWorld Conference 2016 に参加してきました。 今回は総勢9名での参加となりました。

Platinum スポンサー

RubyKaigi 2016 でも スポンサーをさせていただきました が、今回も Platinum スポンサーとしてブース出展をしてきました。

前回のアジャイル阿闍梨餅に引き続き、今回も地元の和菓子ということで 福田屋 さんにお願いして、Ruby に見立てた赤い寒天が特別に乗った紅白のお饅頭をブースにて配布しておりました。(紹介してくださったスーパー公務員の皆様、ありがとうございます!)

ショートプレゼンテーション

協賛企業ショートプレゼンテーションとして @koic が「10年生きる Ruby/Rails アプリケーションプログラマーのエコシステム」というプレゼンをさせていただきました。

www.slideshare.net

コーヒーブレイクの時間でのプレゼンテーションでしたが、来ていただいた方とお饅頭を片手にお話ができ、興味を持っていただいたようで良かったです。

セッションの感想

わたしは今回初めての参加でしたが、「小さな町で子供向けのプログラミング講座をはじめてみて」や「ゼロから稼げるエンジニアになる3つのステップ」など、RubyKaigi では聞くことができなさそうなセッションにも参加できて、新鮮で面白かったです。

また、「Scientific Computing in Ruby」の直後に「Ruby における機械学習のための環境整備の取り組み」という機械学習トピック2本立てのセッションが強く印象に残りました。 Python で scikit-learn を用いて、ランダムフォレストを使った分類などのかんたんな機械学習を学生時代に少しかじったことがあるのですが、Ruby でもそれができるようになるといいなぁ...(そこに貢献することができたらもっとうれしいですね)

さいごに

今回のカンファレンスは非常に充実した時間を過ごすことができました。これも運営に携わっていた皆様や発表者の皆様のおかげと存じます。 また、ブースに立ち寄ってくださった皆様、ショートプレゼンテーションで興味をもってくださった皆様ありがとうございました。またどこかのスポンサーブースで (和菓子を用意して?) お待ちしております!

JavaScript のパッケージマネージャ Yarn を Idobata で使った雑感

こんにちは、hibariya です。npm と互換性のある新しいパッケージマネージャ Yarn が話題ですね。idobata.io でも npm の代わりに Yarn を使うようになり、CI やデプロイが数十秒早くなりました。

今日は Yarn を試すなかで気になったポイントをまとめてみます。なお、これを書いている時点で既に 0.16.00.16.1 がリリースされ、既に解決したものもあります。ぜひ最新版へアップデートしましょう。

yarn run のスペースの扱い

0.15.1 までは、スペースを含めてコマンドの一部として扱われてしまうようで、オプションや引数を渡す使い方ができませんでした。そのため package.json に以下のような scripts を用意して yarn run で実行すると失敗していました。

  "scripts": {
    "build": "ember build",
    "start": "ember server",
    "install-build": "bower install --silent --allow-root && ember build"
  },

yarnpkg/yarn#809 で修正され、0.16.0 のリリースに含まれています。

CircleCI + Docker で yarn install できない

CircleCI 上で動かした Docker コンテナの中で yarn install が失敗することがあります。yarnpkg/yarn#918 と同じ現象と思われます。

ESM では Idobata をオンプレミスで使う 方法を提供していて、その手段のひとつとして Docker 上での動作環境もメンテナンスしています。CI での動作確認は必要なので、いったん、 Docker 上では npm を使うような対策を施しました。

Heroku で Yarn を使う

heroku-buildpack-nodejs の Support for Yarn package manager で対応が進められており、今のところは yarn ブランチで試せます。

heroku buildpacks:set https://github.com/heroku/heroku-buildpack-nodejs#yarn

Engine Yard 環境に Yarn を入れる

idobata.io は Engine Yard 上で動作しており、Engine Yard の環境は Gentoo Linux です。Gentoo 上で Yarn をパッケージ管理できて、ひとまずお手軽な方法を、と検討した結果、ebuild ファイルを作り ローカルの overlay として使うようにしました。

おわりに

現時点の Yarn を使ってみて気になった点を紹介しました。みなさんの開発の手助けになればと思います。

技術面接で出された問題

9月に中途で入社した@wat-aroです.
前職はプログミングと全く関係のない仕事でしたが,プログラムを書く仕事がしたくて退職しました.
退職してからはまず基礎を身につけようとSICPを読み,ほとんどの問題を解き終わったのでFjrodのリモートインターンに参加して勉強していました.
今日は永和システムマネジメントの技術面接で出されたアルゴリズムの問題を紹介しようと思います.

出された問題はアナグラムの判定です.
アナグラムとは文字列の順番を入れかえて,別の文字列になっているものです.
erosrose は文字の順番を入れ替えているだけなのでアナグラムです.
eroslose は文字を入れ替えただけでは一致しないのでアナグラムではありません.
これを判定するコードを書きます.

面接ではRubyで書くのが難しければ疑似コードでもいいし,口頭でアルゴリズムを説明するだけでもいいと言われたので慣れているSchemeで考えることにしました.
さらに文字列は考えにくいのでリストで考えることにしました.

まずは一致する条件を考えます.
二つのリストの要素を順に比べていって,最後に両方のリストが空ならtrueです.
片方が空なのに,もう片方にまだ要素が残っていれば要素の数が違うのでfalseです.
ここまでをとりあえず書いてみます.

(define (anagram lst1 lst2)
  (cond ((and (null? lst1)
              (null? lst2))
         #t)
        ((or (null? lst1)
             (null? lst2))
         #f)
        (else
         ...)))

次にlst1の最初の要素をlst2から取り除く補助関数を作ります.
lst1の最初の要素がlst2に含まれていなければfalseを返してくれると
含まれているかの判定と次の再帰で使うリストの作成が同時にできるのでそのようにします.
もちろん,末尾再帰のほうが嬉しいのでそうします.

(define (remove-item item lst result)
  (cond ((null? lst) #f)
        ((eq? (car lst) item)
         (append (reverse result) (cdr lst)))
        (else
         (remove-item item (cdr lst) (cons (car lst) result)))))

これを最初の関数に組み合わせます.

(define (anagram lst1 lst2)
  (define (remove-item item lst result)
    (cond ((null? lst) #f)
          ((eq? (car lst) item)
           (append (reverse result) (cdr lst)))
          (else
           (remove-item item (cdr lst) (cons (car lst) result)))))
  (cond ((and (null? lst1)
              (null? lst2))
         #t)
        ((or (null? lst1)
             (null? lst2))
         #f)
        (else
         (let ((removed-list (remove-item (car lst1) lst2 '())))
           (if removed-list
               (anagram (cdr lst1) removed-list)
               #f)))))

動かしてみると

gosh> (anagram '(e r o s) '(r o s e))
#t
gosh> (anagram '(e r o s) '(r o s ))
#f
gosh> (anagram '(e r o s) '(l o s e))
#f
gosh> (anagram '(e r o) '(r o s e))
#f

大丈夫そうですね.
実際の面接では後半は口頭で説明しただけでした.
リストをこねくり回すのは楽しいですね.

動きそうだということで答え合わせです. モニタに写されたコードは次のようなものでした.

def anagram(s1, s2)
  s1.chars.sort == s2.chars.sort
end

とても簡単です… 最後に悔しくなりましたが,ホワイトボードに向かってLispを書くのは楽しかったです.

Rubyでprivateなクラスメソッドを定義するには

先日、privateなクラスメソッドを定義しようとして、つまづきました。 なので、僕が実装に失敗したパターンと正しい実装方法を記載したいと思います。

失敗パターン

まず、僕が実装に失敗したパターンです。何事もなく呼び出せてしまっています。

class C
  private

  def self.def1
    p 'def1'
  end
end

C.def1 # "def1"

正しい実装方法

Module#private_class_methodを使う場合

次に、正しく実装した場合です。想定通りdef1がprivateメソッドになっているので、呼び出すことが出来ませんでした。

class C
  def self.def1
    p 'def1'
  end

  private_class_method :def1
end

C.def1 # a.rb:9:in `<main>': private method `def1' called for C:Class (NoMethodError)

class << selfの内部でprivateを指定する場合

また、class << selfの内部でprivateを指定しても、定義することが出来ました。

class C
  class << self
    private

    def def1
      p 'def1'
    end
  end
end

C.def1 # a.rb:11:in `<main>': private method `def1' called for C:Class (NoMethodError)

結論

privateなクラスメソッドを定義するには、Module#private_class_methodを使用する、class << selfの内部でprivateを指定するの2パターンの方法があることが分かりました。

RubyKaigi 2016 に参加していました

どうも、muryoimpl です。9/8 から 9/10 にかけて開催された RubyKaigi 2016 に総勢15名で参加してきました。

Bento Sponsor をやりました

事業部として3日に渡ってブースを出したり、 2日目の Bento Sponsor でお弁当を配ったりもしました。

f:id:muryoImpl:20160920023551j:plain

ブースでは、3 日間で 800 個阿闍梨餅を用意し、皆さんのお越しをお待ちしておりました。用意した阿闍梨餅は、全てお召し上がりいただけました。ブースに立ち寄ってくださった方、質問してくださった方、陳列されていた私をいじってくれた方ありがとうございました!

事業部の名にある「アジャイル」と「あじゃり」をかけたダジャレとわかってもらえる予定が、存外わかってもらえずにダジャレの説明を求められるという3日間を過ごしました……

Bento Sponsor としては、お弁当の配布と、のし紙に弊社のロゴを模したちょっとしたコードをつけてアピールさせていただきました。

アジャイル事業部ホームページのエントリ にコードが掲載されていますので、まだ見ていない方は是非読み解いたり実行してみたりしてください。

2日目 『Learn Programming Essence from Ruby patches』 by Mitsutaka Mimura

弊社の三村が上記のタイトルで発表をしました。 動画やスライドへのリンクは RubyKaigi 2016 Schedule Sep. 9 で観ることができるので、是非観てください。 大学で学習したようなアルゴリズムやどこかで読んだコードというのは思いがけないところで自分の礎になっている、というのはそのとおりですね。改めてコードの多読やアンテナを張っていろんなものを知っておくのは大事だな、と思いました。

セッションについて

今回の RubyKaigi では、今後の Ruby に対する Proposal や、Ruby に加わった変更について興味深く聴きました。

Matzの講演 では、実際のところどうなるかはわかりませんが、速度についての話はなくなって、より静的解析ツール寄りになってきたのかな?という印象をもちました。笹田さんの Guild の提案 も取り込まれると、スレッドを使うときに意識しなければならないことが減ってよさそうですね。

Fixnum と Bignum が Integer に統合された けれども一部を除き Ruby のレイヤーでは影響が少ないこと、upcase/downcaseの挙動が 2.4 で変わる ことについてはお仕事で遭遇しそうな情報なので、特に気になりました。

『Fearlessly Refactoring Legacy Ruby』で出てきた suture という gem がドキュメントがしっかりしていて、使うことになれば試してみたいなと思いました。でもそうならないようにテスト書いてメンテナンスするのが大事ですよね。

今回 mruby についての発表も多かったので、mruby 触ってみる詐欺になっている私はそろそろ mruby-cli を使って何か作ってみるタイミングなのかもしれない……

さいごに

RubyKaigi 2016 の運営に携わっていた皆様、発表者の皆様、興味深い話を聴ける場を提供してくださってありがとうございました。 また、ブースに立ち寄ってくださった皆様、お弁当ののし紙に興味をもってくださった皆様ありがとうございました。またお会いしましょう!

Rails5でミドルウェアの位置を変える

こんにちは、hibariya です。先日から、自分のかかわっている Rails アプリを 5.0.0 にアップグレードしています。そのときに意外な箇所でつまずいたことを書きたいと思います。なお、全体的なアップグレードについては公式の A Guide for Upgrading Ruby on Rails や、Release Notes、willnet さんの スライド が参考になります。

そのプロジェクトでは、理由あっていくつかのミドルウェアRails::Rack::Logger より手前にもってくる必要があります。アップグレードする前の 4.2 では次のような操作をすればミドルウェアの位置を変えられました。

# config/application.rb

# 中略...
    config.middleware.delete ActionDispatch::Cookies
    config.middleware.insert_before Rails::Rack::Logger, ActionDispatch::Cookies
# 中略...

ところが 5.0.0 ではある理由によりミドルウェアの削除操作が最後にまとめて実行されるようになりました。そのため、上記の操作は見た目どおりに読めば「ミドルウェアAを削除してBの手前に挿入」ですが、5.0.0 では「ミドルウェアAをBの手前に挿入して、最後にスタックの中のミドルウェアAをすべて削除」という意味になります。

経緯としては、Rails は Rack::Runtime がスタックに存在することを想定しているため、アプリケーション側で Rack::Runtime を削除すると Rails の起動時に例外が発生してしまうという問題があり、その対応としてこの変更があったようです。その影響により、削除して挿入しなおすというやり方ではミドルウェアの位置を変えられなくなりました。

手元では、一時的な対応としてミドルウェアを移動する操作を追加しました。

# config/application.rb

# 中略...
module MyRailsApp
  module MiddlewareStackProxyExtension
    refine Rails::Configuration::MiddlewareStackProxy do
      def move_before(dest, src)
        operations << [:delete, [src], nil] << [:insert_before, [dest, src], nil]
      end
    end
  end

  class Application < Rails::Application
    using MiddlewareStackProxyExtension

    config.middleware.move_before Rails::Rack::Logger, ActionDispatch::Cookies
    config.middleware.move_before Rails::Rack::Logger, ActionDispatch::Session::CookieStore

    # 中略...
  end
end

この変更についての記述はあまり目立たないこともあり、私は気付くのに少し時間がかかりました。ミドルウェアの位置を変えるような Rails アプリのアップグレードを行なう際の参考になればと思います。

合言葉は「デブオプス!!」 牛尾剛さんをお呼びして DevOps 勉強会を開きました

みなさんこんにちは!今年 8 月をもって無事に永和 4 年生に上がった @yucao24hours です。

多彩なご経験とパワフルな「デブオプス!!!!!」の掛け声で有名な(?)牛尾剛さんをお呼びした社内勉強会が、8 月 26 日(金) に弊社にて開催されました。

牛尾さんといえば... わたしは Agile Japan 2016 ではじめて牛尾さんの講演を直接聴き、そのインパクトの大きさと感動を自分のブログにぶつけていた過去があります。

Agile Japan 2016 に参加してきた #agilejapan | 走る http://www.yucao24hours.me/2016/06/02/agile-japan-2016-report/

そんなわけで今回の勉強会は本当に楽しみで、勉強会直前に会社のエントランスで牛尾さんと鉢合わせたときは一瞬頭が停止してしまったほどでした。


「今日の勉強会はやりづらいなあ〜。だってキミらもうアジャイルとか DevOps とか知ってんねやろ、何話したらええんや!」

という牛尾さんの苦笑まじりのセリフからはじまった勉強会。

われわれ参加者(アジャイル事業部の面々)はアジャイル開発の基礎知識や経験がすでにあるだろうからということで、牛尾さんはまず DevOps にまつわるいくつかのテーマを提示してくれました。

そしてそこからわたしたちが聞きたいと思ったものをいくつかピックアップし、そのテーマに沿ってお話してもらうという、なんともゼイタクなスタイルの勉強会になったのです。

冒頭にもふれた Agile Japan 2016 でわたしが感化された DevOps ジャーニーのお話、牛尾さん自身が実際に目で見て体感してきた DevOps 実践チームのレポートなど提示してもらったテーマ群のうちから、今回は DevOps についておさらいするための "基礎知識編" と、Microsoft Azure のライブデモもふんだんに盛り込んでの "現場実践編" 、そして実際に DevOps を取り入れているチームの興味深い "レポート編" といった感じでお話いただきました... あれ、結局最初に提示いただいていたものほとんど全て話していただいていましたね!

いろいろな角度からのためになるお話を聞かせていただき、感謝です(_ _)

f:id:yucao24hours:20160905192953j:plain

ほぼ 2 時間休憩なしで熱く語ってくれた牛尾さん。本当にありがとうございます!

終わった後は永和のスグ近くにあるお店で牛尾さんを交えて懇親会を行いました。乾杯のかけ声はもちろん「デブオプス!!!!」ですよ!

勉強会での牛尾さんのアツいお話に影響されて、永和メンバーもふだんの開発に関する課題や気づきについての話でたいそう盛り上がり、濃密な意見交換の機会となりました。

f:id:yucao24hours:20160905193246j:plain

Microsoft DevOps エバンジェリストとして日々活躍なさっている牛尾さんによるわかりやすいお話のおかげで、DevOps への理解と親近感が以前より増したように思います。

あと、 Microsoft Azure がなんやらすごいことになっててびっくりしました。UI は綺麗だし便利機能満載だし、よさそう。。

牛尾さん、貴重な会をありがとうございました。またこうして、いろいろなエキスパートの方にお話をうかがってみたいですね。