Posts

Showing posts from 2008

リストのリスト(2重リスト)の初期化のなぞ

あれれ? 画像処理をPILで書いているのですが、大量のデータを保存するリストを作ろうとして、意外な現象に出会いました。ゆっくり考えれば当たり前なのかもしれませんが、とりあえずメモです >>> x = [[1,2,3]]*3 >>> x [[1, 2, 3], [1, 2, 3], [1, 2, 3]] >>> x[0][1] = 10 >>> x [[1, 10, 3], [1, 10, 3], [1, 10, 3]] 期待してるのはx[0]の2番目だけが入れ替わる事なのですが、[[...]]*nでコピーされるのは参照だけなんですね。そうか、コピーされると考えれば参照なのが当たり前な気もしてきました。

wxptyhonのカスタムイベントにハマる

最近、wxPythonをいじっているのですが、独自のイベント拡張でハマったのでメモ。 wxのデモに入っているPythonEvent.pyを参考に、イベントの作り方を以下と判断。 やりたいのはCUIからGUIへの強制イベントの発行ですが wx.NewEventType()でイベントタイプをつくる wx.PyEventBinder(...)で1のイベントのバインダーを作る wx.PyCommandEventのサブクラスに、イベントに渡したい変数を設定 3のクラスのインスタンスを作り変数をセット イベントハンドラーのProcessEvent(…)に4のイベントを渡す と、ここではたと手が止まる。デモでは5のProcessEventはボタンの.GetEventHandler()とかいう関数でイベントハンドラーが決まるのですが、今作っているのは別スレッドからのイベントのポスト。イベントハンドラーはだれやねん? 試行錯誤の末(というほどでもないが)これはwx.Frameのインスタンスとわかり、やっと動くように。 しかしよく見ると、サブスレッドで命令を実行しても、マウスがGUIを横切るまで変更が実行されてない。 イベントが全くないのでイベントが実行されないのか、再描画されないのが原因かとあたりをつけたのですが、イベントはProcessEventでポストされると即座に実行とマニュアルにはあります。で、wx.FrameにSendSizeEvent()したところ、やっと変更が即座に評価されるようになりました。 結果はこんな関数 def que_event(event_args): evt = MyEvent() evt.set_event_values(event_args) frame.ProcessEvent(evt) frame.SetSizeEvent() ここまでで、半日。道のりは険しい……

あーあせったーー(EeePC 英語キーボードをeeeUbuntuで使う)

今頃eeePc901を買いました。 本当はDellのminiPCにしようかと思っていたのですが、言われているようにキーボード配列が気になりすぎます。いくらキー自体が打ちやすくてもはっきり言って無理! そこでeeePCなのですが、やはりキーボードは英語でしょうというわけで、ヤフオクでキーボードだけゲット。日本語キーボードは一度も押すまでもなく交換し(詳しくはこちら)、Linuxをインストール。 最初はXandrosにしようかと思ったのですが、なんだかネットワークに繋がらない。そこで ライブCDの部屋 さんのeeeUbuntuを使わせてもらうことにしました。 もっと遅いかと思ったのですが、スピードは十分。快適に使っていて半日がたったころ、おや?!バックスラッシュとパイプのキーがうごいていません。 すわ、キーボード取り付けをしくじったか、駄目なキーボードをつかまされたかと焦りまくり。結果から言うと設定→キーボード→レイアウトでレイアウトはUSAになっているのに、キーボードの形式がja-106のままでした。これをACPI Standardに直したら動きました。あーあせった。 ケアレスなことですが、万が一、同じところでハマってる人がいるかもしれないことを考え(そんな人、おらんかな?)ここに書いておきます。

今更iPhone

1ヶ月ほど前からiPhoneを使っています。 Willcomのw-zero3[es](Advancedではない)をずっと使っていましたが、元々、電話嫌いな上、ネット端末としても微妙に使いづらく、殆ど使っていなかったので、解約していました。 ただ、やはり全く電話がないというのも不便ですし、どうしようかなーと思ってたところで、iPhoneの通話料が値下がりしたので、イッチョ買うかと思った次第です。 で、賛否両論も既に言い尽くされている通りで、文字入力はひどいがsafariのネット環境はいい。表面にとっかかりがないので、落としそうではありますが、見た目はカッコイイ。 そこで こんな記事(iPhoneという奇跡) を読みました(やっと本題) iPhone発売直後の記事で、筆者はそうとう盛り上がっており、今ではちょっと意見も変わっているかもしれませんが、その熱い気持ちが伝わってきます。 全面的に賛成とはちょっと言えませんが あらゆる革新的な製品は垂直統合モデルから誕生します。 いかに最後は負ける運命であっても、OASYSが載った富士通や一太郎が載った日本電気のようなモデル、つまりハードウェアからアプリケーションまで一体化された斬新な体験によって、新技術に突破口が開けるのです。 という文章には、ドキリとしました。 確かに今までなかったものを世間に問う場合、製品のあらゆるレベルに工夫を投入して未来を先取りしなければなりません。それが出来るのは垂直統合モデルからだという意見はなかなか斬新です。 確かにAppleは垂直統合でPCを切り開いたし、日本の自動車企業やソニー・松下が世界に通用してきたのも、垂直統合の先進性という強みを発揮してきたからという気がします。(その成功体験が今、足を引っ張り始めている感もありますが……) そしてiPhoneに比べ、Andoroidがひ弱に見えるのも、これが原因かと思い当たります。 しかし、うーーん、それにしてもそんなにすごいのかiPhone。でも確かに、いつでもどこでもネットサーフィンが(比較的)苦にならない小型端末というのは、人間の何かが変わるぐらいインパクトがある気もしないではなくなってきました。 でも、イマイチ、何に使えばいいのか……。 あーそうか、ずっとPCの前にいる日常だから、ありがたみがないのか。 ……あかんやん

Pythonで序数を返す関数

1st. 2nd. 3rd, 4th, 5th ....と序数を表示する必要があったのですが、pythonなら  def order_n(i): return {1:"1st", 2:"2nd", 3:"3rd"}.get(i) or "%dth"%i の一行で書けますね。辞書型のgetメソッドは、辞書にない時Noneを返すので、そのときは"%dth"を返せばいいわけです。こういうのを一行でさっと書けるので、pythonは癖になります。

GoogleToolBarの検索ボックスへのショートカット

Firefox 3でCtrl-Gでグーグルツールバー内の検索ボックスにカーソルが飛ぶことに今、気づきました。(OSX 10.5) あったら便利だと思ってたらやっぱりあるのね。

Pythonでのワンライナー

バグがないプログラムを作るコツは、なんといっても書かないことです。 書かなければバグらないわけですから、当たり前と言えば当たり前ですが…… だとすると、たとえ一行じゃなくてもワンライナー的な書き方は有効でしょう。 その点、Pythonのリスト内包はあまり美しい文法ではないものの慣れると手放せません。 Noneが値として入っているようなリストを集計する場合、 sum([x or 0 for x in list])で一発です。 Noneが入っている文字列の集合を作るなら "".join([str or "" for str in list])でリスト内の文字列が繋がって出てきます。 Noneかどうかより複雑なフィルターを使いたい場合は、bool値を返す関数filterを作って def filter(): ... sum([x for x in list if filter(x)]) でいけるので、ラクチンです。 うーん、すばらしい。Pythonで無名関数がもっと簡単に作れたら言うことないんですが。(関数内関数が使えるので、それほど問題でもないですけど)

ものづくり革命

MITビットアンドアトムズセンター所長のニールガーシェンフェルドが書いた『ものづくり革命』という本を読みました。 コンピューターが大型汎用機からパーソナルコンピューティングに移ってきたように、ものづくりも工場から個人工場(パーソナルファブリケーション)に移ってくるだろう、という未来を書いた本で、すでにMITやマスマーケティングがアテにならない世界の地方では、現実になっていることを事例を挙げて紹介しています。 自分は堺屋太一の『知価革命』史観(大量生産→大量消費時代は石油文明とともに限界が来ており、現代版暗黒時代といえる社会主観・多様化の時代がくる)を支持しているので、この本は非常におもしろかったです。 NC(Numerical Control:数値制御)のレーザーカッターやミニ旋盤とかが、一家に一台ある時代になったらさぞ楽しいことでしょう。自分の道具や子供のおもちゃは自分で作るという、まさにMakerの時代です。

呼び出し元(Caller)の場所(行数)を特定したい

Pythonでprintデバッグをしていますが、すぐにどこに仕掛けたprintなのか忘れてしまう。 そこでDbgOutという関数を作ってみました。 def DbgPrint(obj, msg): print "(dbg)%s >"msg + str(obj) 折角なので、沢山これを付けたときにどの行から呼び出されたDbgPrintなのか分かると、いい感じそうです。javascriptならこんなのがあった気がするんだけどと思ったらやはりPythonにもありました。sys._getfram関数がソレです。 これでとれるframeオブジェクトのf_lineoに行番号が入っています。 つまり def DbgPrint(obj,msg): print "(dbg L%d)%s >"%(msg, sys._getframe(1).f_lineo) + str(obj) となります。 なかなか便利ですよ。