Objective-C UILabelをperformSelectorInBackgroundで連続で操作すると落ちる

UIProgressViewで進捗を表示すると同時に、
UILabelで%を表示しようと思い、performSelectorInBackgroundで書き換えるコードを書いたところ、
10回に1回ぐらいの割合で落ちた。

エラーメッセージや頻度もまちまちなため、
恐らく複数のスレッドで同時にUILabelにアクセスしようとして落ちたのではと思い、
KAThreadを使わせて頂き、
常に同じスレッドで更新するようにしたところ落ちなくなった。

KAThreadはこちら

Objective-C iPhoneアプリでmp3などの音楽をWebのURLを指定して再生する

音楽データをWebから取得して再生するのをやりたくていろいろやり方を調べた結果をまとめておきます。

AVAudioPlayerを使うと、
サーバ上のURLを指定して音楽データをWeb上から取得して再生が出来ます。

AVAssetやAVMetadataItemを使い、
mp3のメタデータやアートワークも取得ができます。

[objc]
NSError *error;
NSData *data = [[NSData alloc] initWithContentsOfURL:url];
AVAudioPlayer *_audioPlayer = [[AVAudioPlayer alloc] initWithData:data error:&error];

if( error ){
NSLog(@"%@", error);
return;
}

AVAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil];
NSArray *metadata = [asset commonMetadata];

for ( AVMetadataItem *item in metadata ) {
if( [[item commonKey] isEqualToString:@"title"] ){
_currentPlayingTitle = [item stringValue];
}
if( [[item commonKey] isEqualToString:@"artist"] ){
_currentPlayingArtist = [item stringValue];
}
if ([[item commonKey] isEqualToString:@"artwork"]) {
UIImage *img = nil;
if ([item.keySpace isEqualToString:AVMetadataKeySpaceiTunes]) {
img = [UIImage imageWithData:[item.value copyWithZone:nil]];
}
else { // if ([item.keySpace isEqualToString:AVMetadataKeySpaceID3]) {
NSData *data = [(NSDictionary *)[item value] objectForKey:@"data"];
img = [UIImage imageWithData:data] ;
}
_currentPlayingArtwork = img;
}
}

[_audioPlayer prepareToPlay];
[/objc]

三菱東京UFJ銀行をかたりログイン情報を得ようとする詐欺サイト

最近よく届くメールが、
「三菱東京UFJ銀行」本人認証サービスという件名で、
こんにちは!
最近、利用者の個人情報が一部のネットショップサーバーに不正取得され、利用者の個人情報漏洩事件が起こりました。
お客様のアカウントの安全性を保つために、「三菱東京UFJ銀行システム」がアップグレードされましたが、お客様はアカウントが凍結されないように直ちにご登録のうえご確認ください。
などというメッセージと共に
一見本物の三菱東京UFJ銀行のログインURLが張られている。

ところが、見かけは本物のURLだが、
実はリンク先は中国サイトの別URLで、アクセスすると
三菱東京UFJ銀行のログイン画面に似せた偽サイトへ飛ばされる。

もしクリックしてしまった場合でも、
ログイン画面に何も入力しなければ特に問題はない。

もし入力してしまった場合は
下記のURLに掲載されている電話番号に連絡して欲しいとのこと。
http://www.bk.mufg.jp/info/phishing/index.html

何も知らないユーザは、
下手をするとログインIDとパスワードを入力してしまい、
ログイン情報を盗まれることになる。

更に恐ろしいと思ったのは、
下にあるベリサインシールをクリックすると、
本物のベリサイン証明書の表示がされてしまう。
与えるURLパラメータは誰でも好きに与えられるため、
本当にベリサインの証明書を利用しているかのような錯覚を与えられる。

他にも同様のメールが届いたユーザがいたら、
本物の三菱東京UFJからのメールは電子証明書付きで送られてくるため、
証明書がついているかを確認したり、
差出元のアドレスがyahoo.co.jpのフリーメールなので確認すればすぐに偽物だと分かるため、削除したり無視したりする。

FacebookアプリをPHPで使用していてこのウェブページにはリダイレクト ループが含まれていますと表示される

CakePHPのからFacebookのoauth認証を使っていて、
自分だけは認証が上手くいき、他のユーザーはループが発生するとエラーが表示されはまった。

エラー画面にはアプリがサンドボックスモードになっているなどで表示されており、
ググると設定方法が出てくるが、管理画面が新しくなっていた。

現在では、
アプリ管理画面の左メニューにあるStatus & Reviewを選択すると
capture1

Do you want to make this app and all its live features available to the general public?
というメッセージと共にスイッチがあり、これがデフォルトではいいえになっているため、
はいにすると問題が解消された。
capture2

WordPressで画面が真っ白になる

今のサイトはWordPressを使っているが、
プラグインの検索や有効化をしようとすると画面が真っ白になって使えなくなった。

ルートパスにあるwp-config.phpの以下をtrueにしたところ、
fatal error call to undefined function mb_convert_kana()というエラーが表示された。

[php]
define(‘WP_DEBUG’, false);
[/php]

以下のサイトを参考にyumでmbstringをインストールし、Apacheを再起動したところ、無事解決した。
[PHP] mb_convert_kana() / mb_convert_encoding() などが使えずエラーが発生する時の対処法

Android TransitionDrawableをプログラムで初期化する

画像のクロスフェードの方法を探している際、
TransitionDrawableというのがありました。

画像を3枚以上重ねて順番にフェードしていく動作を実現したかったので
このクラスで動的に複数のImageViewを格納したら出来るかと思ったのですが、
どうやら2枚までしか使えなかったため、別の方法にしました。

xmlの記載の方法はこちらを参考にさせて頂きました。
http://www.k-sugi.sakura.ne.jp/java/android/1995/

動的に初期化する方法が探しても見つからなかったためメモしておきます。
アクティビティを継承したクラス内で実行する場合を想定してます。

[java]
TransitionDrawable td = new TransitionDrawable(
new Drawable[]{
this.getResources().getDrawable(R.drawable.[drawableのリソース]),
this.getResources().getDrawable(R.drawable.[drawableのリソース])
}
);
(任意のImageView).setImageDrawable(td);
td.startTransition(duration);

[/java]

Android AlertDialogのOnDismissListenerで落ちる

Android4以上だったら大体のメソッドが使えるかと思っていましたが、
4.2で動いていたOnDissmissLisnerが4.0でメソッドが無いというエラーが出て落ちました。

ダイアログが消えた後に共通で処理をする場合
ボタンが押されればイベントが取れるのですが、
背景をタップしてもダイアログが消えるので使ってました。

API17から追加されたメソッドのようで、
代わりにOnCancelListenerを使うようにしました。

以下の記事が参考になりました。
stackoverflowの投稿

Android View アニメーションのまとめ

今やってる仕事でFacebookのようなドラッグでスライドするメニューを付ける必要があり、
いろいろ調べた結果をまとめてみた。
iPhoneで実装した場合は軽々できていたが、相当苦労した・・・

ドラッグ可能なビューを作る時に参考にしたサイト
http://blog.haw.co.jp/android/?p=709

今回はonClickとonTouch両方の判定が必要になるため、GestureDetectorによる実装を採用。

ドラッグ後にスライドアニメーションをするときに参考にしたサイト
http://zaki.tdiary.net/20110607.html

TranstateAnimation、Objectanimatorなど試したがうまくいかず、
ViewPropertyAnimatorというものがあり、これだと
View.animate().x(300)とかでやっとうまくいった。

このアニメーションの実装に合わせ、
ドラッグでビューを移動するときは.layoutでleftの値をいじっていたが、
view.setX(300)でXプロパティをいじるように修正した。

これでやっと機能の実装に移れる・・・

オープンソースのライセンスまとめサイトがありました

今作っているAndroidアプリで
Facebookのような右からスライドしてくるメニューを実装したいと思い
手頃なライブラリを探したところ、以下のページのライブラリがよさそうでした。
Androidアプリにサイドメニューを簡単に追加できるライブラリ(別ウィンドウで開きます。)

Apache2.0ライセンスとのことで、
何をすればいいのか調べたら、まとめサイトを発見しました。

たくさんあるオープンソースライセンスのそれぞれの特徴のまとめ(別ウィンドウで開きます。)

これによるとソースを使用していることを明記する必要があるとのことなので、今回の仕事では難しいと判断しました。
何気なく使ってるソースですが、こちらのまとめサイトのおかげでライセンスで困ることがなくなりそうです。