Bottleというフレームワークを試してみた(2)

あちこち参考にして、もう少し遊んでみました。

test001.py

#!/usr/bin/env python3

from bottle import route, run, view, template, static_file, url

@route('/static/<filename:path>', name='photo')
def server_static(filename):
    return static_file(filename, root='./static')

@route('/hello')
@route('/hello/<name>')
@route('/hello/<name>/<count:int>')
@view('hello_template')
def hello(name='名無し',count=1):
    return dict(name=name, count=count, url=url)

run(host='localhost', port=8080, debug=True, reloader=True)

hello_template.tpl

やあ、<b>{{name}}</b>さん<br />
% if count > 1 :
<br />
{{count}}回表示します<br />
<br />
%   for i in range(count):
{{i+1}}回目<br />
%   end
% end
<img src=&quot;{{url('photo', filename=&quot;cat.jpg&quot;)}}&quot;>

そして、./photo/cat.jpg に写真を置いて表示してみるとこんな感じ。

パスにパラメータを入れるとこんな感じ。

写真は フリー素材ぱくたそ(www.pakutaso.com) さんのところから入手したのを縮小して使いました。

Bottleというフレームワークを試してみた(1)

Flaskよりもさらに軽いPython上のフレームワークで Bottle というのがあるということで、試してみました。

参考にさせていただいたのはこちら(とても参考になる)です。

まずは環境構築。いつものように LinuxMint19 Mate 64bit 上にPythonの仮想環境で準備します。

~/python$ python3 -m venv BottleTest
~/python$ cd BottleTest/
~/python/BottleTest$ source bin/activate
(BottleTest) ~/python/BottleTest$ pip install --upgrade pip
(BottleTest) ~/python/BottleTest$ pip install bottle

これだけ。

おためし用のソースを用意します。

#!/usr/bin/env python3

from bottle import route, run

@route('/hello')
def hello():
    return "Hello World!"

run(host='localhost', port=8080, debug=True, reloader=True)

実行してみます。(コンソール出力も含んでます)

(BottleTest) ~/python/BottleTest$ python3 quickstart.py 
Bottle v0.12.18 server starting up (using WSGIRefServer())...
Listening on http://localhost:8080/
Hit Ctrl-C to quit.

127.0.0.1 - - [08/Mar/2020 15:02:04] "GET / HTTP/1.1" 404 720
127.0.0.1 - - [08/Mar/2020 15:02:04] "GET /favicon.ico HTTP/1.1" 404 742
127.0.0.1 - - [08/Mar/2020 15:02:16] "GET /hello HTTP/1.1" 200 12

表示してみた感じはこんな感じ。

たしかに簡単です。

VLANを追加

今度は一つのインタフェースにIPアドレスを降るのではなく、VLANタグを追加して、そこにIPアドレスを振ってみます。

まずはインタフェースの状態を確認。今回はPC側でUSBで増設したインタフェースに対して試してみます。インタフェース名の下6桁やMACアドレスなどは掲載時にXXに置換しています。

$ ip -s -d addr show dev enx384b76XXXXXX
3: enx384b76XXXXXX: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 38:4b:76:XX:XX:XX brd ff:ff:ff:ff:ff:ff promiscuity 0 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 
    inet 192.168.0.253/24 brd 192.168.0.255 scope global noprefixroute enx384b76XXXXXX
       valid_lft forever preferred_lft forever
    inet6 fe80::XXXX:XX:XXXX:XXXX/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
    RX: bytes  packets  errors  dropped overrun mcast   
    4170690    14491    0       0       0       0       
    TX: bytes  packets  errors  dropped carrier collsns 
    3975503    37565    0       0       0       0

“VLANを追加” の続きを読む

一つのNICに複数のIPアドレスを割り振る

わけあって、linux上で一つのNICに複数のIPアドレスを振る必要あって調べました。

最近は ifconfig ではなくて、ip addr が推奨っぽいので、併せて試してみました。

IPアドレスを追加

$ sudo ifconfig eth0:1 192.168.10.1 netmask 255.255.255.0

もしくは

$ sudo ifconfig eth0:1 192.168.10.1/24

でもOKのようだ。

“一つのNICに複数のIPアドレスを割り振る” の続きを読む

指定したサブネットの中で生きてるIPアドレスだけを探す

指定したIPアドレス帯の中で生きているIPアドレスだけを知りたいことがあります。こんな時に使えるのが fping コマンドなのですが、オプション指定がめんどくさいです。でも仕方ないのでメモ。

インストールは

$ sudo apt-get install fping

実行する際は

$ fping -g 192.168.1.0/24 -a -q

-g オプションで検索するネットワークアドレスを指定、-a オプションで生きてるアドレスを表示、-q で検索中の表示を黙らせる。そんなところです。

実行するとこんな感じです。

$ fping -g 192.168.1.0/24 -a -q
192.168.1.1
192.168.1.2
192.168.1.253
192.168.1.254
$

古いRaspberry Piをインターネットラジオに

100円ショップのダイソーへ行ったら、300円でアンプ付きのスピーカーが売っていましたので買ってきました。まあ、300円なりの音なのですが、音質にこだわりのまったくない自分には十分です。

で、余っている古いRaspberry Piと組み合わせてBGM用のインターネットラジオにしてみました。

Raspberry Piには基本SSHでアクセスするので、CLIで動く受信プログラムが必要で、少し調べてみると、pyradioというのがあるようで、これをインストールしてみました。

残念ながら apt-get ではインストールできないようで、ソースからインストールすることになりますが、ドキュメントに沿っていけば以下のような手順になりますが、非常に簡単です。記載しているのはほぼ入力するコマンドだけ、実際には大量に表示が出ます。初代Raspberry Piではさすがに遅くて時間がかかりますが、特に問題なく終わりました。

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install mplayer python-setuptools git sed screen
$ git clone https://github.com/coderholic/pyradio.git
$ cd pyradio
$ git fetch --all --tags --prune
Fetching origin
$ git tag
0.1
0.4
0.6.0
0.7.0
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.7.6.1
0.7.6.2
0.7.7
0.7.8
0.7.9
0.8.0
0.8.1
0.8.2
0.8.3
0.8.4
0.8.5
0.8.6
0.8.7
0.8.7.1
$ git checkout tags/0.8.7.1 -b 0.8.7.1
Switched to a new branch '0.8.7.1'
$ devel/build_install_pyradio

終了したら、

$ pyradio -u mplayer

でコマンドラインから起動するとインターネットラジオ局のリストが表示されるので、カーソルキーで選んで Enter キーを押すと再生されます。

正直、あまり局数は多くないですが、自分には十分です。

Windows10にPython3環境を構築(3)

Python仮想環境上でサンプルプログラムをexe化してみます。

まず、pipをインストールします。

(sample) D:\Python3\sample>python -m ensurepip --default-pip
Looking in links: c:\Users\tomok\AppData\Local\Temp\tmphubv8k11
Requirement already satisfied: setuptools in d:\python3\sample\lib\site-packages (41.2.0)
Collecting pip
Installing collected packages: pip
Successfully installed pip-19.2.3

(sample) D:\Python3\sample>python -m pip install --upgrade pip
Collecting pip
  Using cached https://files.pythonhosted.org/packages/54/0c/d01aa759fdc501a58f431eb594a17495f15b88da142ce14b5845662c13f3/pip-20.0.2-py2.py3-none-any.whl
Installing collected packages: pip
  Found existing installation: pip 19.2.3
    Uninstalling pip-19.2.3:
      Successfully uninstalled pip-19.2.3
Successfully installed pip-20.0.2

(sample) D:\Python3\sample>

次に、pyinstaller をインストールします。

D:\Python3\sample>pip install pyinstaller

適当なソースコードを用意して保存します。

#
print('Hello Windows Python')

exe化して実行してみます。

(sample) D:\Python3\sample>pyinstaller hello.py --onefile
(sample) D:\Python3\sample>dist\hello.exe
Hello Windows Python

(sample) D:\Python3\sample>

ということで、サンプルプログラムは無事に(?)exe化できました。

Windows10にPython3環境を構築(2)

次に、ソースコードを書く環境を作ります。

Visual Studio Codeを試してみたいところですが、今回は簡単に入る Geany を試してみます。

公式サイトから「Download Geany 1.36」をクリックして、ダウンロードページに移行します。

GPGのシグネチャと鍵があるので、検証します・・・が、Windowsでやるのは面倒なので、Raspberry PiにSSHでログインしてダウンロードと検証を行いました。検証方法はこちらを参考にさせていただきました。それにしても、最近のWindows10は標準でSSHクライアントが入っていたり、mDNSに対応していたりで便利になっています。検証が終わったら、Windows側にSCPでコピーしてきます。

D:\>ssh pi@white.local
pi@white:~ $ mkdir TEMP
pi@white:~ $ cd TEMP
pi@white:~/TEMP $ wget https://download.geany.org/geany-1.36_setup.exe
pi@white:~/TEMP $ wget https://download.geany.org/geany-1.36_setup.exe.sig
pi@white:~/TEMP $ wget https://download.geany.org/eht16-pubkey.txt
pi@white:~/TEMP $ gpg --import < eht16-pubkey.txt
gpg: key 579347E6C71A77FA: 4 signatures not checked due to missing keys
gpg: /home/pi/.gnupg/trustdb.gpg: trustdb created
gpg: key 579347E6C71A77FA: public key &quot;Enrico Tröger <enrico.troeger@uvena.de>&quot; imported
gpg: Total number processed: 1
gpg:               imported: 1
gpg: no ultimately trusted keys found
pi@white:~/TEMP $ gpg --verify geany-1.36_setup.exe.sig geany-1.36_setup.exe
gpg: Signature made Sat 28 Sep 2019 22:32:20 JST
gpg:                using RSA key 51A0918FEF3439066BEB87F4579347E6C71A77FA
gpg: Good signature from &quot;Enrico Tröger <enrico.troeger@uvena.de>&quot; [unknown]
gpg:                 aka &quot;Enrico Tröger <eht16@fsfe.org>&quot; [unknown]
gpg:                 aka &quot;Enrico Tröger <enrico@xfce.org>&quot; [unknown]
gpg:                 aka &quot;Enrico Tröger <enrico@geany.org>&quot; [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 51A0 918F EF34 3906 6BEB  87F4 5793 47E6 C71A 77FA
pi@white:~/TEMP $ exit
logout
Connection to white.local closed.

D:\>scp pi@white.local:~/TEMP/geany-1.36_setup.exe .
pi@white.local's password:
geany-1.36_setup.exe                                               100%   15MB   3.0MB/s   00:05

D:\>

SCPでコピーが完了したら、ファイルをダブルクリックしてインストーラを起動、インストールします。インストールが完了して Geany を起動するとこんな感じです。

無事にインストールが完了しました。

Windows10にPython3環境を構築(1)

Windows10(64bit)にPython3の環境を構築しました。その際のメモです。

まずは何よりPython3本体のインストールです。以前はPython2.7とPython3を共存させるインストールのしかたをしていましたが、Python2.7のサポートは今年の1月1日に終了していますので、Python3一本で行きます。
(・・・と思ったら、Python2.7のサポート終了は4月に延期されてる??

インストールするバージョンについては、最新版は3.8系ですがPyinstallerを使いたいので、Pyinstallerが対応している3.7系をインストールします。32bitか64bitかですが、Pyinstallerで持っていく先が稀に32bitの可能性はあるかもしれないのですが、それでも今回は64bitにしてみます。

あと、Python仮想環境の構築は venv を使うのではなく Anaconda を使うのが流行りのようなのですが、AnacondaでPyinstallerを使うと生成されるexeファイルが巨大化するという話をたくさん見かけるので、Anacondaは使わずに素の venv で仮想化してみます。(Anacondaは使ったことがないので、そのうちまずLinuxで使ってみることにします)

ということで、まずはWindows版セットアップに関する公式ガイドを読みます。このガイドをみると32bit版と64bit版は共存できそうな雰囲気ですので、両方インストールしてみます。Python公式サイトのWindows版ダウンロードページからPython3.7系の最新版であるPython3.7.6のWindows x86-64 executable installer と Windows x86-64 executable installerをダウンロードしてきてそれぞれ実行します。

それぞれインストーラを起動したら「Install Now」をクリックすると、勝手にインストールが進みます。Setup was successful という表示が出ると、下のほうに「Disable path length limit」という表示があります。これはWindowsのパスの長さの260文字制限を解除するレジストリ設定を行ってくれるもののようです。単独で使う分にはいいのですが、Pyinstallerで持ち出すことを考えると、今回は設定しないことにして、「Close」をクリックします。

完了したら、コマンドプロンプトを開いて起動してみます。

D:\>py
Python 3.7.6 (tags/v3.7.6:43364a7ae0, Dec 19 2019, 00:42:30) [MSC v.1916 64 bit (AMD64)] on win32
Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.
>>> quit()

D:\>py -3.7-32
Python 3.7.6 (tags/v3.7.6:43364a7ae0, Dec 18 2019, 23:46:00) [MSC v.1916 32 bit (Intel)] on win32
Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.
>>> quit()

D:\>

ということで、64bit版、32bit版それぞれのインストールが確認できました。

引き続き、仮想環境を作ってみます。

D:\>mkdir Python3
D:\>cd Python3
D:\Python3>py -m venv sample
D:\Python3>cd sample
D:\Python3\sample>Scripts\activate
(sample) D:\Python3\sample>python
Python 3.7.6 (tags/v3.7.6:43364a7ae0, Dec 19 2019, 00:42:30) [MSC v.1916 64 bit (AMD64)] on win32
Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.
>>>

実際には途中でコマンドプロンプト内がクリアされますが、上記のような感じになります。

Longan NanoでUSB CDC転送(まだまだ)

Longan NanoでUSBのCDC転送にチャレンジしてみました。CDCで転送ができるとUSBケーブル一本でコンソール出力できる可能性があるからです。

で、まだまだまだまだ道のりは遠いですが、とりあえずライブラリのサンプルプログラムを無理やり動かしてCDC転送はできました。

まず、Platform IOで通常通り、プロジェクト作成します。デバイスは sipeed longan nanoです。

サンプルプログラムについてはGD32VF103_Firmware_Library_V1.0.1の中のExamples/USBFS/USB_Device/CDC_ACMの下にあるものを使用しました。

“Longan NanoでUSB CDC転送(まだまだ)” の続きを読む