2005-11-30

島宗理 / パフォーマンス・マネジメント



行動することで、何か良いことが起こったり、悪いことが無くなったりすると、その行動は繰り返される。[p.7]


強化学習を利用して、自分や他人の行動を管理することを提案しています。シゴタノで何度か紹介されていました。



できて当たり前のことができないなら、教えるしかない。[p.111]


こういう積極的なあきらめが重要だと思います。文句を言っている暇があったら、問題解決に集中しないと。



この手の管理でいつも気になることは、数値目標などを設定すると、その数値達成「のみ」に最適化してしまうことです。少なくとも私はそうです。問い合わせを受けてから答えるまでの時間を最小化しようとすると、その背後にある顧客満足を忘れてしまいがちです。早く解決したからいいじゃん的思考に支配されがちです。



万能の解決策は未だに思い浮かびません。いまのところ、最適化行動が適切であるための前提条件を、定期的に見直すことであろうと思っています。



2005-11-28

H8 を使って、LED を点灯/消灯させる

秋月電子の AKI-H8/3048F開発ボードと、Vector で公開されているデバッグモニタを使ってプログラミングしています。



通常は、LED1 が点灯、LED2が消灯していて、スイッチ1 (S1) を押している間だけ、LED1が消灯、LED2が点灯するというプログラムを作りました。



.SECTION PROGRAM,CODE,LOCATE=H'FF030 の FF030 というのは、デバッグモニタのヘルプで表示される User Vector アドレスです。User Vector というのは、おそらく、たぶん、ユーザプログラムの開始アドレスであろうと憶測しています。最初、このアドレス指定が間違っていて、LED が点きっぱなしという現象に悩まされました。




.CPU 300HA
;

2005-11-27

G. M. ワインバーグ / スーパーエンジニアへの道



自分の技術的優位性を証明するために、つまらない技術論争に陥ってはいけない。[p.250]


「FTP よりも TCP/IP のほうがフレキシブルですよ」というような雑談を聞いても、その文脈でフレキシブルとはどういう意味なのだ、などと問い正してないで、もっと大事なことに時間を割きましょう、と。



2005-11-24

普通の奴らの、もっと下を行ってみようかなとか思ってみたり

秋葉原の秋月電子通商で AKI-H8/3048 開発キットを買いました。H8 マイコンの開発ハードウェアとソフトウェアのセットです。はんだごてやニッパーも買いました。はんだづけには 3 時間ほどかかりました。PC と H8 のボードとはシリアルケーブルで接続します。 手持ちの USB/シリアル変換ケーブルは、実は USB/PDA専用の変換ケーブルであることが発覚しました。



H8 には A/D コンバータと D/A コンバータが内蔵されています。また、資料が揃いそうです。「マイコン技術教科書 H8編」という本を購入しました。シリアルケーブルがないので、この本を読むことにします。





追記:USB/シリアル変換アダプタは、ドライバをインストールし直したら使えるようになりました。しかしプログラムを転送できません。AKI-H8 の開発ボードには DSUB 9-pin と 25-pin のふたつのコネクタが付いていますが、素人は 25-pin のほうを使うべきらしい。



2005-11-22

PyVISA - COM ポートをオープンする

PyVISA で COM2 ポートを開くには、Instrument クラスの第1引数にリソース名を指定して、インスタンス化します。



itc4 = Instrument("COM2", term_chars = "\r", timeout = 5)


インスタンス化っぽいものの中身は以下のとおりです。細かいところは省略しまくりです。



class Instrument(ResourceTemplate):
# ...
def __init__(self, resource_name, **keyw):
# ...
# スーパークラスのコンストラクタを呼びます。
ResourceTemplate.__init__(self, resource_name,
**_filter_keyword_arguments(keyw, ("timeout",
"lock")))

class ResourceTemplate(object):

# ...

def __init__(self, resource_name=None, **keyw):

# ...

if self.__class__ is ResourceTemplate:

# ResourceTemplate は継承して使いたいので、

# 直接インスタンス化しようとしたら例外を投げます。

raise TypeError, "trying to instantiate an abstract class"

if resource_name is not None: # is none for the resource manager

# ...

# ここでローレベルモジュール vpp43 の open 関数を呼び出します

# vpp43 の中で、ドライバに直接アクセスします。

# Instrument クラスは、Python で呼び出しやすくするためのラッパーです。

self.vi = vpp43.open(resource_manager.session, resource_name,

keyw.get("lock", VI_NO_LOCK))

# ...



NI-VISA ライブラリは、通信ポートや GPIB 機器など物理的な通信先をリソース名で区別します。いったん、接続やセッションを開いてからは NI-VISA 内部ではハンドラのような ID で区別します。ResrouceTemplate は、この ID を隠してくれます。オブジェクト指向言語でラップするときは、セッションをオブジェクトのプロパティにしてしまうようです。ふーん。



vpp43.py の open メソッドは以下のとおり。




# vpp43.py
def open(session, resource_name, access_mode = VI_NO_LOCK, open_timeout =
VI_TMO_IMMEDIATE):
vi = ViSession()
visa_library().viOpen(session, resource_name, access_mode, open_timeout,
byref(vi))
return vi.value


byref() は ctypes でポインタ渡しするとき関数です。visa_library() は visa32.dll のアクセスポイントのようなものを返します。viOpen() は visa32.dll に含まれる関数です。



結果的に Instrument オブジェクトをインスタンス化したときに、visa32.dll で COM2 への接続を確立することになります。



2005-11-19

Phillip McGraw / "Life Strategies"



こういう本を読んだことを書くのは、いつにも増してこっぱずかしいのですが、非常に感銘を受けたので紹介します。自分の人生は、自分で責任を持て、と。



You must learn that you do not have to be angry just because you have the right to be. [p.203]


気が短いので、つい怒ってしまいます。怒鳴ったりしなくても、いやーな気分になります。ですが「怒る」という選択をしているのは自分なのだ、というのが、著者の主張です。それにしても英語の本を読むのは非常に時間がかかりますね。



2005-11-18

PyVISA - VisaLibraryクラスの __call__

NI-VISA ライブラリにアクセスするときは、visa_library が唯一のグローバルなアクセスポイントです。関数呼び出しは「visa_library().hogehoge()」という風に書きます。




# シングルトンのクラス
class VisaLibrary(Singleton):
def init(self):
self.__lib = self.__cdecl_lib = None
def __call__(self, force_cdecl = False):
# インスタンスを呼び出したときに、実行されるメソッド
# このメソッドは、ctypes でロードしたライブラリのオブジェクトを返す。
# ライブラリがロードされていなければ、load_library() メソッドを実行。
if self.__lib is None or self.__cdecl_lib is None:
self.load_library()
# 強制的に C 規約のライブラリを使用する場合と、
# 何も指定しない場合で返すオブジェクトが異なる
if force_cdecl:
return self.__cdecl_lib
return self.__lib
def load_library(self, path = None):
# Windows NT 系の場合
if os.name == 'nt':
# path が指定されれば、そのファイルをロード
if path:
self.__lib = windll.LoadLibrary(path)
self.__cdecl_lib = cdll.LoadLibrary(path)
# path が指定されていなければ、"visa32" ライブラリをロード
else:
self.__lib = windll.visa32
self.__cdecl_lib = cdll.visa32
# 以下 posix の場合と、エラーの場合が続く
# ...
#...
visa_library = VisaLibrary()


これで visa_library().hogehoge() と書くと、visa_library.__lib.hogehoge() を呼び出すことになります。__lib には cytpes でロードした DLL へのアクセスポイントが代入されています。



なぜこうするのか、よく分かりません。別の部分では self.__lib.hogehoge と書いて引数を設定していますし。VisaLibrary.__getattr__() を使ってはいけないのでしょうか。



2005-11-17

PyVISA のシングルトン


__all__ = ["visa_library", "get_status"] + visa_functions
# ↑ __all__ には、このモジュールがインポートされたときに、インポートした側
# が参照できる名前のリストが入ります。
# foo.py に、__all__ = ["hoge", "moge"] と書いておくと、
# from foo import *
# を実行するときに、hoge と moge の名前がインポートされます。
# (マニュアルの 6.4.1 章)
# __all__ を定義しなければ、すべてのパブリックな名前がインポートされます。

# Add all symbols from #visa_exceptions# and #vpp43_constants# to the list of

# exported symbols

import visa_exceptions, vpp43_constants

__all__.extend([name for name in vpp43_constants.__dict__.keys() +

visa_exceptions.__dict__.keys() if name[0] != '_'])

# __dict__ は、オブジェクトの属性が、辞書で格納されています。

# __dict__.keys() で、そのオブジェクトのプロパティやメソッド名が入っている。



# load VISA library



class Singleton(object):

"""Base class for singleton classes.



Taken from <http://www.python.org/2.2.3/descrintro.html>. I added the

definition of __init__.



"""

def __new__(cls, *args, **kwds):

it = cls.__dict__.get("__it__")

if it is not None:

return it

cls.__it__ = it = object.__new__(cls)

it.init(*args, **kwds)

return it

def init(self, *args, **kwds):

pass

def __init__(self, *args, **kwds):

pass



vpp43.py では __new__ メソッドを使って、シングルトンを実装しています。__new__ はクラスをインスタンス化するときに呼び出され、この戻り値がインスタンスになります。下の例では、Bar クラスをインスタンス化しても、__new__ メソッドの戻り値である Foo クラスのインスタンスが生成されます。




>>> class Foo(object):
... def hello(self): print "hello"
...
>>> class Bar(object):
... def __new__(cls): return Foo()
...
>>> x = Bar()
>>> x
<__main__.Foo object at 0x00B31FD0>
>>> x.hello()
hello


2005-11-16

PyVISA

久しぶりにコードを読むことにします。ctypes を使ったラッパー API に興味があるので、PyVISA を標的にします。飽きたら辞めます。



VISA というのは、Virtual Instrument Software Architecture の略で、シリアル、USB、GPIB などを抽象化した、仮想インターフェースの API です。NI-VISA という DLL 実装があって、これの Python 用 API を提供しているのが PyVISA です。



DLL を呼び出す、低レベルモジュールが vpp43.py です。



# Windows NT の場合には、WINFUNCTYPE を FUNCTYPE という名前でインポート
# それ以外の場合には、CFUNCTYPE を FUNCTYPE という名前でインポート
# プラットフォームごとに異なるオブジェクトに、共通の名前を割り当て、
# プラットフォームの違いを吸収する。
if os.name == 'nt':
from ctypes import windll, WINFUNCTYPE as FUNCTYPE
else:
from ctypes import CFUNCTYPE as FUNCTYPE


初日から、たった1文ですが、無理せず続けることが重要ってことで。



2005-11-07

Pen Station Museum & Cafe

銀座から、JR 東京駅のほうに歩いていたら、Pen Station というオサレな内装の店らしきものを発見。



ペン・ステーション」は、ペンとステーショナリーのパイロットが蒐集した国内外の貴重な資料を展示する国内随一の筆記具ミュージアムです。


急いでいたので、素通りしたのですが、ふむふむです。万年筆なんか一本たりとも持っていませんが。



2005-11-03

ウィンドウ切り替えツール Entbloess

Entbloess 2 (via 百式) という、ウィンドウ切り替えツールがあるそうです。Mac OS X 10.3 以降についてくる Expose みたいに、ウィンドウを縮小して全部見えるようにしてくれます。けっこう軽いです。



同じようなソフトで WinPLOSION というのがありますが、こちらは McAfee VirusScan にトロイの木馬扱いされるという難点があります。ちょっと重いし。



それとは別に Deskloops というのも試してみましたが、これは、勝手にウィンドウの位置をアレンジしてしまうのが難点です。LabVIEW でヘルプが開くと、ウィンドウがずりずりっとずれてしまって、ヘルプウィンドウが真ん中に割り込みます。これは、ちと、うざい。



2005-11-01

vnc2swf

vnc2swf が、いつの間にやら Python で実装されていて、マルチプラットフォームで動作する。これは便利。デスクトップを連続的にキャプチャして、flash ファイルに変換するソフトウェアです。音を追加するツールもついてきます。すげー。1024x748 ピクセルのプレゼンなら、全画面でもいける感じでした。研修用のプレゼンをこれで録画して、外回りの営業さんたちに後で見てもらう、とかに使えそう。