エムスリーテックブログ

エムスリー(m3)のエンジニア・開発メンバーによる技術ブログです

難読Rubyコードクイズ問題と解説 in RubyKaigi 2019

f:id:owl-m3:20190423134156p:plain

RubyKaigi 2019に参加された方もそうでない方もお疲れ様でした。あと数日で到達するゴールデンウィークを指折り数えるowlです。

RubyKaigiでは多彩なセッションにより豊富な知見が得られた他に、Rubyist同士の交流も商店街を貸し切ってのパーティや無料屋台などのイベントによるところもあって例年にないほどの賑わいでした。

さて、そんなRubyKaigiの様子やセッションの知見をみなさんに共有するのは他の参加者による才筆へ委ねることにして、この記事では弊ブースで自分が三日間日替わりに出題していた難読Rubyコードクイズの紹介と解説をしていきます。

毎日このクイズを解きに足を運んでくださった方には感謝しております。お目汚しですが自分が考えたクイズをMatzさん始めコミッターの方にまでご覧頂けたのは光栄です。

<!-- 儀礼的でちょっと退屈な口上はここまで -->

出題

まずRubyKaigiへ参加できなかった方にも楽しんで頂くために出題リストだけを先にお見せします。ぜひ答えを想像してから解説をお読み下さい。

原則としてどの問題もirb上で提示されたコードを実行した際に何が評価値になるかを答えます。

Day1 - 1

難易度:★☆☆


irb> !????!:!?!
=> ?

選択肢:「false」 「“?”」 「:!」 「SyntaxError」

Day2 - 1

難易度:★★★


irb> %%%%%%..%%[0].size[0]
=> ?

選択肢:「1」 「0」 「""」

(お詫び: 掲載当初は問題文がRubyKaigiで出題されたものと異なっていました)

Day3 - 1

難易度:★★☆


irb> puts = :puts
irb> puts = send(puts, puts) || puts(puts) { puts = “puts” }
irb> puts
=> ?

選択肢:「"puts"」 「:puts」 「nil」

Day3 - 2

難易度:★★☆


irb> %%%%%%%%?????:??
=> ?

選択肢:「""」 「"%"」 「"?"」 「":"」

Day3 - 3

難易度:★★★


irb> a = 0.0/0; a == a ? a : irb.quit
直後に何が発生しますか?

選択肢:「ZeroDivisionError」 「undefined local variable」 「irbが終了する」 「irbが起動する」

続きを読む

「RubyKaigi 2019」にPlatinum Sponsorとして参加しました!(ブース・セッションレポート)

エンジニアリンググループの山口です。4/18(木)〜4/20(土)に開催された「RubyKaigi 2019」に、Platinum Sponsorとして参加しました。

エムスリーのスポンサー協賛は4年目。私は初参加でしたが、参加者の方々のRuby愛を強く感じた3日間でした。

sponsor_booths[:m3].inspect # ブースの様子

エムスリーブースは5階エレベータ上がって右手の位置で展開していました。

f:id:t-yamag:20190423161509j:plain
エムスリーブースの様子

ブースでは、特に「Rubyクイズ」が一番盛り上がりました!

続きを読む

Vue.jsほぼ初心者だけのチームで既存サービスのリニューアルをやってみて得られた知見

こんにちは、エンジニアリンググループの福林 (@fukubaya) です。

2019年3月に僕たちのチームが担当するスマートフォンサイトをリニューアルしました。 リニューアルに際して、せっかくなので新しい技術やフレームワークを採用したいということで、詳しいメンバーはいませんでしたがVue.jsでリニューアルすることにしました*1。 本記事では、Vue.jsがほぼ初心者だけのチームでVue.js製プロジェクトをリリースするまでに得られた知見をまとめます。 すでにバリバリ使いこなしている方には物足りないと思いますが、これからVue.jsを始める方の参考になれば幸いです。

f:id:fukubaya:20190422214132j:plain
黒部宇奈月温泉駅は富山県黒部市にある北陸新幹線の駅。本文には特に関係ありません。

*1:社内の別チームに事例はあったので最悪なんとかなるだろう、という目論見はありました。

続きを読む

TypeScriptの型でなんかすごくがんばる

エンジニアリンググループの冨岡です。

先日、以下のTypeScript用DIライブラリを公開しました。大きな特徴として、解決するために不十分な依存がある場合にコンパイルエラーになるようになっています。

github.com

www.m3tech.blog

このコンパイル時の型チェックの実現には、TypeScriptにおける様々な型レベルのテクニックが用いられています。泥臭い試行錯誤の結果、なかなかhackyなこともやっていて面白い(?)ので、せっかくなので解説しようと思います。

もちろん、「もっとエレガントにできるよ」というアドバイスやプルリクも大歓迎です!皆さんも、自分だったらこうするなぁ、とか思いながら楽しんでいただければと思います!

続きを読む

TypeScript用のDIライブラリを公開しました

エンジニアリンググループの冨岡です。

TypeScript向けのDIライブラリを公開したので紹介します。

github.com

モチベーション

Clean Architecture等の設計手法を使ってコードを書いていると、抽象に依存することが多くなってきます。

class CreateUserAccount {
  constructor(private userAccountRepository: UserAccountRepository) {}
}

const forProduction = new CreateUserAccount(
  new PostgreSQLUserAccountRepository(
    buildPostgreSQLConfig(process.env)
  )
)
const forTest = new CreateUserAccount(new InMemoryUserAccountRepository());

テストしやすく、また責務がはっきりわかれていて良いですよね。ただ、別の辛みもいくつかでてきます。

  • インスタンスの組み立てが巨大で、かつ順番に依存にした複雑な処理になる
  • 本番用とテスト用など、共有したい部分とそうでない部分がでてきてうまく管理するのが面倒になってくる

こういった辛みに対応するのがDIライブラリです。しかし私の調べた限りでは、既存のDIライブラリは少し大げさな印象でした。 例えばメジャーなライブラリであるInversifyJSは、decoratorをベースにしており大げさ&マジカルです。

依存先を容易に切り替えられる既存のライブラリの利点は残しつつ、以下を満たすシンプルなライブラリがほしいと思いました。

  • 依存をシンプルに表現できる
  • 変な魔法を使わず、明示的である

そこで作ったのがこのtypesafe-diです。

続きを読む

エムスリーエンジニアリンググループ第三回開発合宿を開催しました!

エンジニアリンググループ・マルチデバイスチームの金丸 (@maru333) です。

年度またぎのバタバタで遅れてしまいましたが(言い訳)、先日(3/15〜3/17)、第三回開発合宿を開催しましたので、その様子をご報告したいと思います!

f:id:kanemaru-m3:20190405151936j:plain

ご参考までに、これまでの開催の様子 (第一回、第二回) も貼っておきますので、ご興味あればそちらもご参照ください! (第一回の様子,  第二回の様子)

開発合宿を行っている背景

第一回でもご紹介していますが、基本的には日々の業務や既存施策ではできない「新しいもの」を生み出すことが目的だと思っています。
日々仕事をしているオフィスから離れ、少し歩けば海の音が聞こえるような快適な開発環境の中で、リラックスした状態で開発できること。普段別チームで、仕事上あまり関わることのないメンバーも含めて1つのチームになり、皆で立てたお題の中の1つについて好きなだけ開発をし続けられる環境というのは、開発合宿以外ではあまり実現できないことだと思います。
私も去年末にjoinしてから今回初参加の開発合宿でしたが、開催日が近づくワクワク感は何にも代え難いものがあります。また、今回はVPoE山崎が3日間フルに参戦となり、オフィスでは話せないようなくだらない話も含めて盛り上がり、楽しい時間を過ごすことができたことも付け加えておきます。

続きを読む

エムスリーの人事グループでエンジニアの採用担当を募集します!

人事の友永です。この度、人事としてエンジニア採用を担当いただく方を1名追加で募集、私と一緒に2名で担当していくことになりましたので(嬉しい!)この記事を通じて、エムスリーのエンジニア採用は楽しいぞ!ということをお伝えしたいと思います。

なぜ、採用担当を募集するのか

エムスリーのエンジニアリンググループは、2020年度末までにエンジニアの人数を約65名→120名の体制にしていきます。エンジニアリングで解決できる医療の問題はまだたくさんあり、エンジニアの力がもっと必要です。そのために、人事の採用担当を増やすことになりました。

エンジニア採用チームの構成

エンジニアの採用をどんな体勢で行っているかを説明します。特徴は人事の採用担当とエンジニアがチームを組み協力しながら日々の採用活動を行っている点です。

  • 人事グループ

採用担当1名(私)ともう1名オペレーションをフォローしてくれるメンバがいます。ここにもう1名採用担当を募集します。 もちろんエンジニア以外の採用ポジションもあるので、人事グループには他にも採用担当が数名いますし、労務担当なども所属。これらメンバとの連携も日常的にあります。

  • エンジニア採用チーム

エンジニアリンググループの中にあるチームです。VPoEの山崎さん、CTO矢崎さん、人事を兼務している機械学習エンジニアの西場さんに加え、現時点で3名のエンジニアがエンジニア採用チームを兼務しています。他にもエンジニアのグループリーダーやチームリーダー、面接官などが採用に関わっており、人事の採用担当はこれらのメンバと連携しながら日々業務を進めています。 加えて、技術顧問としてLINEの藤原さんが採用に協力してくださっています。藤原さんからは実践的なアドバイスをいただいたり、いつも本当に本当に丁寧に対応してくださるので、とても感謝しています!恵まれている環境ですね。

続きを読む