2012/May/07
人狼/Android、C81、C82展望1
かなり前だけど、イケメン人狼のAndroid版をリリースした。
https://market.android.com/details?id=com.regaria.ijt
そのあたりの話と、あとAndroidシステムで高速にプロセス間通信をどうやるか、を書いた40ページくらいの薄い本をC81で出した。全体的な人口がもとにもどりつつあるんで、ノーマナーな人なんかも増えたみたいだが、村がかなり復興して、これはこれでよかったかなと。
次のC82にも一応応募はしていて、内容としてはAndroid/iOSシステムのメモリ管理、あとは、iOS同士でいい感じに(高速に)通信する具体的なことについて調べていて、このあたりはあまりやってる人がいなさそうで、簡単なものでもいいから一つでも作りたいと思っている。
なんでそういうのやりたいかというと、イケメン人狼ではサーバが必要で、サーバ側、Androidの両方を開発して、かつ、サーバの運用といってもcronが動くだけだけども、サーバがあるというだけで、運用コストまでがかかるのが趣味でやるにはだるい。一度公開してしまうと、こちらが手仕舞するとなにも残らない。
今どきのゲームってのは、もうサーバなんて用意する必要なくて、端末間で通信して、すれ違いとか、そういうカジュアルなつながりでも、皆十分に楽しんでいるように見える。人人を繋げるコストが低くなってて、親しくなりたい人のプロフィールをソーシャルグラフとかで後から追えるし、だからこそ、ずっとログインしっぱなしでいる必要もない。あと、サーバ持ってないからシンプルでいい。モンハンとか、ダークソウルはそうなってる。
僕が知っている、昔のMMORPGとかだと、ずっとたまり場にいないと親しくできないとか、親しくした人がある日、ふっと消えて追いかけようがないとか、そういう不便すら、もう時代遅れなんだろうな。
2011/April/04
Android開発環境セットアップ(Mac OS X 10.6.7)
Android | |
Mac OS X 10.6.7(家)
・Eclipse 3.5.2(Galileo)
Eclipse IDE for Java EE Developers
Eclipse Galileo SR2 Packages (v 3.5.2)
http://www.eclipse.org/downloads/packages/release/galileo/sr2
・日本語化
ヘルプから、追加インストールを選択し、
Locationのところに、
http://download.eclipse.org/technology/babel/update-site/R0.8.0/galileo
・Android SDK r10
android-sdk_r10-mac_x86.zip
http://developer.android.com/sdk/ndk/index.html
/optにインストールする。
・Android NDK r5(ネイティブコード書かないなら不要)
android-ndk-r5b-darwin-x86.tar.bz2
http://developer.android.com/sdk/ndk/index.html
/optにインストールする。
・Android標準APIとAPIレベル設定
ヘルプから追加インストールを選択し、以下を追加。
https://dl-ssl.google.com/android/eclipse/
1.6... API Lv4
2.0... API Lv5
2.1... API Lv6,7
2.2... API Lv8
・Android platform
SDK and AVDマネージャからインストールする。
設定から、Android SDKのパスを通す。
Android 2.2を使う。(好きなやつを使うといい)
プロジェクト作成。実機をUSBでつなぐ。実行構成をmanualにする。ビルド、実行。動作確認完了。
以上。
2011/January/26
before_fileter 非login時の定義は、routes.rbに書かない
Web | |
before_filter :login_required
で、ログインされてないときのページは、routes.rbではない。
lib配下に関数があるので、そっちを変更する。
http://rubist.blog77.fc2.com/blog-entry-95.html
2011/January/24
char*からNSString*への変換
char* cp = "test";
NSString* str = [NSString stringWithCString: cp
encoding:NSUTF8StringEncoding];
ここで、testが終端文字で終わっていなければ、
strにはnilがはいるので注意。
ついでだから書いておくと、
IBOutletを使用している場合、Static TextがEnableになっていると、
いくらアクセサを設定しても、上書きできないので注意。
さらにもう一点、
IBOutletのlabelを書き換えるときは、必ずaddSubviewした後で書き換えましょう。
labelに限った話ではないが。
addSubviewの前だとこれも、どれだけ頑張っても上書きできませんので注意。
アホみたいな話ですが、普通にハマります。上の3つは最初にチェックしたい。
2011/January/17
UIGestureRecognizerが糞使えない理由
iOS | |
皆使ってる UIGestureRecognizer ですが、こいつで泣かされる人もわりと多いと思う。
UIGestureRecognizerについては、ググってくれればいい。
UIGestureRecognizerの派生クラスで以下のものがある。
UITapGestureRecognizer タップ
UIPinchGestureRecognizer ピンチインアウト主に拡大縮小
UIPanGestureRecognizer ドラッグ
UISwipeGestureRecognizer ページめくりやスクロール等のスワイプ
UIRotationGestureRecognizer 指2本で回転させる感じ
UILongPressGestureRecognizer 長押し
いわゆる、1~4本指スワイプ、2本指回転、長押しあたりを検出するクラスである。
こいつがほぼ使えない。
なぜかというと、touches{Began|Moved|Ended}との相性がとても悪い。
Gesture系のイベントが発生すると、touch系のイベントが発生しない。
これによって、touchesMovedを検出したいのに、swipeGestureが検出されるということが起こる。
あるいは、swipeGestureを検出したいのに、touchesBeganが発生するというようなことが起こる。
また、swipeGestureやLongPressGestureから、touchEndedへつなげるといったようなことができない。
例えば、単なる長押しならいいが、長押しのあとにスライドを検出したい場合や、
回転の後に、指離しを検出してなにかしたいという場合は、
UIGestureRecognizerでやろうとすると、複雑な実装になる。
つまり、回転、スワイプなどは、結局自前で作ってdelegateして使うということが一番簡単なので、
簡単なビューで即席的なものならありだが、それ以外の場面では、これらのクラスは極力使わないようにしたい。
touches{Began|Moved|Ended}だけでタッチ処理を実装するのが、今のところ一番いいと思う。
2011/January/12
ResponderChainとDelegate
UIKitでプログラミングしていると、サブビュー(UIViewとその派生)が次々と増えていく。
ビューが重なりあった状態では、最も下層にあるビューが、FirstResponderとなる。
FirstResponderというのは、最初にイベントを受け取るオブジェクトのこと。
例えば、TextFieldにフォーカスがあってたら、TextFieldがFirstResponderである。
で、指でViewに対してタッチすると、touches{Began|Moved|Ended}の一連のイベントが発生するが、
このイベントというのは、FirstResponderがまず受け取る。
FirstResponderにてイベントハンドラが定義されている場合、実行される。
イベントハンドラが定義されていなければ、NextResponderがFirstResponderになる。
UIViewの場合は、その親ビューにイベントが渡される。
このように、次々とスーパービューへとイベントが渡されていく。
これをResponderChainという。
FirstResponderにイベントハンドラがあるが、
その親ビューや、そのさらに親ビューのイベントハンドラや関数を実行したい場合は
Delegateを使う。
Delegateは大体の場合が、非公式プロトコルというObj-Cの仕組みで実装する。
Javaでいうところの、Interfaceのような感じ。
コンパイル通るかわからないけど、簡単な例を示すと、だいたい次のような感じ。
View1が、View2の親ビュー。
View2でタッチしたイベントを、View1にdelegateする。
というわけで、はてな様、私にMac11インチくださったら、役立てますので宜しくお願いします。
touchDelegate.h
@protocol touchDelegate - (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event @end
View1.m
#import "touchDelegate.h" @interface View1:UIViewControler <touchDelegate> { UILabel *label; } @end @implementation View1 - (void) viewDidLoad { UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100,100)]; view2.delegate = self; [self.view addSubView:view2]; } - (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event { label.text = @"aho"; } @end
View2.m
#import "touchDelegate.h" @interface View2:UIViewController <touchDelegate> { id delegate; } @end @property (nonatomic,retain)id delegate; @implementation View2 @synthesize delegate; - (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event { [delegate touchesBegan:touches withEvent:event]; } @end
2010/November/15
非公開ソースのインタフェースの数を調べる
Linux | |
ソースが公開されていないライブラリ、オブジェクトファイル(*a,*o)の呼び出されているAPI数を調べる。
次のスクリプトを実行させると、dにAPIの一覧がのる。
#!/bin/bash #呼び出し側のソース: find ${caller_path} -name "*.[oa]" | xargs nm | xargs cat > a grep "U " a > aa sort aa |xargs uniq > aaa #未解決シンボル一覧 cut -f 3- < aaa > aaaa #シンボル名だけ抜き出す #呼び出され側ソース: find ${callee_path} -name "*.[oa]" | xargs nm | xargs cat > b grep -v "U " b > bb sort bb | xargs uniq > bbb #解決シンボル一覧 cut -f 3- < bbb > bbbb #シンボル名だけ抜き出す cat aaaa bbbb > c #呼び出し側未解決シンボル、呼び出され側解決シンボルをつなげる sort cc | xargs uniq -u > ccc #解決されたシンボルは消える diff -c aaaa ccc | xargs grep "+ " > d #解決されたシンボルの一覧をdに出力する
2010/April/29
Android(環境構築)
Android | |
APR/1にXperiaをゲットし、今週月曜の会社の飲み会で、先輩に、
「そういうの買った人はAndroidのアプリを自作するでしょ」
とさらっと云われたので、密かに家で作るか。
ま、そんなのはどうでもいいことで、いつも通りメモ。
環境:
MacOS X(10.5.8)
JDK(1.5.0_20)
Eclipse(3.4.2)
Android SDK(1.6)
Android Development Toolkit(0.9.6v20)(Eclipseのプラグイン)
google API(?)
上記は、ここからゲット:
http://developer.android.com/sdk/index.html
bashrcに下記追加:
JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home
ANDROID_HOME=/Developer/android-sdk-mac_86-r4
PATH=$PATH:${ANDROID_HOME}/tools
まず、AndroidのシミュレータAVDを生成。
この引数のtargetは、googleSDKのIDに対応。
$ android create avd --target 2 --name aho1
Hello World までは以下のサイトが参考になった。
http://d.hatena.ne.jp/ynakajima/20090522
2010/January/01
一人の開発の意識
考察 | |
一人で開発して、納期に間に合わせるために必要だと思うのは以下のこと。
・リソース
自分自身の全ての生きる時間をリソースとして考える。
生活のどれがリソースに対しどの程度のコストを払うかを考える。
あらかじめ、配分を決めておき、そこから大きく乖離するような配分にしない。
スケジュール、いつまでにどれを明確にする。
・優先順位
一人で開発し、期限がある以上、全部を実装することはできず、どれかは必ず捨てることになる。
機能やタスクは全て書き出して把握する。
機能やタスクの全てに優先順位があり、取捨選択の判断が必要。
まず最初に優先することは、最低限の動作。
・UIや機能は使い勝手良くシンプルにする。
多くの機能を盛り込むとバグがそれだけ増え、自分自身に跳ね返ってくる。
複雑で高コストな機能に着手するときは、効果がそれだけあるのかよく考え、
代替え手段などを一通り見比べ切り捨てることも必要。
複雑で高コストな機能は、一見便利だが、骨折り損なことが多いのでほとんど捨てることになる。
2009/December/29
「イケメン人狼タウン」リリースしました
1ヶ月くらい、OpenSocialをぼちぼちとやってましたが、
昨日、「イケメン人狼タウン」というmixiアプリをリリースしました。
http://mixi.jp/view_appli.pl?id=9624
まだまだテスト段階ですが、遊んでくださる方を大絶賛募集しています。
忙しい方のために3日で進行する村と、通常の1日進行村の2つがあります。
2009/November/25
linux input subsystem参考
パート1
http://www.linuxjournal.com/article/6396
パート2
http://www.linuxjournal.com/article/6429
オートリピート関連(パート2のリスト12、13)のIOCTLsは、実装されてないこともある。
2009/October/21
ダブルポインタの配列と1次元配列
C | |
Aは、ダブルポインタを使った2次元配列のmalloc。以下のAは、配列の領域を確保し、0で初期化するコードである。
Bは、ポインタの一次元配列を静的にプールしたもの。その後、0で初期化する。
AよりもBのほうが高速に動作する。
理由は一つの要素へのメモリアクセス回数がダブルポインタが2回に対し、一次元配列では1回で済むため。
A
unsigned char **ch; ch = malloc(HEIGHT_SIZE * sizeof(unsigned char*)); if(ch == NULL)exit(1); for(i=0;i<HEIGHT_SIZE;i++){ ch[i] = malloc(WIDTH_SIZE * sizeof(unsigned char)); if(ch[i] == NULL)exit(1); } for(i=0;i<HEIGHT_SIZE;i++){ for(j=0;j<WIDTH_SIZE;j++){ ch[i][j]=0; } }
B
unsigned char *ch[HEIGHT_SIZE*WIDTH_SIZE]; for(i=0;i<HEIGHT_SIZE;i++){ for(j=0;j<WIDTH_SIZE;j++){ *ch[i*WIDTH_SIZE+j]=0; } }
2009/October/07
プロファイリングツール
- OProfile
- gprof
- ARM Profiler
http://www.arm.com/products/DevTools/RVP.html
http://cell.fixstars.com/ps3linux/index.php/Google-perftools%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6CPU%E3%83%97%E3%83%AD%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%92%E3%81%A8%E3%82%8B
他には、(情報が古いが)
readprofile, OProfile, Kernprof, gcov-kernel
http://www9.ocn.ne.jp/~puppet/docs/Linux-Kernel-Profiling-HOWTO/x480.htmlより。

リリースされてから、しばらく時間が経っていますが私も始めました。
おおまかなストーリーがあるものの、毎回展開も難易度もちがう村を推理していき、団結していくのは楽しいです^^
ただ、仕事が忙しすぎてしまいパソコンに向かう時間にばらつきがでてしまい
きちんと参加できないのが悲しいです‥‥‥
(特に日付が早い時間に変わるのもは特に)
イラスト素敵です。
ブロード、メリッサお気に入りです^^
お仕事忙しいとは思いますが、システム改良やもろもろ頑張ってください!