perl CGI.pm 渡される引数の取り扱い


perlでCGI.pmを使ってCGIを作る際の話。
・CGIに渡されたパラメータは、別のサーバに対してのコンテンツ取得に使用する
・渡されるパラメータが何がどれくらいあるのかが特定できない
・こちらの内部管理用で不要なパラメータとして特定の文字列があるが、それは引き渡さない

こんな条件がある時に、どーやって、パラメータを取得するか、というところ。

use CGI;
my $q = new CGI;
# 不要なパラメータを消去
$q->delete('sessionid');
# 残ったパラメータを表示
foreach my $name ($q->param) {
    # $nameが持っている値が複数の場合もあるため
    # @_=$q->param($name)に格納して
    # それをforeachする
    foreach my $value ($q->param($name)){
        print "$name=$value <br>\n";
    }
}

perl LWPを使ってcookie必須のページへのPOSTアクセス


うちで主に携帯向けとして提供しているゲームコンテンツのゲートウェイサービスは、内部でHTTP::Liteを使用して、オフィシャルのコンテンツを取りに行っている。

いままでは、それで問題なく利用できていたのだが、今回の動作状況見直しの際に、1点問題となる場面が見つかった。

それは、以下の様に同じ名前のパラメータで値が異なるものを送らなければならないことがある、ということ。

<input type="text" name="param" value="value1">
<input type="text" name="param" value="value2">

HTTP::Liteは、POSTアクセス時のコンテンツのペイロードに連想配列を使うため、同じ名前のものを複数送ることができない。

そんなわけで、LWPを使うように仕様変更を試みた。


HTTP::Liteを使用するもの

use HTTP::Lite;
$http = new HTTP::Lite;
$url="http://~";
$http->add_req_header("Cookie", "cookiename=$cookie");
%vars = ( "param" =>; "value1");
$http->prepare_post(\%vars);
$req = $http->request("$url")
    or $flagerr=1;
$contents=$http->body;

LWP使用に変更したもの

use LWP::UserAgent;
use HTTP::Headers;
use HTTP::Request;
$lwpua = LWP::UserAgent->new;
$url="http://~";
$lwpreq = HTTP::Request->new(POST => $url);
$lwpreq->content_type('application/x-www-form-urlencoded');
$lwpreq->header("Cookie"=>"cookiename=$cookie");
$lwpreq->content("param=value1&param=value2");
$lwpres= $lwpua->request($lwpreq);
$contents=$lwpres->as_string;

細かい点はいくつかあるものの、こんな感じで移行はできた。

失敗した点

最初「$lwpreq = HTTP::Request->new(POST => $url);」を「$lwpreq = HTTP::Request->new(POST => ‘$url’);」としていた。
この場合、「400 URL must be absolute」というエラーメッセージが出力されていた。
$urlにつけていたシングルクォーテーションを外したところ、正常動作した。

参考にしたLWP cookbookのサンプルは固定URLであるので、シングルクォーテーションで良いが、変数を使う場合にシングルクォーテーションを使うと駄目、という基本を忘れていたために食らいました。

もう1点、サーバに対して、Cookieの値を送る方法がよくわからなかった。
HTTP::Liteの時の例とかを考え、headerにCookieという名前で値を追加すればいい、と思い当たったので、それでやってみたところ、期待通りに動作した。

Kik Messengerの賞金付きアプリコンテストかぁ



Kik MessengerというiPhoneでも使えるメッセンジャーアプリがあるようですが、アプリ連携のSDKをリリースして、記念のアプリコンテストをやるんだそうな。
賞は3つあり、それぞれ選ばれたアプリの人に$5000が贈られるとか。

詳しくはThe Kik API Pioneers Awardsを参照のこと。

で、このKik Messengerとのアプリ連携、というのがどんな感じ、というのは、The Kik API Betaの解説内でyoutube動画で説明されてます。

アプリのネタとか、思いつくものがないけど、ちょっと興味深い感じかなぁ

動画デモの内容的にはNintendo DSのピクトチャットを思わせるあたりが^^;;;

vSphere ESXのパス選択方法の変更


IBM SVCなるものを導入し、VMware vSphere ESX/ESXiで使用することになったわけだが、設定に微妙な点を発見した。

それは、ESX/ESXi側でマルチパスの設定変更が必要だと言うこと。

まず、現状、どんな設定になっているのかを確認するために、ESX/ESXiにsshでログインして「esxcli nmp device list」と実行した。 (ESXi 6.xでは esxcli storage nmp device list )

~ # esxcli nmp device list

naa.xxxxxxxxxxxxxxe9d80000000000002d
    Device Display Name: IBM Fibre Channel Disk (naa.xxxxxxxxxxxxxxe9d80000000000002d)
    Storage Array Type: VMW_SATP_SVC
    Storage Array Type Device Config: SATP VMW_SATP_SVC does not support device configuration.
    Path Selection Policy: VMW_PSP_FIXED
    Path Selection Policy Device Config: {preferred=vmhba2:C0:T3:L11;current=vmhba2:C0:T3:L11}
    Working Paths: vmhba2:C0:T3:L11

ずらずら~
~ # 

マルチパスに関する設定は「Path Selection Policy」がソレになる。

現状は「VMW_PSP_FIXED」となっている。

これは、とりあえずアクセスできたパスをずっと使い続け、そのパスが死んだ時に初めて違うパスを使ってみよう、という「固定」の方法となる。

次に、ESX/ESXiで設定できるマルチパスの方式としてどんなものがあるのか?というのを確認するため、「esxcli nmp psp list」コマンドを実行する。 (ESXi 6.xでは esxcli storage nmp psp list )

~ # esxcli nmp psp list
Name              Description
VMW_PSP_FIXED_AP  Fixed Path Selection with Array Preference
VMW_PSP_MRU       Most Recently Used Path Selection
VMW_PSP_RR        Round Robin Path Selection
VMW_PSP_FIXED     Fixed Path Selection
~ # 

方式としては4種類あることが分かる。

それぞれについて簡単に解説をすると・・・


「VMW_PSP_MRU / 最近の使用」

最近使ったパスを優先して使う。

Active/Passive型RAIDの場合の標準設定。

LSI Logic OEM系のRAIDだとコレ。IBM DS3xxx、DS4xxxx、DS5xxxが該当になるはず。

「VMW_PSP_FIXED / 固定」

最初にアクセスできたパスをずっと使い続け、そのパスが死んだ時に初めて違うパスを使ってみようかな。という感じの使い方。

そして、最初にアクセスしたパスが復旧したら、まだ戻る。

Active/Active型RAIDの場合の標準設定。

「VMW_PSP_FIXED_AP」

基本はVMW_PSP_FIXEDと同じだが、Active/Passive型RAIDや、ALUAモード対応RAIDにも対応させた形式。

ちなみにALUAとは非対称論理ユニットアクセス(Asymmetric Logical Unit Access)で、SCSI SPC-3の使用として規定されたI/Oパス決定の仕組みです。詳しく知りたい人はEMC CLARiX 非対称アクティブ/アクティブ機能(ALUA)詳細レビューで解説されているので、参考にしてください。

「VMW_PSP_RR / ラウンド ロビン」

複数あるパス間で、バランスを取りながら使用していく形式。

Active/Active型のRAIDでないと使えない形式。


以前のIBM SVCはマルチパスの仕組みがちょっといけてないところがあったようですが、現在のIBM SVCではかなり改善されているようで、「VMW_PSP_RR」が使用できるようになっています。

しかし、設定の現状をみると「VMW_PSP_FIXED」。

まず、システムに登録されているストレージごとのパス利用方法の既定値(デフォルト)を確認するために「esxcli nmp satp list」を実行します。 (ESXi 6.xでは esxcli storage nmp satp list ) 

~ # esxcli nmp satp list
Name                 Default PSP       Description
VMW_SATP_SVC         VMW_PSP_FIXED     Supports IBM SVC
VMW_SATP_SYMM        VMW_PSP_FIXED     Placeholder (plugin not loaded)
VMW_SATP_MSA         VMW_PSP_MRU       Placeholder (plugin not loaded)
VMW_SATP_LSI         VMW_PSP_MRU       Placeholder (plugin not loaded)
<略>
~ # 

SVCの場合、「VMW_PSP_FIXED」と定義されているのがわかる。

調べてみると、IBM SVCの以前のバージョンでは固定だったらしい。

仕方が無いので手動で変更。

GUIから変更することも可能ではありますが、ディスク数が多いと、全部に対して手動で変更する必要があるので非常に大変なので、コマンドで変更した方がいいでしょう。

「esxcli nmp device setpolicy –psp VMW_PSP_RR –device デバイス名」で変更できます。(ESXi 6.xでは esxcli storage nmp device set –psp=VMW_PSP_RR –device=デバイス名)

とりあえず、ESXiでsshログインを有効にしてから、sshでログインして、SANで認識されているディスクはすべてRound Robinに設定、というものすごくおおざっぱなコマンドを実行する感じになります。

for device in `esxcli nmp path list|grep "Device: "|awk '{ print $2 }' | grep naa`
do
	esxcli nmp device setpolicy --psp VMW_PSP_RR --device $device
done

上記のスクリプトは

現行のVMware ESX/ESXi 4.0/4.1に置いて、SANのディスクは「naa.xxxxxxx~」という感じの名前で認識される。
なので、対象となるデバイス名を取り出して、それに対してパスを設定する、ということを行う。
といったもの。

エラー処理とかは一切考えていないので、ちゃんと設定できたかどうかは別途確認してください。

Linuxサーバにステータス表示パネルをつける 2017/01/12修正版



サーバの前面につけるような小型のLCDパネル。

どうやら「LCD Smartie」というらしい。

いくつかのベンダからパソコンにつながるようUSBポートをつけたキットが販売されている。

・LCD Smartieなどの表示機器屋の「MATRIX ORBITAL社
ラインナップがいろいろある
Character LCD Displays」2行~4行ぐらいの文字&グラフィック表示($36.08~)
External LCDs」2行~4行ぐらいの文字&グラフィック表示+操作ボタン($92.15~)
Graphic Touchscreen」2行~4行ぐらいの文字&グラフィック表示+タッチパネル操作($68.42~)
Economy Display」2行~4行ぐらいの文字&グラフィック表示の廉価版モデル($35.95~)
PC Bay Inserts」パソコンなどの前面パネルに埋め込む用のKit($64.26~)

MATRIX ORBITAL社製品用の「USB接続ドライバ」と「表示用のソフトウェア

・同じくLCD Smartieなどの表示機器屋のCrystalfontz社
ラインナップはMATRIX ORBITAL社製品と似たような感じで、価格も同じぐらい。
Webが見やすいので個別の製品群リンクは省略。
ユーザフォーラムがある

・sureelectronics社の20*4 LCD Display Board with UART Based USB(Edition llI)(DE-LP14113)
20文字*4行の表示で、1個 USD$26.00。
以前はいくつかラインナップがあったが、現在はもう1つ、16文字*2行の1602 LCD Display USB (Edition I) Smartie module PC Case
(DE-LP12111)
(USD$17.90)があるだけ。
CP2102を使ったUSBシリアル変換ボードとセットとなっており、miniUSBコネクタでパソコンと接続する感じになっている。
(USBシリアル変換部分のドライバはおそらく、CP210x USB – UART ブリッジ VCP ドライバ)

・Soundgraph社のiMON VFDシリーズ
Soundgraph社が業務転換してしまい、プロダクトが終了している

使うためのソフトは、何種類かある
LCD Smartie
Windows用ソフト。
“Crystalfontz”,”Matrix Orbital”,”HD44780チップ互換品”をサポートしているとのこと。
具体的な製品は後述のLCDprocの対応リストを見るとわかりやすい
2013年の更新が最後になっている。

smartie-utils
Tclで作成されたLinux用ソフトウェア、sureelectronics社のやつに対応している。
指定したシリアルポートにデータを流し込んで使う、という使い方のようで、sureelectronics社以外の似たようなやつにも対応するんじゃん?と書かれている。
2015年が最終更新だけど、ソースを見たところ、変更するポイントもなさそうなので、そんなもんかな、というところ。

LCDproc
Linux用で、2013年が最終更新。
LCD対応リストを見ると、いろんなデバイスに対応しているのがわかる。

LCD4Linux
やっぱりLinux用で2009年が最終更新。
LCD対応リスト
これみるとSureElectronicsのやつはMatrixOrbitalらしい。

・Crystalfontz社のフォーラムに「3rd Party Software Link」という形でいくつかのソフトウェアがリストされている。
LCDProc, LCD4Linux, LCD Smartieは、ドット絵も表示できるとのこと。
また、「 Crystalfontz LCD Display on a Raspberry Pi」にラズパイ向けの接続手法の記事もある。


以下は2011年5月20日に公開した旧版。
資料として残している。


サーバの前面につけるような小型のLCDパネル。

どうやら「LCD Smartie」というらしい。

いろいろなベンダからパソコンにつながるようUSBポートをつけたキットが販売されている。

・sureelectronics社のLCD Smartie Kit 20X4 White on Blue USB/UART Display PC Information
20文字*4行の表示で、1個 USD$17.99。
LCD Smartie Kitシリーズとして、いろいろラインナップがある模様。

・Soundgraph社のiMON VFD
日本でも入手可能

使うためのソフトは、何種類かある
LCD Smartie
Windows用ソフト。
“Crystalfontz”,”Matrix Orbital”,”HD44780チップ互換品”をサポートしているとのこと。
具体的な製品は後述のLCDprocの対応リストを見るとわかりやすい

smartie-utils
Linux用で、sureelectronics社のやつに対応しているようだ。

LCDproc
Linux用
LCD対応リスト

LCD4Linux
やっぱりLinux用。
LCD対応リスト
これみるとSureElectronicsのやつはMatrixOrbitalらしい。

・チップメーカのCrystalfontzがフォーラムに「3rd Party Software Link」という形で記載されている。
LCDProc, LCD4Linux, LCD Smartieは、ドット絵も表示できるらしい。