2008年2月26日
デイリーポータルViewerを作った(初めてのCGI)
https://songmu.jp/dailyviewer/daily2.cgi
最初は単にべつやくれいの記事を一気読み出来ないかなぁと思ったのが作成のきっかけ。それをPerlの練習もかねて書いてみた。個人的なものなので最初はすげーやっつけスクリプトでした。
バックナンバーのページから「\d\d?月」となっているリンク先(=月別一覧)に逐一アクセスして、ライター名で全文検索してリンクを拾い出してくるかなり乱暴かつ迷惑なスクリプトだったのです。
これをちょっと改変して公開してみようとか思ったのが、運の尽き(?) ライター名を入力したら、記事一覧を返すCGIを作ってみようと。
しかし、もともとの仕組みじゃ使い物になりません。毎回根こそぎ(80ページ強!)一気にアクセスして、ライター名で全文検索にいくので、実行にも時間がかかるし、何よりデイリーポータルZ側のサーバーへ迷惑この上ないわけです。
じゃあ、「アクセスのあったライターに関して、記事のURLをキャッシュしておこうかな?」とも考えましたが、結局、
「最初に一度だけ一気にアクセスして、バックナンバーを根こそぎ拾い出してきて、更新情報はRSS見に行けば良くね?」
という方針に落ち着きました。もう最初とは全然違うプログラムになってしまったわけです。
最初のプログラムは、先ずは、ライター名ありきだったので、ライター名で全文検索に行けば良かったのですが、ライター名、タイトル、URLのリストが対応したリストを全て抜き出してくるとなると、走らせる正規表現がまたちょっと変わってくるわけです。
月別一覧のページを見ると、ライター名はカッコでくくられているので、そこを起点にして、リンクとタイトルを拾ってくる形になりました。
しかし、さすが手打ちで更新しているだけあって、全角、半角カッコの統一が取れていなかったり、改行される場所のルールが統一されていなかったりで、結構マッチング泣かせな部分がありました。拾い切れていない記事も多々あることでしょう。
また、2005年7月以前の月別一覧のページにはライター名の記述が無いため、それ以前の記事を拾い出すのは泣く泣く諦めました。
ちなみに、記事の順番ですが、バックナンバーのページのリンク順に拾い出しているので、上から、2007年1月、2007年2月…、2007年12月、2006年1月、といったちょっと変な順番になってしまっていますが、気にしません。今後の記事はRSSを見て更新に行くので、時系列順に並ぶと思います。
ライター名一覧も出すようにしてしまったので、入力ボックスの意味があまりなくなってしまいましたが、前方一致であれば、記事を拾い出すことが可能なのが見逃せません。なので「べつやく」と入力すれば、べつやくれいの記事にアクセスできますし、「三土」と入力すれば、「三土たつお」と「三土 たつお」の両方の記事にアクセス可能です。ただ、スペース関係が入ると違うライター扱いになってしまうのは何とかしようと思っています。
初めてスクラッチからCGI書いたので、いろいろ初歩的な点でバカみたいに苦労した。
大学時代に少し触っていたので、改行コードでははまらなかったが、文字コードがらみではまったり、時代は流れて、今やjcodeじゃなくてEncodeだったり。URLエンコードできなくてはまった時間が一番長かったかも。最初のやっつけスクリプトは30分だったが、ここまで書き上げるのに、多分賞味10時間近くかかっている。遅すぎ…。
ちなみに、ローカルのXP ProのIISでPerlを動かせるのを知ってちょっと嬉しかった。どうせならApache入れろよって感じではありますが。
現状の課題としては、アクセスがあるたびに毎回RSSを見に行くところ。RSS見に行くくらいだったら良いでしょとか思っているが、よしんばアクセスが増えることがあったら、何とかしないとなぁ。
小心者なので、デイリーポータルZ宛にお伺いのメール出した。公開しちゃダメって言われたらどうしよう…。