2011/02/24

.NET用のオープンソースなHTMLのパーサー : Html Agility Pack

かくかくしかじかでHTMLの解析をする必要があったのでけれど、
.NETにはXMLのパーサーはあれどもHTMLのパーサーがないので
なんかいいものがないかと探していたところ、
なかなか良さげなツールを見つけたのでそのメモ。

ちなみに、
System.Windows.Forms.HtmlDocument ってのもあるけれど、
WebBrowserコントロール経由でないとインスタンスを取得できないとか、
InternetExplorerに依存しているとか、
InternetExplorerのバージョンによって影響されるとか、
HTMLの文字列だけほしいのに画像までダウンロードしてくるので遅くて重いとか、
まぁ、もろもろの問題があるので使えない。

で、今回の本題はこっち。
Html Agility Pack
http://htmlagilitypack.codeplex.com/

.NET向けのHTMLパーサーです。
オープンソースでフリーのライブラリ。

使い方について
あんまり情報が見つからなかったので
その辺について。

まずはじめに1つ。
using HtmlAgilityPack;
と書くと、
System.Windows.Forms.HtmlDocument と曖昧な参照になってしまい
コンパイルエラーになるので、
using hap = HtmlAgilityPack;
とかしておいた方がいい。

基本的に、HTMLの解析には、
HtmlAgilityPack.HtmlDocument
というクラスを中心に使用します。

HTMLのソースは、たとえばこんな感じで取得する。
System.Net.WebClient web = new System.Net.WebClient();
string htmlSource = web.DownloadString(url);
ほかにも、ブラウザでソースを表示させてコピペとかいろいろ方法はある。

HtmlAgilityPack.HtmlDocument html = new HtmlAgilityPack.HtmlDocument();
html.LoadHtml( htmlSource; );

これだけで、ソースのロードは完了。

html.Load( url );
で、URLからダウンロードしてくることも出来るっぽい。

あとは、XPathという、XMLの特定の要素を指定したりするための言語を使って
目当ての要素を取得する。
XPathの詳細はgoogle先生に任せるとして、

HtmlAgilityPack.HtmlNodeCollection tags = html.DocumentNode.SelectNodes( xPath );
とすれば、該当するタグのコレクションが取得できる。

XPathは、たとえば、

HtmlAgilityPack.HtmlNodeCollection ulNodes = html.DocumentNode.SelectNodes( "//ul" );
とすれば、ページ内の
<ul> ~</ul>
でくくられた部分を一通り取得する。
さらに、

HtmlAgilityPack.HtmlNodeCollection liNodes = ulNodes[0].SelectNodes( ".//li" );
とすると、最初の<ul></ul>内の
<li></li>要素のコレクションが取得できる。

HtmlAgilityPack.HtmlNode li = html.DocumentNode.SelectSingleNode( "//ul[1]/li[2]" );
で、1つめの<ul></ul>内の
2番目の<li></li>要素を取得したりとか、

HtmlAgilityPack.HtmlNode td = html.DocumentNode.SelectSingleNode( "//table[1]//td[3]" );
で、1つめの<table></table>内に出現する3つめの<td></td>を取得したり。

HtmlAgilityPack.HtmlNode a = html.DocumentNode.SelectSingleNode( "//a[0]" );
string linkUrl = System.Web.HttpUtility.HtmlDecode( a.GetAttributeValue( "href", "" ) );
で、ハイパーリンクのアドレスを取得したりもできる。

逆に、
HtmlNode.XPathプロパティからXPathを取得することもできる。

つまるところ、XPathをうまいこと指定してやることで、
簡単にほしい情報をHTMLから引っこ抜いてこれる。

2011/01/25

Windows Live Mail が起動しない...

唐突に、Windows Live Mail が起動しなくなった...orz
起動すると、ウィンドウが開いた直後に落ちる。
一瞬だけウィンドウの中身が表示されて、
直後にウィンドウ内が真っ白になり、
「Windows Live Mail は動作を停止しました」とメッセージが。
それ以外はエラーメッセージも何もない。

・・・と思ったら、何度も起動を試してみると、
たまーに何事もなく起動したりもする。
何が起きているのやら。

Webで検索してみると、
Windows Update が、なんかよからぬことをしてる、
っていうのがすぐに見つかったので、
その噂の "KB2454826" を探してみたが
更新プログラムの履歴にはそんなのないですよ...?
最近インストールされたとおぼしき更新を
アンインストールしてみても、改善しない。


まぁ、Gmali をメインに使ってるから、
Windows Live Mail なんぞぶっ壊れても、
何とでもなるっちゃなるんだけど・・・。

2010/12/23

ディスプレイ acer GD245HQ

このあいだも書いたが、
NVIDIAの3D Vision 対応のディスプレイがほしかったので、
acer GD245HQ を購入。

で、その感想。

正直なところ、微妙。

テキスト表示がやや見苦しい。
画面を直接デジカメで撮ってみた。
(そのままだとどうも見にくいので、わざとぼかしてある。)

左がacer GD245HQ、右が同じくacerのH233H。
GD245HQは変なシャープネスがかかったような表示になっていて、
場合によってはかえってゴーストみたいな変な効果が出てしまっている。
これがテキスト表示が見苦しい原因。

もう一点。

3D Visionを使ったステレオ表示で、
コントラストが高い部分でクロストークが目立つ。
仕様では、応答速度が2ms(GTG)らしいので大丈夫だと思っていたのだが・・・。
ここでちょっと算数。
120Hzだと、1フレームあたりの表示時間は
1000[ms] / 120[Hz] = 8.333[ms]
これに対して画面の書き換えに2ms(ぐらい)かかるので、
2[ms] / 8.333[ms] = 0.24
1フレーム分の時間のうち、24%(たぶんそれ以上)が
画面の書き換えに使われていることになる。
さらに、「2ms」というのはGTG なので、
表示される色・輝度などによっては2msよりも遅れる。
つまり、1フレーム中、1/4ぐらいの時間はディスプレイの書き換え待ちになる。

・・・と考えると、
多少クロストークが見えそうだというのも想像がつくし、
むしろ、応答時間が2msというのが、
まだまだ遅すぎるようにも思えてくるわけで。
まぁ、最近の液晶技術はこんなもんだ、といえばそれまでなのかもしれないが。

(2011.01.02 追記)
どうも、クロストークが見える原因はディスプレイではなく、
メガネの遮光が完全ではないことが原因のような気がしてきた。
つまり、
メガネのシャッターが閉じていているのに、
そのシャッターがすこーし透けている、と。

画面に表示された絵の明るい部分だけで
クロストークが目立っているように見えるし、
物理的に板(シャッター)が開閉しているのではなくて
所詮は液晶シャッターなので完全に不透明ってわけでもなさそうだし。

2010/12/18

Quadro で NVIDIA 3D Vision な OpenGL のプログラムを作る

3Dグラフィクスで遊んでいるからには
やっぱり、最近はやりのステレオ表示が気になるわけで。

(「3D」っていうと、ポリゴンな「3Dグラフィクス」のことなのか、
それとも「立体視」のことなのか紛らわしい、と思う今日この頃。)

ってことで、思い切って
3D対応のディスプレイ(GD245HQ)と
NVIDIA 3D Vision (アクティブシャッターの付いたメガネのアレ)を購入し、
ステレオ表示環境をそろえてみた。
(ディスプレイについてのレビューは、またそのうち、ってことで。)

で、そうなってくると、
OpenGLのステレオバッファを使って
自分でステレオ表示ができるプログラムを作ってみたくなるのだが、
GeForce系ではステレオバッファがサポートされておらず、
実質的にはQuadro系のグラフィックボードを使うしかない。
ということで、つづいてQuadro 2000を購入。
Quadro高いよ・・・。

ってなことで、
OpenGLでステレオバッファを使ってステレオ表示する方法を調べてみた。

→プログラム側でやること
  • まずは、レンダリングコンテキストを作成するときに
    ピクセルフォーマットでスレテオバッファを指定。
  •  で、右目用、左目用のシーンを
    glDrawBuffer() で BackLeft, BackRight を指定して
    左目用バックバッファと右目用バックバッファそれぞれに描画する。
  • wglSwapBuffers() を呼べば
    BackLeft, BackRight 両方いっぺんにフロントバッファに
    転送されるので、そこはあんまり気にする必要は無いっぽい。
→PC側の設定
 NVIDIAコントロールパネルで設定する必要があるのが少々めんどくさい。
  •  NVIDIAコントロールパネルの「Manage 3D setting」内、
    「Program Setting」タブで、「Add」ボタンをクリックしてビルドしたプログラムを選択。
    (Visual Sutudio のデバッグで実行する場合は、~.vshost.exe を選択する。)
  • でもって、その下のリスト(Feature - Setting のリスト)で、
    「Stereo - Display mode」 を 「Generic active stereo (with NVIDIA IR Emmitter)」、
    「Stereo - Enable」 を 「On」
    に設定する。
これで、プログラムを実行するとステレオ表示になって
同時にメガネのアクティブシャッターもONになるはず。
DirectXだとフルスクリーンにしないとステレオ表示できないが、
OpenGLだとウィンドウ表示でもステレオ表示できるみたい。
(ただし、Windows Aero がOFFになる。)

ちなみに、OpenGLの場合は
IR Emitter(メガネの同期用の赤外線送信機)の
On/Offスイッチと、裏のホイールは機能しません。
なので、プログラム側でステレオ表示のOn/Off機能とか
奥行き感の調整機能とかを用意しないといけないようだ。

あと、右目・左目のシーンを描画するときに、
左右の視点の位置のずらし方をうまくやらないと不自然な見え方になってしまうので、
このへんもプログラム側で工夫しないといけない。

2010/11/23

トラックボール M570 を使ってみた

実はトラックボール派で、
普段はLogicoolのTM-250を使ってるのだが、
ふとAmazonを眺めていたら
Logicoolから親指でボールを転がすタイプの
トラックボールの新機種がいつの間にやら発売されていたようで、
なかなかよさげなので早速買ってみた。
↓ これ。


トラックボールにしてはやたらと売れているようで、在庫切れらしい。
Amazonで注文したら2~3週間してやっと発送されてきた。

で、使ってみた感想。

ワイヤレスなのだがレシーバーもかなり小さく、
USB端子の金具にちょいと出っ張りが付いているぐらいのサイズで小さい。
受信感度は良い。

ボールの感触もそこそこ良い。
最初は多少滑りが悪い感じもするが、
少し使っていればすぐになめらかに動くようになる。
まぁ、これはTM-250でもそうだったし、
最初だけなので問題はない。

微妙なのがホイール。
回転がキシキシいっていまいちだ、というのがもっぱらの評判だが、
確かにそうかもしれない。
が、まぁ、これもしばらく使っていればそれほど気にならなくなる。

第4,5ボタンの位置もなかなか使いやすい。
といか、このボタンが追加されたのがTM-250との最大の違いだと思う。
結構便利です、これ。

全体としてのできはなかなか良いのではないかと。
たしかにこれならやたら売れてるのも納得できるかもしれない。
まだ使い始めて間もないのでよくわからんが、バッテリーの持ちも
良いようなので、その辺の不便さもなさそうだし。

ただ、一つ、個人的にはホイールがカタカタうるさいのが気にくわないので、
ちょっとばらして、その辺がどうにかならないか試してみた。

ネジが6角の星形(たぶん直径1.5mm)の特殊な形状だったり、
電池ボックスの中に隠しネジがあったりで少々開けるのがめんどくさい。

ケースを開けてみればわかるが、ホイールをカチカチいわせているのはバネ。
だが、これをどうにかするためにはホイールを
外さなければならないのだが、これまた少々外しにくい。
ピンセットか細いマイナスドライバーとかが無いと外せないかも。
フレームを外側に引っ張って少しゆがませて
ホイールをケースの内側方向に押し出すようにして割と強引に
外す必要がある。

ホールを外してちょいとバネをホイールの内側方向に曲げてやると
ホイールへのあたり方が加減できる。
(ただし、曲げすぎるとホイールに当たらなくなってしまうので注意。)
バラしたついでにグリスなんかをホイールの軸につけておくと、よいかも。

これで気にくわなかったホイールも何とかなったので、
とりあえず満足です。

2010/10/09

OpenTK 1.0 リリース

OpenTK 1.0 が、やっと「RC1」がとれてリリースされたようだ。
時々OpenTKのサイトのForumsをのぞいていたのだけれど、
特にレンダリングコンテキストの初期化まわりでの問題が
レポートされているのをよく見かけたので、
だいぶ安定性が良くなったのではないかと。

さて、
ぼちぼちGLSharpのほうも
いじり始めますかな・・・。

2010/09/27

グラフィックボードを交換してみた。

GeForce 8600 GT → GTX460 に。
(CUP : Core i7, OS : Windows 7 32bit)
GTX460の推奨電源は450Wと書いてあったので、
今の電源が500Wでぎりぎりかなー、と思ったが、
やってみて不安定になるようなら電源も交換すればいいか、
とか適当なかんじでやってみた。

ドライバは共通なようなので、アンインストールとかせずにそのまま。
単にボードを差し替えただけ。
ちなみに、補助電源用の電源4ピンx2→6ピン変換コネクタが
ボードに付属してました。

ボードの交換後、起動。
起動すると、Windows Aeroがオフになっていて
おや?と思っていると、新しいデバイスを検出したとか、
ドライバのインストールが完了したとか、
再起動しろ、とか、メッセージが出てくるので、
いわれるままに再起動。
今度はWindows Aeroも有効になっているし、
NVIDIAコントロールパネルも正常に機能している様子。
以上、完了。
非常にあっさりと終了。

BIOHAZARD5とかが高画質設定で
サクサク動くのがなかなか楽しい。