金曜日, 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でも同様です(走らせてみてください)。

土曜日, 8月 11, 2018

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

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


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



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

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

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

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

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



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

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

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

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

金曜日, 5月 04, 2018

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

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

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

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

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

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

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

金曜日, 1月 19, 2018

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

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

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

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

WS8212B データシート

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

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

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

Guide for WS2812B Addressable RGB LED Strip with Arduino



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


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


日曜日, 1月 14, 2018

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

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

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

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

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

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

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


こんな感じで動きます。




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


金曜日, 1月 05, 2018

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

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

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

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

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

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

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

追記です(2021-02-24)。Cygwin 環境での flex のインストール方法です。結論から言うと、m4 をインストール。gcc をインストールで動きます。Devel パッケージからはだめです。個別のプログラム名でインストール。

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

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

火曜日, 12月 26, 2017

互換性(mysql_xxx)

年末の大掃除ですね。古いコードを再利用しようとしたらひっかかりました。PHP って互換性ないんですね。

mysql_xxx この辺を全部 mysqli クラスの関数へ変換。変数の順序が違う。

迷惑ですね。

しかしながら思うんですが…

プログラミング言語ってのはプロトコルですよ。一方的な変更は勝手ですよね。

少なくとも互換性は確保してほしい。


月曜日, 12月 25, 2017

MySQL で、NULL 値

MySQL で、NULL 値を許可するかどうかで条件分岐が変わってきます。

LIKE では NULL 値をはじけないんですね。

コラムの値で NULL 値を許可するなら、OR で指定せねばなりません。


SELECT * FROM pages WHERE menuid=$id AND NOT status LIKE 'onhold' ORDER BY id desc



これなんですが、ここの status の値が NULL の場合、こうやって指定せねばなりません。


SELECT * FROM pages WHERE menuid=$id AND (status IS NULL OR NOT status LIKE 'onhold') ORDER BY id desc


気を付けましょう。

金曜日, 11月 24, 2017

デジタルからアナログへ

PC を使わないアナログ回路は設計・制作が(かなり)手間ではありますが省電力です。

LED を点滅させるだけならトランジスタでいけます。


それはいいんですが、アナログ回路の欠点といえばモジュール化できないところ。回路を組み合わせるのはケースバイケース、至難の業です。これが PC を使っていればどのようなセンサーでも使えます。標準化されたインターフェース(HIGH-LOW)だからですね。

ここでは回路をフォトダイオードで制御する回路を組み合わせてみました。

感度の調整は可変抵抗です。





木曜日, 11月 23, 2017

Arduino: アナログからデジタルへ

大抵のセンサーの出力はアナログです。光セル、音声マイク、赤外線距離センサーなど。Arduino ならアナログでもアナログ端子があるので使えるんですが、これを割り込み操作で使おうと思うとデジタルな値が欲しい場合があります。

オペアンプでセンサーの出力をデジタル化できます。



この回路は赤外線距離センサーの出力を増幅し、オペアンプでコンパレータ回路を実現したものです。基準値は非反転入力で調整します。

これでアナログの束縛から解放されますね。

割り込みを使った Arduino 用のプログラムはこちらです。

日曜日, 11月 19, 2017

可変電源+ケース


可変電源を組んでケースを作ってみた。実用性はともかくきれいなのができた。青いケース、青い7セグがいい。こんないいのができると夢を誘う。



人間心理ってのは微妙なもので、「アクリル板曲げ」のサイトを読んでいたら危機感(これはまずい)が襲ってきたっていうか。急遽CADでデザインして3Dプリンタでケースを印刷。

金曜日, 11月 03, 2017

太陽電池+スーパーキャパシタでフルカラーLEDランプを点灯


晴れた日が続き、ようやっと太陽電池モジュールが動いてくれました。天気次第ってのがなんですね。でもこうやって光ってくれてると太陽のエネルギーが感じられますね。ほぼ永久機関。いいですね。

ソーラーパネルを使って充電するスーパーキャパシタを使った回路です。逆流防止用ダイオード挟んでますが、そのまま充電してフルカラーLEDを光らせてます。


ATTiny13A でグラデーションで色が変化するよう設定してます。ランプシェードは Thingiverse 一番人気のこれ。お気に入りです。

MySQL でコラム(列)の値を交換

MySQL でコラム(列)の値を交換する方法です。

変数を使います。

使わないと MySQL ではできないようです。

update 'table' set start=(@tmp:=`X`), X=Y, Y=@tmp

日曜日, 10月 29, 2017

レーザーダイオード用定電流電源

ふとレーザーダイオードを点灯させよう!などと思い立ち、定電流電源を作ってみました。レーザーポインターなどで使われているあれですね。これはダイオードなので一定の電流を流してやる必要があります。

ボタン電池でそのままつなぐなる荒業があるらしいんですが、ここは電流を制限するほうが安心だってことでLM317で回路を組んでみました。

データシートそのままの回路ですが、Adjust - Out 間の電圧が1.25Vで保たれる性質を利用します。間の抵抗を調整することで電流を制御します。

久しぶりの電子工作のせいか手間取ったのみならず、なんだかできあがりは散々でしたが動きます。





追記:折角つくった定電流回路なのでケースを3Dプリンタで設計。

フィラメントがPLAなので、熱したはんだごてで成形できるわけなんです。

部品がきっちり収まるケースができました。感動ですね。





火曜日, 8月 29, 2017

Python 3.6 でユニコードを扱う場合。

Python 3.6 でデータベースからユニコード文字列をとってきて書きだそうと思うと引っかかります。

要はこれです。

f=open('test.txt', 'w', encoding="utf-8")

ユニコードを指定します。でないとエラーを出します。

月曜日, 8月 28, 2017

Python/MySQL のクエリーで%を使う

単純な話ですが ...

Python 3.6 はライブラリが一通りそろっていて文字列処理が楽です。

データベースを使うなら mysql-connector-python のようなドライバを導入してアクセスします。

クエリの書き方ですが、カーソルの execute() メソッドを使います。

クエリをそのままかくのもいいんですが、パラメタ化してエスケープするやり方です。

cur.execute("select * from genera where latin like %s", (genus,))

このカッコ、コンマは省略できません。

ここまでは既出だと思うんですが、ここで % を使いたい場合。

つまんない話なんですが、ネットでなかったんですよね。直接の記述が。これパラメタそのものをいじればいいんです。

genus = genus +"%"

これで%が使えます (いや、それだけです)。

火曜日, 8月 22, 2017

Laravel 5.4 のすすめ (データベース篇)

Laravel でデータベースのテーブルを作る作業は ORM まできちんと定式化されています。

まずはテンプレートを使って migration のファイルを自動生成し、テーブルを記述。ファイルはここ database/migrations/* 。

php artisan make:migration create_テーブル名 --create=テーブル名

テーブルの記述はこのような形式です。

$table->string('en');
$table->string('ja');
$table->integer('order_id');        

コマンドを使用してテーブルを作成します。データベース設定ファイルは .env です。

php artisan migrate

あとはモデルを自動生成。これでマッピングが完了。

php artisan make:model テーブル名

 $table 変数でテーブル名を指定できます。

class Office extends Model
{
    protected $table = 'office';
}

専用のページを作りたければ、コントローラーを作ってビューを生成します。個々のレコードのページを作っておくと、編集ができますね。その際は routes/web.php の編集が必要です。

php artisan make:controller コントローラー名 --resource

ロールバックでテーブルを消去したり、シードを使ってデータを放り込むこともできます。

日曜日, 8月 20, 2017

(仕様が変更された)Laravel 5.4 を使う

故あって Laravel で PHP サイトを作ることとなりました。ので概要をメモっておきたいと思います。

これ MVC とか ORM とか DI とか軽く使えるよくできてるシステムなんですが、いまだマイナー系なのかなんなのか仕様がバージョンごとコロコロ変わる。

ついこのあいだ ver. 5.1 で書いて ver. 5.4 で動かそうと思うと… 動きます。ライブラリをそのままコピーしてあるからなんですが、これが新たなプロジェクトをたちあげようとするとライブラリの仕様が変更されている。

新しいライブラリはメソッドなど整理されていて使いやすくなっていますが、仕様が異なるので同じ調子で書いていくとエラーが続出します。

まずは新しいプロジェクトの作り方から。

laravel new プロジェクト名

これでライブラリなどすべてコピーされて完全なシステムが出来上がります。それはいいんですが、ここでまずルーティングのファイルの置き場所が違う。ファイル名まで違う。ver. 5.3 で変更されたようです。

ROUTING:
routes/web.php

ここですね。あとビューとかコントローラーとかは同じです。

VIEW:
resources/views/*.blade.php

CONTROLLER:
app/Http/Controllers/*.php

ルーティングの書き方はこんな感じです。

Route::resource('/dashboard','OrderController');

これですべてページからのリクエストが仕分けされてコントローラーで処理できます。これはいいですね。

動詞 URI アクション ルート名
GET /photos index photos.index
GET /photos/create create photos.create
POST /photos store photos.store
GET /photos/{photo} show photos.show
GET /photos/{photo}/edit edit photos.edit
PUT/PATCH /photos/{photo} update photos.update
DELETE /photos/{photo} destroy photos.destroy

これどういうことかってページから投げられるリクエストでそれぞれアクションを呼べるわけなんです。DELETE って投げれば destroy ってメソッドを定義するだけできちんと動くサイトが出来てしまうわけです。

こうやってビューでフォームを指定します。DELETE を投げてるわけですね。

<form method="post" action="/dashboard/{{$task->id}}">
{{ csrf_field() }} 
{{ method_field('delete') }} 
<input type='submit' value='Remove' 
class='btn btn-danger btn-sm' />
</form>

で、コントローラーを定義します。

    public function destroy($id)
    {
        $order= Order::findOrFail($id);
        $order->delete();
        return redirect ( '/dashboard' );
    }

これだけでリクエストが仕分けされて処理できるって仕組みです。うまいですね。

Order ってのはデータベースのテーブルがマップされたオブジェクトです。ORM ってのは便利ですね。delete() って呼ぶだけで作業は完了です。

Laravel ってのは頭が整理されるとってもよいフレームワークだと思います。しかしながら仕様変更が激しいので要注意です。

土曜日, 5月 06, 2017

GitHub: 排除されないファイルを指定する

GitHub 便利です。置いとくだけで世界中どこでもコンパイルできます。書いてアップデートすればいいわけです。バックアップの手間もない。

で、調子よくコード書いてたわけなんですが、なぜか lib ディレクトリがアップデートされていない。ファイルが出てこないのでコミットできない。

どうも .gitignore で JAR ファイルを排除したのがまずかったらしいんですが、これです。

*.jar

これだと JAR ファイルすべて排除されちゃうんですね。lib ディレクトリ以下のものもです。

ここは排除されないよう例外を設定します。

!lib/*

これです。!をつけておくと排除されないんですね。


Flask の Blueprint のテンプレート問題

  Flask の Blueprint は、ルート、静的ファイル、テンプレートをまとめて管理できます。しかし、テンプレートが指定できません。 ここでは、Blueprint の template_folder の問題点と回避策を説明します。 Blueprint のテンプレート問題...