DB:: レコメンド機能を提供するSQL文

ECサイトやブログなどにあるオススメ内容を表示するレコメンド機能を提供するSQL文を見つけたのでメモ。

OKWaveの質問内容を参考にしましたが、テーブルの自己結合ってあるんですね~。

★レコメンド機能用SQL文
     SELECT x.商品コード ,
                 y.商品コード ,
                 count(*) AS 購入数
       FROM 注文テーブル  (nolock) AS x,
                注文テーブル  (nolock) AS y
     WHERE x.商品コード <> y.商品コード 
         AND x.顧客番号 = y.顧客番号
         AND x.商品コード = '0123456789012'
GROUP BY x.商品コード , y.商品コード 
ORDER BY x.商品コード , 購入数;

※対象の商品コードのレコメンド商品がなければ、売れ筋商品を表示、または、同カテゴリの商品を表示する、などをしないといけないですね。

PHP:: ページャーの実装

Googleの検索結果が膨大な場合、Goooooooogle(0 1 2 3 4 ....)みたいにページを表示していますが、これをページング処理といい、ページング処理を行う関数をページャーというようです。
※間違っていたらゴメンなさいm(_ _)m

ページャーという言葉自体知らなかったんですが、同じように悩んでいる人が多いみたいで。

解説されたページがあったのでメモ。

<< < 1 / 100 > >>みたいな簡単なページャーを実装してみましたが、結構簡単にできました。

PHP:: XSSとSQLインジェクションの対策

以前書いたプログラム入力チェックでもWeb開発を行う上で「セキュリティ対策」は必須と書きましたが、PHPでの対策を行う上で必要な関数をメモ。

自作関数を作ろうかと思いましたが、準備されているようでしたので。。。
  1. XSS対策~htmlspecialchar~
    入力内容に<や>、&、’などの特殊文字をエスケープ処理する。
    htmlspecialchar($str, ENT_QUOTES);
    ENT_QUOTESは必須。シングルコーテーションも&#039;にエスケープします。

    ただし、クライアントJavaScriptでエスケープ内容を表示するとエラーになる可能性があります。そのときは、addslashes関数をかましましょう。
  2. SQLインジェクション対策~pg_escape_string~
    SQLインジェクション対策の手法はいろいろありますが、DB側で用意しているエスケープ処理をするのが簡単&安全です。
    ※そこにバグがあれば、まずいですけど・・・

    PostgreSQLの場合は、pg_escape_stringを使います。MySQLなども同等の機能を用意していますね。
SQLインジェクションについては、カスタム関数を作るもの一つです。
ただし、自分なりに納得できる関数がなかなか作れなかったのが残念ですね・・・

何にしても、外部からの怪しいアクセスに対して万全であることが大切です。

Windows:: Win2000SV IISからのエラー

Windows200ServerのIISから下記のようなエラーがでました。

どうもCOM+ アプリケーションパッケージの起動ID(IWAM_USER)をリセットするとエラーが出なくなるようです。

一度リセットしたことでエラーはでなくなりました。

★エラー内容
イベントID 10004
メッセージ DCOMでエラー"重複した I/O 処理を実行しています。" が発生しました。サーバー:{xxxxxx}を実行するため に.\IWAM_xxxx をログオンできませんでした。

イベントID 36
メッセージ サーバーはアプリケーション'/LM/W3SVC/1/ROOT'の読み込みに失敗しました。エラーは'構成された IDが間違っているため、サーバープロセスを開始できませんでした。ユーザー名とパスワードを確認してください。'でした。

★対応
c:\inetpub\adminscripts>cscript.exe synciwam.vbs
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=14186&forum=6

PHP:: 変数のキャスト

PHPでの変数のキャストのやり方をメモ。

キャストは、string(文字列)、bool(論理型)、int(整数型)、float,double(浮動小数点)、array(配列)、object(オブジェクト)があります。

★サンプル~文字列にキャスト~
$data = (string) 1;

Web:: 今さら・・・という感じがするASPのTips

久しぶりにクラシックASPを触りましたが、PHPのようにクラスを使えないか調べていた際にMSが情報提供する「パフォーマンスとスタイルに関する ASP 25+ の Tips」という古い記事を発見。

今さらクラシックASPを勉強するのはどうかな~と少し思いつつ読んでみたところ、基本的な内容ながらパフォーマンスを向上させるためにはどうすればいいか?!という内容が多く、勉強になりました。

特にResponse.Writeの使い方は、ダメな記述方法を書いてしまっている箇所が結構あるので修正せねば・・・

後、Tips系サイトと気になったサイトをメモしておきます。
  1. ASP - Global Wiki
    http://www.betatechnology.jp/pp/index.php?ASP
  2. Jscript Tips
    http://www.imasy.or.jp/~hir/hir/tech/js_tips.html
    ※JScriptってGCあるんですね。推奨されていないようですが・・・
  3. MVCフレームワーク「ピイタン」
    http://peetan.cre8labs.com/
    クラシックASP用MVCフレームワークがありました!!!
    これでMVCモデルでの開発が可能。でも、言語はVBScriptになります。
追伸 Tipsの25番目は売り込みなんだけど、MSの遊び心?が感じられました。こういうの、結構好きなんですよね。

Web:: MXレコードとCNAME

前回の記事「正しいメールアドレスの条件」に関連した内容。

メールアドレスのドメイン部の存在チェックは、「MXレコード、またはAレコードで解決しなければならない」 のですが、とあるサイトではMX・A・CNAMEの3種類でチェックをかけているスクリプトを発見しました。

RFCで規定されているからCNAMEはだめなんだろうけど、なぜだろうと調べてみました。

ひじきねっとさんの「DNSのCNAMEレコードの誤った使い方(Internet)」のあたりが答えかもしれませんね。
後、MSのDNSのMX レコードとCNAMEとかも。

Web:: 正しいメールアドレスの条件

メールアドレスの正規表現について調べている際、「正しいメールアドレスの条件」なる記事を発見。

管理人のj0hnさんの記事を読んで、あたしゃーメールアドレスの仕様を理解してなかった・・・と痛感しました。

覚えておかなければならない内容と痛感した内容をメモしておきます。
  1. メールアドレスとは
    メールアドレスは、local_partと@とdomainで構成されている。
  2. domainの仕様
    domainは、labelがドットで区切られたもの。
    domainは、アルファベットで始まり、最後はアルファベットか数字で終わる。
  3. local_partの最大長
    64文字
  4. labelの最大長
    63文字
  5. domainの最大長
    255文字
  6. domainの存在チェック
    domainの存在チェックは、MXレコード、またはAレコードで解決できなければならない。
今までアカウント部と言っていた部分が正確にはlocal_partというそうです。
そして、domainの最後尾の文字が数字OKっての始めて知りました・・・

まだまだ知らないことが多いですね・・・

Web:: Apache Errorログの表示

ApacheのErrorログのみを抽出し、ブラウザ上から確認出来るApache Error Log Formatter「ErrorLog.cgi」なるものを教えてもらいました。

php.iniのdisplay_errorsがfalseになっている環境で、かつ、Apacheのエラーログが参照できないユーザに提供する際に有効です。

PHP:: 引数付き関数で引数なしで実行

最近になってやっとMVCモデルの使い方を分かってきましたが、PHPの基本的な知識がまだまだ不足しています。

そんな中、 引数付き関数で引数なしで実行しようとすると
php Warning: Missing argument 1 for 関数名
というエラーが表示されました。

そのままですが、とある関数の第1引数がないぞと!という警告です。

対応ですが、関数の引数がなしの場合は関数の引数部にデフォルト値をセットするようにします。

function sample( arg = デフォルト値){
 ~処理~ 
}

ガリガリかけるようになるまで時間がかかりそうだな~

DB:: PostgreSQL ODBCドライバと管理ツールPgAdminのダウンロード

PostgreSQLをちょいちょい使い始めましたが、ネイティブ接続ができないためODBCで接続するようにしています。

ODBCドライバと管理ツールPgAdminののダウンロードサイトをメモしておきます。

★PostgreSQL ODBC Driver
http://www.postgresql.org/ftp/odbc/versions/msi/

★管理ツールPgAdmin
http://www.pgadmin.org/

Flash:: LoadVarsのonDataとonLoadの違い

以前から使っているFlash8ですが、LoadVarsのonDataとonLoadの違いをしっかり把握していなかったので、この機に勉強してみました。

違いは、実行される順番で、
onData => onLoad
の順番で実行されます。

今までonLoadを使っていたスクリプトを全てonDataに書き換える羽目に。

この作業を行った原因は、.htaccessでHTTPコード403や404のリダイレクト処理を適用したところ、LoadVarsで画像をロードする処理結果は今までは404でしたが、適用後は200として処理されたためです。

ロード系については、一度中身を確認した上で処理した方がいいかもしれませんね。

処理を入れていると入れてないでは、後々のダメージが変わってくるので・・・いい経験になりました・・・

Windows:: プロファイル失敗した場合のデスクトップ

ドメインに参加している端末(例としてWindowsXP)でログインをしたところ、デスクトップがまっさらになっている現象が発生しました。

以前もログインユーザのプロファイル破損で%Documents and Settings%\user.xxxxのようなフォルダが新規作成される件がありましたので同じところを探してみたところ、以前と異なり今回は%Documents and Settings%\TEMPのフォルダが出来てました。

Microsoftのサポートセンターで調べてみたところ、ドメイン参加している端末で同じような現象の記事がありました。

記事にあったとおりでしたが、どうもプロファイルのロードに失敗?した場合、一時的に作成されるTEMPプロファイルでデスクトップを表示、再ログイン→成功するとTEMPフォルダ内のデータはほぼなくなっている状態。

プロファイルのロードに失敗?した直接的な原因は分かっていませんので、後でゆっくり調べてみたいと思います。

Web:: IIS7.5上でクラシックASPの詳細エラーが表示されない

Windows7で稼働しているIIS7.5クラシックASPを実行させたところ見慣れないエラーが表示されました。
An error occurred on the server when processing the URL. Please contact the system administrator. If you are the system administrator please clickhere to find out more about this error.
IISマネージャ→ASP→デバックプロパティを見ると
ブラウザへのエラー送信を無効
が原因でした。
スクリプトエラーメッセージの項目をみると上記エラー内容が入力されています。
エラー送信を有効にしたところ、いつものエラーが表示されました。
運用が開始したら無効にして問題ないけど、開発中はちょっと困っちゃいますね。

Web:: PHPからSQLServerへの接続

PHPから既存のSQLServer2000 or 2005へ接続する際、mssql_connect関数を使えばいいと参考書等に記載されていますが、どうも接続できない!!!

ドライバ周りによってとありましたが、バックエンドで接続するだけなのでODBCを使ってみました。

ODBCは即繋がりましたので、とりあえずこっちを使っていきたいと思います。

大雑把な流れをメモしておきます。
//ユーザ情報
$dsn  = データソース名;
$user = 'sa';
$pass = 'xxxxx';

//接続
$conn = odbc_connect($dsn, $user, $pass);

//SQL文
$sql = "SELECT hoge FROM hogeDB (nolock) ";
//SQL実行
$result = odbc_exec($conn, $sql);

//結果
while(odbc_fetch_row($result)){
 echo odbc_result($result, 'hoge');
}

//切断
odbc_close($conn);

Web:: クラシックASP UTF-8で出力

以前から使っているクラシックASPですが、最近ではPHPがメインになってきています。

まだまだMVCモデルの開発手法で四苦八苦しながらやっていますが、オブジェクト指向の良さを実感しています。
※そういえば、初めてオブジェクト指向というコトバを聞いたのは今から10年くらい前だな~

そんな話はさておいて、クラシックASPで作成したHTMLファイルをPHPでロードする際、文字コードの問題が出てきました。

ASPはShift-JIS、PHPはUTF-8と文字コードが異なりますので、ASP側をUTF-8で出力する形を調べてみました。
  1. @CodePagの変更
    <%@ CODEPAGE=932 %> //Shift-JIS

    <%@ CODEPAGE=65001 %> //UTF-8
  2. ASPファイルの保存形式変更
    保存形式をShift-JISからUTF-8へ変更します。
    サクラエディタなどで変更できます。
  3. CSSのUTF-8化
    CSSファイルの先頭に@charset = 'utf-8';を付け加えます。
  4. HTML charsetの変更
    charset=shitf-jisからcharset=utf-8に変更します。
上記通りですが、一番の注意点は@codepageとファイルの保存形式を同じにしないと文字出力ができないとMSのサポートオンラインに記載されていました。

これで文字コードの悩みが解決できるはず・・・

2010.05.05 Update!!!
リストの2番目ですが、Adobe DreamWeaver CS3でクラシックASPのCodePageを修正+保存しただけで自動でUTF-8に保存してくれました。
4番目は手動修正しないとダメでしたけど・・・

1~4番目を全て行ったところ、UTF-8で出力できました。

JS:: ブラウザの表示領域を取得する

各ブラウザで表示領域の取得方法が異なるため、カスタム関数を作成。

★横幅の取得
function getBrowsWidth() {
     if ( window.innerWidth ) {
             return window.innerWidth;
     }
     else if ( document.documentElement && document.documentElement.clientWidth != 0 ) {
             return document.documentElement.clientWidth;
     }
     else if ( document.body ) {
             return document.body.clientWidth;
     }
     return 0;
}
★高さの取得
function getBrowsHeight() {
     if ( window.innerHeight ) {
             return window.innerHeight;
     }
     else if ( document.documentElement && document.documentElement.clientHeight != 0 ) {
             return document.documentElement.clientHeight;
     }
     else if ( document.body ) {
             return document.body.clientHeight;
     }
     return 0;
}

スポンサーリンク