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

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

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。

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

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

Linuxで複数ユーザで使えるリモートデスクトップ環境を作る

今回やりたかったのは、社内で複数の人が一台の共有マシンを使って、とある時間のかかる処理をするための環境作成です。

最初はxinetd+Xvfb+x11vncでgdmをあーやってこーやって…って色々試していたのですが、Windowsのリモートデスクトップ接続をクライアントに使えた方が便利だなぁとか思ってRDPで転送する方法がないか調べたところ、むしろさっきまで小難しくやろうとしていたすべてをまるっとまとめてやってくれるxrdpというものを発見!

これならシンクライアントっぽいものが一瞬で作れる!ということでさっそく導入してみたので手順解説します。

WS000001

このxrdp、デフォルトのままならリモートデスクトップユーザからシステムに変更を加える作業はできないので、今回の用途に最適です。

xrdp | Get xrdp at SourceForge.net

ユーザの追加も、通常通りLinuxにユーザ追加するだけで、リモートデスクトップログインできるようになります。

VNCに対する利点は多分こんなところ

  • 画像解像度がクライアント側から変更できる
    WS000000
  • Windowsユーザに追加クライアントをインストールしてもらう必要がない

設定にあたってはこちらのブログのエントリが大変参考になりました。これがないとまともにキーボード使えませんでした。

サーバはUbuntu Server 9.10(Karmic Koala)を使いました。別にUbuntuデスクトップ版でも良かった説。

とりあえずインストール時にこれらを選択しておきます。インストール後なら$ sudo taskselでもOK。

  • Basic Ubuntu server
  • OpenSSH Server
  • Ubuntu desktop

xrdpですが、aptやSourceForgeからtar.gzでダウンロードできるものはバージョンが古く、Windows7のリモートデスクトップ接続クライアントに対応していません。なので、cvsレポジトリから最新を持ってくる必要があります。

今回チェックアウトしたものは2009-12-26に最終更新されたバージョンです。

まずは下準備とチェックアウトまで。

$ sudo aptitude update
$ sudo aptitude install cvs autoconf libtool libssl-dev libpam0g-dev libx11-dev libxfixes-dev tightvncserver scim scim-anthy
$ cd ~/
$ mkdir xrdp
$ cd xrdp
$ cvs -d:pserver:anonymous@xrdp.cvs.sourceforge.net:/cvsroot/xrdp login
$ cvs -z3 -d:pserver:anonymous@xrdp.cvs.sourceforge.net:/cvsroot/xrdp co .
$ cd xrdp

で、前述のブログを参考にいくつかファイルを修正します。

$ vi xrdp/lang.c
          if ((code >= 0) && (code < 128))


          if ((code >= 0) && (code < 135))

に。

$ vi xrdp/xrdp_types.h
    struct xrdp_key_info keys_noshift[128];
    struct xrdp_key_info keys_shift[128];
    struct xrdp_key_info keys_altgr[128];
    struct xrdp_key_info keys_capslock[128];
    struct xrdp_key_info keys_shiftcapslock[128];

    struct xrdp_key_info keys_noshift[135];
    struct xrdp_key_info keys_shift[135];
    struct xrdp_key_info keys_altgr[135];
    struct xrdp_key_info keys_capslock[135];
    struct xrdp_key_info keys_shiftcapslock[135];

に。

$ ./bootstrap
$ ./configure
$ make
$ sudo make install

次は日本語キーボード用にキーマップを作成します。キーマップファイルは/usr/local/bin/xrdp-genkeymapを使って作ることもできるのですが、「\」や「_」のキーが効かなくなる現象があるので、さきほどのエントリからコピーしてきます。

とは言ってもファイル単体では公開されていないので、xrdp-0.5.0-instfiles.patchから当該部分を引っこ抜いてくる形になります。

ちなみに自分で生成する場合は、GUI上の端末から(ここ重要)
$ sudo /usr/local/bin/xrdp-genkeymap /etc/xrdp/km-0411.ini
でOKです。

それ以外は普通にSSHから作業できます。認識する名前別にキーマップの複製。lnでもいいかも。

$ cd /etc/xrdp/
$ sudo cp km-0411.ini km-e0200411.ini
$ sudo cp km-0411.ini km-e0210411.ini
$ sudo cp km-0411.ini km-e0010411.ini
$ sudo vi /etc/xrdp/startwm.sh

startwm.shの内容は前述のエントリからまるごとコピペして上書きします。が、Ubuntuで試したところ、ログイン後にキー配列がめちゃくちゃになる現象(「qwerty」が「c.gvn 」になる)があるので、一行追加して対策します。

export XKL_XMODMAP_DISABLE=1

を、for WindowManager in $SESSIONSの前にでも入れておきます。

で、あとは起動するだけです。

$ sudo /etc/xrdp/xrdp.sh start

WS000002

複数のユーザが同時にログインしても問題なく動作します。1200×1920とかの解像度でもストレスなく作業できました。

Mac OS Xな人々にはRemote Desktop Connection Client for Mac 2もあるのでばっちりです。

追記:あ、右シフトキーが効かない現象がありました。謎。

自作ドライバを配布するためのインストーラー

DPInst.exeというものがとにかく便利すぎたのでメモ。

何せ上記実行ファイルを配布したいinfと同じフォルダに置くだけ。DPInst.exeを実行すればインストールが開始されます。

参考にしたのはこちらのサイト。

DPInst.exeの使い方 / How to use DPInst.exe WinUSB.sys事始め/ウェブリブログ

インストール画面をカスタマイズしたい場合に限り、定義XMLファイルを設置すればいいようです。

サンプルとして使えるXMLや画像一式は以下のフォルダにあります。

C:\WinDDK\7600.16385.0\src\setup\DPInst

日本語の場合はlanguage codeに0×0411をセット。

<language code="0×0411">

あとはUTF-8にして日本語で記述できます。

0×0411を定義しておかないと、

現在の言語では、デバイス ドライバのインストール ウィザードはサポートされません。

このパッケージを提供した製造元に問い合わせてください。

と表示されて先に進めません。

ちなみにNSISでやることを最初考えていて、それは以下のページに書いてありました。

Driver installation and update – NSIS

こっちはまだ試していないのですが、アプリケーションとかも一緒にインストールする場合にはNSISの方が便利かも。