RaspberryPI3でのWebサーバは情報が少ない

RaspberryPI3をWebサーバとして使うのは、消費電力とか、冷却装置とか、静音性とかの問題が少なく、先人が沢山いると思ったのですが、Webで探してみると、Apacheをインストールしてみました、標準サンプルの画面が表示されました、のような記事ばかりで運用やセキュリティについては、実際にRaspberryPIを使ってみての記事ではなく、一般的にLinuxならこうだからRaspberryPIもこうでしょうみたいな記事が多く、参考になっても実際にやるとなるとできない事ばかり。

 

RaspberryPI3を独自に調査してWebサーバとして使うのはちょっと困難かも。

あ、セキュリティも何も考えないで公開するならインストールするだけです。

 

 

何をするか

今まで、電子機器の特性を理解する事ばかり考えていました。

もちろん、電子回路の学習のために購入したものなのですから当然なんです。

 

が、最近は、この静音で省電力なマシンを「サーバ」として使いたくなりました。

先陣は沢山いるはずなので、ネットで調べながらちまちまやろうと思います。

Python 言語の理解 その9

GPIO接続したスイッチ入力とLED出力を組み合わせてみる

LED 6個を順に光らせ、スイッチが押されたら反転させる

 

GPIO_inout_LED6.py

 

#Raspberry Pi3 GPIO 入出力

#ライブラリの読み込み
import RPi.GPIO as GPIO
from time import sleep

SW_PIN = 4
LEDNO = [23,24,25,16,20,21]

#初期化
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

#入力モードとして設定
GPIO.setup (SW_PIN,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)
#出力モード設定
for LED_PIN in LEDNO:
    GPIO.setup (LED_PIN,GPIO.OUT,initial = GPIO.LOW)


#出力設定
try:
    LED_PIN = 0
    LED_ADD = 1
    while True:
        GPIO.output (LEDNO[LED_PIN],GPIO.HIGH)
        sleep(0.3)
        GPIO.output (LEDNO[LED_PIN],GPIO.LOW)
        LED_PIN = LED_PIN + LED_ADD
        if (LED_PIN == 6):
            LED_PIN = 0
        if (LED_PIN == -1):
            LED_PIN = 5
        # スイッチが押されていたら反転
        if (GPIO.input(SW_PIN) == GPIO.HIGH) :
            print ( 'SW on :GPIO' + str(SW_PIN) + ' HIGH' )
            if (LED_ADD == 1) :
                LED_ADD = -1
                print ( 'LED_ADD = -1' )
            else :
                LED_ADD = 1
                print ( 'LED_ADD = 1' )
        else :
            print ( 'SW off:GPIO' + str(SW_PIN) + ' LOW' )

except KeyboardInterrupt:
    print ( 'CTRL + C' )
    pass

#GPIOリセット終了
GPIO.cleanup()

 

それなりに機能するのですが、スイッチの反応が悪くてなんかうまくいきません。
押されたトリガを捕まえられるとよいのですが、押された時に読み込まないと反応しないし、押されたままだと続けて反応してしまうので、ボタンを押したことがうまくLEDの光らせ順を変えるようには機能しない事が多いです。

で、押されたら話されるまで反転させないようにちょっとプログラムをいじってみました。

 

 

GPIO_inout-2_LED6.py

 

#Raspberry Pi3 GPIO 入出力

#ライブラリの読み込み
import RPi.GPIO as GPIO
from time import sleep

SW_PIN = 4
LEDNO = [23,24,25,16,20,21]

#初期化
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

#入力モードとして設定
GPIO.setup (SW_PIN,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)
#出力モード設定
for LED_PIN in LEDNO:
    GPIO.setup (LED_PIN,GPIO.OUT,initial = GPIO.LOW)


#出力設定
try:
    SWC_CHK = 0
    LED_PIN = 0
    LED_ADD = 1
    while True:
        GPIO.output (LEDNO[LED_PIN],GPIO.HIGH)
        sleep(0.3)
        GPIO.output (LEDNO[LED_PIN],GPIO.LOW)
        LED_PIN = LED_PIN + LED_ADD
        if (LED_PIN == 6):
            LED_PIN = 0
        if (LED_PIN == -1):
            LED_PIN = 5
        if (GPIO.input(SW_PIN) == GPIO.HIGH) :
            print ( 'SW on :GPIO' + str(SW_PIN) + ' HIGH' )
            if (SWC_CHK == 0) :
                SWC_CHK = 1
                if (LED_ADD == 1) :
                    LED_ADD = -1
                    print ( 'LED_ADD = -1' )
                else :
                    LED_ADD = 1
                    print ( 'LED_ADD = 1' )
        else :
            print ( 'SW off:GPIO' + str(SW_PIN) + ' LOW' )
            SWC_CHK = 0

except KeyboardInterrupt:
    print ( 'CTRL + C' )
    pass

#GPIOリセット終了
GPIO.cleanup()

 

 

バッチリです!

ボタンを押すとLEDの光順が反転するようになりました。

Python 言語の理解 その8

if 文の不思議

今まで見てきたプログラム言語の制御文で、字下げが必須な言語は知りません!

pythonは初めて知った字下げが必要なプログラム言語!


test = 0
if test == 0 :
    print ("ifの中です")

もし、C言語ならこんな感じです。

test = 0
if ( test == 0) {
    print ("ifの中です\n") ;
}

見慣れているからか、C言語の方が見やすいです。

 

条件文は()でくくるし、その条件に合致した時に実行する文は{ }で囲んでました。

それが常識のように思ってました。
それが字下げで表現するなんて驚きです。でも見やすいような見づらいような。。

 

if (test == 0) { :
    print ("ifの中です")
}

SyntaxError: invalid syntax

 

if (test == 0) : {
    print ("ifの中です")
}

SyntaxError: invalid syntax

 

if (test == 0) :
{
    print ("ifの中です")
}

IndentationError: expected an indented block

いろいろ試してみましたが、駄目でした(>_<)

 

 

test = 0
if test == 0 :
    print ("if の then の中です tab")

else

        print ("if の else の中です tab*2")

 

これ else の後の字下げ幅が違うんですがエラーにならないし、ちゃんと機能しました。

うーん、慣れれば使いやすいのかもしれませんが、不思議な感じです。

 

 

Python 言語の理解 その7

すっきりしないプリント書式

画面に出力するときの print の書式の指定がなじめない。

c言語なら printf だけで様々なことが出来るのに、Pythonだとすっきりしない。

 

普通にプリントすると、ブランクで区切られて列挙されるだけ

>>> print (1,2,3)
1 2 3

 

オプションで区切り文字や行末文字を指定することはできる。

>>> print (1,2,3,sep=",")
1,2,3
>>> print (1,2,3,sep=",",end=" !\n")
1,2,3 !

 

文字列属性には、.formatメソッドで変数の展開が出来るらしい。変数名の指定順はどうでもいいらしい。変数がない場合も許される。

>>> print ("{name}の年齢は{age}歳です。".format(name="やまだ",age=15))
やまだの年齢は15歳です。

>>> print ("{name}の年齢は{age}歳です。".format(age=26,name="武田"))
武田の年齢は26歳です。

>>> print ("{}の年齢は{}歳です。".format("井上",30))
井上の年齢は30歳です。

 

既に設定済の変数を使う場合はこうすればいいらしい

>>> name="吉田"
>>> age=21
>>> print ("{}の年齢は{}歳です。".format(name,age))
吉田の年齢は21歳です。

 

書式文字列を変数に入れて共通で使うならは

>>> tfmt = "{}の年齢は{}歳です。"
>>> print (tfmt.format(name,age))
吉田の年齢は21歳です。


>>> print (tfmt.format("山田",19))
山田の年齢は19歳です。

 

python3.6 からは、f で書式設定ができるらしい

先に使ったこの一文を

>>> print ("{name}の年齢は{age}歳です。".format(name="田中",age=22))

こういう風に書くことが出来るらしい

>>> name="田中",age=22

>>> print (f"{name}の年齢は{age}歳です。")

 

ですが! ですが!

pi@raspberrypi:~/soc $ python3
Python 3.5.3 (default, Jan 19 2017, 14:11:04)
[GCC 6.3.0 20170124] on linux
Type "help", "copyright", "credits" or "license" for more information.

 

RaspberryPi の Raspbian に入っているのは Python 3.5.3でした(>_<)

駄目じゃん(笑)

Python 言語の理解 その6

モジュールを読み込む

 

>>> import random

 

使うときは モジュール名に .関数名 を付けて呼び出せます。

>>> random.randint(1,10)
9

>>> random.random()
0.5393296766294138
>>> random.random()
0.030883659185085177

モジュールの中の使う関数だけを限定で読み込むときは

>>> from random import randint
>>> randint(1,10)
2

読み込んでいない関数は使えません。
>>> random()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'module' object is not callable
>>> from random import random
>>> random()
0.46652281624641545

 

読み込めば当然使えます。(笑)

Python 言語の理解 その5

組み込み関数の不思議

 

組み込み関数はいろいろあると思いますが、書籍で最初に紹介されていた関数に驚きました。

>>> max(5,3)
5

これは良くある感じなんですが、パラメータが二つ以上でもいいんです。

 

>>> max(5,3,30)
30

どっちが大きいか、ではなく、どれが大きいか、なんですね。


>>> min(3,8,6,9)
3

小さいものを選ぶのも同じでした。

 

キャラクタ変換はアスキーコードじゃない!当たり前?

>>> chr (43)
'+'

>>> chr(12356)
'い'

utf-8コードなんですかね。

 

そしてその反対の関数もあります。
>>> ord ("1")
49
>>> ord ("あ")
12354

utf-8コードなんですかね。二文字指定するとだめでした。

 >>> ord("ad")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: ord() expected a character, but string of length 2 found

>>> ord("い")
12356

"あ" と "い" は連番ではない?? 真ん中のコードの文字は何?

 

>>> chr(12355)
'ぃ'

おー、小さい文字(笑)

 

 

キーボードからの文字入力はこんな感じで書けます。

>>> input("こんにちは:")
こんにちは:はい
'はい'

 

パラメータに何も書かないとプロンプトなし

>>> input("")
gh
'gh'

 

パラメータ省略も同じように動きます

>>> input()
fhg
'fhg'

 

これだけわかってくると何か書けそうな気もしてきますね~