« 2008年1月 | トップページ | 2008年8月 »

2008/02/22

楽天ブックスで送料無料にする方法



インターネットで買い物をすると、とても便利です。田舎に住んでいると、なおさらそうです(笑?)。田舎の場合、近所の本屋には、プログラムの本はほとんどゼロです。ですから、Amazonや楽天ブックスで買い物したりするのですが、問題になってくるのが送料の問題です。Amazonの場合、税込み1,500円以上で送料無料となるため、税込み1,470円の本を買おうと思った場合、非常に躊躇します。送料300円があるだけで悩みます。

送料無料にするために100円とか200円の本があれば良いのにと思ったことは何度あったか分かりません。

同様に、楽天ブックスでも税込み1,575円以上なら送料無料になるため、1,400円台の書籍が欲しい場合に非常に悩みますね。たったの送料250円がもったいなく感じます。ところが、つい今しがた知ったのですが、コンビニでの店頭受け取りを選んだ場合は、ご注文金額にかかわらず送料無料になるんですよね。ファミリーマートなら、ビデオ屋(韓国ドラマにはまっていて、よく「朱蒙」などを借りに行きます。)に行く途中にありますし、私には非常に都合が良いです。

コンビニで受け取るのも都合が悪いという場合は、送料を甘受するか、それとも100円とか200円の本を探すしかなさそうですが、楽天が公開しているAPIで価格検索ができるので、こんなのを作ってみました。

300円以下でも購入できる書籍(2008年2月22日現在、31円という本もありますね。)

絵本の場合、100円台も多いです。(お子様をお持ちの方向け)

| | コメント (0) | トラックバック (0)

2008/02/13

PHP・PEARでXMLを処理する

Amazonでアフィリエイトをしているのですが、Amazon.co.jpからメールが先日届きました。ECS 4.0に移行する案内メールは何度か送っているが、まだのようだから連絡してくれたとのことです。ECS 3.0は3月末で終了するという。ああ、すっかり忘れていたか、メールを見落としていました。

慌てて、ECS4.0でのXMLへのアクセス方法を調べてPHPプログラムを作り直してみました。ところが、なかなかうまくいきません。ECS 3.0の時は、xml_parse_into_struct関数を使ってやっていたのですが、Amazonのデータには、例えばある商品には「Availability」が設定されていても、設定されていない商品(=在庫が無い商品)がありますので、単純な配列の要素番号でのアクセスはバグります。Amazon Web Serviceでの開発を始めた数年前の時は、このような異常な?(というより、技量の低いプログラマーには不都合な)データは少なかったように思うのですが(そのようなデータがあった場合には、その都度、対処療法で対処していました。)、今回、ECS4.0用にいざ書き換えとうとして、いろいろ調べてみると、そのようなデータが非常に多いことに気づかされました。空データであれば、XMLデータの中に最初から入っていないようです。転送量を考えても、当然の仕様かもしれません。

xml_parse_into_struct関数の使い方が間違っている可能性もありますが、もはや対処療法では不可能ぽいので、別の方法を探ってみることにしました。PHP5ならSimpleXML関数が使えますが、私が使っているレンタルサーバはPHP4なので、使えません。そこで、PEAR(http://pear.php.net/package/XML_Serializer )を使ってみることにしました。私のレンタルサーバにもPEARがインストールされていることは分かっていたからです。

まず、XML_Serializerをダウンロードして、ローカルのPEARフォルダーの中の「XML」フォルダーにUnserializer.phpとSerializer.phpをコピーして、ローカルでのテストは成功しました。ところが、同じように、「XML」という名称のディレクトリーを公開サーバ上に作成し、そこにUnserializer.phpとSerializer.phpをアップロードしてみたのですが、「Fatal error: Call to undefined method: xml_parser->sethandlerobj() in /usr/home/*******/public_html/XML/Unserializer.php on line 852」のようなエラーが出てダメです。

もしかして、わざわざ、Unserializer.phpとSerializer.phpをアップしなくても、既に同パッケージはインストールされていて、使えるようになっているのかなと思って、ためしに両ファイルを削除してみると、今度は、「require_once("XML/Unserializer.php");」のところで、「main(XML/Unserializer.php) [function.main]: failed to open stream: No such file or directory
Fatal error: main() [function.require]: Failed opening required 'XML/Unserializer.php' (include_path='.:/usr/local/lib/php') in /usr/home/*******/public_html/test.php on line 2」となり、やっぱりダメです。サーバ事業者に連絡してXML_Serializerをインストールしてもらうか、自分のユーザー領域にコピーして使う(もちろん、sethandlerobjのエラーを解消しなければなりません。)しかないようです。

では、何でsethandlerobjのところでエラーになるのかなと思ってGoogleで調べてみたところ、原因はすぐに分かりました。

●undefined function: sethandlerobj() (Nega Diary)
http://www.ironhearts.com/diary/archives/001239.html
PEARの本体のバージョンが古いことが原因のようです。結構同じエラーではまった方も少なくないようで、852行目という数字まで一緒だったりします(ある意味、当たり前?)。レンタルサーバの事業者に連絡してPEAR本体をアップグレードしてもらうのもいろいろ面倒なので、WindowsのローカルサーバにあるPEARフォルダーを丸ごとサーバにアップし、「/usr/local/lib/php」ではなくて、そちらのパスを見に行ってもらうようにプログラムすることにしました。

ini_set関数ではうまくいかなかったので、.htaccessでinclude_pathを変更して、やっと動くようになりました。
php_value include_path "/home/******/public_html/php/PEAR"

のように.htaccessの中で設定しました。これでECS4.0にようやく移行できます。

| | コメント (0) | トラックバック (0)

2008/02/12

印刷禁止・テキストのコピー禁止の掲示板やブログの作成も可能になるPerl/CGIライブラリー

EIZO 液晶 テレビ 高画質 地デジ
掲示板やブログ上のコンテンツ保護・情報流出を防ぐ、HTMLソース難読化用Perlライブラリ「サーバサイドSHTML for Perl/CGI」をプランセスがリリースしました。Perl/CGIプログラムが出力(printやecho)するHTMLソースを出力前に、サーバ上でリアルタイムに難読化(≒JavaScript化)するというもの。

HTMLソースを難読化できるかだけでなく、右クリック禁止をはじめとして、印刷禁止・テキストのコピー禁止・PrintScreenキーの無効化などを盛り込むことができます。イントラネット内の掲示板やブログ、リリース前の商品に関する市場調査など情報が漏れてはいけない場面などで利用るという。

もちろん、完璧に保護したいと考えるのであれば、専用ブラウザ(右クリックが最初からできないというか、コンテクストメニューが最初から存在しない、シンプルすぎるブラウザでありながら、各種画面キャプチャーソフトの起動プロセスを終始監視することのできる専用ソフト。)を開発するしかないと思います。そして、「その専用ブラウザでしか、私どものサイトを閲覧できません」とサイト訪問者に説明し、専用ブラウザの使用を強要するという方法しかないと思いますが、これは、いろいろな意味でかなり大変です(イントラネットであればある程度の強要は可能だと思いますが、費用はかなりかかると思います。ちなみに、「サーバサイドSHTML for Perl/CGI」は72,000円~)。

さらに言えば、漏れたくないコンテンツならば、「究極の話・公開しなければ安全であり、それが唯一の方法である」と言えるかもしれませんが、そのような虚無的な選択肢は「無し」とするのであれば、JavaScriptで出来る限りのことをやるという結論になるかと思います。

| | コメント (0) | トラックバック (0)

2008/02/07

Perl/CGIでデータの改行コードが0x0D0x0D0x0A(\r\r\n)になった場合の原因と対策

Apple Store(Japan)
Windows Vistaのテストサーバで最近、Perl/CGIのテストをいろいろやっています。そんな中、テキストファイルにデータを書き出すという単純なプログラムで、改行コードが変てこになる現象に遭遇。ここ数年、PHPばっかりやっていたためにPerlのお作法をすっかり忘れてしまっているみたいです。

秀丸でファイルを開いてみると、改行が増えています!! 1回しか改行していないところは2行になっていますし、1行空白行を作っている場合は、3行空いています。何だこれは? バイナリーエディタで見てみると、改行の部分が「0x0D0x0D0x0A(\r\r\n)」(0x0d0d0a)になっています。調べてみたら、すぐに原因が見つかりました。

● とほほのperl入門(概要編)
http://www.tohoho-web.com/wwwperl1.htm

Windows上で上記のスクリプトを実行した場合、STDOUT や OUT への出力は \n が \r\n に自動変換されて書き込まれます。これをテキストモードと呼びます。この自動変換を行わないようにしたい時は binmode()を用いてバイナリモードにしてください。

このサイトのおかげで一発で解決できました。PHPではこのような現象は起きたことがなかったので気づきませんでした。また、Perl/CGIをメインに使っていた数年前は、Windowsにテストサーバを準備してという技量もなかったので、直接、Unix系サーバにアップロードしてテストしていた(今考えると恐ろしい。)ので、こういう問題に気づきませんでした。まさしく、「とほほ」な感じです。

Perlって使いにくいなと思いましたが、PHPでも、4.3.2以前の出力モードは環境依存だったようです。

● 開発規約/95 - BugbearR's Wiki「テキストモードとバイナリモードの区別を明確にする。(改行コードの取り扱い) 」
http://www.bugbearr.jp/?%E9%96%8B%E7%99%BA%E8%A6%8F%E7%B4%84%2F95

調べてみると、PHPのマニュアル「fopenの項」にも、そのいきさつが明記されていますね。まだまだ勉強しなければならないことが多そうです。とほほ。

| | コメント (0) | トラックバック (0)

« 2008年1月 | トップページ | 2008年8月 »