2010年7月29日木曜日

"はなまるメールフォーム"の拡張

メールフォームが必要な場合に使っているライブラリ。PHP4で動く(5でも動くかは知らない)

チェックボックスのような複数選択項目を処理する場合は、下記のようなコードを追加すればOK。


hnmailform.php:

function initData($posts){//入力データを初期化する
...
  $keys = array_keys($posts);
  foreach ($keys as $k){
    if(is_array($posts[$k])){
      $posts[$k] = implode(", ", $posts[$k]);
    }
  }
...

html:

htmlのコード:

<input type="checkbox" id="item1" name="チェック項目[]" value="あ" checked="checked" /><label for="inqtype1">あ</label>
<input type="checkbox" id="item2" name="チェック項目[]" value="い" checked="checked" /><label for="inqtype2">い</label>
<input type="checkbox" id="item3" name="チェック項目[]" value="う" /><label for="inqtype3">う</label>

perl: warning: Setting locale failed.

Perlコマンド実行で警告が出る場合、以下のように環境変数を設定する。

$ export PERL_BADLANG=0

SSLとIEの組み合わせでファイルダウンロードができない問題

よくある問題。

XOOPSの掲示板モジュールでも発生したから、キャッシュを有効にするコードをいれた。

xoops_trust_path/modules/attachfile/include/attach_functions.php:
        header( "Cache-Control: public" );
        header( "Pragma: cache" );

2010年7月25日日曜日

EmacsキーボードマクロのTips

以下の関数を活用して、キーボードマクロの再利用を促進しよう。

  • (name-last-kbd-macro symbol): 名前をつけてM-xで呼び出せるようにする。
  • (insert-kbd-macro macroname &optional keys): この関数の出力を.emacsに貼っておけば、Emacsを終了しても大丈夫。

2010年7月20日火曜日

CakePHPでCSVをデータソースにする

参考


なお、例示されてるコードにはPHP4で動かない箇所がある。
  • "private"修飾子
  • foreach文での参照記法("&$l")

DBに接続できないというWarningが出たので"app/config/datagbase.php"を一部コメントアウトした。今回のシステムではDBを使わないので問題ないはず。
/*
 var $default = array(
  'driver' =>'mysql',
  'persistent' => false,
  'host' => 'localhost',
  'login' => 'user',
  'password' => 'password',
  'database' => 'database_name',
  'prefix' => '',
 );

 var $test = array(
  'driver' => 'mysql',
  'persistent' => false,
  'host' => 'localhost',
  'login' => 'user',
  'password' => 'password',
  'database' => 'test_database_name',
  'prefix' => '',
 );
    */

2010年7月16日金曜日

JavaScript文字列検索のバリエーション

indexOfメソッドか正規表現(RegExpオブジェクト)を使う。

RegExpオブジェクトはnewせずにリテラルをスラッシュで囲む方法もある(静的な正規表現)。

for (var i = 0; i < 3000; i++) {
    //var m = str.indexOf('item:9999');           // (1) indexOf
    //var m = /item:9999/.exec(str);             // (2) 静的な正規表現
    //var m = new RegExp('item:9999').exec(str); // (3) 動的生成の正規表現
    //var m = /item:9999$/.exec(str);             // (4) 正規表現 (3/31 追加)
}

4番目は、わざと正規表現のメタキャラクタを入れて最適化を無効にしている。

RgeExpに関しては、存在確認だけならexecよりtestを使うほうが行儀がいい。

GoogleAdwords経由かどうか判定

クッキーの「__utmz」を利用して、どうにか判定できる。"organic"が含まれていたら普通のリンク、そうでなければAdwordsのリンク(たぶん)

        var __utmz = $.myGetCookie('__utmz');
        if(__utmz && __utmz.indexOf('organic') >= 0){
          return 'Google-Organic';
        }else{
          return 'Google-Adwords';
        }

2010年7月15日木曜日

jQueryユーティリティ関数を追加するプラグイン例

extend関数を使って追加する。
実行は jQuery.f() の形式。

プラグインのコード

(function($){
  $.extend({
    // get cookie
    myGetCookie: function(name){
      var regexp = new RegExp('; ' + name + '=([^;]*);');
     var match  = ('; ' + document.cookie + ';').match(regexp);
     if(match){
      return match[1];
     }
    },
    // set cookie
    mySetCookie: function(key, val, validFunc){
      var flg = true;
      if(validFunc){
        if(!validFunc(val)){
          flg = false;
        }
      }
      if(flg){
        document.cookie= key + '=' + encodeURIComponent(val) + ';path=/;';
      }
    },
    // referrer -> key
    classifyReferrer: function(ref){
      if('affiliate-b.com/'.indexOf(ref) >= 0){
        return 'アフィリエイト';
      }else if('google.co.jp/'.indexOf(ref) >= 0){
        return 'Google-Organic';
      }else if('google.com/aclk'.indexOf(ref) >= 0){
        return 'Google-Adwords';
      }else if('yahoo'.indexOf(ref) >= 0){
        return 'Yahoo-Organic';
      }else if('overture.com'.indexOf(ref) >= 0){
        return 'Yahoo-Overture';
      }else{
        return 'その他';
      }
    }
  });
})(jQuery);

呼び出し元

/* conversion tracking */
  var CONVERSION_COOKIE_NAME = 'xx_ref';
  var CONVERSION_INPUT_NAME  = 'xx_ref';
  // exec.
  if($('body#form-idx').length){
    var c;
    if(c = jQuery.myGetCookie(CONVERSION_COOKIE_NAME)){
      $('form').append('');
    }
  } else {
    if(document.referrer) {
      jQuery.mySetCookie(CONVERSION_COOKIE_NAME,
                         jQuery.classifyReferrer(document.referrer),
                         function(val){
                           return (location.hostname.indexOf(val, 0) < 0);
                         });
    }
  }

2010年7月14日水曜日

JavaScriptでCookie処理

ポイント

  • リファラーの取得
  • クッキーの取得(パースするのが少し煩わしい)
  • encodeURIComponent.encode()
  • 高階関数(値に応じて保存するかどうかを判断する)

/* conversion tracking */
  var CONVERSION_COOKIE_NAME = 'ones_style_ref';
  // get cookie
  function myGetCookie(name){
    var regexp = new RegExp('; ' + name + '=([^;]*);');
   var match  = ('; ' + document.cookie + ';').match(regexp);
   if(match){
    return match[1];
   }
  }
  // set cookie
  function mySetCookie(key, val, validFunc){
    var flg = true;
    if(validFunc){
      if(!validFunc(val)){
        flg = false;
      }
    }
    if(flg){
      document.cookie= key + '=' + encodeURIComponent(val) + ';path=/;';
    }
  }
  // exec.
  if($('body#form-idx').length){
    var c;
    if(c = myGetCookie(CONVERSION_COOKIE_NAME)){
      $('form').append('');
    }
  } else {
    if(document.referrer) {
      mySetCookie(CONVERSION_COOKIE_NAME,
                  document.referrer,
                  function(val){
                    return (location.hostname.indexOf(val, 0) < 0);
                  });
    }
  }

参考

日時の形式

インターネットで日常的に見かけるのはたったの3種類。暗記してしまいたい。

1. ISO8601 - 日付と時刻の表記に関する国際規格 -
1-1. UTCの場合 - Zを付ける
例: 2010-07-14T15:27:46Z
1-1. UTC以外の場合
例: 2010-07-14T15:27:46+01:00
2. RFC822
電子メールに関するRFC(よって日時以外のデータに関する決まりも含む)。
現在はRFC2822が発行されたためRFC822は破棄されたが、日付の形式は現在でも使われている。
例: Wed, 14 Jul 2010 09:53:48 +0900

2010年7月9日金曜日

印刷&印刷プレビューでJavaScript

IEに限って、onbeforeprintとonafterprintイベントが使える。

たとえば

flashなどのobjectを含むhtmlを印刷した場合にレイアウトが乱れることがあるので、印刷前にhtmlからobjectを削除して解決(代替画像に差し替える、といったこともできると思う)。

    // このコードはjQueryに依存します

    // object要素を除去した印刷用html
    //(dhtml的に変化するページなので初めに印刷用htmlを記録しておく)
    var htmlStripped = $('body').html().replace(/<object.*<\/object>|<script.*<\/script>/ig, '');

    // 関数定義
    function fbef(){
      // 印刷するにあたって、記録しておいた印刷用htmlを復活
      $('body').html(htmlStripped);
    };
    function faft(){
      // キャッシュからリロード(これが無いと、
      // サーバーからリロードしたhtmlが印刷されて
      // しまって"fbef"の処理が無意味になる)
      location.reload(false);
    };

    // イベントハンドラを設定
    window.onbeforeprint = fbef;
    window.onafterprint  = faft;

2010年7月1日木曜日

Perlメールの文字化け

Encode::encode()でjis変換すると化ける文字がある。

そういうときはtrで強引にやる。

for my $key (keys %values) {
    #YEN SIGN, WAVE DASH, MINUS SIGN
    $values{$key} =~ tr/\x{00a5}\x{ff5e}\x{ff0d}/\x{005c}\x{301c}\x{2212}/;
}
...
$body = makemailbody($template, \%values);
$body = Encode::encode('jis', $body);