CALENDAR
S M T W T F S
    123
45678910
11121314151617
18192021222324
252627282930 
<< September 2016 >>
ARCHIVES
CATEGORIES
A
S
MOBILE
qrcode
スポンサーサイト

一定期間更新がないため広告を表示しています

| - | | - | - |
PS3のDLNAクライアントでiPhoneの動画を見たいからffmpegで変換するねん
 3GSから4になってさらにスペックの上がったiPhoneで動画を見るのに、ReadNASに全部突っ込んでメディアサーバを有効にしてPS3のDLNAクライアントで見ようとしても「非対応ファイル」と言われてとても悲しいので、ffmpegを使ってiPhoneが作る mov ファイルを mp4 ファイルに再エンコードしないで高速に変換して、ついでにファイルの作成時間が撮影日時になってるけどファイルを動かしたら失われちゃうからファイル名を撮影日時にしておいた、という話。

使用するコマンド
ls -lTU *.MOV | php -R 'var_dump($argn);preg_match_all("/(?:¥s+(¥S+))/",$argn,$parts);var_dump($parts);$date=@date("Ymd_His",strtotime("{$parts[1][7]}-{$parts[1][4]}-{$parts[1][5]} {$parts[1][6]}")); var_dump($date);$cmd = ("ffmpeg -y -i {$parts[1][8]} -vcodec copy -acodec copy {$date}.mp4");var_dump($cmd);$e = system($cmd); var_dump($e); return $e;'

ちなみに、 ls のオプションは Mac OS X の場合なので Linux の場合は http://q.hatena.ne.jp/1133354704 とか見ながら要変更。

| PS3 | 13:01 | comments(3) | trackbacks(0) |
Xcode4を使って複数台のiPhone/iPad実機の同時デバッグをやりたいねん。
Xcode4を使えばiPhone/iPad実機を2台以上使って同時にデバッグができる。
以下、その方法。

0. MacにiPhone/iPadを2台以上同時にUSB接続する。USBハブを使っても可。
1. 各iPhone/iPad実機にビルドしたアプリケーションをインストールする。
2. 各実機で手動でアプリケーションを起動する。
3. XcodeのScheme(ウインドウ左上の実機/シミュレータを切り替えるやつ)でデバッグしたい実機を1台選択する。
4. Xcodeのメニュー「Product → Attach to Process → [起動しているアプリケーション名]を選択する。
5. XcodeのDebug Navigator(ファイル一覧とかと同じペインにあるByTheradとかByQueueとか書いてるやつ)で接続されているかを確認する。
6. 3に戻って他の実機を選択して以下ループ。

これで各実機で同時にデバッグを行なっている状態になるので、ブレークポイントやログ等を同時に確認できるようになる。

ちなみに、シミュレータと実機の同時デバッグはSchemeを切り替えて実行するだけで可能。
手元ではシミュレータ+iPhone3台の同時デバッグに成功している。
| iPhone | 12:26 | comments(0) | trackbacks(0) |
-[NSObject performSelector:withObject:after:]にblockを渡したいねん。
blockで渡された処理を、遅延して実行したい。
- (void)anotherMethod:(void (^)(void))anotherBlock {
    [self performSelector:@selector(myMehod:) withObject:[[anotherBlock copy] autorelease] afterDelay:2.0f];
}

- (void)myMehod:(void (^)(void))myBlock {
    myBlock();
}
[[block copy] autorelease] で渡せばok。


see. http://stackoverflow.com/questions/4007023/blocks-instead-of-performselectorwithobjectafterdelay/4007066#4007066
| iPhone | 18:58 | comments(0) | trackbacks(0) |
+[UIView animateWithDuration:delay:options:animations:completion:] の options でハマった。
+[UIView animateWithDuration:delay:options:animations:completion:] で options にUIViewAnimationOptionCurveEaseInOut など何かを指定した場合何も設定しなくても、一緒に UIViewAnimationOptionAllowUserInteraction を設定しないとアニメーション中にタッチ等の動作を受け付けなくなるので要注意。

options:0 の場合は普通にタッチ等を受け付けるのでこちらも要注意。

options:UIViewAnimationOptionCurveEaseInOut として compilation 内で別のアニメーションを呼んでいたりすると永遠にタッチ等を受け付けなくなってしまう。

[訂正]
options に UIViewAnimationOptionCurveEaseInOut を指定しようが指定しまいが、 UIViewAnimationOptionAllowUserInteraction を指定していないとアニメーション中のタッチ等の操作を受け付けなくなる。
他にも +[UIView animateWithDuration:animations:] はオプション指定が無くて UIViewAnimationOptionAllowUserInteraction を指定する事ができないが、こちらもアニメーション中はタッチ等の操作を受け付けない。

よって、ループアニメーション等を +[UIView animetion〜] を使用して行ないつつ操作も受け付けるならば +[UIView animateWithDuration:delay:options:animations:completion:] を使用しつつ、 options に UIViewAnimationOptionAllowUserInteraction を指定する方法で一択になる。
| iPhone | 11:43 | comments(0) | trackbacks(0) |
UIImagePickerController経由でカメラロールの写真のExifにアクセスしたいねん
 表題の通り。以下コード。
#pragma mark -
-(IBAction)pushButton:(id)sender {
    UIImagePickerController *picker = [[UIImagePickerController alloc] init];
    picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    picker.delegate = self;
    [self presentModalViewController:picker animated:YES];
    [picker release];
}

#pragma mark -
#pragma mark UIImagePickerControllerDelegate Methods

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    NSLog(@"%@",info);
   
    NSURL *assetURL = [info objectForKey:UIImagePickerControllerReferenceURL];
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
    [library assetForURL:assetURL
             resultBlock:^(ALAsset *asset) {
                 ALAssetRepresentation *representation = [asset defaultRepresentation];
                 NSDictionary *metadataDict = [representation metadata]; // ←ここにExifとかGPSの情報が入ってる
                 NSLog(@"%@",metadataDict);
             } failureBlock:^(NSError *error) {
                 NSLog(@"%@",error);
             }];
    [library release];
}

| iPhone | 22:12 | comments(0) | trackbacks(0) |
Objective-Cで無名カテゴリでprivateなプロパティを実現する方法
 プロパティを使用する時、普通に .h で @property を宣言すると、外部のクラスからもアクセスできちゃう。
例えばこんな感じ。

Sample.h
#import <Foundation/Foundation.h>

@interface Sample : NSObject {
    NSMutableArray *privateArray;
}
@property (nonatomic,retain) NSMutableArray *privateArray;

@end

OtherClass.m
- (void)someMethod:(id)someObj {
    Sample *sample = [[[Sample alloc] init] autorelease];
    sample.privateArray = nil; // こんなことされたら非常に困る
}
でも、@propertyを使用せずにメンバ変数としてアクセスするとたまにミスっちゃうので困る。

Sample.m
- (void)childMethod {
    // 2回目に呼ばれた時に以前の物をリリースしてないのでリークする
    // しかも静的アナライザでも検出できない
    privateArray = [[NSMutableArray alloc] init];
}

- (void)parentMethode {
    [self childMethod];
    [self childMethod];
}

これらを解決するのが無名カテゴリでプロパティを宣言する方法。

Sample.h
#import <Foundation/Foundation.h>


@interface Sample : NSObject {
    NSMutableArray *privateArray;
}

@end
Sample.m
#import "Sample.h"

@interface Sample () // カテゴリ名を設定しない

@property (nonatomic,retain) NSMutableArray *privateArray;

@end


@implementation Sample

@synthesize privateArray;

- (id) init {
    self = [super init];
    if (self != nil) {
        // retain で宣言されているので自動的に retain されるので
        // autorelease をつける必要がある
        self.privateArray = [[[NSMutableArray alloc] init] autorelease];
    }
    return self;
}

- (void) dealloc {
    // retain で宣言されているので nil を代入すると release される
    self.privateArray = nil;
   
    [super dealloc];
}

- (void)childMethod {
    // release せずに代入しても自動的に以前のオブジェクトの release と
    // 新しいオブジェクトの retain をしてくれる。
    self.privateArray = [[[NSMutableArray alloc] init] autorelease];
}

- (void)parentMethode {
    [self childMethod];
    [self childMethod];
}

@end
@property を retain にしておけば dealloc で nil を代入するのさえ忘れなければリークする事がないので安心。

ちなみに、 .h に現れないだけで無理矢理呼べば触れちゃうのでご注意。
このあたりは Objective-C の仕様なので仕方が無い。
| iPhone | 13:47 | comments(0) | trackbacks(0) |
iOS4と新型SBrowserとUIGestureRecognizer
本日、iPhoneOSの4.0となるiOS4が公開となった。
それに伴い、私の開発するSBrowserもiOS4対応となり、バックグラウンド実行にも対応したが、それ以外に大きな変更点としてスワイプによるナビゲーションコントロールを実装した。

----
3.1.1の新しい機能。
・Safariから「shttp://google.com/」でSBrowserが起動します。
・ジェスチャーでの操作のショートカット
・個体識別情報をランダムに自動設定できます。
----

・ナビゲーションバーで右にスワイプ→リスト画面に戻る
・ツールバーで右にスワイプ→ページを進む、左にスワイプ→ページを戻る、上にスワイプ→ページをリロードする


この機能は iPhoneOS3.2 で追加された UIGestureRecognizer を使って実装している。
UIGestureRecognizer は従来では touch のタイミングや移動によってスワイプやスクロールなどのジェスチャーを自前で判別する必要があった物を、設定一発で自動で処理してくれるスグレモノである。
また、 UIView が UIGestureRecognizer のサポートをしているため、 UIView を継承したクラスなら、例えば UIToolBar でもサブクラスの実装を必要とせずにジェスチャ機能を追加させることが大きな利点である。

SBrowser では実際に、次のように実装している。

-(void)setup {    
    // swipeで様々なショートカットを割り付ける
    UISwipeGestureRecognizer *rec;
    rec = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeNavigationBar:)];
    [self.navigationController.navigationBar addGestureRecognizer:rec];
    [rec release];

    rec = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeToolBarRight:)];
    [rec setDirection:UISwipeGestureRecognizerDirectionRight];
    [self.navigationController.toolbar addGestureRecognizer:rec];
    [rec release];
    
    rec = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeToolBarLeft:)];
    [rec setDirection:UISwipeGestureRecognizerDirectionLeft];
    [self.navigationController.toolbar addGestureRecognizer:rec];
    [rec release];

    rec = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeToolBarUp:)];
    [rec setDirection:UISwipeGestureRecognizerDirectionUp];
    [self.navigationController.toolbar addGestureRecognizer:rec];
    [rec release];
}

// ジェスチャに対応したメソッド
-(void)swipeToolBarRight:(UISwipeGestureRecognizer *)gestureRecognizer {
    [webView goForward];
}

// …他にも同様のメソッド


たったこれだけのコードで、ジェスチャが行なわれた時に任意のメソッドを実行する事ができる。
touch を確認する必要なく、またスワイプの勢いの調整などに頭を悩ます必要がなくなったのは大きい。

参考までに、特定のオブジェクトに割り当てられたジェスチャを解除する場合には以下のようにする。

    for (UISwipeGestureRecognizer *rec in [self.navigationController.toolbar gestureRecognizers]) {
        [self.navigationController.toolbar removeGestureRecognizer:rec];
    }

    for (UISwipeGestureRecognizer *rec in [self.navigationController.navigationBar gestureRecognizers]) {
        [self.navigationController.toolbar removeGestureRecognizer:rec];
    }
なお、今回利用したのは UISwipeGestureRecognizer だけだが、その他にも以下のような種類がある。様々なシーンで使用できるだろう。
UILongPressGestureRecognizer
UIPanGestureRecognizer
UIPinchGestureRecognizer
UIRotationGestureRecognizer
UISwipeGestureRecognizer
UITapGestureRecognizer
UIGestureRecognizer に関する Apple のリファレンスはこちら。


もし、このエントリーが参考になったら、是非ともSBrowserをダウンロードしてお試し下さい。

| iPhone | 09:51 | comments(0) | trackbacks(0) |
ゲシュタルト崩壊せずに読めたら勝ち。
 

Yahoo!ニュース 音楽「マソソソ・マソソソからマソソソ・マソソソが脱退表明」

12月25日、アメリカの有名ロックバンド、マソソソ・マソソソからボーカルのマソソソ・マソソソが脱退するという意向を表明した。
マソソソ・マソソソは89年にマソソソ・マソソソとしてデビューし、「メカニカル・アニマルズ」などのヒット作を生んだロックシンガー。
またマソソソ・マソソソはマソソソ・マソソソの奇抜さと挑発的なパフォーマンスでも有名なバンドで、特にマソソソ・マソソソの宗教批判は団体からの数々のバッシングを受けるほどである。

マソソソ・マソソソのギタリスト、ティム・スコールドは「マソソソ・マソソソからマソソソ・マソソソが抜けると現時点での断言はできないが、マソソソ・マソソソ自身がマソソソ・マソソソを抜けるというなら、俺達マソソソ・マソソソはそれを受け入れるしかないよ」と語った。マソソソ・マソソソのマソソソ・マソソソ脱退後、マソソソ・マソソソはマソソソ・マソソソという名をマソソソ・マソソソに譲るのかどうかは未だ不明である。

オレとしてはマソソソ・マソソソよりもマソソソ・マソソソの意志を尊重すべきだと思うな。マソソソ・マソソソがマソソソ・マソソソから脱退するんならもはやマソソソ・マソソソはマソソソ・マソソソではなく、マソソソ・マソソソだけがマソソソ・マソソソを名乗ることができるわけだし。



元ネタ:マリリンマンソンがマリリンマンソン


| 日常 | 08:55 | comments(0) | trackbacks(0) |
Application names cannot contain control characters. Control characters include null, new lines, carriage returns, escape and other invisible characters.
 iTunes Connectでアプリのアップデートを申請しようとしたら、こんなエラーが出てどーにも提出できない。

Application names cannot contain control characters. Control characters include null, new lines, carriage returns, escape and other invisible characters.

いやいや、アプリ名に制御文字なんて入ってないから。
何度試しても全然エラーがなくならないので困っていたら、

http://twitter.com/noborunrun/statuses/7927402708
. @sumihiro すでにあれかもだけど、What's newを一行でとかw http://d.hatena.ne.jp/ancou/20100119/p1
そんなアホなと思いながらもやってみたら見事に通った。

ということで、上記エラーが出た時の対応法はこちら。

1. What's newを適当に1行で書く。これは後で修正するので深く考えないでOK。
2.Upload binary later. のチェックをしてバイナリをアップロードしない。
3.この状態で一度saveする。
4.審査状態の表示、Edit Information、Upoad Binaryなどのページに戻ったら、Edit Informationのページを開く。
5.What's newを修正して、本来の情報を入力。
6.そしてsaveする。ここではエラーが出ない。
7.Upload Binaryから、バイナリをアップロードしてsave。
8.後は審査を待つのみ。

アップデートの申請画面ではエラーと言われるのに、情報の編集画面ではエラーと言われないのでこの方法で通せる。

良かった良かった。

| iPhone | 11:05 | comments(1) | trackbacks(0) |
iPhoneのSafariで等幅フォントで表示させる方法
 iPhoneのSafariはプロポーショナルフォントで表示される。
等幅フォントで表示したいけど、"MS ゴシック"みたいなのは入ってない。

でも、大丈夫。

<style>*{font-family:monospace;}</style>

CSSでこう指定すれば等幅フォントで表示される。
Check
| iPhone | 12:27 | comments(0) | trackbacks(0) |
| 1/37PAGES | >>

そらをみあげても