2012年4月30日月曜日

BufferedReaderから、文字列を取り出す #scala

よく使いそうなんだけど、忘れそうなのでメモ。


  private def readContentString(reader: BufferedReader) = {
    def readerLocal(accumulator: StringBuilder): String = {
      reader.readLine() match {
        case null => accumulator.toString()
        case content => readerLocal(accumulator.append(content))
      }
    }
    readerLocal(new StringBuilder)
  }


accumulatorをStringにして accumulator + content

なんてことをやったら、ダメなんだろうなと最近知りました。

ループの中で文字列を連結するときに + は避けたほうが良いよという話です。

バイトコード言いよバイトコード。

2012年4月29日日曜日

第2回Androidテスト祭り #atecfes2

今回は、"第2回Androidテスト祭り"に参加してきました。アマチュア開発者なんか、空気じゃね? みたいな不安はありましたが、まあいつもどおり気にせず突撃。一人継続的インテグレーションもやってるし、大丈夫だろう、的な。

最初は、長谷川氏の挨拶から。

テスト部は活動として、Testterを叩き台にしてユニットテストを行ったり、@ITでAndroidテスト入門を掲載誌たりしているとのこと。

そして、第1回テスト祭りではV字モデルの下層の話。設計工程の作りこみが重要と言うテーマだったそうです。

今回の第2回テスト祭りは上層の話として、セキュリティ、受け入れテスト、CI,リモートテストの話がメインとなるとのこと。

その後、東海大学の濱本先生から説明が。今回の会場である東海大学高輪キャンパスは情報通信学部の拠点でIT系産業への即戦力の育成を行なっているのだとか。

さて、最初の講演者はタオソフトウェアの谷口氏。Androidのセキュリティ本を書かれた方だそうです。

内容もセキュリティの話で、例えば次の様な内容。

    .apk内のリソースは簡単に抜き出すことができる
    アプリ間の通信を悪用することができる
    正しいパーミッションを設定しましょう
    避けたいパーミッションの組み合わせを理解しましょう
    Intent発行時のログに注意しましよう
   
現状の問題点として、開発者の知識不足が挙げられていました。Android独特のセキュリティの仕組みを理解できていないと大変なことになる、と。

次は、討論と言うことで受け入れテストのガイドラインを作成しようという話。

まあ、受け入れテストって何ですか? ってレベルなんですけどねorz

要は、Androidの様々なプラットフォームでの動作の保証とか、怪しい動きをしない保証とか、みたいです。多分。

そのガイドラインの参考として、AppStoreやAppHubのガイドラインを参考にするのは良いんじゃないかな? とも。

さて、討論と言うことでベンダーはテスト部の方、そしてユーザとして電通の社員の方が登壇されていました。

とは言え、電通はクライアントであると同時に発注元でもあるのでちょっと特殊らしいのですが。

挙げられた質問と解答のまとめを。

Q.Android開発は、どんなに頑張っても全ての端末に対応できない。そこで、後からサポートする形のビジネスモデルはありか

A.技術力の高い開発元とパートナーとなるのならば、その方式は有り

Q.発注元のAndroidアプリ受け入れの現場に、どんな問題意識があるのか

A.発注元はスマホのアプリで何が出来るのかよく分かっていない。Android,iPhoneが一緒だと思っている。受託側が率先して提案をしたり、イメージや動く物を見せる必要がある。

Q.受入れ試験、機能、非機能要件の定義はどうやっているのか。開発プロセスは回っているのか。

A.現状、うまくいっていない。
アプリ開発はマーケターが関わる必要がある。クリエィティブな感覚と、テクノロジーな感覚の両方が必用。
この新しい領域を表す言葉がない。魅力の指標のようなものがないので、なんとかしたい。


ざっとまとめるとこんな感じ。ぶっちゃけ、電通の人は話し方は面白いけど、話の内容がまとまってない感じがしてちょっと辛かった。

ただ、最期の今まで黙認知とされていた部分の指標を作ろうという試みは面白そう。俺が見つけた研究では、電化製品のマニュアルの難しさをビー玉を用いて表現するという物があり、それに似たようなものを感じた。

仮に成功すると
・難易度を指標にしたコストの予測
・技術者のレベルがはっきりとする
・クリエイターのレベルもはっきりとする

と言ったメリットがあるのではないだろうか。もちろん、簡単にはいかないだろうし、数字を狙いに行く方法にシフトしてしまう可能性もあるけれど。

さて、次はJenkinsの導入ライブ。

ぶっちゃけ、設定はhttp://jenkins.android-tec.orgを参考にすればいいそうです。

これは、俺が先日3日ばかりかけてどうにか動けるようにした、Jenkinsさん。いや、大変だった。

複数のデバイスを対象にしたビルドとテストができることを知ってちょっと感動。とは言え、試すほどの環境があるわけでもないけど・・・

次はLT

個人の開発でもテストの効率化を行なって行きましょうという話。

ただ、テストをする時はテストの目的をはっきりとさせる必用があるという事。

例えば、バージョンアップをするのか、実デバイスが必用かどうか、試験工数はどうか、対応予定端末はどうか、など。

その上で、様々なテスティングフレームワークを使い分ける必用があるという。

割りと俺は、最近テストに興味がでてきたのでJUnitを使ったりしてそれっぽいことを

次はJenkinsとGerritの話。Gerritはgit上のソースコードレビューシステムらしい。Google製。

しかし、Jenkinsはともかくとして一人ソースレビューは辛いものが・・・

最期のセッションは、三大リモートテストサービスとして
NTTDocomo
ソニックス;Scirocco Cloud
化とマックス:リモートスマホレンタル

のお話。いずれも一長一短がありと言うこと。アマチュアの利用者としては、ScirrocCloudが無料で使えるのがおいしいのですけどねw

ちなみに、動作が最も速いのはリモートスマホレンタルでした。

さて、クロージングセッションは松木さんから。

ここで俺にとっては衝撃の事実

チェック=予め知っているものを確認する「作業」

テスト=知らないものを”わかる”ための「技術」
     何がわからなくて、何が知りたいのかを定義しないといけない


ま じ で

俺がずっとやってきたのはチェックだったのか・・・oh...

このあとの懇親会では、色んな人に声をかけかけられ

Android勉強会の宣伝をやってきました。濱本先生、興味を持って下さってありがとうございます。

そのうち、企業の人とか教授とかになんかお願いしたいなー とか

2012年4月14日土曜日

【Java】WikipediaシソーラスAPIを使う【wikipedia】

Wikipediaシソーラスを使う。

企画しているAndroid道で作る練習アプリのネタで、Wikipediaシソーラスを使おうかなって考えました。

と言うのも、なんか
  • AndroidやJavaの基本機能の練習はやりたい
  • でも、作って面白いものにしたい
  • 誰かに自慢できる感じのもの
  • ちょっと、斜め上を目指した感じ

のアプリを作ろうとおもったから。ランダムにWikipediaの項目を表示するアプリはあるけれど、シソーラス検索するアプリは無ってことで、オリジナリティもあるし。

早速、SIGWPからWikipediaAPIのソースをDLしてきました。

実は、WikipediaAPIへのチャレンジは2回目。卒研の時も、このライブラリを使おうと思ったけど、なぜか上手く行かず。

仕方なく、WEBにで提供されている検索結果のHTMLを解析する荒業に出ました。

まあ、理由は色々とあるのですが、そもそも公式でリファレンスを配布していないことも原因の一つかと。

Apache/Axisくらい使えるよね? って感じでしょうか。いや、いいんですけど。

公式サイトに設定されているコードの例もどうやら古いバージョンのものらしく、掲載されているクラスもメソッドも無い。

どうにか、ソースを読んで使えるようになりました。シソーラス単語と関連度を取得するコードが以下。

public class Main {
 // private static final String TAG = Main.class.getSimpleName();

 /**
  * @param args
  * @throws Exception
  */
 public static void main(String[] args) throws Exception {
  // TODO Auto-generated method stub
  ServiceStub serviceStub = new ServiceStub();

  GetTopCandidateIDFromKeyword keyword = new GetTopCandidateIDFromKeyword();
  keyword.setKeyword("サクラ大戦");
  keyword.setLanguage("Japanese");

  GetTopCandidateIDFromKeywordResponse response = serviceStub
    .getTopCandidateIDFromKeyword(keyword);

  GetThesaurusDS getThesaurusDS = new GetThesaurusDS();
  getThesaurusDS.setLanguage("Japanese");
  getThesaurusDS.setIFrom(response
    .getGetTopCandidateIDFromKeywordResult());

  GetThesaurusDSResponse resp = serviceStub
    .getThesaurusDS(getThesaurusDS);
  GetThesaurusDSResult_type0 result = resp.getGetThesaurusDSResult();
  OMElement element = result.getExtraElement();
  XMLStreamReader reader = element.getXMLStreamReader();
  try {
   while (reader.hasNext()) {
    reader.next();
    if (reader.isStartElement()) {
     String tagName = reader.getName().toString();
     if (tagName.equals("l_weight") || tagName.equals("name")) {
      reader.next();
      System.out.println(reader.getText());
     }
    }
   }
  } catch (Exception e) {
   e.printStackTrace();
   System.out.println("error");
  } finally {
   try {
    reader.close();
   } catch (Exception e) {

   }
  }
  System.out.println("end");
 }


XMLの解析でちょっと手こずったりしましたが、何とかうまくいきました。

得られるデータは、関連度順でソートされているようです。ですが、今回は関連度は利用するつもりは無いのでこの順番を維持したまま返してやる仕組みを作ればいいかなと。

しかし、与えられているメソッドの名前はどうにかなりませんかね・・・。getGethogehogeとか、もうね。

2012年4月11日水曜日

ADTr18へのアップデートとか、NexusSがAndroid4.0になったとか





Android4.0搭載の端末欲しいなぁって思ってました。

Galaxy Nexus欲しいなぁって思っていたら、NexusSに4.0のアップデートが来ました。

で、寝ぼけて間違えてアップデートしてしまいましたorz

お陰様で、先日作ったアプリが早速動作しない不具合が露見。

いや、実は問題で2.3系統以外で動かすとアクションバーが正しく動作しないことは既知の問題だった。しかし、Android4.0端末からのマーケットへのアクセスが少ないこと等が、

デベロッパーコンソールの統計情報から分かっていたので無視していた問題だった。

自分自身が、それで困ることになろうとはorz
Android2.3 アクションバーが表示される
Android4.0 アクションバー表示されない






















おいおいアップデートをしていこうと思っています。

次に、ADTのバージョンがr18にアップデートされました。

既に記事にもなっている通りエミュレータがGPUアクセラレーションに対応。エミュレータの実行速度をより高速にすることができたんだとか。

早速設定。

Using th Android Emulator | Android Developers

上記を参考に、エミュレータを作成する。



  • TargetをAndorid4.0.3(API Level15)かそれ以上に設定する
  • グラフィックアクセラレータを使うには、Hardware セクションで Newをクリック、GPU emulator を選択しYesを設定
  • その他の設定
    •     この時、ShapshotをEnableにしてはいけない。

しかし、起動することなく強制終了してしまう。

現時点で手に入れた情報の限りでは、同様の症状が発生している人が多い。と言うか、うまくいっている報告が無い。

一応、今後の為に開発用マシンのハードウェア構成を晒しておく。

CPU:Intel Corei7 920
M/B:MSI X58A-GD45
Graphicks:nVidia GeForce 560Ti,nVidia GeForce 460
Windows 7 64bit SP1

2012年4月3日火曜日

[リリース]簡単帳簿[作った]




今回リリースしたアプリの機能は非常にシンプルなもの。

買い物をしたら、商品名と値段を入力し表示する。ただそれだけ。

コード的にも、そんなだいそれたことを行なっているわけではない。あえて言うなら、DatePickerを日にち部分のみ表示しないように手を加えたレベル。







こだわりポイントは、ActionBarを採用したこと。今まではLinerLayoutを使ってそれっぽいものを実装していただけだったけど今回はAndroid3.0以降でもちゃんとActionBarとして認識されるActionBarを利用した。

とは言え、サンプルコードで与えられているActionbarCompatを流用しただけなんだけどね・・・。

あと、開発のプロセスとして継続的インテグレーションっぽいことを取り入れた。JenkinsとGitを使ってビルドとテストが通るまで眠らないあの日々・・・。

結論としては、一人継続的インテグレーションのメリットって・・・?な感じだけど、とは言え将来的に利用する日が訪れた時にいい事があるかなぁって感じ。

あと、珍しくCPUを回す作業なので今まで半分寝ていたサーバーを上手く活用できたかな、と。

という訳で、GooglePlayで公開中なのでぜひともダウンロードしていただきたいものです。

ダウンロードはこちらから