最近、急に、インターネットエクスプローラ9(Vistaマシン)で「このWebサイトのセキュリティ証明書には問題があります」とエラーが出るようになった。強制的に継続実行しても、次のページで同じエラーが頻発する。セキュリティソフトも「有効期限切れ」と表示され動作していない。ブラウザソフトのサポート期限が切れているためかと思いつつ、ネットで症状を検索してみると、この症状は、httpsで始まるURLで、以下の場合に発生するとある。
エラーが出る証明書の期限を確認してみると、チャンと有効期限内である。しかし、クライアントPCの日付をみると、「月日は正しい」が・・、「年が2028年」となっている。何と10年も先の日付である。これでは有効期限が切れるのも納得。
そこで、日付を現在の正しい年月日に修正し、パソコンを再起動させると、「証明書エラー」もなくなり、「セキュリティソフト」も動作し、正常に使える状態になった。
プリンタ切替機の不調で、パソコンがフリーズし、強制再起動を何度も行ったことが、思い当たるが・・
インターネット経由で時刻を取得する「インターネット時刻」の設定も”time.windows.com”と自動的に同期するようになっていたのですが、たまには日付のチェックが必要(年にも注意)。
(時刻はtime.nist.gov 、time-nw.nist.gov 、time-a.nist.gov 、time-b.nist.gov などから取得可)
「ラムダ式(lambda expressions)は、簡易的な関数オブジェクトをその場で定義するための機能」とある。また、「ラムダ式はメソッドを変数の様に扱える」ので、ラムダ式を関数の引数としてインラインで引き渡せる。ただし、ラムダ式は単一行の式しか持つことができず、文のように複数行のブロックを持つことはできないので、ラムダ式で複雑な処理を行うことは困難である。
ラムダ式は、関数で書くと冗長になりがちな、ちょっとした処理をインラインで書くことができるため、よりシンプルに記述できる。また、ラムダ式は名前が無い「無名関数」の一つだが、変数に代入することで疑似的に名前を付けることができる。
ラムダ式はPythonの他C++やJavaなど、いろいろなプログラム言語でも利用できるが、言語によって表記法が異なるので注意。
(関数で表現した例) | (ラムダ式で表現した例) | |
def func(a, b): return a+b |
lambda a, b : a + b |
前述の様に、ラムダ式では複数行にまたがる文を記述できないが、以下の様にif文に相当する三項演算子は使用可能。
※【データをシーケンス(順に並ぶ)にまとめて管理できる主なオブジェクト】
安価なドライバー(ULN2003AGP)付きステッピングモーターセット(28BYJ-48、5個入、\1040)をラズパイから制御した。28BYJ-48は4相ユニポーラタイプで、図のような回路になっている。このモーターに減速ギヤが組み合わさっており、減速比は1/64である。
ドライバーICはULN2003Aで、7つのトランジスタアレーでを内蔵している。28BYJ-48は5V(最低4.8V)で動作する。1.2V充電電池×4本(約5V))など、別途電源を準備する方が良いが、ラズパイの5V電源(USB直なのでUSB電源の電流供給量に注意)でも駆動できる。
モーターの動作は、IN1〜4の4つの極それぞれに以下の信号を順に送ると回る(1-1相励磁)。
ただ、これではトルクが小さいため、トルクが欲しい時は、消費電量が増えるが、次の8ステップの信号を順に与える(2-2相励磁)。
28BYJ-48ステッピングモーター |
配線図 | 28BYJ-48の動作例 |
<stepmotor.py> | |
#-*- coding:utf-8 -*- import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) mPin = [17, 27, 22, 23 ] # 桃, 橙, 青, 黄 StepCount = 8 Seq = [[1,0,0,1], [1,0,0,0], [1,1,0,0], [0,1,0,0], [0,1,1,0], [0,0,1,0], [0,0,1,1], [0,0,0,1]] for pin in range(0,4): GPIO.setup(mPin[pin], GPIO.OUT) def setStep(st, delay): #シーケンスを出力 for k in range(0,4): GPIO.output(mPin[k], Seq[st][k]) time.sleep(delay) def forward(delay, steps): #CW方向に回転 for i in range(steps): for j in range(StepCount): setStep(j, delay) def backwards(delay, steps): #CCW方向に回転 for i in range(steps): for j in reversed(range(StepCount)): setStep(j, delay) try: while True: delay = int(input("Time Delay (ms)?")) if(delay < 1) break steps = int(input("How many steps? ")) if (steps > 0): forward(delay , steps) else: backwards(delay , steps) except KeyboardInterrupt: pass finally: GPIO.cleanup() |