2010年6月29日火曜日

jQueryプラグイン:ロールショウ?

指定された要素の子供を、順番にshow&hideするだけのもの。
今日自作。拡張性ほとんどなし。

jquery.myslideshow.js:
(function($){

  $.fn.mySlideShow = function(options){
    var c = $.extend(
      {
        //opt1 : true
        duration: 3000
      },
      options
    );
    var o = this;
    var n = $(o).children().length;
    var curr = 0;
    var timerID;

    var f = function() {
      var tgt = $(o).children().get(curr);
      $(tgt).fadeIn('normal');
      $(tgt).siblings().hide();
      curr++;
      if(curr >= n) {
        curr = 0;
      }
    }

    f();
    if(timerID){
      clearInterval(timerID);
    }
    timerID = setInterval( f, c.duration );

    return o;
  };
})(jQuery);

MTにPerlモジュールを追加したいとき

参考:mtプラグインにおける Perl モジュール の配置 について - 左脳Script

CPANを使えない環境での話。
/インストールディレクトリ/lib/ に置くと動作するらしい。
Digest::SHA::PurePerl なら、/インストールディレクトリ/lib/Digest/SHA/

今回はとりあえず、バックアップ/復元に使う、
* Archive::Tar
* Archive::Zip
* IO::Compress::Gzip
* IO::Uncompress::Gunzip
が使えればOK.

2010年6月28日月曜日

[HOP] partition problemのコード

単独のreturnが参考になった。

use strict;
use warnings;
use Data::Dumper;

sub partition{
    my ($target, $treasures) = @_;

    return [] if $target == 0;     #anon. array ref
    return () if $target < 0 || @$treasures <= 0; # empty list
    # ここはPerlの作法に詳しくないと謎。
    # 一般的に、エラーケースではempty listを返すのが普通。
    # 空リストを明示的に書かずに、単独のreturnでよいかもしれない
    # (呼び出し元がリストコンテキストなら空リストになるから)

    my ($first, @rest) = @$treasures;
    my @solutions = partition($target - $first, \@rest);
    return ((map {[$first, @$_]} @solutions), partition($target, \@rest));
    # この文も実は難しい。mapの結果は、@solutionsがarray refならリスト、
    # empty listなら空リストになる性質がある。
}

print Dumper(partition(5, [1,2,3,4]));

2010年6月25日金曜日

クローラーの邪魔をしたい場合

.htaccess

BrowserMatchNoCase Googlebot     robot
BrowserMatchNoCase Slurp         robot
BrowserMatchNoCase msnbot        robot
BrowserMatchNoCase proodleBot    robot
BrowserMatchNoCase psbot         robot
BrowserMatchNoCase ScSpider      robot
BrowserMatchNoCase TutorGigBot   robot
BrowserMatchNoCase YottaShopping robot
BrowserMatchNoCase Faxobot       robot
BrowserMatchNoCase Gigabot       robot
BrowserMatchNoCase MJ12bot       robot
BrowserMatchNoCase Baidu         robot
deny from env=robot

確認(Perlモジュールを使う)

$ lwp-request -mHEAD -H 'User-Agent: slurp' http://sample.com/img/1.jpg
$ lwp-request -mHEAD -H 'User-Agent: slurp' http://user:password@testserver.com/img/1.jpg

2010年6月24日木曜日

PHP5のグローバル変数

グローバル変数は、globalキーワードを付けて宣言することになったらしい。
※以前のようにブロック内でglobal宣言しただけでは、参照できない。
茶々ラボ - Chacha Lab.: PHPでグローバル変数

しかも、global宣言と同時に初期化できないのが面倒。
※2つ文を書く必要がある。

global $category_tbl;
$category_tbl = array(
    '広告[  ]+総合広告' => array(1),
);
...
function(){
    global $category_tbl;
    print_r($category_tbl);
}

PHPでTSV処理

エクセルで出力されたTSVを想定。

CSVのほうが知名度はあるが、TSVが好ましい(区切りには制御文字のほうが適している、それこそ制御文字の本分でしょう、という気がする)。

エクセルでデータを作る人、つまり非プログラマー、非SEの人は普通TSVのことを知らないが、そこは事前に説明してTSVで出力するようお願いしておく。

TSVに関する大まかな仕様

  • 改行を含む列は"で始まり"で終わる
  • タブ、二重引用符を含んでもいい
  • SJIS(PHPプログラム内ではUTF8に変換して処理する)

TSVファイルを読み込んで連想配列の配列に変換(PHP)

/*
 * TSVファイルを読み込んで連想配列の配列に変換
 * 引数:処理結果(参照渡し)、TSVファイルのパス
 */
function parseTSV(&$records, $path){
    $fp = fopen($path, 'r');
    if($fp===FALSE){
        return FALSE;
    }

    $records = array();
    $errors = array();
    //$cnt = 0; // これはデバッグ専用のリミット(後で削除)
    //    while(!feof($fp) && $cnt < 10){
    while(!feof($fp)){

        $line = fgets($fp);
        $line = mb_convert_encoding($line, 'UTF-8', 'SJIS-win');
        $line = str_replace(array("\r\n","\r"), "\n", $line);
        $len = mb_strlen($line, 'UTF-8');

        $state = 'START';
        $flg = 0;
        $buf = '';
        $fields = array();
        //        $cnt++;

        for($i=0; $i<$len; $i++){
            $char = mb_substr($line, $i, 1, 'UTF-8');
            if($state=='START'){
                if($char === '"' && $flg == 0) {
                    $flg = 1;
                    $state = 'MID';
                } elseif($char === "\n" && $flg == 0) {
                    break;
                } elseif($char === "\t") {
                    $state = 'END';
                } else {
                    $buf .= $char;
                    $state = 'MID';
                }
            } elseif($state == 'MID') {
                if($char === "\t") {
                    if($flg){
                        $buflen = mb_strlen($buf, 'UTF-8');
                        if($buflen && mb_substr($buf, $buflen - 1, 1, 'UTF-8') == '"') {
                            $state = 'END';
                        } else {
                            $char = ' ';
                        }
                    } else {
                        $state = 'END';
                    }
                } elseif($char === "\n"){
                    if($flg){
                        $buf .= $char;
                        // データが次の行に続いている場合
                        $line = fgets($fp);
                        $line = mb_convert_encoding($line, 'UTF-8', 'SJIS-win');
                        $line = str_replace(array("\r\n","\r"), "\n", $line);
                        $len = mb_strlen($line, 'UTF-8');
                        $i = -1; // ここは強引
                    } else {
                        $state = 'END';
                    }
                } else {
                    $buf .= $char;
                }
            }
            if($state == 'END') {
                if($flg){
                    $buf = mb_substr($buf, 0, mb_strlen($buf, 'UTF-8') - 1, 'UTF-8');
                }
                $buf = mb_ereg_replace('""', '"', $buf); // 連続したダブルクォートは1つに

                // 連想配列に追加して、初期化
                $fields[] = $buf;
                $state = 'START';
                $flg = 0;
                $buf = '';
            }
        }
        // 1レコード読み込み終了
        if(count($fields) > 0) {
            $records[] = $fields;
        }
    }
    fclose($fp);

    return TRUE;
}

2010年6月23日水曜日

CSSでsubmitの装飾(IE6以外)

buttonでもinput(submit)でもOK。hover, focusで画像ロールオーバーさせる。

WebTecNote - [css] フォームのボタンをスタイルシートで画像ボタンに変更する

しかし、IE6以下の場合は動作しない(hover疑似クラスが機能しないため)。必要なら JavaScriptを加える必要がある。