にゃーん













転職して2年が経過したはなしとこれから

TL;DR

  • 気づいたら2年経ってた!早いね! (社名も変わったし、オフィス移転は2回。もうすぐ3回目!)
  • いろいろあったけど、僕は元気です
  • やることは大盛りなのでやっていき!

振り返り

  • 1年目 (2017年)
    • 入社2ヶ月でオフィス移転
    • 社名変更
    • SREチーム爆誕
    • DB Instanceが深夜に停止
      • まさかの single-az で upgrade reboot が走っただけたった
    • db:migrate 失敗による事故発生
      • サービス停止
    • 前CTO退任
    • DB問題爆発
      • multi tenant web application 難しい
    • SREチーム解散
      • いろいろあったけど、一つのチームでやっていくことに
  • 2年目 (2018年)
  • 3年目 (2019年)
    • SmartHRのコアから一人離れて 認証基盤の刷新を進め始める
    • がんばるぞい...ぞい...

まとめ

  • いつの間にか2年たってしまっていたけど、SmartHRでやりたいことは、まだ山のようにあるのでやっていき 💪
  • 優秀なエンジニアもたくさん増えたので、チームで取り組んで良いサービスにしていくぞい!

QA

  • Q: お賃金上がった?
    • A: あがったよ!

すくすく!子育てエンジニア Meetup #3 で登壇してきた #子育てエンジニア

すくすく!子育てエンジニア Meetup #3 で登壇してきた。
新生児〜生後6ヶ月を支えた技術というテーマで、主に GoogleHome をつかっての 育児ログの運用を発表した。


登壇資料はこちら
speakerdeck.com


育児をするうえでの VUI はもう手放せない存在で、
それは、つい先日自宅の赤外線リモコンが全く使えない状況というのが発生した際あらためて思い知らされた。


すくすく!子育てエンジニア Meetup は、子育てに関する知見得られるし
子供用のお土産があってありがたいです。

次も発表ネタがあれば登壇したいと思ってます!

childcare.connpass.com

GoogleHomeのある日常 - 家庭を支える技術 Advent Calendar 2017 3日目

このエントリーは 家庭を支える技術 Advent Calendar 2017 - Adventar の 3日目として書きました。

日本でもようやく Google Home が発売されたので即購入し、家庭を支える一端として活用しています。
妻も 子育てがラクになる!?Google Homeを使ってみた - Yahoo!不動産おうちマガジン のような記事を書きました。

f:id:tknzk:20171203175817j:plain

VUI で手が離せないときに活用

娘は2歳になりましたが、目や手が離せないこと日常的にあります。そこで以前からNatureRemoをつかってテレビや電気を手元のスマホから操作するということを行っていました。
しかし、寝かしつけのときや、抱っこしたまま何かをしなければいけないときなどにどうしても手が足りないということがありました。
そこで Google Home と NatureRemo を IFTTT で連携し、操作を行えるようになりました。

連携しているもの

先にあげた NatureRemo は赤外線のリモコンを操作できるのでGoogleHome単体でできないことをするには必要不可欠です。
また、物理ボタンを操作するために SwitchBot を導入していたので、これも IFTTT を経由してGoogleHomeから操作することができるようになりました。

SwitchBot でお風呂を入れる
Instagram

娘が喋る様になってきてる

娘が、日本語を習得するようになってきていて、TV のチャンネル権を声で奪い合う未来がそうそうにきそうです。

娘「オーケーグーグル Eテレつけて」
私「OK Google テレ東つけて」
娘「オーケーグーグル Eテレつけて」

まあ、それも面白いので、良いかなとは思いつつ、対策は考えておいて方が良さそうです。

まとめ

手が足りなければ喋ればいいじゃないという感じで VUI をお手軽に導入できるのは子育て家庭にとってはだいぶたすかりました。
ただ、我が家はそもそも NatureRemo や SwitchBot を持っており、それを起動するためのGoogleHomeだったので、GoogleHome 単体だとうまく活かせないかもしれません。


nature.global
ifttt.com

www.switch-bot.com
ifttt.com

寝かしつけに導入したもの - 子育てエンジニア・クリエイター Advent Calendar 2017 2日目

このエントリーは、 子育てエンジニア・クリエイター Advent Calendar 2017 の 2日目として書きました。

娘が生まれて、あっという間に2年が経ちました。最近は、少しづず喋ることができるようになり、意思の疎通ができるようになってきました。

寝かしつけの改善

1歳半を過ぎたあたりから、自己の主張が激しくなり、またアンパンマンに激ハマりしてしまったため、リビングのTVには Hulu のアンパンマンが無限に流れている状態がありました。良くないなと思いながらも、なかなか TV を断つことができず、寝る時間になっても TV の前から離れなくなってしまいました。

そこで、寝室にプロジェクタを導入し、amazon fire stick で Hulu のアンパンマンを寝室の壁に投影して寝室に引き込むことを行いました。
効果はてきめんで、娘は布団に横になりつつ、アンパンマンを見て、そのまま寝てしまうということがかのうになり、寝かしつけの第一段階 寝室につれていくをスムーズに突破することができるようになりました。
f:id:tknzk:20171202174139j:plain
f:id:tknzk:20171202174215j:plain

現在の寝かしつけ

しかし、これも続けていると、アンパンマンを見たがために興奮して逆に寝なくなるケースが多発したので、現在は、寝室につれていく口実としてアンパンマンをつけておき、寝る時間になったら止めて、リビングも寝室も暗くし、GoogleHomeで spotify の BabySleep のプレイリストをかけ、寝かしつけを行っています。

まとめ

寝室につれていくことができれば、一定のルーチンを行うことで寝てくれるようになった。
プロジェクタの導入はいろんなご意見があるかもですが、我が家には効果がありました。



www.happyon.jp

adventar.org

子育てエンジニアになって1年2ヶ月 - 子育てエンジニア Advent Calendar 2016 9日目

このエントリーは 子育てエンジニア Advent Calendar 2016 - Qiita の9日目として書きました。

昨年 10月末に娘が生まれて、最近では、一人で歩けるようにもなってきました。
行動範囲もぐんぐん広がってますます目を離せないぐらい順調に育っています。
昨年のアドベントカレンダーでも 生まれて2ヶ月の段階での運用フローを 子育てを支える運用フロー - 子育てプログラマ・ITエンジニア・Webデザイナー Part 2 Advent Calendar 2015 として書きました。

https://www.instagram.com/p/BNwOc3YDSCp/
kickstarterでbackした gopher 届いた!

娘はなんとか無事保活をクリアし、4月から保育園にかよっています。
運用フローも細かく修正をおこなって改善を図っています。

起床からの登園準備

6時過ぎには、娘がおきるので、8時に登園できるように準備をします。
朝ごはんを食べさせて、オムツを替えて、体温を測り、保育園の連絡帳を書いて着替えをして登園です。

起きてすぐ無心でバナナを食べる

保育園の送り迎え問題

10月に妻がフルタイムに復帰するまでは、基本的には、私が登園担当で、妻がお迎え担当でした。今は逆になっていて、妻が登園担当、私がお迎え担当になっています。
これを実現するために、会社への出社時間を通常の時間から2時間ほど前倒して出退勤をしています。*1
朝は早いものの、今は夕方17:30に退社するので、ミーティングなど考慮してもらっています。

また、保育園が設立2年目だったりすることもあり、モダンな考え方で運営されていて、時間もある程度融通がきくのでだいぶ助かっています。

晩御飯

18:00にお迎えに行き、18:15ぐらいには、帰宅し、娘のご飯を食べさせます。
準備に手間取ってると、娘が激おこするので、一旦食パンを半分渡して食べさせて、気をそらしておき、メインのご飯を準備するなどしています。*2

お風呂

妻が帰宅する頃には、ご飯も食べ終わっているので、お風呂に入ります。
新生児の頃からお風呂はほぼ毎日いれているのですが、先日ついに、膝の上で💩されました。


寝かしつけ

お風呂から上がったら寝かしつけです。基本的には一緒に寝室にいき横になって寝かせるという方法で寝かしつけています。時間はかかりますが、最近は卒乳にもほぼ成功したので、哺乳瓶で白湯を飲みながら寝てくれることが多いです。
一時期、話題になった「おやすみロジャー」という本を朗読しているYouTubuを有効活用していたのですが、朗読DVDなるものが販売されたタイミングを境にYouTubeから一掃されてしまいました。。

テレビ問題

子育てとして迷いはありつつ、ちょっとした時にテレビを見せておくと、集中してくれるので、テレビは、それなりに見せてしまっています。
ただし、みるものはYouTubeみんなのうたの英語版みたいなチャンネルを中心にしています。英語の勉強にもなるしなという言い訳をしつつ、だいぶ助かっています。

www.youtube.com

まとめ

1年2ヶ月ほどたった、最近の子育て状況を挙げてみました。振り返ると子供中心の生活ですが、
基本的には共働きの夫婦2人のみで育児をしていく上で、ヘイトがたまらないようにうまく外部サービスをつかって運用できているかなと思います。
結論、娘かわいい

*1:裁量労働制なので大変助かっています

*2:アレルギー問題が起きていないので助かっています

serverless でチャットを確実に受取りたい - 家庭を支える技術 Advent Calendar 2016 2日目 #家庭を支える技術

このエントリーは、家庭を支える技術 Advent Calendar 2016 - Adventar の2日目の記事として書きました。

昨年までとは、趣きを変えて、家庭内における連絡手段の冗長化についてです。

家庭内チャットについて

我々のチームでは、チャットサービスとして以下のサービスを利用しています。

  • slack
  • LINE
  • chatwork

使い分けとしては、帰宅の連絡など普段のコミニケーションとしてはLINE、Calendarやtodoの共有、事案メールの通知などにはslackという感じになっています。
chatworkは、slack導入までは、メインに使っていましたが、今は、家庭内の連絡に使うことはほぼなくなっています。ただし妻が仕事で利用しているので、妻としては見やすいということで、アカウントはそのままになっています。

気づかない問題

どれか一つの方法でだけ連絡した場合、気づかないときには、全然気づかず、レスポンスがすぐ欲しいときに困ることがありました。
もちろん、緊急のときは、電話を鳴らしたりもしますが、それも気づかないということがあったりもしました。*1

マルチポストしたい

複数の経路をもっているので、マルチポストできれば、どれかには、気づいてもらえるかもしれません。
そこで、どこか一つに書くとそれをよしなに他のチャットにも書き込んでくれる仕組みを作りました。

実装のはなし

今回は、slackの特定のchannelに書き込むと、Outgoing Webhookによって、その内容を GCPの Cloud Functionsの http trigger に送り、Cloud Functionsが LINE Notifyと chatworkの APIをキックして、内容を書き込んでくれる仕組みを整えました。

/**
 * HTTP Cloud Function.
 *
 * @param {Object} req Cloud Function request context.
 * @param {Object} res Cloud Function response context.
 */

var request = require('request');
var config = require('config');
var lineConfigAccessToken = config.Line.access_token;

exports.sendLineNotify = function sendLineNotify (req, res) {
  var options = {
    url: 'https://notify-api.line.me/api/notify',
    method: 'POST',
    headers: {
      'Content-Type':'application/x-www-form-urlencoded',
      'Authorization': 'Bearer ' + lineConfigAccessToken,
    },
    form: { message : `${req.body.text}` }
  };
  // request LINE Notify
  request(options, recallback);

  function recallback(error, response, body) {
    if (error == true) {
      console.log(body);
    }
  }

  res.send('ok');
};
/**
 * HTTP Cloud Function.
 *
 * @param {Object} req Cloud Function request context.
 * @param {Object} res Cloud Function response context.
 */

var request = require('request');
var config = require('config');
var chatworkConfigRoomId = config.Chatwork.room_id;
var chatworkConfigApiToken = config.Chatwork.api_token;

exports.sendChatwork = function sendChatwork (req, res) {
  var options = {
    url: 'https://api.chatwork.com/v1/rooms/' + chatworkConfigRoomId + '/messages',
    method: 'POST',
    headers: {
      'Content-Type':'application/x-www-form-urlencoded',
      'X-ChatWorkToken': chatworkConfigApiToken,
    },
    form: { body : `from_slack [${req.body.user_name}]: ${req.body.text}` }
  };
  // request Chatwork API
  request(options, callback);

  function callback(error, response, body) {
    if (error == true) {
      console.log(body);
    }
  }

  res.send('ok');
};

その他packegeなどをふくめたソースは↓

Outgoing Webhookのリクエストを受取り、LINE Notifyとchatwork API のエンドポイントにPOST requestを送るだけで完了です。
APIをcallした時のエラーハンドリングなどをほぼしていないので、異常系の処理ができていないですが、正常系は問題なく稼働しています。

プロトタイプ

slackにherokuで動かしているhubotがいたので、はじめは、hubotのscriptを実装して、意図通り動くところまでのプロトタイプを作りました。

# Description:
#   Emergency bot
#
# Commands:
#   emergency channel hear
#
# Author:
#   tknzk

module.exports = (robot) ->

  robot.hear /.*/, (res) ->
    room = res.envelope.room
    text = res.message.text
    console.log room
    console.log text

    if room == 'emergency'

      # line
      request = res.http("https://notify-api.line.me/api/notify")
        .headers("Authorization": "Bearer " + process.env.HUBOT_LINE_NOTIFY_API_TOKEN)
        .headers("Content-Type": 'application/x-www-form-urlencoded')
        .post("message=" + text)
      request (err, resp, body) ->
        if err
          res.send err
        else
          if body.length == 0
            res.send "Failed "
          else
            res.send body

      # chatwork
      request = res.http("https://api.chatwork.com/v1/rooms/" + process.env.HUBOT_CHATWORK_ROOM_ID + "/messages")
        .headers("X-ChatWorkToken": process.env.HUBOT_CHATWORK_API_TOKEN)
        .headers("Content-Type": 'application/x-www-form-urlencoded')
        .post("body=" + text)
      request (err, resp, body) ->
        if err
          res.send err
        else
          if body.length == 0
            res.send "Failed "
          else
            res.send body

ただ、それではあんまりにも技術的な進歩がなさすぎたのと、昨今の流行りからお手軽に試すにはserverlessでしょうということでCloud Functionsで実装してみました。
AWS lambda を選ばなかったのは、趣味の問題です。*2 *3

さて、動作的には、↓のようなかんじになります。slackの特定のchannelに書き込むと同じものがLINEとchatworkに転送されます。

f:id:tknzk:20161201215219g:plain

まとめ

チャットを確実に受け取りたいということで、Cloud Functionsでマルチポストを実装してみました。
Advent Calendar Drivenで開発したので、実は運用はまだ行っていないのが実情です。。
なので、今日から運用開始です。

www.adventar.org

*1:妻がnotificationを切りがちという可能性もあります

*2:GCPに寄せていきたいと思っている

*3:AWS lambda + API GATEWAYは、機能はそれなりにそろってるが、その分設定も細かいのでめんどくさいっていうこともあったりもする。