エムスリーテックブログ

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

この処理Pythonでどう書く?

f:id:doloopwhile:20100618223404j:plain

EF15形は高性能な電気機関車であったが、引き出し性能が蒸気機関車に劣ると誤解されていた。 誤った運転方法により本来の性能を引き出せていなかったのである。

(spaceaero2 [CC BY 3.0], ウィキメディア・コモンズより

こんにちは、エムスリー・エンジニアリングG・基盤開発チーム小本です。

WEBサイトは RailsやSpringなどの「本体部分」だけでは完結しません。レポート作成・データ更新などの細かい処理も必要です。

過去にはこうした用途にはBashがよく使われました。しかし、Bashは落とし穴が多かったり、クラスなどの抽象化機能がなかったりして、規模が大きくなると辛くなります。

そこで、Bashの代替候補に挙がるのがPythonです。エムスリーでもかつてはBashを使っていましたが、現在は新規案件にはPythonを推奨しています。

しかし、実際にPythonで書き直そうとすると直面するのが、

この処理をPythonでどう書けばいいのか分からない Bashなら1行で書けるのに〜!! もうBashでかいちゃえ

という問題です。

特にファイルまわり・外部コマンドまわりは、Bashでよく扱う上に、Pythonの進化によって過去に学んだ方法が Obsolete になっており混乱しがちです。そこで、よくある処理を最新のPythonで実装する方法の資料を作成しましたのでご紹介します。

続きを読む

え!?たった2日でプロダクトの新機能を!?

こんにちは、エンジニアリングGの青木です。 入社して早半年が過ぎましたが、今はクラウド型電子カルテ 「M3 DigiKar」 の開発・運用に携わっています。

今回の記事では、先日行われた第2回開発合宿で開発したM3 DigiKarの新機能について、その開発の様子をお話したいと思います。 残念ながら新機能の詳細はここでお伝えできないのですが、すごく良い機能なんで期待してリリースをお待ちください!

開発合宿とは

開発合宿とは、オフィスから離れた合宿所で数人一組のチームになってサービスの改善やアプリの開発に集中して取り込むイベントで、 今回は10/12~10/14の約2日間で行われました。 合宿の全体感に関する内容は「エンジニアリンググループ第二回開発合宿を開催しました」を読んでいただきたいです!

今回の新機能開発はM3 DigiKar開発チーム2名 + スーパーエンジニア三角さん(なんとFY18新卒同期!)の3名で行いました。

f:id:blue0513:20181109124214j:plain:w450
開発の様子を俯瞰でどうぞ

そもそも M3 DigiKar とは?

みなさん、電子カルテってご存知ですかね? そうです。あの病院とかでお医者さんが診察中などに操作しているアレです。 特に、開発合宿で新機能を開発することになった M3 DigiKar はAI搭載型のクラウド型電子カルテです。

従来の電子カルテとの大きな違いとしては、医師の操作を学習し、医師がカルテ入力に割く時間を省略できる機能を多く持っているという点です。そのため今回開発する新機能も、「自動学習機能」や「操作簡略化」を目指したものでした。リリース前なので詳細を語れないのが本当に残念です。

新機能開発に対するスタンス

さて、ここで問題になったのが今回の合宿のスタンスです。合宿期間は2日間しかないので、じっくりと腰を据えていては新機能の開発が進まないのは明らかでした。
そのため、この合宿では「新機能のざっくりとしたプロトタイプを作る」ことを目標にしました。

作ったプロトタイプを新機能自体の効果検証や新機能に対するユーザからのヒアリングに活かそうということでビジネスサイドとも合意を形成しておきました。

ですので今回の合宿であえて やらなかったこと

  • 異常系の実装
  • コードレビュー
  • ユニットテストの実装
  • 既存テストとの不整合の解消

などです。

本来プロダクトをリリースする際には気をつけなくてはならない点を無視することで、とにかく速くプロトタイピングしてみました!

開発の様子

速度重視のプロトタイピングでしたので、開発も普段のソレとは異なる方針で行いました(その準備として、事前に新機能の要件やざっくりとした仕様をビジネスサイドの方と相談しておきました)。

① ざっくりと役割分担

M3 DigiKar では、ある一つの機能については大体1人が担当して実装するのが普段の開発方針ですが、今回は新機能を3人のスーパーエンジニアが寄ってたかって一斉に実装します。なので役割分担は「各人の得意分野」を考慮しつつ「実装箇所が他人の実装箇所と被らない」ように調整していきました。

この作戦はかなり成功して、お互いが同時並行的に作業できますし、得意な箇所なので割とスムーズに実装が進みました。

② 実装とマージと修正と、繰り返すことN度

① で実装が終了した箇所から一つの branch(仮に prototype-branch とします)に順次マージしてきました。

一つのマージが終わるごとに各人が pull して、コンフリクトが起こると誰か手の空いた人間が逐次コンフリクトを解消していく手法をとり、常にお互いの作業 branch は最新を保つように意識してました。

こちらの手法も割と成功して、コンフリクトが起こったとしても最小限に抑えられ、担当箇所の開発初期段階で発生するため、リカバーが容易でした。

そしてprototype-branch がある程度まで進んだ段階で、新機能を操作してみて、その結果を一つのモニタに映して各人が意見を出し合って軌道を修正しました。 これを延々と繰り返し、新機能をプロトタイピングしていきました。

どんどんと機能ができていく様子や不具合が即修正されていく様子をワイワイと見るのは楽しかったです。

③ クオリティをあげていく

② がある程度進むと、新機能のざっくりとした部分は実装できました。ここまでで大体1.2日程度かかった感じですね。

ただ、ここまでの段階ではとりあえず完成を目標にしたので、あまり見た目や挙動の細部にこだわらずに作っていました。

なので残りの半日くらいはプロトタイプのクオリティをあげていく作業に移りました。 css の調整やUX 的な部分など、泣く泣く無視していた部分を実装できたので、エンジニアとしては嬉しい時間でしたね。

そして完成へ ......

正直合宿前は完成するかどうか半信半疑でしたが、完成してしまいました.....信じられません! いくつか勝因があったと思うので、振り返ってみました。

f:id:blue0513:20181109124120j:plain
2日間の戦いの跡

開発で良かった点

開発方針を各人にある程度一任したのは大きかったです。個々人がやりやすいように作業できたので、実装とマージと修正のサイクルがかなり速く回って、結果としてプロトタイプ(本当の初期段階)の完成が早かったです。

当然DBのテーブル構成やモデル定義などの大枠は3人でざっくり決めますが、それ以外の細かな設計や実装は各人に任せました。 お二人ともスーパーエンジニアなんで「じゃあ、あとはいい感じにやっときます」と言ってサッと期待以上のモノを出してくるのは流石でした。

開発の改善点

これは全体の改善点というか僕個人の改善点なんですが、速く開発することを意識するあまり命名が疎かになってしまいましたね......。例えば、オブジェクト生成するメソッドなのに set という prefix をつけたり、よくよく考えると実態と異なるテーブル名をつけたりしてチームを混乱に陥れてました.....。ごめんなさい。

ここから得られる教訓は「命名はめっちゃ大事」ってことですね。 みなさんなら知ってますよね。 僕も知ってるはず......でしたが、まだまだ実践できてないですね。頑張ります!

おわりに

今回は第2回開発合宿で取り組んだM3 DigiKarの新機能開発について、その概要をざっくりと書かせていただきました!

いつもと違った環境で、いつもと違ったメンバーと、いつもと違った開発スタイルでのプロトタイピングは非常に刺激的であり、勉強にもなりました。
次回もぜひM3 DigiKarチーム総出で参加したいと思ってます!

We are hiring!!

こんな感じでスピーディーなプロトタイピングをガンガン行いつつ、良いプロダクトをチームメンバーと協力して開発していけるのもエムスリーのいいところだと思ってます!

もしエムスリーの開発に興味がありましたら、カジュアル面談などいつでもウェルカムですので、ぜひ遊びに来てください!!

jobs.m3.com

Vue Fes Japan 2018, English Edition!

Greetings, all! My name is Nick, and I'm a software engineer in the Engineering Group here at M3. Today we're going to mix things up a little by delivering the first ever edition of the M3 Tech Blog written primarily in English!

英語が苦手な方もいるかと思うので、日本語でのサマリーも混ぜます!

  • Keynote
    • Bonus!
  • Next-level Vue Animations
  • Unit Testing a Vuex Store
  • Nuxt.js 2.0
  • A Deep Dive in SFC Compilation
  • Vue CLI 3 and its Graphical User Interface
  • Other Presentations
  • Vue Fes Reject Conference
  • We're hiring!

f:id:nickhall:20181108131802j:plain

11月3日Vue Fes Japanが秋葉原にて開催されました。日本のVue.jsコミュニティーだけでなく、海外からVue core teamのメンバーが登壇しました!

On November 3rd, 2018, the very first large scale Vue conference, Vue Fes, was held in Tokyo. Members of the Vue core team convened from around the world and joined the local Japanese community for a day of presentations about the Javascript framework, Vue.js. M3 participated as a sponsor, and I was lucky enough to have the chance to attend.

As an English speaker I seized the opportunity to attend the presentations given by the core team members, and they were packed with great information. I'll use this space to share the content of and reflections on the presentations themselves.

www.youtube.com

続きを読む

luigiのtargetを自分で書くための解説

こんにちは、エムスリーエンジニアリングG AIチームなんでも担当の安田(@dasoran2)です。最近 Hearts of Iron IV で世界対戦に勤しんでいます。

なにやらluigiが流行っているらしいので、一部カスタマイズをしました。 本記事はluigiの本家のコードのざっくりとした(Targetに必要な部分の)概要とやり方についてです。

なお、本文中のコードはコメントの削除等いくつか加工しています。

続きを読む

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

こんにちは、エムスリーエンジニアリングGの三角(みすみ)です。 今年の4月に新卒で入社し、コンシューマグループで主にAskDoctorsの開発をしています。

今回は、先日(10/12〜10/14)で開催した第二回開発合宿の様子を報告したいと思います。 開発合宿を行なった経緯や、前回の開発合宿の様子など気になる方は、エムスリーエンジニアリンググループ 第1回開発合宿を開催しました - エムスリーテックブログも是非見てみてください。

施設の紹介

今回も前回同様千葉県富津市金谷にあるvoidoさんにお邪魔しました。 今回が初参加の私は、どんな場所に行くのか内心ドキドキでしたが、 「テーブル、キッチン、ベッド、お風呂、洗面台など基本的な施設はもちろん、Wi-Fi、プロジェクタ、電源タップ、USB-C対応の各種アダプタなど」 設備が本当に充実していて開発合宿にうってつけの施設でした。 海が近いため少し都内よりも肌寒かったですがふかふかのお布団が用意してあって夜はよく眠れて頭スッキリの状態で開発に取り組めました。 都会の喧騒の中で開発することに疲れた皆さん、ぜひ一度訪れてみてはいかがでしょうか。

合宿で取り組んだこと

さてすっかり施設の紹介になってしまいましたが、本題の合宿の内容に入ろうと思います。 今回の合宿は以下の2チームに別れてそれぞれの課題に取り組みました。

  • 電子カルテチーム主体の問診アプリ作成(今回私はこちらに参加)
  • AI・機械学習チーム主体のArchimedesリファクタリング

エムスリーテックブログ内で再三紹介されていますが、AI・機械学習チームではプロジェクトの名前にアルファベット順でArchimedes, Bourbaki, Cantorなど数学者の名前を付けてます。 私は別チームの所属ですが、どちらのチームもRailsを使っているので、電子カルテチームに混じって開発に参加しました。それぞれのチームが何をやったかの説明は今回省き、別チームから参加した視点から取り組み方に付いて触れていこうと思います。

行くまでにやったこと

開発合宿でどれだけ開発に時間を費やせるかは事前準備に全てかかってます。
私たちのチームでは新規の機能開発を行ったため、事前に電子カルテチームのディレクター陣も交えて打ち合わせを行い、どういう機能を作成するか打ち合わせを行いました。
また、別チームから参加する場合に必須なことは環境構築です。合宿所に付いてから環境構築していては、1時間取られたりすることはザラでしょう。事前準備が当日にずれこむとチームの皆んなにも迷惑をかけることになるので「絶対に」環境構築は事前にしておきましょう。

1日目

10/12(金)の11時頃に会社を出て14時頃に到着しました。 当日は事前準備の甲斐あって、着いたらすぐに担当箇所を割り振って開発に取り組むことができました。
私の担当箇所はフォーム作成だったのですがここである問題に気づきました。

「Railsのマイグレーションどうやるんだっけ」

普段開発しているプロジェクトでは、JavaのAPIサーバーからDBへのアクセスを行っているため、Railsを使ったDBのマイグレーションを行なっていません。Railsのマイグレーションの経験はRails tutorialではるか昔にやったきりでした。。。初日は調べたり、教えてもらったりしながらコマンド打ったり、migrationファイルを書いてましたが、だんだん理解も進み、コマンドで色々生成できるしRailsって本当に便利だなあと改めて実感しました(当たり前)。

夜はお寿司を食べて、満腹幸せモードで深夜0時近くまで頑張りました。機能開発も概形ができて次の日にやることを話し合ってからぐっすり寝ました。

2日目

朝起きてチームでお散歩に行き、海を眺めた後はまた9時くらいから開発に取り組みました。

あいだあいだに頭の休憩がてら筋トレしたり、Railsの書き方についてわいわい議論したり、ピザを食べたりしていたら、いつの間にか目標の機能は完成していました。機能完成後は見た目を調整したり、細かいvalidationを追加する作り込みを行いました。

この日は19時からLT大会をしました。内容は「私の生い立ち」「今後会社でやっていきたいこと」「個人で開発してるアプリについて」「オススメのラーメン屋」などなど、それぞれ自分のテーマで5分ずつLTを行いました。私個人としては「個人で開発してるアプリについて」で他のメンバーが取り組んでいる内容がとても面白く、私も負けてられない!なんか作るぞ!!と大変刺激になる会になりました。

f:id:deltama:20181105132121j:plain
合間に筋トレをする様子
f:id:deltama:20181105132156j:plain
ピザをみんなで食べる様子

3日目

最終日は機能の最終確認をしてから進捗報告会を行いました。自分のチーム以外の進捗はあまり追えていなかったのですが、参加者それぞれ進捗と学びがあったようで大変有意義な合宿だったと思います。

私個人の三日間の感想としては普段の開発では一個の新規機能の開発を一人で担当するスタイルしか取ったことがなかったので、エンジニア内で分担して相談しながら実装を進めるスタイルはハッカソンに参加しているようでとても楽しい経験になりました。

進捗報告後は12時頃まで追加の実装をして、帰路につきました。約20時間に近い時間を会議などに気を取られない環境で開発に当てることができた結果、家に着いた後はとてもぐっすりねれました。(笑)

エンジニア募集

エムスリーでは一緒に働いてもらえるエンジニアを募集しています! 私自身インターン時代はエムスリーで「サーバサイドKotlin」を導入したチームに話を聞きました - エムスリーテックブログで紹介されているチームでサーバサイドKotlinに触れたり、 普段はコンシューマ事業でよりよいUI/UXを常に意識した開発をしたり、今回の合宿でも別チームに混じって参加したりとたくさんのことに取り組みつつ、楽しい日々を過ごしています。 この記事(or 他の記事も)を読んで興味を持った方はぜひ下記リンクよりご応募ください!

PowerPointファイルからのテキスト抽出

こんにちは!エンジニアリンググループの鹿山です。今年の4月から新卒で入社し、AI・機械学習チームでレコメンドシステムの開発・運用を行なっています。

もっぱら西場さんが日々改良を加えている luigi をラップしたモジュールを用いて開発をしているのですが、処理フローがわかりやすくなるため 結果の共有や互いのコードのレビューがしやすくなり、日々の業務が効率化されています。

(luigi についての記事はこちら)

最近、社内での業務プロセス改善の一環で、pptx形式のPowerPointファイルからテキスト抽出を自動化し解析を行いました。 そこで今回は pptxファイルからテキストを抽出する方法について共有させていただきます。

目次

  • 1. pptx ファイルから xml ファイルを抽出
  • 2. スライドの xml ファイルからテキストを抽出
  • 3. スライドマスタの xml ファイルからテキストを抽出
  • まとめ
  • We are hiring !

例えば下記のようなスライドを持つ pptx ファイルからテキストを抽出することを考えます。

f:id:kayamin:20181106203959p:plain

続きを読む

M3 USA 出張記 #4: SaaSを比較する際の高速なプロトタイプ作成Tips

エンジニアの冨岡(@jooohn)です。先週からUSにて合流した笹川とルームメイトになりました。週末は一緒にグランドセントラル駅やMoMAなどに行き、二人でさらにニューヨーカー感を高めてきました。

f:id:jooohn:20181105080451j:plain
Jackson Pollock の絵の前で満面の笑みを浮かべる笹川

f:id:jooohn:20181105072403j:plain
ティファニー本店の前でサラダの入った紙袋を持つ冨岡

f:id:jooohn:20181105072628j:plain
そもそも量が多すぎるサラダ

さて、USに来てからは、大きくMDLinxで今後使用するCMSの選定を行ってきました。

www.m3tech.blog

この選定の際に、各候補ごとのプロトタイプを作ること、見せることが以下の点で重要な判断材料になったりします。

  • APIのケイパビリティ、開発者としての使用感を確かめる
  • CMSを使って記事を作成する際の一気通貫の体験を確かめる

特に、今回は以前の記事で紹介したように、HTMLの代わりにstructuredなデータを生成し、それをHTMLに整形する、ということも行われそうです。エンジニアであれば「これはフロントエンドの実装しだいでどうにでもなるな」とわかっても、記事を書くライターにそれを理解しろというのも酷な話なので、実際に動くプロトタイプを見せることが肝要です。

この際かなり開発工数を抑えて、かつそれなりに綺麗に各候補のプロトタイプを実現できたと思ったので、いくつかTipsを紹介します。

続きを読む