2008年1月20日日曜日

【Python】 BeautifulSoupでHTML解析

PythonでHTMLを解析するにはBeautifulSoupが便利だ。前回紹介したhttpgetを用いて使い方を紹介する。BeautifulSoup.pyをダウンロード後、[python]/Lib/site-packagesにコピーする。
>>> from BeautifulSoup import BeautifulSoup
>>> from httpget import *
>>> doc = unicode(httpget('http://www.amazon.co.jp/'), 'cp932', 'ignore')
>>> soup = BeautifulSoup(doc)

で準備完了。

<a>を見つけるには
>>> a_tags = soup.findAll(name='a')
>>> print a_tags[0].contetns


<a>でかつid=abcを見つけるには
>>> a_tags = soup.findAll(name='a', attrs={'id':'abc'})
>>> print a_tags[0].contetns

ラベル:

2008年1月18日金曜日

【Python】 httpgetの実装

import urllib2
def httpget(address, user_agent='myagent'):
  opener = urllib2.build_opener()
  opener.addheaders = [('User-agent', user_agent)]
  doc = opener.open(address).read()
  return doc

使用例
doc = httpget('http://www.yahoo.com')

使用例ShiftJISをUTF-8に変換
doc = unicode(httpget('http://www.amazon.co.jp/'), 'cp932', 'ignore')

ラベル:

2008年1月15日火曜日

ゲーデル、エッシャー、バッハ読書ログ1:購入

先日、ホフスタッター氏の「ゲーデル、エッシャー、バッハ―あるいは不思議の環 20周年記念版」を購入した。大学の図書館でお目にかかって以来、10年以上もの間ずっと気になってきた本だ。ゲーデル、エッシャー、バッハ―は比較的大きな本屋であれば簡単に見つかる。763ページでとても分厚く重たい。本屋で何度か手には取ってみた。ずっしりと腕にくる。購入するまでには至らなかった。まったく理解できる気になれなかったからだ。Amazonで書評が手軽に読めるようになって、ゲーデル、エッシャー、バッハ―のレビューに目を通してからは余計に近寄りがたくなった。しかしなぜかずっと気にはなっていた。1/10でも1/100でも理解できるような気がしたら買ってやろうと。

20周年記念版には「GEB20周年記念版のために」という題の前書きが追加されている。ページ数37ページである。これを立ち読みして買って呼んでみる気になった。詳しくは次のエントリーに譲るが、著者がゲーデル、エッシャー、バッハで述べたかった主要な論点について記述から始まる。
P.P-4
一言で言えば、GEBは、生命のない物質から生命のある存在がどのように生まれるかを述べようとするたいへん個人的な試みだ。自己とは何であり、石や水たまりのように自己をもたないものからいかにして自己が生まれるのか。
In a word, GEB is a very personal attempt to say how it is that animate beings can come out of inanimate matter. What is a self, and how can a self come out of stuff that is as selfless as a stone or a puddle?

ゲーデル、エッシャー、バッハは難解である。著者自身による主題についての解説は理解の大きな羅針盤になるに違いないので、個人的には20周年記念版をお勧めする。

Amazon.co.jp ゲーデル、エッシャー、バッハ―あるいは不思議の環 20周年記念版
Amazon.co.jp ゲーデル,エッシャー,バッハ―あるいは不思議の環
Amazon.co.jp ダグラス・r・ホフスタッター
Amazon.com Godel, Escher, Bach: An Eternal Golden Braid (Paperback)

日本語版Wikipedia ゲーデル、エッシャー、バッハのエントリーはひどい。誤解に満ち満ちている。20周年記念版の前書きを2ページ読めばその理由が明らかだろう。
英語版Wikipedia Gödel, Escher, Bachは一読することをお勧めする。Cohen氏のレビューも一読あれ。

ラベル: ,

2008年1月11日金曜日

Firefox Extension開発入門1

FirefoxのURL入力するところにabout:configと入れると設定がリストアップされる。以下のように変更。なければ、新規作成する。
  • javascript.options.showInConsole=true
  • nglayout.debug.disable_xul_cache=true
  • browser.dom.window.dump.enabled=true
  • javascript.options.strict=true
Firefox再起動。

DOS窓から以下のコマンドでFirefoxのインスタンスを起動。ここではプロファイル名としてdevを用いる。
set MOZ_NO_REMOTE=1
"\Program Files\Mozilla Firefox\firefox.exe" -P dev

以下のフォルダを作成
  • C:\FFExtension
  • C:\FFExtension\my
  • C:\FFExtension\my\chrome
  • C:\FFExtension\my\chrome\content
以下のファイルを作成
  • C:\FFExtension\my\chrome.manifest
  • C:\FFExtension\my\install.rdf
  • C:\FFExtension\my\chrome\content\my.xul
プロファイル関連ファイルを作成。OSごとのフォルダ構造はここを参照
  • [Profiles]\[ID]\extensions\{a58fa49f-acb8-43f8-b3b5-e69f552f6a7d}
chrome.manifest:

content sample chrome/content/
overlay chrome://browser/content/browser.xul chrome://sample/content/my.xul


my.xul:
<overlay id="sample"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<statusbar id="status-bar">
<statusbarpanel id="my-panel" label="Hello, Firefox extension"/>
</statusbar>
</overlay>

{a58fa49f-acb8-43f8-b3b5-e69f552f6a7d}:
C:\FFExtension\my\

install.rdf:
<?xml version="1.0"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:em="http://www.mozilla.org/2004/em-rdf#">

<Description about="urn:mozilla:install-manifest">
<em:id>{a58fa49f-acb8-43f8-b3b5-e69f552f6a7d}</em:id> <!-- 拡張機能ごとにUUIDを生成(*) -->
<em:version>1.0</em:version> <!-- 拡張機能のバージョン -->
<em:type>2</em:type> <!-- 2:拡張機能、4:テーマ、8:ロケール、16:プラグイン、32:... -->

<!-- Target Application this extension can install into,
with minimum and maximum supported versions. -->
<em:targetApplication>
<Description>
<em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id> <!-- Firefox固有のUUID -->
<em:minVersion>1.5</em:minVersion>
<em:maxVersion>2.0.0.*</em:maxVersion>
</Description>
</em:targetApplication>

<!-- Front End MetaData --> <!-- 拡張機能の説明(人間用) -->
<em:name>my sample</em:name>
<em:description>A test extension</em:description>
<em:creator>inoue@ariel-networks.com</em:creator>
<!--em:homepageURL>http://dev.ariel-networks.com/</em:homepageURL-->
</Description>
</RDF>


一応、FireFoxを再起動して、devプロファイルでウィンドウを開くと、ステータスバーにHello...が表示される。



最後になりましたが、Firefox拡張機能(extension)の作り方を参考にさせていただきました。

ラベル: ,

セマンティック・ウェブ入門5:実例で学ぶOWL

実例を紹介しながらOWLを勉強。

[ヘッダー]
<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:owl="http://www.w3.org/2002/07/owl#">

<owl:Ontology rdf:about=""/>

[クラス要素]
<owl:Class rdf:ID="OS">
<rdfs:comment>OSs form a class.</rdfs:comment>
</owl:Class>

<owl:Class rdf:ID="Application">
<rdfs:comment>
Applications form a class.
</rdfs:comment>
<owl:disjointWith rdf:resource="#OS"/>
</owl:Class>

<owl:Class rdf:ID="MailClient">
<rdfs:comment>MailClients are a type of Application.</rdfs:comment>
<rdfs:subClassOf rdf:resource="#Application"/>
</owl:Class>

<owl:Class rdf:ID="AddressBook">
<rdfs:comment>AddressBooks are parts of Mail Clients.</rdfs:comment>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#is_part_of"/>
<owl:allValuesFrom rdf:resource="#MailClient"/>
</owl:Restriction>
</rdfs:subClassOf>
</owl:Class>


[フッター]
</rdf:RDF>

このほかにも[プロパティ要素]、[プロパティ制約]、[列挙]、[インスタンス]などがある。

詳しくは「CD-ROMで始めるセマンティックWeb」にわかりやすく説明あり。おすすめ良書。

ラベル: , , , ,

2008年1月10日木曜日

スライド式USBメモリー、軽量でコンパクト

USBメモリーはとても便利だ。データを持ち歩くことの敷居をぐっと下げた。けど、満足できる製品は案外少ない。USBメモリーに要求することとして
  • 軽量・コンパクト
  • 蓋が取れないこと、あるいはないこと
  • 容量
  • 値段
というわけで、長い間買い換えることをためらってきたがI-O DATAのToteBagがなかなか良い。


蓋が存在せず、スライド式でUSB端子が出たり入ったりする。そして軽くて小さい。容量は4GBまで。

セマンティック・ウェブ入門4:OWLって何?

OWLはWeb Ontology Languageの略で、なぜかWとOが入れ替わっている。OWLはRDFでは表現できない関係性を表すために出てきた。例えば、プロパティが取りうる値の個数を制限したいときやクラスが共通のインスタンスを持たないこと(クラスが互いに素)やプロパティが「~より大きい」など。

OWLには3種類ある。
  • OWL Full
    • 推論の実装は事実上不可能なので無視
  • OWL DL
    • OWLのコンストラクタ自体にOWLのコンストラクタを適用できない
  • OWL Lite
    • OWL DLの制約に加え、列挙クラス、個数制限などが使えないので表現力が乏しい
推論処理(論理的矛盾がないか調べる)が軽い順であらわすと、
  • OWL Lite < OWL DL << OWL Full
となる。

OWLはRDFの構文に従う。また、OWLのクラスはRDFのサブクラスとなる。
  • rdfs:Class <- owl:Class
  • rdf:Property <- owl:ObjectProperty
  • rdf:Property <- owl:DatatypeProperty
OWLの実例は次回。

ラベル: , , ,

セマンティック・ウェブ入門3:RDF Schema

RDFスキーマを用いると「is-a」の関係を明示的にあらわすことが出来る。

「FedoraがLinuxの一種である。LinuxはOSの一種である。」をRDFスキーまで表すと以下のようになる。

[RDF Schema]
<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">

<rdfs:Class rdf:ID="OS"/>

<rdfs:Class rdf:ID="Linux">
<rdfs:subClassOf rdf:resource="#OS"/>
</rdfs:Class>

<rdfs:Class rdf:ID="Windows">
<rdfs:subClassOf rdf:resource="#OS"/>
</rdfs:Class>

<rdfs:Class rdf:ID="OSX">
<rdfs:subClassOf rdf:resource="#OS"/>
</rdfs:Class>

<rdfs:Class rdf:ID="Fedora">
<rdfs:subClassOf rdf:resource="#Linux"/>
</rdfs:Class>
</rdf:RDF>

ここではClasssubClassOfしか用いていないが様々なクラスが用意されている。
  • rdfs:Resource
    • 全てのリソースのクラス
  • rdfs:Class
    • 全てのクラスのクラス
  • rdfs:Literal
    • 全てのリテラルのクラス。唯一のデータ型。
  • rdf:Property
    • 全てのプロパティのクラス
  • rdf:Statement
    • 全ての具体化されたステートメントのクラス
上述の例に、Fedoraのkernelバージョンを属性として加えるには以下のように書く。
<rdf:Property rdf:ID="kernel version">
<rdfs:domain rdf:resource="#Fedora"/>
<rdfs:range rdf:resource="&rdf:Literal"/>
</rdf:Property>

RDFスキーマはRDFに従うので、実際はRDFの中に記述される。

ラベル: , , ,

セマンティック・ウェブ入門2: XMLと(RDFは)どう違うんだ?

セマンティック・ウェブ入門1の続き。XMLとの違いを説明する。

Semantic WebがRDFとOWLにより実現されると仮定すると、前回の例はSemantic Webではない。Semantic Webを理解するにはRDFとOWLが最も重要な項目となるので、RDFに絞って話を進めていく。

XMLは拡張が出来るマークアップ言語。簡単に言うとタグを定義できる。なので、とても柔軟でどうとでも書けてしまう。

[XML:書き方1]
<Blog>
<Title>Semantic Web</Title>
<URL>http://semanticlog.blogspot.com/</URL>
<所有者>Sein</所有者>
</Blog>


[XML:書き方2]
<Sein>
<BlogTitle>Semantic Web</BlogTitle>
<所有する>http://semanticlog.blogspot.com/</所有する>
</Sein>

このように、XMLではSeinがSemantic Logを所有すると表現するのに様々な形式が取れる。また、タグは所詮項目名に過ぎない。Semantic Webするには仕様がゆるすぎることが問題。そこで、RDFでは以下のように記述される。

[RDF]
<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:mydomain="http://www.mydomain.org/my-rdf-ns">

<rdf:Description rdf:about="http://semanticlog.blogspot.com/">
<mydomain:所有者>Sein</mydomain:所有者>
</rdf:Description>
</rdf:RDF>


RDFではSeinとSemantic Logとの関係性を明示的に表現できる。これにより機械が自動で分析しやすくなるというわけだ。RDFの重要点としてRDF SchemaがあってこれなしではRDFを半分も説明したことにならないので注意。

最後に断っておくが、RDFはXML形式で表記する必要はない。

次回はRDF Schemaを中心に。

ラベル: , , , , ,

Semantic Web (セマンティック・ウェブ) 入門1

Semanticとは「意味論的」という意味。Webで広く使われているHTMLは人間が読んで理解するには向いているが、機械が内容を理解するには向いていない。そこで、Semantic Webが提案されている。

ではどうやって機械が理解できるようにするのか。具体例で説明すると
[HTML]
<ul>
<li>Windows</li>
<li>Linux</li>
</ul>

[Semantic Web]
<software>
<os>Linux</os>
<os>Windows</os>
</software>

HTMLではタグはレイアウト情報に用いられる。一方Semantic Webではタグは意味付けに用いられる(正確にはレイアウトにも使用されうる)。上記の例ではLinuxとWindowsがソフトウェアの一種であるOSなんだと機械が判断できる。

Semantic Webにより機械がWebを人間のように理解できるようになるというのは誤解だ。所詮はHTMLよりSemantic Webのほうが機械がデータを分析しやすいといった程度だ。データを分析するロボット、エージェント等のアルゴリズムの性能にも強く依存する。

ではSemantic WebとXMLはどう違うんだという疑問が出てくる。このあたりは次回エントリーで。

ラベル: ,

2008年1月9日水曜日

iPod TouchでDVDを観賞する。

iPod Touchはメディアデバイスとしてとてもよくできている。音楽はもちろん動画を観るのにも快適だ。そこで、DVDすなわち映画一本をiPod Touchで観れたらいいな~と思い、調べてみた。Windows環境が前提だが、簡単に環境を整えることができた。すべて無料だ。手順は
  1. DVD ShrinkでDVDをISOイメージ化
  2. HandbrakeでMP4に変換、字幕も指定可能
  3. iTunesに取り込む
  4. iPod Touchに同期
ガジェット村:DVDをiPod Touchで観る」に詳しいので以上。ちなみに変換後のファイルサイズは映画一本で約1GB。

ラベル: , , , ,

Semantic Log開設

Semantic Logがオープン!

興味のあることは何でも取り上げていこうと思います。

  1. コンピュータ言語
  2. ガジェット
  3. 読書
  4. ネット
などなど。