シナリオ(筋書)

スマートフォンから電灯をつけたり消したりする。

キーワード

  • 人工知能 AI
  • プログラミング
  • スマートフォン
  • インターネット
  • IoT
  • Wifi
  • Web Server
  • HTML
  • Boostrap
  • GUI
  • Deep Learning 深層学習 音声コントロール

    Deep Learningとは、十分なデータ量があれば、人間の力なしに機械が自動的にデータから特徴を抽出してくれるディープニューラルネットワーク(DNN)を用いた学習

小・中学生向け初めてのプログラミング(Python)

cap4.JPG

予めPCとスマートフォンは、WiFiルータにより接続されている

  • PC上にあるWeb ServerをWifiを介してスマートフォンからアクセスする
  • Web Serverには、リレーをOn Offさせるボタンを表示させるHTMLを配置する。
  • Web Serverには、リレーを制御するCGIを配置する

Getting start

"Hello,world"

『プログラミング言語C』(原題:The C Programming Language)は、ブライアン・カーニハン (Brian W. Kernighan) とデニス・リッチー (Dennis M. Ritchie) によって書かれたC言語についての書籍である。著者名の頭文字からしばしばK&Rと略される。 例として掲載されている"hello, world"プログラムは、あらゆる「プログラミングの最初の例題」として定番となった。 参照

  • 古本でもよいからコンピュータの歴史であるから読んでほしい。

C言語 類(C C++ C# Java)は、ここでは扱わない

pythonとは、あまり関係ないが、python言語にも御作法がある。''' 4文字あけるインデント

オフサイドルールである。サッカーでないけどオフサイドトラップに「はまる」場合がある

オフサイドルール とは、字下げによって文などのかたまりの範囲(ブロック)を示す規則である。ブロックは字下げによって形成され識別される 参照

def main():
    print("hello world")
    print("hello japan")
    print("I love Tokyo")
オフサイドルールは、パンチカードでアッセンブラ言語でプログラム書いていたころに戻ったわけ! パンチら

defは、関数を定義する。

main()は、関数名

:(コロン)は、次にブロックが始まる。

" 'は、文字列の始まり終了を示す。

このprintの前にある4文字が固まりを表すオフサイドルールである、「(左端)側から離れる」

このプログラムを声に出して読んでみよう。

デフ メイン 括弧 括弧 コロン オフサイド プリント括弧 コーテーション ハローワールド コーテーション 括弧 オフサイド プリント括弧 コーテーション ハロージャパン コーテーション 括弧 オフサイド プリント括弧 コーテーション ハロー東京 コーテーション 括弧

C言語類

    void main(){
        printf("hello wolrd\n");
    }

このプログラムを声に出して読んでみると。

ボイド メイン 括弧 括弧 乳首 リターン プリントエフ 括弧 ダブルコーテーション ハローワールド 改行 ダブルコーテーション括弧 セミ リターン オッパイ括弧

結論 老人になってもかけるぞオッパイソん

コンピュータ教育に16進数は、必要か?

2進数は、制御を教えるのに必ず必要だ。IoTにしたって必ず、On Offが 1,0が必要だから。

1010 1001をどうやって読むか 世界共通でA9と呼びます。フランス人だってドイツ人だってアメリカ人だって 日本人とタイ人だけが「いちぜろいちぜろいちぜろぜろいち」って読んでいます。 JICAが悪いのです。 16進数は、2進数を読むのに必要なのです。原発系の制御するのであれば8進数で読めばよい。

PythonでIoT始めるためのHELLO IoT

  • USB リレーをPCにつなげて100V ACを制御しよう。 USB relay cap1.JPGcap2.JPGcap3.JPG ## リレーの仕様
    On-board micro control chip and on-board CH340 USB chip;
    With power indicator and relay state indicator;
    Relay: 5V, AC 10A / 250V, DC 10A / 30V;
    Communication baud rate: 9600bps;
    check code: on: A0 01 01 A2, off: A0 01 00 A1
  • 1000円ぐらいで購入
  • PCのUSBに接続してPythonを使用して制御
  • 100Vの電灯線をOn/Off制御
  • PCから制御
  • 携帯から制御
  • 時間になったらOff

シリアル通信によるリレー制御

  • USBインターフェイス(シリアル通信)
  • 2進数によるコマンド送信
  • python 3項演算子
  • タイマーによる実行遅延
  • 関数の定義
  • 関数の引数と初期値
  • for 文による繰り返し
In [10]:
import binascii,serial,time
def switch(text="On"):
    sw= bytearray(b"\xA0\x01\x00\xA1") if text!="On" else  bytearray(b"\xA0\x01\x01\xA2")
    ser = serial.Serial('COM4', 9600,timeout=0)  # デバイス名とボーレートを設定しポートをオープン
    ser.write(sw)      # 出力
    ser.close()
for i in range(10):
    sw="On" if i%2==0 else "Off"
    switch(sw)
    time.sleep(3)

最初の一歩 出力

  • コンソール文字列を出力します。
  • ダブルクォーテーションは、"....."は文字列を表します。
In [ ]:
print("hello world")

最初の計算

  • 定数の定義をします
  • 計算を定義します
  • 出力します ### 実は、= イコールは、代入でない! オブジェの名前の定義です
In [ ]:
a=10 #10を定義します
b=20 #20を定義します
c=a+b #式を定義します
print(a,b,c) #出力します
d=a*b   #掛け算
print(d)
e=3     
f=d/3   #割り算
print(f)
gg=int(d/3)
g=d%3  #余り
print(gg,g)

実は、= イコールは、代入でない! オブジェの名前定義です

オブジェクトのことをオブジェという理由

  • 最初に勉強した情報科学がフランス語だから

正確に表現するとオブジェに対するエリアスの定義である

脱線1

マクロ的使い方 outにprint関数のエリアス(別名)を定義

  • python の定義
In [ ]:
# ***証拠1***
out=print # マクロ的使い方 outにprint関数のエリアス(別名)を定義
out(10,20,30,10/30)

エリアス定義

In [ ]:
user,password="UserName","1234abc"
print(user,password)

出力

  • フォーマット出力 形を整える
In [ ]:
a=10;b=20;c=30
print("a={} b={} c={}".format(a,b,c))
print("a=%d b=%d c=%d"%(a,b,c))

ループ

  • 繰り返し5回行います
  • セミコロン ; で i とiの十倍を表示します
In [ ]:
for i in range(5):
    print(i,i*10)
In [ ]:
# 0 to 9 step 2
for i in range(0,10,2):
    print (i)
In [ ]:
for i in range(5): 
    print("hello {}".format(i))
In [ ]:
[print(x) for x in range(5)]
In [ ]:
for i,j in enumerate(["a","b","c"]):
    print(i,j)
In [ ]:
# 2重ループ 一行で書く
# お作法無視コーディング例
[[print(i,j) for i in range(5)] for j in range(4)]
In [ ]:
def pref_enum():
    pref=["北海道","青森県","岩手県","宮城県","秋田県","山形県","福島県","茨城県","栃木県","群馬県","埼玉県","千葉県","東京都","神奈川県","新潟県","富山県","石川県","福井県","山梨県","長野県","岐阜県","静岡県","愛知県","三重県","滋賀県","京都府","大阪府","兵庫県","奈良県","和歌山県","鳥取県","島根県","岡山県","広島県","山口県","徳島県","香川県","愛媛県","高知県","福岡県","佐賀県","長崎県","熊本県","大分県","宮崎県","鹿児島県","沖縄県"]
    for i,x in enumerate(pref):
        yield i,x
# pref=lambda: [(yield (i,x)) for i,x in enumerate(["北海道","青森県","岩手県","宮城県","秋田県","山形県","福島県","茨城県","栃木県","群馬県","埼玉県","千葉県"])]
# for x,y in pref():
#     print(x,y)
for x,y in pref_enum():
    print(x,y)
In [ ]:
pref=["北海道","青森県","岩手県","宮城県","秋田県","山形県","福島県","茨城県","栃木県","群馬県","埼玉県","千葉県","東京都","神奈川県","新潟県","富山県","石川県","福井県","山梨県","長野県","岐阜県","静岡県","愛知県","三重県","滋賀県","京都府","大阪府","兵庫県","奈良県","和歌山県","鳥取県","島根県","岡山県","広島県","山口県","徳島県","香川県","愛媛県","高知県","福岡県","佐賀県","長崎県","熊本県","大分県","宮崎県","鹿児島県","沖縄県"]
e_pref=lambda y: [(yield (i,x)) for i,x in enumerate(y)]
loop=lambda x,y:[(yield (i,j)) for i in range(x) for j in range(y)]
for i,j in loop(5,4): print(i,j)
for i,j in e_pref(pref):print(i,j)
In [16]:
x=['三鷹','吉祥寺','西荻窪','荻窪','阿佐ヶ谷','高円寺','中野','東中野','大久保','新宿','代々木','千駄ヶ谷','信濃町','四ツ谷','市ヶ谷','飯田橋','水道橋','御茶ノ水','秋葉原','浅草橋','両国','錦糸町','亀戸','平井','新小岩','小岩','市川','本八幡','下総中山','西船橋','船橋','東船橋','津田沼','幕張本郷','幕張','新検見川','稲毛','西千葉','千葉']
z=['東京都','東京都','東京都','東京都','東京都','東京都','東京都','東京都','東京都','東京都','東京都','東京都','東京都','東京都','東京都','東京都','東京都','東京都','東京都','東京都','東京都','東京都','東京都','東京都','東京都','東京都','千葉県','千葉県','千葉県','千葉県','千葉県','千葉県','千葉県','千葉県','千葉県','千葉県','千葉県','千葉県','千葉県']
y=['みたか','きちじょうじ','にしおぎくぼ','おぎくぼ','あさがや','こうえんじ','なかの','ひがしなかの','おおくぼ','しんじゅく','よよぎ','せんだがや','しなのまち','よつや','いちがや','いいだばし','すいどうばし','おちゃのみず','あきはばら','あさくさばし','りょうごく','きんしちょう','かめいど','ひらい','しんこいわ','こいわ','いちかわ','もとやわた','しもうさなかやま','にしふなばし','ふなばし','ひがしふなばし','つだぬま','まくはりほんごう','まくはり','しんけみがわ','いなげ','にしちば','ちば']
def eki():
    for i,(xx,yy,zz) in enumerate(zip(x,y,z)):
        yield i,xx,yy,zz
for ii,a,b,c in eki():
    print(ii,a,b,c)
0 三鷹 みたか 東京都
1 吉祥寺 きちじょうじ 東京都
2 西荻窪 にしおぎくぼ 東京都
3 荻窪 おぎくぼ 東京都
4 阿佐ヶ谷 あさがや 東京都
5 高円寺 こうえんじ 東京都
6 中野 なかの 東京都
7 東中野 ひがしなかの 東京都
8 大久保 おおくぼ 東京都
9 新宿 しんじゅく 東京都
10 代々木 よよぎ 東京都
11 千駄ヶ谷 せんだがや 東京都
12 信濃町 しなのまち 東京都
13 四ツ谷 よつや 東京都
14 市ヶ谷 いちがや 東京都
15 飯田橋 いいだばし 東京都
16 水道橋 すいどうばし 東京都
17 御茶ノ水 おちゃのみず 東京都
18 秋葉原 あきはばら 東京都
19 浅草橋 あさくさばし 東京都
20 両国 りょうごく 東京都
21 錦糸町 きんしちょう 東京都
22 亀戸 かめいど 東京都
23 平井 ひらい 東京都
24 新小岩 しんこいわ 東京都
25 小岩 こいわ 東京都
26 市川 いちかわ 千葉県
27 本八幡 もとやわた 千葉県
28 下総中山 しもうさなかやま 千葉県
29 西船橋 にしふなばし 千葉県
30 船橋 ふなばし 千葉県
31 東船橋 ひがしふなばし 千葉県
32 津田沼 つだぬま 千葉県
33 幕張本郷 まくはりほんごう 千葉県
34 幕張 まくはり 千葉県
35 新検見川 しんけみがわ 千葉県
36 稲毛 いなげ 千葉県
37 西千葉 にしちば 千葉県
38 千葉 ちば 千葉県
In [ ]:
[[print(i,j) for i in range(5)] for j in range(4)]
In [ ]:
a = lambda: [(yield (i,x)) for i,x in enumerate(["北海道","青森県","岩手県","宮城県","秋田県","山形県","福島県","茨城県"])]
print(a,type(a))
for x,y in a():
    print(x,y)
In [1]:
# -*- coding: utf-8 -*-
from PyQt5.QtCore import *;from PyQt5.Qt import *;from  functools import *
def click(sender):print(sender)
loop=lambda x,y:[(yield (i,j)) for i in range(x) for j in range(y)]
app,w,l =QApplication([""]), QWidget(),QGridLayout()
for i,j in loop(5,6):
    nm="Button%d%d"%(i,j);bx=QPushButton(nm);l.addWidget(bx, i, j);bx.clicked.connect(partial(click,nm))
w.setLayout(l),w.show(),app.exec_()
Button31
Button31
Button22
Button12
Button02
Out[1]:
(None, None, 0)

image.png

計算式

In [ ]:
a=10;b=20;c=a+b;print(a,b,c)

合計 平均 ラムダ式

In [ ]:
x=[1,2,3,4,5,6,7,8,9,10]
print(sum(x))
print(len(x))
avr=(lambda x: sum(x)/len(x)) #平均を求めるラムダ
print(avr(x))

リスト・タプルを返すラムダ式

In [ ]:
fun=lambda n=0,m=10,s=1:[i for i in (range(n,m,s))]
print(fun(s=1))
In [ ]:
fun=lambda n=0,m=10,s=1:tuple([i for i in (range(n,m,s))])
print(fun(s=1))

リストの繰り返し定義

In [ ]:
x=[x for x in range(10)]
print(x,type(x))
In [ ]:
x=["test "+str(x) for x in range(10)]
print(x)

2 重ループ

In [ ]:
x=["Test_({},{})".format(i,j) for i in range(3) for j in range(4)]
print(x)

2次元のリスト

In [ ]:
x=[["Test_({},{})".format(i,j) for j in range(3)] for i in range(4)]
print(x)
In [ ]:
import random
for i in range(10):
    x=random.random()
    print(x)

円周率

π=3. 1415926535 8979323846 2643383279 5028841971
In [ ]:
pi4 = 0
for i in range(10000000):
    pi4 += (1 / (i * 4 + 1) - 1 / (i * 4 + 3))
print(pi4 * 4)    # 3.141592153589902
In [ ]:
x=1,2,3,4,5,6,7,8,9,10
print(sum(x))
print(len(x))
In [ ]:
x="tokyo","chiba"
print(x)

Dictionary

In [ ]:
a={"test{}".format(x):x for x in range(10)}
print(a,type(a))
In [ ]:
a={"test{}".format(x):x for x in range(10)}
for k,v in a.items(): print(k,v)
In [ ]:
xx=("Test{}".format(x) for x in range(10))
print(type(xx))
for x in xx :print(x)
In [ ]:
xx=tuple(x for x in range(10))
xx
In [ ]:
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(1)            # 乱数の初期化。
w = np.random.rand(100)     # 1000個の乱数生成
# w = np.where(w > 0.5, 1, -1) # 0.5以上は1に、0.5未満は-1に変更
# w = w.cumsum()               # 累積和を取る

print(w.min())    # -11
print(w.max())    # 35

print(w.argmin()) # 64   最初に-11になったインデックス
print(w.argmax()) # 368  最初に35になったインデックス

plt.plot(np.arange(100), w) # 折れ線グラフとして表示
plt.scatter(w.argmin(), w.min(), marker="D", c="r")
plt.scatter(w.argmax(), w.max(), marker="D", c="r")
plt.text(w.argmin(), w.min(), "min", fontsize=16)
plt.text(w.argmax(), w.max(), "max", fontsize=16)
plt.show()
In [ ]:
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-np.pi*2, np.pi*2, 0.1)
y = np.sin(x)
plt.plot(x, y)
plt.show()
In [ ]:
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-np.pi*2, np.pi*2, 0.1)
y = np.cos(x)
plt.plot(x, y)
plt.show()
In [ ]:
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-np.pi*2, np.pi*2, 0.1)
y = np.arctan(x)
plt.plot(x, y)
plt.show()
In [ ]:
import numpy as np
import matplotlib.pyplot as plt
a=np.arange(-np.pi*2, np.pi*2, 0.1)
x=np.sin(a)
y=np.cos(a)
In [ ]:
import numpy as np
import matplotlib.pyplot as plt
def fun(xx):
    return [1/x**2 for x in xx]
xx=np.arange(-1,1,0.1)
yy=fun(xx)
plt.plot(xx,yy)

グラフ

参照