y.takky てくめも

web技術について勉強会の参加メモだったり、本を読んだメモだったりを載せる予定

Fitbit Charge HRが故障したからサポートに連絡して交換してもらった。

6月にかったfitbitがラバーバンドが取れかけてきて、ラバーバンドの下のプラスチック部分にも亀裂が入ってきた。

このまま使い続けると防水的な意味で不味そうなのでサポートに連絡してみた。

サポートに連絡

Fitbit Help

のサポートに連絡からEメールサポート -> 製品を選択でCHARGE HR

-> プラットフォームを不明/その他 -> 問題を選択を破損

を選択。

今回は以下の記事は役立ちますか?に当てはまらないのでEメールサポートをクリック

で、必要な情報を記入して写真も一緒に送った。

その後

メールアドレスに代替品を送るので保証書か領収書と本当にあなたのものが壊れているか証明するため 指定した番号を書いた紙と一緒に写真を送ってくれ。と言われたので、代替品送付先住所と一緒に送った。

そうすると1日ぐらいで確認出来たので代替品を送ります。1週間ぐらいで届きます。と連絡が来た。 (国内代理店で買わないとだめ。とはいえ、そうそう国内代理店以外ではうってないので問題ないと思う) Fitbit 製品の小売業者一覧

代替品送付

クロネコヤマトでそのメールが送られてきた3日後ぐらいにきました。 受け取れなかったので土曜日指定に変更して受取。

サポートの良さ。

平日に送ったので大体レスポンスまで1日で返してくれました。 かなりサポートの対応は良かったです。

参考

Fitbit Charge HRのラバーバンドがおかしな事に。サポートが神対応だった!

この記事を見ていけるかなーと思い問い合わせてみました。 破損の状況によりますが、買い換える前に念のため問い合わせてみるといいでしょう。

入社後3.5年たって

入社後3.5年

いつの間にか入社して3.5年も経っていたので、いろいろまとめてみようと思う。

意味のない仕事はない

実案件やっている時にこの仕事意味あるのかな。俺がやる必要あるのかなと思うこともあったけど、 思い返してみればすべては力になっている。

この前の勉強会でもあったけど、引き出しという点でいろいろできたのは良かったかなと思う。 趣味開発は楽しさに逃げて辛いことはやらないけど、実は辛いところこそ身につくところだと思う。

できない。に逃げない

できない。というのは言い訳でしかないし、それで怒られたこともあった。

できないというのはそこで思考停止に陥っていることになるし。 konifar.hatenablog.com

konifar.hatenablog.com

できないって言っていいのは - 法律に違反しそうな場合 法律に違反するのはダメだし、もうその場合は潔く会社やめるか告発するか

  • 使っているサービス(クラウドとか)の制約上できない場合 方針としてあるクラウドサービスを使うことになっていて、それで機能がない場合

  • やらないほうがいい場合 上の記事にある通り。やってやれないことはないけど、費用がかかりすぎちゃってできない場合とか。

プログラミングのみできるエンジニアにならない

すごくプログラムが書けて保守性も高く他のエンジニアに比べて2-3倍書けますよ。って人は別で、普通の人はそのレベルに達することはなかなかできない。 プログラムを書く能力はそれはそれで必要だけど、設計能力とその設計を実装単位でタスクに分類できることだったり、ミドルウェア周りやインフラ周りが強かったりと、プログラミング + αの能力が必要だと感じている。

よくエンジニアマネージャになりたくない問題があると思うけど、ちゃんと技術に精通していてマネジメントできる人材はすごく貴重だと思う。

英語

日本語ドキュメントだけだとどうしても限界があるし、クラウドサービスやOSSも英語のドキュメント見たほうが早いし、 問い合わせとかも英語だし英語を読む・書く能力は最低限必要であることは感じている。

google翻訳とか使うのは別に問題なくてそれで翻訳した内容に違和感あって直せるレベルは必要。 話す能力は英語が必要なところで働いていないからなんとも言えないや。できればいいし、かっこいいけど

情報の発信と整理

インプットはもとより、細かいことでもアウトプットは必要。 あとアウトプットも整理されたものだといい。

今後必要なこと

  • 業務以外でプログラミングしたりする時間を増やしたい。どんな細かくてしょぼいものでもいい。
  • 他の言語。特にスクリプト系じゃなくてコンパイル系の言語

【なつやすみのしゅくだい】go言語でfitbitAPIを叩いて睡眠情報を取得する。

【なつやすみのしゅくだい】

前々からgo言語触りたかったってことと、FitbitAPIを叩いて情報を取得したかったので、夏季休暇期間の暇な時間にgo言語でfitbitAPIを叩いて睡眠情報を取得してみた。

ソースはこちら

github.com

作業のお供

zenpad7で dアニメストアでアニメ見ながら作業するのが捗った。
タブレットスタンドがかなり役立った。 CLANNAD Afterの後半とハナヤマタ前半見終わった。

anime.dmkt-sp.jp

fitbitAPIを使うために諸々登録する

dev.fitbit.com

dev.fitbit.comにユーザ登録をした後アプリケーションの登録を行う。
f:id:ytacky:20160818201858p:plain

画像の通りに必要なところを埋めていく。
Applicatinon NameやDescription, Application Website, Organization, Organization Websiteまでは適当でOK
自分で使うだけだし。
OAuth 2.0 Application Type はClientを選択した。
Using Implicit Grant Flowを使うためにはClientを選択する必要がある。

Using OAuth 2.0 — Fitbit Web API Docs

Callback URLは重要で、ここで登録したアドレス以外がcallbackのURLとして指定されても使うことができない。
今回はgoのビルドインサーバを使うのでlocalhost:8080とした。
Default Access Typeは読み取りだけでいいのでReadとした。

これでSaveすると、OAuth 2.0 Client ID / Client Secretが発行される。
また、 OAuth 2.0: Authorization URI と OAuth 2.0: Access/Refresh Token Request URIも取得できる。 (このURLは共通なので発行される。というより表示される。という書き方が正しいかもしれない)

どんな感じに叩くか確かめたい

Fitbit API Debug Tool

Debug toolが用意されている。
これに自分のClient IDやsecretを入力し指示に従って行くと、一通り認証から必要な情報の取得までできる。
プログラムを組み終わった後この機能に気づいた...

認証ページのURLを生成する

generateOauthURL.goとして作成した。

今回はAuthorization Code Flowで認証するための認証ページのURLを作成した。 examplsにあるように、

https://www.fitbit.com/oauth2/authorize?response_type=code&client_id={client_id}&redirect_uri={redirect_uri}&scope={scopes}

となる。 client_id/redirect_urlは上で生成したものになる。

scopeは

Using OAuth 2.0 — Fitbit Web API Docs

から見たい情報のscopeを選択する。今回は睡眠情報なのでsleepを指定。複数の場合空白で繋げて%エンコードする必要がある。 (%20で複数scopeをつなぐ)

コード上では、HttpParam構造体とAuthUrl構造体を作り、必要な情報はこれを使うようにしている。
また、環境変数は.envとしてアプリケーションのルートディレクトリに作成して、それをgithub.com/joho/godotenvライブラリを使用して読み込んで使用している。

アクセストークンの取得

上記で生成したURLにアクセスすると認証画面が表示され、認証するとredirect_urlに設定したページに飛ばされる。
このリダイレクト先をfitbit.goとして作成している。
今回は簡単に使いたかったのでgoのbuild inサーバを使用している。

リダイレクトされるとクエリパラメータに?code=とaccess token取得用のcodeが付与される。
まずはこのcodeを使用してaccess tokenを取得する。

https://dev.fitbit.com/docs/oauth2/#accessT

endpointのURLはhttps://api.fitbit.com/oauth2/token これに対してPOSTを行う。必要なBody部分としては、
リダイレクトのときについてきたcodeとgrant_type=authorization_code,client_id,redirect_uriが必要。 また、Headerには {client_id}:{client_secret}をBase64 Encodingしたものが必要となる。:をつけた状態の文字列をBase64 Encoding忘れるのがありがちなミスなので注意したいところ。

これでPOSTするとjson形式でaccess_tokenやscope,user_idが返却される。
この値をdecodeしたいので、FitbitJsonという構造体を作り、json.Unmarshalでdecodeした。

これで睡眠情報を取得するためのユーザIDとaccess_tokenが取得できた。

睡眠情報を取得する。

Sleep Logs — Fitbit Web API Docs

睡眠情報に関してAPIは多種あるが、今回は単純に睡眠時のログを取得するAPIを叩く。
APIのエンドポイントは、https://api.fitbit.com/1/user/[user-id]/sleep/date/[date].json となる。user-idはアクセストークンの取得で取得できたものを使用する。
dateはyyyy-MM-dd形式で指定する。
このAPIを叩くときには認証が必要なのでHeaderに Authorization: Bearer [access_token]
を与えてあげる必要がある。
これで睡眠情報が取得できる。

睡眠情報の形式

以下のようにjson形式で返却される。 (ここでは見やすいようにjson_decodeしたものを記載している)
起きた回数や睡眠効率。何時に寝てその時間帯はどんなステータス(寝返りを打っていたのか、目覚めていたのか)
何時間寝ていたのか。など取得できる。

{
    "sleep": [
        {
            "awakeCount": 0, 
            "awakeDuration": 0, 
            "awakeningsCount": 13, 
            "dateOfSleep": "2016-08-xx", 
            "duration": 25260000, 
            "efficiency": 94, 
            "isMainSleep": true, 
            "logId": 12226936629, 
            "minuteData": [
                {
                    "dateTime": "00:49:30", 
                    "value": "1"
                }, 
                {
                    "dateTime": "00:50:30", 
                    "value": "1"
                }, 
               ~~~~~
                {
                    "dateTime": "07:49:30", 
                    "value": "1"
                }
            ], 
            "minutesAfterWakeup": 0, 
            "minutesAsleep": 396, 
            "minutesAwake": 25, 
            "minutesToFallAsleep": 0, 
            "restlessCount": 13, 
            "restlessDuration": 25, 
            "startTime": "2016-08-xxT00:49:30.000", 
            "timeInBed": 421
        }
    ], 
    "summary": {
        "totalMinutesAsleep": 396, 
        "totalSleepRecords": 1, 
        "totalTimeInBed": 421
    }
}

今後

REFRESH TOKENをつかって認証したり、何か別なシステムと連携して捗るようにしたい。

AWS lambdaとAPI GatewayでLine Botを使う

今年のAWS summitではAWS lambdaを使ってマイクロサービスを実現する。という発表が多かった。

 

そういうこともあり、lambdaをちょっと触ってみた。

lambdaを使う時のネタとして、Linebotがちょうどよかったので、Linebotを使ってみた。

 

あとは、ちょうど身内でミニ四駆をやるときに作るミニ四駆のシャーシおみくじを作ってくれとのことで、

AWS lambda + API Gateway + Line Botでシャーシおみくじを作った。

この記事ではLine Botの使い方 というよりは、

AWSアーキテクチャの使い方周りの紹介をする。

 

# Line developersに登録

Line botを作成するためにはLine developersに登録が必要なので登録しておく。

登録して、Channel ID等をメモっておく。

 

# Lambdaの準備

AWSのコンソールにはいってLambda Management Consoleを開く

f:id:ytacky:20160625175648p:plain

Create a Lambda functionからSelect Blue Printの画面に行く。

他になにか作るときはここから雛形を使えるっぽい。

今回は空で作りたいのでSkipを選択

 

Step2:Configure functionで各種設定をする。

とりあえず、 NameとRuntimeを適当に設定する。

RoleはAWSconfig roleあたりで作っておく。

 

そしてNextをクリック

CodeにCodeを作っておく。

今回はgithubにあげといた。

github.com

# API endpointを当てる

Add API endpointからAPI Gatewayを選択してAPI endpointを作る。

f:id:ytacky:20160625181545p:plain

 

ここで注意したいのは、LineBotでは MethodがPOSTでくるので、

API GatewayでもMethodをPostにしておく。

 

API Endpointを作成したらLineDevelopersのCallback URLにそのURLを登録しておく。

注意点としては、LineBotでは443ポートを作るようなので443を指定しておくこと。

 

https://{awsapi.execute-api}.us-west-2.amazonaws.com:443 こんなかんじで

 

# テスト
API EndpointがVeryifyしたら、LinedevelopersにあるQRコードを読むと友達にbotを追加できるので追加する。

上のコードのサンプルでは、

1行目におみくじとして引くシャーシを,区切りで。

2行目にユーザを,区切りで入力する。

 

すると、ユーザに対してそのユーザが使うシャーシが選択される。

 

テストの際は、CloudWatchのログを見るといい。

今回はLineからの送信データをダンプしてるので、誰がどんなテキストで送ってきたかがわかる。

 

IFTTT+SlackでECで買ったものをごちうさのシャロに通知してもらう

Amazonやヨドバシ.comなどを使ってよく買い物をするがわざわざGmailを開かなくても、Slackに通知がされれば便利だなと思いIFTTTで構築したメモ。

なお、EC=お買い物=シャロという勝手なイメージからシャロが通知してくれるようにしている。

前提条件

GmailとSlackとIFTTTに登録済み。

Gmailの設定

ECに登録しているメールアドレスを一つのGmailに集約しておく。 その後ECというラベルを作りフィルタをかけておく。

フィルタは設定->フィルタとブロック中のアドレスの新しいフィルタを作成から

使うのがAmazonとヨドバシとビックカメラとimaginewebぐらいなので以下のような条件でフィルタ。 使うECが多ければよしなにここでフィルタをかけるといい。 ここで作ったフィルタに引っかかったものがSlackに送られるので通知が多いなと思ったらフィルタ条件も変えておくと吉。

f:id:ytacky:20160618172712p:plain

IFTTT設定

すでにあるレシピから作ってもいいけど、今回は一から作成してみる。 Create Recipeから

f:id:ytacky:20160618173118p:plain

thisをgmailで検索してgmailを指定 Connect the Gmail ChannelでGmailにつなげる必要があるのでConnect f:id:ytacky:20160618173538p:plain

Triggerに New email in inbox labeledを指定 f:id:ytacky:20160618173216p:plain

Labelをさっき作ったLabelを指定。今回はEC でCreate Trigger f:id:ytacky:20160618173252p:plain

thatの方はslackを指定 slackもconnectしておく

f:id:ytacky:20160618173642p:plain

ActionはPost to Channelしかないのでそれを指定 f:id:ytacky:20160618173340p:plain

次にActionを指定する

Which channel? は投稿したいchannelを選択

Messageは表示したいmessageを選択する。

Gmailから受け取ったものも表示できる。 例えば{{BodyPlain}}でメール本文が表示できるし、 {{Subject}}でメールタイトルが表示できる。 また、好きなメッセージも入れるのでここをシャロっぽくするととてもいい。

同じようにTitleやTitle URLを選択しておく

最後にThumbnail URLを指定する。 ここは画像が表示されるのでシャロのアイコンとかにしておくといい。 私は公式で配布していたtwitter用のアイコン

www.gochiusa.com

をS3において指定している。

そうすれば出来上がり。 あとはECからのメールが来るのを待つ。

完成イメージ

f:id:ytacky:20160618174658p:plain

こんな感じにシャロが注文したものを通知してくれる。

まとめ

いまは各サービスの繋ぎこみを自動でやってくれるのが多くなった。 自分でプログラムを組むのもいいけど目的を達成する。というのだけならば こういうサービス使ってしまうのも楽でいい。

そして私はリゼ派だ。

2016年の目標(技術以外)

・ちゃんと部屋の掃除をする。

机の上とか汚くて作業が捗らなかったりするからきれいにしておく。

使ったものはちゃんともどす。

・無駄なものを買わない。

洗剤とか調味料とかストック品あるかどうかちゃんと確かめてから買う

本はできるだけ電子書籍に移行する。

書籍で買っていい本はこれまでシリーズ買ってきたものか、捨てて問題ないものかのどちらかで。

プライズとかも本当に必要か吟味して金突っ込む

・収支をちゃんとつける

お前昼飯高杉じゃね?って言われたのもあるけど、ざっくりとした収支のみだったからもっと細かくつける

・投資

これはできたらといいな。という感じ。投資はともかくふるさと納税とか減税できそうなものは使っていく

・ブログ書く

月1でいいから書く。アウトプットは大事

 

 

コードレビューに関して

iwashi.co

 

超同意したので超久しぶりにブログを書いてみる。

お酒飲んでるテンションで。

 

>■コードレビューを最優先に! ※

※ 障害やお客様対応は除く

 

ほんとすべてこれにつきると思うんですよね。

レビューする方は、さっさと見て指摘すればいいし、レビューされる側はそれを即直しすればいい。

元記事にある通り、何も一回で完璧なレビューをする必要はなくて気がついたところをちょっと指摘してやればいい。

雑談している暇があれば、1ファイルぐらいは見れるしそもそも雑談しながらでもソースは見れるしね。

元記事にある通り、最悪ソース見てよくわからんけど動作確認上はOKでも問題ないと思うし。

 

レビューをされる側としては、

・何を目的としているか

・なるべく機能ごとに分割してレビューを出す

ということが大事だよね。

 

この辺も同意できる。というか元記事はもうすべて同意されてバイブルにしたいレベル。

 

期間は長期間与えているのにレビュー間に合いませんというのは甘えだし、どこかタスクの処理の優先順位付けがおかしいよね。