digital matter
Internet Explorer 6さようなら運動はじめました!

Symfonyでembed18nを使う

Symfonyで多言語対応する予定があるけど、とりあえず日本語だけ使いたかったときのメモです。embedI18nを自在に使う参考に。例によってSymfony 1.4+Doctrine。

// HogeForm.class.php
public HogeForm extends BaseHogeForm
{

    public function configure()
    {
        parent::configure();

        $this->embedI18n(array('ja'));

        // 二次元配列でembedしたフォームにアクセスできる
        $this->validatorSchema['ja']['name']->setOption('required', true);

        $this->useFields(array('ja', 'foo', 'bar'));
    }

}

このままテンプレートで$form->render()とかしてしまうと、入れ子表示になってしまうのでrenderRowでそれぞれ表示するようにしてやれば、useFieldsでembedされたフォームの順番がいじれないという問題も解決。

// hogeCreateSuccess.php
$form['ja']['name']->renderRow();
$form['foo']->renderRow();
$form['bar']->renderRow();

ちなみにsfFormDoctrine::getI18nFormClass()とかあるのですが、クラス名が取れるだけです。

追記

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry ’19-ja’ for key ‘PRIMARY’

フォームをsaveしたら上記のエラーが出ました。

updateObject後にobject->toArray()をすると見覚えのない、「ja_JP」というキーが。

Array
(
    [id] =>
    [foo] => hoge
    [bar] => moge
    [Translation] => Array
        (
            [ja] => Array
                (
                    [id] =>
                    [name] => someone
                    [lang] => ja
                )
            [ja_JP] => Array
                (
                    [id] =>
                    [name] =>
                    [lang] => ja_JP
                )
        )
)

色々調べた結果、原因は

  • langがchar(2)なので、jaとja_JPの区別がつかないこと
  • sfDoctrineRecord::getDefaultCulture()がja_JPなこと

恐らく、

http://www.symfony-project.org/jobeet/1_4/Doctrine/ja/19

このページを参考にしているとハマるのではないかと…

ちなみにlangがchar(2)なのは、Doctrine_I18nの中で定義されています。

対策として考えられるのは以下のパターン。

  • sfDoctrineRecord::setDefaultCulture(‘ja’)をコールする
  • langをchar(5)にしてja_JPの形式で扱う
  • settings.ymlのdefault_cultureをjaにする
  • embedI18nにja_JPを渡す

sfDoctrineRecordのカルチャをセットするのは、sfUserのカルチャをセットすることでイベントが駆動して同時にセットできます。なので、$this->getUser()->setCulture(‘ja’)とかしておけばOK。

langをchar(5)にするのは、I18nビヘイビアのオプションにlength:5を指定すればできます。この場合、カルチャをすべて5文字で扱うようにしないとlangがマッチしなくなります。length:2の場合は暗黙的に先頭2文字だけにマッチさせることで5文字のカルチャを許容していたので。

# schema.yml
Sample:
  actAs:
    Timestampable: ~
    I18n:
      fields: [name]
      length: 5

settings.ymlのdefault_cultureをjaにするのが一番簡単です。en_USとen_GBはどうするんだという話ですけど…

formクラスに$this->embedI18n(array(‘ja_JP’))とすることでも対応できます。

気になる方はsfDoctrineRecordI18nFilterクラスのfilterSet関数を見てください。

カタログファイルとかにも影響しそうなのでsettings.ymlに2文字カルチャをセットするのがベターかなぁ。

関連する投稿

html5uploaderで複数アップロード時のバグ修正

Gmailのようなドラッグアンドドロップでファイルをアップロードする機能が使いたかったので探していたところ、見つけたのがhtml5uploaderです。JSと、サーバーサイドのPHPが付いてます。

html5uploader

デモ
http://www.weeby.pl/blog/html5uploader/uploader.html

比較的簡単な構造で最低限のアップロード機能を実装しているので、elFinderと組み合わせて使うことにしました。

で、表題のバグですが、複数のファイルを同時にアップロードすることはできるのですが、時々サーバからNo file to uploadというメッセージが返ってくることがあります。リクエストを見ると、送るはずのContent-Lengthが0バイトで、データを送信していないようです。

原因はonloadendイベントの関数でreaderオブジェクトを直接呼び出して使ってるからですね。というわけで修正。

// Once the process of reading file
this.loadEnd = function() {
	bin = reader.result;

// Once the process of reading file
this.loadEnd = function() {
	bin = event.target.result;

に修正して完了です。

Pluploadの方が高性能かつソースもきれいでよく出来てるのですが、GPLなんですよね。コマーシャルライセンスは10ユーロなんで良心的で安いんですが。今回はファイルマネージャーに統合しちゃいたかったので、小型のhtml5uploaderにしてみました。

elFinderがDnDのアップロードに対応しないかなぁ。

関連する投稿

symfonyで行の並び順を指定できるビヘイビアを使ってみた

今回はこちらを参考に、csDoctrineActAsSortablePluginを使ってみました。

$ ./symfony plugin:install csDoctrineActAsSortablePlugin
>> plugin    installing plugin "csDoctrineActAsSortablePlugin"
>> sfPearFrontendPlugin downloading csDoctrineActAsSortablePlugin-1.5.1.tgz ...
>> sfPearFrontendPlugin Starting to download csDoctrineActAsSortablePlugin-1.5.1.tgz
>> sfPearFrontendPlugin (6,795 bytes)
>> sfPearFrontendPlugin .
>> sfPearFrontendPlugin .
>> sfPearFrontendPlugin ...done: 6,795 bytes
>> sfSymfonyPluginManager Installation successful for plugin "csDoctrineActAsSortablePlugin"
>> sfSymfonyPluginManager Installing web data for plugin

使い方はschema.ymlのモデルのActAsにSortableを追加してやればいいだけです。

ModelName:
  actAs:
    Timestampable: ~
    Sortable: ~

これで、自動的にpositionというbigintのカラムが生成されて、ソート順が数字で指定できるようになります。

併せて順序を入れ替えるための便利なメソッドが使えるようになります。

http://www.symfony-project.org/plugins/csDoctrineActAsSortablePlugin/1_5_1?tab=plugin_readme

今回、I18nの下にSortableを置いたら、インデックス名がやたら長くなってしまい、CREATE文でエラーが出るようになってしまいました。

SQLSTATE[42000]: Syntax error or access violation: 1059 Identifier name '******_*********_***_*******_******_*****_translation_position_sortable_idx' is too long.

plugins/csDoctrineActAsSortablePlugin/lib/template/Sortable.php

  protected function getSortableIndexName()
  {
    return sprintf('%s_%s_%s', $this->getTable()->getTableName(), $this->_options['name'], $this->_options['indexName']);
  }

ということなので、nameとindexNameを指定して短くできそうです。

と言ってもposition_sortable分しか短くできないのですけど。

最終的には、schema.ymlの方でtableNameをdatabase_name.table_nameで指定していたのですが、これをtableName: table_nameにするだけで対応できました。

関連する投稿

MySQL Workbenchからschema.ymlを生成する

MySQL Workbenchからsymfony+Doctrine用のschema.ymlを書き出せないかなぁとつぶやいたら@hidenorigotoさんに教えていただいたので試してみました。
http://twitter.com/#!/hidenorigoto/status/38153994970988544

MySQL Workbench schema exporter

MySQL Workbench schema exporterは、MySQL WorkbenchプラグインのMySQL Workbench Doctrine Pluginにインスパイアを受けて開発されたようです。
が、こちらのプラグインはすでにメンテされていないようです。

開発終了した理由がぞろぞろ書いてありますが、要約すると「LUAが…」ってことみたいです。

MySQL Workbench schema exporterはPHPで書かれています。MySQL Workbenchのmwbファイルを読み込んでパース、フォーマッタを指定してそれぞれの形式を書き出すようです。
ちなみにmwbファイルはZIP圧縮されたXMLです。あと、SQLite3のデータが入ってました。

注意点としてPHP 5.3以降でないと実行できません…
いつものdebian環境では5.2を使ってるので、Windows版の5.3をダウンロードしてインストールしました。

まずはexampleディレクトリに移動します。

C:\Users\test\Downloads\johmue-mysql-workbench-schema-exporter-7d08e29\example>php -v
PHP 5.3.5 (cli) (built: Jan  5 2011 20:36:18)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

example/data/にtest.mwbがあり、サンプルではこのファイルを使います。

ちなみにサンプルのEER(Enhanced Entity-Relationship) diagramはこんな感じです。

test.mwb

C:\Users\test\Downloads\johmue-mysql-workbench-schema-exporter-7d08e29\example>php .\doctrine1.yaml.php
<textarea cols="100" rows="50">Bureau:
  tableName: mydb.bureaus
  columns:
    id:
      type: integer(4)
      primary: true
      notnull: true
      autoincrement: true
    room:
      type: string(45)
  indexes:
    testIndex:
      fields: [room]
      type: unique
  options:
    charset: utf8
    type: InnoDB

Email:
  actAs:
    timestampable:
  tableName: mydb.emails
  columns:
    id:
      type: integer(4)
      primary: true
      notnull: true
      autoincrement: true
    email:
      type: string(255)
    users_id:
      type: integer(4)
      primary: true
      notnull: true
  relations:
    User:
      class: User
      local: users_id
      foreign: id
      foreignAlias: Emails
      onDelete: no action
      onUpdate: no action
  indexes:
    fk_Emails_Users:
      fields: [users_id]
  options:
    charset: utf8
    type: InnoDB

User:
  actAs:
    timestampable:
  tableName: mydb.users
  columns:
    id:
      type: integer(4)
      primary: true
      notnull: true
      autoincrement: true
    name:
      type: string(255)
  options:
    charset: utf8
    type: InnoDB

UsersBureaus:
  tableName: mydb.users_bureaus
  columns:
    users_id:
      type: integer(4)
      primary: true
      notnull: true
    bureaus_id:
      type: integer(4)
      primary: true
      notnull: true
  relations:
    User:
      class: User
      local: users_id
      foreign: id
      foreignAlias: UsersBureauss
      onDelete: no action
      onUpdate: no action
    Bureau:
      class: Bureau
      local: bureaus_id
      foreign: id
      foreignAlias: UsersBureauss
      onDelete: no action
      onUpdate: no action
  indexes:
    fk_users_bureaus_bureaus1:
      fields: [bureaus_id]
  options:
    charset: utf8
    type: InnoDB

Testtable:
  tableName: mydb2.testtable
  columns:
    id:
      type: integer(4)
      primary: true
      notnull: true
  options:
    charset: utf8
    type: InnoDB
</textarea><br><br>1 MB used<br>0.055 sec needed

というわけで、リレーションやインデックスなども書きだされるようです。

HTMLのタグはdoctrine1.yaml.phpの中に書いてあるので、CLIから使うときは適当に外してください。

timestampableなどのビヘイビアに関しては、コメント欄に書くことで出力できるようです。

{d:actAs}
  actAs:
    timestampable:
{/d:actAs}

この仕様はちょっと微妙な気が…

created_atとupdated_atがあったらtimestampable付けるとかの方が楽だなぁ、と。

作っちゃった後の全テーブルにコメント指定して回るのはちょっと辛いので。

サーバにPHP 5.3が入っているなら、symfony taskでmwbからschema.ymlの生成と、ActAsの追加をやってしまうのがいいかな、と思いました。

うーん、個人的にはMySQL Workbench上で完結したいから、プラグインの方が便利な気はするんですけどねぇ。LUAとは言わなくてもPythonスクリプティング対応しているようなので、Pythonに書き直すとか…

この後、60テーブルほどのファイルを変換してみましたが、問題なく実行できました。

追記(2011/02/19)

注意点がいくつかあります。

というか、致命的かも。

1.NOT NULLのchar型にDEFAULT値”を入れるとNULLに変換される

これはDoctrineのbuild –sqlがおかしいかな…

column_name:

  type: char(3)

  notnull: true

  default: ”

column_name char(3) DEFAULT NULL NOT NULLとかいう矛盾を持ったクエリが生成されます。

ちなみにvarcharは大丈夫です。

default: ”の行は削除しましょう。

2.DECIMALやFLOATの最大桁数と少数点の値が逆になる

ひどい。

例えばMySQL WorkbenchでDECIMAL(15,4)と指定したカラムがDECIMAL(4,15)と書き出されます。

column_name:

  type: decimal(4,15)

  notnull: true

  default: ’0.0000′

もちろん、ちゃんとMySQL Workbenchからクエリのエクスポートをしたときは15,4になります。

置換で何とか…

うーん、やっぱりMySQL WorkbenchでDBをあらかじめ作成しておいてから→doctrine:build-schema→schema.yml修正が妥当かなぁ。

関連する投稿

Let’s note J9の店頭モデルとマイレッツ倶楽部

SSDに換装してWindows7まで入れたLet’s note R5が、仕事で使うには遅すぎて遅すぎて耐えきれなくなったので、Let’s note J9を購入しました。Sandy Bridge搭載のLet’s noteとか待ちたかったけど、やむなし。

J9は店頭モデルとパナソニックの直販モデル(マイレッツ倶楽部)があるのですが、迷った末に店頭モデル購入。なにせ店頭モデルは10万を切る値段で、直販モデルは30万前後とかなり差があるので…

この店頭モデルと直販モデルの性能差を、あまり手間もかけずに縮めようとするのが今回の趣旨です。

とりあえず本体はPCボンバーの通販にて86,879円でした。Let’s note J9 CF-J9NYABHR シフォンホワイト。Amazonだと95000円くらいですか。

プレミアムエディションと店頭モデルの比較表をエントリの下の方に載せておくので参考までに。

CPUが上記モデルではCore i3 370M(2.40GHz)、直販のプレミアムエディションモデルだとCore i7 640M(2.80GHz)なのですが、これはまぁ、埋められません。でも経験上アーキテクチャが同じなら差は驚くほどは体感を得られないので、別にいいと思います。

必須なのはSSDです。J9では換装がすごくやりやすくなったので、おすすめです。体感速度が全然違う上に、振動にも強くなります。SSDは256GBにすると2011年1月現在で5万円前後というところでしょうか。120GBなら安心のIntel製でも2万円くらいで買えます。

あと、メモリですが、プレミアムエディションモデルでは元々4GBが載っているので、増設して8GBまで増やせますが、店頭モデルでは2GBなので増やせても6GBまでということになります。

自分の用途はChromeのタブを100個くらい開いてVisual StudioやEclipseでプログラムを書くのがメインなので、4GBくらいは必要なラインです。6GBあれば安心です。4GBの追加メモリモジュールも大抵5000円もしないので上限まで入れておけばいいと思います。

6GBのメモリを使うとなると、店頭モデルに標準でインストールされているWindows7は32bit版なので、上限的につらいところです。が、最近のLet’s noteではOSの32bitと64bitをBIOSメニューから簡単に切り替えができます。まぁ、切り替えというかBIOSメニューからリカバリーをする時にインストールするOSを32bitにするか64bitにするかを選択できるということなのですが。

SSDに入れ替える前にリカバリーディスクを作成して、復元領域をバックアップするのですが、その時OSが64bitでも、復元時には購入時に入っていたOSと同じになります。64bitにしてからリカバリーディスクを作れば後の手間がなくていいかと思ったのですが、単純に二度手間になるだけなので、64bit切り替えはSSDへのリカバリー後にやりましょう。

リカバリーディスクの作成にはDVD-Rドライブが必要になります。Let’s noteのマニュアルでおすすめされているのはBUFFALOのポータブルDVDドライブです。

個人的にはスロットインタイプが好きなので、以下のようなものを使ってます。

Windowsのプログラムから「リカバリーディスク作成ユーティリティ」を選択して、空のDVD-Rメディアをドライブに入れて実行するだけです。一層のディスクなら、2枚必要になります。「取扱説明書 準備と設定ガイド」にリカバリーディスクの作成について詳しく書いてあるので、そちらも参照してください。

SSDの換装は、こちらのブログが写真付きでわかりやすく解説されています。

Panasonic CF-J9のHDD を換装する | ゆめとちぼーとげんじつと

メモリの増設はこちらで。

レッツノート J9 メモリ増設 – satoweb_log

SSDを入れ替えたあと、リカバリーディスクを使ってSSD上にリカバリー領域を復元します。リカバリー領域を復元後に電源を再度入れると、セットアップが開始します。セットアップをしてもそのあとにWindowsを入れ直すことになるので、復元後、そのままBIOSメニューを開いて再インストールへと進むのが良いかと思います。

64bitへの切り替え方はマニュアルに書いてあります。Windows起動前にBIOSメニューを表示して、工場出荷時の状態に戻す途中で、32bitにするか64bitにするか聞かれるので、64bitを選択するだけでOKです。

ここまですれば、安い店頭モデルでもかなり快適になると思います。まぁ、実際そこまでしなくてもかなり快適ですが。

プレミアムエディションモデルと店頭モデルの抜粋した比較表は以下になります。bluetoothのモジュールの値段なんて大した額ではないでしょうから、ほぼCPUとSSD代とバッテリーパック代、OFFICE代、FOMA代ということになるでしょうか。OSの差額もありますが。

総額 86,879円+19,950円+4,476円=111,305円になりました。

ちなみにバッテリーパック(L)はこちら。

標準バッテリーパック CF-VZSU68JS 商品概要 | パソコン | Panasonic

直販よりはAmazonの方が3000円ほど安いですね。価格.comで見る限りだと20,129円くらいからあるようです。

品番 CF-J9LV4ADP(ワイヤレスWANモデル) CF-J9NYABHR
インストールOS Windows® 7 Professional 64ビット 正規版 (日本語版) (Windows XP Mode 搭載) Windows® 7 Home Premium 32ビット 正規版 (日本語版)
CPU インテル® CoreTM i7-640M プロセッサー インテル® Core™ i3-370M プロセッサー
(スマートキャッシュ 4MB、 動作周波数 2.80 GHz、ターボ・ブースト・テクノロジー利用時は最大3.46GHz) (インテル®スマートキャッシュ 3 MB、動作周波数 2.40 GHz)
チップセット モバイル インテル® HM55 Express チップセット
メインメモリー 標準4GB(オンボード) / 最大8GB(DDR3 SDRAM) 空きスロット1 標準2GB DDR3 SDRAM (最大6GB)、空きスロット1
ビデオメモリー 最大1696 MB(メインメモリーと共用) 最大763MB/2GBまたは4GBのメモリー増設時 最大1563MB(Windows 7[32ビット]の場合)(メインメモリーと共用)
グラフィックアクセラレーター インテル® HD グラフィックス搭載 (インテル® CoreTM i7-640M プロセッサーに内蔵) インテル® HD グラフィックス (インテル® Core™ i3-370M プロセッサーに内蔵)
HDD/SSD SSD256GB (Serial ATA) 160 GB HDD (Serial ATA、5400回転/分 2.5型HDD)
無線LAN/WiMAX インテル® Centrino® Advanced-N + WiMAX 6250
WiMAX: IEEE802.16e-2005 準拠(受信最大20Mbps:送信最大6Mbps)
無線LAN : IEEE802.11a(W52/W53/W56)/b/g/n 準拠 (WPA2-AES/TKIP対応、Wi-Fi準拠)
ワイヤレスWAN ワイヤレスWANモジュール内蔵(FOMA®HIGH-SPEED対応)(受信最大7.2Mbps:送信最大5.7Mbps) なし
Bluetooth Ver.2.1 +EDR/Class 2 なし
LAN 1000BASE-T/100BASE-TX/10BASE-T
ExpressCardスロット 搭載されていません
SDメモリー SDメモリーカード×1スロット (SDHCメモリーカード/SDXCメモリーカード対応 / 著作権保護技術対応)
拡張メモリースロット DDR3 204ピン SO-DIMM専用スロット×1(1.5V/PC3-6400/DDR3 SDRAM)
インターフェース USBポート×3(USB2.0)、LANコネクター(RJ-45)、外部ディスプレイコネクター(アナログRGB ミニDsub 15ピン)、HDMI出力端子、FOMAカードスロット USBポート×3(USB2.0)、LANコネクター(RJ-45)、外部ディスプレイコネクター(アナログRGB ミニD-sub 15ピン)、HDMI出力端子
バッテリー駆動時間 バッテリー(S)使用時:約6.5時間 約7.5時間
バッテリー(L)使用時:約9.5時間 約11時間(別売バッテリーパック[L]使用時)

関連する投稿

Eclipse 3.6(Helios)でAndroid SDKのコード補完が遅い問題

Android開発時に、コード補完が死ぬほど遅い問題の解決方法をまとめておきます。

参考にしたのは以下。

つまりはソースコードをダウンロードして展開しておけばいいということですね。

2.2(froyo)の場合

http://android.git.kernel.org/?p=platform/frameworks/base.git;a=snapshot;h=froyo;sf=tgz

base-froyo-73e150c.tar.gz、107MBでダウンロードは10分ほどでした。

展開すると、pax_global_headerというファイルとbase-froyo-73e150cというディレクトリができるので、base-froyo-73e150cをsoucesに名前変更して、

android-sdk-windows\platforms\android-8

の下に移動して完了。

2.1(eclair)の場合はダウンロードURLのh=froyoをh=eclairに変更して、展開先をandroid-7\sourcesにすればOK。

展開すればEclipse再起動しなくても有効になります。

関連する投稿

A cache key must contain both a module and an action parameter

Symfony 1.4にて、Flash上のリンクからページにリンクをしたところ、500エラーが発生。

A cache key must contain both a module and an action parameter

同じURLをそのまま別のウィンドウで開くと問題なく開けるので、リクエストを見比べたところ、違いはrefererの有無だけ。

エラーはinclude_partialの先で起きていて、調べていくと、パラメータを渡さないpartialに、config/cache.ymlでcontextual: trueとしていたのが問題でした。

falseにして解決。

ちなみにこのException自体も、本来は404を出すはずのところらしいです。

あと、キャッシュ有効にしないとこのエラーは出ません。

関連する投稿

Ubuntu 10.10 (Maverick Meerkat) ServerにJDK6をインストールする

今回の情報元。
How to install Sun JDK on Ubuntu 10.10 "Maverick meerkat"? – Stack Overflow

まずはaptラインの設定。

# vi /etc/apt/source.list

末尾に

deb http://archive.canonical.com/ubuntu maverick partner
deb-src http://archive.canonical.com/ubuntu maverick partner

を追加。

# aptitude update
# aptitude install sun-java6-jdk

で、OK。

関連する投稿

jarファイルをEXEにする

Javaのアーカイブ形式であるjarファイルを、そのままでは使いにくいのでEXEの実行形式にしたいと思います。

IKVM.NETを利用すると.NET対応のDLLやEXEに変換できます。実際には.NET上のJavaランタイムで実行するだけのようですが、.NET対応にしておいた方が、個人的には色々と便利です。

IKVM.NET

まずはEXEにしてみます。上記サイトからダウンロードしたikvmを解凍して、コマンドラインから、ikvmcを実行するだけです。

ニコニコ動画の動画ファイルをローカルにキャッシュするプロクシで有名な、NicoCacheをEXE化します。

cd ikvm-0.44.0.5
bin\ikvmc -target:exe NicoCache.jar

で、NicoCache.exeができあがります。EXEを別の場所に移す時は、binディレクトリの他のDLLも一緒にコピーする必要があるので注意。

ついでにDLL化も同じ要領でできます。

bin\ikvmc -target:library NicoCache.jar

DLL化しておけば、.NETのプログラムから扱いやすくなりますね。という前フリ。

ちなみにikvmcのその他のオプションはこちら。

SourceForge.net: Ikvmc – ikvm

関連する投稿

IP電話とUPnPとWZR-HP-G300NHの話

OCNのドットフォンを申し込んだので、さっそくセットアップ。

回線契約はフレッツネクスト。OCNドットフォン光を申し込むと送られてくる、VE-TA10という機器を使います。

すでに家の中にWZR-HP-G300NHでLANが構築されているので、スループットが不安なVE-TA10をルータモードにせずに、現状のWZR-HP-G300NH配下にVE-TA10を、アダプタモードとして接続しています。

配線構成図は以下のページのまま。

VE-TA10|IP電話の設定追加|OCN

で、電話機から自分の電話番号と市外局番を指定すれば良いだけなのですが、いくら設定しても、VE-TA10の「050IP電話」のLEDが点灯しません。消灯状態です。ちなみに設定方法は以下。

VE-TA10|IP電話の初期設定|OCN

「050IP電話」が有効にならない理由は、UPnPが利用できないから、ということらしいです。

UPnPが有効かどうかを簡単に調べるには、Windows Live Messengerを使って調べられます。メニューのツールから、オプションを開いて、接続ページの状況というところに、「非 UPnP ポート制限付きNAT(restricted)を経由してインターネットに接続しています。」と表示されていたら、UPnPが有効になっていません。メニューのツールが見つけられない場合は、Altキーを押すことでメニューが表示されます。

ちなみにUPnP調査ツールみたいなものは他にも色々あるとは思います。

で、UPnPは有効にしているはずなので、改めてWZR-HP-G300NHの設定画面で、UPnPの状態を確認してみると、確かに「UPnP機能」を「使用する」にチェックが入っています。設定メニューは、「ゲーム&アプリ」から、「UPnP」を選択すると表示されます。

で、先ほどのLive Messengerの状態から見るに、UPnPが有効ではないという状況のようです。調べてみると、このWZR-HP-G300NHというルータでは、UPnPを使用する設定にしてあっても、機能が無効になることがあるとのこと。

あれもこれも興味ありますねん!

上記のページの手順に従って、「UPnP機能」の「使用する」を一度チェックを外す。「設定」ボタンを押す→10秒ほど待機→もう一度チェックを入れる→12秒ほど待機、で見事につながるようになりました。Live Messengerの接続状況(一度Live Messengerを終了する必要があります)を確認すると、UPnPを利用して接続できている旨に、表示内容が変わります。

これで、IP電話も正常に接続できるようになりました。

ちなみにルータのファームウェアは1.74。2010年10月時点で最新です。もう更新されないんだろうなぁ…WZR-HP-G300NHは色々不安定です。無線など特に。注意しましょう。

関連する投稿