投稿

2012の投稿を表示しています

[iOS]UIViewの階層構造を調べるrecursiveDescription

UIViewの階層構造を調べる為につかえるメソッドのメモ 自作のUIViewの子クラスのhファイルに以下の記述を追加 - (NSString *)recursiveDescription; 使いたいところで以下を呼び出す。 NSLog(@"%@", [self recursiveDescription]); こんな感じで階層構造が出力される。 2012-12-30 23:54:58.902 CustomTableTest[5767:c303] > | > | > | > | > | > | > 2012-12-30 23:54:58.915 CustomTableTest[5767:c303] resizeTable after {{0, 0}, {300, 50}}

iOSアプリのインストール日時を取得する

イメージ
前回に引き続き、AndroidとiOSのアプリ作成での調査メモを。 Androidはアプリケーション自身が「自分がいつインストールされたのか」を取得できるAPIが存在しますと。 アプリケーションのインストール日時、更新日時を取得する TechBooster APIレベル9,Android2.3からではありますが、このうちインストール日時が特に使いたい機能だった訳です。 で、コレに相当する機能がiOSにあるのかどうか、ここ数日しらべまくりました。 結論から言えば、一発で取得できるメソッドは無いけど、取得はできる、だろうと。 Androiのように上手く取得できるメソッドが無いので、sysctlとかNSTaskとか色々探したものの、すべて検討違いなところで、最終的にはすでに買ってあったObjective-Cの逆引きハンドブックに書いてあったというオチ。 肝はインストールされる「*.app」自身のタイムスタンプを取得できればよいということで、 1、NSFileManagerをつかう 2、ホームディレクトリからアプリ自身のappファイルのパスを設定する という2点でできました。 以下、サンプルコード。 アプリの名前が「AppTimeTest」という前提。 - (void)viewDidLoad { [super viewDidLoad]; //outletの代わりに紐付け textAppInstallDate = (UILabel*)[self.view viewWithTag:2]; textAppUndateDate = (UILabel*)[self.view viewWithTag:4]; textAppFilePath = (UILabel*)[self.view viewWithTag:6]; NSString *appFilePath; //ホームディレクトリパスを取得 appFilePath = NSHomeDirectory(); //ディレクトリパスにappファイル名を追加。 [appFilePath stringByAppendingString:@"AppTimeTest.app"];

スマホアプリのUIデザインとプログラム作成の分離

スマホアプリ開発について。 どうもUIデザインとプログラム作成を物理的にも別々のチームで実施しなければならいようで、「UIデザインの成果物とプログラム作成の成果物」をなんとか分離できないものかと画策しています。 まぁ世間のアプリ開発しているチームの大半はデザイン担当とプログラム作成担当は隣のデスクで分離なんていらないのかも知れませんが…。 まず、AndroidについてはXMLにレイアウトが集約されており、ActivityクラスからXMLの名前をしていし、そこからXML上に設定された各部品のidを指定する事ができるので、こちらはUIデザイン担当はXMLの作成とidの指定をすれば良いであろう、という見解になりました。 問題はiOSについてで、どうやらStoryboardを何も考えずに使うと、ViewとControllerクラスの宣言がStoryboard上でくっついているので「後からコーディングでViewとControllerを紐付ける」という操作が出来ない様子。 実際、プログラム上でself.storyboard instantiateViewControllerWithIdentifierを使っても返ってくるのはControllerなのでviewだけ引っこ抜く事が出来ません。(ここでのselfはカスタムVewController) で、一旦tempControllerという変数に入れて、self.view = tempController.viewとか無理矢理やってみたけど、だめだった。 色々さまよった結果、どうやらStoryboardを使いながらカスタムViewControllerを使うなら、Storyboard上で各画面(シーン)にカスタムViewController紐づける必要がある、というやり方しか見つけられなかった。それではUIデザイン担当がカスタムViewControllerのクラス名を知ってもらう必要が出てくるので、もう少しUIデザイン側がプログラムを知らなくても良いようにしたいなと。 で、Storyboard以前の仕組みであるNibファイルを使うやり方だと、Nibファイル側では具体的なControllerクラスの名前を知らなくても、Controllerクラス側でNibファイルと自身のviewを紐づける事ができるので、デザイ

mavenからのstruts2練習

イメージ
herokuを使ってみて「そもそもmavenに慣れよう!!」ということで、maven練習のメモ。 まずは、 techscoreのmaven を参考にstrutsアプリをmavenで構築。 以下メモ。 pom.xmlのrepositories、pluginRepositoriesは指定しなくても良いらしい。というか、むしろsnapshotサイトと呼ばれるものを指定するのはやめておけ、という意見もちらほら見かけた。 maven-compiler-pluginはversionを指定しないとmvnコマンドでワーニングが出る。 mvnからtomcatの操作は上手く行かなかった(tomcat7使ったから?)ので、使わなかった。 pom.xmlを更新したらmvn eclipse:eclipseをたたく→Eclipseのプロジェクトを「リフレッシュ」すれば良い。 warが生成されるけど、いらない。それを止める方法は、まだ探してない…。 で、ここからが(結果的に)メインディッシュ。struts1は使った事あるので、さらにstruts2でtechscoreと同じアプリを作ってみることにした。 1.プロジェクト作成 まずは、mvnでディレクトリを準備。アプリ名はwebchat2とした。 cd {eclipseのworkspace} mvn archetype:create -DgroupId=com.example.webchat2 -DartifactId=webchat2 -DarchetypeArtifactId=maven-archetype-webapp javaソース用のディレクトリを準備して、プロジェクトをeclipseで使えるようにする。 cd webchat2 mkdir -p ./src/main/java/com/example/webchat2 mvn eclipse:eclipse ここでEclipseで「インポート>既存プロジェクトをワークスペースへ 」を選んでプロジェクトをeclipseに認識させる。 ※M2_REPO変数の定義忘れずに。詳細は techscoreの4.Eclipseとの連携 を参照。 2.pom.xml修正 で、pomを以下のように変更。 pom.xml <project xmlns

初めてのherokuでJavaデプロイ

herokuを触ってみようとおもって、herokuでjavaを動かそうとトライした時のメモ。 基本はこちらの2つを参考にさせて頂きました。ありがとうございます。 酒浸りの日々 daicham blog 参考にさせて頂いたブログを見ればherokuのへのpushまでは行けます。 で、自分のアプリにアクセスしたところエラー発生。ブラウザの画面には以下のメッセージが。 Application Error An error occurred in the application and your page could not be served. Please try again in a few moments. If you are the application owner, check your logs for details.  おやぁ? ログを見てみようか…。 $heroku logs (中略) 2012-02-21T14:46:17+00:00 heroku[slugc]: Slug compilation finished 2012-02-21T14:46:19+00:00 heroku[web.1]: Starting process with command `sh target/bin/webapp` 2012-02-21T14:46:20+00:00 app[web.1]: Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld 2012-02-21T14:46:20+00:00 app[web.1]: Caused by: java.lang.ClassNotFoundException: HelloWorld 2012-02-21T14:46:20+00:00 app[web.1]: at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294) 2012-02-21T14:46:20+00:00 app[web.1]: at java.lang.ClassLoader.loadClass(ClassLoader.java:266) 2012

ファンクションポイントベースの資料

ずーっと前に 「なんで皆ステップ数で規模とか品質はかるんだ!そんなのシステムによって変わるから今の時代はFPで計測してくれー!」 と書いたら2010年に経済調査会なるところが使えそうなネタを公開していました。 経済調査会 経済調査研究所 研究レポート「ソフトウェア開発データリポジトリの分析」(2010年7月) ここに上がっている中でビットがたったのが8章「FP生産性に関する分析」です。 この中では、工期とFP生産性の関係、ウォーターフォールと繰り返し型開発のFP生産性などが公開されてたりします。 なかでも興味深かったのは8章最後の「最大開発要員規模比とFP生産性」です。 最大開発要員規模比=最大開発要員数/実績FP規模 で算出するため、最大5人で500FPのシステムを開発すると0.01となります。 この資料ではいくつかの分析でFP規模を1000未満と1000以上で分類しているものがあり、最大開発要員規模比の場合も分類されています。 先ほどの500FPの例を考えると、最大開発要員規模比は0.01未満、あるいは0.01〜0.15未満だとFP生産性はそれ以上に比べて1.5倍以上良くなるようです。  (なお、7人で500FPだと0.014。) 普通のプロジェクトでは、人員は最初少なく、途中で最大になって、最後は少なくなると思うので、3→5→3とか、4→7→4てな感じで500FPのシステムを作りきれたら「普通にこなせた」と言えるという事でしょう。 ただ、注意しなければらないのは工期の関係でどうしても最大開発要員数が高くなる場合もあると思います。また、このデータ自体「火を吹いて人員を大量投入されたプロジェクト」も入っているのではと思います。 従って、あくまで「どっちのほうが生産性が良いか」という傾向をつかむ為に使えるとは思いますが、実際の「どれくらいの生産性なのか」「何倍の生産性なのか」という値は参考程度にとどめて実際の見積もりに使うのは避けた方が良いのではないか、と思ったのでした。