Android – HttpClient のクッキー管理機能をカスタマイズする

HttpClient のクッキー処理の仕様をブラウザに合わせたい、RFC準拠にしたい、自分で管理したい、という時はクッキーポリシーの設定で動作を変更することができます。
方法1: 標準で提供されているクッキーポリシーを選んで設定する
例:

DefaultHttpClient client = new DefaultHttpClient(params);
client.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.NETSCAPE); // SetCookieの扱いをNetscapeの仕様に変更

 
設定可能な値:
– CookiePolicy.BEST_MATCH … デフォルトのベストマッチポリシー
– CookiePolicy.RFC_2109 … RFC2109に準拠(時代遅れの厳密なポリシー)
– CookiePolicy.RFC_2965 … RFC2965に準拠(標準的で厳密なポリシー)
– CookiePolicy.NETSCAPE … ネットスケープのドラフトに準拠
– CookiePolicy.BROWSER_COMPATIBILITY … (おかしな)一般的なブラウザと互換性がある動作にする。
 
方法2:カスタムポリシーを使う
例:

DefaultHttpClient client = new DefaultHttpClient(params);
// カスタムクッキーポリシーを定義する
CookieSpecFactory csf = new CookieSpecFactory() {
 
@Override
public CookieSpec newInstance(HttpParams params) {
return new BrowserCompatSpec(){
@Override
public void validate(Cookie cookie, CookieOrigin origin)
throws MalformedCookieException {
// ここで判定してクッキー導入処理を行う。
// super.validate(cookie, origin);
}
};
}
};
client.getCookieSpecs().register(“myspec”, csf); // カスタムポリシーに結びつけるキーワードを登録して・・
client.getParams().setParameter(
ClientPNames.COOKIE_POLICY, “myspec”); // そのキーワードでポリシーを設定!

 
カスタムポリシーを定義する場合は標準で提供されているポリシーのソースが参考になります。
 
– RFC_2109 … RFC2109Spec.java
– RFC_2965 … RFC2965Spec.java
– NETSCAPE .. NetscapeDraftSpec.java
– BROWSER_COMPATIBLE .. CookieSpecBase.java
 
その他クッキー関係の設定方法は公式ドキュメントに詳しく書かれています。
 
参考:
HttpClientでのCookieの扱い(HttpClient3.0-rc3)
HttpComponentsライブラリ公式ドキュメント(hc.apache.org)
RFC2109(日本語訳)
RFC2965(日本語訳)
HttpComponentsのcookieパッケージソース(svn.apache.org)

Windows 用 Android ドライバのまとめ

Windows で Android SDK (adbなど)を使うための各種Android端末用 android_winusb.inf 設定一覧です。
SDKを展開したフォルダにあるusb_driver/android_winsub.inf に記述されている[Google.NTamd64]と[Google.NTx86]の両方に同じ設定を付け足してください。
 
設定適用済みandroid_winusb.inf

; HTC Dream
%SingleAdbInterface% = USB_Install, USB\VID_0BB4&PID_0C01
%CompositeAdbInterface% = USB_Install, USB\VID_0BB4&PID_0C02&MI_01
%SingleBootLoaderInterface% = USB_Install, USB\VID_0BB4&PID_0FFF
; HTC Magic
%CompositeAdbInterface% = USB_Install, USB\VID_0BB4&PID_0C03&MI_01
;
;Moto Sholes
%SingleAdbInterface% = USB_Install, USB\VID_22B8&PID_41DB
%CompositeAdbInterface% = USB_Install, USB\VID_22B8&PID_41DB&MI_01
;
;Google NexusOne
%SingleAdbInterface% = USB_Install, USB\VID_18D1&PID_0D02
%CompositeAdbInterface% = USB_Install, USB\VID_18D1&PID_0D02&MI_01
%SingleAdbInterface% = USB_Install, USB\VID_18D1&PID_4E11
%CompositeAdbInterface% = USB_Install, USB\VID_18D1&PID_4E12&MI_01
 
; Xperia X10
%SingleAdbInterface% = USB_Install, USB\VID_0FCE&PID_D12E
%CompositeAdbInterface% = USB_Install, USB\VID_0FCE&PID_D12E&MI_01
 
; HTC Desire
%SingleAdbInterface% = USB_Install, USB\VID_0BB4&PID_0C87
%CompositeAdbInterface% = USB_Install, USB\VID_0BB4&PID_0C87&MI_01
 
; HTC DesireHD
%SingleAdbInterface% = USB_Install, USB\VID_0BB4&PID_0CA2
%CompositeAdbInterface% = USB_Install, USB\VID_0BB4&PID_0CA2&MI_01
 
; Samsung galaxy (galaxy S, galaxy Tab)(*)
%CompositeAdbInterface% = USB_Install, USB\VID_04E8&PID_6640&MI_00
%SingleBootLoaderInterface% = USB_Install, USB\VID_04E8&PID_6640&MI_04
 
; SHARP IS01
%CompositeAdbInterface% = USB_Install, USB\VID_04DD&PID_9337&MI_01
%CompositeAdbInterface% = USB_Install, USB\VID_04DD&PID_9336&MI_05
 
; SHARP JN-DK01
%CompositeAdbInterface% = USB_Install, USB\VID_04DD&PID_9353&MI_01
%CompositeAdbInterface% = USB_Install, USB\VID_04DD&PID_9352&MI_05
%SingleBootLoaderInterface% = USB_Install, USB\VID_04DD&PID_9373
 
; SHARP SH-10B(LYNX)(*)
%CompositeAdbInterface% = USB_Install, USB\VID_04DD&PID_9334&MI_01
%CompositeAdbInterface% = USB_Install, USB\VID_04DD&PID_9333&MI_01
%CompositeAdbInterface% = USB_Install, USB\VID_04DD&PID_9332&MI_05
 
; SHARP SH-03C(LYNX 3D)(*)
%CompositeAdbInterface% = USB_Install, USB\VID_04DD&PID_9393&MI_01
%CompositeAdbInterface% = USB_Install, USB\VID_04DD&PID_9392&MI_01
%CompositeAdbInterface% = USB_Install, USB\VID_04DD&PID_9391&MI_05
 
; SHARP IS03
%CompositeAdbInterface% = USB_Install, USB\VID_04DD&PID_939C&MI_05
%CompositeAdbInterface% = USB_Install, USB\VID_04DD&PID_939A&MI_01
%CompositeAdbInterface% = USB_Install, USB\VID_04DD&PID_939B&MI_01
 
; SHARP 003SH(Galapagos)
%CompositeAdbInterface% = USB_Install, USB\VID_04DD&PID_93B5&MI_01
%CompositeAdbInterface% = USB_Install, USB\VID_04DD&PID_93B4&MI_01
%CompositeAdbInterface% = USB_Install, USB\VID_04DD&PID_93B3&MI_05
 
; Toshiba T-01C(REGZA)
; http://www.fmworld.net/product/phone/sp/android/develop/t-01c_usb/download.html
%CompositeAdbInterface% = USB_Install, USB\VID_0930&PID_0D85&MI_01

(*)galaxy, SH-10B等についてはandroid_winusb.infへの記述だけではPCで認識できません。下記サイトからそれぞれの専用ドライバをインストールし、端末設定の「アプリケーション→開発」からUSBデバッグを有効にすることでadbなどから認識されるようになります。
 
– galaxy S, galaxy Tab
(Samsung Kies Installer に同梱)
http://jp.samsungmobile.com/pc/lineup/SC-02Bdownload.html
 
– SH-10B(LYNX)
https://sh-dev.sharp.co.jp/android/modules/driver/#sh_10b
 
– SH-03B(LYNX 3D)
https://sh-dev.sharp.co.jp/android/modules/driver/#sh_03c
 
参考:
ADB + Samsung Galaxy(stack overflow)
 
Samsung Galaxy S (Vibrant) not debugging(App Inventor Coffee Shop)
SH Developers Square(sharp) – シャープ製Android携帯のADBドライバ配布サイト。
 対応端末: SH-03C, IS03, SH-10B(LYNX), IS01

Android1.6でLinearLayoutを子要素なしで表示するとRuntimeExceptionになる

Xperia(2.1)で検証していて、別のXperia(1.6)で動かしたところこんなエラーが発生。

E/AndroidRuntime(10100): Uncaught handler: thread main exiting due to uncaught exception<br />
E/AndroidRuntime(10100): java.lang.RuntimeException: mBaselineAlignedChildIndex of LinearLayout set to an index that is out of bounds.<br />
E/AndroidRuntime(10100): 	at android.widget.LinearLayout.getBaseline(LinearLayout.java:151)<br />
E/AndroidRuntime(10100): 	at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:644)<br />
E/AndroidRuntime(10100): 	at android.widget.LinearLayout.onMeasure(LinearLayout.java:280)<br />
E/AndroidRuntime(10100): 	at android.view.View.measure(View.java:7755)<br />
E/AndroidRuntime(10100): 	at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:892)<br />
E/AndroidRuntime(10100): 	at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)<br />
E/AndroidRuntime(10100): 	at android.widget.ScrollView.onMeasure(ScrollView.java:276)<br />
E/AndroidRuntime(10100): 	at android.view.View.measure(View.java:7755)<br />
E/AndroidRuntime(10100): 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:2989)<br />
E/AndroidRuntime(10100): 	at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)<br />
E/AndroidRuntime(10100): 	at android.view.View.measure(View.java:7755)<br />
E/AndroidRuntime(10100): 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:2989)<br />
E/AndroidRuntime(10100): 	at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)<br />
E/AndroidRuntime(10100): 	at android.view.View.measure(View.java:7755)<br />
E/AndroidRuntime(10100): 	at android.widget.LinearLayout.measureVertical(LinearLayout.java:464)<br />
E/AndroidRuntime(10100): 	at android.widget.LinearLayout.onMeasure(LinearLayout.java:278)<br />
E/AndroidRuntime(10100): 	at android.view.View.measure(View.java:7755)<br />
E/AndroidRuntime(10100): 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:2989)<br />
E/AndroidRuntime(10100): 	at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)<br />
E/AndroidRuntime(10100): 	at android.view.View.measure(View.java:7755)<br />
E/AndroidRuntime(10100): 	at android.view.ViewRoot.performTraversals(ViewRoot.java:748)<br />
E/AndroidRuntime(10100): 	at android.view.ViewRoot.handleMessage(ViewRoot.java:1614)<br />
E/AndroidRuntime(10100): 	at android.os.Handler.dispatchMessage(Handler.java:99)<br />
E/AndroidRuntime(10100): 	at android.os.Looper.loop(Looper.java:123)<br />
E/AndroidRuntime(10100): 	at android.app.ActivityThread.main(ActivityThread.java:4203)<br />
E/AndroidRuntime(10100): 	at java.lang.reflect.Method.invokeNative(Native Method)<br />
E/AndroidRuntime(10100): 	at java.lang.reflect.Method.invoke(Method.java:521)<br />
E/AndroidRuntime(10100): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:799)<br />
E/AndroidRuntime(10100): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)<br />
E/AndroidRuntime(10100): 	at dalvik.system.NativeStart.main(Native Method)<br />

どうも1.6の不具合らしく、LinearLayout, TableLayout あたりをaddView()なしで表示しようとするとこういうエラーになるようで…。
何も表示しないビュー(テキストなしのTextView)を該当のレイアウトにはめ込んだら問題なく動くようになりました。

参考:

Issue 3484 – Creating LinearLayout without child views programatically fails.(Android Issues)

apk パッケージの AndroidManifest.xml を解析するには

.apk ファイルに含まれる AndroidManifest.xml はバイナリ形式になっているため、そのままでは設定を読むことが出来ません。
 
元のXMLに戻すのではなく、XMLの情報を読みたいだけであれば、Android SDKに付属している aapt (Android Asset Packaging Tool)というツールを使うことで可能です。
 

aapt l -a <apkファイル>

aaptプログラムはapk作成のためのツールです。
それぞれのバージョン毎に独立した実行ファイルになっていて、platforms 以下それぞれのSDKバージョンのフォルダ以下に存在しています。
(追記)以前は platforms以下に分かれて配置されていましたが、現在は platform-tools フォルダに統合されました。

android-sdk/platform-tools/aapt

実行すると以下のようなダンプが出力されます。
AndroidManifest.xml について書かれているのは “Android Manifest:”以下ですね。

res/drawable/icon.png
res/layout/items.xml
res/layout/main.xml
AndroidManifest.xml
resources.arsc
classes.dex
META-INF/MANIFEST.MF
META-INF/CERT.SF
META-INF/CERT.RSA
 
Resource table:
Package Groups (1)
Package Group 0 id=127 packageCount=1 name=com.example.foo
~中略~
Android manifest:
N: android=http://schemas.android.com/apk/res/android
  E: manifest (line=2)
    A: android:versionCode(0x0101021b)=(type 0x10)0x3
    A: android:versionName(0x0101021c)=”1.2″ (Raw: “1.2”)
    A: package=”com.example.foo” (Raw: “com.example.foo”)
    E: application (line=6)
      A: android:label(0x01010001)=@0x7f040000
      A: android:icon(0x01010002)=@0x7f020000
      E: activity (line=7)
        A: android:label(0x01010001)=@0x7f040000
        A: android:name(0x01010003)=”.Foo” (Raw: “.Foo”)
        E: intent-filter (line=9)
          E: action (line=10)
            A: android:name(0x01010003)=”android.intent.action.MAIN” (Raw: “android.intent.action.MAIN”)
          E: category (line=11)
            A: android:name(0x01010003)=”android.intent.category.LAUNCHER” (Raw: “android.intent.category.LAUNCHER”)
    E: uses-sdk (line=16)
      A: android:minSdkVersion(0x0101020c)=(type 0x10)0x3

インテントごとの実行権限など一通りの設定を参照することが出来ます。
その他にもリソースID情報などもapkに関係する様々な情報を得られます。
 
参考:
How to parse the AndroidManifest.xml file inside an .apk package(stackoverflow)
エンコードされたAndroidManifest.xmlをデコードする

PostgreSQL で to_dec

to_hex() の逆関数は標準では提供されていません。
PL/pgSQL が使える環境であれば「Conversion between hex and dec numbers(16進数と10進数の変換)」(SQL Tricks)のページで定義している to_dec() 関数を使うのが便利です。

=# select to_hex(11);
    to_hex
   ——–
    b
   (1 row)
postgres=# create or replace function to_dec(text)
           returns integer as $$
           declare r int;
           begin
             execute E’select ”||$1|| E’\’::integer’ into r;
             return r;
           end
           $$ language plpgsql;
CREATE FUNCTION
postgres=# select to_dec(‘ff’);
 to_dec


—-
    255
(1 row)

 
別の方法として、16進数を1度ビット型に変換することでも10進数に変換できます(桁数が分かっている場合のみ)。
たとえば、2桁の16進数文字列 の hextext というカラムを10進数に変換した居場合は次のようになります。

SELECT (‘x’ || hextext)::bit(8)::integer — bit(桁数の4倍)

CSS の float を解除する 3つの方法

http://whisper.sakura.ne.jp/diary/2009/06/cssfloat.html
すぐ忘れるのでメモ。
空タグを使わない方法については float する対象をコンテナで囲むのは共通。
コンテナに対して clearfix (:afterに見えない要素を置いてそこでclearする)を使うか、
overflow:hidden をかけるかの2パターン。
 
参考:
floatのclearについて
図解で分かりやすいです。
clearは「floatの解除」ではない

Internet Explorer – PNG が表示されなくなった

IE8 を使っていて、Google トップページなどでPNG画像が表示されなくなってしまった。
原因を探っていて、そういえば QuickTime をアンインストールしたなと思い出し、ここからレジストリ設定ファイルを落としてきて修復したら直りました。

HTC Desire で急に通知バイブが鳴動しなくなる問題の対策

HTC Desire, Droid Incredible などで gmail の通知などでバイブが鳴らなくなる不具合があるようです。
調べてみたところSound Managerというアプリでバイブレーション設定することで解決するとのこと。
バイブが鳴るようになったら Sound Manager はアンインストールしてもOKです。
 
ダウンロード用QRコード(クリックでAndroid Merketへジャンプします)
画像
参考:
No notification vibration(Android Forum)