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

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

BlackBerry Q5を中古で買いました。

前回、友人に乗せられてNokia Lumia920を買ったわけですが、
流石に公式が言う程度には重い訳です、物理的に。

で、軽い端末を探して見つけたのがBlackBerry Q5でした。
ちょうど中古が安かったのでそれを購入。

見た目

見た目はiPhone5sより小さめで、物理キーボードがあるために画面サイズは小さいですが大変持ちやすい。
しかもめちゃくちゃ軽い。 びっくりするほど軽い。

キーボード

ぱっと見、キーボード小さくて打ちづらいかも?と思ったのですが、
両手でぽちぽち打ってる分には全然不満はないです。
プチプチとボタンを押す感じが個人的にはとても好きです。

動き

で、動きもさくさくですし、何よりAndroidのapkが使えるのがいいですね。 しかも、apkをBOXとかDropbox経由、またはプリインストールのAmazon Appを使えばインストール可能というのもありがたい。

まぁ、敢えて言うならばGoogle Play のapkをインストールして頂きたいところ。
上記のAmazon Appだとインストール出来るapkが限られているので、見つからなかったりするんですよね。
あと、apkインストール出来ないやつとか、インストールしたけど起動出来ないとかもあるので、全部が全部apk使えるわけではないですが。
でもBlackBerryのアプリストアはあんまりアプリの数がないので、それを考えるとだいぶ使えるアプリが増えます。

ネットワーク

このQ5、実はLTE対応と書いてあるのですが、日本で扱ってる帯域と被ってないらしいので
結果としては3Gを使っている様な形です。
でも、ちょっとメール見て、Webページ見てって感じで使う分には不足ないです。

というわけで、新たなおもちゃが増えました。

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取ろうかなぁ。