日頃の行い

個人的な日頃の行いをつらつら書いてます\\\\ ٩( 'ω' )و ////

Raspberry Pi + hubot + IRKitで家電操作して日々を過ごす

この記事は Raspberry Pi Advent Calendar 2016 の10日目として書かれています。

www.adventar.org

こんにちは ara_ta3 です。
Raspberry Piを気分で買ってあまり色々やるぞ思ってから長い日が経っています。
かなり何番煎じって感じですがSlack + hubot と Raspberry Pi + IRKitで家電操作したときの話をしたいと思います。

概要

やっていることはとても簡単です。
hubotをSlack上に住まわせて何らかの命令を送ったらIRKitにリクエストを飛ばし家電を操作するという感じです。
hubotのレポジトリはこちら。
執事 英語 でぐぐって出てきたかっこいい名詞をbotの名前として選びました。

github.com

hubotの実装

実装はこのあたりからで、configで渡したデータをIRKitサーバにHTTPリクエストで投げています。
(configに乗っけていいのかよくわからなかったのでgithubには置いていません)

https://github.com/ara-ta3/steward/blob/master/src/scripts/home.js#L26

hubot-irkitというライブラリもあったんですが、
jsonをPOSTする程度のものなのでライブラリはいらないでしょう。
jsonは例えばこんな感じのものになります。

    "light": {
        "up": {
            "format":"raw",
            "freq":38,
            "data":[
                18031,8755,1190,1037,1190,1037,1190,1037,1190,1037,1190,1037,1190,1037,1190,1037,1190,3228,1150,1037,1150,3228,1190,3228,1190,3228,1190,1037,1150,3228,1190,3228,1190,1037,1150,1037,1150,1037,1150,3228,1190,1037,1150,1037,1150,1037,1150,1037,1150,1037,1150,3228,1190,3228,1190,1037,1150,3228,1190,3228,1190,3228,1190,3228,1190,3228,1190
            ]
        }
    },

IRKitの準備

IRKitは自身がサーバとなってHTTPリクエストを受けてくれます。
今回はローカルのネットワークに置きました。
とりあえずIRKitのIPアドレスが必要なので調べます。
Macのアプリでないかなと思ったらさくっと見つかったのでこれを使いました。

IP Scanner

IP Scanner

  • 10base-t Interactive
  • ユーティリティ
  • 無料

次に送信したい信号の赤外線を記憶させます。
IRKitのサーバの /messages エンドポイントに X-Requested-With のヘッダとともにリクエストを投げると直前に送った赤外線の信号が手に入ります。
X-Requested-With の値はなんでも大丈夫そうです。
なにも赤外線信号を送っていない場合は空のBodyが返ってきます。
また同じエンドポイントに受け取ったデータを送りつけると同様の信号を送ったことになりmす。

# 赤外線信号を送っていないので空bodyのレスポンス
$curl -i 192.168.0.13/messages -H "X-Requested-With: curl"
HTTP/1.0 200 OK
Access-Control-Allow-Origin: *
Server: IRKit/3.0.0.0.g85190b1
Content-Type: text/plain

# ある信号送った後のレスポンス
$curl -i 192.168.0.13/messages -H "X-Requested-With: curl"
HTTP/1.0 200 OK
Access-Control-Allow-Origin: *
Server: IRKit/3.0.0.0.g85190b1
Content-Type: text/plain

{"format":"raw","freq":38,"data":[18031,8755,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,3341,1150,1150,1150,3341,1150,3341,1150,3341,1150,1150,1150,3341,1150,3341,1150,1150,1150,1150,1150,1150,1150,3341,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,3341,1150,3341,1150,1150,1150,3341,1150,3341,1150,3341,1150,3341,1150,3341,1150]}

# このデータをサーバに対して送ると同じことが起きます
# さっきの信号は電気を1段階暗くするものだったので家が暗くなりました
curl -i 192.168.0.13/messages -d '{"format":"raw","freq":38,"data":[18031,8755,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,3341,1150,1150,1150,3341,1150,3341,1150,3341,1150,1150,1150,3341,1150,3341,1150,1150,1150,1150,1150,1150,1150,3341,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,3341,1150,3341,1150,1150,1150,3341,1150,3341,1150,3341,1150,3341,1150,3341,1150]}' -H "X-Requested-With: curl"
HTTP/1.0 200 OK
Access-Control-Allow-Origin: *
Server: IRKit/3.0.0.0.g85190b1
Content-Type: text/plain

赤外線リモコン系は大体覚えさせると便利でした。
ただ、覚えさせるのがめんどい←

感想とまとめ

  • 暑い夏とか家につく少し前のタイミングでエアコンつけたりすると帰った時涼しくてよかった
  • 家に帰る前に電気つけとくと帰ってすぐ明るくて良い
  • 言わずもがな家に帰らない人には必要なさそう
  • Raspberry Piずっと点いてる割にはあまり活用できてないなぁと感じたので来年は何かやっていきたい

hubot-characterというpluginを使ってSlack上でレムと戯れる

この記事は Re:ゼロから始める Advent Calendar 2016 - Adventar の2日目として書かれています。
www.adventar.org

ネタバレを含むので見ていない方はamazon prime videoで見れるので是非見てください。
https://www.amazon.co.jp/dp/B01KZSGOCY

こんにちは ara_ta3 です。
リゼロ最高ですよね。
私は18話が好きです。

リゼロを見ながらはじめはエミリアたんマジ天使って思ってたんですが、今はこんな気持ちです。

レムがかわいくて生きるのがつらいです。

https://cdn-ak.f.st-hatena.com/images/fotolife/s/shanonim/20161201/20161201002434.gif

画像は 僕がリゼロを好きになった5つの理由 - shanon's note より引用させていただきました。
最高の記事でしたね…w

ところで、レムりんに レムは知っています って認められるのとても安心しますよね。
レムりんに何か言ってもらえると安心しますよね。
なので今回はhubot pluginを書いてレムに色々言ってもらえるようにしました。

概要

見終わった方はもう心の底からおわかりかと思いますが、
レムりんが最高ですよね!
異論は聞こえません。聞こえないので議論いたしかねます。

さて、アニメを見ていないとレムりんに会えないのでとても日々が辛くなってしまいます。
そこで、今回はbotを経由してslack上でレムりんから励ましてもらえるようにしようと思います。
今回使うbotはhubotで、hubot-characterというpluginを利用します。
自作です

github.com

www.npmjs.com

使い方

hubotの使い方は適宜調べて頂ければと・・・w
やること

  • install
    • npm install hubot-character
  • 定義ファイルの編集
  • 環境変数の設定
    • HUBOT_CHARACTER_CONFIG
      • ↑の定義ファイルへのPATHです
    • HUBOT_SLACK_TOKEN
      • SlackのpostMessageに利用します
      • 最近のSlackだとHUBOT_SLACK_TOKENでも問題なかったかと思います

定義ファイルの編集

下記のようなフォーマットを定義します。

  • 項目の説明
    • name: Slackのユーザ名に使います
    • icon: Slackのユーザアイコンに使います
    • respond: hubot hogehogeに対応する部分です。この場合 hubot rem に反応します。
    • messages: ランダムに返してくれるメッセージです。 {name} マクロが使えます。
{
    "characters": [{
        "name": "レム",
        "icon": ":rem:",
        "respond": "rem",
        "messages": [
            "今、一緒に逃げてしまったら、レムが一番好きな{name}さんを置き去りにしてしまうような気がしますから",
            "レムは知っています。{name}さんは未来を望む時、その未来を笑って話せる人だって知っています。",
            "レムは知っています。{name}さんが未来を、諦められない人だって、知っています。",
            "レムは知っています。{name}さんがどんなに先の見えない暗闇の中でも、手を伸ばしてくれる勇気がある人だってことを。",
            "諦めるのは簡単です。⋯でも、{name}さんには似合わない",
            "レムは信じています。どんなに辛く苦しいことがあって、{name}さんが負けそうになってしまっても……世界中の誰も{name}さんを信じなくなって、{name}さん自身が自分のことを信じられなくなっても、レムは信じています。",
            "{name}さんに頭をなでられるのが好きです。手のひらと髪の毛を通して、{name}さんと通じあっている気がするんです。",
            "{name}さんの声が好きです。言葉一つ聴くたびに、心が温かくなるのを感じるんです。",
            "{name}さんの目が好きです。普段は鋭いんですけど、誰かに優しくしようとしているとき、柔らかくなるその目が好きです。",
            "{name}さんの指が好きです。男の子なのに綺麗な指をしていて、でも握るとやっぱり男の子なんだって思わせてくれる、強くて細い指なんです。",
            "{name}さんの歩き方が好きです。一緒に隣を歩いていると、たまにちゃんとついてきているか確かめるみたいに振り向いてくれる、そんな歩き方が好きです。"
        ]
    }]
}

charactersは複数キャラクターに対応しているので実は他のキャラクターも定義できたりします。

結果

このように定義するとこんな感じに動作します。
hubotの名前が dark のため dark rem というコマンドになっています。

f:id:arata3da4:20161123225027p:plain

感想

  • hubot-character 便利
  • レムりんのかわいさ鬼がかってますね。
  • レムりんに癒やされながら生きていきましょう・・・

Pythonからはじめる数学入門を読んだ

Pythonからはじめる数学入門を一応読み終えたので感想を書いてみました

jupyter使いながら進めていったのでかなりはかどりました
レポジトリはこちら

github.com

どんな本?

目次をこちらのオライリーのページから引用してくるとこんな感じです

www.oreilly.co.jp

  • 1章 数を扱う
  • 2章 データをグラフで可視化する
  • 3章 データを統計量で記述する
  • 4章 SymPyで代数と式を計算する
  • 5章 集合と確率を操作する
  • 6章 幾何図形とフラクタルを描画する
  • 7章 初等解析問題を解く

pythonの基礎的なところから始まり、中盤辺りからsympyを使いながら簡単な数式をグラフで表現したり、集合演算をしたりするような流れでした。
私はsympy全く触ったことなかったですが、使ってみたら数式を表現するのにとても便利でした。
知らなくてもとりあえず、そのまま写経すれば動くのでこの本ほんと気が楽ですw
また、各章の最後にプログラミングチャレンジという項があり、さっき知ったばかりのことを使いながら手を動かせるのでとてもよかったです。
数学の内容としては大学で学ぶようなレベルのものはなく、高校生で習うレベルの数学でした。(今の指導要領でも大丈夫かと。多分… - 2016年10月現在)
最後の7章では微積分がメインだったので数学Ⅱ~Ⅲを思い出しました。
連続性とか懐かしいです。
あの頃やったものをプログラミング言語で表せるということ自体がとても楽しかったです。

読み進め方

冒頭にも書きましたがjupyter notebookを使うのが便利です。

jupyter.org

こちらの本自体がreplで進めていく形式なのでjupyterとの相性がとても良いです。
加えて、グラフを埋め込んだり数式もいい感じに出てくれたりするjupyterを使うと色々便利だったのでjupyter最高でした。

こちらは7章の途中のjupyter notebookの様子です。

グラフを描画しつつ数式を解いた結果も見れる。
そしてそれがそのまま見れたりする。
とても便利です。
こちらで7章をがんばってる様子が見れたりします。
jupyter含め使った依存関係はこちらです。

requirements.txt

jupyter
matplotlib
matplotlib_venn

この程度しかないのでvirtualenvまたはpyvenvで入れてjupyterで動かせば楽しく学んでいけそうです。

感想

ISUCON6 オンライン予選に出て惨敗してきました。

9/17(土) にISUCON6の予選に出てきました。

isucon.net

最終結果は0点です。ただただ悲しいです。
予選前に3年目で本選行けないなんてエンジニアじゃないとか言いましたが、
生きていて大変申し訳ないです(´;ω;`)ウッ…
僕らのチームのピークは一番最初に回したベンチが4000点弱くらい行って一瞬トップ10に載ったことでしょう。

チームメンバー

チーム名は dark で由来はコミュニティ名からです。
メンバーはそのコミュニティにいるhoto17296jp_taku2でした。
来年こそ・・・

方針とかやったこととか

  • ちゃんと計測する
    • 去年ここが甘かった
    • 今年は出来た気がする
  • 頻繁に打つコマンドはMakefileに書く
    • 2回くらい打ったら追加してました
    • この辺も去年同様でよかった
  • 使用言語はRuby
    • 初めjsで行こうとしたんですが、starをつける所がバグってたっぽい?ので結局Rubyでいきました。
    • POSTしようとするとundefinedが飛んでるっぽかった
  • 午前中に環境(計測周り)を整えて午後から直していく

やったこと

Rack Profile見る限り(パット見で正直わかるけど)一番やばそうなhtmlfyをhotoに投げつつ
そもそも0点なのがやばかったのでPOSTの/star と /login ら辺をやりました。
今回のレギュレーションだとPOSTの遅延が1件につき-200点とかなので、
やばいと思いつつ直そうとして終わりませんでした。(´;ω;`)ウッ…
starをredisに突っ込むまでは良かったんですが、userの登録実は使われていなかったので、全部メモリに乗っければよかった。

計測

alpやpt-query-digestらへんをとりあえず入れたのと、New Relic入れたりRackプロファイラ入れたりしました。
正直alp使う余裕も無いまま終わりましたw slow query出てる所の改修してる間に終了でしたwww
(´ノω;`)…

  • alp

github.com

  • pt-query-digest

https://www.percona.com/doc/percona-toolkit/2.2/pt-query-digest.html

  • New Relic

newrelic.com

newrelicのアプリケーションモニタリング便利で、どのURL内でどの処理がどれくらいかかってるのかが見れたりするので大体これでよかったんじゃないかみたいな感じでした。

f:id:arata3da4:20160918173026p:plain

f:id:arata3da4:20160918173020p:plain

  • Rackプロファイラの参考にした記事

qiita.com

Makefile

Makefile便利です
後半めっちゃ疲れてきたときにあのコマンドなんだっけとか思い出さなくていいです。
makeの補完が全てを解決してくれます。
人類に優しい。
それぞれのサービスのログ確認とか、サービスやらミドルウェアのリスタートとか色々書きました。

.PHONY: /etc/mysql/my.cnf

nginx_log_file=/var/log/nginx/access.log
mysql_slow_log_file=/var/log/mysql/mysql-slow.sql
lang=ruby
dbname=isuda

#########################
# isuda
#########################

confirm:
  curl 'localhost:5000/user?name=motemen'

status_systemd:
  sudo systemctl status

show_log_isutar:
  sudo journalctl -u isutar.$(lang)

show_log_isuda:
  sudo journalctl -u isuda.$(lang)

restart_isuda:
  sudo systemctl restart isuda.$(lang)

restart_isutar:
  sudo systemctl restart isutar.$(lang)

restart_isuinit:
  sudo systemctl restart isuinit.$(lang)

restart_all:restart_isuda restart_isutar restart_isuinit

log_isutar:
  sudo journalctl -u isutar.ruby

log_isuda:
  sudo journalctl -u isuda.ruby

stop_isuda:
  sudo systemctl stop isuda.$(lang)

stop_isutar:
  sudo systemctl stop isutar.$(lang)


#########################
# nginx
#########################

confirm_nginx:
  sudo nginx  -t

reload_nginx:
  sudo systemctl reload nginx

restart_nginx:
  sudo systemctl restart nginx

alp:
  sudo alp -r -f $(nginx_log_file) $(opt)

clean_nginx_log:
  sudo rm -f $(nginx_log_file)
  $(MAKE) reaload_nginx

#########################
# mysql
#########################

restart_mysql:/etc/mysql/my.cnf
  sudo systemctl restart mysql
   @echo "Socket通信でやってるせいかこいつだけだとアプリが止まるのでmake restart_all もしたほうがいい"
  $(MAKE) restart_all

/etc/mysql/my.cnf: webapp/config_file/my.cnf
   @echo "$<$@にコピーするよん"
  sudo cp -f $< $@

show_log_mysql:
  sudo journalctl -u mysql

pt_digest_query:
  sudo cat $(mysql_slow_log_file) |/usr/local/bin/pt-query-digest

mysql:
  . ./env.sh; mysql -u$$ISUDA_DB_USER -p$$ISUDA_DB_PASSWORD $(dbname)

#########################
# redis
#########################

restart_redis:
  sudo systemctl restart redis

show_log_redis:
  sudo journalctl -u redis


#########################
# deploy
#########################

arata_fetch:
  cd ./webapp && git fetch arata

arata_merge:
  cd ./webapp && git merge arata/master

感想

  • まいくろさーびす〜〜〜〜〜〜↑↑↑↑(´;ω;`)ウッ…
  • isupam〜〜〜〜〜〜
  • NewRelic便利
  • Makefile便利
  • インスタンス1台だと他のメンバーの機能を検証中にベンチ回せなかったりして厳しい
    • とは言え複数台になるとコードの共有とかインスタンスコピーとか環境が実はちょっと違うとかありそうで怖い
    • 練習でやってみるのがいいのかな
  • ベンチの結果が0点だとなにか変わったのかすらもわからなくてとてもつらい
    • ベンチのメッセージからタイムアウトの数が減ったくらいしかわからなかった
  • Option(人権) => None
  • 生きててごめんなさい
  • 来年には人権を取り戻す
  • 一人ですらISUCONの問題で予選突破するレベルの高得点叩き出せなきゃ話にならないと強く思ったので強くなります
  • とてもつらかったけど問題はめっちゃ楽しかったです。運営の方々ありがとうございました!!

最後に

こちらが反省のために食べた地獄谷の麻婆豆腐の様子です。