1 | 2 | 3 | 4 | 5 >>

2007年04月10日

安直なスロットマシンです。
通常、Webのスロットマシンというと、FLASHやJava Applet等で作成することが多いと思いますが、JavaScriptさえ使わず、PHPとアニメーションGIFのみを使用しています。

昔、PerlのCGIで同じようなスロットマシンを作ったのですが、今回のはPHP版。
単にrand関数で乱数を取得して表示しているだけというプログラムなのですが、ミソはアニメーションGIFで、それだけでそれっぽく見せることができます。

回転中のGIFアニメとボタンを押した後にだんだん止まっていくGIFアニメを数字の数だけ用意して、乱数で取得した数字にそれぞれのGIFアニメを割り当てています。

スロットマシンサンプル

上記サンプルのソース

PHPで作成する利点は、データベースとの連携(例えば当たりを何個出すかという出玉の管理)がしやすいことでしょう。
今回の画像は適当に数字のみで作りましたが、これを王冠やくだもの、BAR等の絵にして、GIFアニメの動きを工夫すれば、より「らしく」見えると思います。

投稿者 Utayume : 12:28 | トラックバック (0) | 05 Work(Perl, PHP, etc)

2007年02月21日

仕事で作っているサイトにGoogle Mapsを使うことにして、MySQLとPHPでプログラムを作ったものの、何故かInternet Explorerでは地図が表示されないのです(IE6でもIE7でも同様)。以下のスクリーンショットのように、コントローラーのみが表示される状態になります。Safari、Firefoxでは正常に表示されます。

070221googlemap_ie.jpg

Googleで調べてみるとGoogle MapsのJavaScriptを全て関数にしてhead内に埋め込めば良いとか、文字コードの問題とか出てくるのですが、ワタクシの作ったものはJavaScriptは全て関数にしてありましたし、文字コードもutfで統一(DBはeucですが、PHPで変換して出力)してありました。検索しても同じようなケースを見つけられず、コードを単純化したり、2日間悩んだあげく、やっと原因を突き止めることができましたのでブログに記載しておきます。

結果的にはJavaScriptの問題ではなく、IEにおけるCSS等の名前空間の管理の仕方の問題だと思われます。

<a name="gmap"></a>
<div id="gmap"></div>

上記のような指定でGoogle Mapsを呼び出すCSSのid名とhtmlのアンカータグ名が同一名の場合に、IEでは地図が正常に表示されません。
aタグのnameをidとは別の名前にしたら正常に表示できるようになりました。

なんじゃそれ、って感じですが、後から確認したらOperaでも同様の現象を確認できましたので、必ずしもIEのバグとは言い切れないのかもしれません。

教訓として、今後名前を付ける際は、違う概念であっても別の名前を付けましょう、と。

参考までに、以下が表示できないサンプルです。
IEで表示できないGoogle Mapsサンプル

投稿者 Utayume : 01:24 | コメント (5) | トラックバック (0) | 05 Work(Perl, PHP, etc)

2006年11月29日

Expedia.co.jp: エクスペディア
asahi.com:ネット旅行予約世界最大手、日本向けサービス開始 - ビジネス

 インターネットの旅行予約サイト世界最大手の米エクスペディアが29日、日本語版サービスを開始した。海外ホテルの予約受け付けから始める。

黒船来航です。日本の旅行業界としては、ついにきたかという感じ。
某旅行会社のサイトを作っているワタクシとしても他人事ではないです。

旅行業界人ではなくWebプログラマなワタクシとしては、3年前からあまり変わっていないExpediaのUIよりもAJAXバリバリのPAGUNA.comのほうが興味があります。


そろそろワタクシも潮時か……

投稿者 Utayume : 20:37 | トラックバック (0) | 05 Work(Perl, PHP, etc)

2006年05月15日

phpでマルチバイト(日本語)の文字を判別にはmb_eregを使えば簡単なのですが、php4ではmb_eregはデフォルトでは使えず、phpのインストール時に「--enable-mbregex」としてconfigureしなければいけません。現状ではphp5がインストールされているサーバーや「--enable-mbregex」でconfigureされたphp4サーバーはまだ少ないので、mb_eregが使えない場合は、以下のようにpreg_match関数のPerl正規表現で文字コードを判別します。Perlプログラマでしたらおなじみですね。

他のWebサイトではmb_eregを使った例ばかりなので、今更ではありますが、参考までにpreg_matchでの例を記述してみます。


後述のサンプルスクリプトで使用する変数は以下です。文字コードはEUC-JP。
<?php
 $str1 = mb_convert_encoding('あいうえお',"EUC-JP","auto");
 $str2 = mb_convert_encoding('アイウエオ',"EUC-JP","auto");
 $str3 = 'abcde';
?>


ひらがなの判別(mb-egreg)

※全てひらがなで1文字から5文字であればTrue
<?php
 $result1 = mb_ereg("^[ぁ-ん]{1,5}$",$str1);
 $result2 = mb_ereg("^[ぁ-ん]{1,5}$",$str2);
 $result3 = mb_ereg("^[ぁ-ん]{1,5}$",$str3);

 var_dump($result1);
 var_dump($result2);
 var_dump($result3);
?>
[実行結果]

int(1)
bool(false)
bool(false)


ひらがなの判別(preg_match)

※全てひらがなで1文字から5文字であればTrue
<?php
 $result1 = preg_match("/^(\x82[\x9F-\xF1]){1,5}$/i",$str1);
 $result2 = preg_match("/^(\x82[\x9F-\xF1]){1,5}$/i",$str2);
 $result3 = preg_match("/^(\x82[\x9F-\xF1]){1,5}$/i",$str3);

 var_dump($result1);
 var_dump($result2);
 var_dump($result3);
?>
[実行結果]

int(1)
int(0)
int(0)


カタカナの判別(mb-egreg)

※全てカタカナで1文字から5文字であればTrue
<?php
 $result1 = mb_ereg("^[ァ-ヶ]{1,5}$",$str1);
 $result2 = mb_ereg("^[ァ-ヶ]{1,5}$",$str2);
 $result3 = mb_ereg("^[ァ-ヶ]{1,5}$",$str3);

 var_dump($result1);
 var_dump($result2);
 var_dump($result3);
?>
[実行結果]

bool(false)
int(1)
bool(false)


カタカナの判別(preg_match)

※全てカタカナで1文字から5文字であればTrue
<?php
 $result1 = preg_match("/^(\xA5[\xA0-\xF6]){1,5}$/i",$str1);
 $result2 = preg_match("/^(\xA5[\xA0-\xF6]){1,5}$/i",$str2);
 $result3 = preg_match("/^(\xA5[\xA0-\xF6]){1,5}$/i",$str3);

 var_dump($result1);
 var_dump($result2);
 var_dump($result3);
?>
[実行結果]

int(0)
int(1)
int(0)


SJISやその他の文字コードの正規表現は以下を参照。
Produce by Sieg: [Perl での正規表現]

投稿者 Utayume : 15:19 | トラックバック (1) | 05 Work(Perl, PHP, etc)

2006年05月11日

PHP: マジッククオート - Manual

PHPではGET、POST、COOKIEへの入力時に「全ての' (シングルクオート), " (ダブルクオート), \ (バックスラッシュ)およびNULL 文字がバックスラッシュで自動的にエスケープされます」。
これはPHPのデフォルト設定であり、この設定があるために、PHPではSQLインジェクションの危険性が軽減されます。おそらくMSのASP(Active Server Pages)ではこのような設定がない(ASPについてはよく知りませんけど)ために、SQLインジェクションが多発しているのだと思います。(この設定があるからと言って、必ずしもPHPが安全というわけではありません)

逆にPHPでの開発時にこのことを知っておかないと、明示的にエスケープした際に二重にエスケープされてしまうということが起こります。(「\」という文字が「\\\」になる)
機能的にはaddslashes関数と同一ですが、ある程度PHPでの開発に慣れてくると、却ってこの設定が開発の自由度と効率を失わせてしまうので、php.iniでoffにするか、stripslashes()でエスケープを削除した上でmysql_real_escape_string関数htmlspecialchars関数等で入出力箇所に合ったエスケープをした方が開発しやすくなります。
もちろん、設定をoffにする場合は、その危険性を十分に認識した上で行ってください。

投稿者 Utayume : 15:05 | コメント (2) | トラックバック (0) | 05 Work(Perl, PHP, etc)

2006年04月19日

Ajax : サーバー上のテキストデータを読み込み表示する

クリックしてください(悪意はありません)


なるほどねぇ。
IE7だと動いたけどIE6だと動かないのかな?もちろんFirefoxなら動きます。
ページ全体を再読込せずに一部だけを動的に書き換えるというAjaxの基本的なやりかたです。Gmailでおなじみ。
この程度ならXMLHttpRequestを使わなくても可能ですが、まぁわかりやすい感じで第一歩。
流行だからちゃんとやってみようかなーと思ったり思わなかったり、どっちなんだ。

投稿者 Utayume : 18:29 | トラックバック (0) | 05 Work(Perl, PHP, etc)

2006年03月13日

世の中Web2.0ですよ。
とか、わかったようなことを言ってみたりして。

Web2.0 BOOKWeb2.0 BOOK
小川 浩(サイボウズ株式会社) 後藤 康成(株式会社ネットエイジ)

by G-Tools

実際、ワタクシが仕事で作っているサイトでも、他サイトとのxmlを使ったデータ送受信システム作成を依頼されているのですが、まだ実装に至っておらず。いや、もちろんxmlの送受信に関しては別に難しくはないのですが、それを今までのシステムに組み込むとなるとなかなかめんどくさいなーと思ったりするわけです。

でもさ、xmlはいいとしても、ajaxとなるともうワタクシにはお手上げです。そもそもJavaScriptが大嫌いなワタクシです。ajaxなシステムを作れと言われたら夜逃げします。

ってほとんどの人はこのエントリーの意味がわかりませんね。
Webを使うだけの人には全く知らなくてもよいことです。もし興味がありましたら上記の本をご覧ください。
要は、Webは日に日に進化しているってことさっ!

投稿者 Utayume : 17:59 | トラックバック (0) | 05 Work(Perl, PHP, etc)

2006年02月10日

PEACH JOHN: 携帯サイトにおけるお客様情報閲覧事故に対するお詫び

2月5日、auおよびVodafoneの携帯端末をご利用のお客様より『注文履歴の確認をするためアクセスしたところ、自分のものではなく他のお客様の履歴画面が表示されてしまう』とのお問い合せがありました。これを受けまして弊社で事態の確認を進めましたところ、2月5日に行った、au及びVodafone携帯サイト機能向上のためのプログラム修正の中に、不具合があり、それにより他のお客様の履歴画面が一部閲覧できる状態が発生していたことが判明しました

クロスサイトスクリプティング、あるいはクロスサイトリクエストフォージェリですね。
おそらくセッションの入出力方法に問題があったと思われます。
「クレジットカード番号の全てが閲覧対象となった可能性は最大70件あり」っておそろしいことも書いてあり、根本的なプログラムの仕様やDBの作りにも問題がありそうです。

少なくともワタクシが作っているサイトではこのようなことは起こりえませんが、認識していないセキュリティホールが存在している可能性はゼロとは言えず(どんなプログラムでもそうですが)、他人事ではなく、いつもビクビクしています。

投稿者 Utayume : 17:41 | トラックバック (0) | 05 Work(Perl, PHP, etc)

2006年02月03日

仕事で作っているサイトにxml-rpcを実装することが急務になってきたので、本格的に勉強しはじめました。
Webでxml-rpcを検索すると、phpへの実装はpearを利用するか、XML-RPC for PHP等の外部モジュールを使った例ばかりです。確かにプログラムするにはそのほうが楽かもしれないのですが、これだと自分がどのようなxmlを送信しているのかわかりにくい上に、pearやモジュールの読み込み自体でプログラムが重くなる(小規模サイトなら構わないのですが、ワタクシが作っているサイトは1日のPVが30万)ために、必要な部分だけを自分でプログラムすることにしました。
xml-rpcの仕様自体がxmlをPOST送信してxmlを受信するというシンプルな構造であるため、phpの組み込み関数のみでこの機能を実装することはそう難しいことではありません。

参考文献としては以前も紹介した、

自分で作る blog ツール自分で作る blog ツール
石川 直人

by G-Tools

参考文献でお気づきのようにxml-rpcは、いわゆる“ブログ”の中核をなす技術でもあります。――例えば更新pingやトラックバック(通常トラックバックはxmlは使用せずに文字列を単純にpostしているだけです)といったブログ独自の機能はxml-rpcを利用しています

テストとして、郵便専門ネットをXML-RPCで活用する - 郵便専門ネットのxml-rpcサーバーを利用しました。郵便番号から住所を検索するサイトです。このサイトをxml-rpc利用する実例としては、個人情報入力フォームなどで、郵便番号を入力するだけで該当する町名まで自動入力するという場合に、プログラム上でこのサーバーに接続して住所を検索すれば、自分のサイトで膨大な郵便番号データベースを持つ必要がなくなります。

以下のサンプルプログラムで、郵便番号から住所検索します(デフォルトで入力されている「1631480」はアップルコンピュータ株式会社の郵便番号)。表示は生のxmlですので、実際の運用時にはxmlをパースする必要があります。
※当然のことならがら、郵便番号から住所をピンポイントで特定できるのは登録されている一部の法人のみです。

サンプルプログラム

この程度ならば、以下のようなシンプルなプログラムで実現できます。
f_sendxml()という関数が実際にxmlをpostするプログラムで、第一引数にpostするxml、第二引数に送信先urlを指定します。

サンプルプログラムソース


<?php
$postto  =  'http://yubin.senmon.net/service/xmlrpc/';

if(is_numeric($_POST['postcode'])  &&  7  ==  strlen($_POST['postcode'])){
    $postxml  =  '<'  .  '?xml  version="1.0"  encoding="utf-8"  ?'  .'>'  .  "\n";
    $postxml  .=  <<<EOM
<methodCall>
        <methodName>yubin.fetchAddressByPostcode</methodName>
        <params>
                <param>
                        <value>${_POST['postcode']}</value>
                </param>
        </params>
</methodCall>
EOM;
    $returndata  =  f_sendxml($postxml,$postto);
    header("Content-Type:  text/xml;  charset=UTF-8");
    print  $returndata;
}else{
    print  "引数が不正です";
}

function  f_sendxml($postxml,$postto){
    $xml_length  =  strlen($postxml);
    
    $ch  =  curl_init($postto);
    
    $urlinfo  =  parse_url($postto);
    $header  =  'POST  '  .  $urlinfo['path']  .  '  HTTP/1.1'  .  "\r\n";
    $header  .=  'HOST:  '  .  $urlinfo['host']  .  "\n\r";
    $header  .=  'Content-Type:  text/xml;  charset=UTF-8'  .  "\r\n";
    $header  .=  'Content-Length:  '  .  $xml_length  .  "\r\n";
    curl_setopt($ch,  CURLOPT_CUSTOMREQUEST,  $header."\r\n"  .$postxml);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    

    $returndata = curl_exec($ch);
    curl_close($ch);
    

    return  $returndata;
}

?>

投稿者 Utayume : 22:56 | トラックバック (0) | 05 Work(Perl, PHP, etc)

2006年01月27日

.mac blog:最新のブラウザをお使いですか?

もしアップルが推奨するブラウザを使っていて機能しないサイトを見つけたら、 苦情を申し立てましょう。 そのサイトが、 Web 上でもっとも進化したものに対応できるブラウザでもうまく機能しないのはなぜなのか、 サイトオーナーに説明を求めるとよいでしょう。

素晴らしいサジェスチョンです。
ということで、去年11月のリニューアル以来ダメダメサイトのDHCに近々クレームを入れよう。Webクリエーターの端くれのワタクシとしては、こんなサイトを放置しておくわけにはいきません。DHCサイトの左のメニューがSafariでもFirefoxでも「うまく機能しないのはなぜなのか、サイトオーナーに説明」していただきたいです。

コエンザイムQ10

と言いつつ、アフィリエイトバナーも貼っておく。(笑)

投稿者 Utayume : 13:43 | トラックバック (0) | 04 Blog /05 Work(Perl, PHP, etc) /Macintosh

1 | 2 | 3 | 4 | 5 >>