金曜日, 9月 21, 2018

型破りな Python

Python でもっとも特徴的なのは抽象化が徹底していること。抽象化ってのはつまりパラメタ化できるってことですね。属性で値(本質)を得ることができるわけです。

変数やメンバ変数などそのものを配列で扱えます。しかも値を文字列で取得できます。これは便利ですね。グローバル、ローカル変数そのものが配列でアクセスできます。

globals()
locals()

型でさえ抽象されてます。同じ変数名で型を変えることが Python なら可能です。なんか抵抗があるようなところが型破りな Python なわけです。

a = 0  # int
a *= 1.0   # float
a = str(a)  # string

ここで型は変数の属性、変えることのできる属性の一種です。

これができるってことはつまり静的型チェックがないわけなんですが、そもそも Python はコンパイラなんてもたないんですよね。

有名どころでは、True/False がそのまま数です。


if False + 1:
    print('???')

水曜日, 9月 19, 2018

Python: try ブロックでコードが終わるとき

ゆえあってPythonでシステムを書いている今日この頃なんですが、面白い発見をしたのでここで書いておきます。

まあ、もとはといえばtry-except-finallyなど書いていて、データベース接続をどこで閉じるかっていう議論があったわけです。finallyブロックでどうか、なんていうことで議論は収束しました。

しかしながらここで「え」「これfinallyこないんじゃない」「無理だよ」「unreachable」っていう指摘が出てきたわけなんです。tryブロックで値を返していたわけなんですね。finallyへは来ないんじゃ…

しばらくして「あれ?」って声が上がりました。これです。

この結果は…(走らせてみてください)。

tryブロックで終了するコードだと起きる現象ですね。

実はこれ、Javaでも同様です(走らせてみてください)。

def foo():
try:
return 'try'
except:
return 'except'
finally:
return 'finally'
print(foo())
view raw finally.py hosted with ❤ by GitHub
def foo():
for i in range(5):
try:
break;
except:
return 'except'
finally:
print( 'finally')
print(foo())
view raw try.py hosted with ❤ by GitHub
class TryTest{
static String foo(){
try{
return "try";
}catch(Exception e){
System.out.println("except");
}finally{
return "finally";
}
}
public static void main(String args[]){
System.out.println(TryTest.foo());
}
}
view raw TryTest.java hosted with ❤ by GitHub

土曜日, 8月 11, 2018

Python でタイミング図(信号)を描く

Python ライブラリの matplotlib を使ってタイミング図を描く方法です。


それはいいんですが、ここで一言。



Python プロジェクトでライブラリのバージョンを管理するなら仮想環境が要ります。
 
numpy モジュールを読見込む際、signal.py でみごとこけました。です。

ので「休日を返せ」モードで 

(Python は素晴らしい言語かもしれないが)ライブラリ管理がなっていない。 

なってないです。つまり、Java でいう Central Repository + Maven がない。

「numpy を使うなら singal.py ファイルを作ってはならない」なる注意書きが必要です。信じがたい。



で、タイミング図を書く方法です。

ここのポイントは線グラフの描写で、毎クロックで縦線をひきます。

折れ線グラフは点を指定して図を描いているのと同じなので、x値を繰り返せばそこで縦線がひかれるわけですね。

xValue で指定しているのがそれです。

import matplotlib.pyplot as plt
import numpy as np
import random
xValue=[]
for i in range(0,10):
r= random.randint(0,1)
xValue.append(i)
xValue.append(i)
xValue.append(10)
yValue = [0]
for i in range(0,10):
r= random.randint(0,1)
yValue.append(r)
yValue.append(r)
zValue = [0]
for i in range(0,10):
r= random.randint(0,1)
zValue.append(r)
zValue.append(r)
zValue = np.array(zValue) + 1.5
uValue = [0]
for i in range(0,10):
r= random.randint(0,1)
uValue.append(r)
uValue.append(r)
uValue = np.array(uValue) + 3
plt.plot(xValue, yValue)
plt.plot(xValue, zValue)
plt.plot(xValue, uValue)
plt.show()
view raw timing-chart.py hosted with ❤ by GitHub

金曜日, 5月 04, 2018

Python: ファイルリストをソートする

このところゆえあって Python プロジェクトを担当しております。

括弧のない簡便さ、行末のセミコロンなし、インデント必須ってのははまりますね。

ライブラリの豊富さってのはプログラミング言語のすべてみたいなもんですが、こいつばかりは人気がモノを言います。

もっとも好まれる言語で選ばれる Python ならではの強みですね。

その Python でディレクトリ中のファイルをリストアップするスクリプトを書いてみました。

path でディレクトリを、type でソートのキーを指定します。

import os
# Sorts files by date, name, size, type
def listdir_sorted(path,type):
lst=lambda f:f[1]
if type=="date":
lst = lambda f: os.stat(os.path.join(path, f)).st_mtime
elif type=="name":
lst = lambda f: f[1]
elif type=="size":
lst = lambda f: os.stat(os.path.join(path, f)).st_size
elif type=="type":
lst = lambda f: os.path.splitext(f)[1]
return list(sorted(os.listdir(path), key=lst, reverse=False))
view raw sortfiles.py hosted with ❤ by GitHub

金曜日, 1月 19, 2018

Arduino: ネオピクセルLEDテープライト

ちょっと感動しました。このネオピクセルLEDテープライト。まずフルカラーです。

どんどん明るくなっていくLEDなんですが、このテープ、それぞれLEDを指定して点灯できるんですね。

これLEDごとレジスタがついてる。

WS8212B データシート

シフトレジスタを使ってLEDを指定して点灯する方法がありますが、その原理です。シリアルで信号を送ってそれぞれ点灯できるわけです。それぞれ切り取って使えます。

「なんてこった」って思いましたね(笑。

Arduino 使ってつないで点灯してみたんですが、これですね。いいライブラリまで出てる。鮮やか。動きがある。並べるとイメージが違う。(実際はこの動画よりもっと鮮やかですよー)

Guide for WS2812B Addressable RGB LED Strip with Arduino



プログラムです。ライブラリはこちらです。

#include "FastLED.h"
#define NUM_LEDS 12
#define DATA_PIN 3
CRGB leds[NUM_LEDS];
int index=0;
static uint8_t hue;
void setup() {
FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
}
void loop() {
index++;
index=index%NUM_LEDS;
hue++;
hue=hue%256;
leds[(index+5)%NUM_LEDS] = CHSV((hue+30)%256,255,255);
leds[(index+3)%NUM_LEDS] = CHSV((hue+15)%256,255,255);
leds[(index+1)%NUM_LEDS] = CHSV(hue,255,255);
leds[index] = CRGB::Black;
FastLED.show();
delay(300);
}

これ並べたマトリックス・ディスプレイまで出てますが(まだ高いですね)、夢が広がります。


日曜日, 1月 14, 2018

Arduino: 光と音で警告するマウス

作ってみました。ここは当然の如く3Dプリンターで。IR距離センサーで反応します。

近づくと光と音で警告します。

フルカラーLEDで通常は青、反応すると赤、しばらくは緑が点灯します。

LEDが赤で点灯中は振動モーターで鳴ってくれます。

ケースは丸く作ったのですが思い直して両側を削って作りました。

のっかってる赤トンボは愛嬌です(頭でバランスがとれてます)。


こんな感じで動きます。




このプログラムは音声センサまでついてますが、写真のマウスは距離センサだけです(なくても動きます)。

int vibPin = 12;
int gPin = 11;
int rPin = 13;
int bPin = 10;
long start;
boolean ledOn = false;
int count = 0;
long tSnd = -1;
int sndLevel = 0;
void setup() {
Serial.begin(9600);
pinMode(bPin, OUTPUT);
pinMode(gPin, OUTPUT);
pinMode(rPin, OUTPUT);
pinMode(vibPin, OUTPUT);
// HIGH = off, LOW = on
digitalWrite(bPin, HIGH);
digitalWrite(rPin, HIGH);
digitalWrite(gPin, HIGH);
start = millis();
}
boolean irOn(int ir) {
// Serial.println(ir);
return 50 < ir;
}
boolean micOn(int mic) {
Serial.println(mic);
if (sndLevel == 0) {
sndLevel = mic;
return false;
}
return 100 < mic - sndLevel;
}
void loop() {
int ir = analogRead(A0);
int mic = analogRead(A1);
long now = millis();
if ( irOn(ir) || now - tSnd < 3000 || micOn(mic)) {
if (100 < now - start) {
ledOn = !ledOn;
if (micOn(mic)) {
tSnd = now;
}
start = now;
}
count = 0;
} else if ((800 < now - start) && (count <= 10)) {
ledOn = !ledOn;
count++;
start = now;
} else if (1700 < now - start) {
ledOn = !ledOn;
start = now;
}
if (irOn(ir) || now - tSnd < 3000 || micOn(mic)) {
digitalWrite(vibPin, HIGH);
} else {
digitalWrite(vibPin, LOW);
}
if (ledOn) {
if (irOn(ir) || now - tSnd < 3000 || micOn(mic)) {
digitalWrite(rPin, LOW);
} else {
if (10 < count) {
digitalWrite(bPin, LOW);
} else {
digitalWrite(gPin, LOW);
}
}
} else {
digitalWrite(bPin, HIGH);
digitalWrite(rPin, HIGH);
digitalWrite(gPin, HIGH);
}
delay(10);
}
view raw warning.ino hosted with ❤ by GitHub

金曜日, 1月 05, 2018

コメントを消すプログラム (flex)

できました。うざいコメントを消すプログラム。

コメントをすべて消してくれるプログラムです。

// から行末、/* */ 内を消すプログラムです。あしからず。

自分で書いても良かったんですが、flex 使ってみました。これならクオート(リテラル)の処理が自動です。

コンパイル方法は以下の通り。
flex remove-comments.l;
gcc lex.yy.c -lfl -o remove-comments.exe

ファイル名を指定してください。
./remove-comments.exe filename

%{
%}
%x COMMENT
%x STRING
cmt \/\/.*
%%
{cmt} /* do nothing */
flex remove-comments.l ;gcc lex.yy.c -lfl;gcc lex.yy.c -lfl -o remove-comments.exe
\" BEGIN(STRING); yymore();
<STRING>\n BEGIN(INITIAL);
<STRING>([^\"\n]|\\\"|\\\n)+ yymore();
<STRING>\" printf(yytext);BEGIN(INITIAL);
"/*" BEGIN(COMMENT); yymore();
<COMMENT>"*/" BEGIN(INITIAL);
<COMMENT>"*" yymore();
<COMMENT>[^*]+ yymore();
%%
int main(int argc, char** argv){
yyin=fopen(argv[1],"r");
return yylex();
}
追記です(2021-02-24)。Cygwin 環境での flex のインストール方法です。結論から言うと、m4 をインストール。gcc をインストールで動きます。Devel パッケージからはだめです。個別のプログラム名でインストール。

うるさいコメントがこれで消えます。

(追記)IME変換ってのはアメ公のエゴが満開ですよね。日本語は連中の所有物じゃない。冒涜です。

Qt: 外部プログラムを起動する

  Qt/C++ のアプリは、外部へ直接アクセスできます。これはネットアプリでは不可能な Qt のメリットです。 外部プログラムを起動することもできます。QProcess::startDetached() を使うと独立したプロセスを立ち上げることができます。 この QProces...