AutoPagerizeの設定復習

AutoPagerizeの設定をする方法を復習がてらにScientific Americanの記事に対して設定してみようと思う。

ちなみに、以前作ったAutopgerizeのSITEINFO。アイテム: My epub library : Bookworm ePub reader - データベース: AutoPagerize - wedataと、アイテム: book : Bookworm ePub reader - データベース: AutoPagerize - wedata。前者は変更が作った後に第三者によって加えられていた。はじめてコラボレーティブなことを体験したかもしれない。一応自分で作った物なので、かなり復習しやすいと思うので、参考にしながら作る。

まずWikiを読みはじめる、AutoPagerize Wiki: About SITEINFO (ja)

と同時に、前回はSITEINFOに書きこんで反映されるのに一日程度掛かるという事実を知らずに作りはじめて少しうーん、なかなか反映されないなぁと試行錯誤してしまった経験を生かして、ローカルでやる。というわけで、GreasemonkeyautopagerizeスクリプトEmacsで開いた。

var SITEINFO = [
/* sample
{
url: 'http://(.*).google.+/(search).+',
nextLink: 'id("navbar")//td[last()]/a',
pageElement: '//div[@id="res"]/div',
exampleUrl: 'http://www.google.com/search?q=nsIObserver',
},
*/
/* template
{
url: '',
nextLink: '',
pageElement: '',
exampleUrl: '',
},
*/

]

このようなものがあるので、そこに記述していく。

項目の上から考えていこう、url;はどういう内容になるだろうか。urlには対象のurl(文字列)にマッチングするを正規表現で作ってやればよい。Heat Exhaustion: Has the Adelie Penguin Met Its Match?: Scientific Americanこれが今開いている適当なScientific Americanの記事である。もうひとつLong Live the Web: A Call for Continued Open Standards and Neutrality: Scientific AmericanがScientific Americanの為にSITEINFOを書くかと思った理由であるティム・バーナーズ・リーの記事。

http://www.scientificamerican.com/article.cfm?id=has-the-adelie-peguin-met-its-match
http://www.scientificamerican.com/article.cfm?id=long-live-the-web

まぁ、適当に作ろうと思うので(よいこのみんなはまねしちゃ駄目だぞ)二つに共通するものであればおkなわけで。
http://www.scientificamerican.com/article.cfm?id=はどのページでも大体共通だと思われる。それ以降は任意の文字列らしい。

http://www.scientificamerican.com/article.cfm?id=has-the-adelie-peguin-met-its-match&page=2
ちなみにこれが2ページ目の文字列である。あまり問題なく正規表現でなんとか出来そうな気がする。

^http://bookworm\.oreilly\.com/(?:library|page)/
^http://bookworm\.oreilly\.com/view/
この2つが前回作成したものである。

それを参考に作ってみると、
^http://www\.scientificamerican\.com/article\.cfm\?id=
といった感じだろうか。?部分の前に\をつけてみたがどうだろう。必要だろうか。おそらく?は正規表現 - Wikipediaによると量化の符号であるらしいので必要だと思われる。で、urlの部分はこんな感じでいいのではないだろうか。とりあえず違ったらまた戻ってこればよい。進もう。

次にnextLink:である。これにはXpathを使う。ついでにpageElement:もXpathを使うので同時並行的にやっていこう。exampleUrl:もすぐに指定できるのでとりあえずAutopagerizeがそのSITEINFOで動く例となるURLであればよい。http://www.scientificamerican.com/article.cfm?id=long-live-the-webを指定しよう。

url: '^http://www\.scientificamerican\.com/article\.cfm\?id=',
exampleUrl: 'http://www.scientificamerican.com/article.cfm?id=long-live-the-web',
が確定した。url:の方は確かめていないので未確定だが。

では、Xpathを使用するnextLinkとpageElementの指定に入る。

nextLink //a[text()="next →"]
pageElement //table[@id="bw-library"]

nextLink //span[@class="bw-next"]/a
pageElement //div[@id="bw-book-content"]

という以前作ったXpathがある。結構難しかったんだこれが。正直Xpathをどうやって覚えたのかは忘れた。かなりのサイトを調べた記憶がある。正直Xpathにはそれなりの勉強を要した。そして勉強方法を忘れたw肝心なところを覚えていない最悪である。とりあえずぐぐりまくったのは確か。

//というのがあるが、基本Xpathというのは根構造?木構造?樹構造?XML Path Language - Wikipediaによると木構造。であって、//をつければなんか要素的なものに飛べるようになるってことらしいんで便利なので使うのですぞみたいな感じなことを思い出した。//ってのはおそらく省略構文ってやつかな。後、SITEINFOに載っているほかのAutopagerizeの設定を見ながらXpathについて学んだ記憶がある。実際そうしてほぼ実践的に試行錯誤しながら作った。

簡単な例を示す。

* //a[@href='help.php']

この例では、[@href='help.php'] の部分が述語である。 このXPath式は、href 属性をもち且つその属性値が 'help.php' である、全ての a 要素ノードを指定する。

まぁ、こんな感じなのである。

では、実践的に作っていこう。
ちなみに、この実践的に作っていくのとこういう感じでGreasemonkeyで色々するようなときとかサイトの何かを調べるときはFirebug使いまくる。おいらもSITEINFOを作るときにこれまたぐぐりまくってFirebugとそれなりに親しくなりました。これも大変でしたが。どう覚えたのかは記述していないという完全なる愚作。XpathFirebugが入る時点でなかなか難しかったんですよぼくにははい。というわけで今から俺用メモということにして自分だけわかればいいか。というかそうなってしまう。

<a href="article.cfm?id=has-the-adelie-peguin-met-its-match&amp;page=3" linkindex="152">Next&nbsp;></a>

的な部分が、Scientific Americanの記事におけるNextLinkらしい。
さらにそのコードの前後もみて見るが、対象に出来そうな部分はないようだ。というわけでNextのところを使う。
前回作った、下記を参考にする。

nextLink //a[text()="next →"]

//a[text()="Next >"]
だろうか。ちょっと不安である。$nbsp;の辺りがガチで。

だが次に進もう、pageElementを作る。
Scientific Americanの記事のページの場合、コメントを表示している部分があるのでそれより上となるだろう。

<div id="articleContent">

というガチヒットっぽいところがあったのでそれでやってみよう。
これも前回作った下記を参考にする。

PageElement //div[@id="bw-book-content"]

//div[@id="articleContent"]
となりそうである。

よし、一応これで全て必要なものはでそろったので、Greasemonkeyの方に記述してみる。
templeteを埋める

/* template
{
url: '',
nextLink: '',
pageElement: '',
exampleUrl: '',
},
*/

{
url: '^http://www\.scientificamerican\.com/article\.cfm\?id=',
nextLink: '//a[text()="Next >"]',
pageElement: '//div[@id="articleContent"]',
exampleUrl: 'http://www.scientificamerican.com/article.cfm?id=long-live-the-web',
},

となった。とりあえずこれでセーブして、ページのリロードを掛けてみる。どうだろうか。

ふむ、どうも駄目である。url:からして機能していないようだ。右上にAutopagerizeが動くページです的な■が出てないことからもわかる。

いや、でもどうなんだ、それだけじゃないっぽいぞと思いやはりurlをヒットしやすいものにして、nextLinkを疑う。これだと2ページ目までは表示される、そしてpageElement:も成功であることがわかった。で、何故かこの状態で全文表示されてしまう。なんぞwww

{
url: '^http://www\.scientificamerican\.com/article',
nextLink: '//a[text()="2"]',
pageElement: '//div[@id="articleContent"]',
exampleUrl: 'http://www.scientificamerican.com/article.cfm?id=long-live-the-web',
},

にっちもさっちもいかなくなったのでSITEINFOにてtext()で検索を掛けて実例を確認。こう変更したら動くようにはなった。

nextLink: '//a[contains(text(),"Next")]',

ただ、これだとNextっていう文言のリンクは全て拾ってしまうようだ。なので、divを前につけてpagenation的なidがついてたからそれで制御しようと思う。SITEINFOの他の例もそうしている。

<div id="articlePagination">

となっているので、これを使おう。Xpathでは上の階層なので前につければよい。

nextLink: '//div[@id="articlePagination"]/a[contains(text(),"Next")]',

最終的にこうなった。後はurl:の確認をしていく。

ふーむどうも駄目だなぁ。

{
url: '^http://www\.scientificamerican\.com/article\.cfm\?',
nextLink: '//div[@id="articlePagination"]/a[contains(text(),"Next")]',
pageElement: '//div[@id="articleContent"]',
exampleUrl: 'http://www.scientificamerican.com/article.cfm?id=long-live-the-web',
},

url:はここまでで諦めよう。延長していったんだが、?より先id以降がどうも駄目だ。まぁこれでもいいだろう。おかしなページを食って変な挙動をすることはおそらくないはず。
というわけで、最終的にこうなった。終わり。バーナーズリーの記事でも動いてるしおk。SITEINFOに登録しておく。done.
アイテム: Scientific American - Article - データベース: AutoPagerize - wedata

と思ったら、SITEINFOをぐぐってみたら、既にScientific Americanの項目があった、だがそれは動いていないようなので修正を掛けておくことにする。

なんか人のを修正するのは気が引けるがしょうがない。

アイテム: Scientific American - データベース: AutoPagerize - wedata

というわけで、これが自分の修正したものである。exampleUrIはエゴで変えた。とりあえず動くと思うが、SITEINFOがGreasemonkeyAutopagerizeに反映されるまではあんまり自信ないw
あぁ、Cacheの削除がGreasemonkey版は出来たんだと思って削除して試してみた。おk動いた。問題なし。

It's All Text with Emacs導入記録

とりあえずIt's All Textをダウンロード・インストール。

おう、なかなか迷ったぜ。だが、解決した。
自分の環境Windows 7のEmacs23では簡単な既知のバグ的なものがあったらしい。

まずEmacs Clientというものを動かしておいて、それに関与させてファイルを開けば、一々新しいフレームを作らずに新規ファイル的なものを現在開いているEmacsに渡せるということを理解していた。

Emacs Wikiにそれなりのボリュームの文章があった。全部は読まなかったが一応少しは目を通して見た。
http://www.emacswiki.org/emacs/EmacsClient

>>EmacsClient allows one to open a file for editing in an already running Emacs. Because it doesn’t start a new Emacs instance at each invocation, you can setup EmacsClient as the default editor, e.g. in the environment variable EDITOR or VISUAL. EmacsClient is part of and works only in conjunction with GNU Emacs. The program GnuClient provides the corresponding functionality for XEmacs, but also works with GnuEmacs.

とのことである。ただ、Gnu Clientがどういうものなのかどちらが優れているのかというのはいまいちわからなかった。多少は調べてみたんだが。でもなんとくEmacs Clientを使えばいいんでしょ的なにおいを感じ取ってEmacs Clientを使うことに。というか、自分の環境、C:\Program Files (x86)\emacs\23.2\binではGnu Clientどこにあるの状態。WindowsEmacsを入れてる人はまずemacs.exeを起動してみてなんだこのコマンドプロンプトが出てくる謎の実行ファイルはと思って次回から現在に至りrunemacs.exeを使用しているに違いない。僕がそうだからだ。emacs.exeの詳細については未だにわかっていない自分。

emacsclient.exeとemacsclientw.exeというのはありますね。で、どちらを使えばいいのかまずわからない。ちなみに解決を終えた後にこれを書いているが、何故emacsclient.exeがあるのかこれも未だにわかってない。一応は簡単に調べたんだが。結果的に言うと後者のemacsclientw.exeのwがついている方を使った。ここでもwの方はアイコンがついててなんとなくそれっぽいというにおいがするんだが結局何もわかってないのでまぁそんなことはどうでもいい。ただ、解決策のみを記す。

まず、自分が実践したのは、ぐぐること。これ基本。最近基本を忘れがちだから困る。Firefoxアドオン It's All Text! と Emacs を一緒に使う - 檜山正幸のキマイラ飼育記を読むことと、the-sourceのメモ帳 it's all textを読むこと、EmacsWiki: Emacs Clientを少なからず読むこと。

で、読み終えた後に、(server-start)をC-x C-eで評価してみた。上記の僕の環境ではエラーが出ました。ちなみにエラーウインドウはqで消せる。
で、エラーが出ても問題ないだろと思いつつ進めてみることにしました。具体的にはIt's All Textの方から設定でエディタを色々指定してみて試して見た。んで、一通りrunemacs.exe, emacs.exe, emacsclient.exe, emacsclientw.exeと試してみて駄目だということがわかる。

んで、Emacs Wikiに書いてあったバッチファイル経由で起動する方法を試してみる。

Create an emacs.bat file in your Emacs “bin” directory. (Perhaps something like “\Program Files\emacs-23.1\bin” if you’ve used an installer.) Add the following commands:

@echo off
"%~dp0emacsclientw.exe" -na "%~dp0runemacs.exe" "%1"

ちなみに下記よりは上記の方が優れている様だ。
>>“\emacs-22.3\bin\emacsclientw.exe” --alternate-editor=”\emacs-22.3-bin-i386\emacs-22.3\bin\runemacs.exe” “%1”
とりあえずバッチファイルを作ったので、バッチファイルを実行して試してみたり、It's All Textからバッチファイルを指定して試してみたり。それなりには動いているようだが、やはりサーバーとして動いてないのが問題らしい。というわけでエラーの解決に向かう。

エラーの解決。
エラーメッセージでぐぐります。
>>The directory ~/.emacs.d/server is unsafe
Emacs - Error when calling (server-start) - Stack Overflowと、Stack Overflowのスレッド的なものが出てきます。機知のバグだったんですね。
一番上のbricad氏のAnswerを試してみようと思いますが、server.elに>>(eql (nth 2 attrs) (user-uid))というラインは見つかりませんでした。
次のgavecoa氏のAnswerをどう試せばいいのかまずわからなかったのですが、とりあえず.emacsおいらの場合はinit.elに記述して再起動してみたがエラーは引き続き出ました。user1603氏のAnswerも同様の反応。
其の次のRealitiyMonster氏のAnswerでHitしました。

I found this solution on EmacsWiki:

"The problem is the ownership of the directory ~/.emacs.d/server when you also have “Administrators” rights on your account. Create the directory ~/.emacs.d/server and set the owner of this directory to your login name and the problem is gone. As I have a “Dutch” version of Windows 7 I don’t know the English terms exactly but here’s the procedure:

Click R-mouse on ~/.emacs.d/server and select “Properties” (last item in menu). From Properties select the Tab “Security” and then select the button “Advanced”. Then select the Tab “Owner” and change the owner from “Administrators (\Administrators)” into “ (\”. Now the server code will accept this directory as secure because you are the owner.

Hope this helps for all you guys, it solved the problem for me anyway.

W.K.R. Reutefleut"

It definitely works on Vista, with Emacs 23.2.1.

というわけで、~/.emacs.d/serverのフォルダの権限を変更しました。いまいち本当にこれ変わったのか?とわからなかったですが、おkだったみたい。serverフォルダを右クリック→プロパティ→セキュリティタブ→詳細設定→所有者タブ→編集→所有者の変更で自分のユーザー名を選択状態にして選ぶ→OK→OKを押して開いていたプロパティのウインドウを閉じていく。こんな感じで変更が加わって大丈夫だったっぽいです。まぁ、いまいちなんとも変わってるのかこれ?と思いつつやってましたが、今確認のため開いてみたら一応所有者が変わってました。

で、その状態で(server-start)をC-x C-eで評価。今度はエラー出ませんでした。で、その状態でIt's All Textで.batファイルに渡すと性向しました。終わりです。文字うって保存してFirefoxのテキストエリアの方に変更が加わるか試してみてください。終わり。

(server-start)については.emacsに加えて起動時に実行する必要があるのかは不明。なんか加えなくても大丈夫な気がするのでとりあえず様子をみます。(server-force-delete)というコマンドがあることは発見したが、それを評価しない限りは別に再起動しても大丈夫じゃないかなぁ。サーバー(サーバーモードなのか?)が終了していない感じがする。

        • -

ていうか、It's All Textって文章をテキストフォームから引っ張ってこれるのは知ってたんだけど、どうやってその文章をEmacsで記述した後、Firefoxのもとのフォームに返すの?まさか手動でコピペなの?何かコマンドがあるのかなぁと思ってたりしてみたが、何気なくC-x C-sにて保存してみたら保存に合わせてフォームに記述内容が送られることが発覚。おぉーすげえ。はじまったな。
しかも、これ保存したらそのウインドウがアクティブにでもなるのかと思ったら全くそうではないらしい。凄く便利だ。
関係ないけど、この形式で書いた文章をおそらく全部RoamingのFirefox、It's All Text下に置いてて消してるのかまだ調べてないけどおそらく調べてないのでセキュリティ的にあれかもしれない。まぁそれがセキュリティ的に問題にならないようにFirefoxはランダムな文字列でProfiles下のディレクトリをくくってるみたいだけど。

それと、はてなでは?それとも自分の環境では?編集ボタンの位置を左上に変えたらボタンが押せて使えるようになった。とりあえず開いていたキーバインドにC-^として設定したのでボタンを使うかは不明だが。これで設定は終了した。

今後の動き

とりあえず、Remember The Milkを常に開いて、それをみつつ活動する。
本当の仕事をしているかどうか、どれだけの質・量を実施しているかで判断する。
魂の休息も必要。それはなんであるか?Twitterやニュース速報・ニュースである必要はない。むしろそれ以外で探したり検索したり心がワクテカしたり、未来のことを考えられたりそういうものを探すべきだ。皇帝の心とか読みたい。

はてなダイアリー お知らせ削除完了のお知らせ

Stylishをインストール。

以下のURLに従う、Stylish 用ユーザースタイルシートの作り方

作成したUser Style Sheet。

Delete Hatena Oshirase

@namespace url(http://www.w3.org/1999/xhtml);

@-moz-document url-prefix("http://d.hatena.ne.jp/debiandebian/") {
.notice-container {display:none !important;}
}

ついでに、Wikipediaの創設者からの言葉も消しておいた。慣れればかなり簡単だった。

色々

タスク管理とか

英語

Emacs Addoon Firefox

とりあえずRTMをタスク管理として使っていくことにする。今後は開きっぱなしにする。

サブタスク的なものをRTMは用意してないがなんでもかけるNoteはあるので、そこに先頭行にProcessのPと書いて後はプロセスを書いていくことにする。
あまり大きなタスクになったなと思ったらタスク化して分割すればよい。

                                                              • -

Done.

RTMをLaunchyに登録の諸々のタスク。

お知らせを消す

                                                      • -

とりあえずはてなダイアリーのお知らせが相当うざいんだがhatenaを使っている以上は我慢しよう。また消すスキルがないことを恥じるのみ。