プログラミングの最近のブログ記事

おやゆびでおをApple Digital AVアダプターなどを使ってテレビに映せるようにしたいと年末年始に取り組んでました。iPad2やiPhone4Sのようにミラーリング対応機種なら一応映すことは可能でしたが、再生画面がフルスクリーンにならなかったりしましたし、それ以外の機種のことも考えるとアプリ側できっちり対応する必要がありました。

■アプリをサブディスプレイに対応させる

本体デバイス用のベースUIViewとしてViewForMain、外部ディスプレイ用としてViewForSubというインスタンスがあるとします。

if ([[UIScreen screens] count] >1) {
        //スクリーンが2つ以上存在する=外部ディスプレイ有り
       UIScreen *secondScreen = [[UIScreen screens] objectAtIndex:1];       
       UIWindow *secondWindow = [[UIWindow alloc] initWithFrame:[secondScreen bounds]];       
       secondWindow.screen = secondScreen;
       ViewForSub = [[UIView alloc] initWithFrame:[secondScreen bounds]];
       ViewForSub.backgroundColor = [UIColor blackColor];

       //以下、ViewForSubに必要なUI部品をaddSubviewしていく
       //必要に応じて、ViewForMainにUILabel等を置いて「テレビ画面出力中」などと表示する
   } else {   
       //外部ディスプレイ無し
       (以下、ViewForMainに必要なUI部品をaddSubviewしていく)

   }

[UIScreen screens] cound]でOSが認識しているモニタの数がわかるので、それが1より多い場合はサブモニタがあるということで、UIScreenクラスのsecondScreenオブジェクトに2番目(objectAtIndex:1)を入れ、更にUIWindowsを入れ、UIViewを入れてやります。サイズは全てsecondScreenのものを引き継いでおきます。これで後は普通にUI部品を配置して利用できます(もちろんUIButton等を置いても押せませんが)。

とりあえずこんな感じで外部ディスプレイ側に表示できました。実際には、アプリ起動中にアダプターが挿抜されたのを検知して切換処理をする等の仕組みが必要になりますがここでは割愛。というかまだ未着手…

■全画面で表示されない?

さてそこまではAppleのドキュメントやブログ記事などを参考に辿り着いたのですが、なぜかフルHDモニタに接続した時に全画面表示されずに4辺に黒縁が出てしまう現象が発生。iOSシミュレーター上で仮想1280x720ディスプレイを使っても発生しません。

SDIM0068

MPMoviePlayerはもとより、UIWindowsやUISreenインスタンスのbound.sizeを取ってみてもちゃんと1920x1080になっているにも関わらず、です。写真の様にポーズアイコンを座標0,0で置いてみると、動画部分の左上隅に来ます。アプリ的には1920x1080で動画を表示しているつもりっぽい。モニタ側で入力信号情報を表示するとこれまた1920x1080。試しに手動でboundを2000x1200とかにすると黒縁部分が減ります。この数字をつきつめればピッタリ全画面にはできるでしょうがどう考えても拡大->縮小とリサイズが2回起きて無駄だし画質も損なわれるでしょう。MPMoviePlayerの全画面表示系のプロパティをあれこれいじっても解決せず。UIScreenより上の階層で何かが画面を1割くらいスケーリングしてそれを1080pでアダプターに送出しています。

でまぁ足かけ二日ほど悩んだ挙げ句、

secondScreen.overscanCompensation = UIScreenOverscanCompensationInsetApplicationFrame;

で解決できました。オーバースキャンという言葉にもっと早く思い至っていれば検索もヒットさせられたかも知れません。もうアナログ時代の言葉だと思って記憶の底に沈んでましたw。overscanCompensationプロパティには3つの定数があるんですが、なんだか一番全画面っぽくないコイツが勝利の鍵でした。公式ドキュメントはこちら。iOS5からの対応みたいですが、とりあえずiOS4.3シミュレーターではクラッシュなどはしないようですが、iOS4.3の実機だともしかすると全画面化されないままかも知れません。

SDIM0067

見事、フルHD画面いっぱいに動画を再生できるようになりました。

 

今のところ日本語でoverscanCompensationに関して触れている記事はヒットしなそげので、参考に紹介しておきます。

iOS用アプリでパスワード入力UIを作ってるのですが、無効なパスワードを入力した時のフィードバックをどうしようか考えて、Mac OSX Lionのログイン画面のように、パスワード入力フィールドが「イヤイヤ」って感じで左右に揺れる感じにしようと思いました。いっそこれくらいCocoaの標準メソッドとしてあってくれても良さそうなものでしたが、UITextfieldのリファレンスを見る限りはなさそうだったので自分で実装してみました。さして高度なことしてるワケでもないですし、あんまりエレガントなソースでないかも知れないですが晒しておきます。もっとこうすりゃいいんじゃね?的なコメントも歓迎。

2011.10.27追記:

s1tnkさんにアドバイスいただいて大幅な簡略化に成功したので、更新版を貼ります。

//パスワードが不適切だった場合に入力欄を揺らす
-(void)shakePasscodeField {

    [UIView setAnimationRepeatAutoreverses:TRUE]; //最初の位置に戻る
    [UIView animateWithDuration:.05
         animations:^(void) {
             passcode.center = CGPointMake(passcode.center.x - 10, passcode.center.y);
         }
         completion:^(BOOL finished) {
             [UIView animateWithDuration:.05 animations:^(void) {
                  passcode.center = CGPointMake(passcode.center.x + 10, passcode.center.y);                                             
                  }
                  completion:^(BOOL finished) {
                      [UIView animateWithDuration:.05 animations:^(void) {
                           passcode.center = CGPointMake(passcode.center.x - 10, passcode.center.y);
                           }
                           completion:^(BOOL finish) {
                               [UIView animateWithDuration:.05 animations:^(void) {
                                    passcode.center = CGPointMake(passcode.center.x + 10, passcode.center.y);
                                    }];
                           }];
                  }];
         }];

1メソッドで完結できたのでほとんど説明は不要だと思います。passcodeというのがテキスト欄の名前です。

旧バージョンとの違いは、

  • setAnimationRpeatAutoreversesの存在を教わり、左に行って戻る、右に行って戻るの2フェーズで表現できた
  • completion引数に次の処理をブロックで丸ごと角ことでアニメーションを連鎖記述できるようになった
  • 結果として2フェーズx2回を1つのメソッドに完結させ、状態変数を一切なくせた
  • durationは往復なので時間を倍の0.05にした

という辺りです。振動回数のカスタマイズはやりにくくなっちゃいましたが。

 

実際の動作はこんな感じ(IE9かiOSのSafari位しかインラインで再生できないかも)。

動画がインラインで再生されない人は、こちらからMP4をダウンロードして再生して下さい(44KB)。

■以下旧バージョン

前提として、.hファイル当たりで、

IBOutlet UITextField *passcode;
INT gakuburuCounter;
BOOL isFirstLoopForShakePasscodeField;

という3つのオブジェクト、変数を宣言してあるとします。

んで、.mファイルでメソッドを2つ。

//パスワードが不適切だった場合に入力欄を揺らす
-(void)shakePasscodeField {

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDuration:.1];     
    [UIView setAnimationDidStopSelector:@selector(shakePasscodeFieldLoop)];
    switch (gakuburuCounter % 3) {
        case 0:
            //左へ動くフェーズ 
            [UIView setAnimationDuration:.025];     
            passcode.center = CGPointMake(passcode.center.x -10, passcode.center.y);
            break;
        case 1:
            //左位置から右へ動くフェーズ 
            [UIView setAnimationDuration:.05];     
            passcode.center = CGPointMake(passcode.center.x +20, passcode.center.y);
            break;
        case 2:
            //右位置から初期位置へ戻るフェーズ 
            [UIView setAnimationDuration:.025];     
            passcode.center = CGPointMake(passcode.center.x -10, passcode.center.y);
            break;
        default: 
            break;
    }
    [UIView commitAnimations];
   
}

-(void)shakePasscodeFieldLoop { 
    if (isFirstLoopForShakePasscodeField == TRUE) {
        gakuburuCounter = -1;
        isFirstLoopForShakePasscodeField = FALSE;
    }

    if (gakuburuCounter < 5) {
        gakuburuCounter++;
        [self shakePasscodeField];
    }
}

こんな感じ。

#つーか、そろそろコードをカラーリングしてくれるライブラリを導入した方がいいんだろうなぁ…

パスワードを検証してNGだったら

isFirstLoopForShakePasscodeField = TRUE;
[self shakePasscodeFieldLoop]

って感じで呼びます。

簡単に補足しておくと、テキストフィールドが定位置から左に10ピクセル、右に20ピクセル、左に10ピクセルと移動するのを1つのセットとします。ただしこれを単純に連続して呼ぶと、前のアニメーションが終わらないうちに次が実行されてしまい、正しく移動してくれないので、1つのアニメーションが終わる度に次のステップのアニメーションを実行する仕組みが必要でした。そこでそれを管理するメタメソッド(そんな言葉あるのか?)としてshakePasscodeFieldLoopを作りました。isFirstLoopForShakePasscodeFieldフラグがTRUEの状態で呼ばれると、ループカウンタgakuburuCounterをリセット(ここでは-1)して、フラグをFALSEにします。そしてgakuburuCounterをカウントアップしながらshakePasscodeFieldを呼び出します。呼ばれたshakePasscodeFieldではgakuburuCounterを3で割った答えを使って順に3つの動作パターンを実行し、アニメーションが完了した後でshakePasscodeFieldLoopを呼びます。このルートで呼ばれたshakePasscodeFieldLoopはisFirstLoopForShakePasscodeFieldがFALSEなのでカウンターはリセットせず、カウントアップだけして再度isFirstLoopForShakePasscodeを呼びます。これで、gakuburuCounterが-1~5にカウントアップする過程で、各フェーズが順に2ループ実行されます。

カスタマイズですが、-10とか20ってのが移動ピクセル数です。左に10、右に20、左に10って感じで辻褄を合わせます。つまり、振幅を倍にするなら、-20、40、-20とかするワケです。

 

shakePasscodeFieldLoop内の5を8にするとブルブルが3回になります。以降3を足すと1セット増加です。

shakePasscodeField内のUIView setAnimationDurationの値がブルブルの速度です。case 1のところは移動距離が倍なので所用時間も倍にしておくのがポイントです。

Xcodeで開発をしていて、あるタイミングからInterface Builderから.xibファイルに対して行った変更がビルドに反映されなくなってしまいました。

  • Clean
  • Clean Build Folder (Option押しながらClean)
  • シミュレーター上のアプリを削除
  • Xcodeの再起動
  • OSの再起動

なども効果無し。挙げ句、Xcode上から当該.xibファイルを削除(他フォルダに移動)してもビルドしてくれやがります。Xcode上でもFinder上にも存在しないゴーストがどこかに残ってる!

結果として解決したのは、海外の掲示板stack overflowのこのエントリの一番下(記事執筆時)のコメント。よりによってusefulカウンタが0(笑)。そろそろσ(^^)もIDとって評価記入するようにしないとなぁ。

で、具体的にはXcodeのもってるキャッシュを削除。その場所は、

/Users/(ユーザ名)/Library/Developer/Xcode/DerivedData/

ここに今までビルドしたプロジェクト毎のフォルダがあるので、それを丸ごと削除。Lionだとユーザのホーム下のLibraryは不可視になってるので、ターミナルを使うが良いでしょう。

どうもここのキャッシュはXcode上で元ファイルが消されても消されずに使われてしまうっぽいです。では元々何故起きたかについてですが、多分、.xibをローカライズして、実体ファイルがen.lprojとja.lprojに移動/コピーされた時の参照が正しく書き換わらなかったっぽい気がしています。なんかやり方が悪かったんですかね?これによってXcode上では実体ファイルである各言語別のファイルを更新し続けたものの、ビルドには親フォルダにある(あった)ファイルのキャッシュが使われ続けてしまった、ということではないかと思っています。

同日追記:

@s1tnkさんより、Xcode4から同じことをする方法を教わりました。こっちの方が簡単そげ。この作業自体はエラーのハイライティングが壊れた時とかにもする一般的なものみたいです。特定プロジェクトがなんとなく調子悪いぜって時のお試し作業の1つとして覚えておくと良さそうです。

  1. Organizerを開く
  2. 目的のプロジェクトを選択する
  3. Delived Dataという見出しの右にある「Delete…」をクリック

 

delete_derivedData

かなり前の「iOS向け高機能MP4自炊まとめ」というエントリで、Pegasys社のTMPGEncシリーズで書き出された.keyframeファイルを、mp4chap.exeでmp4ファイルに埋め込んで、iOS端末等でチャプターとして利用できる.chapters.txt形式に変換するツールを作った、と書いたところ、1年も経ったところで公開リクエストをいただいたので、公開しました。

こちらに置いておきます。

例によって自分用にサクッと作ったモノなので、あまり汎用性はないかも知れませんが。

また秒単位以下までキッチリ出力してほしいという要望があったので、v1.2では選択できるようにしてみました。もともと秒単位以下を切り捨ててた理由は、フレーム単位で指定してもmp4のようなフォーマットでは精密にジャンプできないことが多く、大抵少し前後してしまうことを鑑みて、例えばオープニングを飛ばした時に、少し本編の頭が欠けるよりはオープニングのお尻がちょろっと見える方がマシだろうと考え、フレーム単位は切り捨てをしていた、という経緯があります。が、まぁその辺りはお好みなのでなるべく厳密に計算した値を入れられるようにもしてみました。σ(^^)はMediaCoderでエンコすることが多いですが、今だとTMPGEnc Mastering Work 5でエンコすればKeyframeがきっちりIフレームとして扱われる気がするので、ドンピシャの方がいいのかも知れませんね。

ちょっと計算式がこれであってるか自信ないのでどなたかチェックしていただけると助かります。簡単には、.keyframeファイルの数値を29.97で割ると整数部分が秒単位になるので、それを取り除いた小数点以下の部分を使い、(特に指定してないですが多分)小数点以下4桁目を四捨五入して上位3桁を使用しているつもりです。

#そういう意味では「秒単位で丸める」というチェックボックスのラベルは不適切だなぁ(実際は切り捨て)。機会があれば直します。

なお、BDInfo.exeの「View Report…」等から取得できるBDMVのチャプター書式を.txt拡張子で保存したファイルをドロップした場合は、元々フレーム単位まできっちり出力してたみたいなので、こちらはそのままです。というか「秒単位で丸める」がONでも丸められません。手抜きですみません…

あと保存時にカチャっと確認音がしてたんですが、これもON/OFFできるようにと要望があったので対応しました。

 

ともあれ同好の士のお役に立てば幸いです。

ブログでお知らせするのが遅くなりましたが、iOSアプリの第二弾、「おやゆびでお(英名:ThumbVideo)」がリリースされました。

以前からTwitterなどでは「動画関係である」ことを仄めかしていましたが、しかしてその実体は?

片手操作にこだわった動画再生アプリです。モバイルデバイスであるiPhone/iPod touchは片手で扱うことが多いですよね?例えば電車で片手はつり革につかまって、とか。またiPadもベッドやソファで寝モバする時に、自分のお腹の上に置いて片手で保持しつつ、もう片方の手はポテチつまんでる、とか。そうした片手持ち状態で動画を視聴するにあたって、画面幅一杯に水平表示されるスライダーは扱いやすいとは言えません。この不便さを解消するUIを備えた動画プレーヤーが「おやゆびでお」です。

具体的には、

  1. 画面上の好きな場所で左右フリックすることで指定秒数ジャンプします
  2. タイムスライダーは画面の左右端に垂直に表示されます
  3. 画面の好きな場所をダブルタップすると再生/一時停止ができます

どれも本体を横にして保持した状態でその手の親指だけで操作ができます。だから「おやゆびでお」なワケです。

さらに次バージョンでは、

  1. 画面上の好きな場所でグルグル円を描くと早送り、巻き戻しができる

というジョグダイヤル的な機能が追加されます(そろそろ審査出します)。フリックだと細かすぎるけどスライダーだと荒すぎる、という間のニーズを狙った機能です。実際にはMPEG4なのでビデオデッキについてたような本当の意味でのジョグダイヤル的なコマ単位操作は無理だし、ストリーミング再生の場合も考慮してリアルタイムでダイヤルの動きに追従して映像が移動するような仕様にはしませんでした。長押しするとカウンターが表示され、一周回す毎に“溜め”カウントされ指を離すと一気に移動する、という感じです。回す半径に応じて小さいと1分、大きく回すと5分単位で溜めが増減します。

 

電子書籍ビューワーは機能はどれも似たり寄ったりながら操作性で差別化されているのに対し、、動画プレーヤーに関しては実際の再生中の部分は標準コンポーネントを使ったものばかり。そこに一石を投じられればと思い作成しました。電子書籍同様に自炊コンテンツを用意するようなマニアなユーザでないと利用場面もないかと思いますが、逆にだからこそこだわったUIにしたいなと。このブログを購読してくださってりような方なら共感してくださる方、色々こだわりを持ってる方も多いんじゃないでしょうか?是非ご要望、アイデアなどお寄せいただければと思います。

 

画面写真も含めアプリ詳細ページはこちら

AppStoreの製品ページは下のバナーをクリックして下さい。

おやゆびでお (ThumbVideo) - 道具眼 (do-gugan)

 

 

P.S.

第一弾「AccentViewer」は諸般の事情でなかったことになりました。ご購入下さった方にはご迷惑をおかけして申し訳ありませんでしたm(..)m。

最初にdefault languageの設定を間違え、Appleに修正依頼をするも梨の礫。結局半年分のライセンスを諦めて別アカウントを取り直してみるも契約情報が既に存在するというエラーが出て有料アプリ設定ができず、これまたサポートに出して返事がない。結局日本のサポートに電話したところ、iTunes Connect設定は日本の部署では触れないが、要求は翻訳して本国に伝えるというのでまたまた待つことしばし。なんだかんだで二ヶ月ほど遅れてしまいましたが先ほどようやく公開にこぎつけました。

一本目はAccentViewerという文字通り日本語のアクセントを調べるアプリ。Twitterでとある現役の声優さんから頼まれて作ってみました。元々大辞林には見出し語の脇に小さくアクセント位置を示す数字が記載されてるんですが、これを視覚的に見やすい形で変換して表示するものです。Yahoo!辞書が大辞林のデータでひけるのでそれを利用してます。声優とかアナウンサーとか特定業種の人や日本語を学んでいる外国人の人などニッチ向けなんであんまり売り上げは期待してないです。むしろ知ってる声優さんがブログやTwitterで触れたりしてくれたら密かにニヤニヤして満足って感じ(笑)。

AccentViewer - 道具眼 (do-gugan)

 

また道具眼謹製iOSアプリの専用サイトを開設しました。

http://do-gugan.com/iosapps/

またTwitterアカウントも専用のものを作りました。アプリ情報だけチェックしたいという方はこちらをフォローしていただくと良いかと思います。

http://twitter.com/do_gugan_apps

 

第二弾はもう少し一般向け(でもないか?)な動画プレーヤーアプリになると思います。一応完成してるので後は紹介文や画面写真などを用意してなるべく間を置かず公開したいと思います。

どうぞよろしくお願いします。

iOSプログラミングの話です。

アプリ内にWebブラウザコンポーネントであるUIWebViewを埋め込んで簡易的にWebページを扱えるようにする必要があったんですが、その表示倍率を直接制御するメソッドやプロパティがありませんでした。海外の掲示板も含めて結構質問は出てたんですが、有用な回答は得られず。

まず散見されたのはUIScrollViewの上にUIWebViewを置いて、UIScrollView側でピンチやスクロールを制御すればいいんじゃね?というアイデア。実際にやってみたんですが、以下の問題点がありました。

  • UIIWebViewの標準操作であるダブルタップでブロック最適化ズーム(?)動作が使えなくなる
  • ズームの品質が低い(文字がボケる)

そして何より、よくよくAPIガイドを読んだら「UIWebViewとUITableViewをUIScrollViewの上に置くのは予期せぬ動作を引き起こす可能性があるので推奨しない」と書いてあった。禁止ではないのでAppStoreの審査でリジェクトされるといほどではないかも知れないけれど、将来的なAPIの仕様変更でおかしなことにならないとも限らない。

で、悩んだ末に辿り着いた答えは、stringByEvaluatingJavaScriptFromStringメソッドを使ってWebコンテンツを書き換える方法。

まず単純な例。

[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat: @"window.scrollTo(0, 100);"]];

これを実行すると、Webコンテンツ上で「window.scrollTo(0,100);」というJavaScriptを実行したことになります。つまり画面が下に100ピクセル分スクロールします。

これを応用して、iOSのブラウザに対するズーム定義をmetaタグで追加してやる、ということをしてやるワケです。metaタグの仕様についてはAppleのドキュメントを参照するか、「meta viewport」などでググって下さい。

今回の閲覧対象ページはこのmetaタグ自体が存在しなかったので、タグ自体を作成してheadタグの中、titleタグの前に挿入しています。

[webView stringByEvaluatingJavaScriptFromString:@"var bodyNode = document.getElementsByTagName('head').item(0);"  
"var titleNode = document.getElementsByTagName('title').item(0);"
"var newNode = document.createElement('meta');"
"newNode.name = 'viewport';"
"newNode.content = 'width = 1024, initial-scale = 1.2, minimum-scale = 0.3, maximum-scale = 1.2';"
"bodyNode.insertBefore(newNode, titleNode);"];

@””の文字オブジェクトは;で切らない限り改行入れて列挙できるので、見やすさの為にそうしています。

1行目でbodyNodeという変数にheadタグの位置を取得。

2行目でtitleNodeという変数にtitleタグの位置を取得。

3行目でnewNodeという変数にmetaタグを作成。

4行目でそれに「name=’Viewport’」に相当する記述を追加。

5行目に更に「content = 'width = 1024, initial-scale = 1.2, minimum-scale = 0.3, maximum-scale = 1.2';" 」を追加。数値は適宜状況にあわせて調整を。ちなみに=の前後にスペースがないとダメとどっかで読んだのでそうしてます。

6行目で、bodyNode(=headタグ)内のtitleNode(=titleタグ)の直前にnewNode(=metaタグ)を挿入して完成です。

 

最初から「<meta name=’viewport’…>」が書かれているページに対してはcontentだけを書き換えるような処理をしないといけないので、汎用的なWebブラウザとして使うなら分岐処理も入ったもう少し複雑なJavaScriptが必要でしょうが、今回は対象サイトが固定のアプリなのでこれだけで済みました。

参考になれば幸いです。

3月からプログラミングを担当していたU’eyes Design製のiOS(iPhone)アプリ「独りブレスト!発想会議」がリリースされました。5月の某研究会でβ版を初お披露目した時に「(Apple絡みだけに)泳げる頃までには(ってこのネタわかるのオサーン)」なんて言ってましたがなんとか実現して良かったです。

ちなみに審査にかかった時間ですが、Appleからのメール着信時刻で言うと、

  • 11/06/20 17:05  Waiting for Review (審査待ち)
  • 11/06/22 22:05  In Review (審査中)
  • 11/06/23 12:44  Processing for App Store (AppStore向けに処理中)
  • 11/06/23 12:51  Ready for Sale (販売準備完了)

という感じで、三日程で通ってしまいました。しかも一発合格。初めてにしては上出来じゃないすか?

AppStoreの審査は、例えばテーブルビュ-(リスト画面)で下位階層に遷移してから上位階層に戻った時に、最初のフォーカスがじわっと消える効果が入ってないとリジェクトされる、とか細かいガイドライン準拠もチェックされると聞いていたので、あれこれ気をつけつつもかなり不安だったんですが、ホント一安心です。

■アプリ紹介

せっかくなので公開したアプリの紹介も。

端的にいうと、商品企画などで新商品、新サービスの企画アイデアを生み出す為の支援ツールで、新しい発想を採り入れたいテーマ(下の写真の例では「扇風機」)を設定すると、1枚目の写真のように発想のトリガとなるキーワードが付箋紙として表示されます(写真1枚目)。このキーワードが全部で117種類あって、スワイプで次々めくったり、下部の「101」と出ている吹き出しをドラッグして好きなものを出したり、あるいは左下のシャッフルボタンでランダムに表示したりできます。

テーマに対して何か閃きをくれそうなキーワードに出会ったらタップして赤丸をつけます(写真2枚目)。「“自然の美しさを持つ”扇風機ねぇ...そうか!例えば花びら型とか?」なんて閃いたらミニ付箋にメモを書き込んでおくこともできます。

このアプリでは赤丸をつけることを「クリップ」と呼んでいて、トップ画面から「クリップリスト」を開いてテーマを選択すると赤丸をつけた付箋とそのメモ内容を一覧したり、メモの編集を行ったりすることもできます(写真3枚目)。またこのデータはExcel等で読み込みやすいCSV(カンマ区切りテキスト)形式にして、メールで送信したり、iTunesから取り出したりできます。CSV形式でクリップボードにコピーすることもできるので、Evernote等に貼り付けても良し、です。

 

mzl.eirkhwti.320x480-75mzl.qqnnybor.320x480-75mzl.gmguttdg.320x480-75

 

で、ここで使われている117の発想刺激ワードというのが、単に思いつきで書き殴ったものではなく、U'eyes Designのリサーチに基づいたものであることがこのアプリの価値となっています。簡単にいうと、「あなたが最近感動したものは?」というアンケート調査をして、その回答(感動シチュエーション)を分析して抽出された、いわば感動エッセンスとでも言うべきワード集なんです。これをU’eyes DesignではXB法(クロスビーと発音)としてチームで発想会議をする手法として導入しセミナー等を行ってきました。これをスマートフォン向けアプリとしてスピンアウトし、一人でも実践できるようにしたのがこの「独りブレスト!発想会議」というワケです。「独りなのにブレスト?会議?」というツッコミ待ちのネーミングが秀逸ですよね(σ(^^)の発案ではないので自画自賛ではない)。

商品企画に携わっていない人でも、家族や友人へのプレゼント選びのような「感動」させたい発想の支援に幅広く利用できると思います。お値段230円!プライベートでもご利用いただきやすいお手頃価格となっております。是非お試しあれ!

2011.07.14追記:

2011.07.12頃、ついにビジネス有料ランキングで1位を獲りました!ありがとうございます。

あとYouTubeに解説動画がアップされました。動いている様子をご覧いただけます!

 

独りブレスト!発想会議 - U'eyes Design Inc.

以前のエントリから更に追加で買いまくったので紹介。今回ほぼボランティアなんだけど、投資だけはこんなにしてしまって大丈夫かw?

■木下誠「iOS開発におけるパターンによるオートマティズム」

今回一番役に立った本です。前回紹介した「たのしいCocoaプログラミング」の木下さんの本で、あれほど砕けたノリではないものの、iOS開発でお約束の定型ルーチンのお手本を示してくれています。特にデータの保存と読み込み周りはこの本のおかげで実装できたといっても過言はないです。


■Dave Mark「はじめてのiPhone3プログラミング」

独立の複数筋から激しくオススメされたので購入。Amazonのレビューで翻訳の質がイケてないという指摘があり、また世代的にも古いので最初は下の原著を買ったんですが、UITableView等の理解がおぼつかなくて少しでも負荷を下げようと結局購入。

誤訳も多いと指摘でしたが重版で直ってるっぽいからいいかと思って買ったのに、帰省中に豊橋で一番大きな書店の店頭在庫を買ったらまさかの初版で激しく落胆(帰宅してから気付いた)。これから買う人はお気を付け下さい。

というか改訂版出ないんですかねぇ。


■Dave mark「Beginning iPhone 4 Development: Exploring the iOS SDK」

上記の原著、改訂バージョンです。Kindle版を買いました。章毎にお題を掲げてサンプルアプリを実装していく形式で、なかなか実用的なお題で、ViewController周りなどは参考にしました。

(洋書では普通かも知れませんが)この人もノリは軽めです。


■安倍吉俊、カワサキタカシ「サルにもできる iPhone 同人誌の創り方」

画像ファイルを差し替えるだけで電子書籍アプリを作れるというウリの本です。今回作ったアプリは書籍ではないですがスワイプでページをめくるという部分は同じだったので、こちらの本のコードを大いに参考にさせていただきました。というかこのソースをベースに機能拡張をしていったので、完成形は似ても似つかないですが、ViewControllerのクラス名がいまだにsABViewerだったりしますw。本当にありがとうございました。

半分は安倍さんのイラスト集なのでファンでないと割高感あるかも(笑)。あと技術サイドの著者であるカワサキさんは掲示板も開設しておられるようです。ユーザ登録まではしましたが結局まだ書き込みはしてませんが。


■森巧尚「よくわかるiPhoneアプリ開発の教科書」

カラーで見やすいレイアウトと丁寧なコード解説ですごくとっつきやすい本でした。こちらもテーブル表示の章はずっとにらめっこして大いに助けになりました。

初めて読む入門書としてはオススメの一冊です。


■畑 圭輔「iOS4プログラミングブック」

こちらも推薦を受けて買いました。Ratinaディスプレイ周りを参考にしました。逆に非RatinaなiPhone3GSなどで1ピクセル幅の線を描画してもアンチエイリアスがかかってボケて2ピクセルになってしまうのを回避する方法などをこれで勉強しました。iOSの表示倍率の考え方についてとても詳しく書かれているので、これから更に機種が増えて互換性をとるのがややこしいことになった時にとても重宝すると思います。


■國居貴浩「iOSデバッグ&最適化技法 for iPad/iPhone」

開発後期段階になって効率化やメモリリーク対応の勉強のために買いました。Xcodeの一部である解析ツールの使い方などについて紹介しています。

ただσ(^^)のメモリ管理に対する理解が浅いせいか、ちと物足りない印象でした。Provosioning周りの説明なんかもあるんですが、そういうのはいらないのでもっとタイトルの内容をつきつめて欲しかった気がします。「実践編」みたいな続編を期待。


■Alasdair Allan「Learning iPhone Programming」

ProvisioningやAppStore申請周りについて詳しく知りたいなぁと思って物色していたところ、こちらが章を割いて解説してるっぽかったので買いました。オライリーですが日本語はまだ出てないっぽいです。Kindle版で買いました。

実際結構参考になりましたが、後でAppleが日本語PDFで結構詳しいドキュメントを配布しているのに気付き、もしかすると最初からそれだけで済んだかもという気もしています。これからの人はまず先にそちらを熟読してみて下さい。

全体としては普通にプログラミングの本ですが、目的の章以外は読んでません。その意味でもちょっと割高感。まぁ元の値段自体が安いからいいんですけど。

■高山恭介「iPhoneSDK開発のレシピ」

よくある、「○○をしたい」的な小さなテクニックがたくさん詰まった系の本です。UIAlertViewの中に入力欄を持たせたものが標準でなかったので、これを参考に実装しました(結局使わなかったけど)。あとメールにデータを添付して送信するという部分も参考にしたかな。ヒット率(あー、それしたいわと思う率)は結構高いレシピ本だと思います。


■D・H・スタインバーグ「iPadプログラミング (Smart Mobile Developer)」

これはつい最近の購入で、今回のアプリには直接役だってはないですが、iPad(iOS3.2)から実装されたジェスチャー認識機構(GestureRecognizer)についての詳しい説明が参考になりました。オリジナルのジェスチャーコマンドを実装する方法についても紹介されています。また、UIPopoverViewなどiPad独自のGUIパーツはiPhone系の本だとあまり触れられていないので、iPad専用アプリを作るのには重宝します。

GestureRecognizerはもう少し早く知っていれば、今回のアプリにも積極的に活用できたのになぁという印象です。今回のアプリではデバッグ段階で複数のボタンを同時にタップした時に両方反応してしまって思わぬ動作を引き起こす、という現象の抑止にかなり時間を割きました。たぶん、GestureRecognizerを使ってタップ判定を一元化しておけば簡単に抑制できたんじゃないかと予測。


■細谷日出海「iPhoneデジカメプログラミング」

これに至ってはまだ昨日買ったばかりで読んですらいませんが、バーコード読み取りとAmazonから商品情報をひっぱってくる辺りのサンプルが扱われていたので、今やりたいと思ってるアイデアに直接役立つだろうと思って押さえてみました。

バーコードに関しては標準APIではないですが簡単に利用できる外部ライブラリがあるみたいです。またAmazonからの商品情報取得は、Mac用に考えてるアプリで応用できるんじゃないかと。読むのが楽しみです。


 

とまぁ、買いも買ったり、前回分も含めればン万円ですね。申請が済んだ某アプリに対する報酬額が未だに通知されないのですが、元が取れなかったらどうしよう…。まぁ今後の為の投資だと思えばいいんですけどね。こういうのを全部自腹で買わなければならないのは自営業の辛いところです。

ですがまぁ、(震災で大変だったことを別にすれば)総じて楽しい三ヶ月でした。

3月からずっとプログラミングを担当していたiOS向けアプリが本日ようやくAppStoreに申請完了しました。Xcode、Objective-Cはもとより、ポインタとかオブジェクト指向プログラミング自体が初めてで本当につまづきまくりでしたが、ホッと一息です。まぁ、まだ審査という大きな壁があるわけですが、とりあえず時間は少し余裕ができるのでこちらのブログもぼちぼち再開していきたいと。

さてまずは表題。PHP、VB.NETあたりはちょいちょいやってきた(だがOOP的なことはほとんどしたことがない)視点から。慣れてしまった今とはってはそれなりによくできてると思うし、何故当初そんなにつまづいたかも徐々に忘れつつあるのですが、なんとか思い出せる範囲で書き留めておこうと思います。同じようなところでつまづいてる人の参考になれば。あと今回教えてもらった人にも「何がわからんのかわからん」と言われたので、そんな指導する側の人にも初学者の陥りがちな(?)勘違いを知らしめる意味で、恥を晒しておきます。

・宣言ファイル.hと実装ファイル.m

初心者はまずここから躓きますw。新しいクラスhogeを作ると、hoge.h、hoge.m(そしてViewControllerの場合はさらに.xibも)というファイルができます。VB脳からするとなんぞこれ?ですよね。実際のところ宣言と実装という言葉でほとんど説明できてしまってるんですが、最初はとにかく情報量が多すぎるのでこれだけでもビビります。VB的に実際のコードを書くのが実装ファイル(.m)ですね。じゃぁ.hは何かというと、そのオブジェクトが内包しているプロパティオブジェクトやメソッドの一覧が記された設計仕様書という感じ。他のクラスから利用する場合にこの.hファイルをimportしといてやると、そのクラスがもっていないメソッドを呼ぼうとした時にXcodeがそいつはそんなメソッド知らんってよ?と警告してくれます。まぁ、実際には.m側を精査すれば同じ内容は得られるんでしょうし、むしろ.mではちゃんと実装してるのに.hに書いてないからエラーになるなんて本末転倒なこともあったりするんですが、作業面でもまず.hに「こんなメソッド作るぞ-」とかToDo的に書いておけば、未実装の分はやはり警告が出るので便利っちゃ便利です。

・Interface Builder

これも慣れてしまうとどうってことないんですが、Objective-C自体がよくわかってない状態ではハマりました。Interface Builder(以下IB)で配置したボタンなどのオブジェクトを、そっくりコードの上でも宣言して、それを紐づけてやらないといけない、というのはVBにはなかったので。しかもIBAction(GUI部品から操作イベントを受け取るメソッド)とIBOutlet(コードから部品に表示を反映させる先)の双方向を別々にとか。でその方法がCtrl+ドラッグだったりと、あんまし直感的じゃなかったり。なんでもインスペクタからするVB的感覚とだいぶ違いますね。勢い解説書でもひたすら手順を説明するに留まって、読んでる方はすごく「やらされ感」が募ります。D&D操作って静止画のみの書籍での解説とは相性悪いのもあるんでしょうかね。

ただ慣れたせいかもですが、途中で導入したXcode4になってから随分やりやすくなった気がします。前バージョンだとIBは独立アプリという感じで、コードを保存しないでウインドウだけ移っても反映されてない、とか色々不便でしたし。ちょっといじってみようという人には有料になっちゃいますが、これから入門するならXcode4オススメです(一気にDeveloper Programにお布施しちゃうぞー、って人はタダです)。

個人的理解度がいまだにあやしいのはMainWindows.xibの扱いですね。まぁ、各種テンプレートを使ってプロジェクトを作った場合はほとんど触ることなさそうですが。

・delegate

これは悩みました。ググればなんなのかはいくらでも記述があるんですが、どう嬉しいのか、どういう場面で使うべきかがいまいちピンとこない。当初、親ビューなどスコープの届かない別オブジェクト(例えば大元のAppDelegate.m)の中のプロパティに上手くアクセスすることができず、仕方ないのでメソッド自体をその別オブジェクト側に移してそこで処理する為のものだと思って利用してました。だって一番最初のクラスの名前についてるしw。グローバル変数的なプロパティとそれにアクセスするメソッドを全部集めるべきか、とかw。

だが先輩プログラマ(同級生だけど)にそうではないと教わりました(hogeAppDelegate内のプロパティにアクセスする簡単な方法も教わった)。標準のクラスとはちょっとだけ違う振る舞いをするオブジェクトが欲しい時に、次々にカスタムオブジェクトを作っていくと大変(.h/.mペアがどんどん増える)なので、それをまとめて1つの.h/.mで処理するって感じですね。特にUIButton等のGUIパーツをIB上で配置すると本来は.hや.mはいらない訳ですが、そこに1つだけ特殊なことするメソッドが欲しい、なんて時に、そのボタンのdelegate(代行)先を親ビューであるViewController.mにして、そこにメソッドを書く、なんてことをします。うん、今ならこれがないと大変だということがわかる。特にUITableViewはOS側から呼ばれるイベントハンドラが多い(総行数の問い合わせとか)ので、それを実際のデータをもってるオブジェクトに“転送”したりするのに使いまくりでした。うん、イベントハンドラの転送、と考えるとしっくり来る。

・ポインタ

十数年間もσ(^^)が各プラットフォームでネイティブアプリを書く障壁となってきたポインタは、Objective-Cでは思ってたほど意識する必要なかったみたいです。宣言する時に、オブジェクトかどうか見極めて*をつけるかどうか判断する位。INTやBOOLでは不要だけど、文字列(NSString)はオブジェクトだからつけないとダメとか。プロパティやメソッドの引数を宣言するところ以外では*つけなくてもいいので、普段はあんまり意識しなかったです。

ただ高速列挙という、ある配列内のオブジェクトを順に取り出して順に処理していく方法の中で、一次変数オブジェクト作ってそれを取り出して変更を加えた後、元変数に書き戻さないといけないと思ってましたが、実際には取り出してなくてポインタをコピーしてただけなので書き戻し操作は不要だった、なんてことがありしました。

あと開発後半でリーク対策をしようという段になって、ちゃんと理解してないとダメだなと思いました。変数の感覚でポンポン“代入”をしてると、Leakテストした時にビックリしますw。

でもまぁとりあえず始めるにあたっては他のC系言語ほど怖がらなくてもヨサゲ、ってことだけは言えます(って他のC系言語実際に挑戦すらしてないけど)。

・@propertyと@synthesize

この辺も訳わからないウチは、なんで同じ様な宣言をあちこちで何度もやらされるんだろう?と混乱しますね。.hファイルの中でプロパティを宣言した上で、同じファイルのすぐ下で@propertyで繰り返し宣言をし、さらに.mで@synthesizeですよ。これらは主にクラス外からプロパティにアクセスする時に必要なもので、@propertyはそのヘッダーファイルをimportした他クラスに対して、自分はこんな“プロパティ”を外部に公開してるよー、と知らしめる為で、クラス内部でしかアクセスしないならなくてもいい。また@synthesizeは.mファイル側で実際にset/getするメソッドを自動で“シンセサイズ”(生成)するためのもの。@synthesize hoge;とするだけなので超簡単ですが、これを使わずに自前でメソッドを作ってもいいので、やっぱりプログラマが任意で書かなきゃダメって訳です。似てるんだけどそれぞれ役割が違う。

 

とまぁこの辺がちょっと壁だったような気がします。というかまだ間違ってるかも知れないので、そこは皆さん追々ちゃんと調べて勉強していって下さい(^^;)。とりあえずこんな感じで理解したら少し前に進めた気がする、ってことで。

iOSプログラミングに慣れてきて当然実機で動かしてみたくなります。早速有償のiOS Developer Programに登録申請してみました。

がこのフローがヒドい。友人からの事前情報で、Apple IDに日本語が含まれているとアクティベーションにコケて、メールで修正依頼をしたりして長いこと待たされることがわかってたので、色々ググってみました。要約すると、

  • Apple IDの登録情報に2バイト文字があるとアクティベーションに失敗する
  • 逆にすべて英語だと日本のApple Storeでの決済手続きがエラーになる

もうこれだけでもヒドい話です。どうしてこんな簡単な問題が何年も放置されてるんでしょうね?

なんとか問い合わせ手続きしなくて済むようにと、先人達の記録を参考に、開発専用の新規Apple IDを取得してすべて英語で記入するところから始めてみました。開発者申請のページから新規にApple IDを登録するとこから始める選択肢があるのでそれを使います。メール認証をして登録完了。続けて有償ライセンスの購入に進むと、カートにライセンスが入った状態で日本のApple Store画面にリダイレクトされます。そのまま決済に進むと、名前や住所を日本語で入れ直すよう促されます。これで無事決済は完了。午前零時前後に手続きしたところ、数時間後の翌朝6時半くらいにアクティベーションコードがメールで届きました。

が、結局お約束のエラー!

新しくApple IDとった意味なし。愚痴をたれつつも、エラー画面内の「Contact Us」というリンクから行ける問い合わせフォームで連絡。こちらからアクションを起こさない限り向こうはなにもしてくれないそうなので。で、最短で手続きが進む様に、あらかじめネットで調べて必要事項(Apple Storeの注文履歴画面から、

  1. 『ご請求、ご連絡先』
  2. 注文番号 (W+数字8桁)

をコピペ。またメールにあったEnrollment IDも添えて送信したのが朝9時。返事が来たのが午後2時過ぎ(日本語)。あろうことか、上記の情報を知らせろと書いてきています。だからコピペしたでしょ?とメールに添付されたフォーム記入文面を見る。なんと、

2バイト文字が全て抜け落ちてます。

コピペした「We are unable to activate」というエラーメッセージ、住所の中の部屋番号と番地と郵便番号、注文番号、Enrollment IDという英数字のみの意味不明な送信文です。おそらくエラーメッセージから問い合わせ内容を類推して返信してきてるんでしょう。

日本語入れると全部抜かれて送られるフォームなんてナナメ上過ぎ。

これまた知人から「Appleは開発者に優しくない会社」と聞いてましたが、確かにその通りかも。あるいは非1バイト文字圏軽視しすぎ。

 

結論としては、「一発申請は不可能。あれこれ悩むより余裕もって申請して、さっさとエラー出してContact Usから連絡。RegionにJapanを選択し、上記エラーメッセージさえ貼り付けておけば用件は通る。日本語は書いても無駄。詳細はその後のメールへの返信で記入」ってとこですかね。もしかするとContact Usフォームに請求、連絡先情報を英語表記にして貼ればいいのかも知れませんが、たぶんApple Storeの表示とマッチしないとNG食らう気がします。

■木下誠 「たのしいCocoaプログラミング」

iPhoneのSDKが一般公開された頃から、自分でアプリ作ってみたいと思ってMac miniまで買いそろえたりしていたものの、昔から「C」と名のつく言語(というかポインタ?)が苦手だし、オブジェクト指向も概念はわかるもののいまいちとっつきにくくて、長らく放置していました。

が、MacBook Airを買ったり、ちょっと仕事絡みで相談を受けたりを機にようやく重い腰をあげてみたのがこの年末年始。でもやっぱりObjective-CもXcodeも敷居が高くてTwitterでプログラマの友人達に助言を請うたりしつつ、1月は本当に頭を悩ませていました。本を何冊も買っては、説明がスッキリしなかったりサンプルのビルドが通らなかったりで投げ出したりの繰り返し。

そんな中で急速にObjective-CやXcodeに関する理解が進んだ感があったのが、木下誠氏の「たのしいCocoaプログラミング」でした。この本は正確にはiOS開発について触れた書籍ではなく、MacOSXに関するものです。ただObjective-CやXcodeに関しては共通事項もおおいということで、随分前にTiger版を買ってあったのを手にとってパラパラと読み返してみたところ、その前に何冊か読んでいてイマイチすっきりしてなかったところが急激に納得いくようになりました。Xcode 2.xと現行の3.xでは随分作法もかわっているということなので改訂されたLeopard版を速攻で注文。

以前友人向けにVB.NETで作った簡単なWindowsアプリをOSXにさっくり移植できてしまいました。最初からこれ一冊で足りたかどうかは定かではありませんが、断片的だった知識をこの本が再構成してくれた感は高いです。特に他の書籍ではXcodeやInterface Builder上での操作が手順でしか示されていなかったのに対し、この本ではその意味についても触れてくれていたのが大きいような気がします。.hファイルと.mファイルがペアで1つのクラスを表している、といった極基本的な事も、この本でようやく気付いたというレベル(他の本は.hにこう書け、.mにこう書け、ほら動いたでしょ、というノリ)。Objective-Cについても、例えばimport文で宣言ファイルを指定するのに、<>で括るのと””で括る意味の違いまで触れていたのはこの本が初めてでした。そういうレベルの入門者には、(iOS開発を目的とした場合やや遠回りに思えるかも知れませんが)一読の価値があると思います。

■所友太「iPhoneプログラミング UIKit詳細リファレンス」

続けて重宝したのがこちら。「たのしい~」でObjective-CとXcodeの雰囲気がつかめたので、あとはiOS特有の部分を差分的に読めればいいやってことで。iOS 3.x世代の解説本ですが、入門レベルの要素は網羅されているので支障はない気がします。まぁ、もしかするとiOS4.xなら同じことをより簡単にできるようになったりはしてるかも知れませんが。

この本を参考にして、相談を受けた極簡単なアプリのデモ版を完成させることができました。データ保存もネット通信もしないごくごくプリミティブなアプリですが、何冊も投げてきたσ(^^)としては、格段の進歩という気がしています。詳しい人にソースを見せると、とてもオブジェクト指向的とは言えないような作りかも知れませんが、それは今までのVB.NETで作ってきたツールも同じだしw。

「あとは本でもネットでも公式リファレンスでも見ながら猿真似していけば(σ(^^)個人が作る規模のアプリなら)なんとかなるんじゃないか?」という気がVB並にしてきたのは(錯覚だったとしても)大きい。あとはそのドキュメントがVBに比べるとやはり少ないのが難点ですね。

■てことで逆引き本2冊

というワケで、やりたいことがサクっと調べられるよう、いわゆる逆引き本をObjective-CとiOSで1冊ずつ買って見ました。これらはまだ活用には至ってないので、(「原則として自分で使ってみたものをレビューする」という本ブログの主旨には反しますが)紹介まで。

1冊目はObjective-Cという言語に関するもの。「文字列を文字列で分割する」とかそういうレベルの調べもの用。おそらく現時点で日本語で読める逆引き本としては唯一なんじゃないかと。先日立ち寄った書店でも2010年のプログラミング関連書籍ランキングで3位になってました。

もう1冊はiOS特化の方で、「アプリ内から写真撮影をするには」とかいったAPIレベルのノウハウが数多く収録されているようです。世代的にもiOS4.x対応なので心強いです。

 

当面この後マスターしたいのはテーブルビュー(リスト画面)とCoreData(データの保存関係)ですね(フルグラフィックなアプリを作ることはないだろうし)。それを習得できれば簡単な実用アプリは書けるようになる気がします。なんか手頃なお題を物色中。

世間は三連休だったようですが、σ(^^)的には発生イベント皆無だったので、家に籠もって手持ちソフトをこないだ習得した方法でiOS対応MP4にしこしことエンコードしていました。

で、さすがにDOS窓でコマンドを手打ちするのに嫌気がさし、フロントエンドGUIツールdgMP4Muxerを作成、公開してみました。

画面写真

例によって我が家のローカルルールに特化した部分があるのであまり汎用性はないかも知れませんが、逆にそのルール(素材ファイルの命名規則)に従っておけば、簡単確実にiOS(iPhoneやiPad)で認識する音声多重、チャプター入りMP4ファイルが作れます。

mp4boxやmp4chapsに渡すオプションを自由に設定できるようにしてあるので、細かく指定した人にはyambより便利なんじゃないかと思います。

ただ、字幕系についてはほとんど考慮してません。現状でも適当なオプションを書いてやれば使えるかも知れませんが、それでもダメな時は要望として挙げてもらえれば対応してみます。

前エントリでも触れた、MP4にタグ情報をAtomicPersleyを使って一括で書き込むGUIフロントエンドツールを公開してみました。我が家ルールでの運用を前提にしてあまり汎用性がない作りなので、どれくらい役に立つかわかりませんが、、、

現状、日本で役立たずなiTunes/iPhone/iPadの「テレビ番組」画面を自炊動画で活用した方はお試し下さい。

”画面写真”

 

かんたんな利用イメージはこちらのマニュアルにて。

Visual Studio 2008で作成したセットアップで新バージョンを上書きした場合に、my.settingsに保存された設定が初期化されてしまう件に対処する方法を調べました。

ここの掲示板のスレッド(英語)にナイスな情報がありまして、上書きインストールした場合、設定はAppData下に新規に作成され、旧バージョンのものが上書きされるワケではないと。で、それを引き継ぐメソッドがMy.Settings.Upgrade()のようです。メソッドについてはこちらが詳しいです。。

ただ毎回これを実行してしまうのも無駄だし一抹の不安もあるので、上記スレッドに書いてあるコード、

If My.Settings.UpdateRequired Then
           My.Settings.Upgrade()
           My.Settings.UpdateRequired = False
           My.Settings.Save()
End If

では、

  • my.settingsの中に「UpdateRequred」というBoolean値を作っておきTrueにしておく
  • まっさらな設定では当然Trueなのでこのルーチンが実行される
  • Upgradeメソッドを実行し、上記Boolean値をFalseに変更した後保存
  • 2回目移行は実行されない

という仕組みです。

ナイスです!

最近、テレビ録画ファイルの保存形式をDivXからH.264/MP4に移行中なのですが、iTunesやiPhoneで見るのに、いくつかのメタデータを付与しておいた方が便利だということがわかりました。

例えば、iTunesで動画ファイルのプロパティを表示した際の、

  • 「オプション」タブの「メディアの種類」を「テレビ番組」に
  • 「情報」タブの「名前」フィールドにサブタイトル
  • 「情報」タブの「トラック番号」フィールドに話数
  • 「ビデオ」タブの「番組」フィールドに番組名

などを入れておくと、プレイリストを作らなくても番組毎にまとめて表示されたりして見た目ナイスです。iPhone/iPod touch上での見え方はこちらが参考になります。

ただちまちまiTunes上でファイル毎に設定するのは億劫なので、ツールを自作してみました。

といっても、AtomicParsleyというコマンドラインツールのフロントエンドを作っただけなんですが。

dgMP4Tagger

上記公式ページに既にいくつかのGUIフロントエンドがリンクされてたんですが、Java実装だったり一括処理できなそうだったりリンク切れだったり散々だったので。

また、我が家のライブラリでは

01「ユウシャ世界に起つ!」.mp4

のように話数とサブタイトルを含んだファイル名書式に統一してあるので、ここからデータを拾って半自動でメタデータを生成してくれると便利だろうと。

そういう意味ではまり汎用性はないので、公開は要望があればって感じで。

以下、覚え書き。

  • iPhone上ではエピソード番号ではなくトラック番号が表示される(エピソード番号だけだと「不明」となる)。
  • AtomicParsley 0.9.0で上書きオプションを使うとファイルが壊れる。バージョンアップ経過を見守る。

Visual Studio 2008で、とあるC#のプロジェクトをビルドしたかったので、(普段Visual Basicしか使ってない環境に)追加しようとするも、setupがエラー吐いて終了してしまう。最初、Windows7の問題かと思ったんですが、Vista機でも発生。

DVD上のsetup.exeではなく「プログラムと機能」から「アンインストールと変更」でやったら一応、追加インストールを選択する画面までは進んだんですが、今度は「更新」ボタンを押して実行しようとすると「選択されたドライブは無効です。インストールパスの設定をしてください」とか言われる(;´Д`)。しかも、パスの設定欄はグレーアウトしていて触れない。中身は実際にVSが入っているパスを挿しています。

で、こちらのブログに行き当たり、SP1が悪いとのことだったので、一旦Visual Studio 2008 SP1をアンインストールすることで解決!

ちなみに、SP1は「プログラムと機能」の標準のリストには出てこないで、更新プログラムの方から探さないといけないというのに気付くのにしばらくかかったのは内緒。

C#インストール後、再度SP1を入れ直して完了。やれやれ…

なお、SP1のISOをWindows7でマウントさせるのには、なにやらエラーの出るdaemon toolsではなく、Virtual Clone Driveを利用しました。

ブログなんかでよく使うアニメキャラの名前を辞書登録するのってちょっと面倒ですよね。有名作品なら誰かが辞書ファイルを配布してくれたりもするかもですが、最近はあまり見かけません。

で、ふと気付いたのは、「Wikipediaの番組エントリの登場人物一覧の見出しで

姓 名(姓読み 名読み)

となっている部分を利用すればよくね?」ってこと。

で、簡単なスクリプトを作ってみました。名付けてWikipedia2Dic。あくまで上記の書式でレイアウトされていること前提の超手抜き処理ですが…

今のところ、自分が使うATOK用のフォーマットのみ出力できますが、単純な、

よみ(タブ)漢字表記(タブ)品詞

形式なので、MS-IMEなどで流用するのも簡単なんじゃないかと。要望が多ければ対応するかも知れません。要望があったので対応してみました。IMEのバージョンでフォーマットが違う可能性もありますが、とりあえずMS-IME 2007の辞書ツールでインポートできることを確認しました。

あと、一部エントリでは余計なタグが混入することがわかり、タグを一括除去するように改良しました。

Visual Studio 2008 SP1用の更新KB971092が何度適用しても、成功したと表示するくせに繰り返しWindows Updateに表示されてしまう時の対処法ですが、こちらにある手順を参考にもう少し楽な方法をまとめてみました。Microsoftからの対応を待てない方は自己責任で。

  1. {Program Files}\Microsoft Visual Studio 9.0\Common7\Toolsにあるvsvars32.batのプロパティで、usersに書き込み権を与える。
  2. 単体インストーラーをダウンロードする。
  3. 起動せずに、展開する(Lhplusとか7zとか.exeアーカイブを解凍できるツールなどで)
  4. 展開した中のVS90SP1-KB971092-x86.mspを実行してインストールを実行する
  5. 1.の変更を元通りにする

これでウチではWindows Updateにも出なくなりました。

ご参考までに。

もしかしたら、1.のあとに通常のWindows Updateからの適用でもいけたりするんですかね?

Eye-Fi連携用超ニッチユーティリティ「静止画眼」、せこせこと改良しておりますw。

本日公開の1.2では、全画面表示に対応しました。これで、撮った写真がその場で(本当の意味で)PCモニタいっぱいに映し出されることになります。

アーカイブ

ウェブページ



Powered by Movable Type 4.25