Archive for 3月, 2010

iPhone プログラミングノート #1

さてさて、iPhone SDK アプリケーション開発ガイドをパラパラ見ること3章、おぼろげながらiPhoneのプログラミング方法がわかって来たのでちょいと備忘録でも。

で、とりあえずテキトーにiPhoneのプロジェクトを作る。
とりあえずWindow-based Applicationとかで。
恐らく下記のようなファイルが出来るはず。
Classes
・プロジェクト名AppDelegate.h
・プロジェクト名AppDelegate.m
Other Resources
・main.m
・プロジェクト名-Info.plist

あと、その他諸々ついてくるけど、とりあえず気にしないことに。
ただこのままだと○○.xibというファイルを読み込んでしまうので、それを防がなくてはならない。
とりあえずInfo.plistを開いて「Main nib file base name」の項目自体を削除、と。

XML形式で開いてしまったら、当該箇所をやはり削除。
例えば下記のような2行があったら削除。

	<key>NSMainNibFile</key>
<string>MainView.nib</string>

ちなみに、プロジェクト名はHelloWorld・・・と言うことで。

で、エントリーポイント(プログラム実行時、最初に呼び出される関数)はC/C++と同様main。
で、Windowsのように自動でプログラムのループを司るWinMainのような仕組みは、mainに書くことになっているみたい。
ひな形として与えられるのは下記の通り。

#import <UIKit/UIKit.h>
int main(int argc, char *argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;
}

なんか、argcとargvをUIApplicationMainに突っ込んでる所からして、ここがプログラムループ、らしい。。
ここの第4引数を下記のように修正。

	int retVal = UIApplicationMain(argc, argv, nil, @"HelloWorldAppDelegate");

ちなみに、.mとか.hとか付けていないのはわざとなので付けないこと。

お次はHelloWorldAppDelegate.hと同.mを編集。

// HelloWorldAppDelegate.h
#import <UIKit/UIKit.h>
// メッセージ表示用にUITextViewと言うビューを継承し、カスタムビューを作成
@interface CustomView : UITextView
{
// カスタムビュー用のメンバ変数
UITextView *myTextView;
}
@end
@interface HelloWorldAppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
CustomView *mainView;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@end
// HelloWorldAppDelegate.m
#import "HelloWorldAppDelegate.h"
@implementation CustomView
- (id)initWithFrame:(CGRect)frame {
// 親クラスの親メソッド呼び出し
self = [super initWithFrame:frame];
// 親メソッド取得成功時のみ実行
if (self != nil) {
// テキストビューを初期化
myTextView = [[UITextView alloc] initWithFrame:frame];
// テキストビューへテキスト追加
myTextView.text = @"おはこんばんちは";
// テキストビューをこのカスタムビューに適用?
[self addSubview:myTextView];
}
return self;
}
- (void)dealloc {
// メモリ解放
[myTextView release];
[super dealloc];
}
@end
@implementation HelloWorldAppDelegate
@synthesize window;
- (void)applicationDidFinishLaunching:(UIApplication *)application {
// バウンズ(画面領域)を取得
CGRect bounds = [[UIScreen mainScreen] applicationFrame];
// ウィンドウの範囲を画面サイズギリギリまで占有
window = [[UIWindow alloc] initWithFrame:bounds];
// ビューのサイズをステータスバーを除いて占有
mainView = [[CustomView alloc] initWithFrame:CGRectMake(0, 0, bounds.size.width, bounds.size.height)];
// ウィンドウへビューを設定
[window addSubview:mainView];
// ビューを表示
[window makeKeyAndVisible];
}
- (void)dealloc {
[mainView release];
[window release];
[super dealloc];
}
@end

これをコンパイルするとこんな感じ。

ふむふむ、何となくわかったような、わからないような。
実際はこの次のViewControllerまでやってるんだけど、復習はここまで。
本のコードとちょっと違うのはやはりわざと。
行儀が良いのか悪いのかは知らんけど、これでも動く。

そんだけ。

Post to Twitter

, , , , ,

No Comments

iPhone SDK アプリケーション開発ガイド

いろいろObjective-C 2.0で迷い、Erica Sadunの「iPhone デベロッパーズ クックブック」を試したりもした(ただし俺が持ってるのは英語版)。
これがなかなかどうして、敷居が高くて困っていた。

素直にO’Reillyの、しかも日本語版の書籍を手に取っておけば良かった・・・。
と言うわけで、先週買いに行ったのがこれ。
iPhone SDK アプリケーション開発ガイド

この本はかなりかゆいところに手が届くと言うか、Erica Sadunと同様iPhone入門書の中で珍しいInterface Builderを使わないiPhoneプログラミングで進んで行く。
そのため、ツール嫌いのコード人間で、俺みたいな脳足りんにはちょうど良い。
敷居はCとオブジェクト指向の知識、あとiPhoneとかiPod Touchを使っていればおおむね理解できる。
今3章までパチパチ打ったり修正したりしてるけど、これがなかなかどうして面白い。
Cookbookではどうにもコードが断片的で、コードの意図するところはとりあえず書いてあるものの、それ以外の変更点その他は女史のサイトからDLして自分で読み解かないといけない。
それに対して、図解が乏しい本書は逆にコード量とその前のコード説明がしっかりとなされている感じ。
そのため、読んでいていろいろ考えさせる。
本来学ぶ上で気にしなくていいようなどうでも良い事柄にはまることが無いため、読んでいて素直に学習できる。

そんなわけで、この本を元にチョイチョイメモを残そうと思った。
ちなみに、この本の作者であるJonathan Zdziarskiは前著「iPhone Open Application Development」でJailbreak前提のオープンソース開発を披露していた偉大なるハッカー。
そのためか、iPhone SDKには隠された機能が多いとして前書きで不満をこぼしているw
この本のサンプルコードに関してはほぼパブリックドメインの形を取っていて、似るなり、焼くなり、売るなり、改変して公開するなり、非公開するなり自由とのこと。
(ただし、サンプルコードの多くの部分を使う場合はO’Reillyとの協議が必要とのこと。)

とりあえず良い本とだけご紹介。

Post to Twitter

, , ,

No Comments

iPhone 3GをOS 3.1.3でJailbreakしたので備忘録をば

最近iPhoneに新しいアプリを入れようにも、み〜んなOS 3.1.3 Requiredな感じでヒジョ〜に残念なので、久々にJailbreak状態でアップグレードを試みることに。

あ、その前にJailbreakについて補足しておく。
通常アポーの許可無しにアプリはインストールできないんだけど、その仕組みをぶっ壊したHackerさんのおかげでいわゆる「勝手アプリ」が使えるようになる。
野良iTunesこと「Cydia」から勝手気ままにオンラインからアプリが入手できると言うわけ。
ホントいろんなことが出来て、メニュー画面に壁紙を表示することも可能。
個人的にはキャリアの部分を変更できるのは面白いかと。
(例えば「SoftBank」のところを「Vodafone」にしてる。)
残念ながら最新のiPhone 3GSの最新ROM搭載機(およびOS 3.1.3をインストール済みのやつも?)のJailbreakは出来なくなったらしい。
今年出る新型ではさらに厳しいんだろうなぁ・・・。
肝心のインストール方法は「iPhone Jailbreak」などで検索してもらうとして、今回はそのあとのお話。

[追記]
あ〜、そう言えばそう言えば。
NTFS形式でフォーマットしたドライブをMacに繋いでいる場合、pwnagetoolを使ったJailbreakを行うとNTFS-3Gと言うサービスが猛烈な勢いでCPUを食う。
これを解決するにはそのドライブを切断するか、Spotlightの検索対象街ディレクトリにしてしまうとおとなしくなる。
ちなみに、Bootcampディレクトリを掘ってて、どうせアンマウントするにはコマンド打たないといけないんだろうしだるかったので、後者を選択。
そもそもアプリを出すときしかSpotlight使ってないし。。
[追記終了]

毎度毎度忘れることが「勝手アプリ」のバックアップ。
今回も物の見事に忘れた。
と言うわけで、この際何を入れたのかをリスト化しようと思った。
下記はそのリスト。
今後思い出したり見つけたりしたら、リストを増やして行くつもり。
(そのうちテーブルでちゃんと書きます。)

SBSettings
BossPrefs
OpenSSH
Toggle SSH
Five Icon Dock
WinterBoad
Red Bull Battery
PdaNet
Backgrounder
iBrowse

そんだけ。

Post to Twitter

,

No Comments

WindowsでBitBltなるものを勉強

最近ちょっと落ち着いてきたので、「プログラミングWindows」を読み進めていたんだけど、どーにもつまらない。
俺がやりたいのは、ドット単位での画面描画なのに、ずーっとベクター系。
で、終わったと思えば「キーボード」の章。
ん~・・・。

やりたいことは結構単純で、リアルタイム3DCGの本があるからその公式やらを元にウィンドウ内に書き込みたいなぁ、と。
だから、勉強方法を変えてみることにした。
ウィンドウ描いてその中をラスタライズして2Dにしたリアルタイム3Dを表示したいだけ。
思い切ってページをすっ飛ばして、画面のビットマップ情報をいじることに。
その手始めとして「BitBlt(Bit-block transfer:ビットブリット)」というのをやってみた。

#include <windows.h>
LRESULT CALLBACK MyWindow(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance, LPSTR lpCmdLine,int iCmdShow)
{
static	TCHAR	szAppName[] =
TEXT("おいらのアプリ");	//アプリ名?
HWND			hwnd;	//ウィンドウハンドル
MSG				msg;	//メッセージ
WNDCLASS		wndCls;	//ウィンドウクラス構造体
//ウィンドウスタイルを指定
wndCls.style			= CS_HREDRAW | CS_VREDRAW;
//ウィンドウプロシージャを指定
wndCls.lpfnWndProc		= MyWindow;
wndCls.cbClsExtra		= 0;
wndCls.cbWndExtra		= 0;
//インスタンスハンドル変数を指定
wndCls.hInstance		= hInstance;
//ウィンドウのアイコンを指定
wndCls.hIcon			= LoadIcon(NULL, IDI_APPLICATION);
//カーソルの形を指定
wndCls.hCursor			= LoadCursor(NULL, IDC_CROSS);
//バックグラウンド色を指定
wndCls.hbrBackground	= (HBRUSH) GetStockObject(WHITE_BRUSH);
wndCls.lpszMenuName		= NULL;
wndCls.lpszClassName	= szAppName;
if (!RegisterClass(&wndCls)) {
MessageBox(NULL,
TEXT("このプログラムはWindowsNT以降対応です。"),
TEXT("そーりー"), MB_ICONERROR);
return 0;
}
hwnd = CreateWindow(szAppName, TEXT("どうよ? - Bitmap Viewer"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL);
//ウィンドウ表示状態を指定
ShowWindow(hwnd, iCmdShow);
//ウィンドウ更新実行
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0)) { //メッセージループ
TranslateMessage(&msg);	//命令変換?
DispatchMessage(&msg);	//命令転送
}
return msg.wParam;
}
LRESULT CALLBACK MyWindow(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int	cxClient, cyClient, cxSource, cySource;
HDC			hdcClient, hdcWindow;
PAINTSTRUCT ps;
int			x, y;
TCHAR		buff[512];
switch (message) {
case WM_CREATE:
cxSource = GetSystemMetrics (SM_CXSIZEFRAME) +
GetSystemMetrics (SM_CXSIZE);
cySource = GetSystemMetrics (SM_CYSIZEFRAME) +
GetSystemMetrics (SM_CYCAPTION);
wsprintf(buff,
TEXT("GetSystemMetrics (SM_CXSIZEFRAME):%d\n")
TEXT("GetSystemMetrics (SM_CXSIZE):%d\n")
TEXT("GetSystemMetrics (SM_CYSIZEFRAME):%d\n")
TEXT("GetSystemMetrics (SM_CYCAPTION):%d"),
GetSystemMetrics (SM_CXSIZEFRAME),
GetSystemMetrics (SM_CXSIZE),
GetSystemMetrics (SM_CYSIZEFRAME),
GetSystemMetrics (SM_CYCAPTION));
MessageBox(NULL, buff, TEXT("情報"), MB_OK);
return 0;
case WM_SIZE:
cxClient = LOWORD (lParam);
cyClient = HIWORD (lParam);
return 0;
case WM_PAINT:
hdcClient = BeginPaint (hwnd, &ps);
hdcWindow = GetWindowDC (hwnd);
for (y = 0; y < cyClient; y += cySource)
for (x = 0; x < cxClient; x += cxSource) {
BitBlt (hdcClient, x, y, cxSource, cySource,
hdcWindow, 0, 0, SRCCOPY);
}
ReleaseDC (hwnd, hdcWindow);
EndPaint (hwnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage (0);
return 0;
}
return DefWindowProc (hwnd, message, wParam, lParam);
}

ほぼほぼ「プログラミングWindows」上のソースの写経。
何がやりたいかというと、タイトルバーの左端にあるアイコンをウィンドウ内に敷き詰めるというもの。
改造点はプログラムが立ち上がる際に、アイコンの左端の取得アイコン座標の情報を表示する点。

一生やってろと言いたくなるくらいのペースに苦笑い。

そんだけ。

Post to Twitter

, ,

No Comments