2020年8月14日金曜日

一年越しの転職ブログ:Ubie株式会社にジョインしました

概要

2019年10月にUbie株式会社に入社していたのでその報告です。

なんで今頃書いたの?

入社エントリーを書いてとめっちゃせっつかれました。物臭なのと入社前後がいろいろ変わった時期で忙殺されていて書けていなかったのですが、いま思えばUbieには入社を決めるだけの魅力があったので、遅くなりつつも筆を取ることにしました。


君は誰?

僕自身、いろんなことをやっていたのですが、twitterSlideShareの講演資料WantedlyのプロフィールQiita、このブログなど、いろんなところに情報が散らばっているので、ざっと自己紹介します。


何がしたい人?

個人としては手を動かして何かを作っていたい、社会との接点としては何かを作るなら誰かの役に立つもの、面白いものでありたい人です。


社会人になるまで

小学校のときにN88-BASICを触りプログラムを学び始めました。中高生のころは小遣いを溜めてPC部品やVisual BasicやVisual C++を買ってました(当時は無料で手に入る開発環境がなかったのです)。ずっとコードは書いていたものの高校くらいまでは学校の勉強をほとんどしてなかったので成績は低空飛行していました。両親および教師から「プログラムの仕事なんかない」といわれたのを真に受け(実際、当時は少なかった)、比較的得意だった物理科に進学した。当時は情報工学科がある大学はとても少なく、選択肢が無かったのもあります。とはいえ、大学3年のときにやはりプログラムがやりたいと考え、このころにJava(1.4→5の時期)とLinux(2.4〜2.6の頃)を独学で学び始める。当時の自分はライブラリを使うという考え方が無く、なんでもかんでもフルスクラッチで作っていたが、そのときの経験が今に生きているとも感じている(2D物理エンジンや3Dのレンダラー、通信プロトコルも自分で作ってた)。
大学院の修士課程のころに諸事情でメンタルをブッ壊し、新卒の就職活動をしくじる。就職氷河期の終わり頃で新卒カードを失うとまず仕事にありつけないDead or Alive状態でした。


社会人になってから

新卒でしくじったものの何とか仕事にはありつけた。しかし当時はバブルが弾けて以降、プログラマを正規雇用する企業はとても少なく、プログラマは派遣や受託企業で案件単位で動かされるリソースという扱いで、僕もそのうちの一人でした。2014年くらいまではSIerさんやメーカーさんでWindowsアプリ作ったり、業務系Web作ったり、Androidアプリを作ってました。
ただ、この頃の自分はかなり擦れています。僕自身、要求されたものを期限内に作っていたつもりですが、何か提案/提言すると「たかがプログラマ」という扱いをされていました(実際何度も言われた)。とはいえ、当時の自分はプロダクトを如何に作るかを知りませんでした。手を動かすのは好きだったので個人でいろんなものを作ってはいたけれど、それらをプロダクトとするのに何が必要なのかを知らなかったのです。
あの頃、SIerさんやメーカーさんで会った方々に聞くと「面白ければバズって広がる」とか「良いプロダクトを作れば自然と広がる」と返って来ましたが、いまいちピンと来ず、悶々とする日々を送っていました。だけど、これは後にいろんな勉強会やハッカソン、特にStartup Weekendに参加したことで、少しずつ理解でき、解消されていきました。もっとも、この辺りは昨今のプロダクト開発に関わっている方は普通に備えているマインドセットだとは思うので、「プログラマは依頼されたものを作っていれば良い」という環境に長くいた当時の僕に抜けていた考え方だったのだと思います。
その後、紆余曲折あり2014年12月に前職であるWantedlyにジョインしました。当時はまだ20人くらいで、Androidのアプリ開発に軸足を置きつつ、プロダクト開発に携わらせて貰いました。その時に学んだことや得たものはWANTEDLY TECH BOOKや、DroidKaigiを通してアウトプットさせて貰っています。Wantedlyにジョインしたモチベーションは、自分の氷河期時代だったころの学生にあった「如何に面接官を攻略して内定を勝ち取るか」や「会社員は社内のストレスに耐えていくもの」という価値観、「社会人と学生の接点の少なさ」に課題を感じており、それらを変えたいというものでした。いずれもプロダクトを通して、やれることと、自分のやりたいと思ってたことがおおよそできたので、後は後任の人達に任せて自分は別に移ることにしました。


今回の転職活動はどんなんだったか?

知人やWantedlyやLinkedIn経由で何社かお話を聞き、その会社の社会的意義と自分の能力や時間を掛けたいかどうかを基準に選びました。特に僕はモチベーションがピーキーなので、それが維持できるものを優先して探していました(逆に給与面や福利厚生については自分の能力から相場くらいであれば気にしない、ただし安売りはしない)。給与面や福利厚生面、技術的なTRYなど、魅力的なオファーはいくつか頂いていたのですが、その中でも自分の中で医療分野における課題やそこへの自分への興味と技術的なtryが重なり、Ubieへの入社を決めました。
このとき面談等していただいた会社および採用担当の方々には時間を割いて頂き、本当にありがとうございました。深く感謝申し上げます。


Ubieに入社前と入社を決めるまで

Ubieに来る前まではAndroidアプリをメインとしていたのでKotlin言語を使っていて、その言語界隈で名前が通っていた、@ngsw_taro さん、@sys1yagi さん、@shiraj_i さんの3人がUbieに在籍していたのは知っていました。
最初にカジュアル面談で話を聞いたときはサーバーサイドKotlin(Spring Boot)を使っていることや、AIで医療をサポートをしていることを聞きました。特に後者のAIの文脈は、僕自身学生時代に知識情報処理を学んでいたので「まぁ今のコンピューターならできるよね」くらいの認識だった(僕が学生だった2000年頃のPCではGPGPUは珍しく、CPUの性能も低く、32bitの壁でメモリも足りず、厳しかった)。なので最初の頃はUbieはスタートアップ的なプロダクトや組織の成長はするだろうと思いつつも、既に目指す未来が現実的な状態になっているように聞こえたので、一回断っていました。
その後、代表の阿部と話したところ、現在の医療現場には僕の認識を遥かに超える課題があること、それらが改善できれば医療従事者だけでなく、医療を受ける人にもメリットがあり、敷いては世界中の医療の改善に繋がるということを知りました。
たとえば医師の方は時間外労働の上限が960時間(普通は360時間)というとても厳しい環境に置かれています。他の職種ならば忙しいなら売上が増えるので人を増やすことができるのですが、医療系は学校の数が限られているため、それができず、如何に業務負荷を減らすかが肝になるとのこと。
現在、医療現場で課題になっていることの多くはテクノロジーで改善できるとのこと。そこの改善にフォーカスし、実際に現場に導入され実運用されているプロダクトはUbie以外には殆ど無いないとも。でも、そこがゴールでは無く、Ubieのミッションに「テクノロジーで人々を適切な医療に案内する」とあるように、むしろそこから先にある。
僕自身、過去にSIerさんで凄まじい量の紙ベースで行われていた生産管理をITストラテジストの方とシステム化して改善をしたことがあり、それは楽しい仕事だったことを覚えています。でもUbieが解決しようとしている課題はそれの遥か上をいっているし、社会的意義も大きく、自分もそれに携わりたいと思いました。
自分はエンジニアというよりも何かを作るのが好きな身として、自分が作っていて楽しいもの、そしてそれが人の役に立つものであって欲しく、Ubieがそれに一番近いものだったので、ジョインを決めました。


Ubieにジョインしてからのギャップや印象

ときどき巷で「スタートアップらしさ」というものが話題にあがります。「スタートアップなら〇〇するよね」みたいなやつです。でもUbieだとそういうのはあまり見ません。あるのは「その場その時勢における最適を選んだら結果としてそうなった」です。言語化すると当然のことなのかもしれないのですが、現実ではそれに嵌ってしまっているスタートアップはチラホラと見かけます。それが起こってない辺り、自分の想像の斜め上を行っていました。
僕がジョインした頃は社内でスクラムの運用が始まった頃でした。丁度そのとき面白いことが起こっていました。タスクのストーリーポイント(課題の大きさ)を決めるときに、数字がデフレを起こしていたのです。簡単にいえば実際2週間くらい掛かるタスクを「いけるっしょ!」で1週間と見積もったりするやつです(ストーリーポイントを工数扱いすると怖い人に起こられるのですが)。勢いがあるにしても、ちょっと勇み足状態でした。でも、メンバーの課題への気づく能力と意識が凄まじく、数字の適正化とタスク分解が数スプリントで行われるようになり改善されました。
組織についても今のUbieのビジョンやメンバー構成、ビジネスなどを考慮した上でどの手法が適しているかを踏まえつつ、組織を作っていっているので流石だと感じています。僕の過去の経験でもワンマンの組織には各メンバーの納得感が欠落する課題があり、話し合いベースの組織だと意思決定が延々として進まない課題があったと記憶しています。これらの躓きやすい課題に嵌まり込まずに、一緒に組織の実装を協力して作っていける人達がメンバーにいると感じています。ソフトウェアでは思想と設計と実装は中々思ったとおりに擦り合わないけど、組織でも同じだと僕は考えています。それをメンバー全員が一緒に考えていける人達だと感じています。


実際、普段は何をしてるの?

僕は「AI問診Ubie」という所謂ToBプロダクトの開発に携わっています。平たくいうと医療機関様で患者さんが使うタブレットとお医者さんのPCで使用するWebアプリケーションです。バックエンドはKotlinとRuby、フロントエンドはReactをType Scriptで書いています。たまに「AI受診相談Ubie」というToCプロダクトのコード(Vue.js)も書いています。
コードを書く以外だと、スクラムの各種セレモニー(プランニングやリファインメント、デイリースクラムなど)に参加したり、全体のOKRや採用の作業もしています。これだけ聞くと「エンジニアの仕事じゃない」と思われるかも知れません。実際、そんなふうに考えていた時期が俺にもありました(AA略)、が、プロダクト的な議論も採用も、少なくとも今のフェーズでは自分が関わることがミッションの達成には必要と感じています。Ubie自体、全員で採用をしていく組織です。


Androidアプリ開発者からWeb開発者になったこと

9年ほど前にAndroidを知ったとき、当時はあのような小型のデバイスでプログラムが容易に書けるデバイスは珍しく、のめりこみ、その後、8年ほどAndroidのお仕事でご飯を食べることができました。時期的にはAndroidの機能がPoorで最新情報をずっとウォッチし、新しいものが出るたびにキャッチアップし、自分のアイディアに組み合わせられないかという遊びをよくしていました。そして、それらの課程をまとめ、勉強会などにアウトプットしていました。縁あってDroidKaigiへの登壇も何度か務めさせていただきました。でもAndroidも9年も経つと成熟し、僕の興味の中心からは逸れてきていました。
僕はもともと個人でLinuxサーバーを立てたりするくらいLinux環境が好きでした。しかし最近のDockerやKubernetes、KVMやqemuという環境はついていけてなく、他にも所謂HTML5の上にいろんな技術が出てきていても、興味があるだけで止まっていました。
大きな勉強会とかで登壇できてたのは楽しかったし、名残惜しいと思いつつも、自分の興味が薄れてきてることを続けても誰も幸せにならないなと思ったので、新しいことをやっていきたいと思います。


閑話休題

長い雑文ですがここまで読んでいただいてありがとうございました。Ubieはいい会社なので、このブログを読んで少しでも興味を持って頂けたら嬉しいです。この記事では医療業界的な難しい話は敢えて書きませんでしたが、カジュアル面談等でご説明することは可能ですので、お話を聞きに来て貰えれば幸いです。

Ubie株式会社ホームページ https://ubie.life/

2020年1月24日金曜日

M5Stackで猫のトイレを体重計にする

猫様の体重を測るのが大変だったので、猫のトイレで体重計が測れれば嬉しいなと思ってやってみました。改造には何処のご家庭にもあるM5Stackとロードセルを使用しました。

概要

猫がトイレに乗ったとき、その数字をGoogleスプレッドシートに追記されるようなシステムを作ります。重量の測定にはロードセルをトイレの下に仕込み、その値をM5Stackで読み取ります。読み取った値はM5StackからHTTP通信で、GoogleスプレッドシートのGoogle Apps Scriptで作ったAPIに送信します。




ハードウェアの作成

ハードウェアの作成というと物々しいですが、今回作るものは市販の部品をパパっとハンダ付けするだけです。どんな部品を使っているのか、どう接続しているかを見ていきましょう。

用意する部品

使用する部品は次の通りです。これらの他に、ユニバーサル基盤やピンヘッダなどの小物は適宜使用します。
  • M5Stack Basic
  • ロードセル 4ポイント(薄型) 200kg(50kgx4)
    • 荷重を電気信号に変換する装置です。
    • 電気信号は微弱なため、そのままでは読み取れないので、専用のADコンバータが必要です。
    • 秋月電子で購入しました。
  • HX711使用 ロードセル用ADコンバータ モジュール基板
    • ロードセルの信号を読み取り、デジタル信号の変換するモジュールです。
    • 動作電圧は4.5V~5.5Vであるため、M5Stack
    • 秋月電子で購入しました。
  • ロジックレベル双方向変換モジュール
  • ケース
    • 百円均一のケースです。
    • トイレの近くに設置する都合上、作成する基盤が汚れないようにするのに使用します。

配線を考える

接続にはM5Stackの向かって右側のコネクタを使用します。今回は通信にはGPIOの16と17を使用しています。
余談ですがM5Stackのポートは、ディスプレイやスピーカーなど内部で接続しているものと競合するものがあります。この図では16と17を使用していますが、PSRAMと競合するため、PSRAMを使用する場合は適宜別のGPIOを使用して下さい。
具体的な配線は次の図のようになります。ロードセル用ADコンバータは5Vで動作するため、M5Stackにはロジックレベル双方向変換モジュールを介して接続しています。


ブレッドボードとサンプルスケッチで動作確認する

回路を実際にハンダ付けする前に、ブレッドボードを使って各部品を実験的に接続し、サンプルスケッチで動作確認をしましょう。秋月電子の「HX711使用 ロードセル用ADコンバータ モジュール基板」のページにArduino向けのサンプルソースがあるので、それを動かします。微調整が必要ですがそれは次の2種類です。


  • ピンアサインに関するもの
    • ADコンバータのデータ出力(DAT)とクロック入力(CLK)のピンを指定します
      • #define pin_dout  17
      • #define pin_slk   16
  • ロードセルのパラメーター
    • ロードセルが出力する信号について、ロードセルの仕様書に基づいて値を設定します。
      • #define OUT_VOL   0.0005f    // 定格出力 [V]
      • #define LOAD          50000.0f   // 定格容量 [g]

一通り動作確認が取れたら回路を作っていきましょう。

回路を作る

配線図を元に、黙々とハンダ付けします。

ハンダ付けが終わったら、テスターで想定外の繋がり方をしていないかを確認します。確認ができたら部品を乗せます。
一通り接続したらサンプルスケッチを動かし、ブレッドボードのときと同じように動くか確認しましょう。

Googleスプレッドシートを準備する

M5Stackがデータを送信する先となるGoogleスプレッドシートを準備します。作りたいものは簡単に次のようなイメージです。


  • データを受信したとき、その月のシートが無ければ作る
  • 受信したデータを書き込む
    • データは計測された値をそのまま記録する
      • センサーの故障時に気づきやすくするため、生のデータで保存する
    • 変化前と変化後の値を記録して、引き算すれば重量が計算できる


Googleスプレッドシート上には次のように見えることをイメージしています。


スクリプトを書く

Googleスプレッドシートのメニューのツール→スクリプトエディタでスクリプトエディタが開けます。
スクリプトの詳細については割愛しますが、HTTP通信のGETのパラメーターでロードセルの検知した重量の変化前(raw_weight_from)と変化後(raw_weight_to)の2つを受信するようにします。
今回作成したスクリプトは次のものになります。



スクリプトを公開する

スクリプトエディタでポチポチするだけで公開できます。

M5Stackで認証を通すのは大変なのと機密情報でもないので、今回はアクセス権限を「Anyone」にします。

スクリプトを動作確認する

公開したときのURLをcurlコマンドなどで開いてみて動作確認をしましょう。次の例ではパラメーターとしてraw_weight_fromとraw_weight_toを付け加えています。成功すればスプレッドシートにデータが追加されているはずです。
curl 'https://script.google.com/macros/s/ここにキーが入る/exec?raw_weight_from=30&raw_weight_to=40'

M5Stackのソフトウェアを作る

もっとも楽しいM5Stackのソフトウェアを作っていきましょう。
単純にロードセルの値を計測するのはサンプルスケッチで確認できました。しかしこれだけでは猫の体重を測ることはできません。それは値の計測は0.1〜0.2秒間隔で行っていますが、ゆっくりと乗ったり、乗った後に動いていると、値が安定しないからです。

値が安定したと判断する方法

値が安定するまで待つようにすればいいですが、ソフトウェア的にはどのように判断するかを決めなければなりません。幸い、この問題は高校数学で習う分散を使えば簡単に解決できます。だいたい0.1〜0.5秒間隔で計測した値を過去5〜10個くらい記憶しておき、それらの分散を計算し、分散が一定以下に下がれば安定していると見做すとすれば、それらしく動きます。この手の計算方法は他にもあるので、調べて使いやすいものを使うといいでしょう。

他にソフトウェアに必要な機能

今回作成するものの目的を達成するには、他にも次のような機能が必要になります。
  • WiFiに接続できる
    • M5Stackの標準ライブラリで可能
  • HTTPS通信でデータを送信できる
    • ルート証明書をハードコードすればHTTPClientで可能
この辺りは適宜調整して実装します。

ソフトウェアのソースコード

最終的なソースコードは次のようになりました。



組み立て

ハードウェアとソフトウェアの一通りの部品が揃ったら組み立てて行きましょう。一度にやると失敗したときにわからなくなってしまうので、一つずつ進めていきます。

猫のトイレに設置するための脚を作る

今回使用しているロードセルは次の写真のような形をしています。
このままでは取り付けられないため、固定用の部品を作ります。今回はBlenderで適当にモデリングして3Dプリンタで印刷しました。
印刷が終わった部品をロードセルに嵌め込みます。

改めて動作確認する

使用するロードセルは4つで1セットのものなので、配線をした後、仮でプラケースに取り付け、想定通りに重量が計測できるか動作確認をします。

この写真の例では6キロが計測できました(少々誤差が乗ってますが)。

ケースを作る

M5Stackと基盤は剥き出しのままでは、不意にオシッコが掛かったりしてショートしてしまうかもしれません。簡単にでもケースを作りましょう。今回は100円均一で買ったケースを使います。
まず、中に仮置きして、マジックで印を付けます。

次にカッターで切り抜きます。手を切らないように気をつけましょう。


最後に部品を納め、コードを通します。所々はテープで目張りをするといいでしょう。


設置する

一通り終わったら、ロードセルを猫のトイレに取り付けて、可動させましょう。


課題

実際に動かしているといくつかの課題があることに気づいたので紹介します。

ロードセルの値が安定するまでの閾値

ロードセルの値が安定するための閾値に分散を使用しましたが、閾値を適当に決めたのと、うち猫様はゆっくりとトイレに乗ったり、前脚だけ乗せて一回止まったりするため、数回に分けて計測されることがありました。閾値の調整が必要そうです。

静電気の話

ロードセルの信号は微弱なため、静電気で値が容易にブレます。特にこれを作っていた頃は冬場だったのもあり、絶対値で計測すると1kgくらいズレることがありました。デバッガで繋いで放置していると、少しずつ値が上昇していくこともありました。厳密な重量系の設計ならば、それらを踏まえて設計するのでしょうが、そこまで余裕はないので悩ましいところです。
とはいえ、継続的に測定していれば、体重が減少傾向か増加傾向かはわかるので、猫様の健康管理という意味では十分だと思います。

おわりに

完成してからこの記事を書き上げるまで、なんだかんだで3週間くらい間が開きましたが、適当に作った割に前述の課題が残りつつも安定稼働をしているようです。M5StackやGoogleスプレッドシート、3Dプリンター、今回は使用しませんでしたがAndroidやRaspberryPiなど、今では電子工作に便利ないろんな部品が簡単に手に入るようになりました。生活をよくするものを作れるのは楽しいので、こういうものを活用してこれからもいろいろなものを作っていきたいと思います。

左:チャーリーさん[7.2kg]、右:犀(セイ)さん[4.3kg]