2011年1月28日金曜日

pythonでctypesを使ったときにちょっと困った不可解なエラー

経験のないUSB機器をお手軽に試用するため、
久しぶりにpython+ctypesを試してみることにした。
長いこと使っていないと一度調べたことを再び
一から確認していかねばならなくなるので、
煩わしくて、せっかく適応可能な機会に恵まれても
使う気力は失せてしまう。
それでも、全く使わないですむかというと、
使ったときの快適感だけは鮮明に記憶されているので、
引っ張りだして使ってみたくなるのがpytho+ctypesだと
僕は思うのだ。
以前に書いたスクリプトとドキュメントを参考にしながら、
今回お世話になるDLLのヘッダファイルを見て、
ctypesラッパーを書いたのだけど、すぐにつまずいた。
正しく関数の引き数の指定しているにも関わらず、
引き数の数が合いませんとかいうエラーが出るのである。
エラーメッセージを頼りにしてGoogle先生に聞いてみたら、
DLLに組み込まれている関数のプロトタイプ宣言に
関係があるらしい。いわゆるstdlibとCDECLの違いだ。
簡潔に言えばstdlibは、Win32APIみたいなOSの
サービスコール的な関数をDLLに埋め込むときの規約で
CDECLは、C/C++でつくった関数を単純にDLL化したときに
適応される約束みたいなものだ。
話を元に戻すと自分が今回でくわしたエラーは、
stdcallで宣言された関数を呼び出すときに、
ctypesに対してそれはCDECL宣言の関数ですよと
謝った情報でDLLをオープンしていたかららしい。
DWORD testFunc(DWORD a, DWORD *b);
みたいなDLL関数をインポートするとき、次でエラーが出るような場合だ。
from ctypes import *
_lib_hoge=clib.LoadLibrary("hoge.dll")
testFunc=_lib_hoge.testFunc
testFunc=testFunc.args=[c_ulong, c_void_p]
bb=c_ulong()
ret=testFunc(10, byref(bb))
testFuncがstdcallな関数だった場合に、このスクリプトを
実行したときのエラーメッセージはこんな感じ。
"ValueError:Procedure called with not enough
argments (8 bytes missing) or wrong calling
convention"
一見,引数の数か型指定が間違っているだけとしか思えない.
でも正しい指定をしているから期待通りに動かない怒りは,
結果としてctypesに向けられることになるのだ.
エラー対策方法は,スクリプトの冒頭にあるDLL読み込みのところを
次のように改めればよい。
from ctypes import *
_lib_hoge=clib.LoadLibrary("hoge.dll")
testFunc=_lib_hoge.testFunc
testFunc=testFunc.args=[c_ulong, c_void_p]
bb=c_ulong()
ret=testFunc(10, byref(bb))
知っていれば些細な問題なんだけど、知らないとこれだけで
python+ctypesをあきらめてしまう要因になると思うのだ。

湯船につかりながらポメラでこの記事を書いているのだけど、
昨日やったばかりの作業やエラーメッセージを思い出せない。
日頃どれだけコピペに頼る生活をしているのか、
実感させられるのである。
2011/01/27 07:23

2011年1月23日日曜日

ソリの思い出

「東北小さな旅」は毎週土曜日の朝にNHKが
放送している東北地方限定ニュースのなかのコーナー。
その名の通り東北地方の各地を回り田舎の風景を
そこに住む人々の生活も交えて紹介していく番組だ。

毎週絶対見るのだと決めているわけではないのだけど、
土曜日の遅い朝に目が覚めてテレビをつけチャンネルを
ポチポチと切り替えると決まってこの番組に落ち着く。

今日の町は「秋田県にかほ市」
ちょうどテレビをつけたところで、
雪深い神社の境内に長く張り巡らされた階段を
女性レポーターが歩いているところだった。
階段には10cmほどの新雪があり
レポーターは長いブーツで雪を漕いで歩いていた。

雪と階段をテレビに見ながら僕は、
冬になると決まって思い出すソリの思い出を
反芻していた。

小学3年生まで僕は盛岡市青山4丁目にある
自衛隊官舎に住んでいた。
そこは運動公園の前にあり、雪が積もると
誰も来なくなる冬の運動公園に行っては
雪を漕いで歩いた。

あの頃は今に比べると盛岡も寒かった。
運動公園の中にある日本庭園の池も
カチガチに凍っていた。
学校から池の氷の上に乗らないように
注意されたが、1度くらいは
氷の上にのっかったような気がする。
高松の池でスケートをしていた頃だから
真冬ならなにが問題だと思うほど
ガッチリと堅く凍っていた。
今は絶対に無理だろう。

冬の運動公園へ遊びに出かけるときは
いつも後ろにプラスチック製の
青いソリをひいていた。
ソリの先端につけた白いビニールのヒモ、
確かピーピーテープと家では呼んでいたのだけど、
そのヒモを長めにソリに結んでおいて、
外に遊びに出かけるときは欠かさず引いていた。
夏は自転車、冬はソリが子供の乗り物だと
子供の僕は堅く信じていた。

一度だけ運動公園の中にあるスタジアムの西側の階段で
ソリ滑りをして遊んだ思い出がある。
スタジアムというのは運動公園の最北端にある
今改修している野球場のことだ。
このスタジアムの階段は、西側にあって観客用の
入り口に設置されているもので今も昔も変わっていない

ソリを引いた小学3年生の僕は、
このスタジアムにさしかかり、
この階段に心を奪われた。
階段の中程にある踊り場が
ジャンプ台となって
ソリのスリルを味わうには
よい場所に見えた。

そう思って僕は迷わず雪の積もって
上りにくい階段をソリを手にかけあがり、
そして滑った。

階段の踊り場は予想通りジャンプ台となって
ソリと僕を勢いよくはじきとばし、
回転しながら氷の地面にたたきつけた。
怪我をした記憶はないが、
僕の大事な青いソリの中程に
パックリと亀裂が入ってしまった。

親は壊れたからと言って易々と
買い換えてはくれないとあきらめていたので、
僕はこの階段の踊り場でソリ滑りをしたことを
とても後悔した。
それから何度もソリの亀裂をガムテープなどで
修理して滑ったが、雪の上を滑らせるとすぐに
テープは端からはがれ亀裂から雪が吹き込み
ソリは鉋のようになって止まるようになった。
だからソリ遊びはあきらめざるを得なくなった。

ソリが壊れた冬の雪が溶ける頃、
僕は父の転勤で幼少期を過ごした
思い出の多い盛岡を後にし、
北海道旭川市へと引っ越した。

それから28年たった今、自分は再び岩手に住んでいる。
毎朝の通勤時に運動公園横を車で通過する度に、
あの階段は、ソリの思い出と共に
僕は少年時代へとフラッシュバックさせられるのだ。

3年前、旭川に帰省した際、割れたソリが
家にまだあって冬に濡れた靴をストーブの前に
乾かすときに活躍していることを知った。
子供の頃の買い換えは無理だろうと
あきらめた事は正解だったと
これで証明されたような気がした。

2011年1月21日金曜日

bitファイルからPicoBlazeの命令用BRAMブロックのみを入れ替える方法

PicoBlazeと共に頒布されているDATA2MEM_assistanceをよく見たら
KCPSM3アセンブラが吐き出すMEMファイルを使って,
BITファイル中のPicoBlazeの命令BRAMブロックのみを
更新する方法が記載されていたので,自分自身も忘れないようここに紹介する.

まず次のフォルダにパスを通しておく.
C:\Xilinx\12.4\ISE_DS\ISE\bin\nt
このフォルダに,PicoBlazeの開発ツールの下記フォルダにある
bp_bmm.exeを上記フォルダにでもコピーしておく.
KCPSM3\DATA2MEM_assistance

ここでPicoBlazeのアセンブリファイルをprogram.psmとし
ISE Navigatorのプロジェクト名がsampleだとすると
次のコマンドを実行する
kcpsm3 program.psm
pb_bmm program.bmm sample.ncd
data2mem -bm program.bmm -bd program.mem -bt sample.bit -o b new_sample.bit

出来上がったnew_sample.bitをFPGAにアップロードすればよい.
data2memを実行途中でPicoBlazeの命令を収めたメモリブロックを選択する
プロンプトが表示される.1つしか無いなら迷わず1を押してリターン.
複数ある場合は,確認する必要がある.

ひとまず,これでPicoBlazeのマシン語を修正したときに
論理合成とインプリメントの時間待たされずにすむので大助かり.
出来上がったBITファイルをJTAGケーブルでダウンロードすれば
新しいプログラムの実行を確認できる.

2011年1月6日木曜日

「風情故に雪を願い,利便の故に雪を嫌う」

正月休みにドカ雪が振り,
盛岡の街中の沿道にも
うず高く雪が積もっている.

雪が降るとめんどくさい作業が増え,
車の運転にも慎重を要し,
渋滞が増えたりして
生活の利便性は良くないのだけど,
雪はやっぱり風情があっていいと思う.

僕が高校生まで育った旭川では,
半年くらい雪と共に暮らしていたからか,
冬の足元に雪がないとしっくりこない.
でも実際にドカ雪が降ると
「やっぱ雪はイイっすネ」と
言いにくくはなるが,
風情故に僕は雪が好きなのだ.

雪は自然が降らせるものだから,
もっと降って欲しいと思ったところで降らないし,
降らないで欲しいと願っても降る.

「また こんなに降った」と,
「もう たくさん」と思っても,
人の思いとは関係なく降り続く雪は,
普段は気づかない人のエゴを炙り出すような気がする.

早く目的地に付きたいと思っても雪の渋滞で動けない.
車を出そうとしても雪にハマって動けない.
雪で滑って歩きにくい.
それらは全て雪のない日常が人にとってありがたい
状態であったかの裏返しだ.
しかし日常において,そのことに感謝する事を知らない.

でも,考えてみると
雪のふる北國に住む人は
心が温かいとか情緒豊かだと
言われることがある.
もしかしたら,それは人の力の及ばないことを,
毎年の雪に思い知らされているからではないか.
降った雪に文句を言ったところでどうにもならない.
雪を前すると諦めて除雪するしかない.

水害や地震に被災した人達が,その経験を堺に
生き方や自然に対する見方が変わるという.

毎年降るこの雪は,静かに僕らに語りかけると思うのだ.
人の及ばぬ力が雪を降らせるから,
僕らもそれを思わずにはいられぬ.

2011年1月3日月曜日

サイデル教授のかっこよさ

あけましておめでとうございます。
今年もどうぞよろしくお願いいたします。

私は正月休み中は 家でゴロ寝をしながら、ひたすらにテレビとネットを眺めて過ごしています。
この二つは時間を無意味にやり過ごすには最高のものだと今回つくづく思いました。
31日は紅白歌合戦を見ずにビートたけしが出演しているアンビリーバブルを見てるうちに眠くなって寝てしまいました。
怪奇現象などのネットビデオを紹介したり心霊写真を解説したりしているうちはまだ興味をもって見ていられたのですが、途中からフジテレビのスタジオに作ったお化け屋敷に芸能人を歩かせて驚く様子をみんなで面白がるという軽薄な内容となってしまたのが残念なところです。
今日は既に3日の夜なので明日の1日を過ごしてしまえば正月休みも終わって仕事始めです。
休み前はいろいろとやってやろうと思ってはいても、終わってしまえばなんともあっけないものですね。
このような堕落した正月を過ごしていると自分がさらに救いようのないダメ人間になっていくような怖さを感じますが、たとえ何かをしていても対して変わらないかとも思うので、そのように気楽に考えて自分を安心させております。

そういえば元旦の夜に、いつもは見ないNHK教育テレビをつけてみたら話題になっているハーバード大学サイデル教授の政治哲学の講義を連続で放送しているのを目にしました。
講義の中身はともかく、サイデル教授のかっこよさが光っておりました。
ズボンのポケットに手を突っ込みながら絶妙の間合いでジョークを飛ばし、重要なポイントを鋭く放つサイデル先生の授業スタイル、アメリカの政治家が選挙中に繰り広げる演説スタイルとダブります。
そして随時、学生に発言させる機会を与え、必ず最後に「君の名前は?」と聞くところが特に印象的です。
もう1つ注目すべきと思うのは、サイデル教授の授業の後、番組の最後で日本の先生が解説を加えているシーンです。
かっこよすぎるサイデル先生が登場してため息がでそうなすばらしい講義を聴いた後に、あの日本の先生のお話を聞くのは、アメリカの教育レベルと日本の教育レベルの差を見せつけられているようで皮肉でしかありません。
サイデル先生と解説している日本の先生の髪の毛は、同じぐらい薄いのだけど、二人を比較するとまるで大人と子供のようなオーラの違いを感じさせられるような気がしてなりません。
聞くところによるとサイデル先生の授業はアメリカの標準的な大学の講義スタイルなのだそうです。
日本の一方的な講義とはずいぶん違うことに驚いてしまいます。
日本の大学は少子化によって学生が少なくなっていくことですし、この際、大学の講義をアメリカのような積極参加型に改め、知識を詰め込むのではなく考える力を身につけさせる事を目指したらいいんじゃないでしょうか。
ゆとり教育が叫ばれたときに小中学生に考える力を身につけさせると言う話がありましたが、むしろ子供の時は知識を詰め込み、大学生ぐらいになってから深く物事を考える力を身につけさせる手順の方が、現実の社会で活躍できる人物を育てることができるのではないかと個人的には思います。

サイデル教授の哲学の講義の中身そのものは,正直なところどうでもいい内容なのですが,どうでもいい内容を楽しく人に伝える技術を学ぶ良い教材だと思いました.
そのうち録音して通勤の車の中で聞きたいと思っています.