2011年7月21日木曜日

The Actung Baby - Rapid MVC framework

This is a "tiny" MVC framework just only 50 lines. Completely Objective, Simple and easy to handle. See below as "index.php".
<?php
/***********************************************************************************
 * MVC ( Model View Control ) Action Program
 ******************************** License: GPLv3 ********************************
 * Copyright (C) 2011 Yoshi Sakai (A.K.A. bluemooninc)
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 ***********************************************************************************/
require '../../mainfile.php';
include XOOPS_ROOT_PATH."/header.php";
/***********************************************************************************
 * Model Section
 ***********************************************************************************/
$mydirname = basename( dirname( __FILE__ ) ) ;
$mymodpath = XOOPS_ROOT_PATH."/modules/$mydirname" ;
$model = isset($_GET['model']) ? htmlspecialchars($_GET['model'],ENT_QUOTES) : "category";
$model = isset($_POST['model']) ? htmlspecialchars($_POST['model'],ENT_QUOTES) : $model;
$ctrl = isset($_GET['ctrl']) ? $model . "_" . htmlspecialchars($_GET['ctrl'],ENT_QUOTES) : "";
$ctrl = isset($_POST['ctrl']) ? $model . "_" . htmlspecialchars($_POST['ctrl'],ENT_QUOTES) : $ctrl;
$myclass = $mymodpath . "/class/" . $model . ".php";
require( $myclass );
$handler = new ActionHandler($ctrl);
if ( !$ret = $handler->load() ){
    echo $handler->debug(); die;
}
/***********************************************************************************
 * Ctrl Section
 ***********************************************************************************/
if ( $ctrl ){
    if ( !$ret = $handler->$ctrl() ){
        echo $handler->debug(); die;
    }
}
/***********************************************************************************
 * View Section
 ***********************************************************************************/
$handler->assignRecords();$xoopsOption['template_main'] = "cartb2b_" . $model . ".html" ;
include( XOOPS_ROOT_PATH.'/footer.php' ) ;
?>

2011年7月17日日曜日

Jelly! はじめました。


WeeklyCMS収録後から、これってどうやるのとか自然と勉強会的な感じになって、懇親会の後も仕事するならJelly!やろうという感じでやってみました。

普段は別々の会社で働いているWeeklyCMSのメンバーですがさっそく打ち解けて楽しくリラックスしながらそれぞれの仕事をこなしていました。図書館とランチルームの中間みたいな雰囲気で仕事に集中したい時、雑談してくつろぎたいときとメリハリのある時間を作れたのが意外でこれはもしかしたら一人で仕事しているよりはかどるんじゃ無いかと思いました。

それに自分が詰まった所を呟くとすぐに相談に乗ってくれたり逆に自分のやり方を教えたりして、googleで調べるより速く出口へと導いてくれます。この働き方はノマドワーカーや自営業、SOHOで働く人にとってはとてもいい刺激になるし楽しい事この上ないです。

米西海岸ではじまった(たしかサンフランシスコ発祥と記憶しています)このJelly!という働き方、きっと日本でもはやりますよ。

What is Jelly!
http://www.workatjelly.com/

2011年7月7日木曜日

XOOPS Cube : 携帯対応モジュールのエラー表示

WizMobile で「照合用のワンタイム・チケットが見つかりませんでした。」というエラー表示がでる件について

Q:何故、この様なエラー表示が出るのですか?
A:セッションIDというユーザー識別情報が不明になった時表示されます。

 セッションIDとは:Webアプリケーションなどで、アクセス中のユーザの識別や行動の捕捉(セッション管理)のために付与される固有の識別情報。ユーザがアクセスしたりログインした際に発行され、一定時間アクセスが無かったりログアウトすると破棄されます。

Q:このエラーの出る機種は特定できますか?
A:2009年度以前のimodeブラウザ1.0規格のdocomo携帯で発生します。

Q:何故、imodeブラウザ1.0規格で発生しますか?
A:cookieという仕組みが利用できない為、URLでセッションを受け渡している為です。
Cookie とは、訪れた Web サイトによって作成され、あなたのコンピュータに保存される小さなファイルです。Cookie には、ユーザの識別や行動の捕捉(セッション管理)が保存されます
Q:URLでセッションを受け渡すと何故エラーがでますか?
A:サイトのプログラムとのデータ受け渡しに齟齬が出やすいため、WizMobile(携帯対応モジュール)は色々な方法で受け渡し情報をカバーしますが100%確実な方法が無い為です。

Q:解決策は?
A:cookieの保存が可能になった imodeブラウザ2.0の機種に移行してもらう必要があります。

Q:docomo携帯の買い替えを閲覧して来る人に強制できません。
A:imodeブラウザ1.0とURLによるセッション管理という仕組みでは確実に動作する事は技術上不可能です。「2009年度以前のdocomo機種(imodeブラウザ1.0)の場合は閲覧のみの対応となります」等のアナウンスが必要です。

 Q:何故セキィリティ対策が取れないのですか?
A: 簡単に説明するとブラウザのURL情報は簡単に盗み見る事ができコピーして為り変わる事が可能だからです。具体的にはセッションIDをURL上に保持した場合、HTTP Refererにより、他のドメインにセッションIDが漏洩します。また、ユーザの不注意により、セッションID付きのURLをソーシャルブックマークなどで公開したり、メールで知人に送信した結果、セッション情報が外部に漏洩するような事故が現実に発生しています。

Q:これから対応の予定はありますか?
A:ありません。前述の問題点に加えてCookieによるセッション管理でなければ問題が生じる事が明らかになってきている為です。

Q:どんな問題があるのですか?
A:技術的な詳細については以下URLや書籍を参照下さい。

http://d.hatena.ne.jp/ockeghem/20110615/p1

体系的に学ぶ 安全なWebアプリケーションの作り方
http://www.amazon.co.jp/exec/obidos/ASIN/4797361190/jisakucompile-22/

2011年7月1日金曜日

testarea の文字列もしくは MySQL text の文字列より任意の文字を切り出す関数

テキストエリア中から任意の文字だけを切り出したい場合の関数。
$textarea ="発着地を入力下さい。
出発地:上野
到着地:大井町
";
例えば、 pickupFromTextArea("出発地:",$textarea);
 とかすると、上野だけを取り出せます。
/*
 * Get one needle to line break from textarea strings
 */
function pickupFromTextArea($needle,$subject) {
  $pattern = "/{$needle}(.*)/";
  if (preg_match($pattern, $subject, $matches) === 1) {
    return trim($matches[1], "\r");
  }
  return false;
}

教えて!XOOのカテゴリにグループ権限を追加その2

さて、 教えて!XOOのカテゴリにグループ権限を追加した後、権限の無い場合は質問だけ表示して回答を表示しないというハックを紹介します。変更は以下ソース

/plzXoo/default/actions/detail.class.php
<?php

class default_DetailAction extends mojaLE_AbstractAction
{
    function execute(&$controller,&$request,&$user)
    {
        global $xoopsUser;    // bluemoon added
       
        exFrame::init(EXFRAME_PERM);
        // 閲覧権限のチェック
        exPerm::GuardRedirect('view_detail','index.php',_MD_PLZXOO_ERROR_PERMISSION);

        $id = isset($_REQUEST['qid']) ? intval($_REQUEST['qid']) : 0;
        $handler=&plzXoo::getHandler('question');

        $question=&$handler->get($id);
        if(!is_object($question))
            return VIEW_ERROR;

        // ステータスが1,2と異なるものは管理者以外キック
        if( ! in_array( $question->getVar('status') , array(1,2) ) ) {
            if( ! is_object( $GLOBALS['xoopsUser'] ) || ! $GLOBALS['xoopsUser']->isAdmin() )
                return VIEW_ERROR;
        }

        // hack by bluemoon: in
        $db =& Database::getInstance() ;
        $cid = $question->getVar('cid');
        $sql = "SELECT `groupid` FROM ".$db->prefix('plzxoo_category')." WHERE `cid`=".$cid ;
        list($groupid) = $db->fetchRow( $db->query( $sql) );
        if ( $xoopsUser ){
            $gids = array_merge( array(0,3) , $xoopsUser->getGroups());
            $permissionOkay = in_array( $groupid, $gids );
        }else{
            $gids = array(0,3);
            $permissionOkay = in_array( $groupid, $gids );
        }
        if ($permissionOkay){
            $handler=&plzXoo::getHandler('answer');
            $criteria = new Criteria('qid',$id);
            $criteria->setSort('input_date');
            $criteria->setOrder('DESC');
            $answers=&$handler->getObjects($criteria);
            $request->setAttribute('answers',$answers);
            //    $myrow['answer_body'] = _MD_PLZXOO_ERROR_PERMISSION;
        }
        // out
       
        $request->setAttribute('question',$question);
        return VIEW_SUCCESS;
    }

    function isSecure()
    {
        return false;
    }
}

?>

2011年6月24日金曜日

MySQLのインデックスと高速化について

インデックスの注意点

!=, <> はインデックスが使われない
LIKE 検索は前方一致のみでしかインデックスが使われない
OR や不等号を使った検索でインデックスが使われない場合がある。
ORDER BY するとインデックスが使われないパターンが出る。
EXPLAINを学ぶと高速にしょりできる。

あとは高速化のリンクをご紹介します。

参考になるリンクのご紹介

MySQLを高速化する10の方法

MySQLのEXPLAINを徹底解説!!

NoSQLにすると何がうれしいか?

NoSQLにすると何がうれしいか?それはスケールアウトする時にRDBがボトルネックになってNoSQLだとそれを回避できるからです。SNSやソーシャルゲーム等スケールアウト必至のアクセス数に達した時の手段です。企業がNoSQLにあまり関心が無いのはそこまで莫大なアクセス数をさばく必要がないからですね。また、Zingaの様にMySQLをクラスタ化してボトルネックを解消する手法もあります。それもまた1つの方法。
RoRで利用されているMongoDBがPHPでも利用可能なのを最近しりました。今後、NoSQLのCMSも出てくるかもしれませんね。
MongoDB
http://php.net/manual/ja/class.mongodb.php
NoSQLはRDBMSに取って代わるものなのか?
http://www.atmarkit.co.jp/flinux/rensai/noSQL/noSQL_01/01_2.html


MySQL Clusterを試す - クラスタ化した分散アドレス帳をつくる
http://journal.mycom.co.jp/special/2004/mysql/index.html