Pixela の更新で IFTTT 連携できるようになったので Google Home から飲酒記録できるようにした

前回

な記事を書いた際は

IFTTT が使えると Google Home から声でインクリメントしたりと
色々とトリガーの幅が広がって良さそうなのですが、
IFTTT の Web Hook はリクエストヘッダの指定ができないみたいでした。(ぱっと見)
このあたりは今後の機能追加や、工夫の仕方で回避ができそうです〜。

という感じでしたが、
なんと速攻でアップデートが入ってできるようになりました。

すごい!はやい!!
これで GAS 無しで IFTTT 連携できます!

飲酒していると Android 端末を手に取ってウィジェットボタンから飲酒インクリメントを
ほぼ 100% 忘れてしまう問題を抱えていたので、
Google Home でインクリメントできるように IFTTT 経由するようさっそく対応させてみました。

「Incoming Webhook 的なもの」はブログでも紹介されているように

curl -X POST https://pixe.la/v1/users/nishikawasasaki/webhooks -H 'X-USER-TOKEN:前回のトークン' -d '{"graphID":"drinking-graph","type":"increment"}'

としてインクリメントを実行する内容で取得します。
すると

{"message":"Success.","isSuccess":true,"webhookHash":"ハッシュ値"}

が取得できるので、
次からは POST で https://pixe.la/v1/users/nishikawasasaki/webhooks/ハッシュ値
呼び出すだけでインクリメントができるようになります。

IFTTT で「this」に Google Assistant を選んで、
「Say a simple phrase」に

f:id:nishikawasasaki:20181021221959p:plain

みたいに呼びかけを登録しておいて、
「Make a web request」側にはさきほど取得した URL を POST するように指定します。
なにも送信しないので「Body」は空っぽのままです。

f:id:nishikawasasaki:20181021222209p:plain

保存して Google Home に高らかに宣言しましょう

OK Google!お酒を飲んでいる!!!!

すると Pixela の草が更新されます!
もっとテンションの高いフレーズを登録して飲酒気分を高めても良いですね!!

OK Google!俺は!いま!!酒を飲んでいる!!!

いっそのこと

飲酒した人「OK Google いっしょに飲まないか?」
Google Home「お役に立てそうにありません」

なんてのも良いかもしれません (悲しい)

実際には、簡単に IFTTT 経由で Google Assistant から記録ができるようになったので、
Nature Remo でテレビやエアコンなど家電を操作した頻度を Pixela で可視化してみたり
日常の中で意識せずに草がはやせるようになった点に便利さがあるように思います。

さらにアイディアしだいでおもしろいことがたくさんできそうな Pixela 楽しいです!
id:a-know さんありがとうございます!!

Pixela で飲酒杯数を草を生やして記録する (Android のウィジェットボタンをタップして)

id:a-know さんが

というのを公開されていたので、
今日までの夏休みの最後 (?) に何か残したくて
自分にとって良い使い道がないか考えてみてました。

筋トレみたいな健康系は自分がアピールしても……だし、
自分らしい数値をと考えていたところで飲酒のことを思い出す。

ビールと日本酒では度数が違うけれど
そもそも草で可視化するのはある程度のアバウトさが許されると思って
「飲んだ杯数」をざっくりカウントしてみることにしてみました🍺

準備は上のリンク先でも説明されているとおりとても簡単。

規約とドキュメントを読んだら、
まずはどこかで自分用のトークンを作成しておきます。

それからユーザーを作成。
token には先ほど作ったトークンを指定し、
username を自身のユーザー名に、規約等読んで OK なら yes を。

curl -X POST https://pixe.la/v1/users -d '{"token":"作ったトークン", "username":"nishikawasasaki", "agreeTermsOfService":"yes", "notMinor":"yes"}'

↓正常終了を示すレスポンス

{"message":"Success.","isSuccess":true}

次は作ったユーザーでグラフを作成します。

  • id にはグラフの ID を
  • name にはグラフ名を
  • unit には単位を指定するので「杯」として「cup」を (cups の方が良かったかな?)
  • type には杯数を int で数えるので「int」を
  • color はテーマが色々あるみたいなのでまずは「shibafu」を

指定してみます。

curl -X POST https://pixe.la/v1/users/nishikawasasaki/graphs -H 'X-USER-TOKEN:作ったトークン' -d '{"id":"drinking-graph","name":"cups-graph","unit":"cup","type":"int","color":"shibafu"}'
{"message":"Success.","isSuccess":true}

ここまででグラフが完成しています!
簡単!すごい!!

まだ作ったばかりで草のない不毛の地なので、
試しに過去分を記録してみます。

昨日 (2018/10/14) は昼からビール (2 杯) と餃子を楽しんで、
夜は晩酌に日本酒を 3 杯味わったので計 5 杯でした。
これを送信するために

curl -X POST https://pixe.la/v1/users/nishikawasasaki/graphs/drinking-graph -H 'X-USER-TOKEN:作ったトークン' -d '{"date":"20181014","quantity":"5"}'

とすると、
正常に処理が完了して

{"message":"Success.","isSuccess":true}

とレスポンスを得られます。
この時点で草が生えて

f:id:nishikawasasaki:20181015170536p:plain

該当日分が (少し) 緑になって草が生えました!
過去分は覚えている限り (何も覚えていない) この形式で送信すれば記録できます。

さて、これからの分は飲んだら飲んだ分その場でインクリメントしていきたいですよね。
Pixel APIincrement を利用すれば可能です🍶
リクエスト方法はこれまでとほとんど変わらず

curl -X PUT https://pixe.la/v1/users/nishikawasasaki/graphs/drinking-graph/increment -H 'X-USER-TOKEN:作ったトークン' -H 'Content-Length:0'

のようにエンドポイントを変えるだけです。
単にインクリメントするだけなので値はなにも送信しなくて OK です。

これもリクエストが成功すると

{"message":"Success.","isSuccess":true}

とレスポンスがあります。

ただ、お酒を飲むときに毎回 curl コマンドを実行するのは
苦行ですしミスオペレーションの恐れが 400% です。
そこで、簡単にインクリメントができるように
Androidウィジェットを使ってボタンにしておきます。

ウィジェットボタンを作る方法は色々あると思いますが、
マナーモード解除・設定を自動化するために使っている MacroDroid を使いました。
Tasker など他の方法でも簡単にできると思います。

MacroDroid の場合は下記のキャプチャのように

  • トリガーをウィジェットボタン (カスタム)
  • アクション
    • シェルスクリプト: インクリメント用 API を実行した curl コマンドをそのまま貼り付け
    • ポップアップメッセージを表示: ボタンを押して動いたことがわかるように「🍺+1」をポップアップさせる

としました。
「カスタム」のウィジェットボタンにしたのはアイコン等を好きに設定したかったからなので、
MacroDroid の「トリガー」は他にボタンでも何でも大丈夫です。

f:id:nishikawasasaki:20181015171634p:plain

ウィジェットが完成したので、
Android のホーム画面にボタンとして設置しておきます。

f:id:nishikawasasaki:20181015172029p:plain

ちょっとすぐに良いアイコンが見つからなかったので
電池が充電されている状態のアイコンに「🍺」とラベルを付けておきました。
(良いフリーの🍺アイコンを探したい……)

設置したボタンをタップすると MacroDroid の「アクション」で設定したとおり
「🍺+1」とポップアップメッセージが表示されて Pixela がインクリメントされます!

f:id:nishikawasasaki:20181015172304p:plain

今日 (2018/10/15) 分に少し草が生えました!
あとは飲んだときに忘れずにこのボタンを押すタスクを
しっかり自分自身に実装してください!!

IFTTT が使えると Google Home から声でインクリメントしたりと
色々とトリガーの幅が広がって良さそうなのですが、
IFTTT の Web Hook はリクエストヘッダの指定ができないみたいでした。(ぱっと見)
このあたりは今後の機能追加や、工夫の仕方で回避ができそうです〜。
(2018/10/21 Pixela のアップデートでできるようになりました!)

ということで↓な感じに
Androidウィジェットを使って簡単に飲酒杯数を Pixela で記録できるようになったのでした🍶🍺🍷
(下記はキャプチャではなく実際に Pixela を表示しています。)

🍺草

アイディアしだいでおもしろいことがたくさんできそうな Pixela 楽しいです!
id:a-know さんありがとうございます!!

(夏休みの最後になにをしてるんだろう……)

その後……

  • 色を芝生よりビールっぽい黄色の ichou に変えてみた
  • はてなブログのヘッダに表示するようにしてみた

Reactive System Meetup in 大阪 で Akka HTTP の話をしてきました

少し時間が経ってしまっていますが忘れないうちに……。

2018/09/20 の 19 時からおこなわれた「Reactive System Meetup in 大阪」で
Akka HTTP の話をしてきました。

Reactive System Meetup in 大阪 - connpass

8 月の終わりに「突然ですが……」からはじまる DM を受け取ったことで発表を決めました。
それは折しも Scala関西 Summit2018 の CfP が 8 月末で
ちょうど良いかなーと考えていた時期だったので
ちょっとした打算もあり軽く乗っかったのでした。
(けっきょくいろいろあって CfP は出さず……。)

私の発表の前後に

  • Akka によるリアクティブシステムの概要
  • Spring WebFlux

があったので、
Akka シリーズの実例として Akka HTTP を取り上げて
ディレクティブや Streams との連携にフォーカスしてみました。
HTTP のリクエストを 1 つのメッセージとして見立てて (実際は少し違いますが)
Akka やアクターモデルを Akka HTTP からはじめるのも入り口に良いのかもと思います。

発表資料は以下です。

「Akka をどんなときに使えば良いの?」とう質問をいただきましたが、
Actor ならスレッドから解放されたいときや Remote Actor を使って楽したいとき、
Akka Streams であればメモリに乗り切らないようなデータを
リクエスト受付しだいさばいていきたいときでしょうか。
バッチを書くときなら処理の各フェーズを Actor や Streams の Flow にあてると
Akka の書き方に乗っかるだけである程度きれいな分割がされてすっきりしやすいと感じています。

また「Akka を使うと (エンジニアなど) いろいろリソース確保が難しいんじゃないの?」については
Akka に限らずなんにでも程度こそあれ当てはまるのかなと思います。
例えば冗長性や耐障害性に関して Akka ではなくインフラなどでカバーするのも一つの手で
そこは状況やチームしだいで組み合わせを変えていくのが最良だと思います。

でも「これが良さそう!使いたい!」と思ったら
信じたものと気持ちを大切にしても良いんじゃないかなとも思っています。
(要調査・要覚悟)

ブログ放置しすぎなので技術のことばかりじゃなくていいから
何か書くようにしたいなー

Scala関西 Summit2017で発表してい (ました)

すっかりブログの更新を忘れてしまっていたのですが
せっかくなので残しておきます……。

一つ前に書いた ストリーム処理と Akka Streams の発表を関ジャバでやりました をもとに
そのデータの流れの部分だけをピックアップした発表を Scala関西 Summit2017 でおこなっていました。

f:id:nishikawasasaki:20180925011557p:plain

20 分枠だと、話したいことをギュッとまとめるのがなんともですが気は楽ですね。

ストリーム処理と Akka Streams の発表を関ジャバでやりました

2017/06/24 に大阪の福島でおこなわれた「KANJAVA PARTY 2017 !!!」に参加してきました。

発表について

Java のストリーム処理や Akka Streams についての発表をしました。

kanjava.connpass.com

発表資料は以下です。
(使用例部分がちょっとお仕事の内容も含んでいたので公開用からは除いています。)

データの流れに注目して、できる限りわかりやすく説明したかったこともあり
例としているのが単純で個数の少ない Int のリストなのですが、
逆に Akka Streams がどんなときに活きてくるのかがぼやけてしまったようです。
これは発表前後にご指摘もいただきました。

Java 自体が持つ Future などの並列処理との違いや
バックプレッシャーについての内容、
そもそも RxJava どこいっとるん?などなど、
説明不足についてはまたどこかでお話できれば良いなと考えています!

聞いたセッションについて

聞けたセッションはすべておもしろくとてもためになったのですが、
特に印象に残った部分をピックアップしています。

「普段使いのDDD」 haljikさん

DDD に対しての心構えとしてお話しされていた下記の部分、 至言です。
DDD だけじゃなくて普段の開発にも、生活にも。

普段やっていないことは複雑な問題に適用できない。
普段の単純な開発でも、
知識の確認・分析・プログラミングのサイクルは
普段から何度も回すように心がけること。

『オフショア開発にも応用可能!? リモートチームの道具箱』 粕谷大輔(@daiksy)さん

メンバーのモチベーション管理や
より良いコミュニケーションをおこなうためには
どのようなことに気をつけるべきなのか。
実際に用いられている方法や事例の紹介が、
自分がリモートやオフショアのメンバーと仕事を進めていく上で
気をつけるべきことについて考えさせられる内容でした。

gitlab と backlog の git リポジトリミラーリング (gitlab → backlog)

gitlab と backlog の git リポジトリミラーリング

社内のネットワークやいろいろなアレがあって
社内の gitlab から直接 CI サーバーへ接続できないけど、
gitlab も CI も backlog へはアクセスできる時などに……。

  • GitLab Community Edition 8.12.7

github へのミラーリング方法を記載されておられる下記ページを参考にしています。

backlog 側での準備

管理画面から git リポジトリを作成しておく。
git の URL を控えておく。

gitlab 側での準備

ssh 鍵作成

backlog 側 git リポジトリへは鍵認証で接続するので、
gitlab サーバーの git ユーザーで
鍵を作成しておく。

ssh-keygen -t rsa -b 4096

→ 公開鍵の内容は backlog で登録しておくこと

2017/07/24 追記

backlog での公開鍵の追加はユーザー単位でしかできないので、 git ユーザーの公開鍵は backlog ユーザーの誰かで登録することになります。 つまり git ユーザーの公開鍵を登録したユーザーが backlog のプロジェクトに参加している必要があります。。。

git インストー

gitlab サーバーで git ユーザが
git push するので git のインストールをおこなっておく。

su - git
sudo yum install git

git remote に backlog を追加する

最近の gitlab はリポジトリの置き場所が
/mnt/data/git-data/repositories/所有者名/リポジトリ名.git へ変わっているので
下記場所で作業します。

cd /mnt/data/git-data/repositories/所有者名/リポジトリ名.git

backlog の git リポジトリを remote add しておきます。

git remote add backlog 名前@名前.git.backlog.jp:/所有者名/リポジトリ名.git

現状の gitlab リポジトリの内容を backlog 側へ同期しておく

`–all` をつけて全ブランチを push

cd /mnt/data/git-data/repositories/所有者名/リポジトリ名.git
git push backlog --all

カスタムフックの準備

git 標準の hooks は gitlab が使っているので
gitlab で hook したい場合は custom_hooks ディレクトリを用意しろとのこと。

cd /mnt/data/git-data/repositories/所有者名/リポジトリ名.git
mkdir custom_hooks

カスタムフックスクリプト作成

ここはそのまま参考にさせてもらっています。

vim post-receive

ファイルの内容は

GIT_REMOTE="backlog"

while read OLDREV NEWREV REFNAME
do
BRANCH=`git rev-parse --symbolic --abbrev-ref "${REFNAME}"`

echo "Push '${BRANCH}' branch to remote '${GIT_REMOTE}'"
git push --tag ${GIT_REMOTE} ${BRANCH}
done

カスタムフックスクリプトに実行権限をつけておく

chmod +x post-receive

msys2 で emacs 25 をビルドして runemacs から起動しようとするけど起動しないのは dll 不足 (環境のせい)

msys2 をインストールした状態でmingw64 のバッチで起動、
手順にしたがって emacs-25 ブランチを git で取得してきてビルド完了。

runemacs.exe を Windows 側 (エクスプローラ) から起動すると起動成功するけれど、
msys2 の zsh から ./runemacs.exe とかすると
ウィンドウも開かずそっと落ちているみたい。
再起動するまでは起動してたのになぜだろう?

確認のために直接 emacs.exe を起動しようとすると
libwinpthread-1.dll が足りないとのこと。

NTEmacs64 に同梱されていた libwinpthread-1.dll を持ってきて
さきほどビルドした emacs の bin にコピーしてやると無事起動するように。

そういえば再起動前までは NTEmacs64 の bin 以下に PATH を通していたのでそのせいだった……。
いつかまたやりそうなので戒めとして記録📝