Firefox のアドオンの1つである Dictionary Tooltip を、私は愛用している。のだが、スペルアークの URL が変更されたせいで使えなくなっていた。
これを解消するには、dictionarytip_dictScript.js というファイルを
578c578,579
< url = " http://www2.alc.co.jp/ejr/index.php?word_in=" + escape(selectedText) + "&word_in2=%e3%81%82%e3%81%84%e3%81%86%e3%81%88%e3%81%8a&word_in3=l2zdy6LhJvo58XPPQk"; 
---
> // url = " http://www2.alc.co.jp/ejr/index.php?word_in=" + escape(selectedText) + "&word_in2=%e3%81%82%e3%81%84%e3%81%86%e3%81%88%e3%81%8a&word_in3=l2zdy6LhJvo58XPPQk"; 
> url = " http://eow.alc.co.jp/" + escape(selectedText) + "/UTF-8";
な感じに変更すればいいと、友人から教わった。

風邪+頭痛で1週間ほどダウンしていたけど、さぁ Twisted を読んでみるか。
2007.10.29 Mon l ちょっと前に読んだもの l COM(0) TB(0) l top ▲
MySpace goes Hallywood を読んで思ったこと。

SNS を使って、広告主の狙い通りのところに動画配信ができるようになればなるほど、Fox とかテレビ局とかが困るだろうね〜なんて言われているけど、結局、動画コンテンツを作れる人って限られてるんだから、むしろ Fox とかは仕事が増えるから歓迎していいんじゃないの?と思う。 どうなんだろう。

「素人でもコンテンツ作れるじゃんよ!例えば初音ミクとか」って思う人も(もしかしたら)いるかもしれないけど、そんな初音ミクの歌ばっかり聴いてるわけにもいかないし、完成度はどうしたってイマイチだし。
ただ、自分が作った動画に企業の商品を入れて(記事では “Roommates” というシリーズは Ford Focus にフィーチャーするらしい)スポンサーになってもらって、再生回数に応じて多少お金をもらう、というインプレッション型の動画広告モデルがうまく確立できれば、個人でも完成度が高い動画が作られるようになるのかも。どうなんだろう。
2007.10.22 Mon l ちょっと前に読んだもの l COM(0) TB(0) l top ▲
勢いあまって Twisted Documentation の Tutorial を読み始めてみたりする。

それにしても、だいじょうぶか?最近のおれ。9月に入ってから、なんかおかしい。9月に入ってから Django や Javascript とかにいきなり手を広げて、RDBM が覚束無いことに気づいて復習して、コンピュータ以外でもジョギングを始めたりビリーズブートキャンプを(いまさら)始めたりして、しかもそれが全て未だに続いているという奇跡が起きている。反動が来なきゃいいけど。あ、風邪気味なのは反動の1つかもしれない。

それはともかく、Ubuntu で Twisted を始めるのは超簡単です。
sudo apt-get install python-twisted
以上。おしまい。
今は、Wikipedia の Twisted(Software) のページを見て、Deferreds という仕組みを使えば、効率的にできるのかもな〜とあたりを付けて、Tutorail を読んでいるところ。Deferreds というのは、たぶん、
Deferreds = IOとかの無駄に時間だけかかりそうな処理を遅延評価しちゃう
 + その後に続く処理もまとめてオブジェクトにしちゃう
 + そんなオブジェクトを並列で効率よく実行しちゃう
的なことなんじゃないかと勝手に理解している。違ってたらそのうち書き直す。
2007.10.22 Mon l Python l COM(0) TB(0) l top ▲
id:tomoemon さんがコメント経由でご指導してくださったので(ありがとうございます!)、さっそく実践してみた。

今日の目標は、私の習作の SimpleXML クラスを使わずに、もっとすごくて標準的に使われている lxml を使って、昨日作ったスクリプトを書き直すこと。

1. まずは lxml をインストールする。
Windows 上で Python をいじっている人は、Python Package Index : lxml 1.3.4 から自分の環境にあったものを探してください。わたしは Ubuntu Linux を使っているので (そういえば今朝、 Ubuntu を 7.10 にアップデートした)、
sudo apt-get install python-lxml
で完了です。

2.インポートしてみる。
>> import lxml
をしてみて、エラーが出なかったらインストール成功です。

3. 次のスクリプトを実行する
# -*- coding:utf8 -*-

from urllib import quote, urlopen
from lxml import objectify
import time

imageNum = 0
totalResultsAvailable = 2

data = {}
data["appid"] = "****" #アプリケーションID
data["query"] = "おっぱい"
data["type"]  = "all"
data["results"] = 50
data["format"] = "any"
data["adult_ok"] = 1 # 重要!!!
data["start"] = 1

while data["start"] < totalResultsAvailable:
    res = urlopen( "http://api.search.yahoo.co.jp/ImageSearchService/V1/imageSearch?"
                   + "&".join(["=".join([key, quote(str(value))]) for key, value in data.items()]))
    root = objectify.fromstring(res.read())
    totalResultsAvailable = int(root.get("totalResultsAvailable"))
    time.sleep(1)

    for e in root.Result:
        img = urlopen(unicode(e.Url))
        if img.info().gettype()[:5] != "image":
            img.close()
            img = urlopen(unicode(e.Thumbnail.Url))
        if img.info().gettype()[:5] == "image":
            print unicode(imageNum)+"."+unicode(e.FileFormat)
            localfile = file(unicode(imageNum)+"."+unicode(e.FileFormat),"wb")
            localfile.write(img.read())
            img.close()
            localfile.close()
            imageNum += 1
    data["start"] += data["results"]

p.s.
実行結果は、昨日やった結果とあまり変わらない気がする。
2007.10.19 Fri l Python l COM(2) TB(1) l top ▲
いかにして効率よく大量のおっぱい画像をダウンロードするか というエントリを読んだら、私の中に潜むおっぱいマニア(Python 使いのこと)の血が騒いで、勢いで書いてしまった。後悔はしていない。

で、これを作って動かしてみて気づいたんだけど、Yahoo! の画像検索の API では、最大で 1000 枚までしか検索できない。なのに元記事では 7000 枚以上もダウンロードできてる…時間を置いて検索しなおすと検索結果が変わって、新しい画像がゲットできるとか?おっぱいマニアへの道は遠くて険しい
それから、 SimpleXML というクラスは演算子のオーバロードを学ぶために私が大昔に作ったもので、いわば習作。当時は今もだけど XML についてよく理解していなかった。だからこれは参考にしないで、 Python2.4.2でPHP5のSimpleXMLを真似 で公開されているものとか、あるいは Beautiful Soap (というもの。まだ私は試してないけど)を使った方がいいかも。それ以外でも XML をパースして、ハッシュと属性参照でアクセスできるようなツリーを作るライブラリの何かいいやつがあったら教えてください。やっぱり私はまだ、おっぱいマニアにはほど遠い。

ちなみにダウンロードした 1000 枚のおっぱい画像のファイルサイズは、合計で 108 Mほどでした。

#! /usr/bin/python
# -*- coding:utf8 -*-

from urllib import quote, urlopen
import time
import xml.dom.minidom as minidom

class SimpleXML(object):
    def __init__(self, minidom_obj):
        self.dom = minidom_obj

    def __getitem__(self, key):
        if self.dom.attributes.has_key(key):
            return self.dom.getAttribute(key)
        raise KeyError

    def __getattr__(self, attrname):
        if attrname in dir(self.dom):
            tmp = eval("self.dom."+attrname)
            if isinstance(tmp, xml.dom.minidom.NodeList):
                return map( lambda x: SimpleXML(x), tmp)
            elif isinstance(tmp, xml.dom.minidom.Node):
                return SimpleXML(tmp)
            else:
                return tmp
            return self.buff[attrname]
        return map( lambda x: SimpleXML(x),
                    filter(lambda x: x.tagName == attrname,
                           filter( lambda x: not (isinstance(x, xml.dom.minidom.Comment) or
                                                  isinstance(x, xml.dom.minidom.Text)),
                                   self.dom.childNodes)))

    def __unicode__(self):
        if len(self.dom.childNodes) == 1 and isinstance(self.dom.childNodes[0], xml.dom.minidom.Text):
            return self.dom.childNodes[0].data

imageNum = 0
totalResultsAvailable = 2

data = {}
data["appid"] = "****"
data["query"] = "おっぱい"
data["type"]  = "all"
data["results"] = 50
data["format"] = "any"
data["adult_ok"] = 1 # ここ重要!!!
data["start"] = 1

while data["start"] < totalResultsAvailable:
    res = urlopen( "http://api.search.yahoo.co.jp/ImageSearchService/V1/imageSearch?"
                   + "&".join(["=".join([key, quote(str(value))]) for key, value in data.items()]))
    res = res.read()
    print res
    document = minidom.parseString(res)
    sdoc = SimpleXML(document)
    totalResultsAvailable = int(unicode(sdoc.ResultSet[0]["totalResultsAvailable"]))
    time.sleep(1)
    for result in sdoc.ResultSet[0].Result:
        img = urlopen(unicode(result.Url[0]))
        if img.info().gettype()[:5] != "image":
            img.close()
            img = urlopen(unicode(result.Thumbnail[0].Url[0]))
        if img.info().gettype()[:5] == "image":
            print unicode(imageNum)+"."+unicode(result.FileFormat[0])
            localfile = file(unicode(imageNum)+"."+unicode(result.FileFormat[0]),"wb")
            localfile.write(img.read())
            img.close()
            localfile.close()
            imageNum += 1
    data["start"] += data["results"]
2007.10.19 Fri l Python l COM(2) TB(1) l top ▲
子供でもできる Python @傀儡師の館 で、 RurPle and EasyGUI by Python Kids が紹介されていた。
このサイトでは、子供たちから Python + EasyGUI を使ったプログラミングの方法を教わることができる。
EasyGUI の詳しい使いかたは そのエントリ を参考にしてもらうとして、ここでは割愛。

加齢臭付きの正論 - 書評 - プログラマー現役続行 @404 Blog Not Found で、
しかし外に目を向ければ、ざっとblogosphereを見渡しただけで、20代どころか10代のすごい連中がごろごろいる。そういう連中の「上」でも「下」でもなく「同じ高さ」で意見を交わせる、いやどつきあえるというのは本当に楽しいし、そのおかげで私は今でもパートタイムとはいえ現役でいられるのだと痛感している。
と言われているが、彼らは「20代どころか10代のすごい連中」になる前のすごい連中だ。世界は広い。
2007.10.17 Wed l Python l COM(0) TB(0) l top ▲
単純化しすぎじゃないかと思う。なにもかも。
例えば Python でリストをソートしようと思ったら、マージソートとかクイックソートとか、そんな知識は不要だ。

a = [4, 2, 5, 0, 7, 3, 1]
a.sort()

で十分だし、ループとかで1回使うだけだったら

a = [4, 2, 5, 0, 7, 3, 1]
for i in sorted(a):
print i

でOKだ。プログラミングってそこまで単純化していいの?いいの?ほんとに?

プログラミングを専攻して大学や大学院を卒業しても、卒業後どっかのそういう会社に就職したとして、そこの会社がこういうスクリプト言語を使って開発をしていたら、まったくの素人となんら変わらないコードしか書けないんじゃないかという不安がある。
コンピュータエンジニアリングを専攻したのなら、オレ様言語を作るのなんか朝飯前で、晩飯までにはその言語の(Django とか、あるいは Struts みたいな、いや、別に Web アプリ限定ではないけど何かしらの)フレームワークができちゃう、とか、そんくらいできなきゃね〜みたいな感じがする。まぁ、俺はできないけど。あぁあ。

とか悩んだフリをして、ホントは組み込みの sorted という関数に今まで気づかなくて悔しがってるだけです。おやすみなさい。
2007.10.16 Tue l Python l COM(0) TB(0) l top ▲
オレンジニュースを見て知った。 http://mixi.co.jp/jobs/fresh/
就職活動をしているときに御世話になった方が出てくる。いろいろよくしてくださったのに、その期待に背いてまったことが思い出されて、心苦しい。

これから就職活動をするひとへ
mixi の中で働いているエンジニアの人は、ステキなひとばっかりだったよ。
2007.10.12 Fri l 未分類 l COM(0) TB(0) l top ▲
Python Magazine が創刊されて、創刊号は無料で読めるらしい。
http://m0j0.wordpress.com/を見て知った。
2007.10.08 Mon l 未分類 l COM(0) TB(0) l top ▲
Python のバージョンの違いではまった。 なんでさくらのサーバで
try:
    foo()
except hoge:
    bar()
finally:
    foobar()
が動かないのかな〜と思ったら、さくらの Python のバージョンが 2.4.3 だった orz
代わりにどう書けばいいのか。とりあえず保留。
2007.10.06 Sat l Python l COM(0) TB(0) l top ▲
From Nand to Tetris in 12 steps より。

私のリスニング力では3分の1ぐらいしか理解できない。くやしい。
わかったところだけまとめると、12ステップとは下から順に

1. 論理回路
2. チップセット
3. アーキテクチャ
4. マシン語
5. アセンブリ言語
6. バーチャルマシン
7. 高級言語 or OS
8. アプリケーション

ってあれ?8つしかないや...orz
2007.10.06 Sat l ちょっと前に読んだもの l COM(0) TB(0) l top ▲
Python と MySQL だけを使って、つまりフレームワーク無しでなんとかサービスを作ろうと四苦八苦している。
1度はそういう経験をすれば、フレームワークのありがたみをより強烈に感じられるはず、と思ってやっているのだけれど、HTML と CSS のデザインで挫折しそう。今まで GUI に凝ったプログラムをあまり作ってなかったせいかもしれない。

でも、あきらめないぞ!
いま参考にさせてもらっているサイトをまとめておきます。ありがとうございます。
そしてがんばれおれ。

Webデザインテンプレート集
CSSデザインテンプレート
そろそろスタイルシートで - CSSでデザインしてみよう。
画像の使用を極力控えてかっこいいCSSデザインをやってみよう大会
CSS入門
あとでもっと追加するかも。
2007.10.05 Fri l 未分類 l COM(0) TB(0) l top ▲

Why Is US Grad School Mainly Non-US Students?
より。

彼の大学院でコンピュータエンジニアリングを学ぶ人の国籍は、9割がインドで、残りは中国。アメリカ人は7人しかいない。

らしい。で、投稿者は

賢いアメリカ人は弁護士か医者を目指すので、コンピュータエンジニアリングを大学院で学ぶアメリカ人は少数派になる、って言われてますけど本当ですか?

で締めくくっていて、コメント欄では、「医者は不景気に強いから人気」とか、「いやそれほど不景気に強くない」とか、「特に歯科医は不景気に弱い」とか、「それは元々ぼったくってるからだ」とか、いろいろ盛り上がっている。
コンピュータを学ぶベトナム人も多いらしい。
2007.10.01 Mon l ちょっと前に読んだもの l COM(0) TB(0) l top ▲