surga Lab

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

surga Lab

営業部でも開発したい!!

BLE通信の最長記録を狙ってみましたが結局置き手紙袋になりました

BLEといえば

  • 省電力!
  • ペアリングいらず!
  • IoTに最適!

とメリットだらけです。

ただし、大きな弱点として

通信可能距離が非常に短いことが挙げられます。

ほとんどは数メートル、頑張って30メートルあたりでしょうか。

ですが私は、その規格を、越えたい!!

BLEを使って長距離通信

ということで長距離通信を頑張ってみます。

条件は

  • 2人のスマートフォン所有者が通信を行う
  • 通信にはBLEを使う

これを満たしたものを作成したいと思います。

まずはこちらをご覧ください。

keynote

以下編み出した手法に沿って作成していきます。

f:id:hisurga:20170517220243j:plain

言い訳は後で書きます。

f:id:hisurga:20170517220350j:plain

f:id:hisurga:20170517220932j:plain

言い訳するまで読んでください。

f:id:hisurga:20170517220447j:plain

f:id:hisurga:20170517220534j:plain

申し訳ありません。

f:id:hisurga:20170517220551j:plain

実装

今回はBLE Nanoを利用します。
ピン付きですと厚みが出てしまうのでピンが付いていない本体のみを購入しました。

ピンを使わずに書き込む必要があるのでスルホール用ワイヤを利用して書き込んだのですが、アクロバティックな書き込みになりました。

f:id:hisurga:20170517223243j:plain

コードはBLE NanoサンプルのSimpleChatをベースに、
Connect時の初期化動作を無くし、ループ部に以下コードを追加することで定期的に発信することにしました。
bufにスマートフォンから入力された文字列が入っています。

つまり変数に入れたら、次に書き込まれるまでそのまま放置って訳です。

ble.updateCharacteristicValue(characteristic2.getValueAttribute().getHandle(), rx_buf, rx_buf_num);

ボタン電池で動作することを確認できればBLE Nanoの実装は終了です。

f:id:hisurga:20170517223701j:plain

後はハガキっぽいサイズのダンボールを用意し、

f:id:hisurga:20170517223814j:plain

埋め込みます。

f:id:hisurga:20170517223843j:plain

動作確認

こんな感じになります。
スマートフォンアプリは、BLE Nanoのサンプルアプリをベースに作成しました。

音楽とかつけることでおシャンに紹介です。


BLE Nanoでメッセージを保存

ここで問題

後は郵便局に渡すだけなんですが、、、

このボタン電池、充電不可とはいえリチウムなんですよね。

www.post.japanpost.jp

陸送なら問題ないらしいですが、ダンボールの間に裸の電池+基盤なんて、いろいろと面倒そうですよね。

よくわからない物に付き合ってもらうのも悪いので、諦めます。

そこで代替案としてこんな感じにしました。

置き手紙袋

今や家族間のやりとりは基本LINEです。
しかしですね、家に帰って置き手紙がある感覚もいいものだと思うんですよ。

そこでこの置き手紙袋です。

f:id:hisurga:20170518221754j:plain

決して家の外からではメッセージを入手することはできないですが、家に帰ればスマートフォンで情報を入手できる程よい不便さ。

袋は100円ショップで買いました。

f:id:hisurga:20170518221824j:plain

はたして、こんな物で暖かさを感じることはできるのでしょうか。

f:id:hisurga:20170518221851j:plain

結果

おそらく鉛筆のほうが便利。

Qiitaを始めましたので書き分けについて考えてみました

技術者が多く利用するQiita

私も始めてみました。

なぜ

このブログ自体技術ブログとして開設し、今後も自分の資産として育てていきたいところではあります。

ただ自分の記事を振り返ると、
「これ詰まったところです。参考にどうぞ」といった記事がありまして、
そういう記事って読者のことを考えると多くの人の目に触れる場所の方がいいのではないかと。

だったらQiitaの強いSEOを利用して世の中に公開した方がいいのではないかと。そう考えたわけです。

ということで、はてなブログと並行してQiitaも始めてみます。

本音を書けば、流行ってるからやってみたい。それに尽きるんですが、、、

はてなとQiitaの境界線

Qiita

事実だけを書き、かつ多くの人に共通する内容はQiita向けかなと思います。

例えばこういった記事はQiitaに適していますね。

qiita.com

qiita.com

はてな

何かを利用して作ったものや雑記ははてなブログに書くべきかなと。

例えばこういった記事ですね。

blog.hisurga.com

blog.hisurga.com

blog.hisurga.com

微妙なライン

Arduinoなどで特定のパーツを使った実装は悩みますね。

こういった記事です。

blog.hisurga.com

blog.hisurga.com

デメリット

ただでさえ少ない記事数を分散してしまうことにはなりますね。
なかなかブログを育てられないなと。

はてなブログからQiitaへ記事の移転

上述したルールに沿ったはてな/Qiitaにするために、徐々にはてなブログの記事をQiitaに写したいと思います。
幸いにもまだ記事数は少ないので、、、

少しでも私の記事が皆さんの役に立ち、なおかつ終業後プログラマとしての露出も増えたらいいなーと。淡い希望もあったりなかったり。

Raspberry Pi 3をmastodon専用機にしてみました

結果から書きますと、問題なく動いています。
リモートフォローをほとんどやっていない低負荷状態なので、今後についてはわかりませんが、、、

Dockerを使わない選択

前回の記事ではDockerを利用してmastodonしようかと考えていましたが、

blog.hisurga.com

ただでさえ非力なラズパイを、仮想環境での処理はあれな気がするので、今回はDockerを使わないで専用機にしてみたいと思います。

ここにDockerあり/なしでの参考スペックが書かれてます。

お一人様インスタンスなら行けそうな気がしますね。(根拠はない)

documentation/Resources-needed.md at master · tootsuite/documentation · GitHub

導入手順

親切なことにwithout-Dockerな手順もすべてドキュメントに書かれています。
書かれていない設定については、Docker使用時と同じですので情報はたくさんあるかと思います。

github.com

基本的にドキュメント通りに進めればうまくいくのですが、ラズパイ用の修正点があるため以下にまとめます。

ffmpeg

Debian系がいろいろあってffmpegのapt-getに対応していないようですのでセルフビルドを行います。
以下サイトを参考に進めればうまくいきます。

d.hatena.ne.jp

postgres

ドキュメントは以下のようになっていますが、

sudo apt-get install postgresql postgresql-contrib

私はうまくいかなかったので以下のようにしました。

sudo apt-get install postgresql-9.4 postgresql-contrib

rbenv

ラズパイでのrbenvは以下Qiitaが参考になります。

qiita.com

メール認証

私は普通にメールで認証を行いましたが、メール設定をしなくても以下コマンドでいけると思います。

RAILS_ENV=production bundle exec rails mastodon:confirm_email USER_EMAIL=info@example.com

管理者権限

/home/username/liveに入って以下コマンドで指定userに管理者権限を与えることができます。

RAILS_ENV=production bundle exec rails mastodon:make_admin USERNAME=user名

お一人様インスタンス

お一人様にする予定でしたらSINGLE_MODEの設定と新規登録の無効化(admin設定)をするといいですね。

qiita.com

認証終えたらメール設定を適当にしてしまう方法もありますが。

とりあえず快適です

f:id:hisurga:20170502183226p:plain

mastodon用アプリ、Pawooでも問題なく動いています。

f:id:hisurga:20170502183253p:plain:w300

ただしインスタンスがローカルにあるため、wi-fiに繋げてドメイン入力して見に行くと接続に失敗します。
hostsの設定が必要なんでしょうね。

サーバ関係に疎いため穴がたくさんありそうで怖いですが、とりあえず運用できそうな感じです。

月額のVPSと比べてラズパイはランニングコストが電気代だけなので、お財布に優しいかもしれませんね。

こちらが私のmastodonアカウントです。

mstdn.hisurga.com

Raspberry Pi 3とDockerでMastodonのインスタンスを立ててみました

最近話題のマストドン。楽しそうですね。

github.com

Mastodon is…

TwitterはTwitter社が管理していますが、
Mastodonは分散型で稼働しています。

TwitterはTwitter社が大きなサーバを用意していますが、
Mastodonはオープンソースで誰でもサーバ(インスタンス)を立てることができます。

そうすると複数のサーバが立てられることになりますが、異なるサーバのユーザとコミュニケーションをとることも可能で、この繋がりを連邦と表現します。
サーバ内限定で発言したり、連邦全てに発言したりと自由度が高いです。

日本ではmstdn.jpが有名で、急激に人口を増やしています。

メリット/デメリット

メリット

  • 企業に縛られない

Twitterがサービス終了と言ったら有無を言わさず終わりです。何も残りません。
また、その他言論制限がありません。あるとすれば他のサーバから国交断絶されるくらいです。

togetter.com

  • 広告がない

有料プランも広告プランもありません。
ちなみにマストドンの初期資金はクラウドファンディングからなります。

  • 効率的な情報交換

目的が設定されているインスタンスであれば、集まる人も同じ目的を持っているため効率的です。
(例:pixivのインスタンスは絵を自由に公開したい人が集まっています)

デメリット

  • サーバ管理者に権利が委ねられている

アカウントを作る際にサーバを選ぶわけですが、管理者が飽きたり管理費不足でサーバを停止した場合アカウントが消えてしまいます。

なぜラズパイでサーバを立てたいのか

そもそもmstdn.jpのように1つのサーバへ多くの人が集まるのって分散型のメリットを消してしまっているような気がします。
Twitter社の役がmstdn.jpの管理者に移っただけですよね

自分専用のサーバを立てることで、管理は自己責任になり、他者とのコミュニケーションも連邦で可能です。
やめたいときはサーバを消せばいいだけです。
つまり、分散型のメリットを大きく生かせるのではないかと。
先述した効率的な情報交換はできませんが。

そう考えると自分1人+α程度であればラズパイぐらいのサイズがコスト面から考えて最適ではないかと。(処理的にいけるかは別として)

ということで、やってみましょう。

必要なものの準備

マストドンはDockerで入れられます。
正直Dockerは触ったことがないのでひたすらGoogle先生とお話していました。

以下まとめを参考にさせていただきました。

aoi-f.hatenablog.com

前提

raspbian入りで外部に接続できるラズパイ3があること。

ここを参考にしてください。

blog.hisurga.com

kamuycikap.hatenablog.com

myDNSのサブドメインを独自ドメインにしたいのであれば、独自ドメインのDNSレコード設定で

ホスト:独自ドメイン
タイプ:cname
コンテンツ:myDNSのサブドメイン

にすればいけると思います。

gitのインストール

sudo apt-get install git

Dockerのインストール

qiita.com

Docker Composeのインストール

qiita.com

letsencryptのインストール

git clone https://github.com/letsencrypt/letsencrypt.git
cd letsencrypt
./letsencrypt-auto --help

nginxのインストール

sudo apt-get install nginx

mastodonの導入

ここでめっちゃハマってました。

公式のmastodonではarmに対応していないため、自分でhypriotのalpineからビルドに挑戦し、イメージのビルドまではいったんですが、docker-compose build/ runの段階でどうにもならず死んでいました。

するとどうでしょう。

もうあるじゃないですか。

github.com

uehatsu.info

ということで上記事を参考に進めていきます。

まずはrpi-mastodonをcloneします。

git clone https://github.com/gilir/rpi-mastodon.git

続いて以下コマンドを打ちます。

docker-compose up -d

エラーが出まくりますが、「これを実行してもう1回チャレンジしてくれ」的なことを言われるので、ひたすら従います。(6回くらい)

完全に服従したら以下のコマンドを3回繰り返し、キーを3つゲットします。

docker-compose run --rm web rake secret

.env.productionの設定

.env.production.sampleから.env.productionを作成し、編集します。

cp .env.production.sample .env.production
emacs .env.production

変更点は以下のように

とりあえず動作を見たかったので、HTTPS対応をfalseにしました。

# REDIS_DB=0
DB_HOST=db
DB_USER=好きなユーザ名
DB_NAME=好きなDB名
DB_PASS=好きなパス
DB_PORT=5432
# Federation
LOCAL_DOMAIN=<span style="color: #ff0000">あるなら独自ドメイン</span>
LOCAL_HTTPS=false

# Application secrets
# Generate each with the `rake secret` task (`docker-compose run --rm web rake secret` if you use docker compose)
PAPERCLIP_SECRET=先ほどのキー1
SECRET_KEY_BASE=先ほどのキー2
OTP_SECRET=先ほどのキー3

MTP_SERVER=sparkpostで入手
SMTP_PORT=587
SMTP_LOGIN=sparkpostで入手
SMTP_PASSWORD=sparkpostで入手
SMTP_FROM_ADDRESS=hoge@ドメイン (送信元用)
SMTP_AUTH_METHOD=plain
SMTP_ENABLE_STARTTLS_AUTO=true

SPARKPOSTの情報はこのページです。
APIキーはセキュリティ上1回しか表示されないので注意。見落としたら再発行しましょう。

f:id:hisurga:20170426004813p:plain

データベースの設定

web rake secret後はデータベースの設定を行います。

docker exec -it データベースのコンテナ名 /bin/bash
bash-4.3# su - postgres
$ createuser -P 先ほどのユーザ名
Enter password for new role: 
Enter it again: 
$ createdb 先ほどのデータベース名 -O 先ほどのユーザ名
Ctrl + pqでコンテナから脱出

マイグレーションしてからアセットのコンパイルをします。

docker-compose run --rm web rails db:migrate
docker-compose run --rm web rails assets:precompile

ここまできたらとりあえずテストです。
以下コマンドで何かのhtmlが返ってこなかったら間違っているかもです。

curl localhost:3000

nginxの設定

nginxの設定を行います。設定内容は公式を流用し、example.comを自分のドメインに変えてください。

本来ならばここで証明書の取得をするべきですが、私はとりあえずHTTPS非対応でいきました。

documentation/Production-guide.md at master · tootsuite/documentation · GitHub

sudo emacs /etc/nginx/conf.d/ドメイン.conf

起動

sudo systemctl restart nginx

起動したら他の回線から覗いてください。もしくはローカルのipに:3000をつけて見てください。

どうでしょう、動きましたか?

動いていないなら何かがおかしいです。
もう一度順番通りにできているか確認しましょう。

f:id:hisurga:20170426004825p:plain:w300

ここまで書いて何ですが、私はうまく動かないです。

リバースプロシキがうまく作動していないのか、"ローカルIP:3000"でしか見れないです。
外の世界から訪問するとnginxのウェルカムページが表示されます。
メールも届かない、、、

また加筆する予定ですが、取り急ぎここまで。

追記
メールに関しては単純な設定ミスでした。
また、Dockerを使うより専用機にした方が動作も軽く、いい感じに動きました。
以下記事を参考にしてください。

blog.hisurga.com

Raspberry Piにssh接続してみました

外部のPCなどから編集できるようにssh設定を行います。

固定IPアドレスの設定

rootに切り替えます。

sudo su -

以下ファイルを編集します。

/etc/dhcpcd.conf

最下部へ以下のように追記します。
設定はご自身のルータ設定によって変えてください。

static ip_address:ラズパイに設定したいアドレス
static routers:ルータのアドレス
static domain_name_servers:DNSサーバのアドレス

interface eth0
static ip_address=192.168.10.10/24
static routers=192.168.10.1
static domain_name_servers=192.168.10.1

再起動します。

reboot

以下コマンドでinetに書かれたアドレスが設定したアドレスになっているか確認します。

ifconfig

他のPCからpingを撃ってもいいかもしれません。

sshの有効化

この状態でsshを試みましたが、うまくいきませんでした。
どうやら最近では初期状態でsshが無効化されている? らしいのでsshファイルを作成します。

touch /boot/ssh

すでに作成されているのにsshできない場合は他がおかしいかもしれないです。

ラズパイを再起動してからmacのターミナルでsshを試みます。

ssh [ユーザ名]@xxx.xxx.xxx.xxx

(x = ipアドレス)

出てくる警告はyesでオッケーです。

完了

ログインできたら成功です。

あとはリモートで作業できますので、hdmiやキーボードは外しても大丈夫かと思います。