2012年01月13日

ファイル名・パスの取り扱い

 今書いているスクリプトのファイルロック機構を作る上で、ファイル名・パスを一意で取得する必要があったためサブルーチンを作り始めたら、ちょっと横道に逸れたけど役に立ったのでメモ。
 個人的にスクリプト内部ではファイルをopenしたりする際には絶対パスを指定するのがよいと思います。ここでいう絶対パスというのは、"/"で始まり、"./"や"../"を含まないパスのこと。正規化というらしい。

 で、ユーザが入力した値(ユーザIDとかファイルナンバーとか)に基づいてファイルを扱う際に気をつけなければいけないのが、ディレクトリ・トラバーサル(cf.Wikipedia)です。ユーザから入力された値をチェックするのはまあ当然ですが、ファイルを取り扱う直前にもチェックを入れておきたいものです。

【続きあり】
posted by 鯖缶 at 01:30 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2012年01月11日

PATH_INFOと%2Fの関係

 CGIを呼び出す際、昔はパラメータをhttp://example.com/hoge.cgi?user=tom&key=valueと、?と&で繋げるのが常識だったわけですが、SEO的にサーチエンジンにも好まれないということでhttp://example.com/hoge/tom/valueといったあたかもディレクトリ構造であるかの様な表記が出てきました。(たぶんAmazonが先駆者だと思う)

 さて、http://example.com/hoge/tom/valueだとちょっとスクリプトがどこかわかりづらいので、http://example.com/hoge.cgi/tom/valueを例にとりましょう。"hoge.cgi"以降の情報を取得するには、$ENV{'PATH_INFO'}を使います。
#Script1
print $ENV{'PATH_INFO'};
【結果】/tom/value

これをパラメータとして取得するには、頭の/を落として、/でsplitしてやればいいわけです。
#Script2
my $param = $ENV{'PATH_INFO'};
$param =~ s/^\///;
my @data = split('/',$param);
print join('&',@data);
【結果】tom&value


【続きがあります】
タグ:Perl Apache
posted by 鯖缶 at 20:48 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

リファレンスされた配列の最後の添え字の取得

 ちょっとググり方が悪かったのか、すでに常識なのかはわからないけど、試行錯誤して解決したのでメモ。

 Perlにおいて配列の最後の添え字(番号)を取得するには、$#配列名(例:$#array)であることは基本中の基本です。
 では、リファレンスに入っている配列の最終番号を取得するにはどうしたらいいのか。

解法1:scalar関数を使う
my $lastnum = scalar(@$ref_array) -1;

解法2:$#でがんばる
my $lastnum = $#{$ref_array};


解法2の方がわかりやすいというかシンプルというか好み。
(区切りに{}が使えることを知らんかったよ・・・)

ちなみにこんな複雑なことも可能
my $lastnum = $#{$hash{'list'}};
# %hashの'list'の値に配列へのリファレンスが入っている場合
posted by 鯖缶 at 19:03 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2012年01月10日

/usr/bin/perl^M: bad interprete

今日新しいプログラムの開発に取りかかったところ、シェル上で
-bash: ./prova.cgi: /usr/bin/perl^M: bad interpreter: そのようなファイルやディレクトリはありません

というエラーが。
Apacheのエラーログにも
(2)No such file or directory: exec of '/hoge/prova.cgi' failed

とエラーが吐かれています。

/usr/bin/perlはちゃんとあるし、パーミッションも実行可能になっている・・・しかも他のスクリプトはちゃんと動いているのになぜか、と思っていましたが、

改行コードがCR+LFになっていました。改行コードをLFで保存し直してちゃんと動きました。

久々にイチから書き始めたとはいえ、基本的なところでした。
bad interpreterが出たら、まずは改行コードを疑ってみよう。(特にDOS(Windows)で書いてLinuxで実行している場合)


# ちなみにprova.cgiというのは、今新しく作っているプログラムです。
# ティロ・フィナーレと同じくイタリア語です。
# 英語でいうとtestですね。まあ、そういうコンセプトのプログラム
posted by 鯖缶 at 15:08 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2012年01月05日

スタードメインで.atを割引中

 SSL証明書の取得でお世話になっているネットオウルが提供するドメイン取得サイト、スタードメインで2012年1月31日18:00まで、各種ドメインを割り引き登録できます。
 今回の目玉は.at(オーストリア)の新規登録が680円でできることです。.atについては、前置詞の"at"や、@を連想させるとうことで、ccTLDではtoに次いで使いやすいと思います。そして、gTLDや.jpなどでは空いていないメジャーな名前も登録できる可能性があります。
 私のプライベートメールアドレスは、「名@姓.at」ですが、.jpは言うに及ばずgTLDはダメだったものの、.atが空いていましたのでバリュードメインで登録して使っています。今回、残念ながら移管や更新は割引の対象外ですが、これから家族のアドレスがほしいという人は登録を考えてみてもいいのではないでしょうか。
 ちなみに、私はバリュードメイン提供のDNSサーバを利用し、GoogleAppsで管理していますが、スタードメインでしたらDNSサーバに加えてメール転送が100個まで無料でついてきます。ついでに、10GB or 3GB+SQLのウェブサーバもついてきます。バリュードメインは4,430円(2012年1月5日現在)ですので、通常料金でも安いのです。atドメインの移管には対応していないようなのが悔やまれますが、他のドメインもバリュードメインよりも微妙に安いので、新たに取得する分はこっちで取ろうかとも思います。(移管の手間をかけるほどではないかな)
posted by 鯖缶 at 18:55 | Comment(0) | TrackBack(0) | その他 | このブログの読者になる | 更新情報をチェックする