soy-curd's blog

へぼプログラマーです [https://twitter.com/soycurd1]

机の上においたボタンを押すとリアルタイムでSlack上に寿司を食べたいことを通知できるシステムを構築した

机の上においたボタンを押すとSlack上に寿司を食べたいことを通知できるシステムを構築した。

github.com

動機

寿司を食べたい時にそれをSlackで報告するためわざわざキーボードに手を伸ばすのは非常に面倒である。机の上に専用のスイッチがありそれを押すだけで寿司が食べたいことを通知できれば非常に素晴らしいユーザー体験が得られるはずだ。昔遊んでいたArduinoが家にあったので、それとSlackを組み合わせることでシステムを構築していく。

作り方

Arduino

100均に行ってボタンっぽいものを購入する。

f:id:soy-curd:20160619234139j:plain

スイッチ式のシーリングライトがあったので流用。ライトなので押すと光る。

f:id:soy-curd:20160619234206j:plain

(光る)

気合で内部のスイッチを見つけ出して配線。

f:id:soy-curd:20160619234400j:plain

内部を開けるとこんなかんじになっていた。緑と黄色のリード線は自分で結線した。

f:id:soy-curd:20160620000154j:plain

適当に抵抗を繋いでやばい電流がArduinoにいかないようにする。 回路図を示したいところだが、そもそも100均ボタン側の回路が不明なのでプレッドボード側も勘で配線した。 とりあえず5Vを直接グラウンドに繋いではいけないことがわかった。

Arduinoにコードをデプロイ。

const int SWITCH = 2;

void setup() { 
  pinMode(SWITCH, INPUT);
  Serial.begin(9600);
}

void loop() {
  if (digitalRead(SWITCH) == HIGH) {
    Serial.print("1\n");
  } else {
    Serial.print("0\n");
  }
  delay(500);
}

Arduinoに繋いでシリアルモニタでチェック。"1"と"0"がボタンに応じて出力されていればOK

。出てなかったら配線とか抵抗を見直す。

Python

PySerialというモジュールがあるので、それをpipでインストール(Arduinoとの通信)。

Pythonでシリアル通信 - Qiita

こちらを参考にした。

slackwebというモジュールがあるので、それをpipでインストール(Slackとの通信)。

SlackのIncoming WebHookを用いた。異常に簡単にSlackにメッセージを流せる。

Slackにincoming webhook経由でpythonからメッセージをPOSTする - Qiita

コードはこちらを参考にした。 Incoming WebHookのURLは環境変数に格納し、実行時に読み込むようにした。

pythonを実行

import slackweb
import os
import serial
import time

url = os.environ["SLACK_OHA"]
slack = slackweb.Slack(url=url)

port = "/dev/cu.usbmodem1421"
current_oha_state = False

# ボード側は500ms間隔でserialにHIGH -> b"1", LOW -> b"0"を送信する
with serial.Serial(port=port, baudrate=9600, timeout=1) as ser:
    while True:
        # time.sleep(0.1)
        flag = ser.readline()
        # switch ON
        if (bytes(b"0") in flag and not current_oha_state):
            current_oha_state = True
            print("oha")
            slack.notify(text="スシ食べたい🍣")

        # switch OFF
        elif (bytes(b"1") in flag and current_oha_state):
            current_oha_state = False
            print("otu")
            slack.notify(text="スシいらない🍣")

        print(flag, current_oha_state)

結果

とりあえずボタンをポチポチ押す。すると、

f:id:soy-curd:20160619231258p:plain

ほぼリアルタイムでこのようになる。ギリギリIoTの範疇に入る気がする。

これで快適に他人にスシを食べたいことを通知できるようになった。 会社のCTOがArduinoの無線モジュールを入手したようなので、それを使えばボタンをPCから独立させることも可能な気がする。未来っぽい。

J・M・クッツェー『遅い男』読んだ

J・M・クッツェー『遅い男』読んだ。自転車事故で脚を一本失った老人の話だが、全体的におもしろい。中盤以降、作者みたいな人物がいきなりログインしてきて、そこから自由意志vs神みたいなかんじの話になだれこんでいくところが超良い。素晴らしい。

遅い男

遅い男

最急降下法をPythonで実装した

関数x2 + xは、どうやら最小値がひとつだけ存在するらしい。どうしてもその値を知りたくなったので、最急降下法を使ってPythonでその値を求めてみた。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import random

learning_late = 0.01
loop_max = 1000

def main():
    
    initial = random.uniform(-10, 10)
    old = initial
    new = 0.0
    for _ in range(1000):
        
        # 更新式
        new = old - learning_late * diff_func(old)
        
        # 目的関数の値を確認
        y = object_func(new)
        print(y)
        
        # 値を更新
        old = new
        
    print(new, y)
        
    
# 目的関数
def object_func(x):
    return x * x + x
    
# x ^ 2 + x の微分
def diff_func(x):
    return 2 * x + 1

if  __name__=='__main__':
    main()

これを実行すると、

# x、y
(-0.5000000145792641, -0.24999999999999978)

と、xが-0.5付近の時に目的の関数が最小値となることがわかった。なるほどというかんじ。

ITエンジニアのための機械学習理論入門

ITエンジニアのための機械学習理論入門

言語処理のための機械学習入門 (自然言語処理シリーズ)

言語処理のための機械学習入門 (自然言語処理シリーズ)

平方イコルスン『スペシャル』読んだ

平方イコルスンスペシャル』読んだ。いかにも検索にひっかからなそうな書名であり、売る気が全くないかんじがうかがえる。 内容は、登下校時も授業中も常にヘルメットを被っている女子校生がいるのだけれど、好きな男の子に近づくと緊張してしまい、ヘルメットが少し頭から浮いてしまうというストーリである。帯に、『このマンガは優しさ100%で出来ています。』と記述されているので、もしかしたらそれらも全て作者の優しさのなせる技なのかもしれない。日常ほのぼのマンガです。

f:id:soy-curd:20160413092942j:plain

(こちらはレギュラーガソリンの匂いが大好きな女の子が陰謀によりハイオクの匂いを嗅がされ怒り狂っているコマです)

スペシャル 1 (torch comics)

スペシャル 1 (torch comics)

成程

成程

駄目な石

駄目な石

ウンベルト・エーコ『プラハの墓地』読んだ

ウンベルト・エーコプラハの墓地』読んだ。エーコは初読だったが、超絶エンタメで非常に面白い。基本的には陰謀小説なのだけれど、黒ミサとか爆破シーンとかをいきなりぶっ込んできてテンション上がる。登場人物が多すぎて役割が追えなくなっても、基本的に歴史上の人物なのでググればわかるので便利。wikipedia素晴らしい。

清野とおる『その「おこだわり」、俺にもくれよ!! ②』読んだ

その「おこだわり」、俺にもくれよ!! 』の2巻読んだ。個人的には酒を飲む人なので、⑬の「トマトのカス男」の回が面白かった。なんか、「すごいも」というクソみたいに安い芋焼酎の話なのだけれど、本当に、トマトのカスを芋焼酎で割るだけの話なのでやばい。トマトと芋、どちらもアンデスの魅力がたっぷりなので、きっと相性も良いのだろう。トマトジュースじゃだめなの??? というかんじがものすごくするけれど、作品内で、「故意に潰したトマトを混ぜてもテンションは上がらない」という言説があるので、きっと駄目なんだろうと思う。

f:id:soy-curd:20160313215256j:plain

で、1.8リットルで900円以下で売っているところもあるという「すごいも」のインパクトが強すぎて、思わずAmazonで検索したら、あった。

(どうやらAmazonだと割高である)

このような、人をアルコール中毒に至らしめるような酒は全て甲類という印象があったのだれど、これは「甲乙混交」というスタイルらしく、きっと名前的に、甲類と乙類を混ぜているのだろうと思う。乙を混ぜることによって、人を堕落の縁に追い込むようなこともなくなるだろうし、クリーンな印象になっている。もし、給料日前とかで、どうしても酒が飲みたいけれど、ビールを買う金もない、というような場合、うっかり買ってしまう酒の選択肢として、「すごいも」を教えてくれたこのマンガに深く感謝致します。

Brew Dog Jack Hammer飲んだ

f:id:soy-curd:20160313204704j:plain

池袋のハンバーガー屋でBrew Dog Jack Hammer飲んだ。IPA。昼からタップのIPA飲めるとか、池袋は最高の土地。メニューには酒の説明がいろいろ書いてあって、パンクIPAより数段苦い、とある。実際飲むと確かに苦く、最高。パンクは甘すぎて飯には合わない感が強いけれど、ジャックハンマーはハンバーガー食いながらでもいける。たまらん。

パンク IPAビール 330ml

パンク IPAビール 330ml