めも

技術ブログと言い張るのはおこがましいただのめもです。RaspberryPiで遊んだり、Web系の勉強したりしています。ガジェット好きちゃん。

flask×Herokuアプリのコマンド

flask×HerokuでPostgresqlを使ったアプリ作るときのメモ

app 作成

$ heroku create 

Creating app... done, ⬢ XXX
https://XXX.herokuapp.com/ | https://git.heroku.com/XXX.git

postgresql 作成

hobby-devで趣味用無料のDBが作れる。

$ heroku addons:create heroku-postgresql:hobby-dev
$ heroku config

DATABASE_URLが入手できる。これをflaskのSQLALCHEMY_DATABASE_URIに設定する。

gitのremoteを付け替えるとき

$ git remote set-url heroku https://git.heroku.com/XXX.git

$ git remote -v
heroku  https://git.heroku.com/XXX.git (fetch)
heroku  https://git.heroku.com/XXX.git (push)

デプロイ

pipenvの場合、Pipfile, Pipfile.lock, Procfileを用意しておく。
requirements.txtとrunitime.txtは自動で作られるのでいらない。
適宜、.gitignoreも設定しておく。

$ git add.
$ git commit -m "text"
$ git push heroku master 

pipfile.lockがおかしいとき

以下のようなエラーでpush時にエラーが出る場合。

       Your Pipfile.lock (7f5593) is out of date. Expected: (6c000a).
       Aborting deploy.
 !     Push rejected, failed to compile Python app.
 !     Push failed
$ pipenv update

db migrate

#herokuのbashで作業
$ heroku run bash

$ export FLASK_APP=app.py
$ flask db init
# 古いmigrations/がアップロードされている場合エラーでるかも?
# その場合 rm migrations/ -rfしてからリトライ
$ flask db migrate
$ flask db upgrade
$ exit

#テーブルができているか確認
$ flask pg:psql
DATABASE=>\d
#Ctrl+D

Raspbian BusterでLirc(gpio-ir)を試す(送信編)

前回の続き。
dive2blue.hatenablog.com

赤外線送信のコマンドを学習させ、送信する。

設定

lirc_options.confは受信用にしておく。

pi@raspberrypi:~ $ sudo vi /etc/lirc/lirc_options.conf
driver = default
# 送信なら
# device = /dev/lirc0
# 受信なら
device = /dev/lirc1

config.txtは接続したGPIOのピン番号を指定しておく。

pi@raspberrypi:~ $ sudo vi /boot/config.txt
# 接続した番号追記する
dtoverlay=gpio-ir,gpio_pin=16
dtoverlay=gpio-ir-tx,gpio_pin=5

学習用のコマンド

以下のコマンドで学習できる。

pi@raspberrypi:~ $ irrecord -n -d /dev/lirc1

ダイアログに従い、リモコンのボタンを押すだけ。
指示自体は難しくないが、いろんなボタンを何回も押す必要があり時間がかかる。しかも、私の場合うまくいかなかかった。

rawからコマンド作成

上記の方法でうまくできないのでmode2でRawの信号から設定ファイルを作る。
私の場合、エアコンを操作したいのでonとoffを収集。

pi@raspberrypi:~ $ sudo mode2 -d /dev/lirc1
Using driver default on device /dev/lirc1
Trying device: /dev/lirc1
Using device: /dev/lirc1
Running as regular user pi
space 16777215
pulse 3485 # ここから下を使う。
space 1712
pulse 446

ファイルの整形はこの辺を参考に。書くのがめんどくなった
https://qiita.com/KAKY/items/55e6c54fa2073cdc0bbe
http://wbbwbb.blog83.fc2.com/blog-entry-159.html
わからないパラメータは記載しなくてもたぶん大丈夫

作ったファイルはこんな感じ

#aircon.lircd.conf
begin remote

  name  aircon
  bits            0
  eps             0
  aeps            0

  one             0     0
  zero            0     0
  gap          50000
  toggle_bit_mask 0x0
  frequency    38000

      begin raw_codes
    name off
3486 1717 445 441 422 1311 417 416 447 447 416 409 452 406 445 415 448 439()
421 439 424 436 417 442 420 440 423 1310 418 1328 418 1311 415 1316 423 1315
416 

    name on
3495 1723 439 442 419 1315 421 438 424 436 425 435 416 443 418 441 421 439()
400 443 419 441 419 1312 422 1283 453 435 416 443 418 441 421 439 430 442
425 

      end raw_codes

end remote

作ったファイルを移動。

pi@raspberrypi:~ $ cp aircon.lircd.conf /etc/lirc/lircd.conf.d/

送信

lirc_options.confは送信用にしておく。

pi@raspberrypi:~ $ sudo vi /etc/lirc/lirc_options.conf
driver = default
# 送信なら
device = /dev/lirc0
# 受信なら
# device = /dev/lirc1

lircdのサービスを再起動。設定ファイルがあっていれば、Listコマンドで表示される。

pi@raspberrypi:~ $ sudo systemctl restart lircd.service
pi@raspberrypi:~ $ insend LIST "" ""
aircon
pi@raspberrypi:~ $ insend LIST aircon ""
0000000000000001 off
0000000000000002 on

以下のコマンドで送信。

pi@raspberrypi:~ $ sudo irsend SEND_ONCE aircon on

スマホのカメラ越しに見ると光っているのが見える。

エラー

insend LIST "" ""で設定が表示されない

xxx.lircd.confのパルス数が偶数だったりいらないものが含まれている

hardware does not support sending
pi@raspberrypi:~ $ sudo irsend SEND_ONCE aircon on
hardware does not support sending
Error running command: Input/output error

lirc_options.confのdeviceがlirc1になっている。送信するときはlirc0である必要がある。

pi@raspberrypi:~ $ sudo vi /etc/lirc/lirc_options.conf
driver = default
# 送信なら
device = /dev/lirc0
# 受信なら
# device = /dev/lirc1
transmission failed
pi@raspberrypi:~ $ sudo irsend SEND_ONCE aircon on
transmission failed
Error running command: Input/output error

xxx.lircd.confのパルス部分が255個以上ある。現時点ではどうも255に収める必要があるみたい。






赤外線を光らせるとこまではたどりついたけど、うちのエアコンは255にパルス数が収まらず、動かないんだけど…
パルスを16進数で書いている人もいるので、読み込み上の問題なら書き直せば成功するかも?

Raspbian BusterでLirc(gpio-ir)を試す(設定編)

以前もRaspberry Piで赤外線を操作できるLircを使用してみたのだけど、Raspbianに新しいバージョンBusterが出ていたので試してみる。
(諸事情で前にインストールしていたのは消した。)

dive2blue.hatenablog.com
この時は、Stretchだったし、いろいろインストールしたあとで入れたのでなんで動いたのかよくわからなかった。


今回はまっさらな2019-07-10-raspbian-buster-liteをダウンロードして試した。
https://www.raspberrypi.org/downloads/raspbian/

このフォーラムを参照して入れる。
[Stretch/Buster] Using LIRC with kernel 4.19.X and gpio-ir - Raspberry Pi Forums
日々アップデートされているらしく7/7更新の手順をなぞる。

手順

まず、一応アップデート。

pi@raspberrypi:~ $ uname -a
Linux raspberrypi 4.19.57+ #1244 Thu Jul 4 18:42:50 BST 2019 armv6l GNU/Linux
pi@raspberrypi:~ $ sudo apt-get update
pi@raspberrypi:~ $ sudo apt-get upgrade

(sudo rpi-updateしようとしたら警告が出たので普通はしないのですね初めて知った。)



Grove base hatに刺すので入れる。GPIO直ならいらない。

pi@raspberrypi:~ $ sudo apt install python3-pip python-pip
pi@raspberrypi:~ $ curl -sL https://github.com/Seeed-Studio/grove.py/raw/master/install.sh | sudo bash -s -
Successfully installed grove.py-0.6

lircをインストール

pi@raspberrypi:~ $ sudo apt install lirc

はじめは失敗する。(Strechだと失敗しないらしい)

失敗はしているが設定ファイルは生成されているのでリネームしてコピー

pi@raspberrypi:~ $ sudo cp /etc/lirc/lirc_options.conf.dist /etc/lirc/lirc_options.conf
pi@raspberrypi:~ $ sudo cp /etc/lirc/lircd.conf.dist /etc/lirc/lircd.conf

中身を一部書き換える。

pi@raspberrypi:~ $ sudo vi /etc/lirc/lirc_options.conf
driver = default
# 送信なら
device = /dev/lirc0
# 受信なら
device = /dev/lirc1

送信なら、受信ならと場合分けしているが、lirc0のままlirc1が動いたし、autoのままでいい説もある。(試していない)


接続したGPIOのピン番号を指定し、リブート。

pi@raspberrypi:~ $ sudo vi /boot/config.txt
# 接続した番号追記する
dtoverlay=gpio-ir,gpio_pin=16
dtoverlay=gpio-ir-tx,gpio_pin=5
pi@raspberrypi:~ $ sudo reboot

試してみる この時点で受信に成功する(なんで?)

pi@raspberrypi:~ $ sudo mode2 -d /dev/lirc1
Using driver default on device /dev/lirc1
Trying device: /dev/lirc1
Using device: /dev/lirc1
Running as regular user pi
space 16777215
pulse 3485
space 1712
pulse 446

#ctrl+Cで終了

もう一度lircをインストールしなおすとインストールに成功する。

pi@raspberrypi:~ $ sudo apt install lirc

もう一度動かす。

pi@raspberrypi:~ $ sudo mode2 -d /dev/lirc1
Using driver default on device /dev/lirc1
Trying device: /dev/lirc1
Using device: /dev/lirc1
Running as regular user pi
space 16777215
pulse 3485
space 1712
pulse 446

無事動きました。

送信側はまだ試してない。

python3+Flaskのプロジェクト作成手順(WSL+VScode)

Web系は門外漢なので少し勉強しようかなとこちらを読んで手を動かしてみている。
(その1~3まである)
PythonでWebサービスを作る - Python3 + Flaskで作るWebアプリケーション開発入門

Pythonチョットできる&軽量フレームワークということでFlaskにした。
上記の本は流れで説明されているので、もろもろ開発に必要そうな環境構築手順のみをまとめる。
開発の中身は本を参照するとして触れない。

  • Windows10 1903
  • WSL ubuntu 18.04

手順

0. Windows上の準備
1. WSL ubuntu18.04をインストール
2. パッケージインストール
3. DB作成
4. Python の仮想環境作成
5. 仮想環境内で必要なパッケージをpipでインストール
6. Gitの設定

手順詳細

windows上の準備

機能の有効化または無効化でWindows System for Linuxを有効化する。

VScodeをダウンロードして拡張機能を入れる。

  • Japanese Language Pack for VS Code
  • Remote - WSL

WSLのインストール

Winsows10のストアからUbuntu18.04をインストールして起動する。
ユーザ名とパスワードを設定する。
必要なパッケージをインストール。

user$sudo apt-get update
user$sudo apt-get upgrade
user$sudo apt install python3-pip
user$sudo apt install python3-venv

user$sudo apt install postgresql
# pip3 install psycopg2を入れようとすると要求される。
user$sudo apt install postgresql-server-dev10
user$sudo service postgresql start
user$wget -qO- https://cli-assets.heroku.com/install-ubuntu.sh | sh
user$heroku login

postgresqlインストール後サービスのstartする。
HerokuのCLIツールも入れておく。(アカウントを作っておく)

テスト用のDBを作成

user$sudo -u postgres -i
postgres$createuser -d -U postgres -P user_name
#パスワードを入力
postgres$createdb db_name --encoding=UTF-8 --owner=user_name
postgres$psql -U user_name -h localhost -d db_name
db_name=> \l

postgresql関係の操作はpostgresに入って行う。
DBのテーブル作成等はさらにpsqlに入って行う。
\lでDBができているか確認する。
Ctrl+Dで抜けれる。
ここでパスワードを設定している場合、

app.config['SQLALCHEMY_DATABASE_URI'] = "postgresql://localhost/test_db"

app.config['SQLALCHEMY_DATABASE_URI'] = "postgresql://user_name:password@localhost/test_db"

とする。

Python venv作成

user$mkdir test_project
user$python3 -m venv test_project
user$cd test_project
環境in/out
# in
user:~/test_project$ source bin/activate
# out
(test_project) user:~/test_project$ diactivate
pipパッケージのインストール
#環境に入って
(test_project) user:~/test_project$ pip3 list
pip (9.0.1)
pkg-resources (0.0.0)
setuptools (39.0.1)

(test_project) user:~/test_project$ pip3 install flask

# flaskを入れるとJinja2なども入る
(test_project) user:~/test_project$ pip3 list
Click (7.0)
Flask (1.1.1)
itsdangerous (1.1.0)
Jinja2 (2.10.1)
MarkupSafe (1.1.1)
pip (9.0.1)
pkg-resources (0.0.0)
setuptools (39.0.1)
Werkzeug (0.15.4)

# 必要なものは入れる。
(test_project) user:~/test_project$ pip3 install psycopg2 psycopg2-binary
(test_project) user:~/test_project$ pip3 install flask-sqlalchemy
(test_project) user:~/test_project$ pip3 install flask-migrate
(test_project) user:~/test_project$ pip3 install flask-login
(test_project) user:~/test_project$ pip3 install flask_wtf
(test_project) user:~/test_project$ pip3 install rauth
(test_project) user:~/test_project$ pip3 install gunicorn

#
(test_project) user:~/test_project$ pip3 freeze > reqiorement.txt

reqiorement.txtを作ったあと、pkg-resources (0.0.0)の行を削除しないとエラーでる。

Gitの設定

user$ git config --global user.name your_name
user$ git config --global user.email your_email

# wslからVScodeを起動
user:~$ cd test_project
user:~/test_project$ code

拡張機能を入れる。(インストール on WSLになっている。)

Gitの追加とコミット
user:~/test_project$ git init

user:~/test_project$ git add .
user:~/test_project$ git commit -m "first commit"

(.gitignoreの設定を考えなければならない)

flaskの起動

# app.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def test():
    return 'Hello World!'
user:~/test_project$ export FLASK_APP = app.py
user:~/test_project$ flask run

とするか

# app.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def test():
    return 'Hello World!'

if __name__=='__main__':
    app.run()
user:~/test_project$ python3 app.py

とする。
http://127.0.0.1:5000/にアクセスするとHello World が表示される。

手順としてのやり方はわかったけど、Herokuにデプロイ周りのお作法とかがよくわからないなぁ…
その辺も調べてまとめよう

VSCode +SSH+ Raspberry pi Zeroを動かしたかった。

題名の通り。
結論から申し上げますと動きません。

f:id:dive2blue:20190628000414p:plain

Note: The Remote - SSH extension currently only supports connecting to x86_64 Linux-based SSH servers. Alpine and other non-glibc Linux based distros not yet supported.

64bitのLinuxのみのようで、Raspberry pi ZeroのCPUはarmv6(32bit)なので動きません!

逆にRaspberry Pi 3 Model B+などはarmv7なので動くと思われます。

TeraTermとかssh.exeからは普通に接続できたので、今後使えるようにならないかなぁ…

確認したエラーの対処
  • garbage at end of line

.ssh/configのIdentityFileのパスを""で囲む

  • terminating, 1 bad configuration options

IdentityFileのパスが間違っている

手持ちのUSB系充電規格を整理する

充電器回りを整理してタップを買いたいと目論んでいるんで調べた。
USBの給電規格ややこしすぎぃ!

恥ずかしながら使っているものたちを晒す。

種類 メーカー/品目 端子 推奨充電 備考
スマホ Google/Pixel3a USB-TypeC 2.0 USB-PD 9V2A 18W ACアダプタ付属
ノートパソコン HP/Spectre 13 af520TU USB-TypeC 3.1 USB-PD 20V3.25A 65W ACアダプタ付属/最大消費電力45W
タブレット Apple/iPad mini 4 Lightning 5.1V2.1A 10W ACアダプタ付属/Appleの独自仕様
カメラ GoPro/HERO 6 Black Micro USB 5V2A 10W BCマークなし/データ通信も可能なのでUSB-BC(CDP)か?謎
モバイルバッテリー Anker/Power Core10000 A1263 Micro USB USB-BC 5V2A 10W 出力5V2.4A/BCマークあり/充電しかしないのでDCPか?
スピーカー DENON/DSB50BT Micro USB USB-BC 5V2.1A 10W BCマークあり/充電しかしないのでDCPか?
イヤホン AVIOT/TE-D01g USB-TypeC 5V500mA 2.5W(ケース) ケース出力5V1A/マークなしたぶん普通のUSB2.0
ゲーム機 任天堂/Nintendo Switch USB-TypeC USB-PD(未準拠) 15W2.6A 39W ACアダプタ付属(PDだが規格準拠していない)

※Pixel 3aのUSB Type-Cが以外にも3.1じゃなく2.0だった
※TE-D01gが公式には急速充電対応と書かれているが、急速とは?なんぞというUSB2.0の電力供給。

いわゆる前の急速充電5V2AはUSB-BC1.2なんですかね?
USB-BCは5V1.5Aまでっぽいけど?
QuickCharge1.0が5V2Aっぽいが?

独自規格なども乱立してそうでよくわからない。
意外と製品に書かれていないので測ってみないとわからそう…。
そもそも出力側と入力側の規格が混同しているような気もする。


とりあえず電力大きいもの用はUSB-PD対応、
その他は5V2Aが出る物を買えばよいことはわかりました。

TE-D01gを買った。

TE-D01gを買いました。
PayPayで余らせてたポイントで購入したので実質タダですね。

Pearl Whiteは6/12発売らしいので発売日に届きました。
ありがとうビックカメラ
f:id:dive2blue:20190612205434j:plain
桜のパッケージでかわいい。


音質はあまり詳しくわかる耳を持ち合わせていないのですが、

  • apt-Xが使える
  • あまり高すぎない
  • 充電ケーブルがUSB Type-C

なのが決め手になり購入。

f:id:dive2blue:20190612205531j:plainf:id:dive2blue:20190612205507j:plain

小さい…!


f:id:dive2blue:20190612205520j:plain
一度ペアリングしていたら、蓋を開けて取り出すだけで接続されるのがめちゃくちゃ便利ですね。

最初についてたイヤーピースは私には大きくてフィット感がいまいちだったけど、
小さいのもついてたので問題なし。

無音時のホワイトノイズが少し気になる気もするけど、基本外で使う予定なのでまぁいいかな。

これからは通勤のお供になります。