読者です 読者をやめる 読者になる 読者になる

子供が産まれたから、おうちハックしてみた

前置き

2017年1月15日に初の娘が産まれました。23日が予定日だったのですが、寒波、満潮、満月の影響で予定よりも早く産まれました。 *1

嫁と娘が退院してから1週間仕事を休み、嫁の休息確保や、私の初の育児強化週間にあてさせてもらいました。
職場の方々が休みの取得を快く承諾してくれたので、本当にありがたかったです。

1週間の休み、ただ子育てに勤しみ、その後はいつもどおり仕事かーと思うと少しさみしいものがあります。
そういえば昨年末のアドベントカレンダーRaspberry Piを使った「http://qiita.com/advent-calendar/2016/ouch-hackおうちハック」が面白かったな−と思い、いい機会なので試してみることにしました。

qiita.com

要件定義

要件としては以下を初めのゴールに決めました。

  • お家用チャット
  • 赤ちゃん見守りカメラの導入
  • ミルク、うんち記録

方針

お家用チャット

職場ではRocketChatを使ってChatOpsを行ってます。 *2

github.com

職場はオフライン環境なので、上記を導入しましたが、家庭用なので無料枠もあるSlackで十分です。

slack.com

作成したチャンネルは以下のような感じです。 f:id:kakushika:20170129235806p:plain

#****_now(娘の名前は伏せてます)

娘の状況を把握するための専用チャンネルです。BOT導入する場所でもあります。

#buy-list

赤ちゃんの出産準備をいくらしてても、足りないモノはいくらでも出てきます。
中には消費が激しいものも。アレ買ってきて!やコレをAmazonでポチってという話をここでします。
一番激闘したのが空気清浄機でしたね。どれがいいか嫁とここで激しくやりあったものです。。

#car-music-request

今まではカーナビで見ると言ったら地デジでテレビ見るか、SDカードで動画をYouTubeで落とした洋楽のPVを再生するかでした。

qiita.com

赤ちゃん用にカフカの動画やディズニーのPVを再生したいので、そういった動画のリクエストを嫁からここで受け付けることができるようにしました。

www.youtube.com

#cookpad-feed

slackには外部アプリ連携としてRSSのfeedを読み込めるとあったので、CookpadRSSを読み込んでみました。
ただ、特に何かに活かされるわけでもないので今は止めてます。

#drinking-milk

3時間おきにミルクを飲む必要があり、何時飲んだっけ?を夫婦で共有するためのチャンネルです。
タイトルに沿わないですが、うんち何時したっけ?もここで共有しています。

#event-calendar

Googleカレンダーとの連携もSlackデフォで提供されていたので、Googleカレンダーに家族や友達がいつ来るのか、検診はいつなのか登録しておき、ここで新規イベント通知や、前日に明日の予定などを通知されるようにしました。

#general

デフォです。利用者は私と嫁しかいないので雑談メインですね。

#random

ここもデフォです。使ってないです。

赤ちゃん見守りカメラの導入

購入したものはRaspberry Pi3本体と、赤外線カメラ、microSDカードです。

以下のような、よくある「あかちゃん見守り」カメラを作りたかったわけです。

注文して翌日には届き、さっそくSDカードにRasbianを入れ、カメラを接続して有効化しカメラのテストを行ったわけですが、どうにもこうにも赤外線カメラを認識してくれない。
そして右上に雷マークで、電力足りないと出る。・・・ということは2Aでは足りないから3Aか?と思い以下も追加注文しました。

がしかし、結局カメラが認識されることはなく、赤外線の発光パーツは外してカメラのみ利用するようにしたら認識してくれるようになりました。 *3

やったことは、「OSセットアップして、カメラ認識させてHubot入れてSlackからカメラ撮影を命令してアップさせる」です。

f:id:kakushika:20170130010229p:plain

詳細は後日記載します。

ミルク、うんち記録

これはSlackの#drinking-milkでのやりとりです。

f:id:kakushika:20170130010323p:plain

ただこれだと不便だったので、余ってたiPad mini(第2世代)を使ってアプリを作りました。 f:id:kakushika:20170130011552j:plain 起動して置きっぱなしで、哺乳瓶かウンチのボタンを押せばSlackに通知されるのと、Googleスプレッドシートに記録されるようにしました。 f:id:kakushika:20170130011731p:plain

f:id:kakushika:20170130011820p:plain

こちらも後日詳細を記載します。

*1:トリプルアタックで産婦人科はラッシュでした。助産師さんたち大変だったと思います。そんな中丁寧に対応してもらえて本当にありがたいです。

*2:職場でのChatOpsの導入背景や構成はこちらを参照

*3:ハズレひいたのかな?なんかハズレがあるらしいですけど、詳しく調べてないです。

マイクラPC始めました

今更マイクラのPCを始めました。
前までPEやってたんですが、煩わしくなって今更PCに乗り換えです。

とりあえずスクショだけ。

木と小麦を育てるエリア

f:id:kakushika:20160829051042p:plain

牧場予定地

f:id:kakushika:20160829051140p:plain

船着場(入水前)

f:id:kakushika:20160829051221p:plain

船着場(入水後)

f:id:kakushika:20160829051253p:plain f:id:kakushika:20160829051324p:plain

早く寝床をどうにかせねば・・・・
f:id:kakushika:20160829051357p:plain

オフラインでもChatOpsしたい!Dockerで解決しよう!

経緯

ざっくり言うと、ChatOpsしたい!けどネットワークに制約がある!なのでDockerで必要なものを用意してイメージを持ち込もう!という経緯です。

入れるもの

Restyaboard

Trelloのクローンです。
プロジェクト管理でRedmineを使ってましたが、カンバンを使いたく、かといってRedmineのカンバンがあるけどもRedmineは個人的に今後の展望wktkしなかったので流行ってるTrello!・・・を使えないからそのクローンのRestyaboardを使ってみようという経緯です。

Rocket Chat

Slackのクローンです。
最初はLet's Chatを使ってました。
すごくシンプルで、かつオシャンティなので浸透も早かったです。ただ問題点が、アバター画像がgravatarで外部接続が必要で、こちらの記事を参考に手を加える必要がありました。アップデートする度に手を加えるのも辛いし、もっといいのないかと探してたら見つけたのがRocket Chatです。

高機能なのですが、浸透するのに逆に足かせになりそうだなと思いつつ、WebRTCでのビデオ通話ができるという点が大きくメリットで切り替えるようにしました。

Hubot

Gitlabなどと連携させるためにBOTとしてHubotもいれます。

Jenkins2

Jenkinsがメジャーバージョンアップしました!(パチパチー!)
よく使われるプラグインがデフォルトで同梱されるようになったらしいので、せっかくだし2でいこう!という経緯です。

その他

コード解析用にSonarQubeと、ナレッジベース用にLodgeかなにか・・・を入れようと思ってます。

Docker Compose

Docker Composeで入れることができます。

OSSがオフィシャルで公開しているものを組み合わせて1つのComposeファイルにします。

docker-compose.ymlファイル

data:
  image: busybox
  volumes:
    - /usr/share/elasticsearch/data
    - /var/lib/postgresql/data
    - /usr/share/nginx/html/media
    - /srv/docker/jenkins/jenkins:/var/jenkins_home
    - /srv/docker/mongodb:/var/lib/mongodb
  command: tail -f /dev/null
  restart: always

# ElasticSearch
elasticsearch:
  image: elasticsearch
  volumes_from:
    - data
  restart: always

# PostgreSQL
postgres:
  image: postgres
  environment:
    POSTGRES_USER: postgres
    POSTGRES_PASSWORD: something
  ports:
    - "5432:5432"
  volumes_from:
    - data
  restart: always

# RestyaBoard
restyaboard:
  build: .
  links:
    - elasticsearch:elasticsearch
    - postgres:postgres
  volumes_from:
    - data
  ports:
    - "1234:80"
  restart: always

# Rocket Chat
rocketchat:
  image: rocketchat/rocket.chat
  environment:
    - MONGO_URL=mongodb://mongodb/rocketchat
    - ROOT_URL=http://localhost:80
  ports:
    - "1235:3000"
  links:
    - mongodb

# MongoDB
mongodb:
  image: mongo
  ports:
     - 27017
  volumes_from:
    - data

# Hubot
hubot:
  image: rocketchat/hubot-rocketchat
  links:
    - rocketchat:rocketchat
  environment:
   -  ROCKETCHAT_URL=rocketchat:3000
   -  ROCKETCHAT_ROOM=GENERAL
   -  ROCKETCHAT_USER=bot
   -  ROCKETCHAT_PASSWORD=bot
   -  BOT_NAME=bot
   -  EXTERNAL_SCRIPTS=hubot-pugme,hubot-help

# Jenkins
jenkins:
  restart: always
  image: jenkins:latest
  environment:
    - JENKINS_OPTS=--prefix=/jenkins
  volumes_from:
    - data
  ports:
    - "1236:8080"  

Restyaboard用に必要な以下のファイルはGithubから持ってきて同じフォルダにおいておきます。 * docker-entrypoint.sh * Dockerfile

Docker Composeを利用するうえで、よく利用するコマンドをメモとして残しておきます。

// Composeで起動中のイメージを確認
# docker-compose ps

// Dockerfileをビルドします
# docker-compose build

// デーモン状態で起動します
# docker-compose up -d

Mecabの辞書のパスを登録

ちょっと前の記事でMecabのオリジナル辞書を作成してみたという記事を書いてました。

kakushika.hatenablog.com

今回辞書をちゃんと登録しておきたいと思い調べた内容を記載します。

環境

前回のおさらい

オリジナルの辞書を以下の通り作成していました。

/Users/hogeeeee/work/ruby/dicAdd/custom.dic

mecabrc

mecabrcにDicファイルをユーザー辞書として登録します。
私の環境では以下にありました。

/usr/local/Cellar/mecab/0.996/etc

開くと以下のような感じ

;
; Configuration file of MeCab
;
; $Id: mecabrc.in,v 1.3 2006/05/29 15:36:08 taku-ku Exp $;
;
dicdir =  /usr/local/Cellar/mecab/0.996/lib/mecab/dic/ipadic

; userdic = /home/foo/bar/user.dic

; output-format-type = wakati
; input-buffer-size = 8192

; node-format = %m\n
; bos-format = %S\n
; eos-format = EOS\n

この中の

; userdic = /home/foo/bar/user.dic

userdic = /Users/hogeeeee/work/ruby/dicAdd/custom.dic
``

とします。

summpyを使って文章を要約してみる(今北産業)

文章の要約をしたいなーって思って前にマルコフ連鎖やらいろいろ調べてて、その熱が冷めた今頃簡単にできるぞって情報を得たので試してみました。

Github上のソースは以下から

github.com

リクルートテクノロジーズの大杉さんと広島市立大学修士2回生の飯沼さんが作られたようです。
あざまっす!

blog.recruit-tech.co.jp

環境

Mecabの導入については以前の記事を参考にしてください。

kakushika.hatenablog.com

kakushika.hatenablog.com

導入

GithubのREADMEを見るとPython2.7〜だそうで、手元のMacの中に入ってるバージョンを見てみると問題なかったです。 初めてPythonだなーと思い見てたら、Pythonにもパッケージ管理としてpipというのがあるようです。
Rubyでいうgemですかね。

さっそくpipを使えるようにしてsummpyを入れてみました。

sudo easy_install pip
sudo pip install summpy

READMEに以下でWEBサーバーとして起動してcurlで実行できるとありますのでやってみます。

pip install summpy
python -m summpy.server -h 127.0.0.1 -p 8080
curl http://127.0.0.1:8080/summarize\?sent_limit\=3\&text\=要約したい文章を入力。

エラーでました。。

ImportError: No module named janome.tokenizer

READMEをもう一度読み返してみると以下が必要とのことです。
※読み落としてました。。

pipで入れることができるそうなので、まずはpipで既に何が入っているか確認してみます。

# pip freeze
altgraph==0.10.2
bdist-mpkg==0.5.0
bonjour-py==0.3
CherryPy==4.0.0
decorator==4.0.6
macholib==1.5.1
matplotlib==1.3.1
modulegraph==0.10.4
networkx==1.10
numpy==1.8.0rc1
py2app==0.7.3
pyobjc-core==2.5.1
pyobjc-framework-Accounts==2.5.1
pyobjc-framework-AddressBook==2.5.1
pyobjc-framework-AppleScriptKit==2.5.1
pyobjc-framework-AppleScriptObjC==2.5.1
pyobjc-framework-Automator==2.5.1
pyobjc-framework-CFNetwork==2.5.1
pyobjc-framework-Cocoa==2.5.1
pyobjc-framework-Collaboration==2.5.1
pyobjc-framework-CoreData==2.5.1
pyobjc-framework-CoreLocation==2.5.1
pyobjc-framework-CoreText==2.5.1
pyobjc-framework-DictionaryServices==2.5.1
pyobjc-framework-EventKit==2.5.1
pyobjc-framework-ExceptionHandling==2.5.1
pyobjc-framework-FSEvents==2.5.1
pyobjc-framework-InputMethodKit==2.5.1
pyobjc-framework-InstallerPlugins==2.5.1
pyobjc-framework-InstantMessage==2.5.1
pyobjc-framework-LatentSemanticMapping==2.5.1
pyobjc-framework-LaunchServices==2.5.1
pyobjc-framework-Message==2.5.1
pyobjc-framework-OpenDirectory==2.5.1
pyobjc-framework-PreferencePanes==2.5.1
pyobjc-framework-PubSub==2.5.1
pyobjc-framework-QTKit==2.5.1
pyobjc-framework-Quartz==2.5.1
pyobjc-framework-ScreenSaver==2.5.1
pyobjc-framework-ScriptingBridge==2.5.1
pyobjc-framework-SearchKit==2.5.1
pyobjc-framework-ServiceManagement==2.5.1
pyobjc-framework-Social==2.5.1
pyobjc-framework-SyncServices==2.5.1
pyobjc-framework-SystemConfiguration==2.5.1
pyobjc-framework-WebKit==2.5.1
pyOpenSSL==0.13.1
pyparsing==2.0.1
python-dateutil==1.5
pytz==2013.7
scikit-learn==0.17
scipy==0.13.0b1
six==1.4.1
summpy==0.2.1
Twisted==13.2.0
xattr==0.6.4
zope.interface==4.1.1

MecabPythonで実行するためのモジュールがないようなので追加します。

sudo pip install mecab-python3

ちなみにGithub上のリポジトリは以下です。
cookpadの方のようですね。いつもTechブログ読ませていただいてます。

github.com

無事必要なものがそろったので先ほどのWEBサーバー起動+curlで実行を試してみましょう。

要約を試す記事は以下です。
記事の選定が単純にGoogleニュースのトップだったからです。

www.asahi.com

実行

# python -m summpy.server -h 127.0.0.1 -p 8080
# curl http://127.0.0.1:8080/summarize\?sent_limit\=3\&text\=NHKは11日、塚本堅一アナウンサー(37)が危険ドラッグを所持していたとして、厚生労働省関東信越厚生局麻薬取締部に医薬品医療機器法違反の疑いで10日に逮捕された、と発表した。麻薬取締部によると、塚本容疑者は容疑を認めているという。逮捕容疑は、10日、自宅で危険ドラッグを所持していたというもの。同部は自分で使用する目的だったとみている。NHKの説明では、塚本容疑者は2003年入局。京都放送局などを経て、15年2月から東京のアナウンス室所属。「ニュース シブ5時」でリポーターを務めていた。NHKは「職員が逮捕されたことは遺憾であり、視聴者の皆様や関係者に深くおわびいたします。事実関係を調べたうえで厳正に対処します」とコメントを出した

結果

{
  "debug_info": {}, 
  "summary": [
    "NHKは11日、塚本堅一アナウンサー(37)が危険ドラッグを所持していたとして、厚生労働省関東信越厚生局麻薬取締部に医薬品医療機器法違反の疑いで10日に逮捕された、と発表した。", 
    "麻薬取締部によると、塚本容疑者は容疑を認めているという。", 
    "NHKの説明では、塚本容疑者は2003年入局。"
  ]
}

動きましたー!

結果としては文から単語に分解してというよりは、重要文抽出のような印象ですね。

RSSをクロールして、記事取得して、summpyで要約してDBに突っ込んでRubyAPIサーバー起動してフロントエンドから取得するという流れが出来そうです。いいすねー!

追記

WEBサーバーを起動して以下にアクセスしたら簡単な入力画面が表示されますね。便利!

http://localhost:8080/static/test.html

f:id:kakushika:20160111234821p:plain

他の方々が試したという記事