本日の予想最高気温21度。奥鬼怒と約20度違うのかと思うと異常だ。いつもより湿度もあるような感じ。なんとなくナマヌルイ風で落ち葉が舞い落ちる中、自転車通勤。
無茶苦茶眠くなってきた。ぬくいから?
ビックカメラには新型 iBook のカタログがなかった。でも、現物はあったので触ってきた。CD-ROM モデルは、やっぱり白い。でも、どちらかというと従来のカラーの方が好きなので、CD-ROM モデルはありえないな。G3/700 で MacOS X ってどうよ?と思ってたけど、アプリケーションの起動に関してはそんなにストレスは感じないかも。まぁ、あんまり速いマシンを触ってないからかも知れないけど。
「ガーターじゃなくガター」ちうのもそうだけど、「ボーリングじゃなくボウリング」の方がそれっぽいかなぁ、とか。goo の国語辞典ではこんな感じ。
最近、テキスト主体な Web ページの印刷に、w3m + a2ps を使っている。
$ w3m -dump -cols 80 http://suzuki.tdiary.net/ > hoge.textてな感じ。Vine 2.1.5 オリジナルの a2ps だと、半角が全角の 1/2 ではないようなので、/usr/share/a2ps/encoding/euc-jp.edf を編集すれば良い。
$ a2ps -f6 hoge.txt
# Compose font for japanese EUC codeというのを、こちらで知った。
# target font additional font width size rate
#DefaultComposite: Ryumin-Light-EUC-H 1.0 1.1
# 1:2 fixed
DefaultComposite: Ryumin-Light-EUC-H 1.0 0.8333
「OHP(俺のホームページの略)」はオススメ。
PostgreSQL の名前にひかれて記事を読んでみた。OLAP とは「オンライン分析処理」のことらしいのだが、全然そういう言葉を知らなかった。。。
ソースの方は来年の2月を目処に公開予定とのこと。出たらどんなものなのか試してみたい気もするけど、クライアント環境が Java なのか。どっかに遊べる実行環境を作らないとダメだな。公開された時にまた考えよう(弱)
iPod を FireWire ディスクとしてマウントすると、/Volumes/[iPod の名前] でターミナルからアクセスできる。
で、ソコをなんとなく探っていると、iPod_Control/Music/Fnn(n は 0〜9)といったディレクトリ内に、MP3 やら AAC やらのファイルがそのまま入ってた。普通にはアクセスできない領域に保存してるのかと思い込んでいたんだけど、単に Finder から見えなくしてるだけなんだね。
面白いのは、同じタイミングでリッピングした同じアルバムでも別の Fnn ディレクトリに保存されていること。同一ディレクトリに保存しない利点って何かあるんだろうか?
あと、ターミナルで日本語(だと思われる)のファイル名がうまく表示できないみたい。iTerm で、UTF-8 とか Shift_JIS とか試してみたけどダメだった。
詳細は第三 tDiary.Net の Wiki で。
来ました、新ザウルス。基本スペックは SL-C760 と同じという想像通りのマイナーチェンジ。しかし、USB ストレージ方式に対応したってとこは、Mac 環境での利用に一歩前進。なにもインストールせずにファイル転送が可能になるってことだよね?
あとは Palm と同じように iSync でシンクロできれば楽なんだけどなぁ。。。
インタビューの2ページ目に
「薄く、軽く、カッコいい。そのためには何でもやろう。言葉を掛け合うまでもなく、全員が共通の意識で動いていた」
という開発者の言葉がある。薄くて軽いのは認める。ただ、どうもいまひとつカッコ良くない気がするんだけど、それって僕だけ?
PHP 4.2.0 より前はマルチバイト正規表現を使うために「PHP4 用正規表現拡張モジュール mbregex」を用いていた。ここでの正規表現関数のひとつに「mbereg」があった。PHP 4.2.0 以降に本家に組み込まれたときに他の関数との名付けルールに基づき「mb_ereg」と改名された。このとき下位互換性のために「mbereg → mb_ereg」のエイリアスが作られ現在に至っている。僕の記憶が確かなら。
で、PHP 4.1 時代に作ったソースに「mbereg」を使っていたんだけど、そのソースを PHP 4.2 系でそのまま稼働させていた。そして、ハマリ発生。
<?php $str = "abc"; if ( mbereg("b",$str,$match) ) { print "hit : " . $match[0] . "<br>"; }
上のソースを PHP 4.2 系で走らせると、実行結果は、
hit : hit : b
のようになる。ちなみに PHP 4.3.0 でも同じだった。試してないけど、最新の 4.3.4 でも同じではないだろうか?
まぁ、既にマニュアルに載らないようになって久しい関数なので、正しく動かなくても仕方ないのかもなぁ。
またハイパーリサーチのハガキが来たのかと思ったら、別のトコからだった。調査主体は東京都生活文化局で、委託された調査会社が送ってきたみたい。
オレってば、住民基本台帳から無作為に選ばれた3,000人のうちの1人らしいんだけど、、、住民基本台帳から選ぶって方法は、もう辞めた方が良いんじゃないのかなぁ。いくら調査元が公的機関とは言え、なんだか怪しさを感じてしまう。
それにしてもオレが「住民基本台帳から無作為」に選ばれる確率って高くないか? なんか選ばれやすい表記になってるのかなー。
天気が良いのに家にいるのもなんだなぁと地図をパラパラ。そうだ、井の頭公園に行こうと思ってバタバタと仕度。ひさびさの自転車行。家を13時くらいに出発。山手通りから折れて東北沢駅を通り過ぎ、井の頭通りを通って代田橋駅を通過、神田川とぶつかったところで川沿いの道をひたすら上って行った。
神田川沿いの道に入ってすぐのところにあった鉄塔。今日気が付いたのだが、オレって鉄塔好きみたいだなぁ。見かけると、つい撮影してしまう。今日もコレの他に数枚あった。。。
川沿いにあった八百屋で「焼き芋始めました」というポスターをみて買ってみた。この量で200円は安い。半分で満足だったんだけど、冷めちゃうと美味しくなくなってしまうと思って、その場で1本完食。うまかったが、マンプク過ぎ。
で、15時くらいに辿り着いた井の頭公園。そこにあった神田川の源流。コレを見てみたくて井の頭公園を目標にしたのだが、、、過去に見たことあったよ。すっかり忘れてた。井の頭公園には何度か行ったことあったもんなぁ。
井の頭公園を一周した後、そろそろ日が落ちてきていたのでさっさと帰ることに。「行きと帰りで同じ道はつまらん」というコダワリにより、帰りは久我山駅から別の道で行くことに決めた。
久我山駅に着き、計画通りに道を折れ、太陽に向かって自転車をコグ、コグ、コグ。「今は夕方。太陽は西。じゃ、方向はOK!」と思って進んでたら、三鷹という文字が。で、ここでようやく「西じゃ逆方向じゃん!?」と気が付いた。
それまで通っていた人見街道を逆に戻って久我山駅に戻って、、、とは行かず、「行きと帰り論理」によって、途中から別のルートへ。思いっきり住宅街を通りつつ、なんとか環八へ出た。そのまま世田谷通りまで行き、最後は池尻大橋から山手通りに戻って18時ころ帰宅。
ひさびさの自転車だったんで疲れた。
おととい注文したT-FALの圧力鍋が届いたので、さっそく使ってみた。圧力鍋自体を使うのも初めてなので、同梱されていたレシピ冊子をパラパラめくって、簡単そうだし、作ったこともある「肉じゃが」をチョイス。最初なんで、レシピ通りに作った方がいろいろな意味で安全だろうと考えたのだが、材料の欄には「豚ばら薄切り肉」と書いてある。
へ?、肉じゃが言うたら、牛肉やろ!
とは思ったものの、「いや、待て今回はレシピ通りに豚肉で。。。」と気持ちを抑えて買い物へ。スーパーで、じゃがいもやら人参やらしらたきやらを買い揃えて調理スタート!
と、今度は、レシピに人参やしらたきが書かれていないことに気づいたのだが、「えぇぃ、入れてやる!」とばかりにレシピからはみ出すことにした。だったら牛肉にしてても良かったよなぁ。
作り方自体は、ほぼレシピ通りに。と言っても、炒めて煮るだけだったけど。強火で4分ほど煮立てると蒸気が出てきたので、弱火に変えて10分ほど。で、できたのが、コレ。
じゃがいもが思いっきり煮くずれてしまった。ちょっと時間かけ過ぎたのかも。あと、きぬさやを買うのを忘れていて、色合いがイマイチだったり。味の方は、、、どうなんだろう、フツーに食えたので、自分用としては合格点か。
Elasticsearch の情報をいろいろ探しているうちに「Elasticsearch ウェブクローラー 基本編」という記事に出会った。
全文検索のエンジンのくせに、自分からデータを取りに行ってストアするとか面白いことするな!と思ったんだけど、全文検索が故にそういう用途のニーズも多いんだろうな。
ということで、この日記に対してクローリングを行なって、全文検索できるような仕組みを作ってみる。
Elasticsearch や Kibana は「Fluentd + Elasticsearch + Kibana での解析の構成を考える」あたりで構築したものを流用する。
基本的には、前述の「ウェブクローラー基本編」の記事をほぼそのまま踏襲させて頂いたのだけど、若干変更してみたところもあるので、こちらにも記録しておく。
Web のクローリングを実現するには、2つのプラグインを Elasticsearch へインストールする必要があるとのこと。
% sudo /usr/share/elasticsearch/bin/plugin --install org.codelibs/elasticsearch-quartz/1.0.1
-> Installing org.codelibs/elasticsearch-quartz/1.0.1...
[snip]
Installed org.codelibs/elasticsearch-quartz/1.0.1 into /usr/share/elasticsearch/plugins/quartz
% sudo /usr/share/elasticsearch/bin/plugin --install org.codelibs/elasticsearch-river-web/1.3.1
-> Installing org.codelibs/elasticsearch-river-web/1.3.1...
[snip]
Installed org.codelibs/elasticsearch-river-web/1.3.1 into /usr/share/elasticsearch/plugins/river-web
プラグインをインストールしても、実行中の Elasticsearch は認識してくれないので再起動してやる。あまり詳しく調べてないけど、restart
だとうまく起動してくれなかったので、stop
と start
の方が安全なのかな?
ここら辺は、実運用するとなったら気にしたいところ。
% sudo /etc/init.d/elasticsearch stop
[ ok ] Stopping Elasticsearch Server:.
% sudo /etc/init.d/elasticsearch start
[ ok ] Starting Elasticsearch Server:.
プラグインを認識しているかの確認。_cap
API でプラグインの情報を確認すれば良いようだ。
% curl -XGET 'http://localhost:9200/_cat/plugins'
X-wing WebPlugin NA j
X-wing QuartzPlugin NA j
WebPlugin と QuartzPlugin という名前が見える。無事にインストールされた様子。ちなみに X-wing
というのは、この実験をしている Elasticsearch の node 名なので深い意味はない。
Elasticsearch のインデックス名(DB 名みたいなもの)は、webindex
にした。タイプ名(テーブル名みたいなもの)は、suzuki_tdiary_net
にした。
本当なら日本語記事のアナライズ用に kuromoji を入れるべきなんだけど、ここでは省略。たぶん、後でやり直す。
% curl -XPUT 'http://localhost:9200/webindex' -d @mappings.json
{"acknowledged":true}
クローラー用の設定を作って投入する。
設定用に JSON ファイルを作った。
いろいろ試行錯誤にアクセスログを見ながら気がついたのは、JavaScript や画像ファイルもクロールしようとしていたこと。なので、excludeFilter
で /image/
や /js/
を外したりした。
あと、ちょっとハマったのは、schedule
の設定。River Web の GitHub リポジトリに「Cron format to start a crawler.」と書かれていたので、普通に書いたつもりだったんだけど、どうもうまく動かなくて悩んでいた。
で、Quartz プラグインの Cron Format のページをよくよく見てみると、最初に「Seconds」というフィールド名が書かれていた。秒も指定できるのね。。。
Linux の cron には秒の指定が無いので、いつものように「分 時 * * *」という設定をしていたつもりで「秒 分 * * *」を指定していたのであった。
% curl -XPUT 'http://localhost:9200/_river/suzuki_tdiary_net/_meta' -d @river.json
{"_index":"_river","_type":"suzuki_tdiary_net","_id":"_meta","_version":1,"created":true}
URL に pretty を付けても _source
の部分は綺麗にしれくれなかったので、コマンド出力結果の JSON を Emacs の M-x json-mode-beautify
を使って加工している。
% curl -XGET 'http://localhost:9200/_river/suzuki_tdiary_net/_meta?pretty'
これで指定時刻にクローラーが suzuki.tdiary.net へアクセスしに行くはず。これはアクセスログを見て、UserAgent が Elasticsearch Bot (suzuki.tdiary.net)
のアクセスの有無で判別できる。
Elasticseach 側にデータが入っているのかは、_cat
で count
を見てみると良いのかも。
% curl -XGET 'http://localhost:9200/_cat/count/webindex?v'
epoch timestamp count
1415795152 21:25:52 204
なんらかのデータは入っているようなので、今度は <title>
に elasticsearch
という文字列が入っているデータを検索してみる。
% curl -XGET 'http://localhost:9200/webindex/suzuki_tdiary_net/_search?q=title:elasticsearch&fields=title&pretty=true'
ちゃんと返ってきた。
これで Elasticsearch で Web クローリングができることは確認できた。ちなみに、クローリング中のプロセス状況を見ていたんだけど、特にクローラーのプロセスが立ち上がる訳ではないようだ。
netstat
で suzuki.tdiary.net へのアクセスを確認したところ、Elasticsearch Server と同じプロセスから通信が行なわれていた。プロセスじゃなくスレッドの世界なのね。
それから、このクローラーが以前インストールした mod_evasive に DoS 判定されたので、DOSWhitelist
の設定に Elasticserver が動いている IP アドレスを追加した。
なんとなく動いたので、後は kuromoji を入れて、日本語の検索を賢くしたりすればいいかな。もうちょっと続けていじってみよう。
場所はTOHOシネマズ新宿。IMAX 3D版で。
サンフランシスコに行ってた時に観たので、今回が2回目。ただ、向こうで観た時には、ろくに英語を聞き取れずにいたので、登場人物たちの会話が楽しめたのは今日が最初になる。
細かい会話は分かっていなくても、ストーリーの大筋は分かっていたので、「次はこういう流れだな」というのは分かる。その分は驚きがなくて残念ではあった。でも「あ、ここではこんな会話をしていたのか!」という発見ができたのは良かった。
「あれがバーンってなって、これがグーンと来て、結局ドカーンとなる」のは分かってるし、もう観なくていいかなと少し思っていたけど、観に行って良かった。特にカークとスポックとの会話には意味があったので、この感覚を知らずに次作を観るのはもったいない気がした。
映画そのもののの満足度としては、まぁ、普通なんだけど、観た意味はあったので良かった。
▽ はづき [札幌の今日の最高気温は15.6度。昨日は8度ぐらいあってあったかかったです。]
▽ はづき [そして明日の天気は雪、予想気温最高3度、最低-1度・・・]
▽ トモコ [ほなセクシーじゃなくてセクシィかしらん。<違 ところで、ちゃんとガターっていいますか?私はガァタァと言ってしまう…。]
▽ すずき [マイナスな世界かぁ、いいなぁ。。。で、意識して言ってますよん>ガター]
▽ mu [http://www.alloha.info InsuRancE http://www.devonanal.com ..]