ラズパイ3でbluetooth経由でログイン
最近、ラズパイをネットワーク接続できない(しづらい)環境で操作する必要があり、どうしようか悩んでいました。
モニタ + キーボードで操作だと機材用意しなければならないし、、、
ラズパイzeroであれば、USB OTG(On the Go)が使えるのでUSB経由でssh接続出来るんだけど。。。泣
色々調べながら考えたところ1つ方法を見つけました!!
ラズパイ3のbluetooth経由でログインすればいいんです!!
ということで、早速セットアップしてみたのですが詰まったところもあったので備忘録として残したいと思います。
※【参考】のURLがとても分かりやすかったです(というかかなり参考にさせて頂いております)。
【環境】
・PC :Windows 10
・ラズパイ3
まずはPCとラズパイ3とのペアリングです。
ラズパイ3側で下記を実行。
sudo bluetoothctl [bluetooth] power on [bluetooth] discoverable on [bluetooth] agent on [bluetooth] default-agent
これでラズパイ3側で受付出来るようになりました。
次にwindows10側です。
windowsの設定 > デバイス > Bluetoothとその他のデバイス
に移動して、
Bluetoothまたはその他のデバイスを追加する
を押下。
続いてBluetoothを押下。
少し待つと、"raspberry pi"が出てくるので押下してペアリングが完了です。
次にbluetooth経由でのシリアル通信を行うための設定を行います。
まずdbus-org.bluez.serviceを編集。
sudo vim /etc/systemd/system/dbus-org.bluez.service [変更前] ExecStart=/usr/lib/bluetooth/bluetoothd ↓ [変更後] ExecStart=/usr/lib/bluetooth/bluetoothd --compat
またこちらを実行します。
sudo systemctl daemon-reload sudo systemctl restart bluetooth sudo chmod 777 /var/run/sdp sdptool browse local sudo sdptool add --channel=22 SP
これでbluetooth経由で通信するための設定が完了です。
では実際に通信をしてみます!!
ラズパイ側で下記を実行!!
sudo rfcomm -r watch 0 22 /sbin/agetty -L rfcomm0 115200 &
今回windows10 PCにはTera Termがインストールされておりますのでこちらを用いて接続を実行!!
繋がりました!!これでラズパイとPCがあればつなげることが出来ます!!
。。。いえ、これだけではダメです泣。
ネットワークなし、モニタ、キーボードなしで先ほどのコマンドをどのように打てばよいでしょうか??
起動時に自動実行させるようにセッティングしておかなければならないのです!!
なので、次にデーモンの設定に移ります。
先ほど編集したdbus-org.bluez.serviceを再編集。
sudo vim /etc/systemd/system/dbus-org.bluez.service [変更前] ExecStart=/usr/lib/bluetooth/bluetoothd --compat ↓ [変更後] ExecStart=/usr/lib/bluetooth/bluetoothd --compat ExecStartPost=/usr/bin/sdptool add SP
そして、デーモンを作成します。
/etc/systemd/system配下にrfcomm.serviceを新規作成します。
[Unit] Description=RFCOMM service After=bluetooth.service Requires=bluetooth.service [Service] ExecStart=/usr/bin/rfcomm watch 0 1 /usr/bin/setsid /sbin/agetty -L rfcomm0 115200 [Install] WantedBy=multi-user.target
そして、デーモンを起動。
sudo systemctl daemon-reload sudo systemctl restart bluetooth sudo systemctl start rfcomm sudo systemctl enable rfcomm
これで再起動してもbluetooth接続できるようになったかと思います。
最後に、
bluetooth経由でログイン使ってみましたが、、、
結構ブチブチ切れてしまって毎回繋ぎ直さなければならなくなって結構不便でした泣。
何とかやりたいことは出来たのでよかったですが、、、通常運用は難しい感じでした。
あくまで補助用って感じかな?と思いました。
もしかしたら設定とか見直せば改善できるかもしれないので、時間を見つけて少し調べてみたいと思います!!
pythonでのcsvファイル書き込み
前回まで作っていたものを使って、データ収集の結果をまとめる必要が出てきました。。。
そこで、資料化するにあたってデータをcsvファイルにまとめることにしました!!
データベースに保存してから後でcsvファイル化も考えたのですが、少し手間だったので直接csvファイルに書き込むことにしました。
今までpythonでcsvファイルにまとめることをしてこなかったので、調べながら実施していきました。
csvファイルをExcelで開いた時に文字化けする等、問題も発生し手こずったため備忘録で残しておこうと思います。
csvファイルへの書き込むコードはこちらになります。
with open('test.csv','a',newline='', encoding='utf_8_sig') as csvFile: csvwriter = csv.writer(csvFile, delimiter=',',quotechar='"', quoting=csv.QUOTE_NONNUMERIC) csvwriter .writerow([1,'AAA','aaa']) csvwriter .writerow([2,'BBB','bbb'])
'a'を指定することにより、追記モードにすることが出来ます。
合わせて、newline=''をオプションで指定しないと1行ごとに空き行が生成されてしまうようです。
最後に、、、
Excelファイルで開いても文字化けしないようにencoding='utf_8_sig'をオプション指定。
jsonファイルを送信するためにはこちらを用いればよいです。
※前提として、jsonデータですが、
jsn = { "name": "Tanaka", "age": 26 ,"job":"AAA"}
とします。
csvParam = [] name = jsn['name'] age = jsn['age'] job = jsn['job'] csvParam.append([name,age,job]) with open("test.csv",'a',newline='', encoding='utf_8_sig') as csvFile: csvwriter = csv.writer(csvFile, delimiter=',',quotechar='"', quoting=csv.QUOTE_NONNUMERIC) for param in csvParam: csvwriter.writerow(param)
さらにさらに、、、
csvファイルにヘッダーとか付けたくなりますよね。
で!!
csv初回生成時か判定するための処理として下記を利用します。
if os.path.exists('test.csv') == False: with open('test.csv','a',newline='', encoding='utf_8_sig') as csvFile: csvwriter = csv.writer(csvFile, delimiter=',',quotechar='"', quoting=csv.QUOTE_NONNUMERIC) csvwriter.writerow(['名前','年齢','仕事'])
ここまで。
全ソースはこちらのようになります。
import requests import json import csv import os C_FILENAME = "test.csv" csvParam = [] name = jsn['name'] age = jsn['age'] job = jsn['job'] csvParam.append([name,age,job]) if os.path.exists(C_FILENAME) == False: with open(C_FILENAME ,'a',newline='', encoding='utf_8_sig') as csvFile: csvwriter = csv.writer(csvFile, delimiter=',',quotechar='"', quoting=csv.QUOTE_NONNUMERIC) csvwriter.writerow(['名前','年齢','仕事']) with open(C_FILENAME,'a',newline='', encoding='utf_8_sig') as csvFile: csvwriter = csv.writer(csvFile, delimiter=',',quotechar='"', quoting=csv.QUOTE_NONNUMERIC) for param in csvParam: csvwriter.writerow(param)
分かると結構簡単にcsvファイル化することが出来ました。
DBもいいけど、csvファイルにまとめるのもいいな、と思いました!!
djangoで外部アクセスのために実施すべきこと
こちらの記事にも記載いたしましたが、、、
djangoで外部アクセスするために必要な設定がありました!!
elsammit-beginnerblg.hatenablog.com
それは、、、
サーバで公開するドメイン名を事前に登録しなければ、外部からアクセスしようとするとこちらのようなエラーになってしまうことです!!
Invalid HTTP_HOST header: ~~~. You may need to add ~~~ to ALLOWED_HOSTS. Bad Request: ~~~
では、
サーバで公開するドメイン名を登録していきます。
こちらのフォルダ構成のsettings.pyを開きます。
プロジェクト名のフォルダ | |ーasgi.py |ーsettings.py |ーurls.py |ーwsgi.py |ー__init__.py |__ __pychache
settings.pyにALLOWED_HOSTSパラメータがあるかと思いますので、そちらにドメイン名を登録。
ALLOWED_HOSTS = ["ドメイン名"]
こちらのALLOWED_HOSTSですが、ワイルドカードを利用することができます。
ALLOWED_HOSTS = ["*"]
ただし、ワイルドカードを用いるとセキュリティ的にあれなので、ドメイン名で登録していきたいと思います。
結構単純なことですが、すぐに忘れてしまいそうだったので備忘録で残しておきます。
【参考】
blog.ymyzk.com
asyncがらみのSyntaxErrorの解決とPython バージョンアップデート
前回、djangoでサーバサイドの実装を一通り完成させました。
elsammit-beginnerblg.hatenablog.com
次にフロントサイドを作ってみようと思い進めてみたところ、はまった部分があったため備忘録として残します。
今回実施したいことは、フロントサイドでは、あるデータを収集してjsonデータにしてサーバサイドに送信するのみでした。
そして、あるデータ収集~jsonデータに加工まではサンプルで実現出来ていました。
このため、サンプルを実行してサーバに送信するだけの簡単な内容の予定だったのですが、そのサンプルが一筋縄では動かせなかった。。。泣
原因
python3.4~python3.5にかけてasync、awaitの使い方に変化があった模様。
で、pythonのバージョンが合っていなかった場合、同様のエラーが発生するようだった。
www.it-swarm.dev
自分が使用していたpythonバージョンは3.4であったため、発生してしまっていた。
対策
pythonのバージョンを3.4から3.5以上にバージョンアップをする。
pythonアップデート手順
前置きが長くなってしまいました!!
アップデートを行うにあたり、こちらを参考にしました。
qiita.com
まずpyenvが必要になるため、
sudo apt install -y git openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev git clone https://github.com/yyuu/pyenv.git ~/.pyenv
を実行してpyenvをダウンロード。
次に実行できるようにパスを通す。
sudo vi ~/.bash_profile ※.bash_profileに下記を追記. export PYENV_ROOT="$HOME/.pyenv" export PATH="$PYENV_ROOT/bin:$PATH" eval "$(pyenv init -)"
これでpyenvが導入できました。
pyenvコマンドでpythonをインストールするのですが、
pyenv install --list
により、インストール可能なpythonバージョン一覧が確認できます。
今回はpython3.6.0のインストールを行うこととしたため、
pyenv install 3.6.0 pyenv global 3.6.0
を実行!!
successが出たことを確認してから、
python -V
を実行し、3.6.0になったことを確認。
これでpythonバージョンを3.4⇒3.6に変更できました。
効果確認
pythonバージョンを3.6に変更できたのでサンプルを実行!!
結果、エラーなく動作させることができました!! やったね!!
最後に
実はpython3.7.0にバージョンアップさせようかと思っていたのですが、エラーが発生したためやむなく3.6.0に変更しました。
pyenvで3.7.0にアップデートしようとするとエラーが発生するようで、調べると解決策が載っていました。
ただし、カーネルバージョンを上げなければならないようで、そこまではやりたくなったためpythonのバージョンを3.6.0に変更しました。
結構躓いたけど、勉強になりました!!!
実際にサーバサイド(django)にjsonデータを送信しようとしたところでもちょっと躓いたところがあったため、
備忘録で残したいと思います。
python3.7.0へのアップデート
python3.7.0へアップデートしようとしたところ、エラーが発生。
pyenv install 3.7.0 ~~~ The bug is not reproducible, so it is likely a hardware or OS problem
解決策を調べたところ、こちらの記事を発見!!
takuocean.hatenablog.com
apt-get upgrade
だけ行ってみましたが、エラー解消できず。。。
Kernelバージョンアップはやりたくない。。。ので止めておきました!!
anaconda + django立ち上げ~json postまでの備忘録
今回はdjangoの立ち上げについて備忘録書いていきたいと思います。
ちょっと仕事?の都合上使わなければならなくなったのですが、いつも立ち上げに苦労するため備忘録として残そうと思いました!!
あと、今回はjsonデータのやり取りが必要になりそうだったのでそこまでを書いておこうと思います!!
環境はこちら。
・OS:Windows10
・python:3.7.4
※anacondaを用いて環境セットアップを行っていきます。
django環境セットアップ
下記をdjangoインストールまでの流れはこちらを利用。
makimakimakino.hatenablog.com
まず、anacondaでanaconda Navigatorを立ち上げる。
左タブのEnviromentsをクリック。
仮想環境の一覧が表示されるため、下にあるCreateボタンをクリック。
名前をdjangoとし、Pythonのバージョンを選択しCreateを押下。
これで仮想環境の作成が完了。
仮想環境一覧画面にてdjangoを選択。
djangoをインストールするために、djangoパッケージをリストから検索。
もしなかった場合には、djangoの横にある三角矢印をクリックし、terminalを立ち上げる。
terminal立ち上がったら、こちらを実行。
pip install django
その後、anaconda navigatorの仮想環境一覧に戻り、"Update index"を押下。
※これをしないとインストールしたdjangoが表示されなかった。。。
再度検索を試みると今後はdjangoが表示されるはずので、チェックボックスにチェックを入れて右下Applyを実行。
これでdjangoパッケージのインストールが完了!!
djangoプロジェクト作成
先ほどのURLにはこの後、PyCharmというアプリをインストールして、、、と言いう記載がありましたが、、、、
使用しているPCのストレージの関係で取りやめました。
先ほどの要領でdjango仮想環境のterminalを立ち上げる。
もしくはanaconda Promptを立ち上げてこちらを実行。
activate django
djangoプロジェクト作成したいディレクトリに移動してから、djangoプロジェクト立ち上げコマンドを実行。
django-admin startproject プロジェクト名
実行が成功していれば、
プロジェクト名 | |ープロジェクト名のフォルダ |ーdb.sqlite3 |__manage.py
の構成のディレクトリが生成されます。
プロジェクト名まで移動してからこちらを実行。
python manage.py runserver
成功すると、
Starting development server at http://127.0.0.1:8000/ Quit the server with CTRL-BREAK.
といったメッセージが表示されます。
適当なブラウザを立ち上げて、http://localhost:8000 もしくはhttp://127.0.0.1:8000/を入力してこちらの画面が表示されればプロジェクト立ち上げ成功です。
jsonデータをpost requestするまで
まずjsonデータをpost request/responseするための環境をセットアップします。
新しくアプリの作成を行います。
python manage.py startapp アプリ名
次にプロジェクト名のフォルダ配下にsettings.pyとurls.pyがあるのでこちらを編集していきます。
プロジェクト名のフォルダ | |ーasgi.py |ーsettings.py |ーurls.py |ーwsgi.py |ー__init__.py |__ __pychache
まずsettings.pyからです。
settings.pyにINSTALLED_APPSがあるかと思いますのでこちらのように編集。
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'webtestapp', 'アプリ名' , ←こちらを追加。”,”を忘れずにつけること!! ]
次にurls.pyですが、こちらのように新しく作成したurlのパスをインクルードする
from django.contrib import admin from django.urls import path, include ← includeを追記. urlpatterns = [ path('admin/', admin.site.urls), path('',include('アプリ名.urls')) ←追記. ]
次に先ほど追加したアプリについて編集いたします。
まず先ほど作成したアプリ名でフォルダが作成されているかと思いますのでフォルダを移動します。
views.pyを開き、こちらのようにソースコードを記載。
from django.shortcuts import render from django.http import HttpResponse import json from django.http.response import JsonResponse from django.views.decorators.csrf import ensure_csrf_cookie @ensure_csrf_cookie # Create your views here. def Send_PowerData(request): none = {"data:" "none":"none"} if 'json' in request.headers.get('content-type'): datas = json.loads(request.body) ret = {"data": "param1:" + datas["param1"] + ", param2:" + datas["param2"]} return JsonResponse(ret) else: return JsonResponse(none)
自分がはまった所は、
①@ensure_csrf_cookieがないと、ホスト側でKeyErrorが発生してしまう
②if 'json' in request.headers.get('content-type'):でjsonデータだった場合にjson.loadsをしないとエラーになってしまう
の2点です。
特に②は結構はまりました。。。
さらにアプリ名で作成されたフォルダ内にurls.pyを新規作成し、こちらのソースコードを記載。
from django.urls import path from . import views app_name = 'アプリ名' urlpatterns = [ path('send_power',views.Send_PowerData,name='Send_PowerData') ←Send_PowerDataにはviews.pyで定義した関数名を記載. ]
これでdjango側での実装は完了!!
最後に、
python manage.py runserver
を実行して下記が表示されればOKです!!
Starting development server at http://127.0.0.1:8000/ Quit the server with CTRL-BREAK.
ホスト側の実装
ホスト側の実装はこちらのようにしました。
import requests import json url = "http://******" ← サーバサイド(django)までのパスを指定. sess = requests.session() csrftoken = sess.cookies['csrftoken'] headers = {'Content-type': 'application/json', "X-CSRFToken": csrftoken} jsn = {"param1": "AAA", "param2": "BBB"} params = json.dumps(jsn ) res = sess.post(url, data=params, headers=headers)
最後に
一部躓いたところありましたが、比較的簡単に立ち上げられました!!
あとはホスト側でやりたいことを実装すればとりあえずは動くものが作れそう!!
だけど、、、
コロナのおかげ?で一時停止していたとある案件が再開してしまう。。。
色々なしがらみがあったり、お偉いさんの利権だらけで、操り人形感半端ないからやりたくないんだよな。。。無駄に時間使うし、、、よく分かっていない人たちが間に入るから説明とかめんどくさいし、生産性低いし、、、
前回のポケモンの続きをやりたいな。。。泣
Matplotlibで日本語表記に対応する
突然ですが、、、、最近ポケモンにはまっておりますw。
アニメやゲーム実況見ていたらゲームやってみたくなってポケモン剣盾やっていたら辞められなくなってしまいましたw。
ポケモン剣盾で厳選楽になったとは言え、やはりめんどくさいです。。。
さて、今はまっているポケモンで面白いものを作れないかな?と思い調べてみたところ、面白いものを見つけました!!
www.hands-lab.com
こちらのURLに載っているcsvファイルをダウンロードしてみたところ、第1~第7世代のポケモンは全数?載っておりました!!
結構しっかり載っていてちょっと驚きw。
だけど、最新の第8世代は載っていなかったので残念。。。
ではこちらの環境で、
・OS:Windows 10
・アプリ:anaconda
・python: Python 3.6.8
csvを読み込んで簡単にMatplotlibでグラフを書いてみると、、、
import pandas as pd import matplotlib.pyplot as plt df = pd.read_csv("pokemon_status.csv",encoding="shift-jis") plt.scatter(df['HP'],df['合計']) plt.xlabel("HP") plt.ylabel("合計") plt.show()
あれ?日本語表記されない、、、
調べてみたところ、Matplotlibの日本語対応するためには追加でファイルの取得等が必要になるらしい。
datumstudio.jp
ということで、先ほどのURLを元に
・IPAexGotic(無料フォント)をhttps://ipafont.ipa.go.jp/からipaexg.ttfダウンロード
・C:\Users\[ユーザー名]\Anaconda3\Lib\site-packages\matplotlib\mpl-data\fonts\ttfにipaexg.ttfを保存
・C:\Users\[ユーザー名]\Anaconda3\Lib\site-packages\matplotlib\mpl-data内のmatplotlibrcを開き、font.family : IPAexGothicを追記
を実行!!
再度先ほどのコードを実行!!
。。。あれ?まだ表示されない!!
ここで詰まってしまい1時間経過。。。
結果、Matplotlibのフォントリストに登録していなかったことが原因でした!!
こちらのファイルに、
C:/Users/<ユーザ名>/.matplotlib/fontlist-v310.json
こちらを追記すればOKです。
{ "fname": "fonts\\ttf\\ipaexg.ttf", "name": "IPAexGothic", "style": "normal", "variant": "normal", "weight": 400, "stretch": "normal", "size": "scalable", "__class__": "FontEntry" },
では、、、再度先ほどのソースを実行!!
今度こそ日本語が表示されました!!
本当はこんな感じで相関見つけたりして遊ぼうと思ったのですが、初期設定でかなりつまずいてしまった泣。
こんなところで躓きたくないので備忘録も兼ねて記載しました!!
nanjamonja.net
これから色々データ分析して、面白いことが出来たらアップしたいと思います!!
OpenCVでイラスト認証できるのか??
OpenCVを用いると顔検知することができますよね?
結構制度が高いので、顔検知行いたいときには重宝しています。
最近使用していて、ふと思ったのです、、、
イラストやアニメは認証するのか??
と!!
少し調べてみるとこちらの記事を見つけました!!
OpenCVによる非ディープラーニングの顔認識でどこまでできるのか試してみた! – 株式会社ライトコード
イラストは検知できない的なことは書かれていましたが、、、
本当かな?と思い、さっそく調査してみることにしました!!
【目次】
・OpenCVによる顔検知の原理
顔検知の原理はこちらに記載されておりました。
どうやら画像内を切り取り、判定を行う。を複数回繰り替えてしているようです。
【入門者向け解説】openCV顔検出の仕組と実践(detectMultiScale) - Qiita
Haar Cascadesを使った顔検出 — OpenCV-Python Tutorials 1 documentation
・調査条件・実行環境
まず使用する写真の条件ですが、
①正面を向いていること
②顔全体が映っていること
③眼鏡や帽子などが身に付いていないこと
④1人であること
としました。
用いる画像数ですが、ジャンルごとに3枚抜粋し、
・0枚検知:×
・1~2枚検知:△
・3~5検知:〇
という判定条件としました。
実行環境は、
・Ubuntu18.04 (VirtualBox上)
・Python3.5.2
・OpenCV4.2.0
検証用に作成したソースコードはこちらになります。
import cv2 cascade_path = "haarcascade_frontalface_default.xml" fileNames = ['input1.jpg','input2.jpg','input3.jpg','input4.jpg','input5.jpg'] count = 1 detectOK = 0 for input_fileName in fileNames: img = cv2.imread(input_fileName) gry_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) cascade = cv2.CascadeClassifier(cascade_path) facerect = cascade.detectMultiScale(gry_img,scaleFactor=1.5,minNeighbors=2,minSize=(30,30)) rectange_color = (255,0,0) if len(facerect) > 0: comment = "input" + str(count) +" detect face" print(comment) detectOK += 1 for rect in facerect: cv2.rectangle(img,tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]),rectange_color,thickness=2) #img =cv2.cvtColor(img,cv2.COLOR_RGB2BGR) Output_FileName = 'Output' + str(count) + '.jpg' cv2.imwrite(Output_FileName,img) count += 1 print("detect count is " + str(detectOK))
※顔の位置で正しく検知行えていない可能性もあるため、目視での確認も行いました。
・実行結果
今回用いたジャンルと画像集はこちらになります
・JirkaVinse氏作成ディズニープリンセスイラスト
JirkaVinse氏の制作したディズニープリンセス達のイラストが素晴らしくリアルで美しい! – VIDEO FISH
・ジブリアニメーション
ジブリ総選挙!女性キャラクターで彼女にするなら・・・あなたの好みは? | 明日の話題に少しの彩り
・FF7 REMAKE
バレット・ウォーレス | CHARACTER | FINAL FANTASY VII REMAKE | SQUARE ENIXクラウド・ストライフ | CHARACTER | FINAL FANTASY VII REMAKE | SQUARE ENIX
・イラストエイト
案内をするサラリーマンと吹き出しのイラスト | 無料のフリー素材 イラストエイト
・ねこ画伯コハクちゃん-無料イラスト・フリー素材
ねこ画伯コハクちゃん-無料イラスト・フリー素材集
結果はこのようになりました。
無料イラスト画で検知できた画像がこちらになります。
一方で検知できなかった画像はこちら。
イラストやアニメでもできる場合があった!!
一応、イラスト・アニメ顔であってもリアルに似せたものであれば検知できそうです。
逆にアニメーションのようなかわいらしい見た目にしてしまうと検知が難しくなる傾向がありました。
PS4に出ているゲームのキャラクターはリアルに寄せている傾向があるため、顔検知も問題なくできそうです!!
次はゲーム動画でキャラクターが動いている時に顔検知ができるのか確認してみたいな!!