wxpythonでウィンドウフレームにアイコンを設定する

CustomIcons - py2exe.orgを参考に

wxpython利用時、もちろんGUIが合って、ウィンドウ(フレーム)がありそこにアイコンがあるものですが、そこはどうやって設定するかということです。

py2exeでアプリケーションのアイコンを設定するときには

setup(
  windows = [
    {
      "script": "with_gui.py",
      "icon_resources": [(1, "myicon.ico")]
    }
  ],
)

となります。が、wxpythonとの関係性は無くて、wx側で独自に設定する必要が有るとか。

CustomIcons - py2exe.org
ここの最後にサンプルがあります。
サンプルでは、py2exeで作成したexeファイルから、アイコン情報を取得してそれをセットしているようです。これだとpy2exeのsetup.pyを変更するだけで自動的にフレームのアイコンも変わってくれそうですね。


単純にこんなことをやればいいと言うことで。
wx.FrameにSetIcon()が有るので、wx.Iconで処理したアイコンをセットするというイメージでしょうか。
タスクトレイのアイコンは、wx.TaskBarIcon()があって、これにもSetIcon()が有ります。この例しか無くて探すのに苦労しました・・・
(リファレンスを見てもいまいちわからないんだよなあ・・・)

class MyApp(wx.App):
	def OnInit(self):

		self.Frm = wx.Frame(None, -1, u"test frame", size=(600, 400))
		icon = wx.Icon('myicons.ico', wx.BITMAP_TYPE_ICO)
		self.Frm.SetIcon(icon)

		self.Frm.Show()

しかし、上のpy2exeコミュニティの回答はすばらしいなあ。実行ファイル内部から自分の実行ファイルのアイコンを拾ってそれを適応させる。
setup.pyだけ書き換えれば対処できるし。面倒な作業も減りますね。いやはや。

追記

wxPython Custom Icon - Python Code Snippet
こちらだと、予備としてbase64エンコードしたアイコンを埋め込んでいるようです。こんなやり方もあるんだなという補足として。

新年あけましたおめでとうございます

今年もよろしくお願いします.
去年はいろいろあって(いろいろ代償もついて)自由な時間ができたなーと思ってたら全然そうでもなかったのですが,まぁ好きなことをさせてもらっています.
今年はなんかWEBで公開できるサービスを作りたいです.ので言語の勉強はもとより,サービスをどう作るを考えたり,開発のやり方とか,コードを書く上で面倒なことを楽にするような事柄を考えていきたいです.


昨年12月から実家の事務所で使うツールを作っています.diveintopythonの5,6章を見ていて何となく思いついたので,せっかく得た知識を実践で使えるいい機会でしたので.
一応動くものはできて,今は機能追加や,やっぱりスパゲッティになっていくコードの整理をしています.そろそろ初期のコードをベースにするのは厳しいかなと思ってきて悩むところも.
(そのうちに作ったものを紹介したいのですが,たいしたことをやっているわけではない+需要がうちの事務所しかないっぽいのであまり意味は無いのかもしれませんが.)


diveintopythonの読書も暇を見てしていきたい.
メモは今のところ自分対象の内容ばかりですが,アウトプットの一環なので,自分の言葉で整理し直していきたいです.
(邦訳しか見ていないので,やっぱり見る意味は無いのですが)
終わったら何やろうかはまだ考えていませんが,Djangoをさわり直してみるとかが一番やりやすそう? 別のWEBフレームワークを触ってみてもいいかもしれませんが.


それと
自分だけでコードを書くというのは,自分の妥協やら思想も直接反映してしまいます.アウトプットしてみても悪くはないですが,やはりほかの方のコードも見ていきたいところ
Pythonを勉強しているので,Pythonオープンソースプロジェクトのコードを読んでいきたいです.コードの書き方ももちろん,アプリケーション作成のプロセスも見てみたい.自分と比較してみたいです.
何か手頃なもの(自分のレベルで読めそうなもの)を探そうかと考えてみましたが,かなわなかったら著名なプロジェクトを片っ端から見ていきます.たくさんありますし,これは無理だわはパスして,ちょっと悩んでいたら読んでいこうと思います.(悩んでる時は興味を持っているから,多分)


ともあれ,今年はやりたいと思っていることの実現に注力していきたいと思います.
というか外で仕事しろよ的なプレッシャーも有りますが,その辺は・・・何か行動を示さないと行けませんね!

ファイルのフルパスをパスとファイル名と拡張子を分ける時に格納する変数名の規則決め

ファイルを扱うプログラムを作るときに,ファイルのフルパスからいろいろ分割して変数に格納することはしょっちゅう.変数名を決めておかないととたんにわからなくなるのでちょっと悩んで決めておいた.
自分で思いついたものをつけつつ,参考にいろいろ見てたら結局diveintopythonのまとめになってた.

ファイルのフルパス:filepath
ファイルのパス:dirname
ファイル名(拡張子とセット):filename
ファイルの名前:shoutname
拡張子:fileext

リストなどの複数系なら複数系の変数名にすればいい.(filenames
最初,フルパスをfilefullpathにしてみたけどわかりやすいけど長いからやめた.絶対パスとか相対パスも英訳で問題ないだろうか.
これが一般的によく使われるものなのかは知らない.

diveintopython 5章読書メモ

読書メモで,本家なんかに書いてあるコードは書かずに,試したものとかを書いておく.本家コードは必要以外リンクとして残すし残さないこともある.面倒がりな人間.
ぶっちゃけただの脳内メモなので,何となく見ている人に向けて書いてあるにしては,人のためにはならんはず.

5章始まる

オブジェクト指向ということで,なまじわかってたつもりでしたが.理解し切れていない部分があると何か読みにくかったんだよなあ.
今回のお題は,フォルダの中にあるmp3ファイルのID3v1.1タグの内容を出力するプログラム.結構実用的.ID3v2.*に対応できたらもっとおもしろそう.(実はもっと汎用的で,ほかのファイルフォーマットのメタデータの配置位置を定義できれば何でも対応できるらしい,6章で実態がわかります.)
ちなみにこのプログラム自体の解説としては6章に続くらしいです.

from module importを使ったモジュールのインポート

5.2. Importing Modules Using from module import
import moduleはモジュール自体をインポートしてその下にある属性をドットで使うというもの.
from module importをすると,ほしい属性だけインポートできる.その際にモジュール名.属性 とかやらなくていい.属性の名前の指定で動く.
詳しくはNoteを参考に
(あとでやるかもしれないけど,asも使えて別名で使うこともできる.たくさんドットで区切ったような複雑なパッケージにはこれが有効)
Pythonのモジュールインポートのしくみ
import moduleとの使い分けとしては,頻繁に使って名前が混同しない場合はfrom〜でいいし,名前が混同しそうならimport moduleでモジュール名で分けてもよい.
これもスタイルの問題なので,コードを見てたら両方のやり方を見るだろうとのこと.

クラスの話し

5.3. Defining Classes
classで定義する.引数も使える.引数なしもできる.doc stringは利用すべき.

class testclass:
"""this class is hogehoge"""
  pass

継承したりもできる.継承元を引数に入れておく

from UserDictimport UserDict
sclass FileInfo (UserDict):

たとえばこれはUserDictというクラスを継承した.このクラスは継承したものがあたかも辞書っぽく使えるようになるクラス.


初期化は,def __init__で定義.init(イニト)はイニシャライズで初期化です.特別なメソッドの位置だったと思う.
コンストラクタ(構築子,インスタンスが作成された時に初期化するときに使うメソッド)のように動くが,そのように定義しただけで,初期化する前にインスタンスは作成されてるからコンストラクタとはいえない.けどそんな風に動く.

えーと間違えてるかもしれないけど,クラス定義にしている引数は継承に使っているので,クラス自体の引数指定は__init__を使う.コンストラクタはそういうものらしい.
以下を参照

もちろん、より大きな柔軟性を持たせるために、__init__() メソッドに複数の引数をもたせることができます。 その場合、クラスのインスタンス生成操作に渡された引数は __init__() に渡されます。例えば以下のように:

>>> class Complex:
... def __init__(self, realpart, imagpart):
... self.r = realpart
... self.i = imagpart
...
>>> x = Complex(3.0, -4.5)
>>> x.r, x.i
(3.0, -4.5)

class FileInfo(UserDict):
"store file metadata"
def __init__(self, filename=None):
UserDict.__init__(self) 1
self["name" ] = filename 2 3


Fileinfoクラスでは,コメント通りにファイルのメタデータを貯めることらしい.
最初の__init__でUserDictの__init__を呼び出してる.
この際の引数self(というか__init__のselfのこと)はクラスから作ったインスタンスのことをいってる.クラス自身ではない.
Pythonではインスタンス内でインスタンス内のメソッド,属性(それをデータ属性と言われる)を使うときにはselfを指定する必要がある.というのも,クラスが呼び出される時と,実際にインスタンスを使っているときとは挙動は違うらしい.
これ以上はクラスに詳しくないので説明できなかった.後でクラスとしての参照とインスタントしての参照の話しがあるっぽいので何となくわかるけど,その二つの参照を分けるときにこの仕組みを使っているらしい.らしい?


ここの方のエントリーで紹介されている通り,Rubyの説明がしっくりきている.
Pythonのクラスのselfの意味 - 牌語備忘録
現在の自分自身の参照という意味を込めてself.


戻って1のこと.UserDict.__init__は継承したUserDictの__init__を呼び出してる.5.3.2でいってるけど明示的に呼び出す必要が有るらしい.Pythonの仕様らしい.
2でUserDictがどのように動くを表したといってるけど,辞書っぽくnameキーにfilenameが入ってる.辞書っぽい振る舞いなのであーそうなのか程度.
3の説明として,__init__は返値は返さない.返す必要も無いのかもしれない?と感想を持った.


5.4. Instantiating Classes
インスタンスを作ると,__class__という属性でクラスのメタデータ?クラスの情報ととらえてる.
__doc__はdoc string.あるクラスから作ったインスタンスが複数有っても,そのdoc strringは同じものを共有するようになってる.


ガベージコレクションGC

5.4.1. ガベージコレクション
Pythonはそれに優れているらしい.
ガベージコレクションとはプログラムが動的にメモリを確保してくれる機能.使わなくなった領域(今回だとオブジェクト(インスタンス内)に割り当てた領域)が有ると自動的にメモリを解放してくれる.解放というか使わないとわかったら破棄して使えるようにする.
実際に例でメモリリークを試みてる.
ある関数で変数にインスタンスを代入してる.その関数内のローカル変数で,fはそのまま残されてる.
次の100回実行されると,そのインスタンスが残るんじゃないかと言われている.が結果は残らない.


なんだかデフォルトなのでありがたみが感じられないような雰囲気.あまりほかの言語の経験も無いのもあって.
Pythonのドキュメントにある1.10 参照カウント法にて,Cだmallocとかfreeでやることが,Pythonでは自動的に見てくれてる.考える必要がある程度減るのは助かることだろう.

辞書っぽいUserDictクラス

5.5. Exploring UserDict: A Wrapper Class
5.5からUsreDictの説明がある.ラッパークラスということで,辞書っぽく見せてるというのはこういう仕組みだと言うことが書かれてる.
diveintopythonの日本語訳だと読んでても頭に入ってこなかった気がして,diveintopythonの超訳版を書かれているid:hamatzさんのDive Into Python (4日目) - 暗号、数学、時々プログラミングを見させてもらった.感謝.


ここでの説明はラッパークラスの紹介が基本で,その実現に特殊メソッドがあるとのことだと思う.
(その前に辞書で行うcopy()とかclear()の)通常メソッドの説明もされてる.copyを実現する時の注意点,クラスとメソッドの参照の違いなどがあるので注意とか.
特殊メソッドは特定の状況や特定の構文が呼ばれると実行されるメソッド.
UserDictなら,test["no1"]の中身を得るような構文をあたかも簡単に実現しているのには,その構文は__getitem__を呼び出し書かれている処理をしているから.

def __getitem__ (self, key):
return self.data[key]

>>>f = fileinfo.FileInfo("/music/_singles/kairo.mp3")
>>>f
{'name':'/music/_singles/kairo.mp3'}
>>>f.__getitem__("name") 1
'/music/_singles/kairo.mp3'
>>>f["name"] 2
'/music/_singles/kairo.mp3'

特殊メソッドを使うと,そのメソッドが実現する構文を簡単(?)に定義して利用することができる.いろいろあるから後で見るのも良さそう.
そもそも,python2.2以降は,組み込みデータ型の辞書である,dictを直接継承できるらしい.どちらを使うかはスタイルの問題なのかその辺は定かではないけど.
ただ単純にこうラッパーなクラスを作って実現している実例だしとてもおもしろい.

特別なクラスメソッド

5.6. Special Class Methods
では実際に今回のお題ではどう扱っているか.

def __setitem__ (self, key, item):1
if key =="name" and item:2
self.__parse(item)3
FileInfo.__setitem__(self, key, item)4

コード内の__setitem__は先祖のメソッド(UserDict.__setitem__)をオーバーライド(上書き)していて,そこに仕掛けを埋め込んでる.
keyが"name"だった場合とitemがある場合(andなので両方ともでTrueなら)インスタンス内の__parseを実行して,親メソッドのFileinfoの__setitem__を実行する.
このときの4は,FileInfo内では何もされてないのでさらに親のUserDictへ探しに行って呼び出してる.


それで,これが実際に動くとどうなるかが,Example 5.15に書かれている.
fileinfoのインスタンス作成時にfilenameが"name"キーの辞書っぽくなり,さらに値が追加されているので__parseが動いて結果が出てくる.結果はタグの内容が辞書にされているようだ.

高度な特殊クラスメソッド

5.7. Advanced Special Class Methods
次の項目はさらに特殊なメソッドの紹介がある.UserDictの中身をさらに見ているけど,辞書を文字列にしたり,インスタンスの比較,オブジェクトの長さ,辞書のアイテムの削除等.
ラッパークラス内での特殊メソッドの紹介だったけど,特殊メソッド自体はどのクラスでも使えるらしい.比較したときには何を比較させればいいのか,長さを見たときはどの長さを見ればいいのかとか.
そのほかにも特殊にカバーされたメソッドを定義することはできるそうで,後々に紹介されるとのこと.

データ属性,クラス属性

5.8. Introducing Class Attributes
データ属性とは,インスタンス内の属性の意味だった.クラス属性はクラスに内蔵された属性のこと.
同じものをインスタンス内で何度定義するなら最初から入れておくのもよい.フォーマットの解析に必要な値とか.
Example 5.17で,ID3v1.0のmp3タグのデータマップを表してる.たぶんmp3ファイルの頭にあるヘッダデータみたいなものを読むときに使う数字群だろう(と予測してる.まだ6章見てない・・・)


クラス属性をインスタンス側で変更すると,クラス自体の値も変わってる.同じクラスを継承したインスタンス側も共有される.
さしずめ定数ともいえるけど変更は可能.Pythonのお約束?

プライベート関数

プライベート要素の概念が言われている.引用すると,

多くの言語のように Python はプライベート要素の概念があります。

* プライベート関数は、そのモジュールの外からコールすることができません。
* プライベートメソッドは、そのクラスのの外からコールすることができません
* プライベート属性は、そのクラスの外からアクセスすることができません

多くの言語とは違って、 Python の関数、メソッド、属性がプライベートかパブリックのどちらであるかは、名前によって完全に分けられます。

とのこと.
さきほどのMP3FileInfoで,__parseが出てきたが,これがプライベートの意味.アンダーバー二つで始めるとそう定義できる.
ただ,特殊メソッドはアンダーバー2つで始まり2つで終わる.慣例らしいので,従わなくてもいいけど混乱するだろうからやめた方がよいとの.

Example 5.19では,メソッドのコールを試みてるが失敗してる.とはいえできない訳ではないが行わない方がよいとの.
ところで__parseをプライベートにする理由はなんだろうと.不用意に呼ばせないためとか?

以上終わり

次は6章.コードの続きを解説.

DisplayPortとデュアルリンクDVIを学ぶ

【PC Watch】 玄人志向、実売1,900円のDisplayPort→HDMI変換アダプタ
これを見ていて,自分の環境には関係ないけどやすいなーと思うのと同時に,DisplayPortは実家の事務所WSに入ってるQuadro FX 4800なんかについてたな(後DVIの変換ポートを使っていたな)を思い出してスペックを眺めていると.

1系統のデュアルリンクDVIデジタル出力

はて,デュアルリンク? 前に何度か見たけどその都度調べ忘れて放置だったし,せっかくだから確認するかと検索してみました.

DVIにはシングルリンクDVIとデュアルリンクDVIがある

DVIはご存じの通り,デジタル送信がスタンダードになり始めた頃のディスプレイインターフェイスの規格です.
Digital Visual Interface - Wikipedia
DVIにはシングルリンクとデュアルリンクという方式があるそうです.デュアルリンクで検索してたらシングルリンクがあることも思い出して,両者の違いは?に至ったのですが.

Single-Link DVI-I と Dual-Link DVI-I の違い - 教えて!goo

ここを見ると,シングルだと1本分の伝送路があってデュアルだと文字通り二本分の伝送路で解像度を上げていると書いてあります.
リンクしてあったe-wordsの説明もちんぷんかんぷんで,そもそも2本もディスプレイつないでないじゃんとそれはまあ短絡的な疑問がわいていたところ,上記のWikipediaのコネクタ画像でわかりました.あのコネクタのピンは2本分の伝送路が確保できてる,というか拡張できる仕様なのかとイメージしています.なるほど,2本のデータリンクを確保して,解像度を上げようとしていたという意味で.納得.



後発のDisplayPortはDVIの大型化が困ると言うことで小型化して,伝送できる幅もだいぶ増えて大型解像度にも対応できているというものらしいです.DVIとの変換も可能ということ.ビジネス用途がメインらしく,Quadoroシリーズにつくのも納得.
DisplayPort - Wikipedia
DisplayPortも何となくわかってきたし,デュアルリンクDVIもわかった.いい勉強でした.

diveintopython 4章読書メモ

最近になって読書を再開.
やっぱり考えたことなんかをアウトプットしないと効率よくないなあと感じつつ,読書した時のメモとして.
本家なんかに書いてあるコードは書かずに,試したものとかを書いておく.本家コードはリンクとして残す.
ぶっちゃけただのメモなので,人のためにはならんはず.

4章始まる

Chapter 4. イントロスペクションの力

  • 関数の使い方から組み込み関数の紹介
  • マップしながらフィルタリングするリスト
  • 三項演算子を作るトリック
  • ラムダ関数のトリック

が出てくる.
このトリックがおもしろい.この章からすげーなーと思える要素がたくさん.(それだけ知らないことだらけ)
(文字列整形はCでやったにしろ,すっかり忘れててスゲーさせていただきました.いやリストのマッピングもよくわからなかったのでそれも新鮮)

関数の使い方

引数の定義にはオプションが使える(デフォルト値

def info(object, spacing=10, collapse=1):

引数を使うときは,オプションで使った名前を指定できる(名前付き引数

info(odbchelper, collapse=0)
info(spacing=15, object=odbchelper)

名前の師弟をすると引数の並びは関係ないらしい.
そういう意味なのか,引数は単純に辞書らしい.
あーそうか,だったらキーを対応させた辞書を投げたら動くのかなと思ってやってみたけど辞書は一つの引数として対応された.

def testprint1(num=00,title="nontitle",text="haloo python world"):
  print("[%d] %s : %s" % (num,title,text))

In [14]: testprint1()
[0] nontitle : haloo python world

In [15]: testprint1(1,"title1","HELLO PYTHON!")
[1] title1 : HELLO PYTHON!

In [18]: t_dict={"num":101,"title":"101titlt","text":"101text"}

In [19]: t_dict 
Out[19]: {'num': 101, 'text': '101text', 'title': '101titlt'}

In [20]: testprint1(t_dict)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)

/home/hiroshi/<ipython console> in <module>()

/home/hiroshi/<ipython console> in testprint1(num, title, text)

TypeError: %d format: a number is required, not dict

当たり前と言えば当たり前か.
(引数はリスト,タプル,どんなデータ型,もちろん辞書も一つの引数として使う)

組み込み関数

組み込み関数の例としては,(今回使うものとして)type,str,dir,callable関数を紹介


type関数は対象がどんなデータ型なのかを調べる.どんな引数でもいい
typeの結果を使ってデータ型の一致を調べることに使ったりする.
typesモジュールには型の一覧が入ってるらしいのでこれも使える.
4.3.1. type 関数


str関数は対象を文字列として書き出す.
何でも文字列にする.何も無ければNoneだし,モジュールだとどこに存在するかのパスも出てくる
4.3.2. str 関数


dir関数はオブジェクトの属性とメソッドをリストに返してくれる.オブジェクトというだけあって何でもみれる
そのオブジェクトで何があって何ができるのかを調べるときに便利っぽい,もちろんリストが返るので書き出したりもできる


callable関数はあらゆるオブジェクトを引数にとれて,そのオブジェクトがコールされるとTrue,コールされない場合はFalseを返す.
対象がコール(call)可能(able)かを調べることに使える.
コールというのは,呼び出しということで,関数,メソッド,クラスを使えるか訪ねて使えたら使うこと.
コール - 意味・説明・解説 : ASCII.jpデジタル用語辞典
真偽が返ってくるということは,存在するかしないかの判定に使える.


これらの組み込み関数は__buildin__モジュールとしてグループに分けられている.グループというぐらいだから仮想的に分けているだけかな?


getattr関数は実行するまであるかわからない関数名なんかを試したいときに使う.わからない関数名を投げて使えるか使えないか試せる.
と書いてあるけど,実際には複数の不確定な関数名を一つの呼び出し関数で実行したいときに使うらしい.ディスパッチャってやつ.
4.4. getattr を使用してオブジェクトのリファレンスを取得する
例ではテキスト形式がいくつかあって,それを実行させる関数が一つの時に関数名だけを入れ替えて実行できればきれいだよね的な.
getattr関数は,実行できない関数名があるときは例外を出す.例外処理でもいいのかもしれないけど,(テキスト通りw)幸運にもオプションの3番目で関数名のデフォルトを与えることができる.
デフォルトで何を出力させるかが決まってるとかなら絶対指定.
(あと対応できない引数があったらどうなるんだろう?試してみたいけど例が見つからないので後で探すと)


ディスパッチャはこうやるんだーってとても興味津々で見てた.とても強力な関数です.

リストのフィルタリング

次はリストのフィルタリングということで,マッピング(あるデータをリストへ再配置)したデータがあるけど,いらないのといるのと分けたい時に使える方法として
リストのマッピングは3章でやっているので省略.
3.6. マッピングリスト


for文の中にifを入れて条件判定してフィルタするショートカット.
真偽や不等式やら.
4.5. リストをフィルタリングする

この行はこうだ

methodList = [methodfor methodin dir(object)if callable(getattr(object, method))]

で,変数methodListに入れたいのは,実行可能なメソッド名?のリストを入れたい.
リストのフィルタとcallableの判定を組み合わせるとこうなる
dir()で属性全てリスト化
リスト化した属性の名前でどれがコール可能か,getattrでオブジェクトとメソッドの名前を入れて,callableで実行可能かを調べる
callableの結果をみてフィルタリングリストを使って実行可能なメソッド名をリストに入れていく.
とても濃縮されたコードだなーと.まだぺーぺーな人が言うのもアレですが,奥が深いなあと.


目次みたいなリストができたところで次の行,次のページ.

and-orトリック

andとorを使うと三項演算子が作れるらしい
どちらも論理演算だけど,返すのは値らしい.
これを使うとCやJSなどなどでおなじみな三項演算子が作れる.

使い方
4.6. The Peculiar Nature of and and or

andの性質

  • andは「〜または〜」,全てT(True)ならT,どれかがF(False)ならF
    • T+T=T, T+F=F, F+F=F
  • 値は左から右に真偽で評価される.
  • 全てtrueなら最後に評価した値を,どこかでfalseを出したらその地点の値を出す
    • falseとなる値は,0,'',"",[],(),{},None (数字のゼロ,文字列が何も無い,空のリストとタプルと辞書,ヌル値のNone)

orの性質

  • orは「〜のどれか」,一つでもTならT,全てFならF
    • T+T=T, T+F=T, F+F=F
  • 値は左から右へ評価される.
  • 全てFalseなら最後に評価した値を,Tがあったらそれ以降(残り)の値(どんなにTがあっても)は全て無視して現時点のTの値を出す.
    • "a" or {} なら "a","a" or "b" or {}でも"a"
    • falseとなる値は,0,'',"",[],(),{},None (数字のゼロ,文字列が何も無い,空のリストとタプルと辞書,ヌル値のNone)


andはtrueを通してfalseがあるとそれをを保つ,orでtrueかfalseかをはっきりさせる,みたいかなと何となく思った.
そんな仕組みを使うと三項演算式が作れるらしい.正しく動かすためのトリック付き

4.6. The Peculiar Nature of and and or
大事なのは,andとorの真ん中は確実に真にならないといけない.
ので要素が一つ入ったリストにする.orの後もリストにして,結果はリストの0番目(最初の値)を取り出して結果を表示.

ラムダ関数

一行で小さな関数を定義できる,作れる方法だそうで.
4.7. Using lambda Functions

あーすげーなー,よく1行プログラムにも使われたりしていたのを覚えてる.
ラムダ関数とは,式.簡潔に表現できるものに使うとよいらしい.
判定する前に計算をするけど,その計算が簡単なら判定関数の中に入れ込むとか?
いまいち自分もよくわかっていないけど.いまいち用途が思い浮かばず・・・

次の行はこうだ

4.7.1. 実世界のラムダ関数

processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)

何をやってるのか
and-orトリックを使って,collapsaの真偽を判定して,後ろの二つの式のどちらかを実行する.
ラムダ関数はブール値としては常にTrueを返すそうです.関数的にはtrueを返しますが,返値(計算結果とか)はどんなものでもよいとか.
このためにラムダ関数を習ったのね.
collapsaはapihelper.pyとこの章の冒頭を見ると,デフォルト値が1でオプションとして0を指定した例があります.

Chapter 4. The Power Of Introspection

def  info(object, spacing=10, collapse=1):

真偽の判定程度に使ってあるとして(0と1のブール値は偽と真),真の場合はorの手前,偽の場合はorの後のラムダ関数を動かす.
偽の場合の関数は,テキストをそのまま出力している関数と見て,真の場合はどうなるか.

(lambda s: " ".join(s.split()))

split関数は簡単に言うと文字列を分解してリストに入れるもの.引数指定で分解したい部分の文字列の指定ができる.
引数なしだと空白(半角スペース,改行(キャリッジリターン),タブ文字(TABキーを押すと入れられる文字))が分割できる.
分割したリストをjoin関数で半角スペースと一緒に結合してる.
こうすると,複数行の文章(改行したやつ)とかを1つの行に形成される.章冒頭のapihelper.py利用例に,collapseの指定で1行や複数行の切り替えができているのはこれがあるから.
processFuncは関数となり,最後の行で利用されます.

最後の行を読み解く

4.8. すべてを一つにする

    print "\n".join(["%s %s" %
                      (method.ljust(spacing),
                       processFunc(str(getattr(object, method).__doc__)))
                     for  methodin methodList])

まぁメソッドの一覧と,その機能紹介を全て出力してる.という感じだそうで.
実行時に引数指定したオブジェクトの全てのメソッドがmethodList内にあるので,それを使って
processFuncという(どう使われるか決まった)ラムダ関数には,メソッドの__doc__,つまりdoc stringを取得してstr関数で文字列に直したものが一つ
そもそも文字列じゃんとだけど,__doc__が無い場合はNoneが返ってくるのでそれも文字列として扱うためにわざわざstr関数を使う
次に,スペースできれいに整形するためのljust関数でメソッド名の長さを調整したものが一つ.
これを文字列整形をしてリストマッピング,join関数で改行を加えてprint時に改行されたメソッド一覧が出力される.

4.9. Summary

終わり

最後の__name__トリックは,モジュールと単独ファイルの実行でどうするか.
単独実行(python apihelper.py)するとdoc stringが表示される.


以上でメモ終わり.どの行もこいー組み合わせでした.

Ubuntu 9.10をEeePCに導入

導入しました.といってもインストールで特に苦労することも無く,大事なのはバックアップぐらいです.

EeePCには,バッファローSSDSHD-ES9M32Gを入れていたのですが,SSDとして認識しました.SSDの対応も進んでいるようです.
今回もクリーンインストールと/homeを復元させるとして,全く使ってないデュアルブートのXPは残しておいてLinuxパーティションだけ削除.今回はパーティションエディタを使うよりディスク・ユーティリティで消すだけの方が簡単でした.その後インストーラーで最大容量を利用.これでデュアルブート環境は終わり.まぁ一応内容の確認はしつつインストールして無事に起動します.


利用感は9.04よりいい感じに.確実によくなっている印象です.
起動と終了は笑っちゃうほど速くて,別のPCに入れたWindows 7なんて目じゃないです.SSDだからなのかもしれませんが.
Ubuntuソフトウェアセンターができたことで,よりソフトウェアを探す方法がわかりやすくなりましたね.ソフトウェア名以外にも説明文も検索対象っぽいので,何となく探しても見つかる率は高そう.


ちょっと注意することといったら,
タッチパッドはインストール当初はエッジスクロールの設定になっています.二本指スクロールは設定で変更可能.あと9.04までは二本指タップは中クリックだったのですが9.10だと右クリックになっていました.中クリックは3本指です.設定で変更可能なのかは今のところは不明です.


移行の時にAIRアプリでちょっと面倒なことを経験しました.
Tweetdeckを入れて9.04の設定を引き継いだ時(/homeの中身をコピペ)にアプリが動かない(ローカルストア?がセキュリティの問題で動かせない,)と言われました.アクセス権限の話かわかりませんが,AIRでローカルストアの暗号化されたものを使っている場合は気をつける必要ありです.
TweetDeck Support :: Oops! Tweetdeck cannot find my data

追記

あとたまにスタンバイからの復帰から無線LANが使えないことがありました.
たぶんたぶんドライバモジュールを読み込み直せば使えますが,再起動しても復帰できます.
リリースノートにそんなの書いてあったっけ?