2014年5月20日火曜日

doxygen+graphvizでXCodeプロジェクトのクラス図を作る

特に自分がハマった点を中心に。

・・メモる前に間違えてターミナルを閉じてしまって途方に暮れている。。
思い出す限りで書きます。。ショック。


環境: OSX 10.9.2

主な参考記事
http://qiita.com/paming/items/b40662d4e3494c00ae30


doxygenとgraphvizをインストール

Homebrewを使いました。

brew install doxygen graphviz

以下ログ
==> Downloading http://ftp.stack.nl/pub/users/dimitri/doxygen-1.8.3.1.src.tar.gz

################################################################## 100.0%

==> ./configure –prefix /usr/local/Cellar/doxygen/1.8.3.1
==> make
==> make MAN1DIR=share/man/man1 install
Warning: Could not link doxygen. Unlinking…
Error: The brew link step did not complete successfully
The formula built, but is not symlinked into /usr/local
You can try again using `brew link doxygen’
Error: Permission denied - /usr/local/opt

パーミッションエラーが・・・
https://github.com/Homebrew/homebrew/issues/19670
こちらの解決策に従います。

sudo chmod -R $USER /usr/local
ドキドキしながらchmod。

もう一度チャレンジ。
brew install doxygen graphviz

今度は、doxygenはインストールできたが、graphvizが出来ない模様。
libpngが404でErrorとか言われる。

https://github.com/Homebrew/homebrew/issues/20109
これこれ。これが発生。

というわけで、
brew update
を実行する。

・・updateできない。。

http://boiled-octopus.blog.so-net.ne.jp/2013-03-24
これこれ。これが発生。

上の記事を参考に、
git diff
とやったら抜けられなくなって焦るgit初心者。
qとかwqとか叩いたら抜けられたような・・うろ覚え。

git statusで、masterに変更が無い状態にできたのを確認して、
再度brew updateを実行する。

・・できた!!

この状態で、
brew install graphviz
してみると、成功。
doxygenとgraphvizがインストールできた模様。


XCodeのプロジェクトをdoxygenしてみる

htmlフォルダが作られてしまうので、
対象のプロジェクトをコピーしたものにdoxygenしました。ビビリなもので。
対象のプロジェクトのディレクトリに入ります。
AppDelegateがある階層にしました。(どこでも良いでしょう)

doxygen -g

を実行すると、「DoxyFile」というファイルが生成される。
vim使いではない私は、これをファイルエディタ等で開いて、中身を編集。

http://momijiame.tumblr.com/post/23166110981/doxygen-graphviz
http://www.fides.dti.ne.jp/~oka-t/doxygen.html
こちらの記事を参考にしました。
前者の方と同じ内容で実行しています。

さあ、 いざdoxygen!

doxygen

ずらずら〜〜〜とファイルが生成されていきました。
やった!

同じ階層に出来上がったhtmlフォルダのindex.htmlを開く。
Classes - Class Hierarchy
生成されたクラス図を見る事ができました。わいわい!

以上です。

2013年6月25日火曜日

UIImageをタイルで並べたら黒い線が出た

Viewの背景をパターン画像でタイル塗りした時に
一定間隔で黒い線が出ている。。
iOS5.1で現象を確認。

    UIImage* bgImage = [UIImage imageNamed:@"xxx.png"];
    [targetView setBackgroundColor:[UIColor colorWithPatternImage:bgImage]];

こんな感じで書いてるんですが。

原因は、XCodeが行うPNGファイルの圧縮によるもののようです。

・プロジェクトのBuild Settings - Packaging - Compress PNG Files を No にする。
または
・http://d.hatena.ne.jp/wasabi-arts/20090301/1235856525

こちらの方法で解決しました。

2013年6月15日土曜日

ADT22.0にしてみたら

PagerAdapter実装してるところでExceptionが出た。

 java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged!
うんぬん。。

解決策はこちらにあって。
http://stackoverflow.com/questions/16756131/fragmentstatepageradapter-stopped-working-after-updating-to-adt-22

コンテンツを追加等した後は、
notifyDataSetChanged()
を呼ばないとダメになったようです。

http://developer.android.com/reference/android/support/v4/view/ViewPager.html
リファレンスにも書いてありました。。
すんませんでした。。

2013年6月5日水曜日

Push NotificationsをEnableにしようとしてハマる

iOS Apps - Identifiers - App IDs - iOS App ID Settings
Push NotificationsをEnableにしようとしてハマった事


■Service - Push NotificationsをEnableにするため、
Enableにチェックを付けてDoneするが、Disableのまま変わらない。

(原因)
既に作成してあるCertificateが古いため(?)Enableに出来ない。(??)
Expiresが期限内であっても、
作成した時点から一定期間過ぎていると、うまくいかないようです。

(対応)
既に存在するCertificateをRevokeして、
新しく「Create Certificate」する。

これでEnableにできるようになりました。


■ アプリにプッシュ通知の確認アラートが出ない

(原因)
Provisioning ProfilesにPush NotificationsのEnable状態が反映されていない。

(対応)
iOS Apps - Provisioning Profiles - iOS Provisioning Profiles
該当のProfileを選択し、Editする。
内容に変更があってもなくても、Generateする。
更新したProfileをダウンロードして、Organizerに反映し、XCodeを再起動。
アプリをビルドし直す。

※Enables Servicesに「Push Notifications」の文字が見えていても、
Enableにした後、Editし直していなければ、
それは見かけ倒し。(←だまされた…)

該当のProvisioning Profileをテキストエディタで開いて、
<key>aps-environment</key>
上記キーが存在していなければ、Editし直す必要があります。


以上です。

2013年5月29日水曜日

iOSアドレス帳にグループ追加でハマる

ABAddressBookAddRecord
結果がfalseになって、グループ追加ができない・・なぜ! を調べている。

今のところ、auとsoftbankで連絡先の挙動…仕様…が異なるせいかと。 
auの方がややこしい印象。


【softbankの場合】
・iOS5
 未検証

・iOS6
 iCloudアカウントが未設定:trueが返る
 連絡先のデフォルトアカウント:項目なし

【auの場合】
・iOS5
 検証中

・iOS6
 iCloudアカウントが未設定:false
 iCloudアカウントが設定済み:これだけではfalse
 連絡先のデフォルトアカウントがキャリアメール:false
 連絡先のデフォルトアカウントがiCloud:true !!

au iPhoneの場合は、連絡先のグループ追加をするには
連絡先のデフォルトアカウントにiCloudが設定されている必要があるようです。

softbankは、iCloudアカウントを設定してなくてもできました。


・グループ削除
削除したいグループが存在している状態ならば、
iCloudアカウントの設定状態に関わらず、実行できました。
(au iOS6で確認)

2013年3月26日火曜日

そうだったのかService

AndroidのServiceのこと。
サービスってメインスレッドで実行されてるんですね
勝手に別スレッドでやってると思ってた・・・。

サービスのスレッド作ってそこで処理走る訳じゃないよ、
ANRのリスクを減らしたいなら別スレッドを自分で用意してねと書いてあった・・

2013年1月31日木曜日

cocos2dxのBox2Dプロジェクト

cocos2d-xのBox2Dプロジェクトを
Android用にビルドするときにはまったメモ。

以下、太線部分を追加します。

・HelloWorldScene.hを書き換える
#include "Box2D/Box2D.h"

・Android.mkを書き換える
15行目付近
LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static cocosdenshion_static cocos_extension_static box2d_static

19行目付近
$(call import-module,CocosDenshion/android) \
$(call import-module,cocos2dx) \
$(call import-module,extensions) \
$(call import-module,external/Box2D)


以上です!

cocos2d-x Eclipseで編集&実行

 XCode環境でcppファイルを編集して、Androidで動作確認する時には
build_native.shを叩いてビルドして実行。
・・のような手法が主流?のようですが
Eclipseでcppファイルを編集&ビルド&実行する方法も調べてみました。

 http://kayosystem.blogspot.jp/2012/11/macandroidcocos2d-x_14.html
こちらを参考にしました。

EclipseでC/C++環境を作るところ等々は割愛します。
自分がハマったところだけメモ。


・NDK_ROOTが見つからない場合
CDTのBuild Consoleに
「NDK_ROOTがないよ」みたいなことでビルドが出来ない場合、
proj.android/build_native.shに
NDK_ROOTを宣言すると良さそうです。

私は、.bash_profileにNDK_ROOTを設定していましたが
(・・設定しているはずですが(自信無し))
上記のようなエラーでビルドが通りませんでした。

ついでに、environment.plistも設定してみたのですが
それでもうまく行きませんでした・・。
設定の仕方が悪かっただけでしょうか。謎。

build_native.shの32行目付近に
(最初にNDK_ROOTという変数が出てくる前に)
NDK_ROOT="ndkのパス"
を追加したところ、ビルドが通るようになりました。


・icon.pngでエラー
無事にビルドが通り、いざRunしようとすると
プロジェクトにエラーがあるぞと言われました。
drawable-hdpi/icon.pngに×マークが出ます。
なぜ・・。

最初は、アイコンサイズが80x80になっているから??
と思い、Resources/Icon-72.pngを72x72にリサイズしてみましたが
(というか名前に72とついてるのに何故80なのか)
エラーは相変わらず。

何故! と思い、エラーが出ている状態で続けて
Run As - Android Application を押してみた所
今度はエラーが消え、実行することができました・・。

今の所、2回に1回、実行できる感じです。
不便・・。

どこにもこのような情報が無いと思われるので
私の所だけで起きているのかもしれません。
解決できるといいな・・。

それ以外は、無事にEclipseでcppを編集&実行できました。


2013年1月30日水曜日

cocos2d-xをAndroidでも動かす

目標:cocos2dxのプロジェクトがAndroidでも動くようにする。

動作確認した環境
Eclipse:Indigo
XCode:4.3.2
AndroidNDK:r8d
Cocos2d-x:cocos2d-2.0-x-2.0.4 
ADT:21.0.0.


・環境構築…省略
http://mdlab.jp/project/framework/01.html
こちらを参考にしました。
AndroidNDKのパスを通すところまでやっておく。
…そこまで色々あった気もしますが、思い出したら追記します。


・Android用のcocos2dxプロジェクトを作成する
create-android-project.shを実行する。
targetIDは7とかにしました。お好みで。
プロジェクト名は、XCodeで作成するプロジェクトと同一になるように意識。

出来上がったプロジェクト名のフォルダを、一旦退避。
(この後XCodeで同じ階層に、同じ名前のフォルダを作成することになるため)
フォルダ名をリネームで良いでしょう。(プロジェクト名_androidとか)


・XCodeでcocos2dxプロジェクトを作成する
ProductNameとAndroid用のプロジェクト名が同じになるように作成。
作成先のディレクトリはcocos2dxの直下にしました。
(どこでもよいと思います)

これで、Android用とXCode用のプロジェクトが揃いました。


・XCodeの方にAndroidのプロジェクトをマージ
 XCodeで作成したプロジェクト内の以下の場所に、
 Androidで作成したプロジェクトに入っているproj.androidをまるっとコピーします。
例)プロジェクト名がSample01の場合
Sample01/Sample01/Classes
Sample01/Sample01/...
Sample01/Sample01/proj.android
こんな感じの構成になるように。

・build_native.shを編集
テキストエディタなどで、proj.android/build_native.shを編集します。
40行目付近
COCOS2DX_ROOT="$DIR/../../../"
(Android用プロジェクトと比べて、cocos2dxまでの階層が1つ深くなったので)

私はプロジェクトをcocos2dx直下に作ったので
上記のように「/..」を1つ増やす感じでしたが
任意の場所に作られている場合は、
ここは絶対パスで指定する必要がありますね。


・build_native.shを実行
実行します。
たくさんのファイルがコンパイルされていくはずです。

そういえば、先ほど作成したAndroid用のプロジェクトフォルダはもう使用しません。
proj.androidフォルダは、XCode用のプロジェクトの方へ統合してしまいましたので。
リネームしていたフォルダは、削除しました。

・XCodeで実行してみる
問題なく実行できることを確認します。

・Eclipseで実行してみる
プロジェクトをインポートします。
インポート後は、エラーが発生するかもしれません。
私の場合、libcocos2dxの参照先がおかしいため、エラーとなりました。
プロジェクトのプロパティを開き、Android-Libraryで
cocos2dxライブラリへの参照先を修正します。

(追記)
Android-Libraryでcocos2dxのライブラリを参照する格好にしていましたが、
cocos2d-2.0-x-2.0.4/cocos2dx/platform/android/java/src
の中身を、
Android用プロジェクト/proj.android/src
の中にコピーする方が良さそうです。
(理由…Androidのバックキーを制御したい時、
Cocos2dxGLSurfaceViewを編集する必要がありそうだから…)
 
これでEclipse上から、Android端末で実行できるはずです。



以上です。

2012年9月2日日曜日

AndroidでGPSとGoogle Map

AndroidでGPSとGoogle Maps Android APIを使ってみてます。
気になったところだけメモ。

・位置情報を一定時間ごとに計測する方法を悩み中

GPS…というか位置計測のやり方は、たくさん資料がありましたが
例えば1分に1回計測する、といった方法は、いまいち見つけられず。

requestLocationUpdates()の第二引数にmsecで秒数を指定すると
それ毎に送られてくるよ、という記事も見かけましたが

私が試した限りでは、第二引数の値にかかわらず
いつでも約1秒 に1回
LocationListenerのonLocationChanged()でlocationが取れました。
むむー

ひとまず、onLocationChangedで取れたものを溜め込んでおいて、
それをいかに使うか、という設計・・?

あるいは、必要なタイミングでrequestLocationUpdatesして、
locationが取れたらすぐremoveUpdateするような方がよいのか・・??

1分に一度とか、10分に一度のような
あまり頻繁に必要としない場合は、後者の方がよさそうな気がしています・・

まだまだ謎であります。


・getBestProvider()

GPSを優先的に使いたかったのですが、
getBestProviderしたら、NETWORK_PROVIDERをオススメされました。
まじめにCriteriaを指定(速度いらない、方位いらない、高度いらない…など)
してみても、しなくても、
いつも NETWORKの方をオススメされます。
結局、isProviderEnabledでGPSが使えるなら使うように、
自前でチェックすることにしました。


・GalaxyS2でonLocationChangedが呼ばれなくて涙目

別のGPSアプリを動かしたら、
自分のアプリの方にも反応が返ってくるようになったのですが。。

当初、位置情報設定でGPSもONにしてるし、ネットワークの方もONにしているのに
なぜかonLocationChangedに入ってこなくて
ずっともやもやしていました

まったく同じソースコードで、同じ設定で
別の端末(4.0のPROGRESSO)で試したら
ちゃんとonLocationChangedに入ってくる・・!

そこで、GPS Testというアプリを動かしてみた後に
自分のを実行してみたら、なんだか動いてる・・という流れでした。

とても謎でした。。

このGPS Testで行っていることを知りたい!
私に足りないヒントがありそうです


・ActivityとServiceの連携・・AIDL
「ActivityにGoogleMapのMapViewを表示し、そこに位置情報を反映させる」
というものを作ってみておりまして
位置情報の取得には、Serviceを使ってみました。

Activityは、MapActivityを継承
Serviceには、LocationListenerを実装

さらに、AIDLを2つ用意しました
ServiceからActivityに位置情報を通知するためのinterface
通知先をServiceに登録するためのinterface

・・初めてのAIDLで頭こんがらがりました。


・Google Maps Android APIを使う
もしかしたら、ものすごく、簡単なことだったかもしれないのですけど
自分はえらくはまったのでメモしておきます。。

私の環境は、EclipseのIndigo、MacでMountain Lionです。

Preference - Android - Build - Default debug keystore
ターミナルでコマンド打って、MD5の値を取得する
keytool -list -keystore (上記のディレクトリ)

・・文字化けがものすごいことになってたのですが、
ターミナルのエンコードの設定ですかね・・。
大事なところ (MD5) は化けてないので、ひとまず良しとします

https://developers.google.com/android/maps-api-signup?hl=ja
My certificate's MD5 fingerprint:
のところに、 大事な (MD5) の値をコピペして、Generate API Keyします

・・遷移したページでも、文字化けてたので、うひーという感じですが
大事なところは化けてないので以下略。
私の場合はレイアウトをxmlで用意したので
com.google.android.maps.mapview・・・をレイアウトのxmlに貼りました。

プロジェクトのProperties - Android - Google APIsの適切なものを選択。

Manifestファイルに、
uses-permissionに、permission.INTERNET
uses-libraryに、com.google.android.maps
を追加

これで動いたはず・・!

2012年6月30日土曜日

XCode4でUnitTest

導入の方法については、図解詳細付きで説明していらっしゃる方のページを参考にしました。

さてテストを書こう!という段階で詰まった時のメモを残します。


○テストケースを実行するメソッド名は「test~」
冷静に考えれば当たり前かもですが。。
最初、testで始まらない名前のメソッド名で、テストケース書いて実行していて
「何で実行されない??」
しばらく悩みました。。
名前がtest~で始まらない、tearDownとかでもないメソッドは、テスト対象にならないのですね。


○NSLogはちょっと隠されたところに出ている
実行されてるはずなのに、いつものウィンドウにログが出てこない…!!
と思っていたら、出てました。いつもとは違う場所に。
海外サイトですが、図解付きで大変助かりました。
http://agilewarrior.wordpress.com/2012/02/28/where-is-nslog-output-for-ocunit-tests/
吹き出しのアイコン、初めて押しました…!
ログを見たくて毎回辿るのですが、ちょっと面倒です。。



(つぶやき)
テスト実行したくないメソッドは、どうすればよいのでしょう。
メソッド名変えればよいんですかね…

2012年3月2日金曜日

DirectX GetBackBuffer

DirectX9です

バックバッファの絵をテクスチャに貼ろうとしています。
フルスクリーン化した時のみ、
GetBackBuffer()でバックバッファを取ると
Pitchがなぜか少しだけ多くなります。
(フルスクリーンではない時は、問題ありません)

device->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &src);
src->GetDesc(&desc);
src->LockRect( &rSrc, &srcRect, 0);

rSrc.Pitchは、desc.Width*4バイトになってくれるはず・・なのですが
自分の場合は、フルスクリーン時のみ、
desc.Width*4 + 96バイトになっています。


うーん・・なぜでしょう
256で割り切れる数に合わせたいとか、何かあるんでしょうか。。

調べてみないとなぁ・・

2011年12月20日火曜日

insert文の勉強

既に登録されているデータならばinsertを行わないSQL文

selectで登録済みかどうかをチェックしてからinsertする・・という発想になり
2つのSQL文を発行していました
いつも、これを1度にまとめられないものかと思いながら・・

今回は1つのSQL文で上記のことを行うようにしました
DBはPostgreSQLです

例)
テーブル:table1
カラム:value1, value2

insert into table1 (value1, value2)
select 'value1', 'value2' from table1
where not exists (
select * from table1 where value1 = 'value1'
) limit 1


(空で書いたので実行できないかもしれません)

複数のテーブルが関連するような複雑なものではなく、
1つのテーブルに、単純にレコードを挿入する際に、
重複登録を避けたいための文です

limitがいけてない気もします・・
not existsだけでは複数行該当する→複数回挿入してしまう→そうだlimitだ
という発想です・・
ど、どうなのでしょうか
よりよい手段を見つけたいです

2011年12月14日水曜日

Butterfly Persistenceのboolean型

Butterfly Persistenceを利用する機会があり、
booleanのテーブルの値が取れていない事に気付きました。

ソースコードをDLして調べてみました
Booleanをマッピングするところの型チェックが不足しているようです

PostgreSQLでは(←ポスグレだけなのかはよくわかりませんが・・)
boolean型はjava.sql.Types.BIT型を返しているようでした。

なので、if文を
(java.sql.Types.BOOLEANまたはBIT) ならば〜
という条件にしてみると、無事booleanのテーブル値が取れました。

jarにする時は、JDKは1.5でビルドしないと通りませんでした。
(最初1.6にしてしまって、エラーの嵐に・・)

2011年11月26日土曜日

SQLiteをVisualStudioで使う

文字列が化けてハマりました。。

VS2010, SQLite3, c++
「マルチバイト文字」を使用するプロジェクト環境です


・DBはUTF-8で作成
sqlite3_open_v2を使ってオープン。

・文字列の書き込みはUTF-16
SJIS -> UTF-16に変換したLPBYTEの文字列をsqlite3_bind_text16で書き込み。
MultiByteToWideChar(CP_ACP, ... )で変換します

・文字列の読み出しもUTF-16
sqlite3_column_text16で読み出したものをLPBYTEにキャスト、
UTF-16 -> SJISに変換して文字列を取得。
WideCharToMultiByte(CP_ACP, ... )で変換します


何故かわかりませんが、
DBと文字列を共にUTF-8で扱うと化けたので、
文字列の方を16で扱っています・・何でだろう。。
更に、DBと文字列を共にUTF-16で扱うと、これもまた化けてしまいました

どこかで何か間違えたのだろうか。うーん。。
もう少し試してみる必要がありそうです。


ついでにハマった(引っかかった)ことは、
bind〜が「1」originなのに、
column〜が「0」originだということ。
絶妙なる引っかけ・・。初心者にはキビシイっす

2011年10月21日金曜日

PostgreSQL interval

PreparedStatementでintervalを使う時にはまったのでメモ。

例えば、
now() + interval '10 days'
というようなことをしたい時、
「interval '10 days'」の部分を

1)
「?」にする。
PGInterval a = new PGInterval();
a.setDays(10);
PreparedStatementでsetObject(n, a);

2)
「cast (? as interval)」にする。
PreparedStatementでsetString(n, "10 days");

1か2のどちらかで出来ました。

2011年8月6日土曜日

Lucene(環境構築)

超初心者がひとまずJavaで動かせれば充分、の段階まで書いています。
まずは環境の整備です。

 
・eclipse
HeliosのIDE Developers for Javaを入れます。
日本語化は、Pleiadesの本体のみをダウンロードのコーナーから落としました。
features, pluginsフォルダの中身をコピーします。

Macってフォルダが置き換わるのが怖いですね。
コピーのつもりがうっかり置き換えたことが何度もあります・・!
注意してフォルダの中身をコピーです。。



・Luceneを入れる
Apache Lucene Core 3.3をダウンロードします。
解凍してできたluceneのフォルダは、お好きな場所へ配置します。

・lucene-core-3.3.0.jar
これプロジェクトのjarに追加すると、
luceneのあれこれを利用できるようになります。


・日本語の形態素解析
今回は、「日本語の形態素解析をせよ」というお題を課せられておりますので、
日本語に対応した形態素解析ができるライブラリを追加します。
lucene-coreには、上記のようなものは含まれておりませんでした。

そこで「sen」というライブラリを使用する記事を多く見受けたのですが、
2011年真夏の今となっては、senは活動休止のようです。なんたる。

と思ったら、lucene-gosenというライブラリがありました。
http://code.google.com/p/lucene-gosen/


lucene-gosen-1.1.1-naist-chasen.jarをダウンロードしました。
ipadicの方と、naistの方とは、どちらがどう違うのか、まだ調べておりません。
そのうち調べましょう。。
上記のjarをプロジェクトに追加しました。
これでJapaneseAnalyzerが使えます


・N-Gram解析
形態素解析だけでなく、NGram解析も試してみます。
N-Gram解析をするためには、NGramTokenizerを使うらしい…のですが、
lucene-coreを追加しただけでは、見えていません。

lucene-3.3.0/contrib/analyzers/common/lucene-analyzers-3.3.0.jar
これを追加すると、ngram関係が使えるようになりました


環境の整備はここまでです。
ソースコードは、そのうち・・