五十音順ソート
五十音順でソートしたいと。いや 趣味は読書SNS で、せめて著者ぐらいは五十音順で並べたい、とずっと思いつつ、だった。JIS順てなにそれ機械の都合、なんだよなあ。
とはいえ、perlにしろpostgresqlにしろ、ひらがなカタカナアルファベットの「よみ」をつけないと五十音順は無理。
基本的にメンテフリーのつもりなので、わたしが登録される本を一冊ずつ見て「よみ」をつけて回るのは無理だし不可能。
基本的に入力項目は極力少なくしたいので、入力してくれるユーザー側に「よみ」の入力を促すのは却下。
とにかく「気楽さが最優先のSNS」だ。
で、せっかくサーバーのスペックも多少上がったことだし、kakasiを使うことにした。
kakasi -JH -KH
なんだけど、utf8に対応してないっぽい。…もしや、と思って検索したらCPANにText::Kakasiモジュールがあったので、インストール。ありがたいことにperlのEncodeを使ってutf8で使える。
さっそく「よみ」のテーブルを作ってごにょごにょ。そのままでも変換はかなり優秀だ。とはいえ「よみ」の修正もできるように管理画面にもあれこれ。
今までのメモリ512Mだとすぐにスワップ…ていうか常になにかしらスワップしてる状態だったけど、今度のメモリ2Gはスワップする気配すらない。無理してメモリ積んだだけのことはあったなあ。しみじみ。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
サーバーログ監視と自分メモその3
どうやら無事に稼働してるっぽい自宅サーバー、牛丼大盛りつゆだく号だ。とりあえずそこそこ快適なレスポンス。メモリをおごっただけのことはある、のかな。
で、稼働したばかりだしここ数日はapacheのログファイルの監視・チェックをこまめにやっていて、妙なアクセスとか豪快なクロウラーに気づく。
apacheのアクセスログ。
XXX.XX.XX:25なんてのがあった。なんでhttpで25番portなんだ?ぶっちゃけこれは謎。maillogやmessagesを覗いても同時刻にメールが動いた気配はない。whoisをみるとこのドメインはカリフォルニアのIPアドレス。アクセスしてきたのは台湾のIP。うううむ。なんだろ。
Baiduspiderという中国版google百度というサイトのクロウラーが豪快というか。そんなしょっちゅうこられても、そんな頻繁に更新してないし。おまけに、地引き網を始めると1秒ほでの間隔で片っ端からもっていく。わたしのサイトはほとんどがCGI。いちいち全部もっていくとかなりのページ数になるし、そもそもサーバーに負荷がかかる。今まで放置してたけど、今回はwhoisで調べて百度が使ってると思われるIPアドレスはすべて却下にした。中国のひとが金町のもつ焼き屋情報を欲しがってるとは思えないしなあ。
掲示板への広告スパムが相変わらず激しい。該当の掲示板は削除してあるのにかなりの頻度でやってくる。で、問題なのが、削除した掲示板はデータベースがらみでmod_perl2のスクリプト。こいつにアクセスされると、そんなファイルはありませんよ、と返事するのはmod_perl2なのだ。これはメモリの無駄遣いでしかない。ので、apacheのmod_rewriteで応答してもらうようにした。
wide charですよ、というutf8がらみの警告もなかなか取れていない。原因はわかっていて、SNSの方はutf8にしたけどこっちはまだeucとutf8が混じった状態なのだ。全部utf8にしたほうがいいんだけど、仕事が始まって、帰って食って寝るだけの平日、時間がほとんど取れないんだよねえ。今日もzaurusで電車内ネット…しょぼいよなあ。
てな感じで、アクセス制限をちまちま追加。
ネットワークやサーバー管理に関する知識を少しはまともに仕入れておかないとなあ。入り口のルーターで一部のportしか通さないはずだけど、意味不明のログが残ってると、不気味だぞ、としか対応できないのはいかがなものか。
でも、サーバーもperlもおもしれーっすよ
[2007/01/12 23:27:41]
なんで25番なのか、気持ち悪いのでapacheのログをもう一度チェック。リクエストがPOSTでもGETでもなくCONNECT。なんじゃそりゃと検索したらproxyとのトンネリングをどうのこうの、と。
…えっと、こいつは踏み台探しだ。カリフォルニアに用事でもあるのか。妙なアクセスがあるなあと思ったらほとんどが台湾のHINETなんだよなあ。
CONNECTを却下するとどんな影響があるのかわかってないので、今回もIPで弾くことにする。httpd.confのDenyばかりがやたら増えていくのは困ったものだ。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
utf8移行と自分メモその2
で、 趣味は読書SNS は、utf8環境となった、のかな。今まで全部eucだったんで、実際どんなところに影響するのかまだ把握できてない。jisにsjisにeucにutf8に、と。4つも違う文字コードがあるのっておかしいんじゃね。と語尾をちょっと上げてみる。utfに収斂されていく勢い、と思ってもどこかのベンダーが妙な拡張してまた違うコードが出てきたりして。
てのはともかく。
今さらだけど perl5.8は。
出入りするデータはただのバイト列として扱う。utf8を扱うにはutf8フラグを立ててperlにこれはutf8として扱ってね、と教える必要がある。encoding とか use utf8 なんかがフラグ立てに使われるらしい。
今後推奨されるのはスクリプトをunicodeで書いて use utf8 する書き方だそうだ。そうするとスクリプト内の文字列には utf8フラグがつくのでなにかと便利、なのかな。
わたしが混乱したところ。
文字コードとしてのutf8とperlのutf8フラグは「また別」。
postgresqlから取り出したばかりのutf8の文字「根性」とスクリプト内のutf8フラグの立ったutf8文字列「根性」をそのまま比較しても意図した通りにはならない
取れたての「根性」 != スクリプト内の「根性」
となる。取れたての「根性」にはutf8フラグが足りないのだ。
Encode::decode('utf8',「根性」)などと「根性」にutf8フラグをつけてやれば
「根性」==「根性」
となる。それじゃせっかくだしprintしてみるか、と「根性」を出すと wide char うんぬんと脅される。utf8フラグのついた文字列を表に出すとケチをつけられるのだ。
Encode::encode('utf8',「根性」)とやって今度はutf8フラグを落としてやると警告は出なくなる。
勘違いしてたんだけど、utf8フラグというのはperlの内部のフラグ。
これをくっつけて出力するわけではない。
リダイレクトすれば普通に「文字コード」utf8で書き込まれるだけ。データベースへのinsertも同じこと。
Encodeのdecodeとencodeてのは。
「jis、sjis、euc、utf8」で書かれた文字列にutf8フラグをつけるのがdecode(その文字列がどのコードで書かれているのか教えてutf8フラグをつける)
utf8フラグがついてしまえば自由自在でごにょごにょ。その後表に出すような時にエクセルで読むからシフトJISでお願いと言われたらencodeで「jis、sjis、、euc、utf8」に変換する。この時utf8フラグも落とすので上のwide char うんぬんの警告は出ない。
decodeでutf8フラグをつけて、内部処理が終わったらencodeでutf8フラグを落としましょう、ということかな。
unicodeで書かれたスクリプトにutf8フラグをつけると変数名に「日本語」が使えたりする。
use utf8
my $気合=10:
while($気合--){
print Encode::encode('utf8','喝');
}
喝喝喝喝喝喝喝喝喝喝
となる。スクリプトがわかりやすいぞ。
my $除夜の鐘=108;
my $鐘の音='ゴーン';
my $おやじギャグ='カルロス';
というのを見るだけでなにをしようとしてるのか分かるでしょ。
て、ネタを続けるのはうるさい、な。
postgresqlからselectなりで読み込んだらdecodeする必要がある(全部が全部というわけじゃないけど)。スクリプトのあちこちに散らばるselectを探していちいちdecodeなんちゃらと書き込むのは勘弁してほしい。ので検索してみると、decode encode のための wrapperを自前で作るひともいたけど、perl DBI DBD-Pgと postgreql だと connectしたら
dbh->{pg_enable_utf8}=1
で text と varchar のフィールドから取り出すものに関してutf8フラグをつけてくれる。ありがたい話だ。
今までのスクリプトをほとんどそのまま使える。ただ、wide char うんぬんの警告がうるさいこともあるんで、utf8::is_utf8(文字列) でutf8フラグがついてるかどうかをチェックするようにした。
cgiのformでの文字コードの扱いでもひっかかる。
いやutf8にしたいんだけど、と。
文字コードを変換するためにEncode::encodeを使うにはEncode::decodeでutf8フラグをつけてやる必要がある。ところがdecodeにはその文字列がどの文字コードで書かれているか教えてやる必要がある。
冒頭に書いたように流れてくるコードはjisだなんだで4種類。どのコードなのかわからないので推測するしかない。文字どおりGuessというのがあるんだけど、試しに「アイウエオ」とだけかいたファイルをeuc、sjis、jisの3種類用意して試したところ'shiftsiji or euc'というエラーで死ぬ。ネットで見てると、Guessはできるだけつかわないでね、と。弱ったなあと思いつつ駄目元でJcode.pmを同じファイルに使ってみたところちゃんと判定するじゃありませんか。…???。Encode.pmのwrapperになってるはずなので、結果は同じ(判定に失敗)と思ってた。
ここはありがたくJcode.pmを使わせていただくことに。
標準入力から受け取ったら、
Jcode::convert($str,'utf8')
と文字コードをutf8に。(互換のために参照渡しでもいいけど、参照渡しにする必要はないっぽい)多分文字コードを変える時にutf8フラグを落とすので、Jcodeで文字コードを変えたら
Encode::decode('utf8',文字)と、utf8フラグをつけてあげる。
もしかするとperlIOで上記の手間は不要かもしれないなぁ。
んで、urlエンコードする場合はutf8フラグを落としてやらないと、エンコードされす、日本語なんかがそのまま流れることになるので要注意。
昨日に続いて長文連載。どうせ忘れるに決まってるから、こうやってあちこちに自分メモ、だ。
こっちのページもutf8に移行するかなぁ。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
小心者の日曜日だ
Excelの手作業部分を潰せないかと日曜だというのに仕事がらみのスクリプト。小心で、真面目な性格が損をする、という典型だ。とほほ。
my @head = split(/,/, $header);
my $import_head = { map{ $_ => ''} @head };
カラムが50以上あるんでいちいち書くのは面倒。どうしたもんか、と思ってふと思い出したのが先月まで行ってた賽の河原仕事でみたスクリプト。
perl4までの知識で止まってるんで map なんてほとんど使ったことがなかった。こうやって一発でハッシュを初期化するのに使えるんだなぁ、と。
ほんとはDBD-Excelを使ってExcelファイルを直接いじりたいところだったんだけど、今日はもう力つきた。(DBD-csvなんてモジュールもあった)おいおいやっつけていくべか。
で、上記作業はすべてWINDOWS上。
active perl に skk に windows版kakasi に、エディタはxyzzy(…xyzzyがなければどうなったことやら)事務所のパソコンには windows版apache もインストールしたけど、さすがにウチでそこまでやる必要もないよなぁ(2台のFreeBSDでapacheは走ってるし)
まわりはみんなビシバシWINDOWSを使いーのExcelを使いーの…。くどいようだけど。世間様はデフォルトでExcelのスキルを要求するものだったのか。今さらながら、ちょっと愕然。
たぶん、間違いなくこの後は、phpとかmysqlとの格闘が出てくる。perlとpostgresqlの組み合わせはマイナーだったかもなぁ(ため息)
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
東京都立図書館
趣味は読書SNS に絡めて 東京都の図書館蔵書横断検索 というのが使えるかも、と画策してたのが前回までのあらすじ。えーっと伏線は追加記入分ね。
!/usr/local/bin/perl
use LWP::UserAgent;
my $ua = LWP::UserAgent -> new;
my $url_root = 'https://metro.tokyo.opac.jp/';
my $url_post = $url_root . 'cgi-bin/j12crs2.cgi';
my $que = 'sitechk001049=on&isbn=439663059X&srchmode=2&';
my $req = HTTP::Request->new(POST => $url_post);
$req->content_type('application/x-www-form-urlencoded');
$req->content( $que );
my $res = $ua->request($req);
my $str = $res->as_string;
print $str;
↑これだけで、葛飾区の図書館を対象に、楢山芙二夫『非情の追跡』探してくる。ヒットしたら収蔵する図書館へのリンクと書誌詳細へのリンクが出てくる。ので、今度はそのリンクを開いてGETすれば詳しい情報も取れる。
問題は。とってきたHTMLを睨み倒して、必要なところを自動的に切り取るスクリプト。
わたしのトップページに、さりげなくかつわざとらしく、フジTVめざましテレビの星占いを貼り付けてあるけど、これも同じようなやり方(この頃はLWPなんて便利なモジュール知らなかったんで、socketだのbindだのガシガシと)やはり、番組改編なんかで、HTMLのデザインが変わるだけでアウトとなる。
東京都立図書館というパブリックサーバントがやってるんだから、納税者の利便を考えてXMLとかテキトーな統一規格(APIというんだっけか)にして欲しいなぁ。
臨時雇い派遣の身ながら、仕事がまだ回ってこないのでヒマ。いちんち中ぼーっとテレビみてボケていく定年後のオトウサン状態。
なもんで、ちっとうろついて見つけたのが
https://knezon.knecht.jp/
↑これ。クネゾンというんだけど、これがすごいのひとこと。
図書館のデータというのは全国の図書館でバラバラの形式。もう蓄積もされてるんで、いまさら全国統一形式にするのは無理っぽいらしい。
ところがこのクネゾン。そのバラバラの形式を個別に対応してプログラムを作り、検索サービスを提供しているのだ。こういうのを見せられると(そのポリシーも含めて)素直に脱帽。かっこええっすよ。
とりあえず。東京都に関しては都立図書館に頑張ってもらえれば、そこを橋頭堡に都内の図書館を検索してごにょごにょできそう、かなぁ。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
タイプミスとか古い街とか
趣味は読書SNS で、取れないバグに血迷い、ポリシーに反してMacを買ったのが前号までのあらすじ。
Macの改行コードを疑い、Safari、Mac版IEのバグを検索し、もしかするとcssがからむのか検索しなおし…どうやってもヒットする気配すらない。「textareaで改行がうんぬん」モロにヒット、これだよ探してたのは、と思ったら自分のページでがっくり。
昨日は早く帰ったんで、弁当箱Mac miniを立ち上げ、まじめに検証してみた。
あるページのテキストエリアで改行が消失する。
ソースを表示させると改行は生きている。
Macの改行が問題ならほかのページでも改行は死ぬはずなのに、そっちは問題なし。てことは、同じルーチン使ってるフォーム取得でバグはない。
出力する時に念のため改行をUNIXのLFからMacのCRに変換したところで変わりない。
むむむむ。手詰まり、と頭に血が昇りつつ、ふっとCSSとのからみもあることを思い出し、今度はスタイルシートをチェック。font-familyを設定してみたり幅を極端に変えてみたり。
それもハズレ。
該当ページは入力のためのフォーム・テーブルを2種類出力する。それがなにか影響してんのか、と問題の箇所を含むひとつだけ出力させたら、改行がしっかり生きてるじゃありませんか。
こいつをふたつ表示させても改行は生きてる。
てことはこの上に表示させてるもうひとつのフォーム・テーブルが問題。…やっとつきとめた。
犯人を特定していよいよ大団円。関係者を暖炉のある広間に集めて得意満面の図、です。
一行ずつ追っていったところ。
初めて目にするHTMLタグ。
…こんなタイプミスぐらい大目にみてやってくれよぉ。WINDOWSは優しいのに。細かいことをいうおまえの方が悪い。
selectの閉じタグが見当たらないままtextareaがくるとこうなる。たぶん改行を許さないタグを閉じないでtextareaがくると改行が殺されるんじゃないかと。
Macがどーたら、Safariがどーたら、と他人を疑う前にまず手前ぇの眠い腕を疑えという教訓の74800円でありました。とほほ。
話が無駄に長くなったんでついでに長くしておくと。
今、臨時雇い最末端要員としていってるのが、墨田川にかかる勝鬨橋の真ん前。中央区って銀座とか八重洲のイメージしかなかったけど、古い街で下町だったんだなぁ。
高層ビルが立ち並び空を切り取る陰に、平屋かせいぜい二階建の木造の古びた民家がひしめく。杖やシルバーカーのお年寄りがゆっくり歩く横を、セキュリティチェックの札をぶら下げたサラリーマンOLが抜き去っていく。表どおりに面したビルの一階のあちこちにコンビニがあるんだけど、ちょっと路地を覗くと納豆や煮付けが単品で並ぶ食堂もある。
古いところと新しいところが極端で、面白い絵面があちこちに広がっていた。あちこち工事中で、高層ビルがさらに増える気配なので今のうち。ひさしぶりにピンホールカメラかプラモデルカメラの出番だ。
考えてみりゃ、中央区って東京湾に面してるわけだから、古くからの街だよなぁ。
[09/26 18:12:07]
長くなったついでにもういっちょメモ
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
my $url = 'ttp://hehehe/hoho.cgi';
my $query = 'key=val&key=val';
my $req = HTTP::Request->new(POST =>$url);
$req ->content_type('application/x-www-form-urlencoded');
$req ->content($query);
my $res = $ua ->request($req);
if($res->is_success){
print $res->as_string;
}
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」