雑記帳 2005年 9月第2週

2005/09/04 Sun.

選挙区の情報を色々と収集しようと思って「注目選挙区」とかで検索をかけたら、検索結果の先頭が激しく不愉快だ。
ところで、8月23日に某半島系検索エンジンで「売国」と検索をかけると面白い結果になっていたのを紹介したと思う。
今日になって確認してみたら、何故かインデックスが変わってたって愚痴。イオングループの分際で手を回しおったか。
ってか、注目する価値がありそうな選挙区は東京10区、岐阜1区、広島6区、新潟5区くらいしか思いつかないんだけどな。
羽柴秀吉」や「又吉イエス」もネタとして重要なのは当然です。しかし、前者の公式が「GeoCities」なのは悲しすぎる。

先月から愛用する携帯になった「V603SH」ですが、メールの機能の一つに「スパムメール報告」ってのがあります。
広告メール受信時に、自分でそのメールを公式へと転送して「このアドレスを禁止リストに加えてくれ」っていう機能。
機種変してから15通前後のスパム報告をしてきましたが、当然のことながら報告時の通信費はユーザー持ちなのね。
送信履歴を見てみると、土日に最も多く報告してる。スパム業者も土日に絞ってやってるんだろうな。迷惑この上ないが。
公式でもメール送信元のドメインを指定して受信拒否できる機能もあるけど、あれってほとんど使われてないっぽいな。
とりあえずは半年間くらいは真面目にスパム報告してみて、全く改善の兆しが見られなければ諦めるのが妥当かな。

          ,. -‐- 、r'´  ̄ ~Z.__
       ∠             ´   ,.>     ククク……
.     /                 ̄`>
     /           ,、      `\   久しぶりにやったが……
.    !             / \    \. トゝ    思ったより
   │       , ,.イ /、._, uヽ |ゝ、  N       気持ちがいいな……!
.    |      /レ' レ\,/  /V '´ l\!
     |. r;=、 .ノ=a=== ,, ,/a===!     届いたspamを
    | |.ト、| | u` ー--‐ " u\ーァ"!         通報するってのはな……!
    | l ヒ |:|.    u  r __   \l
     |  `ー 1|、 ヾニ二二二二フ 7′      まして それが……
    ノ     | \     ___  /          鼻持ちならねえ
.   /   ,ヘ、  ト、 \ u  ̄ ̄ /l            内容のなら……
  /  ./\.ヽ. ヽヽ、 \   , ' ,'
  ,' , ./   \ヽ、ヽ \./`iイ /        さらに格別っ……!
. /l/l/     |\\ヽ  ヽ. Wレ'            最高だっ……!
/      _..⊥._ \``  |

2005/09/05 Mon.

JSPだといとも簡単にPDFを作成できるのに、Javaアプリでゼロから作っていくと、こんなにもメンドいモノなのね。
Servletで動いている以上、JSP上では手動でクラスをimportする必要が無かったりする。クラスローダーにあればね。
だから、適当に書いてもクラス名やらメソッド名が合っていれば動いてしまうんだけど、アプリだとそうもいかない。
使うクラスは手動でimport文を書いていく以上、何の処理をするのにどのクラスが必要かを把握している必要がある。
で、どのクラスがどのJARファイルに格納されているかわからんので、片っ端から解凍して確認する作業に追われてたり。
ってか、中身とファイル名が一致しないモノが多すぎる。考えればわかるが、Asian.jarがフォントの詰め合わせとかね。
JSPだとブラウザのAccept-Languageを見て日本語か英語のPDFを作成するのかを決めてるけど、アプリだとどうしよ。
とにかく、作業内容が多すぎる上に、この部分にもまだまだ改修が入りそうなため、速度よりも保守性重視のコーディング。

そんなことを必死こいてやってると、あっという間に22時半とかになるんだよな。家帰ったら日が変わりそうになるし。
平日は自宅でのプライベートな時間がかなり削られてるけど、無為に遊んで過ごすよりかは今の方がいいのだろうかね。

2005/09/06 Tue.

import java.util.*;
import javax.activation.*;
import javax.mail.*;
import javax.mail.internet.*;
public class sendmail {
    public static void main(String args[]) {
        try {
            (略)
            MailSend(sAddressTo,
                         sNameTo,
                         sAddressFrom,
                         sNameFrom,
                         sSubject,
                         sText,
                         sAttachFile,
                         sSMTP_HOST);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void MailSend(String sAddressTo,
                                              String sNameTo,
                                              String sAddressFrom,
                                              String sNameFrom,
                                              String sSubject,
                                              String sText,
                                              String sAttachFile,
                                              String sSMTP_HOST) throws Exception {
        try {
            //    システムプロパティ
            Properties ps = System.getProperties();
            //    SMTPサーバーのアドレスを設定
            ps.put("mail.smtp.host", sSMTP_HOST);
            //    デフォルトのセッションオブジェクトを取得
            Session session = Session.getDefaultInstance(ps, null);
            //    インスタンス生成
            MimeMessage mimeMessage = new MimeMessage(session);
            //    マルチパート領域の設定
            MimeBodyPart mbp1 = new MimeBodyPart();
            MimeBodyPart mbp2 = new MimeBodyPart();
            //    送信元アドレスと送信元名前を設定
            mimeMessage.setFrom(new InternetAddress(sAddressFrom, sNameFrom, "iso-2022-jp"));
            //    インスタンス生成
            InternetAddress[] internetAddress = new InternetAddress[1];
            //    送信先アドレスと送信先名前を設定
            internetAddress[0] = new InternetAddress(sAddressTo, sNameTo, "iso-2022-jp");
            mimeMessage.setRecipients(Message.RecipientType.TO, internetAddress);
            //    件名を設定
            mimeMessage.setSubject(sSubject, "iso-2022-jp");
            //    マルチパートの領域に本文を設定
            mbp1.setText(sText, "iso-2022-jp");
            //    添付ファイル名を指定
            FileDataSource fds = new FileDataSource(sAttachFile);
            //    マルチパートの領域に添付ファイルをセット
            mbp2.setDataHandler(new DataHandler(fds));
            mbp2.setFileName(MimeUtility.encodeWord(fds.getName()));
            //    マルチパート格納用
            Multipart mp = new MimeMultipart();
            mp.addBodyPart(mbp1);
            mp.addBodyPart(mbp2);
            //    複数のマルチパートの領域をセット
            mimeMessage.setContent(mp);
            //    送信日付を設定
            mimeMessage.setSentDate(new java.util.Date());
            //    メール送信を実行
            javax.mail.Transport.send(mimeMessage);
            //    終了
            return;
        } catch (Exception e) {
            throw e;
        }
    }
}

おお、これはおもしれー。Javaで添付ファイル付きのメール送るのって簡単なんだな。家のマシンにも使わせようかな。
今仕事で手を加えているのは、もともとメール送信プログラムだったんだけど、それにPDFを添付して送るように改造中です。
PDFさえ作成できていれば、絶対パスを渡してメソッドを叩くだけで動くのか。他にも使えそうな部分がありそうかも。
もっと大量にファイルを添付させろって来たらどうすりゃいいんかな。添付ファイルの数だけインスタンス作るんだっけ?
ってか、インスタンスの配列なんて滅多に使わないから、その辺どうやってコーディングすればいいか忘れきってるな。
家で使っているPerl版の匿名メーラーはちょっと不具合あって、差し替えたいんだよね。原因が特定できてないし。
原因取り除けって感じだけど、自分が書いたソースとは言え、あまりに古いものだとやる気が出ないのよ。わかってくれ。

2005/09/07 Wed.

仕事も「Fake 2ch BBS」も順調に進んでいます。これが仕事とプライベートの両立ってヤツでしょうか。多分違いますね。
「両立」とかいう言葉を聞くと、必然的に頭に浮かんでくるのが「LINDBERG」の「胸騒ぎのAfter School」だったりする。
アレだ、進研ゼミで勉強と部活を両立ってヤツだ。中学校の頃にやってたけど、役になった記憶が皆無に近いのは何故だ。

「Fake 2ch BBS」は、Cookieが無い状態で投稿しようとすると確認画面を出すように修正。やっぱり投稿確認は必要だ。
さらに、先日修正したはずのキャップとトリップの機能に微妙なバグがあったので、それもさっさと修正。動作確認済み。
多分今後はmanagement.cgiでの管理機能の追加がメインになりそう。一応いくつかの追加機能の候補はあるんだけどね。
例えば、subject.txtに記述されているスレッドの順番を完全に固定する「全スレッド強制sage機能」とか。微妙すぎか。
その機能をひっくり返した「強制age機能」とかもできるな。ってか、これは単にsage機能が無いスレッドフロート型じゃん。
あとは、コテハン(固定ハンドルネームのことね)が邪魔くさい時にでも使ってもらいたい「強制名無しさん機能」とか。
後は投稿時のNGワード設定や、特定のIPからの書き込みをブロックするアク禁リスト設定。とりあえずこれくらいかな?
ってか、微妙に残ってるバグ(というか勘違い)もさっさと直さないと。キャップ持ちの書き込みの仕様も変えないといかん。
何だかんだ言って山ほどやる事があるな。別にいつでも完成状態にはできるけど、管理メニュー系の質は上げたいトコ。
今日はある程度メジャーな2chブラウザをピックアップして実験して、この「Fake 2ch BBS」に使えるかどうかを調べてみた。
ってか、自分が勝手にメジャーと思い込んでるモノだけなんだけどね。この辺については明日にでも書くことにするかな。

2005/09/08 Thu.

と~く2ちゃんねる - Talk 2ch」大活躍。2chブラウザって種類も多ければ作者も全部違うから、仕様がワケわからん。
上記のサイトで書き込み判定とか投稿確認判定とかを参考にして「Fake 2ch BBS」を作ってるけど、なかなか進まない。

レス書き込み結果判定 スレ立て結果判定 エラー表示判定
かちゅ~しゃ Ver 2.102
kage Ver 0.99.1.1155
title(小文字)タグ内に「書きこみました。」 title(小文字)タグ内に「書きこみました。」 結果HTML内にBタグ
ギコナビ Ver 1.50.2.606 結果HTML内に「書きこみが終わりました」 結果HTML内に「書きこみが終わりました」 結果HTML内に「書きこみが終わりました」がない
Jane Doe Style Ver 2.12 titleタグ内に「書きこみました」 titleタグ内に「書きこみました」 titleタグ内に「書きこみました」がない
JaneDoe View built 050802 多分同上(未確認だけど) 多分同上(未確認だけど) 多分同上(未確認だけど)
JaneIE View built 050802 多分同上(未確認だけど) 多分同上(未確認だけど) 多分同上(未確認だけど)

こんなんを一つ一つ調べていったら終わりが無いな。こればっかりは2chブラウザの仕様の勉強だと思って諦めるか。
書き込み後やエラー時に出力されるHTMLを読み取って、その中に特定の言葉がどこにあるかとかを判定してるらしいです。
ある程度は対応できてきたんだけど、上の表の下3つのJane系がメンドい。何がメンドいって、Cookie関連がメンドい。
こっちがわざわざCGIでCookieを吐いてるのに、それを無視して独自のCookieを作ってるっぽい。何とかできないかな。
勝手に吐かれるCookieのキーが「NAME」と「MAIL」で固定されてて、こっちがCGIで他のキーを吐いても無視されるのよ。
前回書き込み時間や前回スレッドを立てた時間もCookieで管理してるのに、その辺のキーと値が使えない状態だ。
このままだと何が困るって、連続レスやり放題の上にスレッドも立て放題という状態になってしまい、これはあり得ない。
そもそもCookieが無い状態で投稿すると確認画面が出るのだが、この画面表示が華麗にスルーされてしまうのだ。
$ENV{"HTTP_USER_AGENT"}で判別しようにも、特殊文字列を吐かずにMozillaを吐きやがる。対策が思い浮かばん。

2005/09/09 Fri.

ここ最近ずっと仕事で格闘しているPDFで使ってるクラスファイルを置いておきますね。「iText」という海外のPDFライブラリ。
PDFを作成するには優秀なものだと思うんだけど、使い方が難しい。「iText.NET」のような解説サイトはマジで助かる。
さて、昨日から「別の場所で複数枚出していたPDFを一つにまとめてくれ」という要望の元に、延々と作業をしています。
別々にPDFを作成して、後から結合ライブラリみたいなものを使ってまとめればいいじゃん、と思ってたのが甘かった。
職場で使われているiText.jarのバージョンが古いため、専用の結合クラスが使えない。で、最新のに入れ替えてみた。
とりあえずjarを解凍して目的のクラスの存在は確認したのだが、実際にWebLogicに適用してみて、酷い目にあった。
今まで出してきたPDFが正確に出せるかを確認していたのだが、微妙に仕様が変わっているのかレイアウトが崩れまくる。
とてもじゃないが最新版を適用できないので、やむを得ずjarを古いバージョンに戻して、どうしたものかと策を練る。
で、出てきた案は「複数の処理で複数のPDFを作ってるなら、一つの処理でまとめてPDFを出そう」という、当然のこと。
既存のシステムではPDFをファイルに吐き出さずに、ブラウザにバイナリを直接吐いて渡している。根本から修正だ。
ファイルを生成して保存するように変更して、かつ出力内容別に分けていた処理を無理やり一つの処理にまとめる。
今日だけで新規に作ったJSPの行数が5,500行とかいってるのだが、不要な部分を切りまくれば2,000行くらいになるか。
とりあえず、延々とコーディングしてコンパイルが通らずにキレかけて直してPDF吐かせて確認して、の繰り返しだけ。
そもそも、何で複数のPDFではダメで一つのファイルにまとめないといけないのか。夕方頃にちょっと聞いてみた。

「別のシステムにPDFを渡したいんだけど、そっちのシステムのAPIが複数のファイルに対応してないんだよね」

何だそのクソ使えないAPIは。こっちのPDFを吐く部分じゃなくてそっちを修正した方が、絶対に今後役に立つと思うぞ。
いずれにせよ、多少なりとも今後も使いそうな「iText」が学べるからいいとしよう。これはプライベートでも使えそうだな。

2005/09/10 Sat.

最近自分の周囲では結婚ラッシュが巻き起こっています。この1年間で既に3人だか4人は結婚してるんじゃないか?
世間一般では「人生の墓場」と「新しい人生の起点」との二種類の見解があるようですな。君死にたもうことなかれ。
とにかく、今日は大学のサークルでお世話になったY成君のお祝いパーティーに行ってきました。場所はいつも通り新宿。
17時半に伊勢丹とマルイシティがある交差点のトコに待ち合わせで、数分遅れで到着。まずは伊勢丹へ向かうことに。
パーティー前にウチらの代で美味い酒でもプレゼントを用意しようということで、事前に伊勢丹で買うことになっていました。
ワインも日本酒も自分の担当外なので、K岡など公務員組に全て任せます。で、発送手続きをしてから会場へ向かいます。
ワインも日本酒もビンに入ってるモノだし、手渡ししたとしても重いだろうってことで、文字通り贈り(送り)モノとすることに。

会場は「伊太利亜居酒屋Wansa Kansa」というトコで、パーティー用っぽい奥の一室を貸し切りで予約をしてあったらしい。
18時半くらいにY成夫妻が入場。うへ、話には聞いていたけど、奥さん綺麗な方ですな。職業はSEであるという噂も。
途中でケーキ入刀やビンゴゲームなどを挟んで、21時ちょいくらいにパーティーはお開きとなる。なかなか面白かった。
……面白かったのはいいのだが、今回の件は奥さんにはどう映ったのだろう。奥さんと面識のある人は誰もいなかったり。
主催側の現4年の中でも一部はこのパーティーに反対していたようだが。あまり迷惑になっていなければいいのだけれどね。

パーティーが終わった時点で腹が減っていたので、適当にその辺のを誘って軽く何か食べに行かないかと誘ってみる。
不思議なことに「gadult」が姿をくらませていますが、もう知りません。何も言いませんから、早く借金を完済してちょ。
もともとはスタバあたりでコーヒーでも飲んで軽くつまむ程度を考えていたのだが、何を間違ったのかカラオケへ行くハメに。
そこへ行くと決まるまで靖国通り付近でダラダラと話し込んでいたのだが、客引きっぽい中華だかチョンが邪魔くさかった。
以前に一回だけ行ったことがある「創作ダイニング - 暁 -」の客引きもいて、そこへ行くのかと思ってたら違ったようだし。
店の名前もロクに覚えてないようなとこだけど、クソ狭い部屋に11人くらい入らされて、仕方なく時間をつぶした感がある。
それでも何だかんだで終電で帰るハメになり、帰宅したら1時を過ぎてるし。最初から最後まで何だか微妙な一日だった。