raspberry pi と AB Shutter3(bluetoothボタン) の連携

概要

  • raspberry pi を扱うにあたり、できるだけ簡易なアクションで操作したい
  • ダイソーで300円のbluetoothボタン「AB Shutter3」と連携させてコマンド実行させる仕組みを構築する

参考

qiita.com

github.com

連携前の注意点

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ボタン(小さいほうのボタン)を区別したかったのでプログラムを少し変更。

github.com

変更点は下記のコミット分だけ

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開発環境を構築してみる

f:id:miya15:20180909171239p:plain

前提条件

  • ホスト側で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

おまけ

  • コンテナに入る
    • $ docker exec -it laraveldev_web_1 /bin/bash
  • mysiteのホスト側ディレクト
    • $ ls /var/lib/docker/volumes/laraveldev_web_data/_data/
  • dbのホスト側ディレクト
    • $ ls /var/lib/docker/volumes/laraveldev_db_data/_data/

jenkinsのdockerイメージからホストのdockerが使えるようにするDockerfile(docker in docker)

f:id:miya15:20180908164903p:plain

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

ビルドの例

$ 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をビルドして、既にコンテナがあったら削除して、新たにコンテナを作る例
下記をビルドの「シェルの実行」に入れる

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
  • 説明
    • 1行目:現在動いているdockerコンテナを表示(デバッグ目的で表示しているだけで実動作には無くても問題無い)
    • 2行目:ワークスペースにDockerfileがある前提でタグ「dockertest」を付けてビルド
    • 3行目:コンテナ名「webtestwork」が付いているコンテナが存在したら停止(停止したら削除されるrmオプションが付いている想定)
    • 4行目:コンテナ名「webtestwork」でイメージ名「dockertest」からコンテナを生成(停止したら削除されるrmオプション付き)

dockerのpushでRetryingになる時の確認事項(private registry)

その1:SELinuxに制限されている場合

SELinuxを無効化してみる

$ sudo vi /etc/selinux/config

変更箇所

SELINUX=enforcing
 ↓
SELINUX=disabled

$ sudo reboot

SELinuxをONにしたままでも出来るかもしれませんが…

dockerのコンテナ内から外に接続できない時の確認事項

dockerのコンテナ内から外にネットワーク接続が出来なくなった時の確認事項を挙げていきます。

  • ホスト側でpingが通るか確認する
    • これがダメな場合はまずホスト側の設定を見直す必要がある
  • 前は繋がっており設定は変えてない場合、dockerサービスを上げなおす
    • コンテナ内のデータを永続化していない場合は上げなおす前にコミットしたり退避したりするのを忘れないように

※事例を見つけたら追記していきます

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