Google Chrome Extension の AutoPatchWork の次ページを読み込む判定

どのようにして次ページを読むかを判定しているんだろう???
って、ソース公開されてるんだから読め!ってね…


自分が作成した一覧画面で次ページが自動的に読み込まれないとなると
DOMの組み方や、ページのデザイン、リクエストパラメータの仕様などが悪いのかと不安になる…
ユーザ操作で強制的に次ページを読み込ませることもできるみたいであるが(?)


Google Chrome Extension 「AutoPatchWork」

Google Chrome の User-Agent に Safari

Google Chrome の User-Agent に「Safari」の文字列が入ってるのね…

Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.43 Safari/532.5

レンダリングエンジンがWebKitだからかな?
User-Agentで条件文書くときとか気をつけないと!


参照

ファイルダウンロード処理において、レスポンスヘッダー Content-Disposition に attachment; filename= に日本語を設定すると文字化けする

いろいろと回避方法があるようだが
Safariに関してはこの方法では文字化けは不可避らしい…
う〜ん困った…

回避方法

ブラウザ 対応
IE6,7,8 URLエンコーディングで回避できる(java.net.URLEncoder#encode() を使用する)
FireFox3.5 MIME-Bエンコーディングで回避できる(javax.mail.MimeUtility#encodeWord() を使用する)
Chrome4.0 [FireFox]と同じ
Safari どう足掻いても化けるので、サニタイジングを行うなどの処理が必要

実装

このような条件でファイル名を変換
User-Agentの条件をもっと細かく見る必要があるかもしれない(?)

// User-Agent取得
String agent = request.getHeader("User-Agent").toUpperCase();
if(agent.indexOf("MSIE") > -1) {
    // Internet Explorer
    fileName = URLEncoder.encode(fileName, "UTF-8");

} else if(agent.indexOf("FIREFOX") > -1 || agent.indexOf("CHROME") > -1){
    // FireFox, Google Chrome
    fileName = MimeUtility.encodeWord(fileName, "ISO-2022-JP", "B");

} else if(agent.indexOf("SAFARI") > -1) {
    // Safari
    // 日本語(例えばASCII文字以外)をサニタイズする処理を挟む
    fileName = sanitizeForSafari(fileName);

} else {
    // その他
}

return fileName;

参照サイト

Safariの文字化けを回避する対応が載っているリンクを貼っておきます


日本語ファイル名の書き出し(Safari対策) - Chewing GUM! - Seesaa Wiki(ウィキ)
日本語ファイル名


いずれもリクエストパラメータを変更する必要があるっぽい
これを参考に、リダイレクトすればそれっぽくできそうだけど?
それにはサーバ側の口も必要なワケで…
う〜ん…まいった…

Javaの列挙型(Enum)のequalsと==とtoString

恥ずかしながらすぐに忘れる…

static enum Number{
    ONE,
    TWO,
    THREE
}

public static void main(String args[]) {
    System.out.println("ONE equals Number.ONE            is " + "ONE".equals(Number.ONE));
    System.out.println("ONE equals Number.ONE.toString() is " + "ONE".equals(Number.ONE.toString()));
    System.out.println("ONE   ==   Number.ONE.toString() is " + ("ONE" == (Number.ONE.toString())));
}

実行結果

ONE equals Number.ONE            is false
ONE equals Number.ONE.toString() is true
ONE   ==   Number.ONE.toString() is true

文字列との比較はtoString()を使用


Enum#equals()

内部では「==」を使用している、なるほどね〜

public final boolean equals(Object other) { 
    return this==other;
}

Echofon for iPhone のゴミ箱(クリア)ボタン

TwitterするのにiPhoneアプリ「Echofon」を使っておりますが
「→」を押そうとすると「ゴミ箱」押してしまって
文章がクリアされることがよくある…
どうにかならないかねぇ?


Echofon for iPhone



参照

ファイル名として不正な文字を任意の文字に置換

とりあえずWindowsの場合ということで…

String src = "abc_ABC_あいう_亜伊卯_アイウ_123_123_\\_/_:_*_?_\"_<_>_.txt";
// [/, *, ?, ", <, >, \] にマッチ
Pattern illegalFileNamePattern = Pattern.compile("[(\\|/|:|\\*|?|\"|<|>|\\\\|)]");
String fileName = illegalFileNamePattern.matcher(src).replaceAll("-");
System.out.println("src        :"+src);
System.out.println("fileName   :"+fileName);

実行結果

src        :abc_ABC_あいう_亜伊卯_アイウ_123_123_\_/_:_*_?_"_<_>_.txt
fileName   :abc_ABC_あいう_亜伊卯_アイウ_123_123_-_-_-_-_-_-_-_-_.txt

ファイルパスをOKとする場合

// [\]をスルー
Pattern illegalFileNamePattern = Pattern.compile("[(\\|/|:|\\*|?|\"|<|>|)]");

ASCII文字以外を任意の文字に置換

Java正規表現POSIX 文字クラスってのがあるんですね

便利!^^

String src = "abc_ABC_あいう_亜伊卯_アイウ_123_123"
// \p{ASCII} でASCII文字とマッチ、[^]で囲んでnot
Pattern pattern = Pattern.compile("[^\\p{ASCII}]");
String dst = pattern .matcher(src).replaceAll("*");
System.out.println("src :"+dst);
System.out.println("dst :"+dst);

実行結果

src :abc_ABC_あいう_亜伊卯_アイウ_123_123
dst :abc_***_***_***_***_123_***

参照