アーカイブ

2007 年 6 月 のアーカイブ

今日のチェキ 2007-06-29

2007 年 6 月 29 日 コメント 1 件
カテゴリー: 日記 タグ:

Ethnaでアクション名はPATH_INFOから取得したい

2007 年 6 月 28 日 コメントはありません

Ethna×PHPは29日発売らしい。
錦糸町くまざわで聞いたら、「6月29日発売で当店では売り切れとなっております申し訳ございません」となぞなこと言われたのでAmazonさん。

Ethnaでアクション名の決定方法を変更するにはこちらを参考にします。
PATH_INFOでアクション名決定したい場合はこんな感じでControllerに追加。


    function _getActionName_Form()
    {
        return isset($_SERVER['PATH_INFO'])? str_replace('/', '_', trim($_SERVER['PATH_INFO'], '/')): null;
    } 

http://example.jp/index.php/test/ → Testアクション
http://example.jp/index.php/user/register → User_Registerアクション
これをやるとアクション名がPATH_INFO以外で取得できなくなるので、テンプレートでformタグを書くときに面倒です。
パラメータもPATH_INFOで取得したいと思ってもできませんので。
Ethna_UrlHandlerの使い方がちょっとわかりづらいのでEthnaでNet_URL_Mapperを使うをそのまま適用。


<?php
/**
 * @see http://labs.cybozu.co.jp/blog/tsuruoka/anubis/blog_show/45
 */
require_once 'Net/URL/Mapper.php';

class {Appid}_UrlHandler extends Ethna_UrlHandler
{
    var $action_map = array(
        'global' => array(
            '/*action' => array(
                'action' => '',
            ),
        ),
    );

    function &getInstance($class_name = null)
    {
        $instance =& parent::getInstance(__CLASS__);
        return $instance;
    }

    function buildActionParameter($http_vars, $action)
    {
        if ($action == "") {
            return $http_vars;
        }
        $action = str_replace('/', '_', $action);
        $key = sprintf('action_%s', $action);
        $http_vars[$key] = 'true';
        return $http_vars;
    }

    function requestToAction($http_vars)
    {
        if (isset($http_vars['__url_handler__']) == false
            || isset($this->action_map[$http_vars['__url_handler__']]) == false) {
            return array();
        }
        $url_handler = $http_vars['__url_handler__'];
        $action_map = $this->action_map[$url_handler];
        // parameter fix
        $method = sprintf("_normalizeRequest_%s", ucfirst($url_handler));
        if (method_exists($this, $method)) {
            $http_vars = $this->$method($http_vars);
        }
        // normalize
        if (isset($http_vars['__url_info__'])) {
            $path = $http_vars['__url_info__'];
        } else {
            $path = ""; 
        }
        list($path, $is_slash) = $this->_normalizePath($path);
        $mapper = Net_URL_Mapper::getInstance($http_vars['__url_handler__']);
        foreach ($this->action_map[$http_vars['__url_handler__']] as $key => $value) {
            $mapper->connect($key, $value);
        }
        $result = $mapper->match($path);
        $http_vars = $this->buildActionParameter($http_vars, $result['action']);
        unset($result['action']);
        $http_vars = array_merge($http_vars, (array)$result);
        return $http_vars;
    }
} 

あとはindex.phpに以下をmain実行前に書く。


$_SERVER['URL_HANDLER'] = 'global'; 

UrlHandlerの使い方自体はPATH_INFOを使ったRequest-URIからのパラメータの取得を参照。
基本的にhttp://example.jp/index.php/action/name/でアクセスして、特殊なの作りたかったら、action_mapに追加する感じで。

カテゴリー: 日記 タグ:

今日のチェキ 2007-06-25

2007 年 6 月 25 日 コメントはありません

ニコニコ削除祭り。いいえトムです。

サイトの読み込み時間をプロファイリングできるWEBツール「Pingdom」
心理探偵

Yahoo! JAPANのPV数は世界一、月間利用者数は4,000万人突破

MySQL,PostgreSQLとFirebirdの性能をユーザー会メンバーが徹底比較,判明した”意外な結果”
更新とJOINが多ければMySQL,シンプルなSELECT主体ならPostgreSQLが向いている。ストアド・プロシージャでシングル・コネクションならFirebirdは非常に速い
検証が5.0.6-betaってことでindex merge使えるのでJOINもなんとか
またMySQLの場合,デフォルトのエンジンであるMyISAMに比べ,トランザクション機能を持つInnoDBの性能は必ずしも遅くないという,これも意外な結果が得られた。
mixiもInnoDBだしね
でもfull textインデックス張れないのが

カテゴリー: 日記 タグ:

今日のチェキ 2007-06-24

2007 年 6 月 25 日 コメントはありません

どーも、一部通戦力外です。

まつもとゆきひろ×結城浩,Rubyを語る
そこにシビれる!あこがれるゥ!まつもとひろゆきに親近感沸いた

画像ファイルにPHPコードを埋め込む攻撃は既知の問題

QRコードは過去のもの? アンケート調査で利用実態が明らかに

カテゴリー: 日記 タグ:

今日のチェキ 2007-06-23

2007 年 6 月 23 日 コメントはありません
カテゴリー: 日記 タグ:

今日のチェキ 2007-06-22

2007 年 6 月 22 日 コメントはありません
カテゴリー: 日記 タグ:

セな

2007 年 6 月 22 日 コメントはありません

senna、senna言い出してからだいぶたったのですが、正直よくわかってなかったので調べてみた。

そもそも、全文検索は全文字列から対象文字列を検索するということは普通やらない。
検索エンジンで「京都」を検索しても「東京都」は引っかからない。
これは日本語を形態素解析し切り出した単語を元に検索しているからである。
この検索の部分がsennaで形態素解析がMeCabと。

でMySQLはというと、
MySQL全文検索
全文検索にはFULLTEXTインデックスを張ってMATCHを使え。
FULLTEXTはMyISAMエンジンのみ利用可能で、インデックス結合の対象とならないぞ。
そもそもシングルバイトのみで日本語では利用できません(なんだtt
ということで、この部分でsennaががんばってくれる(はず)のです。

PostgreSQLとかどうなってるんだろうと調べてみたらみかかが力入れてやってるんですね。
みかかデータのLudiaとか導入楽そうだ。

Yahooが形態素解析Webサービス開始したり、巡回先がやたらMeCabやsennaの話題取り扱ってるんですが、やっとかんとダメですね。

いろいろわかった所でキーワードでWikipediaを見てみると全部載ってる件。
全文検索
形態素解析
わかち書き
どこぞに入ってたmysql叩いてみた。


mysql>   CREATE TABLE test (
    ->     id INTEGER AUTO_INCREMENT,
    ->     PRIMARY KEY (id),
    ->     text TEXT NOT NULL,
    ->     FULLTEXT INDEX (text)
    ->     );
Query OK, 0 rows affected (0.47 sec)

mysql> insert test value (null, '東京都');
Query OK, 1 row affected (0.20 sec)

mysql> select * from test where match(text) against('京都');
Empty set (0.00 sec)

mysql> select * from test where match(text) against('東京');
+----+-----------+
| id | text      |
+----+-----------+
|  1 | 東京都    |
+----+-----------+
1 row in set (0.00 sec)
カテゴリー: 日記 タグ:

PDOでSJISだめっぽというので調べてみた

2007 年 6 月 21 日 コメントはありません

だめっぽ。

環境
Windows
PHP 5.2.3
MySQL 5.0.41

my.iniの設定


[mysqld]
default-character-set=CP932
skip-character-set-client-handshake

<?php
   $mysql = mysql_connect('localhost', 'root', '');
   mysql_select_db('test');
   echo mysql_client_encoding(); // latin1
   echo mysql_real_escape_string('ソン'); // ソ\ン
   mysql_close($mysql);

   $mysqli = mysqli_connect('localhost', 'root', '', 'test');
   echo mysqli_client_encoding($mysqli); // latin1
   echo mysqli_real_escape_string($mysqli, 'ソン'); // ソ\ン
   mysqli_set_charset($mysqli, 'cp932');
   echo mysqli_client_encoding($mysqli); // cp932
   echo mysqli_real_escape_string($mysqli, 'ソン'); // ソン
   mysqli_close($mysqli);

   $pdo = new PDO('mysql:dbname=test;host=localhost', 'root', '');
   echo $pdo->quote('ソン'); // 'ソ\ン'
?>

SHOW VARIABLES LIKE “char%”ではclientの文字セットがutf8とでるんですが、クライアントのdll自体がlatin1で動作しちゃってる為使えないです。
mysqliの場合は5.2.3で追加されたmysqli_set_charsetで変更できますが。
PDOに関しては、文字コードナニそれ?って感じでしょう。
プレースフォルダ機能つきプリペアードステートメントが文字コード考慮してなくてどうする。


<?php
   $mysql = mysql_connect('localhost', 'root', '');
   $result = mysql_query('SHOW VARIABLES LIKE "char%"');
   while ($row = mysql_fetch_assoc($result)) {
       echo "|{$row['Variable_name']}\t|{$row['Value']}\t|\n";
   }
   /*
   |character_set_client   |cp932  |
   |character_set_connection       |cp932  |
   |character_set_database     |cp932  |
   |character_set_filesystem       |binary |
   |character_set_results  |cp932  |
   |character_set_server   |cp932  |
   |character_set_system   |utf8   |
   |character_sets_dir     |C:\Program Files\MySQL\MySQL Server 5.0\share\charsets\        |
   */
?>

カテゴリー: 日記 タグ:

今日の疑問

2007 年 6 月 21 日 コメントはありません

mysql> SELECT * FROM sister;
+--------+
| name   |
+--------+
| 四葉 |
+--------+
1 row in set (0.00 sec)

mysql> SELECT * FROM sister WHERE name LIKE '%四\\\葉%';
+--------+
| name   |
+--------+
| 四葉 |
+--------+
1 row in set (0.01 sec)

なんで\入ってても引っかかるん?

カテゴリー: 日記 タグ:

今日のチェキ 2007-06-20

2007 年 6 月 20 日 コメントはありません
カテゴリー: 日記 タグ: