2011/10/24

Flashの超・超初心者ネタです。。。 凄く久しぶりの Flash で操作に戸惑いながら、mp3 再生しようと思って MediaController で作ってみる・・・

再生できない!(爆)

ずっと前に、FLVPlayer を利用した記憶があったが、Flash コンポーネントには、MediaController と MediaDisplay と MediaPlayBack がある。 MediaController 何だか、MediaController の使い方がよくわからなかったので、MediaPlayBack コンポーネントにしたらうまくいった。 MediaPlayBack この3つのコンポーネントの違いは、Flasher じゃないのと調べる気力がないのでやめます(苦)

flaファイル

MediaPlayBack を配置してインスタンス名をつける。 (例では、soundPlayer とした) [as3]

include "settings/default.as"

include "scripts/sound.as"

[/as3] fla ファイルのタイムラインの最初に記述。

default.as

[as3] var debug = false; var setting = new Array(); setting['sound_dir'] = "sounds/"; [/as3] 気休めにファイルを分割して設定ファイルを作成。

sound.as

[as3] soundPlayer.controllerPolicy = "on"; soundPath = setting['sound_dir'] + sound_file_name; soundPlayer.autoPlay = false; soundPlayer.contentPath = soundPath; soundPlayer.load(); [/as3] sound_file_name は、htmlからの引数です。

index.html







引数は、FlashVars で渡してやります。 (例の場合、sound_file_name=19.mp3)

  2011/10/17

Xcode4 になってから Analize が優秀で、自分のコードが間違ってたりリークの原因を察知して 教えてくれます。

例えば、カスタムクラスを viewDidLoad なんかで生成して使い回したい場合、@synthesize してやりますが、以下のコードはあまり好ましくありません。

リークの恐れのあるコード

if (self.section == nil) self.section = [[Section alloc] init];

init したインスタンスを、self で経由しているのが問題。

正しいコード

if (self.section == nil) {
        Section *_section = [[Section alloc] init];
        self.section = _section;
        [_section release];
}

と init → release と明示的にしてやるのが安全。

  2011/10/17

Xcode4.2 にしたら警告の検知の精度が向上し、バグ潰しも効率的になってきたかと。 そして UIActionSheet のスタイル「actionSheetStyle」に警告が。 以前から自分が間違って設定していたみたいです(汗)。。。

actionSheet.actionSheetStyle = UIBarStyleBlackTranslucent;

UIBar じゃなくて UIActionSheet の設定は、

actionSheet.actionSheetStyle = UIActionSheetStyleBlackTranslucent;

ただ定義を見てみると UIActionSheet も UIBar も同じ順番なので、何とか同じで動いてるのでしょう。

typedef enum {
    UIActionSheetStyleAutomatic        = -1,       // take appearance from toolbar style otherwise uses 'default'
    UIActionSheetStyleDefault          = UIBarStyleDefault,
    UIActionSheetStyleBlackTranslucent = UIBarStyleBlackTranslucent,
    UIActionSheetStyleBlackOpaque      = UIBarStyleBlackOpaque,
} UIActionSheetStyle;

ただ、将来的に UI の仕様が変わってしまうので警告は出来るだけ潰しておかないとです。

  2011/09/28

仕事がかなり立て込んでる中、2日間みっちり講習受けて Titanuim認定試験(TCAD)にギリギリ受かった。

75% 合格で 81% ... 危ない。 というか意外と問題が難しい。

てか本当は Titanium でアプリ作らないと意味がないんだけど・・・。 でも、仕事がきても集中砲火になりそうで困ったりする。

と、このところ JavaScript まみれな俺でした。

  2011/09/27

さんざん悩まされました。 2000 x 1000 ピクセル級の画像を何枚も一度に読み込んで、サムネイルでループを回していたので明らかに

UIImageView のメモリリーク

imageNamed をやめてキャッシュを無くす方法もだめで、ちゃんとサイズ縮小しようとネットで検索したところ、「カメラアプリの作り方 (3) - 写真を縮小して表示する」の方法で解決しました。

サンプル

    NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"png"];
    UIImage *image = [[UIImage alloc] initWithContentsOfFile:imagePath];
    CGSize  size = {300, 300};
    UIGraphicsBeginImageContext(size);
    CGRect  rect;
    rect.origin = CGPointZero;
    rect.size = size;
    [image drawInRect:rect];

    UIImage *newImage;
    newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

Context 具体的には UIGraphicsBeginImageContext() と UIGraphicsEndImageContext() を利用して新たに画像を生成する方法です。

これは思いつかない方法でした。

  2011/09/21

UIScrollView のスクロールってデフォルトでは「びよーん」て引っ張れるけど、これをやめる方法。 delegate メソッドで CGPoint とって・・・とか考えたら。

プロパティ一発でした

[scrollView setBounces:NO];

なんと言う脱力感。。。 よくソース見ろよというネタでした。

関係ないですけど、ScrollView のデリゲートメソッド集の Wiki がありました。 UIScrollViewDelegate

  2011/09/05

ムービーを再生するには、MediaPlayer.framework をインポートし、MPMoviePlayerController を利用する事で、比較的簡単に実装する事ができます。 MediaPlayer

[iPhone] メディアプレイヤーで動画再生を参考に実装してみる。

サンプル

- (void)playMovie:(NSString *)movieName {
    NSString *path = [[NSBundle mainBundle] pathForResource:movieName ofType:@""];
    NSURL *url = [NSURL fileURLWithPath:path];
    MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:url];
    [player setShouldAutoplay:NO];
    
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(finishPreload:)
                                                 name:MPMediaPlaybackIsPreparedToPlayDidChangeNotification
                                               object:player];
    
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(finishPlayback:)
                                                 name:MPMoviePlayerPlaybackDidFinishNotification
                                               object:player];
    
    [player.view setFrame:CGRectMake(0, 0, 640.0f, 400.0f)];
    [self.view addSubview:player.view];
}

- (void)finishPreload:(NSNotification *)aNotification {
    MPMoviePlayerController *player = [aNotification object];
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:MPMediaPlaybackIsPreparedToPlayDidChangeNotification
                                                  object:player];
}

- (void)finishPlayback:(NSNotification *)aNotification {
    MPMoviePlayerController *player = [aNotification object];
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:MPMoviePlayerPlaybackDidFinishNotification
                                                  object:player];
    [player stop];
    [player.view removeFromSuperview];
    [player release];
}

NSNotificationCenter を利用して、プリロードや終了などを通知しています。 .h ファイルを見る限り delegate メソッドが記載されてないので、この方法なんでしょうね。

ただ、上記の場合は、自動連続再生とか複数に対応する場合のコードですかね? 普通に再生するだけなら Notification は使わなくてもいいんじゃないかな?と思います。

なので、手動でコントロールする場合は、MPMoviePlayerController を @synthesize してアクセスすればよいかと。 その際、メモリリークしないように release とかどこかしらでしないといけないと思いますが・・・。

手動で再生/停止

- (void)playMovie:(NSString *)movieName {
    NSString *path = [[NSBundle mainBundle] pathForResource:movieName ofType:@""];
    NSURL *url = [NSURL fileURLWithPath:path];
initWithContentURL:url];
    if (self.moviePlayer != nil) [moviePlayer release];
    self.moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:url];
    [self.moviePlayer setShouldAutoplay:NO];

    [self.moviePlayer.view setFrame:CGRectMake(0, 0, 640.0f, 400.0f)];
    [self.view addSubview:self.moviePlayer.view];
}

  2011/08/31

CoreAnimation で View を点滅させてみる。

CABasicAnimationを利用

- (void)blinkImage:(UIImageView *)target {
    CABasicAnimation* animation = [CABasicAnimation animationWithKeyPath:@"opacity"];
    animation.duration = 1.0f;
    animation.autoreverses = YES;
    animation.repeatCount = HUGE_VAL;
    animation.fromValue = [NSNumber numberWithFloat:1.0f];
    animation.toValue = [NSNumber numberWithFloat:0.5f];
    [target.layer addAnimation:animation forKey:@"opacityAnimation"];
}

CABasicAnimation で opacity を設定。 無限ループは HUGE_VAL 定数を利用する。

--2012/05/19追加

CAKeyframeAnimationを利用

- (void)blinkImage:(UIImageView *)target {
    CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"opacity"];
    animation.duration = 1.0f;
    animation.repeatCount = HUGE_VAL;
    animation.values = [[NSArray alloc] initWithObjects:
                              [NSNumber numberWithFloat:1.0f],
                              [NSNumber numberWithFloat:0.0f],
                              [NSNumber numberWithFloat:1.0f],
                              nil];
    [target.layer addAnimation:animation forKey:@"blink"];
}

  2011/08/29

vimの画面分割コマンドはよく忘れてしまう。 ということで、viエディターでの画面分割 を参考にメモ。

画面を開く

:sp 画面を上下に分割 :sp ファイル名 指定したファイルを分割した画面に表示

ちなみに、既に開いているファイルは swp するので注意。

画面を移動

Ctrl-w をベースとしたショートカット

Ctrl-w w 画面間の移動 Ctrl-w p 画面間の移動 Ctrl-w k 上画面移動 Ctrl-w j 下画面移動 Ctrl-w l 右画面移動 Ctrl-w h 左画面移動 Ctrl-w + 画面を一行分大きくする Ctrl-w - 画面を一行分小さくする Ctrl-w = 画面サイズを同じにする

ファイルを開く

:e パス

ファイルを開く場合、現在開いているパスから相対パスで指定でき、[Tab]キーでファイルパスを補完できる。 vim

これで、マウス使わずに他のファイルを参考したりコピペとかできるけど、作業効率的にどっちがよいかな?

  2011/08/21

コメントアウト

Cmd + /

pngファイルの軽量化
Google DriveのIconを再起的に削除
php-markdownでバニラPHPなコードブロック処理
laravel-ffmpeg を使う
2021年版 Ubuntu + certbot + Let's Encrypt でサーバ証明書設定
GihHub のデフォルトでない master ブランチを checkout する
マルチログインで未認証のリダイレクト
Homebrew で Redis をインストール
CSS だけでスムーズスクロール
EC-CUBE4 で Gmail の smtp を利用する
Amazon Linux 2 の amazon-linux-extras とは
UNIQUE カラムのバリデーションで自分自身を除外して更新
フォーム有効期限切れで Page Expired をリダイレクト
ログを日付でローテーションやクリアや削除
Homebrew で PHP8.0 から PHP7.4 にダウングレード
Big sur で zsh 移行と Homebrew アップグレード
Mac に minikube をインストール
途中から .gitignore に追加する
Larevel 6.x から Laravel 8.x にバージョンアップ
Composer で Allowed memory size (メモリ不足)エラー
Blade でカスタムクラスを利用する
git push git pull にブランチ指定せずに実行する
git pull や git push できなくなったとき
Docker のコンテナからホストOS に接続
Mac で ローカル IP アドレス(ipv4)のみを表示する
ホストOS から Docker の MySQLコンテナに接続
caching_sha2_password のエラー
node-config で環境設定ファイルを利用する
rootパスワードを初期化(再設定)する
Git から clone したときのエラー対処
Mac に MySQL をインストール
Mac に PostgreSQL をインストール
Laravel 環境構築 - Mac ネイティブ編
Firebase 入門 - Firebase とは
Firebase 入門 - CLI インストールとデータベースの設定
AWS 無料枠(t2.micro)で容量とメモリエラー
Cloud9 を起動する -初心者編-
gcloud で GCEインスタンスを起動してみる
AWS CLI と jq でインスタンス一覧を整形して表示
React と Laravel7 のプロジェクトを作成する
Homebrewインストール-2020年版
3直線で囲まれた範囲塗りつぶし
PuLP で線形最適化問題を解く
カスタムのペジネーションを作る
node-sass を使って sass をコンパイルする
Log ファサードでSQLログを分離して書き出す
いちから始める Docker - 複数のコンテナを使う - (2020年)
いちから始める Docker - docker-compose を使う - (2020年)
AWS ECR を使ってみる
Laravel7 でマルチ認証