あらきけいすけのメモ帳

あらきけいすけの雑記帳2

学習指導要領解説からの統計関連の部分の抜き書き

教育用の覚書
高等学校学習指導要領解説 数学編 平成21年11月
http://www.mext.go.jp/component/a_menu/education/micro_detail/__icsFiles/afieldfile/2012/06/06/1282000_5.pdf
高等学校学習指導要領(平成30年告示)解説 数学編 理数編 平成30年7月
http://www.mext.go.jp/component/a_menu/education/micro_detail/__icsFiles/afieldfile/2019/03/28/1407073_05_1_1.pdf

2015年4月以降入学者

(2012年4月1日に高等学校の第1学年に入学した生徒から)

数学I

(4) データの分析
統計の基本的な考えを理解するとともに,それを用いてデータを整理・分析し傾向を把握できるようにする。

  • ア データの散らばり
    四分位偏差,分散及び標準偏差などの意味について理解し,それらを用いてデータの傾向を把握し,説明すること。
  • イ データの相関
    散布図や相関係数の意味を理解し,それらを用いて二つのデータの相関を把握し説明すること。

中学校では,コンピュータを用いるなどして,ヒストグラムや代表値などにより資料の傾向をとらえることや,資料を整理して活用すること及び標本調査などを扱っている。
ここでは,統計の用語の意味やその扱いについて理解させるとともに,例えば表計算用のソフトウェアや電卓も適宜用いるなどして,目的に応じデータを収集・整理し,四分位数,四分位範囲,四分位偏差,分散,標準偏差,散布図及び相関係数などに着目させ,データの傾向を的確に把握することができるようにする。
なお,様々な事象から見いだされる確率や統計に関するデータを,中学校では「資料」と表していたが,高等学校では生活の中で活用することや統計学とのつながりを一層重視し,一般的に用いられる「データ」という用語を用いることとした。また,従前の「相関図」も,今回の改訂で「散布図」に改めることにした。
指導に当たっては,生徒が意欲をもって学習を進めることができるように,テーマを適切に選び,具体的な事象に基づいた扱いをすることが大切である。また,∑は「数学B」で扱うことに留意する。

ア データの散らばり

ここでは,中学校での学習を更に発展させて,四分位数,四分位範囲,四分位偏差,分散及び標準偏差などの用語を知り,意味を理解させるとともに,それらを利用してデータの傾向を的確にとらえ説明できるようにする。なお,四分位範囲とは第3四分位数から第1四分位数を引いた値であり,四分位偏差とは四分位範囲を2で割った値である。
指導に当たっては,これらの用語を具体的な事象と関連付けて扱うことが大切である。例えば,充電式機器の使用可能時間について,平均値や分散,標準偏差を求めて,それらの意味を理解させることが考えられる。また,四分位数に関連して箱ひげ図を扱うことも考えられる。箱ひげ図とは,次のように,最小値,第1四分位数,中央値(第2四分位数),第3四分位数,最大値を箱と線(ひげ)を用いて一つの図で表したものである。箱の長さが四分位範囲で,全データの真ん中の半数が入っている区間を表している。またこの図中に,平均値を記入して中央値との差を考えたり,第1・第3四分位数と中央値との差を考えたりすることにより,データの散らばり具合が把握しやすくなるので,複数のデータの分布を比較する場合などに使われる。
[箱ひげ図]

イ データの相関

ここでは,散布図及び相関係数の意味を理解させるとともに,それらを利用してデータの相関を的確にとらえ説明できるようにする。例えば,あるクラスの生徒について,100m走と走り幅跳びの計測記録を収集し,散布図に表したり相関係数を求めたりして,これらのデータの間の傾向をとらえさせることが考えられる。特に,多くのデータを扱う場合には,コンピュータなどを積極的に活用するようにする。

数学B

(1) 確率分布と統計的な推測
確率変数とその分布,統計的な推測について理解し,それらを不確定な事象の考察に活用できるようにする。

  • ア 確率分布
    • (ア) 確率変数と確率分布
      確率変数及び確率分布について理解し,確率変数の平均,分散及び標準偏差を用いて確率分布の特徴をとらえること。
    • (イ) 二項分布
      二項分布について理解し,それを事象の考察に活用すること。
  • 正規分布
    正規分布について理解し,二項分布が正規分布で近似できることを知ること。また,それらを事象の考察に活用すること。
  • ウ 統計的な推測
    • (ア) 母集団と標本
      標本調査の考え方について理解し,標本を用いて母集団の傾向を推測できることを知ること。
    • (イ) 統計的な推測の考え
      母平均の統計的な推測について理解し,それを事象の考察に活用すること。

 今回の改訂では,従前の「数学C」の「確率分布」と「統計処理」を一つにまとめ,ここで扱うこととした。
 中学校第3学年では,標本調査の必要性や意味について理解させるとともに,簡単な場合について標本調査を行い,母集団の傾向をとらえ説明することを扱っている。
 「数学Ⅰ」の「(4) データの分析」では,分散,標準偏差及び相関係数などを扱い,データの傾向を把握し,説明することを学習している。また,「数学Ⅱ」の「(1) いろいろな式」では二項定30 理を扱い,「数学A」の「(1) 場合の数と確率」では,場合の数,確率とその基本的な法則,独立
な試行の確率及び条件付き確率などを扱っている。
 ここでは,まず,確率変数や確率分布について理解させる。従前の「数学A」の「場合の数と確率」で扱われた期待値もここで扱い,確率分布としては二項分布と正規分布を扱う。また,標本調査の考え方及びそれを用いて母集団のもつ傾向を推測する方法について理解させる。さらに,確率の理論を統計に応用し,統計的な見方や考え方を豊かにし,それらを活用して母平均などを推定できるようにする。
 なお,これらの内容については理論的な扱いに深入りせず,具体的な例や作業を通して確率分布の考えや統計的な推測の考えを理解させるようにする。例えば,二項分布が正規分布で近似されることなどの数理的現象については,コンピュータなどを用いて直観的に理解できるようにすることが考えられる。また,ここでの学習に関して,「数学Ⅱ」及び「数学A」の該当する内容を履修していない場合には,適宜必要な事項を補足するなどの配慮が必要である。

ア 確率分布
  • (ア) 確率変数と確率分布

ここでは,確率変数とその分布について理解させる。
ここで扱う確率変数は,標本空間の各要素に対し一つの実数を対応させる写像のことである。
例えば,互いに区別できる2枚の硬貨を投げる試行についての標本空間を
S={(表,表),(表,裏),(裏,表),(裏,裏)}
とする。この試行において,Sのそれぞれの根元事象に対して表の出る枚数を確率変数Xとすれば,(表,表)のときX=2,(表,裏)のときX=1,(裏,表)のときX=1,(裏,裏)のときX=0となり,次のような確率分布表が得られる。
[表]
このような具体例を通して,確率変数とその分布の意味を十分に理解させることが大切である。また,確率分布の特徴を示す確率変数の平均(期待値),分散及び標準偏差について理解させ,確率分布の特徴をとらえることができるようにする。なお,それらの計算に際しては,電卓などの活用を積極的に図るようにする。

  • (イ) 二項分布

基本的な離散型確率分布として,二項分布を扱う。
一つの試行において,ある事象Eが起こる確率を p,起こらない確率を q とする。すなわち,P(E)=pq=1-p0\lt p\lt1とする。この試行を独立に n 回だけ繰り返したとき,事象Eの起こる回数を確率変数Xとすれば,Xは二項分布 B(n,p)に従い,Xが値 k をとる確率は次のようになる。
P(X=k)={}_nC_kp^kq^{n-k} (k=0, 1, 2, ..., n)
また,二項分布 B(n,p)に従う確率変数Xの平均は np標準偏差\sqrt{npq}である。
例えば,1個のさいころを5回投げるとき,1の目の出る回数を X 回とすると,確率変数 X は二項分布 B(5,\frac16)に従い,1の目が k 回出る確率は P(X=k)={}_5C_k\left(\frac16\right)^k\left(\frac56\right)^{5-k}で与えられる。
指導に当たっては,生徒の実態等に応じて適切な具体例を工夫することが大切である。

正規分布

統計学において重要な役割を果たす正規分布について,その意味を直観的に理解させるようにする。
変量 X に対応する関数 f(x)\geqq0があって,確率P(a\leqq X\leqq b)が,区間[a,b]に対応する曲線y=f(x)x軸との間の面積で定められるとき,X を連続型確率変数,f(x)確率密度関数という。ここでは,これらについて具体的な事象を基に理解させる。例えば,身長などの計測においては,測定値 X はある範囲のすべての実数値をとると考えられるので,X は連続型確率変数である。
 また,\sigma>0-\infty\lt\mu\lt\inftyを定数とするとき,f(x)=\frac{1}{\sqrt{2\pi}\sigma}\exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)確率密度関数とする連続分布が正規分布であることや,その平均は\mu標準偏差\sigmaであることを扱う。なお,正規分布確率密度関数 f(x)=\frac{1}{\sqrt{2\pi}\sigma}\exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)に現れる自然対数の底 e については,数学Ⅲで扱われることに留意する。
 確率変数 X正規分布 N(\mu,\sigma^2)に従うとき,Y=\frac{X-\mu}{\sigma} と置くと Y は標準正規分布N(0,1)に従う。この Y については,y\gt0に対する確率P(0\leqq Y\leqq y)が数表に表されているので,この数表を用いて確率P(a\leqq X\leqq b)を求めることができる。なお,確率変数 X に関しては,P(\mu-\sigma\leqq X\leqq\mu+\sigma)P(\mu-2\sigma\leqq X\leqq\mu+2\sigma)P(\mu-3\sigma\leqq X\leqq\mu+3\sigma)の値について触れることも大切である。
 次に,n の値が大きいとき,二項分布が正規分布で近似できることについて扱う。
 n自然数0\lt p\lt1q=1-p とする。二項分布B(n,p)に従う確率変数Xは離散型であり,
P(X=k)={}_nC_kp^kq^{n-k} (k=0, 1, 2, ..., n)
である。このとき,n の値が大きくなると X の分布が,正規分布 N(np,npq)に近づいていくことをコンピュータなどを用いて直観的に理解させる。そこで,Z=\frac{X-np}{\sqrt{npq}} と置いて離散型の確率変数Zを考えると,n の値が十分大きいとき,Zの分布は標準正規分布で近似できる。これを用いて,例えば,さいころを 400 回投げたとき,1の目が 100 回以上出る確率などを簡単に求めることができる。なお,「二項分布が正規分布で近似できることを知ること」とは,二項分布で表わされる確率を正規分布を活用して求めることに重点を置くことを表現したものである。

ウ 統計的な推測
  • (ア) 母集団と標本

 統計調査には,調査の対象となるものをもれなく調べる全数調査もあるが,全数調査では多くの時間,費用及び労力がかかり,実用的でないこともある。そこで,標本を抽出して調査し,その結果から全体の性質を推測する標本調査が必要となる。中学校第3学年では,標本調査の必要性や意味とともに簡単な場合についての標本調査が扱われている。ここでは,中学校における学習を踏まえながら標本調査の考え方について理解を深める。
 なお,「標本を用いて母集団の傾向を推測できることを知ること」とは,乱数表やコンピュータなどで作った擬似乱数などを用いて実際に標本を抽出するなどの具体的な活動を行い,標本のもつ傾向から母集団のもつ傾向が推測できることの理解に重点を置くことを表現したものである。

  • (イ) 統計的な推測の考え

 母平均の推測を扱う。母平均 m,母標準偏差\sigmaをもつ母集団から大きさ n の標本 X_1X_2,…,X_n を無作為に抽出するとき,n の値が十分に大きければ標本平均 \frac{X_1+X_2+X_3+\cdots+X_n}{n}の値はm に近い。さらに,標本平均と m の差を \frac{\sigma}{\sqrt{n}}で割って,Z=\frac{X_1+X_2+X_3+\cdots+X_n-nm}{\sqrt{n}\sigma}と置くと,Zは平均0,標準偏差1の分布に従う。そして,n の値が十分大きければ,Zの分布は標準正規分布N(0,1)と近似的に等しい。このことに基づいて母平均の統計的な推測が可能になる。例えば,大量に生産された製品の中から無作為に抽出された製品に関するあるデータについて,そのデータの平均値と母標準偏差が与えられているとする。このとき,このデータの平均値を用いて信頼度 95 %で母平均を推測することなどに統計的な推測の考えは活用できる。
 母平均の信頼区間の意味を生徒に理解させるために,幾つもの標本を抽出し,標本平均を計算することが考えられる。その際,コンピュータなどを積極的に活用させるようにする。このような学習を通して,統計的な推測の意味やよさを理解させ,活用する態度を育てることが大切である。

2025年4月入学者

『高等学校学習指導要領(平成30年告示)解説 数学編 理数編』(2022年4月1日以降に高等学校の第1学年に入学した生徒が対象)より抜き書き

「データの分析」では,四分位数など(箱ひげ図を含む。)を中学校に移行して,「仮説検定の考え方」を取り扱うこととした。仮説検定については「数学 B」の「統計的な推測」で取り扱うが,この科目の履修だけで高等学校数学の履修を終える生徒もいることから,実際的な場面を考慮し,具体例を通して「仮説検定の考え方」を直観的に捉えさせるようにした。
第1部 第1章 第2節 2 (3) ア (ア)「数学I」(3単位)

 今回の改訂で,従前の「数学 B」の「ベクトル」を「数学 C」に移行し,「確率分布と統計的な推測」を「統計的な推測」に名称を変更するとともに,従前の「数学活用」の「社会生活における数理的な考察」の「社会生活と数学」及び「データの分析」を移行して「数学と社会生活」としてまとめて「数学 B」に位置付けた。この科目は,「数学Ⅰ」より進んだ内容を含み,数学的な素養を広げるとともに,数学の知識や技能などを活用して問題解決や意思決定をすることなどを通して数学的に考える資質・能力を養う科目で,次の①から③までの内容で構成した。
 ① 数列   ② 統計的な推測   ③ 数学と社会生活
 「統計的な推測」では,区間推定及び仮説検定も取り扱う。また,「数学と社会生活」では,散布図に表したデータを一次関数などとみなして処理することも取り扱うこととした。
第1部 第1章 第2節 2 (3) イ (イ)「数学B」(2単位)

小学校算数科

「データの活用」領域に関係する内容として,データを分類整理することや,表やグラフに表すこと,相対度数や確率の基になる割合を取り扱っている。また,それらを活用して,日常生活の具体的な事象を考察し,その特徴を捉えたり,問題解決したりする力を養っている。

中学校数学科

上記の小学校算数科における学習の上に立ち,主に,次の内容を取り扱っている。

  • ア 第 1 学年では,目的に応じてデータを収集し,コンピュータを用いるなどしてデータを表やグラフに整理し,データの分布の傾向を読み取り,批判的に考察して判断すること。
  • イ 第 2 学年は,複数の集団のデータの分布に着目し,四分位範囲や箱ひげ図を用いてデータの分布の傾向を比較して読み取り批判的に考察して判断すること。
  • ウ 第 3 学年では,母集団から標本を取り出し,標本の傾向を調べることで母集団の傾向を推定し判断したり,調査の方法や結果を批判的に考察したりすること。

高等学校数学科

 これらを踏まえ,ここでは,データの散らばり具合や傾向を数値化する方法を考察する力,目的に応じて複数の種類のデータを収集し,適切な統計量やグラフ,手法などを選択して分析を行い,データの傾向を把握して事象の特徴を表現する力,不確実な事象の起こりやすさに着目し,主張の妥当性について,実験などを通して判断したり,批判的に考察したりする力などを培う。

(4)データの分析
 データの分析について,数学的活動を通して,その有用性を認識するとともに,次の事項を身に付けることができるよう指導する。

  • ア 次のような知識及び技能を身に付けること。
    • (ア)分散,標準偏差,散布図及び相関係数の意味やその用い方を理解すること。
    • (イ)コンピュータなどの情報機器を用いるなどして,データを表やグラフに整理したり,分散や標準偏差などの基本的な統計量を求めたりすること。
    • (ウ)具体的な事象において仮説検定の考え方を理解すること。
  • イ 次のような思考力,判断力,表現力等を身に付けること。
    • (ア)データの散らばり具合や傾向を数値化する方法を考察すること。
    • (イ)目的に応じて複数の種類のデータを収集し,適切な統計量やグラフ,手法などを選択して分析を行い,データの傾向を把握して事象の特徴を表現すること。
    • (ウ)不確実な事象の起こりやすさに着目し,主張の妥当性について,実験などを通して判断したり,批判的に考察したりすること。

[用語・記号] 外れ値

pigpio ライブラリのサンプルコード PCA9685.py を用いて Raspberry Pi 3B から I2C 接続経由でサーボモータを動作させる

自分用の書きかけの覚書。pigpio の i2c 関連の関数のパラメータの与え方がよくわかっていない状態だが、〔Raspberry Pi 3B/3B+/Zero W + Python + pigpio ライブラリ + pigpio コード PCA9685.py*1〕と〔PCA9685 16channel 12bit pwm サーボドライバー*2〕を使ってサーボモータを動かすことができた。これでラズパイ側は(電源を除けば)[03:GPIO02(SDA1,I2C)] [05:GPIO03(SCL1,I2C)]の2個のGPIOピンを使うだけで最大16個までのサーボを動かせるようになった*3

  • ハードウェア側(Adafluit製)
    次のようにピン接続する。ピン接続がきちんとしていて、ラズパイに電源がつながっていたら(ラズパイのOSが起動していても、いなくても電力が供給されているので)ドライバー上の赤いLEDが点灯する。
    1. ドライバー[GND]⇔RPi[06:Ground]*4
    2. ドライバー[0E] not connected
    3. ドライバー[SCL]⇔RPi[05:GPIO03(SCL1,I2C)]
    4. ドライバー[SDA]⇔RPi[03:GPIO02(SDA1,I2C)]
    5. ドライバー[VCC]⇔RPi[02:5V]
    6. ドライバー[V+]⇔サーボモータに供給する電源(RPi[04:5V]でOK)
  • プログラム側
    1. まず pigpio のサイトの Examples のページ(http://abyz.me.uk/rpi/pigpio/examples.html)から PCA9685_py.zip をダウンロードする
    2. この zip ファイルを解凍して Python コード PCA9685.py を取り出す
    3. コマンド "sudo python PCA9685.py" で実行。*5ドライバーに接続されているすべてのサーボモータが一斉に同じ動作をする
  • Pythonプログラムの自作
    • 最小限のコード:0番ポートのサーボモータを(多分、約)90度のポジションに動かす。これを"runPCA9685.py"の名前で"PCA9685.py"と同じフォルダに保存する
# -*- coding: utf-8 -*-
if __name__ == "__main__":
   # ライブラリを読み込む部分
   import PCA9685
   import pigpio

   # ライブラリを使うためのインスタンスを立ち上げる部分
   pi = pigpio.pi()
   if not pi.connected:
      exit(0)
   pwm = PCA9685.PWM(pi) # defaults to bus 1, address 0x40

   # サーボモータを動作させるPWM信号の周波数を決める部分
   pwm.set_frequency(50) # suitable for servos

   # サーボモータを動作させる部分
   ch = 0
   pw = 1500
   pwm.set_pulse_width(ch, pw)

   # プログラムの終了処理の部分
   pwm.cancel()
   pi.stop()
    • コマンド "sudo python runPCA9685.py" で実行。

*1:"pigpio" i2c PCA9685 - Google 検索; pigpio library Examples

*2:pca9685 16channel 12bit pwm サーボドライバー - Google 検索 Adafluit製のものがあちこちで売られているようだ。

*3:ただし電力の供給をラズパイに頼ると、サーボモータの数が増えたときに、ラズパイが落ちるかもしれない。
I2C通信の使い方に記載の接続法を見ると、何台でもつなげそう。

*4:GroundのピンならどれでもOK

*5:この前に "sudo pigpiod" を実行しておく。

Raspberry Pi 3BとWindows 10 PCをLANケーブル(と給電用のUSBケーブル)で直接つないで操作する

自分用の書きかけの覚書。ネット環境が無いところでラズパイをWindowsから動かすためののメモ。

要点

bonjour*1をインストールした?*2Windows 10 PC*3Raspberry Pi 3 Model BをLANケーブル(と給電用のUSB A-micro B ケーブル)で直接つないで、ウィンドウズからラズベリーパイにリモートログインできる。

しくみ

Windows 10 はリンクローカルアドレスで繋いだラズパイのホスト名(デフォルトでは"raspberrypi")を探して繋ぐことができる*4。作業の要点は

  • Raspberry Pi
    • 起動時にsshあるいはvnc(あるいはxrdp)が起動されるようにして、いつでもリモートログインできる状態にしておく。
    • Raspberry Pi の hostname (マシン名)を把握しておく(と、リンクローカルアドレスを調べなくてもつなげられる)。初期設定は raspberrypi である。これを別の名前にするには /etc/hostname と /etc/hosts を書き換える。
    • hostname がわからないときは、リンクローカルアドレスで接続する。ユーザ名は把握していないといけない。
  • Windows
    • Bonjourをインストールしておく不要[2020.1.19]
    • ラズパイとWindowsPCをケーブルを繋いで、ラズパイを起動した後で、コマンドプロンプトで"arp -a"*5コマンドを打ち込んで、有線LANが動作していることを確認する
    • Windows PCから(初期設定をいじっていないなら)"raspberrypi.local"に(sshならTeraTermなどで、vncならVNC Viewerなどで、xrdpならリモートデスクトップで)リモートログインする

ここに書いていないこと

WindowsとRPiの間の通信はできてはいるけれど、(例えばRPiでソフトのアップデート sudo apt-get update をしたいときに)RPiからインターネットにどのようにアクセスすればよいか。参考にしたサイトの「ブリッジ接続もしてみる」を参照。

参考にしたサイト

qiita.com

*1:bonjour Zeroconf - Google 検索

*2:[2019.3.31]bonjourサービスをアンインストールした状態でも動作した。169.254.*.*のリンクローカルアドレスが勝手に振られている状態でホスト名"raspberrypi.local"のIPアドレスの解決どうやっているんだろう?

*3:バージョン1803(OSビルド 17134.648)

*4:[2020.1.19]以前は以下のように書いていたが、新品のWin10PCでもBonjourなしでつながることを確認した。「Bonjourとは、自動的にインターネットのネットワークを構成する技術であるZeroconfZeroconf - Google 検索に基づいたApple社製のソフトで、ネットワークアドレスが分からないラズパイのアドレスを自動で探して繋ぐようにするために必要。」

*5:windows arp - Google 検索

Raspberry Pi Zero W(RPi4BもOK)をUSBガジェットにしてUSBケーブル1本でWindows 10マシンから操作する

自分用の書きかけの覚書。Raspberry Pi Zero WとWindows 10 ノートPCをUSBケーブル1本(A-micro B*1)で繋いで(給電も兼ねる)、Win10PCからRPi0wにリモートログインできるようにする(RPi0w側でsshが起動していればWin側はTeraTerm*2などで、RPi0w側でVNCが起動していればWin側はVNC Viewer*3などで、RPi0w側でxrdp*4が起動していればWin側はリモートデスクトップ接続でつなぐ)。要点はどうも次の2点に集約できそう:

  • ラズパイ側
    • linux USB gadget 機能を有効にする。*5Raspbian OSの/bootディレクトリのconfig.txt, cmdline.txtを書き換える。
      1. /boot/config.txt の最後尾に "dtoverlay=dwc2" と書かれた行を追加する。
      2. /boot/cmdline.txt の "rootwait" と "quiet" の間に " modules-load=dwc2,g_ether" を書き加える。
      詳細は参考にしたサイトを参照。
    • sshVNCを有効にするとか、xrdpをインストールするとかのネットワーク接続によるリモートログイン可能な状況を作る)
  • Windows

首尾よく接続出来たら、RPi0wにUSB経由でリモートログインして、Wi-Fi接続の設定をするとさらに世界が広がるwwww
参考にしたサイト:
qiita.com
gist.github.com
blog.gbaman.info

OpenCV+Pythonで動画を録画/再生する(音声はなし, Windows 10/Raspberry Pi 共通)

自分用の覚書。OpenCV*1で動画を録画するためのPythonミニマル・コード*2
サンプル1:PC/ラズパイに接続されたUSBカメラ*3の動画像を表示する。終了はCtrl+C. VideoCapture()の引数の0はビデオデバイスの番号。

import cv2
cap = cv2.VideoCapture(0)
try:
    while True:
        ret, frame = cap.read()
        if ret == True:
            cv2.imshow('a',frame)
        cv2.waitKey(1)

except KeyboardInterrupt:
    cap.release()
    cv2.destroyAllWindows()

サンプル2:PCに接続されたカメラの動画像をディスプレイに表示し、ファイル'test.m4v'に録画する。終了はCtrl+C.([2019.6.24追記]手元のRPiではデスクトップ環境上の Python3(IDLE)を使って実行すると、出力した動画ファイルが常に壊れていた。LXTerminal上で実行すると、再生可能な動画ファイルを出力した。)低速度撮影(time lapse)は2, 12, 20行頭の#を取る

import cv2
#import time

cap = cv2.VideoCapture(0)
fps    = cap.get(cv2.CAP_PROP_FPS)
width  = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

fname  = 'test.m4v'
fmt    = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
size   = (width,height)
writer = cv2.VideoWriter(fname, fmt, fps, size)
#intrvl = 1 #[sec] set time interval of time-lapse recording

try:
    while True:
        ret, frame = cap.read()
        if ret == True:
            cv2.imshow('a',frame)
            writer.write(frame)
            #time.sleep(intrvl) # waiting (for time-lapse)
        cv2.waitKey(1)

except KeyboardInterrupt:
    cap.release()
    cv2.destroyAllWindows()

サンプル3:サンプル2で録画したファイル'test.m4v'を再生する。終了はCtrl+C.

import cv2
import time

vFile  = 'test.m4v'
cap    = cv2.VideoCapture(vFile)
fps    = cap.get(cv2.CAP_PROP_FPS)

try:
    while cap.isOpened():
        ret, frame = cap.read()
        if ret == True:
            cv2.imshow('a',frame)
            time.sleep(1/fps)
        cv2.waitKey(1)

except KeyboardInterrupt:
    cap.release()
    cv2.destroyAllWindows()

Microsoft Excel について

業務用の覚書。書きかけ。

Excelの利点

  • (多分、職場の)誰もが Excel を持っている。Excel ファイルとちょっとましなマシン(Core i7 + 8GB RAM とか)があればどこでも作業できる。(業務遂行に関して自由度が上がる)
  • (多分、実用的には、項目数が50以下、レコード数が10,000以下程度なら) WYSIWYG のデータベースとして使える。つまりクエリを投げずに直に検索, 置換, 編集ができる。とくに「フィルター*1」と「ウィンドウ枠の固定*2」は操作が直感的でいい。
  • オンプレミス*3で運用できる。(これはGoogleドライブにはできない)
  • プログラム(VBAマクロ)を書いてデータ操作ができる。(ただし Visual Basic for Application は動作がもっさりとしている。特にスレッディングができない*4。)
  • (たしかに PythonPHPExcel ファイルを操作できるライブラリはあり、そっちの方が高速ではあるのだけれど、Excel とは別のプログラミング環境を導入する必要がある…というのは、可搬性に関わる敷居が高いことを意味していると思う)
  • Excel ファイルにデータを書き出せる(データファイルとアプリケーション実行環境の「閉じた(複数にまたがらない)」エコシステムである。)
  • VBA には「連想配列( Scripting.Dictionary オブジェクト)」*5があるので Key-Value 的なコードが書けなくもない。これは重複検出に便利。
  • VBA は変数名にマルチバイト文字*6が使えるので、テーブルの項目名を変数名に使うとかできちゃったりする
  • Excel VBA 使いがいれば、外注するよりコミュニケーションの時間コストを下げることができる

コーディングの注意点

Excel VBA による Excel ワークブック/ワークシート, CSVファイル, XMLファイル等のデータ処理の進行は、HTMLベースのWebアプリケーションに似ていてイベント(Excel内のボタン操作など)によってコードが駆動される。

ラグランジュ補間(2点を通る直線の公式)、単位の換算、そのプログラミングについての覚え

授業のための覚書

2点(x_0,y_0), (x_1,y_1)を通る直線の公式:\displaystyle y=\frac{x-x_1}{x_0-x_1}y_0+\frac{x-x_0}{x_1-x_0}y_1
これは Lagrange 補間(Lagrangian interpolation*1)と呼ばれる計算技法である。この式は次のようにも書ける:
2点(x_0,y_0), (x_1,y_1)を通る直線の公式:\displaystyle y=\frac{x-x_0}{x_1-x_0}(y_1-y_0)+y_0
「直線の式」だからって、この計算式の応用範囲が「直線を描画する」といったグラフィックスだけに限られるわけではない。例えば、摂氏温度*2から華氏温度*3への換算にも使える。水の氷点が(0度C,32度F), 沸点が(100度C,212度F)なので摂氏温度がc度のときの華氏温度の値は\displaystyle f=\frac{c-100}{0-100}32+\frac{c-0}{100-0}212になる。
ここで受験数学の答案のような「筆算にしばられた発想」だと、係数を整理してf=1.8c+32とまとめるところだが、プログラミングの世界では整理すべきでない。この換算をC言語コードで書くときは、次のように書くのがベター;

// マクロ, 関数形式マクロ
#define Cfleeze   (0.0)
#define Cboil   (100.0)
#define Ffleeze  (32.0)
#define Fboil   (212.0)
#define tempC2tempF(tempC) (tempC - Cfleeze)/(Cboil - Cfleeze)*(Fboil - Ffleeze) + Ffleeze
// 定数, 関数
float tempC2tempF (float tempC) {
  const float Cfleeze =  0.0, Cboil = 100.0;
  const float Ffleeze = 32.0, Fboil = 212.0;
  tempF = (tempC - Cfleeze)/(Cboil - Cfleeze)*(Fboil - Ffleeze)
          + Ffleeze;
  return tempF;
}

このコードならば「tempC=CfleezeのときにFfleeze」「tempC=CboilのときにFboil」の値を返す tempC の1次関数を計算していると分かる。ややこしい計算はコンピュータにやらせればよい。むしろ「何の計算をコンピュータにやらせているのかはっきり分かる」コードの方がベターである*4

演算数から考えると const を使って計算の定数を予め作っておいて*5、define で「インラインで計算」するのが早いかも:

// マクロ, 関数形式マクロ
// tempC2tempF(tempC) = (tempC - Cfleeze)/(Cboil - Cfleeze)
//                      *(Fboil - Ffleeze) + Ffleeze
#define Cfleeze   (0.0)
#define Cboil   (100.0)
#define Ffleeze  (32.0)
#define Fboil   (212.0)
const float
  tempC2tempFCoeff  = (Fboil - Ffleeze)/(Cboil - Cfleeze),
  tempC2tempFOffset = -(Cfleeze)*(Fboil - Ffleeze)/(Cboil - Cfleeze)
                      + Ffleeze;
#define tempC2tempF(tempC) ((tempC)*tempC2tempFCoeff + tempC2tempFOffset)

*1:ラグランジュ補間 - Wikipedia

*2:セルシウス度 - Wikipedia

*3:華氏 - Wikipedia

*4:プログラミングの世界では、いきなり数値をソースコードに書くことは「マジックナンバー」と呼ばれ、プログラムの可読性が悪くなるので避けるべきとされている。;マジックナンバー (プログラム) - Wikipedia可読性 - Wikipedia

*5:変数名は長くなってもよいから、計算で使うデータの内容を表示した方がよい。変数名の長さは、実際のCPU上で動くマシン語には影響しない。