‘Software’ カテゴリーのアーカイブ

Node.jsはPowerPCで使えないという話

LinuxでPowerPCのアーキテクチャを選択する場合は注意が必要です。

わざわざWindows版もMac版も用意されているのだからアーキテクチャはほぼ不問なんだと思ってました…

OpenBlocks(debian squeeze)にNode.jsをnvmからインストールしようとしたところ、WAFがエラーを出しました。

root@squeeze:~# nvm install v0.6.18
######################################################################## 100.0%
Checking for program g++ or c++          : /usr/bin/g++
Checking for program cpp                 : /usr/bin/cpp
Checking for program ar                  : /usr/bin/ar
Checking for program ranlib              : /usr/bin/ranlib
Checking for g++                         : ok
Checking for program gcc or cc           : /usr/bin/gcc
Checking for program ar                  : /usr/bin/ar
Checking for program ranlib              : /usr/bin/ranlib
Checking for gcc                         : ok
Checking for library dl                  : yes
Checking for openssl                     : not found
Checking for function SSL_library_init   : yes
Checking for header openssl/crypto.h     : yes
Checking for library util                : yes
Traceback (most recent call last):
  File "/root/nvm/src/node-v0.6.18/tools/waf-light", line 158, in <module>
    Scripting.prepare(t, cwd, VERSION, wafdir)
  File "/root/nvm/src/node-v0.6.18/tools/wafadmin/Scripting.py", line 145, in prepare
    prepare_impl(t, cwd, ver, wafdir)
  File "/root/nvm/src/node-v0.6.18/tools/wafadmin/Scripting.py", line 135, in prepare_impl
    main()
  File "/root/nvm/src/node-v0.6.18/tools/wafadmin/Scripting.py", line 188, in main
    fun(ctx)
  File "/root/nvm/src/node-v0.6.18/tools/wafadmin/Scripting.py", line 241, in configure
    conf.sub_config([''])
  File "/root/nvm/src/node-v0.6.18/tools/wafadmin/Configure.py", line 221, in sub_config
    self.recurse(k, name='configure')
  File "/root/nvm/src/node-v0.6.18/tools/wafadmin/Utils.py", line 634, in recurse
    f(self)
  File "/root/nvm/src/node-v0.6.18/wscript", line 399, in configure
    conf.env['DEST_CPU'] = canonical_cpu_type(conf.env['DEST_CPU'])
  File "/root/nvm/src/node-v0.6.18/wscript", line 60, in canonical_cpu_type
    " but NOT '" + arch + "'.")
Exception: supported architectures are arm, ia32, x64 but NOT 'powerpc'.
nvm: install v0.6.18 failed!

nvmでしか試していませんが、恐らくnodeをmakeしても同じです。これはV8エンジンがPowerPCに非対応なのが原因です。http://code.google.com/p/v8/

あとはこの辺り参照。

Is it possible to make Node.js use Rhino as the Javascript engine? – Stack Overflow

Issue 692 – waf – cannot build nodejs (uses waf) on OS X ppc – The meta build system – Google Project Hosting

一応、V8をPowerPCで動くようにするプロジェクトはあるみたいですが…

https://github.com/ic/v8-powerpc

Long-term goal: Get Node.js and Google Chrome to PowerPC users.

らしいので気長に待つしか…

あとはSpiderMonkeyにV8のAPI実装してNodeに結合するspidernodeですね。

https://github.com/zpao/spidernode

ちょっと求めているものとは違うんですよね…動くのかわからないし。

あー、どうしよっかなー…


Windows版MySQLの配布形態ごとの違い

Windows版のMySQL Server 5.5には、3種類の配布形態があります。

MySQL Installer

http://www-jp.mysql.com/downloads/installer/
msi形式のファイルです。
mysql-installer-5.5.21.0.msiのようなファイル名になっています。

サーバーに加えて、サンプルとドキュメント、Connectors、Workbenchなどのツールが含まれます。一番多くの人におすすめできるパッケージとの事。

The Complete Package

http://www-jp.mysql.com/downloads/mysql/
WS000006

上2つがComplete Packageです。mysql-5.5.21-win32.msiのようなファイル名になっています。組み込みサーバやベンチマークスイートなどが含まれます。

The Noinstall Archive

Complete Packageと同じURLで配布されています。上の画像では、Zip Archiveと書かれているもののうち、上2つです。mysql-5.5.21-win32.zipのようなファイル名になっています。

ファイルサイズが大きいのは、テストやベンチマークなどに加えて、デバッグ情報(pdb:プログラムデバッグデータベースファイル)が付属しているためです。

ただし、このzipファイルにはMySQLInstanceConfig.exeは含まれていません。my.iniファイルの作成とサービス登録は自力で行う必要があります。

ちなみに最後のひとつはソースコードです。バイナリは含まれていません。

それぞれのパッケージのインストール方法と、インストーラーの挙動はpdfで公開されています。
http://downloads.mysql.com/docs/mysql-windows-excerpt-5.5-en.pdf

表です。5.1のEssentialsを参考にしているので間違っているかもしれません。
出典:http://downloads.mysql.com/docs/mysql-windows-excerpt-5.1-en.pdf

 

Installer

Complete

No-install

Installer

あり

あり

なし

MySQL Server Instance Config Wizard

あり

あり

なし

Test Suite

なし

あり

なし

MySQL Server

あり

あり

あり

MySQL Client Programs

あり

あり

あり

C Headers/Libraries

あり

あり

あり

Embedded Server

なし

オプション

あり

Scripts and Examples

なし

オプション

あり

5.1まであった、Essentialsはなくなったようです。

MySQLのmsi形式のインストーラーは、別のMySQLInstaller.exeを展開して使うためにあるようなものなので、インストール先ディレクトリをmsiexecを使ったコマンドラインで指定したりできません。

NSISなどに組み込んで、インストール先を指定したい場合はzipで配布されているNo-install版を使うのが正しいようです。


Windows版のPHP5.3がc0000005で強制終了する

Symfony 1.4.16をWindowsのPHP 5.3.9で実行したときに、特定の条件で強制終了する現象に悩まされていました。
主にSymfonyタスクでdoctrine:data-dumpなどを実行するときに落ちていました。

色々調べた結果、Symfonyに問題があるわけではなく、/lib/vendor/symfony/lib/config/sfDefineEnvironmentConfigHandler.class.phpがきっちり4096バイトだったということが原因でした。

つまり、PHP5.3.9では、4096バイトのファイルをrequireもしくはincludeするとc0000005(Access Violation)で強制終了します。CLIに限らず、Apache経由でも同じです。

試しに4096バイトの一切コードが書かれていないテキストファイルを作ってrequireしてみると、再現しました。

強制終了時のウィンドウと、内容は以下のとおり。

image

ちなみにモジュール名はnts(Non Thread Safe)版ならphp5.dll、ts(Thread Safe)版ならphp5ts.dllです。
どちらも確認しましたが、どちらも同じ現象です。モジュールは入っていても入っていなくても同じです。

問題の署名:
  問題イベント名:    APPCRASH
  アプリケーション名:    php.exe
  アプリケーションのバージョン:    5.3.9.0
  アプリケーションのタイムスタンプ:    4f0c5cd0
  障害モジュールの名前:    php5.dll
  障害モジュールのバージョン:    5.3.9.0
  障害モジュールのタイムスタンプ:    4f0c5dfb
  例外コード:    c0000005
  例外オフセット:    00090f5b
  OS バージョン:    6.1.7601.2.1.0.256.48
  ロケール ID:    1041
  追加情報 1:    0a9e
  追加情報 2:    0a9e372d3b4ad19135b953a78882e789
  追加情報 3:    0a9e
  追加情報 4:    0a9e372d3b4ad19135b953a78882e789

多分現象はこのバグ報告と同じだと思います。
PHP :: Bug #60758 :: require() crashes Apache

5.4.0RC5でも解決してないみたいですね。報告とほぼ同じですが、これで再現できます。

<?php
file_put_contents('test.txt', str_pad('', 4096));
include('./test.txt');

とりあえず対処法としては改行1文字でも増やしておけばいいってことですか…


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のアップロードに対応しないかなぁ。


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


symfonyで携帯端末用のテンプレート切り替えを実装する

symfony 1.4で、PCサイトの携帯版を作ることになりました。

アクションは共通にして、テンプレートのファイル名を、携帯とPCで切り分けるようにしたいと思います。

例:
templates/indexSuccess.php (PC用)
templates/indexSuccess.mobile.php (携帯用)

で、これはフォーマットを指定することで実現できます。フォーマットに関してはJobeetを参照。

Practical symfony | 15日目: Web サービス | symfony | Web PHP Framework

まずは携帯キャリアのIPから高速にキャリア判定をしてくれるプラグインを準備しておきます。

sfMobileIPPluginをsymfony 1.4で使ってみた

次にフィルタを用意します。

app/frontend/lib/filter/myMobileLayoutFilter.class.php

<?php

class myMobileLayoutFilter extends sfFilter
{
    public function execute($filterChain)
    {
        if ($this->isFirstCall()) {
            
            if (sfMobileIP::carrier() != 'pc') {
                $request = $this->getContext()->getRequest();
                $request->setRequestFormat('mobile');
            }
            
        }

        $filterChain->execute();
    }
}

最後にfilters.ymlを編集すればOKです。

app/frontend/config/filters.yml

rendering: ~
security:  ~

myMobileLayoutFilter:
  class: myMobileLayoutFilter

cache:     ~
execution: ~

layoutのテンプレートも携帯版を用意しておきます。

例:

app/frontend/templates/layout.php (PC用)

app/frontend/templates/layout.mobile.php (携帯用)

注意点として、partialなども全部「.mobile.php」の形式のファイルがないと動作しません。どこかでファイルを作り忘れるとsfRenderExceptionが投げられるので注意してください。ちなみに、dev環境だとそのまま真っ白な画面になってしまって、原因追求がしにくいようです。

その場合は、ログファイルにてチェックしましょう。

log/frontend_dev.log

symfony [err] {sfRenderException} The template "indexSuccess.mobile.php" does not exist or is unreadable in "".


Visual Studio 2005をWindows 7で使う

インストール自体は普通にできます。

インストール後、以下の2つのファイルを順番にインストールします。
SP1の方は431MBほどあるので注意。

ダウンロードの詳細 : Visual StudioR 2005 Team Suite SP1
ダウンロードの詳細 : VS2005 SP1 Update for Vista

あと、Visual Studio起動時に表示されるスタートページのニュースチャンネルは、該当URLがすでになくなっているので、スタートページ自体表示しないようにした方がいいかもしれません。

ツール→オプション→環境→スタートアップで。


sfMobileIPPluginをsymfony 1.4で使ってみた

sfMobileIPPluginという、IPベースで高速にキャリア判定をするsymfonyプラグインがあったので、使ってみました。

1.0用に作られているらしく、一部修正する必要があります。

とりあえずやってみてダメだった手順。

$ ./symfony plugin:add-channel openpear.org
$ ./symfony plugin:install -s beta openpear.org/sfMobileIPPlugin

ダウンロードしてインストールを試みる。(これもXMLがおかしいと言われて不可)

$ ./symfony plugin:install ./sfMobileIPPlugin-0.0.13.tgz

ダメっぽいので適当にディレクトリ作って解凍しました。これでセットアップできました。

$ mkdir tmp
$ mv sfMobileIPPlugin-0.0.13.tgz ./tmp/
$ cd tmp/
$ tar xvzf ./sfMobileIPPlugin-0.0.13.tgz
$ mv ./sfMobileIPPlugin-0.0.13 ../plugins/sfMobileIPPlugin

configのyml類はconfigディレクトリに移さずに使える模様です。configにコピーしておけばオーバーライドできるので開発環境の場合はconfigにコピーしたあと、ローカルのネットワーク範囲を追加しておけば便利かと思います。

手動で設置したので、ProjectConfigurationにプラグインを使用するように記述する必要があります。

config/ProjectConfiguration.class.phpの

public function setup()
{
  ...
}

$this->enablePlugins('sfMobileIPPlugin');

を追加します。

1.4ではすでに存在しないメソッドがあるので、それも書き換えます。

plugins/sfMobileIPPlugin/lib/sfMobileIP.class.php

static protected function configFile()
{
  $config_dir  = sfConfig::get('sf_config_dir_name');
  $config_file = $config_dir.DIRECTORY_SEPARATOR.'mobile_ips.yml';
  return sfConfigCache::getInstance()->checkConfig($config_file);
}

を以下のように修正。

static protected function configFile()
{
  return sfContext::getInstance()->getConfigCache()->checkConfig('config/mobile_ips.yml');
}

あと、pear::Net_IPv4が必要です。これがないとdev環境でもエラーを出さずに途中で止まります。

symfonyコマンドでもインストールできますが、pluginディレクトリが汚くなるので、オートロードできる場所にNet_IPv4.phpファイルを適当に設置すれば良いかと思います。

http://pear.php.net/package/Net_IPv4/download

あとは

./symfony cc

を実行して、プログラム内でsfMobileIP::carrier()を実行すればキャリアを読み取れます。


Androidエミュレータの通信をFiddlerで見る

Androidのアプリ開発をするときに、サーバとの通信を確認したいということはよくあります。

通信の確認にFiddlerを組み合わせて使うことで、XMLを整形された状態で見たり、詳細なHTTPヘッダを確認したり、リクエストを改ざんしたり、アプリプログラム側を変更せずに開発サーバを見に行くようにしたりできるようになります。自分のローカルマシンだけでサーバ・クライアントモデルの開発が完了できる環境を作っておくと楽ですね。

Fiddlerについてはこちら。
実はFiddlerがすごすぎたので、機能まとめ紹介 : blog.loadlimit – digital matter –

AndroidエミュレータのHTTP Proxy設定方法について参考にしたのはこちら。
[Android] エミュレーターのプロキシ設定(Using the Emulator with a Proxy) – adakoda

AndroidのブラウザでGoogleニュースを見たときのリクエストはこんな感じで覗けます。

emurator

fiddler_http_debug

具体的なやり方は以下の通り。
あと、開発はEclipseで行っていると仮定しますが、別にエミュレータそのまま起動する場合でもOKです。

Fiddlerインストール

FillderのメニューからTools→Fiddler Optionsを選択
menu_options

Connectionsタブから、Allow remote computers to connectを選択して、ローカルマシン以外からのアクセスを受け付ける
fiddler_allow_remote
併せて、その上のFldder listens on portを覚えておく。ここでは8888を使用。

Fiddlerを一度終了して、起動する

EclipseのメニューのWindows→Preferencesを開いて、左側のツリーからAndroid→Launchを選択、Default emulator optionsに-http-proxy http://[ローカルマシンのIP]:[先ほど調べたFiddlerのポート]を入力。
preferences

すでにプロジェクトを作ってしまっている場合には、メニューのRun→Run configurationsからAdditional Emulator Command Line Optionsを設定する。
run_configurations

これで、ApplyしてRunすれば、ProxyにFiddlerを経由して開発することができるようになります。

あとは、必要に応じて、UserAgentにAndroidが含まれているかどうかなどをFiddlerのフィルタにセットすればOKです。

FiddlerのHOSTS機能でサーバのドメインを開発用のVirtualPCなどに割り当てれば、一台で完結できます。

FiddlerのメニューからTools→HOSTSを選択
menu_hosts

開発マシンのIPとドメインを設定してやればOKです。
hosts 

ただし、Androidのブラウザの場合、どうやら存在するドメインでないと、リクエストできないみたいです。おそらくHTTPリクエスト前にDNS名前解決を一度しているのではないかと思います。ドメイン存在していれば大丈夫なので、たいした問題ではないかと思います。


phpMyAdminのYAMLエクスポートとsymfonyのfixture

Symfony 1.4+Doctrineにて。テストを実行するために、fixtureを用意するのですが、

$ symfony doctrine:data-dump dump.yml

でやろうとしたらデータが重すぎて途中で落ちる。

ので、phpMyAdminにYAMLエクスポート機能がいつの間にか実装されていたので、それを使って必要な部分だけをエクスポートします。

ところがそれをそのまま読み込むといくつか問題が…

ということで、気になった3点。

  • 改行があると読み込めない
  • 日付形式が読み込めない
  • fixtureのymlファイルよりインデントひとつ分浅い

改行のある行はダブルクォートで囲ってから、改行文字を\nにすれば読み込めるようになります。

日付はダブルクォートで囲めばOK。

インデントは置換するなり何なりしましょう。

テスト周りに関してはチートシートが欲しいなぁ…