2013年5月8日水曜日

プレビューのPDF書き出しでバイト数を削減しようとQuartzフィルタを設定しても一覧に表示されなくて困ったら

スキャンしたデータを、Macのアプリ「プレビュー」でPDFへ書きだすと、めちゃめちゃバイト数が高くなる。

Quartzフィルタの「Reduce File Size」を指定すると、もの凄くバイト数が削減されるのだが、粗くなりすぎて、人様に送れるレベルではない(^_^;)

そこで、Reduce File Sizeの「アラアラ」な設定をカスタマイズして、「アラ」程度に調整みようと、ColorSyncユーティリティでフィルタの複製を試みた。



でも、・・・出ない。
PDF書き出しのQuartzフィルタのリストに複製したフィルタ名が表示されない。



調べたら、ColorSyncユーティリティで書き出されるパス「$HOME/Library/Filters/」下のQuartzフィルタは、プレビューでは表示されないとのこと。

独自のPDFのQuartzフィルタを追加する - ザリガニが見ていた...。


「/Library/Filters/」下だったら、プレビューでも表示されるようになるようだ。

つまり、「/System/Library/Filters/」下にある「Reduce File Size.qfilter」をコピーして「/Library/Filters/」下へ配置し、そのファイルをカスタマイズすればよい。

そのためには、rootになって/Library/へアクセスできるようにしないと。



ということで、rootになれるように、ターミナルを開いてrootのパスワードを設定。
$sudo passwd root
Password:
Changing password for root.
New password:
Retype new password:

その後、rootへsu。
$ su -
Password:

/Library/にFiltersディレクトリを作り、Reduce File Size のフィルタファイルをコピーしてくる。ファイル名は末尾に_customizeをつけるなり、適当に。このファイル名がプレビューでフィルタ名として表示されるわけではないので。

root# mkdir /Library/Filters
root# cp /System/Library/Filters/Reduce\ File\ Size.qfilter /Library/Filters/Reduce\ File\ Size_customize.qfilter

コピーできたら、自分好みの設定にカスタマイズ編集。viなんかで。

自分が変更したのは3点。

  1. ImageScaleFactorの値を「0.5」から「1.0」へ
  2. ImageSizeMaxの値を「512」から「1024」へ
  3. Nameの値を「Reduce File Size」から「Reduce File Size(customize)」へ

2点目のImageSizeMaxの値が特にバイト数へ影響を与える。大きければ大きいほどバイト数は高くなる。1点目のImageScaleFactorを1.0へ設定したので、このフィルタを使うと倍率1.0の1024のサイズへ画像をスケールすることになる。

3点目で設定した名前は、Quartzフィルタ名としてプレビューで表示される。



今度はちゃんと出た〜(・∀・)




OS 10.9.2(Mavericks)のプレビューでの注意点
追記 2014.03.28

・「PDFで書き出し」
・「印刷」→「PDF」→「PDFとして保存」
これらではQuartzフィルタが選べないようです。

「書き出す」→フォーマット「PDF」選択と進むと、Quartzフィルタの欄が表示されます。

2013年3月14日木曜日

MediaProviderのgetType()でIllegalStateExceptionが発生して困ったらmimeTypeの指定を確認すべし

画像をダウンロードした際に、そのメタ情報をMediaProviderへ登録するために、MediaScannerConnectionを使っている。
MediaScannerConnection.scanFile(context,
          new String[] { uri.getPath() },
          new String[] { "image/*" },
          new MediaScannerConnection.OnScanCompletedListener() {
            public void onScanCompleted(String path, Uri uri) {
              // Notificationを表示する
              notifyDownloadComplete(context, path, uri, sms);
            }
          });

ところが、MediaProviderのgetType()でIllegalStateExceptionが発生して、Activity Managerがクラッシュしてしまうことが多くて困った。




原因は、MediaScannerConnectionのscanFile()へmimeTypeを指定しているところ。
new String[] { "image/*" },

mimeType判断として、"image/*"と指定して、「何らかの画像」と加えたのが、逆にmimeType判断に時間をかけさせてしまい、IllegalStateException発生の温床にしてしまっていたらしい。

mimeTypeが特定できない場合にスキャンさせる時は、mimeTypeを指定せず、nullを与えて、拡張子から自動的に判断させるようにする方が好ましいようだ。


よって、mimeTypeの指定をnullへ変更。
MediaScannerConnection.scanFile(context,
          new String[] { uri.getPath() },
          null,
          new MediaScannerConnection.OnScanCompletedListener() {
            public void onScanCompleted(String path, Uri uri) {
              // Notificationを表示する
              notifyDownloadComplete(context, path, uri, sms);
            }
          });


面積や、JPEG、PNGなど種類を変えて、様々な画像のダウンロードを試してみたが、変更後は、IllegalStateExceptionは全く発生しなくなった(^。^)

2013年3月4日月曜日

MacでAndroidデバッグ用証明書を生成するときにターミナルの文字化けを防ぐには

Macでkeytoolコマンドを使ってAndroidデバッグ用の証明書を生成しようとしたら、メッセージが文字化けして何が何だか…(´・ω・`)



コマンド出力時のエンコードがUTF-8ではなく、SJISになっていることが原因。Appleが配布しているMac用のJavaの問題と思われ。


文字化けを解消するには、環境変数_JAVA_OPTIONSを指定してUTF-8のエンコードを指定する。

$_JAVA_OPTIONS='-Dfile.encoding=UTF-8' keytool -genkey -v -keystore .android/CUSTOM_debug.keystore -alias androiddebugkey -keyalg RSA -validity 10000 -dname "CN=Android Debug, O=Android,C=JP"
CUSTOM_debug.keystoreは任意の名前に置き換え





生成済みの証明書を確認する際も、文字化けを防ぐためにオプションを指定する。

$_JAVA_OPTIONS='-Dfile.encoding=UTF-8' keytool -exportcert -alias androiddebugkey -keystore .android/CUSTOM_debug.keystore -list -v

パスワードを入力すると、以下のように生成済みの証明書が表示される。





複数の開発マシーンでデバッグキーを共有するとちょっと便利

ちなみに、作成した.keystoreファイルを複数の開発マシーンで共有すると、同じデバイス宛へアプリを上書きインストールする際にも便利。

通常、同じデバイスに複数の開発マシーンからデバッグビルドでアプリを上書きインストールすると、開発マシーン毎に証明書が異なるので、アプリのアップデートができず、一度アプリをアンインストールしなければならない。

デバッグ用証明書を共有しておくと、アンインストールせずにアプリのアップデートができる。


Mac OS Xの場合、Eclipseのメニューから、「環境設定」→「Android」→「Build」→「Custom Debug keystore」に共通のデバッグ用証明書を設定すればOK。