なかなかどうして、この有様よ。

へたれ系PG/SEの技術系メモ+育児日記。

JavaのString#substringによるメモリリーク。

今の案件では、単体テストフェーズでJTESTを実施するようになっているのですが、
そこでたまに出てくる

CODSTA.EPC.UST
  文字列の構文解析には、'indexOf()' や 'substring()' ではなく 'StringTokenizer' を使用する

という文言。

で、この辺なんでだろうと思ったら、どうもメモリリークを引き起こす可能性があるらしく。

String#substringによるメモリリークの可能性 - Qiita

String#substringは新しい文字列をnew Stringで生成するにも関わらず切り出し前の文字列を内部(のchar配列)で保持してしまっています。

本内容は通常は意識する必要はありませんが、巨大な文字列をsubstring操作する際はメモリリーク等につながる場合がありますので注意が必要です。 (String#splitにも同様の問題があります)

ということだったので、この記事を参考に修正をしました。
実際に直した際はこの書き方に修正。

String s3 = new String(s1.substring(5));

こういうのって「そうなんだー」とは思うけどなかなか「で、なんで?」を調べなかったりするのでメモメモ。

Javaでの日本語名ファイルのダウンロード。

先日、JavaでDBから取得したデータをCSVファイルにしてダウンロードしたいという要件があったわけですが。
ファイル名が日本語指定で、なにも考えずにIEでダウンロードしたらファイル名が文字化けしておろろ、という感じに。

で、色々調べてみました。
ダウンロード時のヘッダとして以下を設定すると上手くいきました。

response.setHeader("Content-Disposition", "attachment; filename=" + new String("ファイル名.csv".getBytes("MS932"), "ISO-8859-1"));

他にも調べると色々方法があるみたいなので、確認して一番使いやすい方法を選ぶのがいいかも。

Oracleのstart with/connect byで、子から親へ逆順のツリーを取得する。


これを元にSQLを作成。
でも、今回は指定されたIDから親をたどって、自分とその親を全部取りたかったので、start with以降の部分を変えてみた。

通常だとこんな感じ。
select ID,OyaID,Level
  from IDTable
start with OyaID is null
connect by prior ID = OyaID;

今回はこんな感じ。
select ID,OyaID,Level
  from IDTable
start with ID = 7
connect by prior OyaID = ID;

通常のツリーとは逆順のツリーを作成して、自分(この場合ID=7)を基準に親コードを取得するように作成。

この発想が思い浮かばなくてだいぶ悩んだのでメモ。

ちなみに、別テーブルにIDと紐付く任意のデータがあって、それと結合してるときは外部結合しないと親のデータは取れないので注意。

Androidアプリを作ってみる。その2

と言うわけで、前回から引き続きAndroidアプリを作ってみようと思ったり。

次は、開発環境を設定するところからやろうと、とりあえずADTを以下のサイトからダウンロード。

http://developer.android.com/sdk/

これはEclipse + ADT pluginで構成されてるSDKなので、自分で環境入れようと思えば入れられるけど、今回はめんどくさいのでこれをそのまま利用。
楽できるところは楽しないと、ね?(言い訳

これは英語版なので必要であればPleiadesをいれて日本語化をして使いやすいように。
私はめんどくさいので日本語化しました。(ぇ

日本語化の手順は、

  1. Pleiadesサイトからプラグインをダウンロード。

    Eclipse 日本語化 | MergeDoc Project

  2. ダウンロードしたファイルを解凍してそれぞれのファイル(pluginとか)の"中身"をADTのEclipseのファイル(pluginとか)を"開いて"コピペまたはD&D。*1
  3. Pleiadesのreadmeファイルを参考にeclipce.iniファイルに追記。
    私の環境だとこんな感じなので、このiniファイルの末尾にPleiadesのパスを追記。
    /Applications/adt-bundle-mac-x86_64/eclipse/Eclipse.app/Contents/MacOS/eclipse.ini
    -javaagent:/Applications/adt-bundle-mac-x86_64/eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
  4. 再起動すればあら簡単、日本語化されちゃう。

という感じ。

後は、ADTを最新化して、これでAndroidの開発環境は完成という感じで。
起動したついでに今回開発するためのプロジェクトを作成して完了。

次は、Twitterクライアントを作る上で必要になるTwitter4Jを用意。
以下のサイトからダウンロード。

http://twitter4j.org/ja/index.html

ファイルを展開したら、/lib/twitter4j-core-4.0.1.jar を、ADTで作成したプロジェクトの/libs にコピー。

これでライブラリの設置までは完了なので、次からは実際に利用するためのUtilを作成してく感じで。

おつかれさまでございました。 

*1:環境がMacなのでここでWindowsと同様にD&Dすると、ご丁寧に中身全消しした上に新しいファイルを置いてくれる"親切な"Macに泣いた事がある。

Androidアプリを作ってみる。

Android再入門 - Twitterクライアントを作ってみよう - Twitter APIを使うアプリを登録 - Qiita

上記記事を参考に、AndroidアプリでTwitterクライアントでも作ってみようかと思ったり。

とりあえず、まずはTwitterデベロッパー登録を。 
https://dev.twitter.com/

上記サイトで必要なアプリ情報を登録したり。
しようとしたら、アプリ名がありふれてて「既にあるけど」って言われてしまった。

f:id:nh-t:20140320021108p:plain

こんな感じで入力項目に入力して、規約に同意したら作成ボタンで作成完了。

CallbackURLは設定しとかないとデスクトップアプリと認識されるらしいので、何かしら入力しておいた方がいいらしいです。

で、この状態だとアプリのパーミッションが読み取り専用になってるっぽいので、利用の用途に合わせてパーミッションを変更。
今のところDM使う予定はないので「Read and Write」に設定。

あと、APIが1.1になる前の記事なので、以下の補足記事も。

Twitter APIと開発者規約変更のインパクトまとめ:結局、Twitter API 1.1で何が変わる? 5つのポイント - @IT

今日は一旦この辺で。
次からは開発に向けて準備していきましょうかね。

XperiaAXになりました

先日、XperiaGXからXperiaAXに携帯が変わりました。
理由としては、GXがお亡くなりになったからです。
まぁ、とりあえずroot取ろうかと思ったら、復元うまくできないかもしれないという話を見て躊躇ってしまったり。
もうちょっと調べてみて大丈夫そうならまたroot取ろうかなぁ。

XperiaGX(4.1.2)でRoot取得する+カメラの無音化

気がつけばXperia GXにもAndroid4.1のアップデートが来ていたので、いそいそとアップデートをしたのですが。
root取得した状態でアップデート出来た割にすぐにrebootするので、なんでだろうと友人と話していたらその場で数回rebootしたので「フルリカバリかけたら?」とのこと。

Rootの取得

で、リカバリかけるとAndroid4.1になっていたので、root取得方法を調べてみました。
今回参考にしたのは以下のサイト。
http://cubeundcube.blogspot.jp/2013/07/xperia-gx-so-04d-sx-so-05djelly.html

こちらのrootkitを使って手順通りに作業するとあっという間にroot取れました。
あと、今まで不具合でてた分も問題なくなったので、多分前回font入れ替えでミスってboot loopしてたのを復元した際に、どうもきれいに復元しきれてなかったようで。

カメラのシャッター音を無音化

ので、ついでにカメラの音声ファイルをさくっと参照変えてならないようにしました。

root参照できるアプリ(今回はESファイルエクスプローラ)で"system"配下に書き込み権限をつけて、"system/media/audio/”配下の”camera”ディレクトリを”_camera"に。

また、"system/media/audio/ui/"配下の以下3ファイルをリネーム。
※これ以外にあるかもしれないけれど、一応これくらいかなーと低い英語読解力で判断。

  • camera_click.ogg
  • camera_focus.ogg
  • VideoRecord.ogg

これで無事カメラの無音化が出来ました。
あ、無音化してもくれぐれも適切な使用方法をお願いいたします。