\x00区切りの文字列
同じ名前のパラメータが複数送信されてくる cgi の場合、Perl で CGI.pm を使ってパラメータの情報を取得すると、代入先の型によって返り値が変わります。
どういうことかというと、たとえば name というパラメータ名で jhon, tom, steve というデータが送られてくる場合、
QUERY_STRING には
name=jhon&name=tom&name=steve
が送られてきます。
これを CGI.pm を使って値を参照するには
my $q = new CGI; my $val = $q->param('name');
または
my $q = new CGI; my @val = $q->param('name');
とすれば取得できます。
name パラメータが複数なら @val に代入じゃないといけないんじゃない?と思いますが、
CGI.pm は 代入先がスカラー変数なら同じパラメータ名の値を \x00 区切りで文字列にして返します。
代入先が配列変数なら、値を配列にして返します。
以前、同じパラメータ名でいくつデータが送られてくるかわからないので、深く考えずにパラメータ名1つに対してテーブルに 1レコード入れる、というデータ構造のプログラムを書きました。
name というパラメータ名で送られてきたものは jhon\x00tom\x00steve という文字列のままTEXT 型のカラムに入れてしまおう、取り出すときは \x00 で split しようという想定でした。
ところが、実際に DB を覗いてみると最初の \x00 までのデータしか commit されていません。
なんで??と思っていたら、ここで重要なことを教えてもらいました。
DB (PostgreSQL) は C言語で作られており、C言語の世界では \x00 はデータの末端を意味します。
そのため、\x00 を検出した時点でデータが終わりと判断され、そこまでのデータしか登録できてないみたいです。
あああ、確かに \x00 って特別な意味のあるデータでしたよね、Cでは。。
とりあえず、\x00 を置換するなり、パラメータ値の取得を @変数に受け取るなりして \x00 を区切り文字として使わないように修正することで期待通りになりました。
これはかなりの落とし穴だったわ。
貸したり借りたり
続けてもうひとつ英語ネタ。
借りるとか貸すとかを英語では borrow とか rental とかいいますよね。その他にも take out も借りる意味をあらわすそうです。
ところがこれらにはシチュエーションによって違いがあるそうで。
rental は料金が発生する借り物。レンタルショップが rental たる所以ですね。
take out は料金は必要ないけれど会員証とか、記名とか何かしらの手続きが必要な借り物。図書館から本を借りるなどのように、少し membership とか public が感じられるケースらしい。。
borrow は料金も会員証などもなにも必要なく、友人同士で行うような借り物。
というように違いがあるそうです。
もちろん文脈によって左右されるとは思いますが。
気をつけないと有料で借りる破目になるかも知れず。
これは覚えておこう。
「入力欄を埋めてください」について
英語で記入用紙や入力欄のことを form といいます。 Web でも一般的に使われてますね。
「入力欄を記入をしてね」というのはどう言うかというと、
fill in form または fill out form
だそうです。
前者の fill in は、たとえばユーザ登録が必要な英語サイトで入力欄の近くに書いてあったりしますし、自分でも英語ネイティブの同僚にこのフォーム記入してと頼むときに使ったりしています。
そういうこともあって個人的には fill in が馴染み深かったのですが、英語の先生が言うには記入用紙とかの場合は fill out の方が合っていると。
といっても fill in が間違っているわけではなく、対象がすこし違うだけだそうです。
fill in は1つの記入欄に対して、「ここに記入してください」というニュアンス。
fill out は記入用紙など全体に対して「これらに記入してください」というニュアンスなんだそうです。
さっそく会社で使っている英語版のヒアリングシートの文章を直さねば。。
php でも変数宣言がしたいけど
普段はもっぱら Perl で開発をしてますが、担当しているプロジェクトには所々 php が混ざっているものもあります。
なぜかというと、発足当時の担当者の一人が php の人だったのです。
perl 覚えてもらう時間も人的リソースも限られているというか、切羽詰ってたので、あまり他機能と連動していない部分をやってもらうか、と開発してもらっていたわけで。
開発者はさり、プロジェクトはアクティブであり、現在にいたり、改修が求められる。
というわけで、たまに php の箇所をいじらないといけないけれど php は苦手。
苦手の一番の要因はあの動けばいい的なところかもしれない。
いつもは算出方法の変更とか、出力リストのデフォルト値変更とか、まあ文法そんなに知らなくてもロジックがわかれば何とかなる修正が多いが、さすがにそれでは変更しきれない改修がきた。
しょうがないから新しく関数作って拡張することにしたけど、変数宣言の仕方が分からんのですよ。
ECMA 系なら var とか perl なら my とか C なら int とか。
変数のスコープとか役割とかコード書いた人の目的とか気持ちとか、たくさんの情報が詰まっている変数宣言。
それがどうもないみたいなんだよなぁ。
strict に書かなければ変数宣言しなくていい、というのは他の言語にもあるけれど php って strict に書く方法がないのだろうか。。
php で strict にするにはどうするのかを調べると、設定ファイルいじればいいみたいなことが挙げられているのだけど、それは warning の出力レベルをどうするかの問題であって変数宣言を有効にするかどうかではないだろうと思う。
php のマニュアルのクラスオブジェクトについての箇所に、var を使えるよと書いてはあるのだけど、それは「クラス変数」を宣言する方法であって一般的なローカル変数などを宣言するときに使うと syntax error がおきる。
というわけで、結局あきらめて変数宣言なしのまま書いたけど、作り捨てるコードじゃないから後からメンテナンスする時に負荷が増えるよなぁ、なにかいい方法ってあるのだろうか。
php で strict 派な人にアドバイスがもらいたいなぁ。
他国のキーボード
今日から新しくオーストリアの人が会社に来ることになったので、いろいろ環境設定のお手伝いをした。
OS の言語設定は英語だとばかり思っていたのが、よく聞いてみるとオーストリアで使う言葉だそうで。
ぬ、それは何語だ、ドイツ語か? ウームラウト付いてたし、そうなのかも。
で、説明したアドレスを入力してもらおうと思ったら、y と z のキーの位置が入れ替わってた。
「なんでそんなわかりにくい入れ替えしてんの?」と聞いてみたら、オーストリアのキーボードはこれが普通。
y はあまり使わないから端っこ、だそうで。