“2005/08”な記事

WebObjects 5.2.4 + Connector/J 3.1.10link

 何だかロックの仕組みが変わったみたいで、ec.lockObject(eo) とかして ec.saveChanges() するとエラーになります。私のコードがバグありドライバのみ動作する天然コードである可能性もありますけども、3.1.8 までは問題なかったので戻しました。

 詳細やバージョンを戻す以外の回避策はわからなかったので、取りあえず現象としてご報告。

reiare075.link

 久々にちょっといじった。見た目全く変わっていないのだけど、“こめんと”の投稿周りを変更など。例によって、エラーに当たっちゃったらごめんなさいね。

 “こめんと”投稿用フォームを表示する時に認証キーを生成しメモリ内に保持する。そして実際に投稿された時に比較し受け付けるか判断する。みたいな処理を組み込んでいますが(参考過去記事)、今後は生成したキーをファイルに書き出して(参考過去記事)参照する様に変更しました。一応、外部リソースを参照するので synchronized なメソッドにしてありますが、これに意味があり正常に動作するのかは知らない(←開き直った)。
 メモリ内だけで完結していた処理にファイルの読み書きなんていう処理が加わるのですから、それなりにそれなりなコストがかかっているでしょうけども、大したサイズにもならないと思うので「そこらは上手い事やってくれい」な気持ちがあったりなかったり。

鈍っている(に違いない)人。link

 某アプリでロック絡みのバグを仕込んでしまって、リファレンスを参照したりして解決。「やぁ、また一つ成長したなぁ」とほのかに気分よくこの“れいあれさんapp”のソースを眺めていると、同じ事にハマって同じ様に解決している部分を見かけてしまい、それこそ走馬灯の様にその時の光景が……。

 もうね、覚えておく事は諦めているから一応ハマった事の内容はメモを取る様にしているのだけど、ハマった事すら忘れきってしまうとどうにもならないですよ、メモを参照する気にならないから。

逆転裁判 蘇る逆転 の4link

  指紋が隠された真実を暴く。新たなカガク捜査「指紋検出」――「逆転裁判 蘇る逆転」(ITmedia)

 しっかりアマゾンさんへの限定版予約を忘れきってしまい不可能となってしまったので、「仕方がない、普通の買うか」なたくぅさんです。

 紹介記事タイトルの「指紋検出」はとりあえず置いておいて、英語版も収録ってのは嬉しいなぁ。

ShuffleUpToDate v0.91 〜iPod shuffle の3 〜link

 {joner.lessjunkmorefunk.info}

 iPod shuffleで再生すると「最後に再生した日」を保存してくれません。これは時計機能なんてモノを搭載していないからだそうで、日付が必要なく単にインクリメントするだけの「再生回数」はカウントアップされます。
 ところで、私はiPod shuffleを購入する前から普通にランダム再生を好んでおりまして、その際のプレイリストは「再生回数が一定回数未満 Or 一定期間再生されていない曲」みたいなモノを利用しておりました。然程聞き飽きてなく、それでいて久しぶりと感じる様な選曲になるようにと。
 なので、この仕様はちょいと気になります。「図らずも」ならともかく、「明らかに」プレイリストに不整合が生じるのを感じさせるのが嫌です。

 そんな些細な事を気にするたくぅさんに救いの手を差し伸ベルかの様に、擬似的ながら解決するのが今回の ShuffleUpToDate です。iPod shuffleをMacへ挿す前に必ず一つ実行し、接続後また一つ実行する手間がかかりますけども、上手く機能しています。
 仕組みは、接続前の処理でiPod shuffleのプレイリストの再生回数を取得しておいて(←事前にオプションで「このiPodをソースリストに常に表示する」を有効にしておく事)、接続後の処理でそれと比較し違っていたら「最後に再生した日」をアップデートする、と言った事の様です。
 これで「最後に再生した日」を再生させつつ、今まで使っていたランダム再生用プレイリストから「オートフィル時に全ての曲を置き換え」を有効して、接続する度にオートフィルさせればこれまで通りな鳴りっぷり。

 shuffle いいっすよ、邪魔にならなくて。手放せなくなりそう。

SessionTimeout と Error なページ。link

  Personalizing Error Pages in WebObjects 5.2(Stepwise)とか参考。

 セッションの有効期間が過ぎた時や、アプリ内で解決できないエラーが発生した時に返すページは簡単に変更できます。
 適当な名前で返すページを作成し(←仮に“SessionTimeoutPage”と“ErrorPage”とします)、Application.javaでmethodを二つOverrideします。

public WOResponse handleSessionRestorationErrorInContext(WOContext context) {
    WOComponent page = pageWithName("SessionTimeoutPage", context);
    return page.generateResponse();
}

public WOResponse handleException(Exception exception, WOContext context) {
    super.handleException(exception, context);

    if (context.hasSession()) {
        context.session().terminate();
    }
    WOComponent page = pageWithName("ErrorPage", context);
    return page.generateResponse();
}

 まぁ、エラーページは必要ないのだが、起こりえないから。とか言ってみたい。

FilePath をすっきりと。link

 デスクトップに置いた“text.txt”というファイルをWOFileUploadを用いてアップロードした場合のfilePathは、大体の場合そのまま“text.txt”になりますが、Windows上のIEからだと“C:\Documents and Settings\xxx\デスクトップ\test.txt”となります(←ちなみにスクリーンショットにはAppleさんのサンプルアプリを用いております)。

 別に実害はないと言えばないのですけど、ファイル名をDBへ保持しておきたい場合などに深い階層にファイルがあればあるほど長くなってしまうのは煩わしいので、そういう時は一手間かけてすっきりとしておきましょう。
 Windowsのパス区切り記号は“\”でNSPathUtilities. lastPathComponent()ではいけませんから、正規表現やString.lastIndexOf()を用いて最後のファイル名の部分だけを取り出します。私は各EOモデルのファイル名のsetterメソッドを

public void setFilename(String fileName) {
    fileName = NSPathUtilities.lastPathComponent(fileName);
    if (fileName.indexOf("\\") != -1) {
        int anInt = fileName.lastIndexOf("\\");
        fileName = fileName.substring(anInt +1);
    }
    super.setFilename(fileName);
}

 という風に変更しています。最後がsuper()なのはEOGeneratorを使って二段構えになっているからなので、適当に適当な感じでよろしくどうぞ。
 あと、全体的に¥マークがバックスラッシュで、しかも全角だったりしても気が付かないフリをする様に。