Hatena::ブログ(Diary)

C_memo(5) このページをアンテナに追加 RSSフィード

2012/May/07

人狼/Android、C81、C82展望1

| 02:29 | 人狼/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/20

実機に同一アプリを複数インストールする

| 22:56 | 実機に同一アプリを複数インストールするを含むブックマーク

これは今のところ、パッケージ名を変えて
Manifest.xml のpackage=で指定するしかない。
不便。

速度計測時の注意点

| 11:04 | 速度計測時の注意点を含むブックマーク

出力は最後にまとめて出す。
分解能は適切か。
データは複数回とる。
最悪値を出す。
ヒストグラムを出す。
キャッシュの確認。

2011/April/04

Android開発環境セットアップ(Mac OS X 10.6.7)

| 01:28 | Android開発環境セットアップ(Mac OS X 10.6.7)を含むブックマーク

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標準APIAPIレベル設定
ヘルプから追加インストールを選択し、以下を追加。
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に書かない

| 12:50 | before_fileter 非login時の定義は、routes.rbに書かないを含むブックマーク

before_filter :login_required
で、ログインされてないときのページは、routes.rbではない。

lib配下に関数があるので、そっちを変更する。
http://rubist.blog77.fc2.com/blog-entry-95.html

2011/January/24

char*からNSString*への変換

| 17:23 | 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が糞使えない理由

| 12:32 | UIGestureRecognizerが糞使えない理由を含むブックマーク

皆使ってる 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

| 23:23 | 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

非公開ソースのインタフェースの数を調べる

| 16:10 | 非公開ソースのインタフェースの数を調べるを含むブックマーク

ソースが公開されていないライブラリオブジェクトファイル(*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(環境構築)

| 18:33 | 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

一人の開発の意識

| 08:52 | 一人の開発の意識を含むブックマーク

一人で開発して、納期に間に合わせるために必要だと思うのは以下のこと。


・リソース
自分自身の全ての生きる時間をリソースとして考える。
生活のどれがリソースに対しどの程度のコストを払うかを考える。
あらかじめ、配分を決めておき、そこから大きく乖離するような配分にしない。
スケジュール、いつまでにどれを明確にする。


・優先順位
一人で開発し、期限がある以上、全部を実装することはできず、どれかは必ず捨てることになる。
機能やタスクは全て書き出して把握する。
機能やタスクの全てに優先順位があり、取捨選択の判断が必要。
まず最初に優先することは、最低限の動作。


・UIや機能は使い勝手良くシンプルにする。
多くの機能を盛り込むとバグがそれだけ増え、自分自身に跳ね返ってくる。
複雑で高コストな機能に着手するときは、効果がそれだけあるのかよく考え、
代替え手段などを一通り見比べ切り捨てることも必要。
複雑で高コストな機能は、一見便利だが、骨折り損なことが多いのでほとんど捨てることになる。

2009/December/29

「イケメン人狼タウン」リリースしました

| 22:07 | 「イケメン人狼タウン」リリースしましたを含むブックマーク

1ヶ月くらい、OpenSocialをぼちぼちとやってましたが、

昨日、「イケメン人狼タウン」というmixiアプリをリリースしました。
http://mixi.jp/view_appli.pl?id=9624

まだまだテスト段階ですが、遊んでくださる方を大絶賛募集しています。

忙しい方のために3日で進行する村と、通常の1日進行村の2つがあります。

ちどさん。ちどさん。 2010/03/04 08:50 こんにちは。
リリースされてから、しばらく時間が経っていますが私も始めました。

おおまかなストーリーがあるものの、毎回展開も難易度もちがう村を推理していき、団結していくのは楽しいです^^

ただ、仕事が忙しすぎてしまいパソコンに向かう時間にばらつきがでてしまい
きちんと参加できないのが悲しいです‥‥‥
(特に日付が早い時間に変わるのもは特に)

イラスト素敵です。
ブロード、メリッサお気に入りです^^

お仕事忙しいとは思いますが、システム改良やもろもろ頑張ってください!

2009/December/18

mkisofs

| 07:06 | mkisofsを含むブックマーク

mkisofs -d -N -D -J -r -V 'volume name' -publisher adachi -o 'IMG file(*.iso)' 'directory'

2009/November/25

linux input subsystem参考

| 14:55 | 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次元配列

| 23:23 | ダブルポインタの配列と1次元配列を含むブックマーク

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;
   }
 }