原因はmakeのバージョンが古い(3.8)ことでした。
makeを3.8.1にするとちゃんとmakeできます。
主にプログラミングについてのメモ。
MFCのSDIアプリケーションでメニューを消したい場合は、MainFrameクラスのPreCreateWindowでCREATESTRUCTのHMENUハンドラを解放してあげればよい。でもこれだと再度メニューを表示させる場合はどうしたらいいのやら。
http://support.microsoft.com/kb/131368/ja
SDIのフォームを複数切り替えたいってときは、リソースにFormViewを追加して、そこからCFormViewベースのクラスを作成する。MFCのCOLLECTサンプルが分かりやすい。
http://msdn.microsoft.com/ja-jp/library/fw2702d6(VS.80).aspx
ドキュメントサポートのSDIアプリケーションの場合、タイトルにドキュメント名が追加されてしまう(Untitleとか)。タイトルバーに任意の文字列を表示させるには、MainFrameにてOnUpdateFrameTitleをオーバーライドし、その中でSetWindowTitleを使うとよい。
MainFrameのインスタンスをMainFrame外で使用(取得)するには
CMainFrame *pMainFrame = (CMainFrame*)AfxGetMainWnd();
ラベル: mfc, visualstudio
perlのcgiがInternal server errorで全く動かない。errorlogを見てみると
Premature end of script headers: ~
(2) No such file or directory: exec of ' ~
と出力されている。
これはなんぞと調べてみて分かったことは、なにやらFTPで転送した際にcgiの改行コードがLFではなくCR+LFになっていたため、ファイル先頭のperlパスにいらない文字(この場合CR)がくっついて、perlがみつからないというエラーだった。
FTPクライアントはFFFTPを使っていて、特に文字コードうんぬんの設定はない。サーバに合わせて改行コードを変更してくれるはずなんだけど、上手く動いていないみたい。ぶっちゃけバイナリモードで改行コードLFのcgiを転送すれば動作するんだろうけど、いちいちCR+LFをLFにするのも面倒です。
ということでサーバ側に何か設定がないか調べてみた。centosのftpはvsftpdのようなので、/etc/vsftpd/vsftpd.confを開いてみる。ありましたasciiなんちゃらの設定。コメントアウトされていたのでコメントを外し、YESに設定を変更し、サーバを再起動。めでたくLFに変更されて転送されました。
vixy converterをデバッグするために環境を整えてみる。
(1)eclipseをダウンロード。適当な場所に解凍。
(2)mingwリソースから、gccやgdb、makeなどを取得。
(3)eclipseを起動しSoftwareUpdatesからC/C++ Development Platformを選択。インストール。
てな感じで必要なものは揃うが、試しにデバッグさせようとしてハマる。
新規プロジェクト作成でC/C++ Projectを選択。サンプルのmain()をMakeしてexeを作成し、デバッグしようとしてもつまずく。 原因はプロジェクトのProperties-C/C++Build-SettingでBinary Parsersの設定を行わなければならないよう。GNU Elf ParserとCygwin PE ParserのチェックボックスをONにして再度デバッグさせたら正常に動作した。これが分かるまでに1時間。。。
SequenceGrabberから脱線してMac版 vixy converter の改造中。今、ローカルのFLVをトランスコードできるようにしています。ローカルにあるFLVのパスを取得する方法として、ベタですけどウインドウにドラッグ&ドロップ(以下、D&D)で取得するのが分かりやすいんじゃないかなーと実装中。とりあえず、分かったことをまとめてみる。
----
NSTextFieldは元々D&Dが可能なんだね。。。でもやりたいのはウインドウのどこでもD&Dだから。
----
D&DをNSViewやNSWindowに実装するにはNSDraggingDestinationプロトコルのメソッドを実装する必要がある。Cocoaアプリケーションプロジェクトで作成されるNSWindowにこのプロトコルを実装するためには、
(1) WindowDDHandlerというクラス名(例だよ)で、NSWindowを継承したクラスを作成。
(2) InterfaceBuilder(以下IB)を開きWindowDDHandler.hをD&Dするとカスタムクラスで選択できるようになるので、デフォルトウインドウのカスタムクラスに割り当てる。
(3) WindowDDHandlerのawakeFromNib:でD&Dを受け付けるタイプの指定registerForDraggedTypes:を行う。FinderからファイルのD&Dを受け付けたい場合はNSFilenamesPboardTypeを指定。ちなみにinitでregisterForDraggedTypes:を読んでもダメ。
(4) NSDraggingDestinationプロトコルのメソッドをオーバーライドする。 動作確認ならNSLog()だけでできるよね。
----
NSDraggingDestinationプロトコルで必要なメソッドは、draggingEntered:とperformDragOperation:。これだけでパスの取得は可能だった。draggingEntered:はウインドウにアイテムがドラッグされるとコールされ、performDragOperation:はドロップしたときコールされる。performDragOperation:の引数からNSPasteboardクラスが取得でき、そこにはNSFilenamesPboardTypeで指定した場合、ドラッグされたファイル名をNSArrayで取得することができる。
----
重要なのは:registerForDraggedTypesをコールして、D&Dを許可するファイルのタイプを指定しておくこと。というかD&Dを受け付けるということを伝えておくこと。
ラベル: cocoa, objective-c
FlashからCookieを弄るためにはjavascriptを介さなきゃだめ?ぽいので、javascriptで簡単にcookieマネージメント。
http://insin.woaf.net/code/javascript/cookiemanager.html
ラベル: javascript
大抵のサーバでPerlのパスは /usr/bin/perl か /usr/local/bin/perl に設定されているけど、windows上で開発してテストする場合、cgiの先頭にあるこのPerlパスをWindows上のパスに置き換えなければ動作しない。でもいちいち書き換えるのは面倒だし〜ということで、色々試してた。そしたらなんとも簡単、Cドライブ直下に /usr/bin/ もしくは /usr/local/bin/とディレクトリを掘って、binディレクトリにActivePerlのperl.exeだけコピーすればOK!
いやー恥ずかしながらしらなかった。
まずWhackedTVの初期化処理から、Sequence Grabber Componentの生成方法を理解。
WhackedTVのメインウインドウのdelegateはWhackedTVControllerクラスなので、アプリケーションを起動するとこのクラスのinitが最初に呼ばれ、起動が完了するとapplicationDidFinishLaunching:が呼ばれる。
initで行っている処理は、
・SeqGrabクラスの生成と初期化
・レコーディング動作中の動作確認用タイマーのタイマー時間設定
・通知の設定
・プレビューのクオリティーとフレームレートの設定
で、もちろん重要なのはSeqGrabクラスの生成と初期化。初期化で使用しているAPIは
・OpenADefaultComponent
・SGInitialize
の2つ。
OpenADefaultComponentはComponent ManagerのAPIで、ComponentInstanceで定義される様々なリソースが取得できる(んだよね?)。Sequence Grabber Componentを取得するには、SeqGrabComponentTypeを指定してやれば良い。SGInitializeはその名の通り、取得したSequence Grabber Componentの初期化を行う。
ラベル: objective-c, sequence grabber
WhackedTVのプロジェクトにはCocoaでSequence Grabberを使うためのWrapperクラスが入ってる。ディレクトリSeqGrab内のクラスがそれだ。Wrapperクラスを自分なりに解釈すると、
・SeqGrabクラス
Sequence Grabber ComponentのCocoa Wrapper。プレビューやレコーディングの設定など、キャプチャのメイン機能を担う。
・SGChanクラス
Sequence Grabber Channel ComponentのCocoa Wrapperで、以下のSGVideo、SGAudioクラスのスーパークラス。
・SGVideoクラス
SGChanクラスを継承し、Channel Componentの中でVideoMediaTypeなChannelを制御するクラス。
・SGAudioクラス
SGChanクラスを継承し、Channel Componentの中でSGAudioMediaTypeなChannelを制御するクラス。
・ SampleCIViewクラス
NSOpenGLViewを継承し、プレビュー描画を行うクラス。SGVideoで取得したイメージデータを渡すとウインドウに描画を行う。描画はOpenGLで行っている。
という感じ。
Cocoaアプリケーションでキャプチャソフトを作成する場合は、上記クラスをベースにし、適時にメソッドを追加するという流れになる。
ラベル: objective-c, sequence grabber
WhackedTVの機能について簡単にまとめると
・[add video track]で利用可能なビデオデバイスをキャプチャ要素に追加
・[add audio track]で利用可能なオーディオデバイスをキャプチャ要素に追加
・キャプチャ要素を追加するとテーブルに追加される
・テーブルにある[settings]でデバイスの設定ができる
・[record]で指定パスにQuicktime形式のムービーが書き出される
という感じ。さらっとソースと照らし合わせて動作確認してみると、[settings]で表示されるダイアログは、ビデオデバイスだと標準の機能として備わっているようだけど、オーディオデバイスではQuickTime7時点で提供されていないから、自分で実装するしかないみたい。事実、WhackedTVではSGAudioSettingsクラスでダイアログとかオーディオメーターを実装している。みるからに大変。あと大きく違うのはファイル書き出しをしているところ。demuxされた状態でメモリ上に展開する方法をしらべなきゃ。
ラベル: objective-c, sequence grabber
まずは資料集めから。参考となりそうなのは
Sequence Grabber Reference for QuickTime
と、
QuickTime Movie Creation Guide
あたり。
あと一番重要なのがAppleが提供してるサンプルコードで、WhackedTV。これからはこのサンプルコードを解析していくことから始める。
ラベル: objective-c, sequence grabber
Macでキャプチャソフトを作るのには、Sequence Grabber というコンポーネントを使用するらしい。Macでの開発全般に言えることだけど、参考となりそうな資料は全て英語。そしてリファレンスも不十分で、サンプルコードから動作を紐解かなければならないことが多い。覚え書きの意味も含め、Sequence Grabber の機能とかその辺を書いていこうと思う。
作成するキャプチャソフトは
デバイスが選択できて、映像と音を別々に、メモリ上に展開できること
を目的とします。
ラベル: objective-c, sequence grabber
windowsでは fsutil コマンドを使う。
Unixでは dd コマンドを使う。