ユニファ開発者ブログ

ユニファ株式会社プロダクトデベロップメント本部メンバーによるブログです。

刑務所長問題の続き

こんにちは、ヘルスケア事業部のちょうです。前回のクイズ問題はいかがでしょうか。

実はその問題、続きがあります。(前回の問題分からなくてもオーケーです。条件はまったく新しくなりますので)

「The Art of Multiprocessor Programming」第一章 問題5

The same warden has a different idea. He orders the prisoners to stand in line, and places red and blue hats on each of their heads. No prisoner knows the color of his own hat, or the color of any hat behind him, but he can see the hats of the prisoners in front. The warden starts at the back of the line and asks each prisoner to guess the color of his own hat. The prisoner can answer only “red” or “blue.” If he gives the wrong answer, he is fed to the crocodiles. If he answers correctly, he is freed. Each prisoner can hear the answer of the prisoners behind him, but cannot tell whether that prisoner was correct.

The prisoners are allowed to consult and agree on a strategy beforehand (while the warden listens in) but after being lined up, they cannot communicate any other way besides their answer of “red” or “blue.” Devise a strategy that allows at least P − 1 of P prisoners to be freed.

続きを読む

RailsをAmazon ECS(AWS Fargate)で運用する際のログ設定で工夫した点

こんにちは、Webエンジニアの本間です。

今回、Railsアプリケーションを Amazon ECS、しかも AWS Fargate の上で運用する機会に恵まれました。 その中でログに関する話を書こうと思います。

というのも、これまでのEC2インスタンス上でのログと、ECSでのログでは扱いが大きく異なっており、色々と注意&工夫しないと障害調査等で苦労することがわかったためです。 従来から変更しないといけない点、それを見据えて工夫した点をばーっと書いていきたいと思います。

続きを読む

JAWS-UG横浜 #14 AWS re:Invent 2018 RecapのLT枠で参加して初LTしてきました

こんばんは!
ユニファでインフラ担当していて、
LT後の懇親会に参加し終電間違えてしまい深夜バスで帰りながらこのブログ書いてる… . すずきです…

先週AWS re:inventがありましたね! 私は日本にいましたがいろんな新サービス、アップデートがありとてもワクワクしました。 数が多くて全然追えていませんが…

そんな中本日「宇宙一早いAWS re:Inventふりかえりイベント」に参加してきました。 今回LT枠で参加したのは @ijin さんにどこかでLTしてみなよとアドバイスもらっていて、 ちょうどre:inventがあり、本イベントがあったのとLT枠がなんとか余っていたので申し込ませていただきました。

では本題

続きを読む

Network.framework を使った TCP Socket 通信してみる

こんにちは、iOSエンジニアのしだです。
今回は iOSエンジニアらしく、iOS12 から追加された Network.framework を使ってTCP Socket でチャットアプリを作ってみます。
この前、iOSアプリで TCP Socket を経由して画像を取ってくる必要が出てできて、めんどくさいなーどうしようかなーと考えてたら同僚に iOS12 から Network.framework が追加されたよと教えてもらったので実際に使ってみました。

準備

  • Xcode 10.1
  • Swift 4.2.1
  • NIOChatServer
続きを読む

手形のサイズを自動で計測する

R&Dエンジニアの浅野です。先日ユニファの仲間から「手形の写真からサイズは自動的に分からないの?」と相談を受けました。最近のスマートフォンにはAR技術を使って長さなどを測る機能がありますが、始点終点を定める手間があるのと精度がまだ不安です。大きさの参照となるものが一緒に写っているなら写真だけ撮っておけば後は自動で測定できるはず、ということで今日はその仮説を検証してみたいと思います。

準備

f:id:unifa_tech:20181109150725j:plain:w180:right
前提として、大きさの分かっている紙(今回はA4用紙)に手形が押してあるとします。娘に協力してもらい、手の縁取りをして色鉛筆などで塗りつぶしてもらったものを撮影しました。サイズをできるだけ正確に測る上でポイントとなりそうなのが、手形が必ずしも真上から撮影されるわけではないことと、手の向きが必ずしも台紙に対して真っ直ぐではないことです。

処理開始

AI全盛の時代なので、深層学習で手形の部分をセグメンテーションして・・・といきたいところですが、基準となる性能を理解する上でも最初はできるだけシンプルな方法でやってみるのが得策です。まずはカメラの角度によって用紙が台形に見えてしまっている部分に対処していきます。このままでは縮尺が歪んでいるため正しく大きさを知ることができないからです。基本方針として、用紙の四隅がどこにあるかを検出してそれを長方形に補正することにします。

人間は簡単に四隅を見つけることができますが、ソフトウェアでそれを実現するにはいくつかのステップを踏む必要があります。具体的には、まず画像をグレースケールに変換した後に二値化という処理を行います。二値化とは、ある閾値以上の輝度をもつ画素を白に、下回る画素を黒に強制的に変換することをいいます。そうすることで台紙の輪郭を抽出することが容易になります。

f:id:unifa_tech:20181109155239j:plainf:id:unifa_tech:20181109155258j:plainf:id:unifa_tech:20181109155310j:plainf:id:unifa_tech:20181109155324j:plain
グレースケール変換から2値化を経て台紙の輪郭が検出できた。

台形補正から手形領域の検出へ

f:id:unifa_tech:20181109162339j:plain:w300:left 輪郭がわかると四隅の座標を計算で求めることができます。するとその座標から射影変換という手法を使って台形に写っていた部分を長方形に補正することが可能となります。これで縮尺が正しくなったので、続いて手形の部分を検出してその大きさを推定するという作業に移っていきます。

手形の輪郭抽出には先ほどと同様にグレースケール変換や二値化を活用していきます。二値化処理は単純なように見えますが、実は輝度ムラやノイズの影響を受けやすいため、様々な環境で撮影された画像に対して精度良く働くようにする部分はエンジニアとしての腕が試されるところです。さて、うまく輪郭を捉えることができると手形の大きさの推定まであと一歩です。

f:id:unifa_tech:20181109160457j:plainf:id:unifa_tech:20181109160721j:plainf:id:unifa_tech:20181109160508j:plainf:id:unifa_tech:20181109160516j:plain
台形補正から上記と類似の変換を経て手形の輪郭が抽出できた

いよいよサイズ推定へ。

f:id:unifa_tech:20181109160732j:plain:w200:right 最終段階になって立ちはだかるのが、最初に挙げたポイントの二つ目です。手が台紙に対して真っ直ぐである保証はないため、単純に縦方向の座標の最大値から最小値を引けばよい、というわけにはいきません。主成分分析やパターンマッチングなどを使って手の向きを推定するという方向性もありますが、ここは検出した輪郭の外接円を描き、その直径を手形のサイズとする、という方針にしたいと思います。そうすることで手の向きを気にする必要がなくなります。後は得られた直径を台紙の大きさと比較して実際のサイズを算出します。この方法で推定された大きさは14.0cm。それに対して自分で定規で実測した値は約13.8cmでした。なかなか良い精度です!

人間が測るときにはどこに定規をあてればいいのか結構迷いますし、だからこそ人によって結果にばらつきがでそうです。それを考えるといつも同じ尺度で計測できるというのもソフトウェアで実行する利点の一つですね。

最後に

当初の目的であった仮説の検証は無事できましたが、もし仮にサービス化まで見据えると技術的な部分だけでも引き続き考えたいことはたくさんあります。

  • 絵の具を使った手形で指と手の平が 離れたり部分的にかすれたりしたときにどう処理すべきか?
  • この手形が誰のものかどうやって対応づけるか? 名前を一緒に書いてもらって文字認識をする?
  • そもそも所定の大きさの台紙を使うというのは許容されるのか? 切り取ったり飾りつけた後に写真を撮りたいのでは?
  • 写真に手形が写っていると(それこそ深層学習で)認識して、サイズ計測モードに自動で移行できたらかっこいい!

どれも簡単なものではありませんが、だからこそやりがいがある内容です。技術的にできる/できない、お客様に刺さる/刺さらない、ビジネスになる/ならない、様々な葛藤を乗り越えて世に送り出したものが受け入れられて役に立ったときの言葉にならない喜び。これがあるからエンジニアはやめられません。

保育の世界を変えるエンジニア募集中

弊社では一緒に働く仲間を大募集中です。少しでも興味を持たれた方はぜひ声をかけてください! ユニファ 株式会社の採用/求人 | 転職サイトGreen(グリーン)

グッドデザイン賞受賞展に行ってきた

こんにちは。ユニファのエンジニアの田渕です。 最近、急に冷え込んだせいか、周囲に風邪の人が多数!……なんて言っているうちに、私も軽い風邪をひいてしまいました。。。 みなさんにうつさないように、大人しく自宅勤務している日々です。

だんだんとインフルエンザの声も聞かれるようになる秋、人混みは避けた方が……なんて言われますが、そんな中、グッドデザイン賞の受賞展に行って参りました。 今日は受賞展の様子と、ユニファでのものづくりについてお話したいと思います。

グッドデザイン賞とは

「グッドデザイン賞」という名前は、耳にしたことがある方が多いと思います。 知らなくても、あの赤い丸に「G」のマークのロゴは目にしたことがあるのではないでしょうか。 実は私も、自分たちが応募する、となるまでは名前は知っていても詳細は知りませんでした。

www.g-mark.org

今年、ユニファは「ルクミー午睡チェック」で応募し、グッドデザイン賞を受賞することが出来ました。

【最新情報】家族・社会のメディアコミュニケーションサポート|ユニファ株式会社

これまであまり接することもなかったので、いい機会だと思い、受賞展を見に行ってきました。

受賞展の様子

受賞展は、その年のグッドデザイン賞を受賞した製品/サービスを展示するイベントです。 今年の受賞展は東京ミッドタウンで開催されました。 f:id:unifa_tech:20181106143942j:plain ミッドタウン内の各所で、受賞した作品を見られるようになっていました。 私が訪れたのは最終日、11/4の午後でした。日曜日ということもあり、会場は様々な客層の方々で大混雑! 特に大賞や金賞、特別賞を展示していたエリアは、展示を見るにも並ばなければいけないくらいの人の多さでした。 そんな中、広い会場の中を彷徨い、ようやく「ルクミー午睡チェック」を発見! f:id:unifa_tech:20181106165136j:plain f:id:unifa_tech:20181106165159j:plain

グッドデザイン賞は、目に見えるものだけの賞ではない

実は、グッドデザイン賞の審査対象になるのは、目に見えるデザインだけではありません。 かたちのありなしに関わらず、何かの目的のもとに築き上げた製品/サービス全体が審査対象になります。(私も初めて知りました。。。)

www.g-mark.org

例えば上記は、今回受賞した「ルクミー午睡チェック」の作品詳細ページですが、「審査委員の評価」をご覧いただくとわかるように、 プロダクト自体のデザインだけでなく、システムの力を使って保育現場の課題にアプローチしていることを評価頂き、働き方改革につながる可能性にまで言及して頂いています。 この評価コメントの内容は、私たちが開発にあたって焦点を当てた部分そのものであり、それが正しく伝わって評価を頂いたということは、とても嬉しく感じました。

世の中にないものを作ることの難しさと楽しさ

前述ページの「デザイナーの想い」の項目にも記載ありますが、「ルクミー午睡チェック」が一般にサービスとして提供されるまでの道のりは簡単ではありませんでした。 解決したい課題は明確でも、その解決方法が未だはっきりと分からないのが、保育の現場の現状です。 「午睡チェックを助けるプロダクトを」となっても、じゃあどんな風に作ったら助けになるのか?どんな風に作ったら使いやすいのか?誰も答えを知りません。 海外では家庭向けで類似のサービスは色々とありましたが、お昼寝しているたくさんの子どもたちを同時に見守るには独自のUX/UIを考える必要がありました。 当時はまだまだ会社も小さく、現場の声を集められる機会も限られていたので、営業さんに園の先生方の意見を聞いてきてもらったり、園のサポートをしているオペレーションチームに話を聞いたり。 そうやって集めた意見をもとに、デザイナーやエンジニア、QAで形にしたものを、さらに現場に持って行ってフィードバックをもらったり。 初めて作るものなので、色々と途中で手戻りが発生することもありましたし、決して効率の良い開発とは言えませんでした。 しかし、今では正式にサービスを利用してくださっている先生方から「とても助かっている」というお声を頂くこともあり、そのたびにやりがいを感じます。 一方で運用が始まったからこそ分かるプロダクトの課題に直面することもあり、初期開発時に抱いていた悩みより一層複雑で現実味のある課題と日々向き合っています。

まとめ

ものづくりは大変ですが、みんなで頑張って成果が出ると単純に楽しいし、嬉しい。 多分それは、保育園や幼稚園で砂のお城やトンネルをみんなで作るときの感覚と同じような感じなのだと思います。

グッドデザイン賞の応募に関して色々と動いてくださったみなさま、ありがとうございました。(ちなみに私は何もしてません。。。) ユニファでは、一緒にものづくりをしてくださるエンジニア、デザイナー、ディレクターなどを絶賛募集中です!

ユニファ 株式会社の採用/求人 | 転職サイトGreen(グリーン)

気になった方は、ぜひお声がけください!(直接社員のTwitterやらFacebookにメッセージ頂いても結構です!)

妄想をカタチにしたい

こんにちは。新規事業部開発の柿本です。

突然ですが、皆さんは妄想してますか?!

  • 今日の夕飯の妄想
  • 週末のデートの妄想
  • 口にするのもはばかられるような妄想

色々な妄想がありますが、私たちのように物作りに携わるエンジニアにとっても、妄想することはとても大事です。

このエントリーでは物作り、いわゆる“妄想をカタチにする”ことについて書きたいと思います。

子供の妄想力

私はかねてよりCoderDojo 横浜という小中学生向けのプログラミング道場でメンターをさせていただいています。

CoderDojoでは、メンターはニンジャ(=生徒)に何かを教えるのではなく、ニンジャが主体的に「◯◯を作りたい!」と言って、それをサポートするのが役割です。

CoderDojoに参加するたびに感じるのですが、子供たちの妄想力は絶大です。

ふつーのエンジニアでは思いつかないロジックでやりたいことを実現していたり、「これは3次元画像なのかな?」と錯覚するような迷路ゲームScratch(教育用のシンプルなプログラミング言語)で作ってみたり、逆にニンジャから教えられることもあるくらいです。

そんな中で子供たちをよく見ていて気づいたのは、作ってはみたものの最初にイメージしていたものとは違うものができて悩む子は意外と多いことでした。(まあそれはそれで満足している子も多いのですが 笑)

妄想のひとつ先

妄想を抱いて行動を起こしたまでは良いが途中で行き詰まる、ということは大人になってもよくあることだと思います。

私は小さいWEBサービスやアプリを作ることが好きなのですが、「これはいいアイデアだ!」と思って作り始めても、ほとんどの場合すぐに行き詰まります。ひどい時は1時間も経たずにサジを投げることもあります。

何がいけなかったのでしょうか?

答えは簡単です。「計画」がないからです。

「妄想」をカタチにするために次にしないといけないのは「行動」ではなくて「計画」です。

大人である私は理屈ではそのことを理解しているので、ニンジャ達にそのことを伝えるためにCoderDojoで会の最初にあるメンターによるLTで以下の物を発表しました。

scratch.mit.edu

制作物の稚拙さなどのツッコミは置いておくとして、この発表で最も重要な箇所は右下の【完成までの道のり】の記述です。

実はこのLTは全3回に渡って行われており、ここの記述は以下の通りに変遷しておりました。

1回目のLT2回目のLT3回目のLT

つまり、この程度の制作物でも最初に計画を立てて、その通りに実装を重ねていく必要があるんですよ、というメッセージを込めておりました。(ニンジャたちはキャットを飛ばすことに夢中でここの記述は一切読んでいないと思いますが 涙)

おわりに

大人としてすごく当たり前のことをそれっぽく書き綴りましたが、皆さんは計画を立てていますか?!

美味しい夕飯を作るには、献立と買い物の計画が必要です。

デートで成果を得るには、入念な下調べが必要です。

口にするのもはばかられるような妄想は、妄想にとどめておきましょう。計画も行動も不要です。

物作りに関わらず、日常生活で妄想を実現しないといけない状況はたくさんあると思います。

皆さんもしっかり計画を立てて、妄想ライフを楽しんでください!