Snow LeopardにアップしてからMacPortsの挙動がおかしいので、再構築することに。
sudo port -f uninstall installed sudo port clean --work --archive all
ここで寝落ちw
また会社から帰宅して続行 ▽主要パッケージのインストール
sudo port install apache2 +mysql5 +postgresql84 +pear +sqlite +tidy
結果的に、Snow Leopardからのアップデートからで大ハマリ! あぁ、すげー大変だった・・・・睡眠返して!! てか、何でOSXになるといつもトラブルんだろう?orz Linuxならスムーズにいくのに。
・PostgreSQL8.4でinitdbやサービスが起動できなかった ・過去のパッケージをちゃんと消してなかった ・httpd.confの設定の罠
仕方ないので、1つずつインストールする事に。 ■参考サイト ・Snow LeopardにアップグレードしたらMacPortsが動かなくなってしまった ・ボクのMacBookができるまで:(5.開発環境構築編)
▽Apache ・自動起動
sudo launchctl load -w /Library/LaunchDaemons/org.macports.apache2.plist
やったけど、既に登録されてた。 念のため作り直す。
sudo launchctl unload -w /Library/LaunchDaemons/org.macports.apache2.plist sudo launchctl load -w /Library/LaunchDaemons/org.macports.apache2.plist
・/opt/local/apache2/conf/httpd.conf DocumentRootは、そのままなんで、特に変更する必要なし。 DocumentRoot "/Library/WebServer/Documents"
▽~/.bash_profileにパス追加
export PATH=/opt/local/lib/postgresql83/bin:/opt/local/lib/mysql5/bin:/opt/local/bin:/opt/local/sbin/:$PATH export MANPATH=/opt/local/man:$MANPATH
あと、apachectlのパスはデフォルトとかぶるので、別途「apache2ctl」として設定した。
alias apache2ctl='sudo /opt/local/apache2/bin/apachectl'
▽MySQL5 ・インストール
sudo port install mysql5 +server
・ディレクトリ作成
sudo cp /opt/local/share/mysql5/mysql/my-medium.cnf /opt/local/etc/mysql5/my.cnf sudo mkdir -p /opt/local/var/db/mysql5 sudo chown -R mysql:mysql /opt/local/var/db/mysql5 sudo mkdir -p /opt/local/var/run/mysql5 sudo chown -R mysql:mysql /opt/local/var/run/mysql5
・手動起動
sudo /opt/local/lib/mysql5/bin/mysqld_safe &
▽PostgreSQL8.3 ・インストール
sudo port install postgresql83-server
・自動起動追加
sudo launchctl load -w /Library/LaunchDaemons/org.macports.postgresql83-server.plist
・DB初期化
sudo mkdir -p /opt/local/var/db/postgresql83/defaultdb sudo chown postgres:postgres /opt/local/var/db/postgresql83/defaultdb sudo su postgres -c '/opt/local/lib/postgresql83/bin/initdb -D /opt/local/var/db/postgresql83/defaultdb'
・PostgreSQLサーバを手動起動
sudo -u postgres pg_ctl -D /opt/local/var/db/postgresql83/defaultdb -o "-i" -m immediate start
・シンボリックリンクでパスを通す
sudo ln -s /opt/local/lib/postgresql83/bin/postgres /opt/local/bin/ sudo ln -s /opt/local/lib/postgresql83/bin/pg_ctl /opt/local/bin/
やっとこさ、起動しました(T_T) PostgreSQL8.4のインストールについては、機会があったら調べよう。
▽PHP ・インストール
sudo port install php5 +apache2 +mysql5 +pear +postgresql83 +sqlite sudo port install php5-curl sudo port install php5-exif sudo port install php5-gd sudo port install php5-gettext sudo port install php5-imagick sudo port install php5-mbstring sudo port install php5-mcrypt sudo port install php5-mysql sudo port install php5-postgresql +postgresql83 sudo port install php5-readline sudo port install php5-sqlite sudo port install php5-sqlite3 sudo port install php5-xmlrpc sudo port install php5-zip sudo port install php5-zlib
・Apacheモジュール
cd /opt/local/apache2/modules sudo /opt/local/apache2/bin/apxs -a -e -n "php5" libphp5.so
・/opt/local/apache2/conf/httpd.confの修正 mod_php.confのパスが間違ってるので修正
#Include conf/extras-conf/mod_php.conf Include conf/extra/mod_php.conf
■現在のインストール状況
sudo port installed
apache2 @2.2.15_1+darwin+preforkmpm (active) apr @1.4.2_0 (active) apr-util @1.3.9_2 (active) autoconf @2.65_1 (active) autoconf213 @2.13_1 (active) automake @1.11.1_0 (active) bison @2.4.2_0 (active) bzip2 @1.0.5_3+darwin (active) curl @7.20.0_0+ssl (active) curl-ca-bundle @7.20.0_3 (active) db46 @4.6.21_6 (active) expat @2.0.1_0 (active) gawk @3.1.8_0 (active) gettext @0.18_0 (active) gperf @3.0.4_0 (active) gsed @4.2.1_0 (active) help2man @1.37.1_1 (active) libiconv @1.13.1_0 (active) libidn @1.18_0 (active) libtool @2.2.6b_1+darwin (active) libxml2 @2.7.7_0 (active) libxslt @1.1.26_0 (active) m4 @1.4.14_0 (active) mhash @0.9.9.9_0 (active) mysql5 @5.1.46_0 (active) ncurses @5.7_0+darwin_10 (active) ncursesw @5.7_0+darwin_10 (active) openssl @0.9.8n_0+darwin (active) ossp-uuid @1.6.2_0 (active) p5-locale-gettext @1.05_2 (active) pcre @7.9_0 (active) perl5 @5.8.9_0 (active) perl5.8 @5.8.9_3 (active) php5 @5.3.2_0+apache2+darwin_10+macosx (active) php5 @5.3.2_0+apache2+darwin_10+macosx+mysql5+pear+postgresql83+sqlite+tidy php5-mbstring @5.3.2_0 (active) php5-postgresql @5.3.2_0+postgresql84 (active) pkgconfig @0.23_1 (active) postgresql83 @8.3.10_0 (active) postgresql83-server @8.3.10_0 (active) postgresql84 @8.4.3_0 (active) readline @6.1.000_1+darwin (active) sqlite3 @3.6.23.1_0 (active) wget @1.12_0 (active) zlib @1.2.5_0 (active)
何か、php5-postgresqlが「postgresql84」になってるのが気になる。。。 でも、インストールすると自動的に選ばれちゃうんだよね。 PostgreSQLサーバ自体は8.3で動いてるからまぁ大丈夫そう。
あと、php5のオプションつけた方がactiveになってないよw
とりあえず、動いたからヨシとしようw
■その後 Mac再起動したら、うまくいかないwwww やっぱりサービスのプロセスがたまたま同時に動いてた模様
てか、PostgreSQL8.3も8.4も初期化ができなくなってしまったorz orz
何かMacPortsとは相性が悪いw
----2010/10/16 iMacでトライ
(1)MacPorts Projectからインストーラーをダウンロード。
(2)~/.profileを修正し反映
export PATH=/opt/local/apache2/bin:/opt/local/bin:/opt/local/sbin:$PATH export MANPATH=/opt/local/share/man:$MANPATH
source $HOME/.profile
(3)MacPortsをアップデート
sudo port selfupdate
(1)apache2インストール
sudo port install apache2
※iMac core i3で15分程度 (2)apache2をロード
sudo port load apache2
(3)自動起動設定
sudo launchctl load -w /Library/LaunchDaemons/org.macports.apache2.plist
(4)httpd.confの編集 MacPortsでapache2をインストールするとhttpd.confは以下のパスとなる
/opt/local/apache2/conf/httpd.conf
DocumentRoot "/opt/local/apache2/htdocs"
自分はユーザのサイトをドキュメントルート設定する。 httpd.confで設定してもいいが、シンボリックリンクで対処することにした。
sudo ln -s /Users/yoo/Sites/ htdocs
-Directoryのアクセス権
Options FollowSymLinks
AllowOverride None
Order deny,allow
#Deny from all
(5)apache再起動
sudo apachectl restart
※/opt/local/apache2/bin/apachectlにパスが通ってる事が前提
AddType application/x-httpd-php .php
(1)php5の利用できるオプションを調べる
sudo port variants php5
apache: Add Apache 1 web server module * conflicts with apache2 no_web [+]apache2: Add Apache 2.2 web server module * conflicts with apache no_web debug: Enable debug support (useful to analyze a PHP-related core dump) fastcgi: Add FastCGI web server binary * conflicts with no_web gmp: Obsolete; install php5-gmp port instead imap: Obsolete; install php5-imap port instead ipc: Add semaphore, shared memory and IPC functions macports_snmp: Obsolete; install php5-snmp port instead mssql: Obsolete; install php5-mssql port instead mysql4: Obsolete; install php5-mysql port instead mysql5: Obsolete; install php5-mysql port instead mysqlnd: Obsolete; install php5-mysql port instead no_web: Don't include any web server support * conflicts with apache apache2 fastcgi oracle: Obsolete; install php5-oracle port instead pcntl: Obsolete; install php5-pcntl port instead pear: Add PEAR postgresql82: Obsolete; install php5-postgresql port instead postgresql83: Obsolete; install php5-postgresql port instead pspell: Obsolete; install php5-pspell port instead snmp: Obsolete; install php5-snmp port instead sockets: Obsolete; install php5-sockets port instead sqlite: Obsolete; install php5-sqlite port instead suhosin: Add Suhosin patch tidy: Obsolete; install php5-tidy port instead universal: Build for multiple architectures
Obsoleteは「廃止」という意味なので、オプションをつけてもインストールがうまくいかないようです。
(2)PHP5のインストール よって、apache2とPEARをオプションでインストールしてみます。
sudo port install php5 +apache2 +pear
(2)php.iniの設定 php.iniのパスは以下の通り。
/opt/local/etc/php5/php.ini
※インストール後に記載されてます
(3)Apache上でPHPを動作させる
cd /opt/local/apache2/modules /opt/local/apache2/bin/apxs -a -e -n "php5" libphp5.so
(1)postgresql84のインストール
sudo port install postgresql84 sudo port install postgresql84-server
(2)DB初期化
sudo mkdir -p /opt/local/var/db/postgresql84/defaultdb sudo chown postgres:postgres /opt/local/var/db/postgresql84/defaultdb sudo su postgres -c '/opt/local/lib/postgresql84/bin/initdb -D /opt/local/var/db/postgresql84/defaultdb'
うまくいったら、以下のメッセージが表示される。 Success. You can now start the database server using: /opt/local/lib/postgresql84/bin/postgres -D /opt/local/var/db/postgresql84/defaultdb or /opt/local/lib/postgresql84/bin/pg_ctl -D /opt/local/var/db/postgresql84/defaultdb -l logfile start
(4)手動起動確認
sudo -u postgres /opt/local/lib/postgresql84/bin/postgres -D /opt/local/var/db/postgresql84/defaultdb
(5)自動起動設定
sudo launchctl load -w /Library/LaunchDaemons/org.macports.postgresql84-server.plist
(6)DB確認
sudo -u postgres /opt/local/lib/postgresql84/bin/psql -l
Name | Owner | Encoding | Collation | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
postgres | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 |
template0 | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres
: postgres=CTc/postgres
template1 | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres
: postgres=CTc/postgres
(1)php5-postgresqlインストール
sudo port install php5-postgresql
2010/10/16現在では、postgresql9.0のクライアントが自動でインストールされる模様 PostgreSQLのサーバは8.4にしているのだが、果たして?
(2)php5-mbstringインストール
sudo port install php5-mbstring
(1)subversionのインストール
sudo port install subversion
Snow Leopardにアップグレードしたら、Apache の動作がおかしくなった。 というか普通に動いてるんだけど、WebRootが変わってる。。。 って事は、別のApacheが動作してんのか?
今までは、PostgreSQL本家のEnterpriseDB ApachePhpを利用してたのだが、
/Library/PostgreSQL/EnterpriseDB-ApachePhp/apache/
にインストールされてしまって管理がしにくい。
Snow Leopardにアップグレードすると、Apache2のデフォルトドキュメントルートのは以下の通り
/Library/WebServer/Documents
って事で、これを機にMacPortsで再構築しようかな?と。 で、MacPortsの設定は何回やっても忘れる(爆)ので、メモ。
■MacPortsインストール (1)MacPorts Projectからインストーラーをダウンロード。
(2)~/.profileを修正し反映
export PATH=/opt/local/apache2/bin:/opt/local/bin:/opt/local/sbin:$PATH export MANPATH=/opt/local/share/man:$MANPATH
source $HOME/.profile
(3)MacPortsをアップデート
sudo port selfupdate
■Apache2, PostgreSQL, PHPインストール
sudo port install php5 +postgresql +apache2 +pear
でインストールしたらエラーがかえってきた。。。
Error: You cannot install gettext for the architecture(s) x86_64 because Error: its dependency ncurses only contains the architecture(s) i386. Error: Error: Did you upgrade to a new version of Mac OS X? If so, please see Error: Error: http://trac.macports.org/wiki/Migration Error: Error: Target org.macports.configure returned: incompatible architectures in dependencies Error: Unable to upgrade port: 1 Error: Unable to execute port: upgrade gsed failed Before reporting a bug, first run the command again with the -d flag to get complete output.
何かハマりの予感??? -----2010/10/16追記 どうやら、Snow Leopardにバージョンアップした場合は、migrateしないといけない模様 Migrating a MacPorts install to a new major OS version or CPU architecture
インストール済みのパッケージを調べたら、既にインストールされている。
sudo port installed
........ php5 @5.2.10_0+apache2+imap+macosx+mysql5+pear+postgresql83+sqlite php5 @5.2.10_0+apache2+macosx+mysql5+pear+postgresql83+readline+sqlite+tidy (active) pkgconfig @0.23_1 (active) postgresql83 @8.3.7_0 (active) postgresql83-server @8.3.7_0 (active) ........ これらを、アップグレード。
sudo port upgrade installed
■Apache2の設定ファイル /etc/apache2/
■DocumentRootの変更 ▽デフォルト パス:/Library/WebServer URL:http://localhost/~ユーザ名/
上記がデフォルトのDocumentRootになるけど、URLをすっきりするために変更する。 apacheの設定ファイルで変更するのもいいけど、シンボリックリンクで対処する。
cd /Library/WebServer ln -s /Users/yoo/Sites Documents
▽結果 パス:/User/yoo/Sites/ URL:http://localhost/
■自動起動の確認 /Library/LaunchDaemons/
に自動起動の設定が入っているが、中身を見て多分大丈夫かと(^^;)
com.google.keystone.daemon.plist org.macports.apache2.plist -> /opt/local/etc/LaunchDaemons/org.macports.apache2/org.macports.apache2.plist org.macports.postgresql83-server.plist -> /opt/local/etc/LaunchDaemons/org.macports.postgresql83-server/org.macports.postgresql83-server.plist
一応設定が終わって、本当にMacPortsのパッケージで動いてるのかな?と思って、 再起動したらダメだったorz 前のMacPortsが残ってたのかな?記憶にないw
ここを読んでもう一度チャレンジする事にw
BlogにGoogle Analiticsのリンク埋め込み忘れてた今日この頃(^^;) HTML版はトピックでDiaryとLabsをカテゴリー分けしたり、ちょくちょく修正してます。 で、これを機にHTML5 + CSS3でコーディングし始めました。
当然ながら、FireFox(Mozila)3.5以上かWebKit対応ブラウザが必要です。 ※腐った牛乳?のIE6等はダメですw
まず手始めに。 ■メニューのCSS3 このBlogのメニューをCSS3使って表現。 てか、公開できるようなソースじゃないけど、特質すべき基本事項
background: -moz-linear-gradient(top, rgba(255, 255, 255, .7), rgba(255, 255, 255, .7)); background: -webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, .7)), to(rgba(255, 255, 255, .7)));
のように、「-moz」「-webkit」とブラウザによって対応してやらないといけない。 うーーん、WebKitに統一して欲しいなぁ。
■HTML5 + JavaScriptペイント ライブラリ使わずに、超簡易ですがサンプル作成してみました。
基本はECMAScript準拠だから、ActionScriptと結構似てます。 ただ、クラス継承とかファイル分類がかなり壁で、リファクタリングがムズイよ!
まず、Canvas2Dの作成 ・HTML
・JavaScript
function DrawCanvas(view) {
canvas = document.getElementById(view);
context = canvas.getContext('2d');
//context.fillRect(x, y, width, height);
context.fillStyle = defaultCanvasColor;
context.strokeStyle = defaultLineColor;
context.lineWidth = defaultLineWidth;
return canvas;
}
この関数の構造、コーディングは将来的にないけど、リファクタリングは後回し。 超基本的部分から。 (1) 従来通り、HTMLからエレメントを取得する canvas = document.getElementById(view);
(2) Canvas2Dのコンテキストを取得する context = canvas.getContext('2d');
ここで、getContext()については、Canvas API にアクセスできるオブジェクトを返すようです。
それなら、HTML5のエレメントで「canvas2d」として、
canvas2d = document.getElementById(view);
canvas2d.fillStyle = defaultCanvasColor;
の方がコーディング少なくてわかりやすい?と思った。
が、更に追ってくとCanvas Elementの仕様と実装について記載。
<
pre class="language-javascript">
interface HTMLCanvasElement : HTMLElement {
attribute unsigned long width;
attribute unsigned long height;
DOMString toDataURL(in optional DOMString type, in any... args);
object getContext(in DOMString contextId);
};
プロパティとメソッドは以下の通りで、getContext()で2d、3dの切り替えができるって事のようです。
canvas.width canvas.height canvas.toDataURL() canvas.getContext()
関係ないけど、W3Cのドキュメントが全般的にデザインが見ずらいからわかりにくいよw
さて、あとはどうやってわかりやすいソースにできるか? JavaScriptの言語仕様に慣れないけど、とりあえずprototype使っていくのかね?
var guiTool = {
lineWidth: function(value) {
context.lineWidth = value;
},
strokeStyle: function(value) {
context.strokeStyle = value;
}
};
うーん、奇麗なクラスにするのは先のようだw 他の人のサンプルも取りあえず動きました!って感じのが多くて、 リファクタリングされてないというか、わかりにくんですよね(^^;)っ
試行錯誤が続きそうです・・・
歌手のYUIじゃなくて、Yahoo! User Interface Libraryの事です。 あ、でもYUIの歌も結構好きですけどw
HTML5のフレームワーク級のライブラリってどれがいんすかね? とりあえずこの2つかな? ・Google AJAX API ・YUI Library
Googleの方は、
YUI 3はダウンロードして使ってみる。 ちなみに、Facadeパターンが使えるようだ。 http://codezine.jp/article/detail/4539
あと、Googleグループの「html5-developers-jp」にも入ってみる。
ここに載ってたHTML5 + AJaxサンプルです。
これらを駆使すれば、「Sketchpad」見たいなアプリも簡単に作れるのかな?
SketchpadはJavaScriptで作ったって言う意味で凄くよくできてるけど、 やっぱ独自だとソースが見づらくなっちゃうよね。
歯医者に通い続けて半年 まだ、続きます。。。てか、調子よくない(T_T)
■InterfaceBuilderのバインディング(Outlets) InterfaceBuilder(IB)で、File's OwnerとOutletsを何気なくバインドしてたけど、 本質的にわかってなかったのでメモ。
・File's Owner → UIオブジェクト(UIView)のバインディング X-CodeがUIViewを参照するための作業 ・UIオブジェクト(UIView) → File's Ownerのバインディング UIViewのイベントをX-Codeに関連づけるための作業
File's OwnerはUIViewControllerの実態そのもの。 つまり、UIViewControllerとUIViewのバインディング(Outlet)で、 MVCモデルの「VC」にあたる作業をしてるんだな?と言う事が整理できます。
Outletsは、接続群の総称を指すんですね。 同様にRecivedActionsは、イベントアクション群を指す。 ここら辺の用語は定義だから覚えるしかないんだけど(^^;)
どうやら、3.2でGUIが大きく変わったらしい。 雪豹のXcode3.2でClass Actions/Outletsを見失う
そう言えば前のバージョンでは、actionの設定が違ったような気がする。 自分は3.2で本格的にやり始めたから違和感はないけど。
(1) Tools > Library パネルを開く (2) Classesに切り替え、ViewControllerを選択する
ここにOutlets、Actionsが定義されているが、場所がわかりにくすぎるw
X-codeをノンコーディングで作成する場合は、 (1) LibraryパネルでOutletやActionを定義する (2) File's Ownerを選択する (3) File > Write Class Files...で、X-CodeViewControllerのソースマージする
が、この手法だと思わぬソース書き換えのトラブルがあるので、あまりやらない方がいいかも知れない。
TextFieldにフォーカスされると自動的にキーボードが表示されるが、 キーボードの入力後(Did End on Exitイベント)やViewをタッチした時に、 キーボードを閉じるメソッドは「resignFirstResponder」を利用する。
-(IBAction)backgroundTap:(id)sender {
[nameField resignFirstResponder];
[numberField resignFirstResponder];
}
ただし、Viewにはタッチイベントがないため、IB上でクラスをUIView→UIControlに変更してやる。 UIControlはUIViewを継承しており、タッチイベントを持っている。 そのままと言えば、そのままだ。
てか、だんだんObjective-Cに慣れてきたような気がする(!?) ・・・が、まだ基礎本の段階で100/500ページです(-_-;)
タイトルが雑なので変更 さぁ、少しずつ実用的なサンプルに入ってきた。
■アクションシートデリゲート(UIActionSheetDelegate) アクションシート(UIActionSheet)は、2つ以上のアクションを選択して処理するためのクラス どれかを選択しないと次へ進めない、モーダルダイアログみたいなものですかね?
まず、UIActionSheetにDelegateするための宣言
@interface UntitledViewController : UIViewController
{
IBOutlet UILabel *statusText;
IBOutlet UITextField *nameField;
IBOutlet UITextField *numberField;
}
■アクションシート実装
-(IBAction) buttonPressed:(id)sender {
UIActionSheet *actionSheet = [[UIActionSheet alloc]
initWithTitle:@"Are You Sure?"
delegate: self
cancelButtonTitle:@"No Way!"
destructiveButtonTitle:@"Yes, I'm Sure"
otherButtonTitles:nil
];
[actionSheet showInView:self.view];
[actionSheet release];
}
・UIActionSheetオブジェクトを初期化 ・initWithTitle:アクションシートのタイトル ・delegate:自分自身を受け渡す事で、後に関連メソッドを自動呼出 ・cancelButtonTitle:キャンセルボタンラベル ・destructiveButtonTitle:OKボタンラベル ・otherButton:複数のボタンを追加できる(カンマ区切り) ・actionSheetのshowInViewを呼び出す ※self.viewがドットシンタックスなのは、viewがプライベートインスタンスだから
次にアクションシートが消えた時に通知する処理(actionSheet didDismissWithButtonIndex)
-(void) actionSheet:(UIActionSheet *)actionSheet
didDismissWithButtonIndex:(NSInteger)buttonIndex {
if (buttonIndex != [actionSheet cancelButtonIndex]) {
NSString *msg = nil;
if (nameField.text.length > 0) {
msg = [[NSString alloc]
initWithFormat:@"You can breathe easy, %@, evetything went OK.",
nameField.text];
} else {
msg = @"You can breathe easy, everything went OK.";
}
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"Something was Done"
message:msg
delegate:self
cancelButtonTitle:@"Phew!"
otherButtonTitles:nil
];
[alert show];
[alert release];
[msg release];
}
}
UIActionSheetクラスのソースを見てみると、まんまインターフェイスで定義されていて、お約束のデリゲートメソッドらしいが、構文がイマイチ???
・ -(void) actionSheet:(UIActionSheet *) actionSheet = actionSheet(引数)
・didDismissWithButtonIndex:(NSInteger)buttonIndex = didDismissWithButtonIndex(引数)
として、Java風に言えばこんな感じなのか?
actionSheet(引数).didDismissWithButtonIndex(引数)
ちなみに、力技の確認方法ですが「(void) actionSheet」と「didDismissWithButtonIndex」 の名称を変更すると動作しません。 よって「actionSheet.didDismissWithButtonIndex」が自動的に呼ばれているということ。
メッセージメソッドからしても、 ・「半角スペース = ドットシンタックスもしくは引数カンマ」 ・「コロン = 引数()」 ・「() = 型」
と考えれば、基本的にコード解読がしやすいと思われ。 ただ、1つ腑に落ちないのはこの書き方
(UIActionSheet *) actionSheet
このアスタリスクは何なの???と疑問に思っていたが、メソッドの引数型の決まりみたいね。
(返り値型)メソッド:(引数型 *)引数
前にも書いたけど、idだけは例外でアスタリスクはつけなくてもいい。 あとは「半角スペース」で繋げていく感じ。
うーん、メッソドの書き方は少しずつ見えてきたかな? 番外で、アクションシートについての実装の仕方がYoutubeにありました(^^) iPhone SDK Knigge - 2.1 - UIActionSheetDelegate (Deutsch)
いやぁ、こういう風にするとわかりやすいね。 オイラもObjective-Cにマスターになれば、やってみたいけどw
音楽やってる時間がないとはいえ、今月は1本、来月は2本(?)演奏があったり。 結局、色々と思うようには進まず。。。
■アプリケーションデリゲート OOP用語でいう「委譲」のGoFデザインパターンの1種 Facadeパターンと同じで、複数のクラスを1つにまとめた(見せかけ)て利用する。
Appleのドキュメントには、以下のように記載されている。
アプリケーションの上位レベルの動作を監視するのは、 デベロッパが提供するカスタムオブジェクトである、アプリケーションデリゲートオブジェクトの責任です。 デフォルトのUIApplicationオブジェクトなどの複雑なUIKitオブジェクトのサブクラス化を避けるために使用されるメカニズムです。
UIkitの面倒な処理を、一任できるようだ(という言い回しは曖昧だw)
#import
@class UntitledViewController;
@interface UntitledAppDelegate : NSObject {
UIWindow *window;
UntitledViewController *viewController;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UntitledViewController *viewController;
@end
基本的にX-codeでプロジェクトを選ぶと自動生成してくれるので、 あまり意識するクラスではないかもしれないのかな?
ただ、アプリケーション固有の実装が必要になった時に、 本質を理解しておく必要はあるかも知れない。 今は、あまり深く追求せずに先へ進もうw
ちなみに、ソースのUIApplicationDelegateの上で、option + ダブルクリックすると「UIApplicationDelegate.h」のソースを見る事ができ、 iPhoneOSに特化した面倒くさい宣言が数々記述されている。
■InterfaceBuilderのショートカット コマンド + 1 : Attributes コマンド + 2 : Connections コマンド + 3 : Size コマンド + 4 : Identity
■RoundButtonのタッチイベント ボタンクリックのイベントは、ボタン内で指を離す「Touch Up Inside」が基本。 これはiPhone特有かな?と思ったけど、考えてみればブラウザやその他アプリケーションも、「Click」ではなく「Click Up Inside」の動作をしている気がする。
実家では、仕事場(商売屋なので)に行かないとネット使えないけど、部屋の場所によっては、無線LANのフリースポットが微妙に入ったり。 なんで、電波入るピンポイントを探してネットしてます(^^;) さて、続き
■(アスタリスク) 個人的にObjective-Cで違和感がある書き方に「(アスタリスク)」がある。 いわゆるC言語でいうポインタ。
自分はC言語はちゃんとやったことないので、それが違和感の原因かもしれないw Webのオブジェクト指向プログラムでは、無意識にポインタ(参照)コーディング しているからであろう。
NSString *インスタンス名 = [[NSString alloc] initWithFormat:@"%@ xxxxxxx", ];
・クラスオブジェクト型のインスタンス変数は、「」を付けて宣言 ・id型の場合は、「」なしで宣言可能
■アクセス修飾子
@private
int test1;
int test2;
@protected
int test3;
@public
int test4;
int test5;
・アクセス修飾子private、protected、publicは「@」ディレクティブとして宣言 ・Objective-Cのデフォルトはprotected ・次のディレクティブまたはリストの終わりまでの間に記述されたインスタン ス変数に適用 ・packageは64bitのみ
参考: Objective-C 2.0プログラミング言語:クラス実装 Objective-Cのアクセス制限とJavaのアクセス修飾子を比較してみる
これもちょっと違和感と言うか、パッとみわかりにくい気がする。 Java等はインスタンス変数の修飾子は1行で明示的にするのが作法なので、
@private int test1;
@private int test2;
@protected int test3;
@public int test4;
@public int test5;
あぁ、でも最初の方が合理的でいいのかな?(^^;) あと、クラス自体のアクセス修飾子ってどうなんだろうか? また機会がある時に調べないと。。。
■メッセージネスティング これが、Objective-Cの「わかりにくさNo1」と個人的に思っていたり・・・。
NSString *インスタンス名 = [[NSString alloc] initWithFormat:@"%@ xxxxxxx", ];
これはよく出てくるコーディング。 alloc、init等は、新旧問わず暗黙的にネストして記述するようなので慣れるしかない。 --2010/07/17追記-- ・alloc:メモリ確保 ・init:初期化(NSObjectのメソッド) メモリ管理によると、初期化のメッセージングを連続して書かないとnilを返す可能性があるとのこと。
ただ、以下のようにネストされるとやはり思考を停滞させられる。
[NSString stringWithFormat:@"%@ xxxxxxx", [sendertitleForState:UIControlStateNormal]];
個人的には「行数をただ減らせば良いってもんじゃない」と、「わかりやすさ重視派」なので。 (多分どの言語でもネストは悪だと思うんだけどねえ)
まぁ、コードって本当にその人の性格や思考回路が出ますねw
実家に帰ってます。 てか、家の鍵が・・・色んな事に気を取られてダメダメです(^^;) えっと、ビックカメラで書籍買いました。 流石ブームだけあってかなり豊富(ネットだともっとあるんだけど) ・「はじめてのIphone3プログラミング」 まだ触りだけど、Objective-Cの新旧のコトなど突っ込んであって、深く理解するには感じかも? ・「そのまま使えるiPhoneゲームプログラミング」 まだ全然読んでないけど、実用的なサンプルとOpenGL ESの勉強のために。 まずは、「はじめてのIphone3プログラミング」から。 Objective-C2.0からは、プロパティのアクセサメソッドを 自動生成させるためのコンパイラディレクティブが導入された。 Objective-Cが分かりにくいと言うカラクリは、コーディングを減らした結果にあるかも知れない。 今回は、アクセッサメソッドの基本について。 ■@synthesize アクセサメソッド生成部分
@synthesize インスタンス,...;
■@property アクセサメソッド宣言部分
@property (nonatomic, retain) IBOutlet UIクラス *インスタンス
@property (assign) NSString *インスタンス;
@property (retain, readonly) NSString *インスタンス;
まずはよく出てくるセット
・nonatomic:マルチスレッド環境でオーバーヘッドを軽減。 複数のスレッドから同時に読み込み時の動作保障しない。 デフォルトはatomicだが属性なし。 ・retain:オブジェクトのメモリを勝手に解放しない
その他、
・assign:インスタンス変数に単純に代入 ・copy:インスタンス変数に引数をコピー ・readonly:getterのみを生成 ・readwrite:setter、getter両方を生成(デフォルトで省略)
アクセッサーの処理を普通にコーディングすると、面倒なコードを書かなくて済む。<
- (id) foo {
return foo;
}
- (void) setFoo:(id) aFoo {
if (aFoo != foo) {
[aFoo retain];
[foo release];
foo = aFoo;
}
}
■ (id) sender InterfaceBuilder
- (IBAction) UIクラス:(id) sender
idはUIオブジェクトの「id」そのまま。 で、senderって何かの決まりと思ってたら、単なる引数名のことだった。
「センダー」と言う呼び名から、「sender」と書かれているサンプルが多い。 --2010/07/17追記-- いやいや、senderはUINibDeclarations.hのプロトコルのようです。 この通り記述しないとコンパイルエラーになります(^^;) --2010/07/20追記-- またまた、間違い? この前実装した時は、sender以外だとエラーになった(気のせい?)けど、今やったら普通に動く。。。 まぁ、混乱しない為にもsenderでいいと思う。
なんだから覚える事が多いけど、実際何が行われているか?を理解しないと、 先に進めないので頑張らないと(^^;)
触ってれば何となるかな?と思ったけど、 さすがにコーディングはJava系じゃないので厳しいわ。 文法がさっぱり馴染めない(T_T) X-codeの使い方は何とかなりそうですが。
と言う事で、基礎の基礎からGW中にマスターするぞ! 帰省前に本買わなきゃいかんが、とりあえずネットで。
混沌のiPhoneアプリケーション工房を参考にさして貰いました。
Objective-C 言語のクラスの宣言は、予約語や構文ではなく コンパイラディレクティブを利用します。 コンパイラディレクティブは、 コンパイラに Objective-C で拡張されたクラスの宣言や実装などに用いられ、 @ マークで始まるという特徴を持ちます。
ふむ。 @ってプロパティ(?)にも出てこなかったっけ? それも含めてコンパイラディレクティブ? 取りあえず進む。
クラスを宣言するコンパイラディレクティブは@interface で始まり@end .hはインターフェイス定義ファイルって理解でいいのかに?
@interface クラス名 : 親クラス名
{
インスタンス変数宣言
}
メソッド宣言
@end
@implementation クラス名
メソッド定義
@end
- (戻り値型) メソッド名 : 仮引数リスト ... ;
・「-」で始まるメソッドをインスタンスメソッド(動的) ・「+」 で始まるメソッドをスタティックメソッド(静的) ・メソッド宣言では型を 「( )」 で囲む ・メソッドが引数を受け取る場合は、コロン : に続いて仮引数リストを指定
この書き方が紛らわしい。 仮引数リストが、これまたよくわからん。
一般的なオブジェクト指向型言語では new 演算子が存在するが、Objective-Cにはない! って事で登場するのが「alloc クラスメソッド」(ファクトリメソッド)。 インスタンス生成はルートクラスが管理し「+ alloc;」として定義されている。
そして「メッセージ式」と呼ばれる方法で、以下のように呼び出す。
[クラス名 メソッド名:引数リスト...]
なるほど!これが「動的なメソッドの呼び出し」ってことなのね。 処理に時間はかかるが、合理的な記述ができるというカラクリか。
インスタンス参照を使わず、メッセージを入れ子にしてメッソドを呼び出す。
[[Test alloc] method]
なるほど!なるほど! いまさら何か書いてるコードの意味が理解できてきた! でも、やっぱ見にくくないかい?w