[Python] Setの積は元から定義されていた

昨日の Rangeの積を求める なんですが, set のベースクラス BaseSet の定義を見てみたらこう書かれていました。

def __and__(self, other):
    """Return the intersection of two sets as a new set.
     (I.e. all elements that are in both sets.)
    """
    if not isinstance(other, BaseSet):
        return NotImplemented
    return self.intersection(other)

ということは,Set型は元から a & b という書き方ができるんですね。実際に試してみると,とても簡単に集合の積がとれました。

>>> a = range(1,7); b = range(3,10); c = range(4,12)

>>> print a,b,c
[1, 2, 3, 4, 5, 6] [3, 4, 5, 6, 7, 8, 9] [4, 5, 6, 7, 8, 9, 10, 11]

>>> set(a) & set(b)
set([3, 4, 5, 6])

>>> set(a) & set(b) & set(c)
set([4, 5, 6])

終了──── しかも,RubyのRangeって数値以外も扱えるらしいじゃないですか。
全然だめだ>自分

気を取り直して,list型に「 & 」の振る舞いを実装してみることにします。元のlist型には「 & 」は定義されていないので,当然ながら「 a & b 」という表記はエラーになります。

>>> a = [1,2,3]; b = [2,3,4]; c = [3,4]

>>> a & b
Traceback (most recent call last):
  File "", line 1, in 
TypeError: unsupported operand type(s) for &: 'list' and 'list'

& 演算子は,__and__メソッドを定義することで利用可能になるので,新たに list を継承した xlist クラスを作ります。

class xlist(list):
    def __and__(self, other):
        return xlist(filter(lambda x: x in other, self))
実行してみましょう。
>>> a = xlist([1,2,3,4]); b = xlist([2,3,4,5]); c = xlist([4,5,6])

>>> a & b
[2, 3, 4]

>>> a & b & c
[4]

できた。

り, Reduce 最高

[Python] Rangeの積を求める

ueBLOGさんのブログ経由で知ったこの Range の積を求めるというもの。

» [Ruby] Rangeの積を求める - masuidrive
» Life is beautiful: 教えながら学ぶRuby:「Rangeの積を求める」をやってみた

を Python で書いてみました。引数に3個以上とかのRangeを渡されても大丈夫です。
元ネタの Ruby は Range クラスを拡張していますが、 Python の Range はビルトイン関数なので関数定義で。

from sets import Set
def range2(*args):
    return reduce(Set.intersection, map(Set, args))

では、実行してみましょう。

>>> range2([1,2,3,4,5,6], [3,4,5,6,7,8,9], [4,5,6,7,8,9,10,11])
[4, 5, 6]
>>> range2([1,2,3,4,5,6], [3,4,5,6,7,8,9], [10,11])
[]
>>> range2(range(1,8), range(3,7), range(4, 200))
[4, 5, 6]

で、何が言いたいかというと、「Reduce なくさないでよ!」ということです。functools.reduce という感じで残るみたいですが、組み込み関数じゃなくなるのは悲しいなぁ。

便利べんり。 Reduce 最高。

Internet Explorerのブラウザシェア推移

これを見ると、やっぱり Windows 98 から XP 、そして Vista へと続く OS の移り変わりとリンクしている気がします。結局、一般の人は購入したPCに搭載されている標準ブラウザを使うということかなぁ。この調子だと、IE6のことを考えなくてよくなるのは2010年くらいになりそうです。

via remy sharp's b:log

Re: リスト内包表記キタコレ

a2cさんのブログに書いてあった Python に関するこの問題。
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
の配列を、リスト内包表記を使って次のように変換せよ。
[1, 2, 3, 4, 5, 6, 7, 8, 9]

前もって構造が分かっているという前提だと、こんな感じでしょうか。
List Comprehension を二重にするだけ。

>>> [x for y in arr for x in y]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
reduce()を使っていいならば、こっちのほうが自分は好きかも。
2.6からは使えなくなるみたいですが。
>>> reduce(lambda a,b: a+b, arr)
[1, 2, 3, 4, 5, 6, 7, 8, 9]

リストが何重の入れ子になっているか分かっていない場合は、 List Comprehension だけでできるのかなぁ… 分かりません、誰か教えてください。

UbuntuにAdobe Flex3 開発環境を構築する

Adobeが無償かつオープンソースで公開している開発環境の Flex 3 SDK をUbuntuにインストールします。

1. Flex 3.0 SDK のダウンロード

Adobe - Download Adobe Flex 3 から Flex 3.0 SDK をダウンロードします。そして、flex_sdk_3.zipを適当な場所に解凍しておきます。ここでは、仮に ~/flex とします。
インストールは基本的にパスを通すだけなので、~/.profile や ~/.bash_profile などに以下を記述しておきます。

export PATH=$PATH:~/flex/bin

また、.exeとか.batとかは必要ないので ~/flex/bin からは削除しておきます。

2. Debug Flash Player のインストール

既に入っているFlash Playerプラグインを置き換えます。まずは、バックアップを取っておきましょう。

$ cd /usr/lib/flashplugin-nonfree
$ sudo cp libflashplayer.so libflashplayer.so.bak

Debug Flash Player のインストール。64ビット環境だとチェックでエラーになるので、手動でコピーします。付属のインストーラーもコピーしているだけなので、これで問題ありません。(追記:というか、デフォルトで入っているFlashプラグインよりもこちらのほうが安定しているようです。)

$ cd ~/flex/runtimes/player/lnx
$ tar xzvf install_flash_player_9_linux.tar.gz
$ cd install_flash_player_9_linux
$ cp libflashplayer.so /usr/lib/flashplugin-nonfree/

※ブラウザの再起動が必要です。

3. スタンドアローンFLASHプレイヤーのインストール

$ cd ~/flex/runtimes/player/lnx
$ tar xzvf flashplayer.tar.gz
$ mv flashplayer ~/flex/bin

4. JRE インストール

JAVAのランタイムがインストールされていない場合はインストールします。aptで入るので楽ちん。

$ sudo aptitude install sun-java6-bin

5. sample のコンパイル

SDKに含まれているサンプルをコンパイルして動かしてみましょう。

$ cd ~/flex/samples/explorer
$ ./build.sh

ビルドにはけっこう時間がかかりますが、問題なく終了すれば同じディレクトリにある explorer.html を開くと次のような画面が表示されて、用意されているいろいろなコンポーネントの動作を試すことができます。

便利べんり。Ubuntu 最高。

もういくつ寝ると Ubuntu 8.0.4 Hardy Heron

ついにあと30日を切りました!

便利べんり。Ubuntu 最高。 → インスパイア元

emacs-snapshot-gtk

emacs-snapshot-gtk

Emacsをターミナル内で動かしている人も多いと思いますが、僕はウィンドウ派です。最近は、YASnippetanything.el の快適な使い方を模索中なのですが、今回はEmacs23 (snapshot)について書きたいと思います。

emacs-snapshot のインストール方法は、いつの間にかUbuntuのuniverseリポジトリに加わっていたので、Synaptic パッケージ・マネージャの[設定]-[リポジトリ]で下記の"universe"を有効にするだけ。これで、パッケージ一覧にemacs-snapshotが現われるようになるので、インストール可能になります。

フォントの設定は、.emacs に以下のように設定します。例えば、「IPA モナー ゴシック」を使う場合は、こんな感じ。

(set-default-font "Bitstream Vera Sans Mono-9")
    (set-fontset-font (frame-parameter nil 'font)
      'japanese-jisx0208
      '("IPA モナー ゴシック" . "unicode-bmp"))

あとは、起動時のウィンドウサイズ指定とクリップボードからコピーできるようにしておくと便利です。また、最後の windmove-default-keybindings は、Shift+カーソルで分割したWindow間の移動ができるようになります。これ最高。

(setq initial-frame-alist '((width . 80) (height . 40)))
(setq x-select-enable-clipboard t)
(windmove-default-keybindings)
便利べんり。Ubuntu 最高。

jQueryチートシート for iPhone / iPod touch

iPhone / iPod touch で閲覧できる jQuery チートシートが公開されています。
その名も「jTouch」

http://labs.colorcharge.com/jtouch/

作者のRickさんによると、毎日2時間も渋滞に巻き込まれているので、その時間を有効に使いたいというのが作った動機だそうです。さすがに運転しながらは危険だと思いますが、実際に使ってみた感想としては、動作も軽くてなかなか使い勝手がいいです。iPodをリファレンスとして活用するのは、なかなかいいアイデアだと思いました。

via jTouch - jQuery Cheat Sheet for iPhone and iPod Touch

Ubuntu HardyでThinkPadの明るさ調整ができるようになった

※kernel 2.6.24-14 から何もしなくても調整可能になっています。

前にUbuntu Hardyの最新カーネル(2.6.24-12)でLCDの明るさ調整ができないと書きましたが、 /etc/modprobe.d/options に次の一行を追加したら明るさを調整できるようになりました。

options thinkpad_acpi brightness_enable=1

今、困っているのは、VMwareが仮想マシンを起動するタイミングでハングアップしてしまうことと(追記:CPUのVT機能をオフにしたら解消しました)、HardyはデフォルトでFirefox3なんだけどGreasemonkeyをONにしてると頻繁に固まること。

下は、仮想デスクトップの一覧を表示させた時のスクリーンショットです。エフェクトを有効にしても動作が軽いのがいいです。Ubuntu Hardyは、まだβ版がリリースされたばかりなので万人にお勧めはできませんが、自分で何とかできる人は試してみてどんどん Launchpad にバグ報告するといいかも。日本人はオープンソースソフトを使うだけで貢献しないとか言われないためにも…

便利べんり。Ubuntu 最高。

Unity - Ubuntu and Windows

I’m working on adding Unity support to the Linux codebase, which may in time be part of Workstation or Player. This will allow your Windows and Linux programs to intermingle with the click of a button.

Awesome!

MacBookのファームウェア・パスワードを解除する

知り合いが、MacBookのファームウェア・パスワードを忘れてしまって起動できないと相談に来ました。試しに起動してみると、たしかに下のような画面が表示されて起動できません。

アップルのサイトによると、Open Firmware Password Protection はインストールディスクの /Applications/Utilities/ に収録されていて次のように各種操作が無効になるらしい。

Intel ベースの Macintosh で Open Firmware Password Protection をオンにすると、次のように動作します。
  • 「C」キーを使って CD-ROM ディスクから起動する機能を無効にします。
  • 「N」キーを使って NetBoot サーバから起動する機能を無効にします。
  • 「T」キーを使って (この機能を利用できるコンピュータ上で) ターゲットディスクモードで起動する機能を無効にします。
  • 「D」キーを使ってインストール DVD の Diagnostic ボリュームから起動する機能を無効にします。
  • 起動時に「command」キーと「S」キーを同時に押してシングルユーザモードで起動する機能を無効にします。
  • 起動時に「command」、「option」、「P」、「R」の各キーを同時に押してパラメタ RAM (PRAM) をリセットする機能を無効にします。
  • 起動時に「option」キーを押して「Startup Manager」にアクセスするときにパスワードを要求します。

パスワードが分からないので、本当にDVDからのブートもPRAMクリアさえもできない…
なかなか手強いなぁと思いつつ、しばらく格闘し続けること数十分、最終的に以下の方法でリセットすることができました。

  1. メモリを1枚抜いて、メモリ搭載量を変更する。
  2. 「command」、「option」、「P」、「R」の各キーを同時に押して起動する。
  3. ずっと押しっぱなしにしていると、画面が黒くなって再起動する。
    これを3回繰り返す(この間ずっと押しっぱなし)。

メモリの搭載量を変えるところがポイントみたいで、今回は2枚刺さってたので1枚抜いたらOKでした。1枚しか刺さっていない場合は、別途メモリを追加する必要があるようです。
ついでにHDDも容量の大きい物に交換して作業完了。問題なく動作してるようでホッとしました。というわけで、今回の教訓は、「BIOS(EFI)パスワードをかけたくらいで安心してはいけません」ということ。

# ちなみにThinkPadは専用のセキュリティチップを積んでいてもっと手強いんだけど、マザーボードの配線をショートさせるとリセットできるらしい(危険)。

Ubuntu x86_64環境にSkypeをインストール

Skypeのサイトでは、親切なことにUbuntu用のパッケージが公開されています。ただし、ターゲットがi386なので、そのままでは64ビット環境ではインストールできません。でも、次のようにすれば大丈夫。

1.ライブラリのインストール

$ sudo apt-get install ia32-libs lib32asound2

2.Skypeインストール

Skype for Linuxのダウンロードから、Feisty Fawn (7.04)用をダウンロード。"--force-all"を指定してインストール。
$ sudo dpkg -i --force-all skype-debian_2.0.0.63-1_i386.deb

3.起動

[アプリケーション]-[インターネット]にSkypeアイコンが表示されるので、後はクリックするだけ。

※一応、パッケージはUbuntu 7.0.4用なのですが、8.0.4 (Hardy Heron)でも使えています。

便利べんり。Ubuntu 最高。

jQuery is more popular than prototype

Recently, jQuery seems to be drawing attention from web developers. I noticed that jQuery is now more popular than prototype.js by Google Trends.
If you want to dive into jQuery, I recommend you to read my article, 'jQuery Code Reading' on gihyo.jp. Now's the time to start learning jQuery!

via jeresig's post

Mac mini Pro


 

Mac Mod Lab. New Mac Mini Pro:

Mac Mod Lab.の新作「Mac mini Pro」
Mac mini用のケースなんだけど、とても綺麗に収まっていてProの雰囲気を醸し出している。見た目だけじゃなくて、ちゃんと実用性も考えられていて、3.5インチHDDをケースに内蔵可能だったり、電源スイッチやUSBポートが前面にあったりする。

これはいいなぁ、ぜひ売り出して欲しい。

Playing with NodeBox

NodeBoxで遊ぶ。別に暇なわけじゃなくて、ちょっとした息抜きなのだ。



NodeBox/QtをLinuxで動かしてみた

Pythonスクリプトでグラフィックス/アニメーションをProcessing風に生成できるアプリケーション NodeBox のQt版を Linux (Ubuntu)で動かしてみました。

1. PyQt関連ツールのインストール

$ sudo aptitude install pyqt4-dev-tools

2. nodeboxのダウンロード

$ svn co http://dev.nodebox.net/svn/nodebox/branches/try-qt/
$ cd try-qt
$ python qtrun.py

NodeBoxの画面が立ち上がってきて、右上にスクリプトを打ち込んで Ctrl+R を押すと左側のペインに描画されます。こないだのPyDevCampで見たのと一緒ですね。たぶん、Core Image依存の部分は動かないかもしれませんが簡単な描画なら問題ないようです。


画像クリックで拡大

便利べんり。Ubuntu 最高。

松本に思いを寄せる

今回、PyDevCampが開催された長野県松本市は10年くらい前に行ったことがあったのですが、こんな良い所だとは知りませんでした。駅前こそPARCOとかのビルが建ち並ぶ一般的な都市なんですが、松本城の近くは日本の伝統的な街並みが保存されていて、良い雰囲気を醸し出していました。ホテルのロビーに「信州に移り住む」みたいな雑誌が置いてあったのですが、それも悪くないかもと思ってしまいました。

Building and car
Matsumoto Castle, Japan  Entrance of Matsumoto Castle  a dog, he is free  Matsumoto, the castle town  Nawate do-ri  kanamono

Python Developers Camp 2008冬に参加してきました

3月7日〜9日の3日間にかけて、長野県松本市で開催されたPython Developers Camp 2008冬に参加してきました。北は北海道、南は九州まで全国からPythonistaが40人ほど集結しました。

PyDevCampは何度目かの参加になるのですが、今までのWeb開発中心の内容とは打って変わって、PythonからGAINERデバイスを操作したり、Nodeboxでグラフィックス処理とかFeliCaのデータを読み取ったりというのが目を引きました。僕は、Webとリアル世界との融合がこれからますます進んでいくと思っているのですが、それを先取りした形になっていて興味深かったです。Web2.0はWebサイト間のマッシュアップだったけど、Web3.0はリアル世界とのマッシュアップになるのではと勝手に予想しています。そして、その時このPythonの汎用さはきっとアドバンテージになるはず。

その他にもpyspecによるユニットテストやbuildbotによる自動化の方法、アクセスログ解析スクリプトなども大変参考になりました。また、今回Pylonsを初めてインストールして使ってみたのですが、なるほどデバッグが非常にやりやすくて、SQLAlchemyが標準っていうのがいいですね。テンプレートに関しては好みが分かれそうですが、いじっていたのが某JSONベースのアプリケーションなので気になりませんでした。こちらは近いうちに公開したいと思います(たぶん)。

幹事をしてくださった方、Pythonをこよなく愛する参加者の方々、本当にお疲れさまでした。また次回も懲りずに参加したいと思います。

参加された方々のブログ: カトキチさんのまとめが素晴らしい!

Ubuntu 8.0.4 (Hardy Heron)

ThinkPadには、Ubuntu 8.0.4をインストールして使っています。4月にリリースが予定されているバージョンで、コードネームは「Hardy Heron」丈夫なサギという意味らしいです。
ところで、Ubuntuの背景について皆さんご存じですか?

Ubuntuプロジェクト創始者のマーク・シャトルワース氏は2005年に、約1000万ドル(約12億円)の私財を投じてUbuntu財団を設立。開発とサポートにコミットしている。
南アフリカ共和国出身のシャトルワース氏はアフリカ人初の宇宙旅行者としても知られている。1995年、22才のときに始めた電子認証局ビジネスが成功。1999年に米VeriSignに対して5億7500万ドル(約650億円)でその会社を譲渡している。 - @IT

僕が知ったのは最近なのですが、南アフリカ共和国出身のシャトルワース氏が社会に還元するという目的でこのような活動をしているのは、とても好感が持てます。Ubuntuという単語は、アフリカで「他者への思いやり」や「皆があっての私」といった意味があり、本家のFAQには「美しすぎて英語には訳せない」とまで書かれています。また、キャッチフレーズの"Linux for human beings"にもある通り、こういったOSが誰でも使えるようになることは人類全体にとって良いことだと思っています。僕がベータ版アルファ版を使うのは、早くから使って開発に少しでも貢献できればという思いから。

 

というわけで Ubuntu on X61 ですが、無線LANや内蔵SDカードリーダ、指紋認証デバイスまで特に問題なく使えていています。サスペンド/ハイバネーションも普通に動作します。ただ最新のカーネル 2.6.24-11 だと、LCDの輝度が常に最大になってしまうという問題があって、ひとつ前の 2.6.24-10 を使っています。こちらはそのような現象は発生していないので、後でバグ報告しておこうと思います。(追記:解決しました。

気になることといえば、バッテリーの持ちがあまり良くないことでしょうか。これは、Vistaでも同様でWindows XPのほうがバッテリーが長持ちするようです。無駄なエフェクトを切ってX3100をあまり使わないようにすればいいのかもしれないけど、Compizのエフェクトは格好いいから捨てがたい…
とりあえず、Intelが出しているPowerTOPを使って少しずつチューニングしていこう。

便利べんり。Ubuntu 最高。

ThinkPad X61のキーボード

ThinkPad X61が届いてすぐに、英語キーボードに交換しました。ThinkPadのキーボードには、NMB製とChicony製があるそうで、僕は評判の良いNMB製を選択しました。X40と比べると若干打鍵感が軽い気もするけど、適度なストロークがあって、打っていてとても気持ちがいいです。下の記事を読むと分かるのだけれど、ThinkPadのキーボードに対するこだわりは素晴らしいです。キーの押し初め→中→終わりで、反発力がS字の曲線を描くように設計されていて、このフィーリングを生み出しているそう。

 

交換手順は、背面のねじを4本外してキーボードをスライドさせてコネクタを外すだけととても簡単でした。後から気づいたんだけど、キーボードの交換手順は Lenovoのページ に載ってました。このLenovoのページ、未だにドメインはibm.comなんですね。最近発表されたX300も設計はIBMの大和事業所ということだし、ThinkPadクオリティは、これからも継続されていくようでちょっと嬉しい。

(CentOSをダウンロード中)

UbuntuでThinkPad X61の指紋認証を使う

先日購入したThinkPad X61が届いて、さっそくUbuntu Gutsyをインストールしました。一応、Vistaもデュアルブートで起動できるように残してありますが、おそらく使うことはほとんどないと思います。

さて、このX61には指紋認証デバイスが付いてます。自分の指紋を登録しておくと、いちいちパスワードを入力しなくてもログインできるので便利です。また、誰かと一緒に作業をしていてパスワードを入力する必要がある時には、さりげなく目をそらすのが"大人のマナー"だと思うんですが、たまにガン見してる人がいたりします。指紋認証ならそんな時でも安心です。この指紋認証デバイスは、Linuxでもちょっと設定をするだけで使えるようになります。指でなぞるだけでGDMからログインできるし、ターミナルからsudoする時にも利用可能です。設定方法は次の通り。

1.aptリポジトリの追加

次のリポジトリを Synaptic パッケージ・マネージャの[設定]-[リポジトリ]-[サードパーティのソフトウェア]に追加するか /etc/apt/sources.list に直接追記します。

deb     http://ppa.launchpad.net/jldugger/ubuntu gutsy main restricted universe multiverse
deb-src http://ppa.launchpad.net/jldugger/ubuntu gutsy main restricted universe multiverse

2.インストール

$ sudo apt-get install thinkfinger-tools  libpam-thinkfinger

3.動作テスト

(1)指紋登録
きちんと動作するかテストしてみましょう。
次のコマンドを入力して、3回指でなぞってください(認識に失敗した場合はもっと)。

$ sudo tf-tool --acquire

ThinkFinger 0.3 (http://thinkfinger.sourceforge.net/)
Copyright (C) 2006, 2007 Timo Hoenig <thoenig@suse.de>

Initializing... done.
Please swipe your finger (successful swipes 3/3, failed swipes: 0)... done.
Storing data (/tmp/test.bir)... done.

(2)指紋認証

$ sudo tf-tool --verify

ThinkFinger 0.3 (http://thinkfinger.sourceforge.net/)
Copyright (C) 2006, 2007 Timo Hoenig <thoenig@suse.de>

Initializing... done.
Please swipe your finger (successful swipes 1/1, failed swipes: 0)... done.
Result: Fingerprint does match.

"Result: Fingerprint does match."と表示されれば成功。

4.pamの設定

/etc/pam.d/common-auth を次のように編集します。
auth    sufficient      pam_thinkfinger.so
auth    required        pam_unix.so try_first_pass nullok_secure

5.ユーザの指紋登録

$ sudo tf-tool --add-user [username]

[username]の部分をログインユーザに置き換えてください。"Unable to set ACL of aquired file: /etc/pam_thinkfinger/your-login.bir: Operation not supported"というエラーが出ますが、無視しても問題ありません。

6.カーネル・モジュールの設定

起動時にモジュールが自動でロードされるようにします。"uinput"を末尾に追加。

# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.

fuse
lp
sbp2
uinput

以上の設定が終わったら再起動してみてください。ログイン画面でパスワードを入力する代わりに指でなぞることでログイン可能になっているはずです。最初はけっこう感動すること間違いなし。
しかし、残念ながらノートPCにはあなたの指紋がベタベタ付いているので、セキュリティ上の観点から言うとあまり安全ではありません。ハードディスク・パスワード等を併用したほうがよいでしょう。

関連リンク:
ThinkFinger
ThinkFinger - Ubuntu Wiki

便利べんり。Ubuntu 最高。