昨日、Web サーバに WWW::Search モジュール、拙作 WWW::Search::Namazu2 をインストールし Namazu メタサーチ CGI も準備万端。手元でもきちんと動作している。
で Web サーバ上に CGI プログラムをセットアップ。 入力ページもきちんと出た。 が、検索させると結果がでない。 Apache のエラーログを見ると……Out of memory!
無限ループかなにかに落ちるところはないんだけどなぁ……。 いろいろコネクリまわしたが、Out of memory! は解消できず。 WWW::Search モジュールを手でいじって、使わないモジュールのロードをおさえたりすると、ちょっと先まで進むようになるがやはり Out of memory!
モジュール間の相性でメモリを食いすぎている……なんて事もないだろうなぁ。
$ulimit -a cpu time (seconds, -t) unlimited file size (512-blocks, -f) unlimited data seg size (kbytes, -d) 524288 stack size (kbytes, -s) 65536 core file size (512-blocks, -c) unlimited max memory size (kbytes, -m) unlimited locked memory (kbytes, -l) unlimited max user processes (-u) 4115 open files (-n) 8232
の限界を越えたか? サーバのメモリはさすがに使いきってないようだし。 バーチャルサーバだけに1プロセスがメモリ食いすぎると(他人にされると自分も)困るので理解できるが、ちと苦しいなぁ。
「Perl をやめる」という案は「Perl モジュールの開発」と相反するから却下。
本サイトは容量100MBなのだが、(プログラムインストールしたり、ログがあったりで)結構容量も埋まってきた。 ということで、コンテンツで比較的容量を食っている Photo Galleryの画像データを順次、プロバイダの「ユーザホームページサービス」に移すことに。
WWWブラウザで「HTMLと画像が同じサーバ上にないとブロック」する設定にされちゃうと見れなくなるがいたしかたないか。
以前から、「そのうち移さねば」とは思っていたのだが自作メンテツールの改造も必要だったのでなかなか手つかずになっていた作業。 ちょちょっとツール修正。汚なくハードコーディングとかしてごまかす。
しかし、ホスティングサーバ 100MB に対してプロバイダのユーザホームページサービスが追加料金なしで 50MB。 ホスティングサーバ、もっとサービスしてくれないかな。
来月OCNエコノミー回線を利用していたWWW/DNS/SMTPサーバをADSL回線側へ持っていくため、同時にサーバも新しく設定しなおすことに先日決まったのでそろそろ準備を。
最低限RAID1ぐらいを組んでおこうといろいろ検討したのだが、Debian GNU/Linux を使って安価にATAハードウェアRAID組めるカードが見つからず(FastTrak TX2000は管理ツールがWindows用しなないようだし、RockatRAID 133 は Debian GNU/Linux で使っているという情報がほどんどないし)。
で結局ソフトウェアRAIDにすることにした。
(7200rpm, UltraATA/100, FDB) 80GB を2台。 購入。
以前私が開発用 Windows BOX として使っていたPCをサーバにあてることになっている。 フタを開けて2台はいっているHDD(13GB と 60GB)を抜いて買ってきた Deskstar と交換。 内蔵ベイのディスク交換のためベイごと抜かなければならないので面倒。
インストールCDでブート。HDD発見できず。 実はHDDはもともと ATA66カードで接続していたので(CD-ROMはオンボート)、このままでは認識しないと。 メニューから一旦 shell に入って、
cat /proc/pci
で、
Bus 0, device 13, function 0: Unknown mass storage controller: Promise Technology Unknown device (rev 1). Vendor id=105a. Device id=4d38. Medium devsel. IRQ 10. Master Capable. Latency=64. I/O at 0x1440 [0x1441] I/O at 0x1434 [0x1435] I/O at 0x1438 [0x1439] I/O at 0x1430 [0x1431] I/O at 0x10c0 [0x10c1] Non-prefetchable 32 bit memory at 0xe8000000 [0xe8000000].
と出たので、
boot: linux ide0=0x1440,0x1436 ide1=0x1438,0x1432
でブート。これでめでたく認識。 ここで今日はそろそろタイムアウト。 続きはまた明日。
PAR といえば Perl スクリプトを実行可能ファイル(Windows なら EXE 形式ファイル)に変換するモジュールとして有名である。
ちなみに実行可能ファイルを作成する部分はは PAR 0.97 より PAR-Packer パッケージに分けられ、PAR 自体はインストールしやすい pure Perl なパッケージになっている。
PAR が提供するもう一つの(こちらが本来はメイン?)機能は、プログラムの実行時に必要な Perl モジュールを PAR ファイルと呼ばれる Perl モジュールアーカイブファイルからロードする機能である。 XS モジュールなどもコンパイルすることができるどこかの環境で1度ビルドして PAR ファイルにしておけば、同じアーキテクチャのホスト上でそのまま利用することができる。
ロードしたい PAR ファイルはファイルパスだけではなく URL でも指定することができ、必要な時にオンデマンドでフェッチさせることができる。 これを使えば Perl プログラムの集中管理可能だ。
PAR 0.951 からは PAR リポジトリというコンセプトが追加され、パッケージ毎に作った PAR ファイルをサーバ上(あるいはローカル)のリポジトリに蓄積してオンデマンドでロードできるようになった。
個別に PAR ファイルを指定する従来の方式に比べてかなり便利そうである。 ということで試用してみた。
まずは
あたりをインストールし準備 OK。
最初に PAR-Repository に含まれている parrepo で。
parrepo create -r /tmp/PAR
PAR リポジトリファイルの中にはデータベースファイルが作成されるが、これは DBM::Deep というアーキテクチャ非依存のものを使っているので、Linux でも Windows でもどちらからでもアクセス可能である (つまり Linux 上でリポジトリをメンテできるということだ)。
次に必要な PAR ファイルを作成する。 作成したいパッケージを展開してビルドし、blib ができている状態で PAR::Dist を使ってパッケージ化する。
perl Makefile.PL make make test perl -MPAR::Dist -e blib_to_par
例えば ActivePerl*1 上で WWW-Mechanize-1.20 を PAR ファイル化すると
WWW-Mechanize-1.20-MSWin32-x86-multi-thread-5.8.8.par
というファイルが作成される。
普段から ActivePerl で必要なライブラリは基本的に自前で PPM パッケージ化して、動作確認した上で PPM リポジトリに蓄積するようにしているので、合わせて次の手順でパッケージを作ることになる。
perl Makefile.PL nmake nmake test perl -MPAR::Dist -e blib_to_par make_ppm
PAR ファイルができたら parrepo でリポジトリに登録する。
parrepo inject -r /tmp/PAR -f xxx.par
例えば先ほどの WWW::Mechanize がリポジトリに登録されている状態で
#!/usr/bin/perl use PAR { repository => 'file:///tmp/PAR/' }; use WWW::Mechanize; my $mech = WWW::Mechanize->new; $mech->get('http://www.example.com'); print $mech->content;
というスクリプトを書いて実行すると、PAR リポジトリから WWW::Mechanize がロードされて正しく実行される。
ここでリポジトリを Web サーバへアップロードして、repository のところに URL を指定するようにすることもできる。 例えばリポジトリを http://www.example.com/PAR/ に配置したとすると
#!/usr/bin/perl use PAR { repository => 'http://www.example.com/PAR/' }; use WWW::Mechanize; my $mech = WWW::Mechanize->new; $mech->get('http://www.example.com'); print $mech->content;
と書き換えることで、インストールしていない WWW::Mechanize を使用できるようになる。
先ほどの Perl スクリプトを get_top_page.pl という名前で保存して pp で実行可能ファイル化する。
pp -o get_top_page.exe -M PAR::Repository::Client get_top_page.pl
とすれば get_top_page.exe という実行可能ファイルが作成される。 WWW::Mechanize はオンデマンドで http://www.example.com/PAR/ からフェッチされるので、アップデートが必要な場合は新しい PAR ファイルを作成してリポジトリを更新するだけでよい。 EXE ファイルを作成しなおして利用者に配付しなすといった作業も不要だ。
さらには実行するスクリプトをも PAR リポジトリに置いておくことが可能だ。
例えば WWW-Mechanize に含まれている mech-dump をオンデマンドにフェッチして実行する実行形式ファイルは以下のコマンドで作成できる。
pp -o mech-dump.exe -M PAR::Repository::Client \ -e "use PAR { repository => 'http://www.example.com/PAR/', \ run => 'mech-dump' }"
ActivePerl では PPM があるとはいえ、普通のユーザにちょっとしたプログラムを使ってもらうのに「ActivePerl をインストールして、PPM パッケージをインストールして、……」というのは手間すぎる。
pp で プログラムに必要なものを全てバンドルした実行形式化ファイルにするという方法ももちろんあるのだが、頻繁にアップデートするようなスクリプトの場合には、起動のための部分だけ pp で作成しておいてあとは PAR リポジトリで集中管理するというのもちょっと魅力的である。
Twitter の following をがっつり整理した。
「フォロー通知を受けた人」や「follow している人の @ 相手」や「Blog などで Twitter していると知った人」などについて add することはよくあるのだけれども、remove する機会は多くない。 たまに follows リストの上から順に見ていって「もう飽きちゃって放置状態の人」なんを remove したりするぐらい。 しかし「もう飽きちゃって」の人はもう発言していないから、自分のタイムラインには影響がなかったりする。
フォロー通知を受けてひとまず add してみた人から、逆にその後 remove されて片想い状態なんかも結構多そうだ。 それとフォロー通知を受けた時にひとまず様子見にしてしまった人ももう追加することはまずなかった。
最近話題になっている follow 数上限にひっかかるまではまあいかないのだけれど、たまには見直しておくか。
を使ってみた。WWW::Scraper は Debian パッケージがないようなので、dh-make-perl してインストール。
で実行してみたところ、片想いが百数十人、片想われは spam もいて二百数十人。 follwing、followers が 六百人台だったで相思相愛は半分ぐらいって感じか。
片想いはある程度思い切って減らした。 現在の数は以下。
これでタイムラインの雰囲気はどう変わるかな?
連動して Google リーダーへの Blog のフィード登録も整理できるといいんだけれど、さすがにそれは無理か。
Twitter のアイコンを更新する Perl スクリプト (記事) が最近失敗することが多くなった。 どうやら同じファイル名の画像をアップロードするとうまく更新されないようなので、日時にもとづいたファイル名にしてからアップロードするようにしてみた。
最初に作った時から若干 Twitter のページ構造が変わってスクリプトも修正していたので、それと合わせると下記になる。
今のところ順調にアイコンチェンジできている感じだ。
#!/usr/bin/perl use strict; use warnings; use WWW::Mechanize; use File::Temp qw(tempdir); use File::Spec; use File::Copy; die "no file name" if @ARGV == 0; my $file_name = $ARGV[0]; my $name = 'ユーザ名'; my $password = 'パスワード'; my $mechanize = WWW::Mechanize->new(); $mechanize->get('http://twitter.com/'); die unless $mechanize->success; $mechanize->submit_form(form_number => 2, fields => { 'session[username_or_email]' => $name, 'session[password]' => $password} ); die unless $mechanize->success; $mechanize->follow_link(url => '/account/settings'); die unless $mechanize->success; $mechanize->follow_link(url => '/account/picture'); die unless $mechanize->success; my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time); my $tmpdir = tempdir(CLEANUP => 1); $file_name =~ /.*(\..*)$/; my $suffix = $1; my $tmp_file_name = File::Spec->catfile( $tmpdir, sprintf("%04d%02d%02d%02d%02d%02d$suffix", $year + 1900, $mon + 1, $mday, $hour, $min, $sec )); copy($file_name, $tmp_file_name) or die $!; $mechanize->submit_form( form_number => 1, fields => {'profile_image[uploaded_data]' => $tmp_file_name} ); die unless $mechanize->success;
[ WWW::Mechanaize ]
mixi日記でつぶやくようにしたり Web 日記を書いたら Zapier を使ってmixi日記でつぶやくようにしたり最近しているのだけれど、ホーム画面内での日記の先頭部分表示だとハイパーリンクがある事がわかりにくいので、絵文字も使ってみることにした。
WWW 黎明期はリンクを表すシンボルは地球を含む図案が多かったけれど、今は鎖のような図案やサイト外へ出ていくイメージの図案が多くなった。今はもう world wide は当たり前になったということかな。
左腕の長いロボ。
— Naney (@Naney) August 8, 2019
RICOH GR III HiBW #GR #GRIII #GR3 pic.twitter.com/13Pt2fuBzX
Naney (なにい) です。株式会社MIXIで SNS 事業の部長をしています。
※本サイトの内容は個人的見解であり所属組織とは関係ありません。