raspberry pi と AB Shutter3(bluetoothボタン) の連携
概要
- raspberry pi を扱うにあたり、できるだけ簡易なアクションで操作したい
- ダイソーで300円のbluetoothボタン「AB Shutter3」と連携させてコマンド実行させる仕組みを構築する
参考
連携前の注意点
AB shutter3 は購入時にお試し用のボタン電池が付いていますが新しいものに絶対替えた方が良いです。
というのも私が電池をケチって替えなかった為に数時間無駄にした為です。
どういう問題が起きるかというと、ペアリングは出来るのにボタンを押した時のイベントが拾えないという中途半端な状態になりました。
bluetoothペアリング作業
# 必要に応じて $ sudo apt-get install bluetooth $ sudo hciconfig hci0 down $ sudo hciconfig hci0 up $ sudo bluetoothctl [bluetooth]$ power on [bluetooth]$ scan on # ここでペアリング状態(AB shutter3 は電源ONにするだけ)にする # 検知すると「[NEW] Device XX:XX:XX:XX:XX:XX AB Shutter3」と表示されるのでMACアドレスをメモして [bluetooth]$ pair XX:XX:XX:XX:XX:XX [AB Shutter3 ]$ trust XX:XX:XX:XX:XX:XX [AB Shutter3 ]$ quit
イベントが拾えているか確認(必須ではない、オプション)
$ sudo apt-get install evtest $ sudo evtest # 「Select the device event number [*-*] :」と聞かれるので「AB Shutter3」の番号を入力する # 後はボタンを押してキーイベントが拾えていればOK # ここで拾えない場合は電池を交換してみるとうまくいくかもしれない
こんな感じ
Event: type 4 (EV_MSC), code 4 (MSC_SCAN), value c00e9 Event: type 1 (EV_KEY), code 115 (KEY_VOLUMEUP), value 1 Event: -------------- SYN_REPORT ------------ Event: type 4 (EV_MSC), code 4 (MSC_SCAN), value c00e9 Event: type 1 (EV_KEY), code 115 (KEY_VOLUMEUP), value 0 Event: -------------- SYN_REPORT ------------
bluebuttonのインストール
$ sudo apt-get install ruby $ sudo gem install bluebutton
設定ファイルの準備
$ vi ~/.config/bluebutton keyup=echo UP keydown=echo DOWN longup=echo LONG UP longdown=echo LONG DOWN
お試し実行
$ sudo bluebutton -c ~/.config/bluebutton
iosボタンとandroidボタンを区別する
現行のプログラムでは2つあるボタンの区別は出来ておらず、アップかダウンか、長押しアップか長押しダウンかを判定できる。
諸事情でiosボタン(大きい方のボタン)とandroidボタン(小さいほうのボタン)を区別したかったのでプログラムを少し変更。
変更点は下記のコミット分だけ
https://github.com/miya15/bluebutton/commit/e2b9b4e475c71886a7b3bf41691f6a022c94c4de
gem化はしていないのでやってみたい方は下記(環境によってパスは異なる場合がありますが)に個別にコピーしてください。
- /var/lib/gems/2.3.0/gems/bluebutton-0.2.1/lib/bluebutton.rb
- /var/lib/gems/2.3.0/gems/bluebutton-0.2.1/bin/bluebutton
$ vi ~/.config/bluebutton # ※下記が追加できるようになる # 注意:反応するタイミングはボタンを離した時です pushandroid=echo PUSH android pushios=echo PUSH ios
docomo1980
最近ドコモのCMが1,980円で使えるという体で流れていますけど、ずいぶんと条件が多いなぁ~という印象。
一般的な家族構成を対象にしたものかもしれませんが、3人で分割した場合の想定であること、5GBを分け合う、かつ特定の機種(docomo with)に限定したお話。
キャリア側の都合に縛られたくないから、このパターンは我が家には合わないです。
サポート用のショップの維持とか色々費用がかかるのは分かりますが、すでにライフライン化しつつある通信費用は抑えたいものです。
MVNOの帯域も随分と狭められている印象があり、そのあたりが平等になっていけばもう少し一般人が嬉しい価格に落ち着いていくのではないかと思いました。
(ブログと言うよりツイート的な思いつき投稿でした~)
docker-composeでcentosベースのlaravel開発環境を構築してみる
前提条件
- ホスト側でdockerとdocker-composeが使えること
- ゲスト側OSはcentos7
- フレームワークはlaravel5.6
- データベースはmysql5.7
ホスト側ファイル構成
/laraveldev
/web
/Dockerfile
/docker-compose.yml
web用コンテナイメージの準備
$ mkdir laraveldev $ mkdir laraveldev/web $ vim laraveldev/web/Dockerfile
FROM centos:7 # apacheとphp7.2のインストール RUN yum -y update RUN yum -y install epel-release unzip vim git RUN yum -y install http://rpms.remirepo.net/enterprise/remi-release-7.rpm RUN yum -y --enablerepo=remi-php72 install php php-devel php-mbstring php-mysql php-gd php-pdo php-pear php-process php-soap php-xml php-bcmath php-pecl-zip RUN yum -y install httpd-devel # composerのインストール WORKDIR /tmp RUN curl -sS https://getcomposer.org/installer | php RUN mv composer.phar /usr/local/bin/composer RUN useradd developer RUN groupadd web RUN gpasswd -a apache web RUN gpasswd -a developer web RUN chown -R apache:web /var/www RUN chmod g+ws -R /var/www # composerでlaravelのインストール USER developer RUN composer global require "laravel/installer" RUN echo 'PATH=$PATH:$HOME/.composer/vendor/bin' >> ~/.bashrc RUN source ~/.bash_profile # プロジェクトの作成 WORKDIR /var/www RUN composer create-project --prefer-dist laravel/laravel mysite "5.6.*" USER root RUN chmod g+ws -R /var/www/mysite # apacheの設定変更 RUN sed -i -e 's#DocumentRoot "/var/www/html"#DocumentRoot "/var/www/mysite/public"#' /etc/httpd/conf/httpd.conf RUN echo $'\n\ <Directory "/var/www/mysite/public">\n\ AllowOverride All\n\ Require all granted\n\ </Directory>\n\ ' >> /etc/httpd/conf/httpd.conf RUN systemctl enable httpd # データベースの設定 RUN sed -i -e 's/DB_HOST=127.0.0.1/DB_HOST=db/' \ -e 's/DB_DATABASE=homestead/DB_DATABASE=dbmysite/' \ -e 's/DB_USERNAME=homestead/DB_USERNAME=umysite/' \ -e 's/DB_PASSWORD=secret/DB_PASSWORD=password/' \ /var/www/mysite/.env RUN sed -i -e "s/env('DB_HOST', '127.0.0.1')/env('DB_HOST', 'db')/" \ -e "s/env('DB_DATABASE', 'forge')/env('DB_DATABASE', 'dbmysite')/" \ -e "s/env('DB_USERNAME', 'forge')/env('DB_USERNAME', 'umysite')/" \ -e "s/env('DB_PASSWORD', '')/env('DB_PASSWORD', 'password')/" \ /var/www/mysite/config/database.php CMD ["/sbin/init"]
docker-compose化
$ vim laraveldev/docker-compose.yml
version: '3.3' services: db: image: mysql:5.7 volumes: - db_data:/var/lib/mysql ports: - 3306:3306 restart: always environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: dbmysite MYSQL_USER: umysite MYSQL_PASSWORD: password web: depends_on: - db build: ./web volumes: - web_data:/var/www/mysite ports: - 80:80 restart: always volumes: db_data: web_data:
ビルドと起動
$ cd laraveldev $ docker-compose build $ docker-compose up -d
おまけ
jenkinsのdockerイメージからホストのdockerが使えるようにするDockerfile(docker in docker)
jenkinsはdockerイメージが公式に公開されているので使いやすいですが、jenkins自体がコンテナとして動くのでホスト側のdockerコマンドを実行させるには多少の小細工が必要です。これはdocker in dockerと呼ばれているらしく、このキーワードで検索すれば比較的目的の記事が見つかりやすいと思います。
今回はjenkinsのイメージを使っていますがdocker in docker自体は他のイメージでも概念は一緒です。
Dockerfileの例
公式のjenkinsイメージを使ってdockerとdocker-composeをインストールします。
- ポイント
- ユーザー切り替えを行ってインストールを進めている点(最後にjenkinsに戻しています)
- jenkinsユーザーにdockerコマンドのsudo権を与えている点
FROM jenkins:latest USER root RUN apt-get update -y RUN apt-get install -y \ apt-transport-https \ ca-certificates \ curl \ gnupg2 \ software-properties-common RUN curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg | apt-key add - RUN add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \ $(lsb_release -cs) \ stable" RUN apt-get update RUN apt-get install -y docker-ce RUN curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose RUN chmod +x /usr/local/bin/docker-compose RUN echo "jenkins ALL=(root) NOPASSWD: /usr/bin/docker" >> /etc/sudoers USER jenkins
ビルドの例
- カレントディレクトリに上記のDockerfileがある前提
$ sudo docker build -t jenkinsdid .
実行時の例
- ホスト側のdocker.sockをコンテナ側にバインドしている点がポイント
$ sudo docker run -d -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock jenkinsdid
jenkinsでdockerイメージをビルドする例
jenkinsでDockerfileをビルドして、既にコンテナがあったら削除して、新たにコンテナを作る例
下記をビルドの「シェルの実行」に入れる
- ワークスペースのルートにビルドしたいDockerfileが存在する前提
sudo docker ps -a sudo docker build -t dockertest $WORKSPACE if sudo docker ps -a | grep webtestwork -n; then sudo docker stop webtestwork; fi sudo docker run -d --rm --name webtestwork dockertest /sbin/init
jenkinsの公式dockerイメージを拡張する際のメモ
jenkinsの公式dockerイメージをDockerfileで独自に拡張したいと思ったのですが、デフォルトのユーザーがjenkinsになっていてパッケージのインストールなどが行えなくて困ったのでそのメモです。
docker run する場合
$ docker run -u root -d -p 8080:8080 jenkins
Dockerfile を書く場合
FROM jenkins:latest USER root RUN apt-get update -y : USER jenkins