2012年12月20日木曜日

[他]入力フォームからHTTPSにしなければいけない理由

Webサイトで、会員登録など個人情報を扱う場合、入力フォームからHTTPSにしなければいけない理由があるのは知っているんですが、なんでって言われるとうまく説明できなかったりします。ということで備忘録代わりにメモ。
HTTPSを使う際に入力フォームのページからそうしないといけない理由はなんですか
  • データの盗聴を防ぐ
  • データの改ざんを防ぐ
  • アクセスしているドメイン名が正しいものであることを保証する

2012年11月20日火曜日

[Android]ダイアログ風なアクティビティ

Alertで表示するとちょっと都合が悪い。そんな場合が時々あります。
そんな時、Activityをダイアログ風に見せる方法があります。えぇまぁ AndroidMAnifest.xmlにテーマ(スタイル)を指定するだけ。

<activity android:name="com.hoge.DialogLikeActivity"
 android:label="DialogLike"
 android:theme="@android:style/Theme.Dialog" />

2012年10月3日水曜日

[Android]レイアウトxml定義でクリックのメソッドが指定できる

ぐは。知りませんでした。レイアウトxmlでクリックのメソッドが指定できるってことを!

<Button
    android:id="@+id/button1"
    android:text="button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="onButton1Click" />

public void onButton1Click(View v) {
    //処理
}

2012年9月3日月曜日

[android]DefaultHttpClientで取得した結果を簡単にStringやbyte[]に変換する

DefaultHttpClientでHTTP通信し、その結果を受け取るパターンというのは結構あります。 そのアウトプット(xmlやjson)をpullParser等に食わせるときはいいんですが、これを文字列やbyte[]に変換しようとすると、定型のめんどくさい処理を実装する必要があります。 InputStreamをバッファに読み込み、StringWriterやByteArrayOutputStreamに出力する的な感じ。
Androidでは、これを簡単にやってくれるメソッドがあることを最近知りました。 スタティックメソッドなんですが、以下の通りです。
  • EntityUtils.toString
  • EntityUtils.toByteArray

引数にHttpEntity を渡すだけでそれらしく処理してくれます。チョー便利。コードで書くとこんな感じ。
 String data = EntityUtils.toString(response.getEntity());

2012年8月21日火曜日

[他]WifiNotfyがアンドロイダーに。。。

去年の11月に公開したAndroid用アプリケーションですが、ダウンロード数見てみると1,000ダウンロード達成してました。ここ数日で100件くらいダウンロードがあったので、変だなぁと思っていたら、アンドロイダーのレビューに出てました。
・・・半年くらい前、auoneマーケットの無料登録できるからと思って登録したのを思いだしました。

2012年7月8日日曜日

[Android]SDK20とEclipse4.2

気が付いたらADT20になってました。使った感じ、あまり変わっていないような気がします。
新規でプロジェクト作るとダメとかいいとか。。。
っていうかEclipse4.2が出ている!こちらPleiades All in Oneをいれれば。。。と思ってたら64bit版しか置いてありませんでした。

そろそろ新しいマシン買わないとダメかなぁ。

2012年4月21日土曜日

[android]SQLiteの最大クエリー文字数

先日不具合が発生し、今日類似の確認中にちょっとマズいクエリーを発見!
マズいクエリーとは、こんなかんじ。

String sql = "update xxx set xxx_flg where " + "id='xxx' or " + ....

と文字列の連結(実際はStringBuiderですが)が続いていく。。。(そしてクエリーは手打ち)
過去の経験から、この手のクエリー長は一定の文字列数を超えると、クエリーのサイズを超えた的エラーが出るのがわかっている。
で、先方に知らせるかどうか悩んだ結果、とりあえず何文字までいけるのかを評価してみました。
とりあえず、実験したクエリー(ちょっと改変)
大体、8000文字くらいは大丈夫そう。ということで、先方には黙ってることにしました!

db.rawQuery("SELECT * FROM t_test WHERE insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time='' or insert_time=''",null);

2012年4月11日水曜日

[android]ADT18きてた

今日、ADT18がリリースされたようです。ADT17を評価する暇が無かった。。。 ちなみにADT17では、GUIのxml編集するときに、なんか文字化けしてたのと、よくわからないビルドエラーが出ました。 アレは直ったんだろうか・・・。

2012年4月10日火曜日

[Android]Galaxy Nexusをタブレットぽくつかう (2)

先日、GDD Blog: [Android]Galaxy Nexusをタブレットぽくつかうというねたを書きました。

結果的に、AOKP(Android Open Kang Project)というカスタムROMを入れることで、簡単に実現できるということがわかりました。
導入後、AOKPの設定画面より160DPIに変更することで、タブレットモードに切り替わります、LCD Density Modderなどで解像度を変更しても同じ効果が得られます。
解像度によっては、エラーが出ます。そこでAOKPを入れると最初から入っているNova LauncherをHOMEアプリに変更します。
この、Nova LauncherというHOMEアプリすごくよくできていて、解像度にあわせてドロアーのアイコンの表示数を最適化。HOMEスクリーン側もアイコンの個数などしてできます。標準がベースらしいですし、使い勝手もよいのでコレお勧めです。

※カスタムROMを入れるにはブートローダーのアンロックなど、保障が受けられなくなる行為を必要としますので、適応には十分注意して下さい。

2012年4月6日金曜日

[Android]Support Package V7?

ViewPagerの情報を集めるためにネットを検索していると、android.support.v7.widget.GridLayoutっていうキーワードが何かヒットしました。
「あぁ4.0のGridLayoutね」と思ったんですが、よくみると、パッケージ名がアレになってる!

で、[SDKのフォルダ]/extras/android/supportをみると、v7フォルダがあり、その中にそれらしいJarが!
jarの中を除くと、GridLayout系のclassファイルが入っていました。

で、readmeをよんでみると、

Library Project including GridLayout.

This can be used by an Android project to provide
access to GridLayout on applications running on API 7+

ってあります。直訳すると、
「GridLayoutのを含むライブラリプロジェクト。
これが提供するAndroidプロジェクトで使用することができ
API7で実行するアプリケーションでグリッドレイアウトにアクセス+」

つまり、API7(2.1以上)でGridLayoutが使える。このフォルダがライブラリプロジェクトで構成されるので、参照しろ。ということでしょうか。

[他]WifiNotifyをバージョンアップしました

半年ほど前にリリースしましたAndroidアプリWifi Notifyですが、バージョンアップしてICS対応しました。
その他としましては、通知の情報にIPアドレスを表示するようにしました。
3GよりWiFiメインで利用するかは、一度お試しを。

2012年3月31日土曜日

[Android]Galaxy Nexusをタブレットぽくつかう

GalaxyNexusの解像度は、1280×720あり、ほとんどタブレットと同じ解像度です。
それを、320dpiにすることで、スマートフォンのUIを表現しています。

たとえば240dpiに変更すると、画面サイズが論理的に広くなります。通常この設定を変更することはできませんが、ROOT権限を取得し、/system/build.propにある、ro.sf.lcd_density=320となっている値を、240や160に変更します。そうすることで、タブレットに近いUI表示になります。

 しかしこの作業、文鎮化のリスクが伴います。調べてみるとフリーでよいソフトがありました。
LCD Density Modder

しかし、dpiを160に設定するとエラーが発生します。何とかする方法は無いんだろうか。。。

2012年3月23日金曜日

[Android]ADT&SDK 17

今日、SDK17&ADT17がリリースされたようです。
エミュレータの高速が話題になっているみたいです。

・・・ということで早速使ってみたんですが、高速になったかといわれると?です。

2012年2月25日土曜日

[android]バックキー押下で処理をハンドリング=Activity#finishのタイミングではない

時々、アクティビティの終了と同時に、処理を実装したいケースがあります。
外的なイベントであれば、バックキー押下がそれに当たります。
こういった場合、Activity#onKeyDownなんかで、キーコードをフックして何か処理を実施するものだと思っていましたが、コレがNGってことがわかりました。
何がNGっかというと、Activity#onKeyDownやActivity#onKeyUpでは、アクティビティの終了にならないケースがあるからです。
具体的には、以下のような流れになります。
 1.バックキー押下したままにする
 2.Aアクティビティで、画面遷移するボタンを押下
 3.Bアクティビティが表示される
 4.バックキー放す
 5.Bアクティビティはfinishしないけど、keyUpは発生する
バックキーと同期して処理を行いたい場合は、Activity#onBackPressedをオーバライドするとよさそうです。
Activity#onBackPressedは2.0以降を境に、処理タイミングが異なりますので、やや注意が必要です。
2.0以前:onKeyDownで処理
2.0以降:onKeyUpで処理。ただしonKeyDown→onKeyUpじゃないと呼び出されない

あ、ちなみに、Activity#onKeyDownでfinishと同時に、DB更新。みたいな事をやると、これ相当ヤバイ。Activity#onKeyDownは、キーを長押しすると、連続で発生するイベントだからです。

Activity#onBackPressedで、アクティビティ終了と判定した場合、Activity#isFinishingがtrueになる。コレを使うとフラグメントも含め処理がうまくいきそう!

2012年2月1日水曜日

[Android]Activity#onStartは意外に呼ばれない?

ボタンの2度押し対策として、以下のような対策を先日実施しました。


  • Activity#startActivityをオーバライド。フラグがoffならstartActivityする

  • Activity#onStartで、フラグをクリア

大体のケースでうまく行ったのですが、時々フラグがoffにならず、はてなと思っていろいろなバリエーションを調べてみると、次のアクティビティに遷移してすぐにバックキー押下みたいな操作を行うと発生することがわかりました。そこまでたどり着くのにだいぶ時間を費やしたんですが、なんでフラグがoffにならないかわかりませんでした。

で、onStartにトレースを入れてみると、呼ばれていないことがあるのがわかりました。
えぇそれが、遷移してすぐにバックキーのときです。
そのため、onResumeにフラグoffを移したら思い通りに動作するようになりました。

そういえば、上に透明なアクティビティがあるときも同じような現象があった気がします。
これは、Activityが不可視状態に遷移することなく、元に戻ったタイミングである。と考えるとまぁ納得がいきますね。

2012年1月18日水曜日

[Android]AndroidAnotations

AndroidAnotationsというライブラリ?を最近見かけました。
このライブラリ、Androidで面倒なfindByIdなものとかを全部アノテーションで解決しようとしている。
かつ、スレッドまでアノテーションで処理しできるっぽい。このトップページ見るだけでわくわくしちゃいますね。

コレ使ってみたいけいど、UnitTestとかうまくいくんだろうか。。。

2012年1月13日金曜日

[Android]Application#onTerminateはよばれない?

先日、隣の人に、Application#onTerminateっていつ呼ばれるんですか?って聞かれたので、「メモリ不足のときとかじゃない?」って適当に答えてました。
まぁ、雰囲気的にonCreateと対と読み取れるので、勝手に思ってい込んでいた。というのもあります。

とはいえ、適当に答えるのもアレだし、ちょっと調べてみると、apiリファレンスに、以下のように記載されていました。一部抜粋。

「It will never be called on a production Android device」

雰囲気からいって、実機ではコールバックされない感じ?ということで、隣の人には、「あ、実機じゃ呼ばれないかもらしいよ。」…ってまたもや適当に解答。

しかし、アプリの終わるタイミングは取りたいことがあります。たとえば、AlermManagerの開放であったり、ひらっきっぱのSocketのクローズだったり。メモリ以外のリソースをちゃんとリリースしたですね。
やっぱそういう時は、メインのアクティビティのonDestroyになっちゃうんだろうか...。

2012年1月12日木曜日

[Android]SQLiteのwhere句でnullを引っ掛ける

SQLの常識だと思っていたことが1つ崩れました。
SQLiteだけかもしれませんが、以下の2つはnullがヒット条件になります。


  • select * from foo where bar is null

  • select * from foo where bar <> ''


SQLServerやOracleではis nullじゃないとヒットしない記憶が...