
XCode4にしてからというもの、以前は正常に実行できていたプロジェクトが、
iPhoneシュミレータでの実行時に下記のエラーを吐くようになった。
No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=i386, VALID_ARCHS=armv7).
i386アーキテクチャの指定がないのが原因のようなので、
ビルド設定の [Valid Architectures] に [i386] を追記すると解決した。
[Architectures]のほうは変更しなくても問題ない模様。
新規にiOSのXcodeプロジェクトを作る際に、いつも使うライブラリ等のインポート設定などが面倒で、
横着して以前のプロジェクトをコピーして使いたくなる場合がある。
しかしこの作業を適当に勘でやると、アプリ実行時に[Unknown Error]が出て起動できなくなり
ハマる場合がよくあるので、備忘のために下記に正確な手順を書いておく。
iOSプロジェクトのコピーによる作成の手順/ XCode3版
( OldAppをコピー元のプロジェクトとする / NewAppをコピー後の新プロジェクトとする )
以上の手順で基本的には問題なくNewAppのアプリが立ち上がるはずだが、
それでも[Unknown Error]などが出る場合には、下記の点をよく確認する。
それでも駄目なら下記に[Unknown Error]の様々な対処法が書いてあるので参考に。
iPhoneプログラミングで、プログラムを変更し、起動し直したにも関わらず、
変更点が反映されていないことがある場合、考えられる原因は主に下記の2つ。
アプリのサスペンド機能がONになっている
iOS4.0以降から、ホームボタンでアプリを終了させた場合でも、
起動状態を維持する機能がデフォルトでONになるようになった。
これが悪さをしている場合があるので、info.plistに下記の設定を行い、この機能をOFFにしてみる。
<key>UIApplicationExitsOnSuspend</key>
<true/>
アプリのinfo.plistがターゲットのバンドルリソースに追加されている
info.plistの場所を変更し、再度プロジェクトに追加した場合などに、バンドルリソースに入ってしまうことがある。この場合、何故か2回目の起動時にもうひとつアプリがインストールされ、以前のアプリが立ち上がることがあるので削除する。
”Failed to launch simulated application: Unknown error.”
まれに上記のエラーが出て、iPhoneシュミレータがうんともすんとも言わなくなることがある。
何せ[Unknown error]なので、どうしようもないわけだけど、実際はいろいろな原因が考えられるようで。
今回の場合は、info.plistの[実行ファイル名]に、記号が入っていたのが原因だった。
[./\n\s]あたりの記号が入っていると上記エラーが起こる模様。
同様に、ターゲットのビルド設定の[プロダクト名]も、記号は受け付けない模様。
アプリケーションの表示名には使える記号も、使えない場合があるので注意。
その他の原因と解決方法はここにいろいろなレポートがある。
基本的にinfo.plist/Prefix.pchやファイル/フォルダ名が原因のことが多いようだ。
UIViewControllerを使いたくない主義のせいで、
Youtubeのフルスクリーンの制御で若干はまったのでメモ。
iPadではembedタグを利用することで、UIWebView内に普通にYoutubeプラグインを埋め込むことができる。
YoutubeをUIWebViewに埋め込むと、自動で再生ボタンや最大化ボタンが表示され、
最大化ボタンを押すと、勝手に最大化した画面を出してくれるし、
最小化ボタンを押すと、勝手に元の位置とサイズに戻してもくれるのだけれど、
自動で表示される最大化画面が、デバイスの回転に対応しなかったり位置がずれることがあった。
内部で実際にYoutubeを再生しているのはYoutubePluginという複合クラスのようなんだけど、
プライベートなクラスなので、容易には触れなかった。
Youtube再生画面内の最大化ボタンをタップした瞬間をフックできればいいのだけど、
それも上手くいかなかった。(UIWebView/YoutubePluginはタップのイベントを受け付けないので)
◇結論
デバイスの回転に対応するには
Youtubeを読み込むWebViewの親ビューのどこかでUIViewControllerを使う必要がある模様。
たとえばこんな感じで、「親ビューの階層内のどこか」でUIViewControllerを経由させる。
UIViewController *controller = [[UIViewController alloc] init];
controller.view = webParentView;
[self addSubview:[controller.view autorelease]];
WebViewの直近の親でControllerを使う必要はなくて、
むしろ後に最大化画面の位置とサイズを調整するためには、
なるべくUIWindowに近いところの親ビューをController経由にするほうがいい。
位置とサイズを調整するには
これはUIViewController経由でaddした「親ビューの」位置とサイズに従って追随する模様。
なのでUIDevice等から画面の回転イベントを受け取って、
Controllerを挟んだ親ビューの位置とサイズを調整すれば自動で追随してくれる。
UINavigationController等のコントローラーはなるべく使いたくない主義で、
画面の回転に対する処理をすべて自前で書いているような場合、下記の処理を書いておかないと、
UITextField等で自動でキーボードが表示される際に、Orientationが追随してくれない。
[[UIApplication sharedApplication] setStatusBarOrientation:orientation animated:NO];
UIKeyboardはステータスバーのOrientationによって表示する向きを変えている模様。
UIDeviceではないので注意。
今回はiPadのケースではまったんだけど、
iPhoneのときは普通に追随してたと思うんだけどなぁ...。
SQLiteライブラリのリンクの設定でちょっとはまったので備忘録に。
■Linkingのエラーが出たら、ビルド設定の【Library Search Path】を確認し、別のパスが優先で指定されていたらその値を削除する
( このとき検索窓を使って設定を探す場合は、Showのところを【All Settings】にしておかないと、
独自定義した値しか表示されず混乱するので注意 )
要はXCodeが勝手にPath設定を追記して、他の環境のライブラリを優先指定しているのが原因。
libxmlなど、別のフレームワークや環境等にも含まれるdylibを指定する場合、同様の問題が起こる可能性がある。
自分の場合は、XAMPPのほうのlibsqliteが優先で指定されていて、
iPhone実機で動作させる際にリンクエラーが出た。
ちなみに、シミュレータと実機ではそれぞれ別のdylibを呼ばないといけないが、
通常は自動でXCodeが切り替えてくれるところを、自前で切り替えたい場合は、
下記のパスを【Library Search Path】に指定すれば良い。
/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.2.sdk/usr/lib
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.2.sdk/usr/lib
備忘録:シュミレーター内に保存された写真は下記の場所に保存されている。
/User/ユーザー名/Library/Application Support/iPone Simulator/SDKバージョン/Media/DCIM/100APPLE
以下のような感じで、アプリ画面のスクリーンショットを撮ったりすると、高解像度の画像が得られて便利。
#import <QuartzCore/CALayer.h> - (void)getScreenShot { //現在のスクリーンショットを生成 CGRect screenRect = [[UIScreen mainScreen] bounds]; UIGraphicsBeginImageContext(screenRect.size); CGContextRef ctx = UIGraphicsGetCurrentContext(); [[UIColor blackColor] set]; CGContextFillRect(ctx, screenRect); [self.layer renderInContext:ctx]; NSData *pngData = UIImagePNGRepresentation( UIGraphicsGetImageFromCurrentImageContext()); UIImage *retImage = [[UIImage imageWithData:pngData] retain]; UIGraphicsEndImageContext(); //ローカルに保存 UIImageWriteToSavedPhotosAlbum(retImage, self, @selector(image:didFinishSavingWithError:contextInfo:), nil); } - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void*)contextInfo { if (!error) { NSLog(@"Error %@", [error localizedDescription]); } }
最近、英語のpodcastの話題や、「超字幕」の話題が人気のようなので、英語勉強に使えるサイトを僕もいくつか紹介してみようと思います。映画の話は最後に。
まず僕が英語のpodcastを探すのに使っているのはこれです。
Podcast検索サイト 「DigitalPodcast」
世界中のpodcastのリンク集です。様々な話題ごとに整理されているので、興味のある分野のpodcastを片っ端から登録してみるとかなりいいんじゃないでしょうか。TechnologyとかArtとかいいですね。どうせ聞くなら自分の専門分野の英語のほうが楽しいに決まっていますね。その場で聴けるのもいいです。
次におすすめしたいのはこれです。
言語交換SNS 「Lang-8」
LanguageExchangeと呼ばれる活動を支援するためのSNSです。LangageExchangeは、自分が習いたい言語をネイティブの人に教えてもらう代わりに、自分も他の人に母国語を教えてあげるという活動です。
このサイト上では、学習中の言語でMIXIのように日記をつけることができ、その記事を他のネイティブのユーザが添削してくれます。その代わり自分も自分の母国語で書かれた他の人の日記を添削してあげましょう。
母語が日本語で英語を習いたいようなケースでは、このサイトは楽しめるんじゃないかと思います。日本語を習いたい外国人はいっぱいいますし、英語を母国語とする人は当然多いので。
案外おもしろいのは、他の人の日本語の添削です。こっちはネイティブスピーカーなので、微妙なニュアンスの間違いも手に取るように分かり、外国語で日記が上手く書けなくてその難しさに落ち込んだときも、「難しいのはお互い様なんだ」と思えます。
また外国人が間違えやすい日本語の表現なんかも分かって、外国人がなんだかkawaiiく見えるし、逆にものすごく高尚な日本語を使いこなしている人もいて、とても勉強になります。
(余談ですが、このサイトにも「Functional Programming / Haskell」のグループがあったのには笑いました。全然活動してないけど。)
次は英語の雑誌が読めるサイト。
洋雑誌シェアサイト 「Mygazines」
洋雑誌をシェアできるサイトです。少し前に物議をかもしていたんですが、いちおう事件は解決したようですね。ここではいろんな洋雑誌の記事をWEB上で読むことが出来ます。
以前は有名な雑誌がかなりあって(Wiredとか)、英語の雑誌を日本に輸入していた洋販が潰れて困っていた身としては助かっていたんですが、訴えられてからはずいぶん内容が寂しくなってしまいました。
それでも生の紙面が検索できて手軽に見れるのはいいですね。洋雑誌は広告がすごく勉強になると思うのでおすすめです。
で、いよいよ映画の話。
映画のシナリオデータベース 「IMSDB」
ここはすごいです。有名映画からマイナー映画まで、いろんな洋画のスクリプト(台本)が検索できます。しかもその場で全文読めます。
映画の台詞なので気障っぽかったり大袈裟だったり汚すぎたり、当然日常では使えない表現も多いですが、そんなことより、「憧れの映画のあの台詞が英語で読める/言えるようになる俺かっこいい!」というのが正しい使い方です。
たとえば僕の大好きなタランティーノのPulpFictionの台本。スラングばりばりですさまじい内容の映画なんですが、今見るととんでもなく豪華な俳優陣のドタバタ群像劇でカコイイです。ビンセントとジュールスのあのクールな台詞も読めます。
VINCENT
Well, in Amsterdam, you can buy beer
in a movie theatre. And I don't mean
in a paper cup either. They give you
a glass of beer, like in a bar. In
Paris, you can buy beer at
MacDonald's. Also, you know what
they call a Quarter Pounder with
Cheese in Paris?
JULES
They don't call it a Quarter Pounder
with Cheese?
VINCENT
No, they got the metric system there,
they wouldn't know what the fuck a
Quarter Pounder is.
JULES
What'd they call it?
VINCENT
Royale with Cheese.
JULES
(repeating)
Royale with Cheese. What'd they call
a Big Mac?
VINCENT
Big Mac's a Big Mac, but they call
it Le Big Mac.
JULES
Le Big Mac. What do they call a
Whopper?
VINCENT
I dunno, I didn't go into a Burger
King. But you know what they put on
french fries in Holland instead of
ketchup?
JULES
What?
VINCENT
Mayonnaise.
JULES
Goddamn!
VINCENT
I seen 'em do it. And I don't mean a
little bit on the side of the plate,
they fuckin' drown 'em in it.
JULES
Uuccch!
やっぱ最高ですねこの二人!
台本読むだけで二人の会話が脳内再生されてニンマリしてしまいます。 (クォーターパウンダーやワッパーも今なら日本でも食べれるしね)
他にも「レザボアドッックス」とか「時計仕掛けのオレンジ」とか 「トレインスポッティング」なんかも下品でいいんじゃないでしょうか!
で、ここからが大事なんですが、英語のスクリプトだけだとどうしても意味がわからない表現が出てきます。DVDの日本語字幕と読み比べたとしても、具体的にどの部分が慣用句なのかとかがさっぱりな時があります。それに話を覚えているのに毎回DVD見るのも面倒くさい。
そこで超字幕もいいですが、安くあげたい人におすすめなのが、洋画のスクリプト対訳本です。
これの良いところは、台詞の横に慣用句とか難しいスラングの解説が出ているところと、大きい図書館なら大体有名どころが何冊か置いてあるというところです。
たとえば東京都図書館横断検索で「スクリーンプレイ」で調べると、結構ありますね。
なので近くの図書館で試しに借りて読んでみると、楽しい休日が過ごせるんじゃないかと思います。マジおすすめ。アマゾンでも中古だとものすごく安いので、欲しいのが見つかれば買っでもいいかもですね。
以上、パルプフィクション紹介したかっただけなんですが、なんとなく英語勉強に使えるサイトを紹介してみました。今Amazon見たら「ウォール街」も対訳本ありますね。いいかも。