アーカイブ

‘プログラム小技’ カテゴリーのアーカイブ

Zend_Formを使う時の注意

2009 年 10 月 5 日
コメントは受け付けていません。

Zend_Formはとても便利です。

フォームに関するルーチンワーク(入力フォーム作成、バリデータ定義、確認フォーム作成)を定義ファイル1つに置き換えることができます。

ところが、定義ファイルを少し更新すると、動作がおかしくなることがちょくちょくあります。

1つ目はsetElementDecoratorsとsetElementFiltersの使い方。

このメソッドを呼び出すと、個別のエレメントで指定していたデコレータとフィルターが消されます。

よって、下記のような書き方は間違っています。

[test]
form.elementFilters.trim = “StringTrim”
form.elements.name.options.filters.lower.filter = “StringToLower”

この場合、StringTrimだけがフィルタとして登録されるので、エレメントごとにデコレータやフィルタが違う場合、すべて個別に指定しましょう。

2つ目は、カスタムフィルタなどフィルタを定義し、そのフィルタコンストラクタにオプションを定義したい時の制限です。

[test]
form.elements.name.options.filters.myfilter.filter = “MyFilter”
form.elements.name.options.filters.myfilter.filter.options.param2 = “second option”
form.elements.name.options.filters.myfilter.filter.options.param1 = “first option”

カスタムフィルタの定義は上のような形で良いのですが、MyFilterに渡すコンストラクタオプションが、optionsで指定した順番に依存し、

名称は無視されます。したがって、上記の定義例ではMyFilter::__construct($param2, $param1)が呼ばれることになります。

Zend_Form_Elementクラス内の_loadFilterメソッドで、実際にフィルタをロードしているのですが、

インスタンス作成は下記のコードを使用しています。

if (empty($filter['options'])) {
  $instance = new $name;
} else {
  $r = new ReflectionClass($name);
  if ($r->hasMethod('__construct')) {
    $instance = $r->newInstanceArgs((array) $filter['options']);
  } else {
    $instance = $r->newInstance();
  }
}

このRefrectionClassのnewInstanceArgsメソッドは、引数の配列の順番が、コンストラクタの引数の順番に該当するようになっています。

せっかくRefrectionしているのだから、順番ではなくて引数名をハッシュで指定できれば良いのですが・・・残念。

したがって、filterのオプション定義の場合は、コンストラクタの引数の順番と同じ順序で定義しましょう。

以下の書き方の方が、理解しやすいです。

[test]
form.elements.name.options.filters.myfilter.filter = “MyFilter”
form.elements.name.options.filters.myfilter.filter.options.1 = “first option”
form.elements.name.options.filters.myfilter.filter.options.2 = “second option”

admin プログラム小技

ubuntu9.04+bluetoothでSkype(VAIO typeP&Let’sNote CF-W7)

2009 年 9 月 10 日
コメントは受け付けていません。

ubuntuは更新が激しいため、更新の度にAV関係が動かなくなります。

この方法がいつまで使えるか分かりませんので、ご注意を。
(使えなくなったら、またご報告します)

今までSkypeを使うには、pulseAudioを削除し、ALSAaudioを使うのが常識でした。

しかし、Skypeが2.1(beta)にバージョンアップし、pulseAudioが正しく使えるようになっています。

ここでは、pulseAudioでの実行方法を説明します。

VAIO type PとLet’s Note CF-W7で動作確認しました。

なお、Bluetoothヘッドセットには、Sony DRC-BT15を使いました。

1.pulseAudio関連パッケージのインストール

  • synapticパッケージマネージャを起動します。
  • 「設定」-「リポジトリ」メニューを選択し、ダイアログを表示します。
  • 「サードバーティのソフトウェア」タブを選択します。
  • [追加]ボタンを押し、次の文字を入力します。
deb http://ppa.launchpad.net/themuso/ppa/ubuntu jaunty main
  • もう1回[追加]ボタンを押し、次の文字を入力します。
deb-src http://ppa.launchpad.net/themuso/ppa/ubuntu jaunty main
  • 端末画面を開き、以下のコマンドを入力します。
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys B88A1AA8
  • Synapticのメイン画面の[再読込]ボタンを押します。
  • [検索]ボタンを押し、pulseと入力して検索します。
  • リストが表示されますので、下記のものをインストール指定してください。(既にインストールされている物については、そのままにしてください)
  1. gstreamer0.10-pulseaudio
  2. libasound2-plugins
  3. libgsm1
  4. libpulse-browse0
  5. libpulse-mainloop-glib0
  6. libpulse0
  7. libpulsecore9
  8. padevchooser
  9. paman
  10. paprefs
  11. pavucontrol
  12. pavumeter
  13. pulseaudio
  14. pulseaudio-esound-compat
  15. pulseaudio-module-bluetooth
  16. pulseaudio-module-gconf
  17. pulseaudio-module-hal
  18. pulseaudio-module-x11
  19. pulseaudio-module-zeroconf
  20. pulseaudio-utils
  • インストール指定が終わったら、[適用]ボタンを押して、インストールします。

2.bluemanのインストール

標準でインストールされているbluez-gnomeは大変使いにくいし、接続できないことが多いのですが、bluemanをインストールすると簡単に接続できて楽です。

  • Synapticパッケージマネージャを起動します。
  • pulseaudioでリポジトリを追加した方法と同じやり方で、以下の2つを追加します。
deb http://ppa.launchpad.net/blueman/blueman-dailies/ubuntu jaunty main
deb-src http://ppa.launchpad.net/blueman/blueman-dailies/ubuntu jaunty main
  • 端末を起動し、下記のコマンドを実行します。
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 951DC1E2
  • synapticのトップ画面から、[再読込]ボタンを押します。
  • [検索]ボタンを押し、bluemanと入力して検索します。
  • bluemanをインストール指定し、[適用]ボタンを押します。
  • このとき、「bluez-manを削除します。」と言う内容のメッセージが出るので、そのままOKします。
  • インストールが終わったら、念のためubuntuを再起動します。

「念のため再起動」というのは、ubuntuを使うときには重要です。

3.pulseAudioの設定(1)

  • 「システム」-「サウンド」メニューを選択します。
  • イベントの音、楽曲と動画、音声会議をすべてPulseAudioサウンド・サーバに変更します。
  • サウンドメニューを閉じます。

4.bluetoothヘッドセットとペアリングします。

  • ヘッドセットの電源をいれ、画面右上のbluetoothアイコンをクリックします。
  • 目的のヘッドセットが表示されたら、ペアリングし、信頼設定します。
  • 結合できたら、該当のヘッドセットアイコンを右クリックし、「ヘッドセットサービスを接続」をクリックします。
  • 「成功しました!」というメッセージがステータスウィンドウに表示されれば、完了です。

※音楽を聞くのであれば、「A2DPサービスを接続」を選択する方法もあります。

5.pulseAudioの設定(2)

  • 「アプリケーション」-「サウンドとビデオ」-「PulseAudioDeviceChooser」を選択します。
  • 画面右上にヘッドフォンジャックのようなアイコンが表示されますので、それをクリックします。
  • 「Manager」をクリックし、ダイアログを表示させます。
  • Devicesタブをクリックし、SinksやSourcesに接続したヘッドセットが追加されていることを確認します。
  • 画面右上のヘッドフォンジャックアイコンをクリックし、「Volume Control」をクリックします。
  • 「Output Devices」タブをクリックし、ヘッドセットの箇所の右端に「へ」が逆になったアイコンがありますので、クリックし、「default」にチェックをつけます。
  • 「Input Devices」タブをクリックし、ヘッドセットの箇所を同様に「default」にチェックをつけます。

あとは、SkypeのサイトからSkype2.1(beta)をダウンロードしてインストールするだけです。

これで、Skypeを起動すると、ほぼ何も設定せず、通話できます。

ちなみに、ubuntuの再起動の度にbluetoothヘッドセットへの「ヘッドセットサービスを接続」や、InputDevices,OutputDevicesへの「default」チェックは手動で行う必要があります。

また、Skypeで会話ができなくなることがありますので、その時はSkypeを再起動してください。

今までUbuntuでbluetoothやSkypeを使うのはかなり大変でしたが、

やっとその苦労から解放されそうな予感がします。

ちなみに、この設定でビデオやインターネットラジオを聞くと、ちゃんとbluetoothヘッドセットから聞こえます。

bluetoothのA2DPサービスを使ってもビデオやインターネットラジオは聞けますが、Skypeの場合には呼び出し音までしか再生されず、通話音は聞けなくなりましたので、ヘッドセットサービスを使う必要があります。
※使用しているデバイスによるかもしれません

admin Ubuntu