さわらブログ

さわら(@xhiroga)の技術ブログ

睡眠時間をダッシュボードで表示する(Misfitアプリ版→IFTTT→Airtable→Lambda→PostgreSQL→Metabase)

睡眠時間がダッシュボードで表示できるようになりました!わーい( ´ ▽ ` )ノ
f:id:hiroga_cc:20180214061005p:plain

以下、要素技術の説明。

Misfitアプリ版

Misfit

Misfit

  • MISFIT WEARABLES CORPORATION
  • ヘルスケア/フィットネス
  • 無料

なぜMisfitか?それは...
1. アプリ単体(重要)で睡眠時間を計測でき、かつクラウド上に保存してくれる
2. しかもIFTTTでアクセスできる

この二つの要件を満たすのが、自分の観測範囲ではMisfitしかなかったんですね。
なお2018年2月現在iOS HealthCareには同期してくれませんが、IFTTTをかませば可能です👌

Airtable

GoogleSpreadSheetのUIとREST APIを標準装備したクラウド上のリレーショナルデータベースと言えば分かりやすいだろうか。
当然IFTTT連携OK。

で、テーブルをMisfitのデータに合わせてこんな感じで設定します。 f:id:hiroga_cc:20180214061535p:plain

ポイント:
* テーブル名、シート名は任意だが、後でIFTTTから参照するときに使うので注意。
* 明らかな数字以外は全て文字列型に設定しておくこと。日付っぽいデータだからと日付型にするとエラーで泣きを見る。
* Misfitが標準で書き込むデータの他に一つ列を追加する。(これだと"ParsedDate")"TimeAwoken"をプログラムで扱いやすい日付に変更するため。

"ParsedDate"列の関数の中身はこんな感じ。

DATETIME_PARSE(TimeAwoken, 'YYYY-MM-DD HH:mm') 

IFTTT

こんな感じに。 f:id:hiroga_cc:20180214071815p:plain

Record Contentはこんな感じ。

::airtable::SleepStart::{{SleepStart}} ::airtable::TimeAwoken::{{TimeAwoken}} ::airtable::TotalTimeSlept:: {{TotalTimeSlept}} ::airtable::TotalTimeOfRestfullySlept::{{TotalTimeOfRestfullySlept}} ::airtable::TotalTimeSleptInSeconds::{{TotalTimeSleptInSeconds}} ::airtable::TotalTimeOfRestfullySleptInSeconds::{{TotalTimeOfRestfullySleptInSeconds}}

Lamnda(とそれ以降)

ソース置いておきます( ´ ▽ ` )ノ github.com

楽しいのでぜひ〜。

GlassFishユーザー会のMicroservices & Cloud Evening 参加メモ

GlassFishとの関わりは普段ないのだけど、Microserviceってキーワードが気になって参加してきた!

Microservices & Cloud Evening with Payara and Hazelcast Japan Office Launch - 日本 GlassFish ユーザー会 | Doorkeeper

f:id:hiroga_cc:20180130212220j:plain

そもそも知らなかったこと

もともとSunが開発していたJavaEE=GlassFishの開発ペースが落ちていたみたい。
それを見かねて?2016年夏にIBMとかのJavaEEベンダ+ロンドンJUGがMicroProfileを発表し、
2017年夏にはJavaEEJCP(Oracleと関わりが強い?)からEclipse Foundation(だいたいMicrorofileを発表したメンバーと同じ人たち?)に移動することになった。

Microrofile

リソースの限られたクラウドで動かすためにJavaEE最小限のAPIに絞ったバージョン。
※1: クラウドのリソースが限られている、っていうのもニュアンスがよく分からない...

そういうソースがあるのかな?と思ったけどそういうわけではなく、どのAPIを選んでビルドするかの問題っぽい。

EE4J

それで、JavaEEEclipse Foundationで開発していく上でEE4Jというプロジェクト名をつけたらしい。
今日のセッションによると、まずはソースコードの移行、次にネーミング、最後に新バージョンの発表という順序?で進むそう。

その他セッションから

Payara

コンテナ対応を強化した?GlassFish。今回日本にHazelcastさんと合同のオフィスができた。
それで魚のアイコンなのか...!

Kubernetes

クーバネティス(クーバネティクスだと勝手に思っていた)
複数のコンテナを一つのマスターコンテナが管理してくれるっぽい。これを前提に、一つのアプリケーションをビジネスロジックとログとか運用監視に分けるのがSidecar Patternというそう。

OracleJavaリリースモデルの変更

18年3月からは半年ごとに時期ベースでリリースするらしい。それで、JDK10みたいなバージョン番号はなくなるそう。

自分のブラウジング履歴をSQLで見られるって知ってました?(Firefox + SQLite)

自分専用ダッシュボードを作るにあたり、ブラウジング履歴を取得する方法を調べました。
本当はGoogle マイアクティビティがAPIを用意してくれていたらよかったんですが...ない※ のでブラウザの履歴を取得します。

myactivity.google.com

APIがないだけで、Google Takeoutというサービスで自分のデータのアーカイブを取得することはできる。

やってみた

FIreFoxブラウジング履歴は"places.sqlite"ファイルに入っているので、これをDB Browser for SQLiteで表示します。
Open Databaseをクリックし、"~/Library/Application Support/Firefox/Profilles/*.default/places.sqlite"を開く。
f:id:hiroga_cc:20180128190553p:plain

すると!Firefoxの内部で使っているテーブルの一覧が! f:id:hiroga_cc:20180128190637p:plain

よく見ると、訪問したサイトの記録とサイトの情報は別々に持っている(正規化)みたいですね。これは賢い。 他にもvisit_dateをunixtimeで持っていたり、裏側感が満載でちょっとワクワクします。

勤務時間をダッシュボードで管理する(2/2) AirTable → Postgres → Metabase編

f:id:hiroga_cc:20180123065119p:plain

勤務時間, 在宅時間が自動で計測できるようになった!

IFTTT → AirTableまでは前編を参照。

AirTable → Postgres

CloudWatchで日次で起動するAWS Lambdaを使い、AirTableからRDSのPostgresにデータを突っ込んでいます。

github.com

※Lambdaで使用するにはpsycopg2とpandasをEC2と同じ環境でビルドしたものに差し替える必要があるので注意。

Postgres → Metabase

Metabaseの設定は別に難しくないんだけど、PostgresのInterval型は使えないことに注意。
SQLを直接編集して解決してます。

SELECT (略), extract("epoch" from "public"."spent_time"."spent_time")/3600 as "spent_hours"
FROM "public"."spent_time"
WHERE (略)

やってみて

まずはひと段落って感じ。本当はこの後コード行数/(在宅時間-睡眠時間) とか計測してみたいな〜。
Lambdaが日次で動いてちゃんと仕事してるの、見てるとすごい嬉しくなりますね。

勤務時間をダッシュボードで管理する(1/2) IFTTT → AirTable編

勤務時間と在宅時間がMetabase(OSSのダッシュボードツール)で確認したいな〜と思っている。
アーキテクチャはこんな感じで。

iPhoneの位置情報 → IFTTT → AirTable → AWS Lambda → PostgreSQL → Metabase

やってみた

IFTTTのAppletの設定はこんな感じ
f:id:hiroga_cc:20180120121742p:plain

  • レコードの設定
::airtable::OccurredAt::{{OccurredAt}}
::airtable::EnteredOrExited::{{EnteredOrExited}}
::airtable::LocationMapUrl::{{LocationMapUrl}}

AirTableはこう。列の属性がDate型だと書き込みに失敗するので注意。代わりに変換用の列を用意する。
f:id:hiroga_cc:20180121012807p:plain

  • 値はこんな感じ
January 19, 2018 at 09:25AM
https://maps.google.com/?q=(※緯度),(※経度)&z=18
exited
1/19/2018 9:25am
  • 変換用列の式はこんな感じ
DATETIME_PARSE(OccurredAt, 'MMMM D, YYYY at HH:mmam/pm') 

後編はこちら。

※AirTableの代わりにGoogle Spreadsheetも検討したんだけど、Pythonのライブラリが必要なのと(これはLambdaだと面倒)、僕がAirTable推しなのでこうしました。

ネイティブが使ってる英単語の省略形が分かる、変数の命名に必見のサイト「All Acronyms」

英単語を省略したいけど、何が正しいのか分からなくて困ることないですか?
例えば "Management" を省略したい時、"mgmt"がいいのか、それとも"mgt"がいいのか、みたいな...

調べられるサイトがあります。All Acronyms です。

www.allacronyms.com

ご覧の通り、ポピュラーな省略形が投票で選ばれています。これは便利!
f:id:hiroga_cc:20180107210521p:plain

以下は興味のある方向けです〜!

そもそも省略形とは

英単語の省略形を調べるとき、知っておくとよいキーワードが二つあります。"abbreviation"と"acronym"です。

abbreviation: 主な意味: 省略、短縮、省略形、略語、略字
ex) management → mgmt

acronym: 主な意味: 頭字語
ex) United Nations Educational → UNESCO

weblio英和辞典より引用

"acronym"の一種に"recursive acronym"というのがあって、エンジニアだと覚えがある人いるんじゃないでしょうか。
GNU(GNU's Not Unix!) みたいなやつですね。

調べ方

"abbreviation"と"acronym"を載せていればいいので、上記の"All Acronyms"以外にも調べられるサイトはあります。
一つ調べて見つからなかったらほかも当たってみるといいんじゃないでしょうか。

オックスフォード英語辞典: Abbreviations
public.oed.com

THE FEEE DICTIONARY acronyms.thefreedictionary.com