2010年12月4日土曜日

ITC資格認定申請を登録

HPから簡単に入力できました。

これから12/24まで、待ちに入ります。

何だか色々と時間が掛かり気味なのが気掛かりです。

2010年11月8日月曜日

ITC研修を修了

11月7日、ITコーディネータのケース研修を修了しました。

今後、具体的に、資格取得に向けての動いていくことになります。

==============================>
1.資格認定申請(2010/12/3~2010/12/15)

2.認定者発表(2010/12/24)

3.認定証送付(2010/12/24)

4.プロフィール登録開始(2010/12/24)

5.写真提出締め切り(2011/01/17)

6.認定料支払締め切り(2011/02/10)

==============================<

正直な感想としては、「長かった」「やっとか」といったところです。

様々な経営者の方々とお会いするのが必要だと感じています。

IT化まわりで何か悩み・迷い・不安などございましたら、

当方サイトからお気軽にご相談ください。

2010年10月26日火曜日

マーケティング

※以下、サラリーマンを脱皮しようとする意識・行動に目覚めた
 全ての会社人に捧げます。



商売を営んでいく上で、マーケティングの重要性について

疑念を抱く人はいないでしょう。

右肩あがりの時代には、会社が自分自身をマーケティングし、

ブランド化していった。そのため、社員は、名刺に会社名を

大きく書いておくだけでブランドに乗っかって商売できた。



しかし、時代は変わり、大企業に勤めていても、

40代50代といえども、いざとなれば首を切られる様を

新聞・TVで垣間見るにつけ、今は個人でも

「自分の価値を高めておかなければならない」といった

認識が広がり始めているように見受けられる。

かつ、そのように行動しているように見える方々がいる。



このとき、もっと有効なのは、恐らく、「自分をマーケティングする」と

いう考え方を取り入れて行動することだと思う。



「自分に出来ることは何か」を主体に考えるのでなく、

「まず市場が何を求めているか」を考え、

「周りから見た自分の強みは何か」とか

そういったことを考えることから始めていって、

やがて「戦略(方向性)」に結実させていく。

さらに、それを戦術レベルに落とし込んでいき、

具体的な行動プランに仕上げ、それを粛々と実行する。

実行にあたっては、勿論、タイミングごとにチェックをかけ、

行動やプランを見直す機会を設ける。



この一連の流れをより精緻に、分析的に、客観的に

実行できるようになれば、それだけで一つ武器を

手に入れたようなものだ。



「自分をマーケティングする」とか

「自分をブランディングしていく」とか

そういう方法論を、強くお勧めします。

2010年8月17日火曜日

ITC研修テキスト届く

今日、ITコーディネータ資格の研修テキストが届きました。

※どうでもいいですが、13日発送で16日AM着指定になってました。
 研修は、22日にスタートです。
 一週間前に届くようにしたかったんでしょうね。。。



内容をパラパラと斜め読みしてますが、

これは、SEの研修テキストにしてみても面白いかも知れません。

「あっ、会計の勉強しなきゃ」

って思うことでしょう。

それだけでも意味があるんじゃないかと思います。

2010年7月20日火曜日

Twigでテンプレート側からAppを起動

現在、当方では、PHPのテンプレートクラスであるTwigの

可能性を追求しているところです。



今回は、テーマファイルからAppを呼び出す仕組みを開発してみました。



通常のWEBアプリでは、まずAppを呼び出して処理した後に

Appでの実行結果をテーマに書き出すような処理順序になると思います。



今回、この処理順序をちょっと変えて、

テーマファイルに「app=blog fct=EntryView id=3」のように書いておけば

該当箇所にAppの実行結果が自動的に表示されるようにしてみました。

※イメージ的には、SoyCMSでやってるようなことです。
 SoyCMSでは独自テンプレートエンジンでやってると思いますが、
 当方では今回これをTwigという有名なテンプレートエンジン上で
 やってみている、というワケです。



以下、実装クラスのソースコードを晒しておきますので、

ご参考いただければ幸いです。



Extensionクラス

当該クラスで、TokenParserを定義します。(c.f. getTokenParsers())
<?php
/**
* Twig_Extension_Sample
* @author spark43
*
*/
class Twig_Extension_Sample extends Twig_Extension
{
    /**
     * (non-PHPdoc)
     * @see v0.02/Sample/_opt/Twig/Twig_Extension::getTokenParsers()
     */
    public function getTokenParsers()
    {
        return array(
            new Twig_TokenParser_Sample(),
        );
    }


    /**
     * (non-PHPdoc)
     * @see v0.01/Sample/_opt/Twig/Twig_Extension::getFilters()
     */
    public function getFilters()
    {
        return array(
            'nl2br' => new Twig_Filter_Method($this, 'nl2br'),
        );
    }

    /**
     * (non-PHPdoc)
     * @see v0.01/Sample/_opt/Twig/Twig_ExtensionInterface::getName()
     */
    public function getName()
    {
        return 'aither';
    }

    /**
     * nl2br
     * @param $string
     */
    public function nl2br($string)
    {
        return str_replace("\n", "<br />", Twig_Filter_Method);
    }
}

?>




TokenParserクラス

当該クラスでテーマに書かれた構文をトークンに解析します。
使用するフレームワークの構文に合わせることが必要です。
※オープンソースCMSなどに見られる場合があるのですが、
 使用モジュールごとにそれぞれ独自なフレームワークを使っている場合、
 該当フレームワークごとに必要となる場合もあるかと思います。
<?php
/**
* Twig_TokenParser_Sample
* @author spark43
*
*/
class Twig_TokenParser_Sample extends Twig_TokenParser
{
    /**
     * (non-PHPdoc)
     * @see v0.02/Sample/_opt/Twig/Twig_TokenParserInterface::parse()
     */
    public function parse(Twig_Token $token)
    {
        $lineno = $token->getLine();
        $stream = $this->parser->getStream();
        $exp = $this->parser->getExpressionParser();


        // parse
        $request = array();
        $param = array();
        while($stream->test(Twig_Token::NAME_TYPE)) {
            $expk = $exp->parseExpression();
            $stream->expect(Twig_Token::OPERATOR_TYPE, '=');
            $expv = $exp->parseExpression();

            switch ($expk['name']) {
                case 'app':
                case 'fct':
                case 'with':
                    if (! ($expv instanceof Twig_Node_Expression_Name)) {
                        throw new Twig_SyntaxError("'". $expk['name']. "' paameter is invalid", $lineno);
                    }
                    $request[$expk['name']] = $expv;
                    break;
                default:
                    // TODO : other expressions...?
                    if (! ($expv instanceof Twig_Node_Expression_Name)
                    && ! ($expv instanceof Twig_Node_Expression_Constant)) {
                        throw new Twig_SyntaxError("'". $expk['name']. "' paameter is invalid", $lineno);
                    }
                    $param[$expk['name']] = $expv;
                    break;
            }
        }
        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);


        // check
        if (! isset($request['app'])) {
            throw new Twig_SyntaxError("no 'app' paameter", $lineno);
        }
        if (! isset($request['fct'])) {
            throw new Twig_SyntaxError("no 'fct' paameter", $lineno);
        }
        if (! isset($request['with'])) {
            throw new Twig_SyntaxError("no 'with' paameter", $lineno);
        }


        // return
        return new Twig_Node_Sample(new Twig_Node($param), new Twig_Node($request), $lineno, $this->getTag());
    }


    /**
     * (non-PHPdoc)
     * @see v0.02/Sample/_opt/Twig/Twig_TokenParserInterface::getTag()
     */
    public function getTag()
    {
        // using tag name
        return 'aither';
    }
}
?>





Nodeクラス

当該クラスでトークンをコンパイルします。
TokenParserクラスと同様に、
使用するフレームワークとの整合性に
十分に配慮する必要があります。

<?php
/**
* Twig_Node_Sample
* @author spark43
*
*/
class Twig_Node_Sample extends Twig_Node
{
    /**
     * __construct
     * @param $name
     * @param $value
     * @param $lineno
     * @param $tag
     */
    public function __construct($param, $request, $lineno, $tag = null)
    {
        parent::__construct(array('param' => $param), array('request' => $request), $lineno, $tag);
    }

    /**
     * (non-PHPdoc)
     * @see v0.02/Sample/_opt/Twig/Twig_Node::compile()
     */
    public function compile($compiler)
    {
        $compiler->addDebugInfo($this);


        // prepare request (from token parser)
        $app = $this['request']->app['name'];
        $fct = $this['request']->fct['name'];
        $with = (isset($this['request']->with['name'])
                    ? $this['request']->with['name']
                    : VApp::BY_TPL);
        switch ($with) {
            case VApp::BY_OBJ:
            case VApp::BY_TPL:
                $withX = $with;
                break;
            default:
                $withX = VApp::BY_OBJ;
                break;
        }
        $compiler->write("\$req = new VRequest();\n")
                ->write("\$req->app = '". $app. "';\n")
                ->write("\$req->fct = '". $fct. "';\n")
                ->write("\$req->with = '". $withX. "';\n");

        // prepare parameters
        $param = $this->param;
        foreach ($param as $pk => $pv) {
            if ($pv instanceof Twig_Node_Expression_Name) {
                $compiler->write("\$req->". $pk. "=". $pv['name']. ";\n");
            }
            if ($pv instanceof Twig_Node_Expression_Constant) {
                $compiler->write("\$req->". $pk. "=". $pv['value']. ";\n");
            }
        }

        // execute requested app
        $compiler->write("\$vservice = new ThemeService(\$req);\n")
                ->write("\$aether_result = \$vservice->service();\n");
        switch ($withX) {
            case VApp::BY_OBJ:
                $compiler->write("\$context['". $with. "'] = \$aether_result;\n");
                break;
            case VApp::BY_TPL:
                $compiler->write("echo \$aether_result;\n");
                break;
        }
    }

}
?>




Twigでタグを作成する場合、それも特にNodeクラスを作成する場合には、

キャッシュしておくとcompile結果がキャッシュ・ファイルに出力されるので

compile結果がPHPとして正しく動作するか、

組み込むフレームワークとの連動が正しく行われるか、

実行結果がただしく画面表示されるか、

というようにソースコードのレベルでチェックできると思います。



このように、独自でタグを作成する場合には、

詳述しませんが、

 ・Tokenクラス

 ・TokenStreamクラス

 ・Nodeクラス

 ・Node/Expression/以下の、NodeExpressionクラス

などのソースを熟読することをお勧めしておきます。

2010年7月13日火曜日

twigのクラス階層図

doxygen+graphvizで、twigのクラス階層図を作成してみました。






ダウンロードして、拡大して、参照してみてください。

一応、ご参考まで。(あまり参考になりませんけど。)

Twigでタグを自作

Twigで新しいタグを定義してみました。

タグを自作して、それをTwigに組み込む方法が
少し分かりました。


が、想像以上に面倒ですし、
今でも未だ分からないことがたくさんです。。。



0.概要

(1)作りたいタグ
今回、Twig0.9.8で、次のようなタグを作ってみます。
    {% sample name as 'my tag' %}

一応、ドキュメントでは当該タグの作り方が記述されてますが、
どうやら内部仕様が変わってしまったようでして、
ドキュメント通りにコーディングしても、うまく動作しません。。。

そこで、実際どうやるの?っていうのを調べてみます。


(2)作成手順
以下を見てもらえれば分かるんですが、
大まかに言うと、タグを新しく作るには、
 ■TokenParser:構文解析し、Nodeを生成する
 ■Node:コンパイル時に出力する内容を生成
の2点を新しく作成する必要があるようです。

そして、それらは、
 ■Extension
   ↓
 ■TokenParser
   ・
   ・(コンパイラによるコンパイル)
   ・
 ■Node
のような手順で実行されるようです。



1.Extension定義

filterやtagを登録するのは、基本的に、
Twig_Extensionを継承したクラスから行います。
ここでは、自作したTokenParserを登録します。
<?php
class Twig_Extension_Sample extends Twig_Extension
{
    // !! return a handmaid token-parser !!
    public function getTokenParsers()
    {
        return array(
            new Twig_TokenParser_Sample(),
        );

    }

    public function getName()
    {
        return 'sample';
    }
}

?>




2.TokenParser作成

TokenParserを作成するとき、一応、parserの機能を使ってparseできます。
しかし、具体的に、どんな機能があるかは、
Twig_Parserクラスのソースを読むしかないようです。。。
<?php
class Twig_TokenParser_Sample extends Twig_TokenParser
{
    public function parse(Twig_Token $token)
    {
        $lineno = $token->getLine();

        $stream = $this->parser->getStream();
        $exp = $this->parser->getExpressionParser();

        // !! analyze token !!
        $name = $exp->parseAssignmentExpression();
        $stream->expect(Twig_Token::NAME_TYPE, 'as');
        list(, $value) = $exp->parseMultitargetExpression();
        $stream->expect(Twig_Token::BLOCK_END_TYPE);

        return new Twig_Node_Sample($name, $value, $lineno, $this->getTag());
    }

    // !! this is tag name (in this case, 'sample' tag) !!
    public function getTag()
    {
        return 'sample';
    }

}
?>




3.Node作成

ここでの目玉は、何といってもcompile()ですが、
ここもTwig_Compilerクラスのソースを読むしかないようです。。。
<?php
class Twig_Node_Sample extends Twig_Node
{
    protected $_name = null;
    protected $_value = null;


    public function __construct($name, $value, $lineno, $tag = null)
    {
        parent::__construct(array('name' => $name, 'value' => $value), array(), $lineno, $tag);

        $this->_name = $name;
        $this->_value = $value;
    }

    public function compile($compiler)
    {
        $compiler->subcompile($this->_name, false);
        $compiler->raw(' = ');
        $compiler->subcompile($this->_value);
        $compiler->raw(";\n");
    }

}
?>




これらにより、実際のコンパイル結果には、
次のように出力されます。
$context['name'] = "viva";

たったこれだけ出力するだけで、結構な労力が必要ですね。。。

タグを自作する場合には、どうしても必要な場合だけに
限ったほうがいいと思います

でも、どうしても必要な場合は、果たしてあるんでしょうか・・・?
それよりも、Twigを使う場合のViewクラスなどを工夫したほうが
よさそうな気がしますが、どうでしょう?

2010年7月7日水曜日

Twigで自作フィルタ

Twigでは色々なものを自作して組み込むことができるそうで、
フィルタやタグは勿論のこと、何だったらparserとかも自作して
組み込むことができそうです。


今回、Twigのフィルタを自作して組み込んでみたので、
その方法について、軽く整理しておきます。


今回作成するのは、nl2br(改行コードをbrタグに変換)です。
信じられませんが、意外とこれが無かったりします。


1.フィルタ本体



class Sample_Extension extends Twig_Extension
{
    public function getFilters()
    {
        return array('nl2br' => new Twig_Filter_Method($this, 'nl2br'));
    }

    public function nl2br($value, $sep = '<br />')
    {
        return str_replace("\n", $sep."\n", $value);
    }

    public function getName()
    {
        return 'sample';
    }
}

ポイントは2点。
 ■Twig_Extensionを継承して作り、getName()を実装
 ■フィルタとして登録する機能をgetFileters()で返す
  (このとき、PHP関数なのかクラスメソッドなのか
   インスタンスメソッドなのかで実装方法が異なりますので、
   詳しくはドキュメントを読みましょう。)

※ここでは、スゲー適当なクラス名で作成し、
 スゲー適当なファイル名で保存しました。

※Twig標準のautoloaderに読み込ませる場合には、
 真面目に命名し、真面目なファイル名で保存し、
 真面目なフォルダに保存しておきましょう。
 Twig/Extension/Core.phpや
 Twig/Autoloader.phpなど
 のソースを読めば、すぐに理解できると思います。

 

2.Twigへの組み込み



$twig->addExtension(new Sample_Extension());

上記1で作成したフィルタを、Twig_EnviromentにaddExtensionで追加します。



・・・以上です。

簡単でしたね。

合格証受領

合格証が届きました。

先週土曜日、所用で東京に行っていたのですが、

そのときに配送されていたようです。

第18回ITコーディネータ試験に合格しました。



8月下旬頃から研修が始まりますので、

その申し込みと、開始までにより一層のお勉強と、

・・というのを片手間にやりつつの、本業と。

忙しい日々が続きますが、頑張ります。

2010年6月26日土曜日

ITコーディネータ 筆記試験合格

第18回ITコーデイネータの筆記試験を5月23日に受験していました。

6月25日にWEBサイトで合格者発表を速報的に掲載されてました。

それが、どうやら、合格できたみたいです。(多分)



ご存知ない方のために付記しますと、

ITコーディネータというのは、経営者とITベンダーとの橋渡しを

するための役割を担うための民間資格です。

そのため、次の能力・技能・知識を要求されます。

   (1)経営と情報技術の双方の知識

   (2)経営者層をはじめ各ステイクホルダーとの
     コミュニケーション能力

   (3)情報システム構築プロジェクトの監理能力

そして、ITコーディネータの資格を取得するには、

筆記試験合格とケース研修修了の両方を

クリアしなくてはなりません。



私は、筆記試験には無事合格しましたので、

今度は、ケース研修の修了を目指すことになります。

受講料525,000円で、期間は8/20~11/20のようです。

※最初にこの受講料を見たとき、
 私も「えっ?!」と驚きました。



7月1日に合格証が発送されるということで、

いずれにしてもそれを受け取ってからの話になります。



間違いなく合格していたら、

ケース研修に申し込み、11月までみっちりと頑張る所存です。

2010年6月24日木曜日

Xoops(Cube)でtabパネル


あまり重要でないけど表示したいといったコンテンツをタブでまとめたり、
派生項目がたくさんあるようなコンテンツをタブで分散したり、
というようなことは、アプリケーションではよくありますよね。

今回、jQueryを使ってXoops(Cube)でタブを実現する方法について、
少し試してみましたので、以下で説明します。



■0.今回の前提

(1)「jQueryを使ったタブ」のサンプルとして、こちらのサンプルを参照します。
(2)Xoops画面に配置した幾つかのブロックをタブにまとめることを目標とする


■1.そもそもjavascriptって、どうやって取り込むの?

jQueryは、要するに、javascriptです。

フツーのHTMLの場合、javascriptを取り込むには、
<head>~</head>で囲まれた部分に、
   <script type="text/javascript">
    alert("こんにちは!");
   </script>
のように書いたり、
   <script type="text/javascript" src="hogehoge.js"></script>
のように書いたりします。
※<body>~</body>で囲まれた部分に書くことも出来ますが、
 可読性や保守性を考慮して、出来るだけ避けたほうが良いようです。

Xoops(Cube)でjqueryのようなJavascriptを取り込む場合も同じです。

ただ、Xoops(Cube)の場合、~.htmlがアチコチにあるようなイメージがあります。
どのhtmlをイジればよいのか判断するためには、予備知識が必要になりますので、
次節で説明します。



■2.そもそも何をイジればよいのか ※Xoops(Cube)の画面について

「幾つかのブロックをタブにまとめる」のようなことをする場合、
そもそも、どのファイルをイジればよいのか、分かるでしょうか?
それを理解するためには、Xoops(Cube)の画面描画について
理解することが必要です。

奥深く見ていけばキリがありませんが、極めてザックリとでも
理解しておくことで、「どこを触ればいいのか」が分かるようになります。

Xoops(Cube)の画面描画は、次のような流れになっています。
    ・各モジュール・ブロックのtemplate
              ↓
    ・PHP(Smarty)で解析
              ↓
    ・PHP変数($xoops_lblockとか)に格納
              ↓
    ・テーマのtemplateにPHP変数をセット
              ↓
    ・テーマのtemplateをPHP(Smarty)で解析
              ↓
    ・Xoops(Cube)の画面として描画

つまり、テーマという大枠のhtmlの中に、
各モジュールやブロックが自動的に組み込まれていきます。
※自動的に組み込まれていく流れが、上記の流れになります。

そもそも、htmlファイルの中に<head>~</head>が現れる部分は
テーマにしかありません。


従って、今回イジるのは、テーマのhtmlファイルということになるワケです。



■3.そもそもタブって、どうやってるの?

これは、Xoopsの話ではなく、htmlとかjavascriptの話になります。
※一般的にタブでやってることをXoops(Cube)にも適用するだけの話、
 ということです。

ここで、最初のほうで挙げたサンプルを参照してみます。

まず、タブに表示するデータはすべて、<ul>でHTMLに書いてあります。
<div id="container">
    <ul class="tab">
        <li><ahref="#tab1"class="selected">JavaScript</a></li>
        <li><ahref="#tab2">CSS</a></li>
        <li><ahref="#tab3">HTML</a></li>
        <li><ahref="#tab4">jQuery</a></li>
        <li><ahref="#tab5">XHTML</a></li>
    </ul>
    <ul class="panel">
        <li id="tab1">aaa<li>
        <li id="tab2">bbb<li>
        <li id="tab3">ccc<li>
        <li id="tab4">ddd<li>
        <li id="tab5">eee<li>
    </ul>
</div>
タブのラベルに表示する文字はclass="tab"のulに、
タブの内容として表示するデータはclass="panel"のulに
それぞれ書かれているのが分かります。

このHTMLに対して、javascript(jQuery)で
panelでは現在選択されているタブの内容だけ表示する
ように制御しています。
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> //・・・(A)
<script type="text/javascript">
$(function(){ //・・・(B)
    $("ul.panel li:not("+$("ul.tab li a.selected").attr("href")+")").hide();
    $("ul.tab li a").click(function(){
        $("ul.tab li a").removeClass("selected");
        $(this).addClass("selected");
        $("ul.panel li").slideUp("fast");
        $($(this).attr("href")).slideDown("fast");
        return false;
    });
});
</script>
上記(A)の部分では、Google API経由でjQueryを参照しています。
また、上記(B)の関数内で、
panelでは現在選択されているタブの内容だけ表示する
ように制御しています。

ただし、少し手抜きが過ぎるようです。
つまり、panelに表示するデータとして、ulタグによるリストを表示しようとすると
該当リストが表示されなくなります。

そのため、次のように改造してやります。
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> //・・・(A)
<script type="text/javascript">
$(function(){ //・・・(B)
    $("ul.panel > li:not("+$("ul.tab li a.selected").attr("href")+")").hide(); //・・・(modify 1)
    $("ul.tab li a").click(function(){
        $("ul.tab li a").removeClass("selected");
        $(this).addClass("selected");
        $("ul.panel > li").slideUp("fast"); //・・・(modify 2)
        $($(this).attr("href")).slideDown("fast");
        return false;
    });
});
</script>
分かりにくいですが、panelのliを参照する箇所を
「panel li」ではなく「panel > li」
に変更してあります。

あとは、CSSを使って、class="tab"の部分をタブらしくヨコに並べるなどします。
※display:blockにしてfloat:leftするなど、お馴染みの方法です。
 この例だと、class="panel"側でclear:bothしているようです。
 余談ですが、こういうのもCSS3だとラクが出来るそうでして、
 いわゆるclear-fix的なテクニックが不要になるらしいです。



■4.Xoops(Cube)でタブを使ってみよう

すっかり前提が長くなってしまいましたが、
ここまで、上記1.2.3.と説明してきた内容を元に
いよいよXoops(Cube)でタブを使ってみましょう。

大まかな手順は、上記3.から、
    ・「HTMLの編集」
        ↓
    ・「javascript(jQuery)の導入」
        ↓
    ・「cssで見た目を整える」

とすればよいことが分かります。

さらに、上記2.から、
「HTMLの編集」は、「テーマ(HTML)の編集」をすればよい
ことが分かりますので、Xoops(Cube)の場合、
    ・「テーマ(HTML)の編集」
        ↓
    ・「javascript(jQuery)の導入」
        ↓
    ・「cssで見た目を整える」

といった手順で、Xoops(Cube)にタブを導入してみます。



手順1:「テーマ(HTML)の編集」

今回は、LEFTブロックに配置されるブロックをすべてタブに入れてみます。
テーマ(HTML)のLEFTブロックに該当する部分について、
上記3.と同じようにするために、次のように修正します。
<div id="container">
    <ul class="tab">
<{foreach item=block from=$xoops_lblocks name=tab_title}>
        <li><a href="#tab<{$smarty.foreach.tab_title.iteration}>" <{if $smarty.foreach.tab_title.first}>class="selected"<{/if}>><{$block.title}></a></li>

<{/foreach}>
    </ul>
    <ul class="panel">
<{foreach item=block from=$xoops_lblocks name=tab_content}>
        <li id="tab<{$smarty.foreach.tab_content.iteration}>"><{$block.content}></li>
<{/foreach}>
    </ul>
</div>




手順2:「javascript(jQuery)の導入」

上記1.で説明したように、<head>~</head>で囲まれた箇所に
javascript(jQuery)を導入するための記述を追加します。
追加する内容は、上記3.で説明したjavascriptをそのまま転記すれば大丈夫です。
転記する場所は、テーマ(HTML)の<head>~</head>で囲まれた箇所の
最後にでも書いておけば大丈夫です。
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
    $("ul.panel > li:not("+$("ul.tab li a.selected").attr("href")+")").hide();
    $("ul.tab li a").click(function(){
        $("ul.tab li a").removeClass("selected");
        $(this).addClass("selected");
        $("ul.panel > li").slideUp("fast");
        $($(this).attr("href")).slideDown("fast");
        return false;
    });
});
</script>




手順3:「cssで見た目を整える」

上記3.でも触れたように、タブをタブらしく見せるなど、
cssで見た目を整えてあげましょう。

リストをヨコに並べるには、「float:left;」を使うのが定番みたいです。
「float:left;」だとそれを解除するコードが必要になりますが、
この辺りのテクニックは「clear-fix」で検索すればたくさん見つかります。

タブの背景画像をオンラインで作ってくれるサービスなんかも
検索すればたくさん見つかります。

デザインを頑張るのは、割と楽しいです。(仕事でなければ・・・)
どうか頑張ってデザインしてみてください。




・・・長くなりましたが、以上で説明は終わりですが
どうだったでしょうか?

結局、長々と説明した割りには、Xoops(Cube)に特化した部分は
ほとんど出てきませんでした。

実は、Xoops(Cube)だからって、何か特別なことをしなければ
いけないということはありません。

でも、Xoops(Cube)って難しいと思われがちで、敬遠されがちなので、
こういったエントリを書いてみました。


皆様の何かのご参考になれば、幸いです。

2010年5月8日土曜日

【Twig】テンプレートにassignした変数を取得

あらかじめ

 {{ foo1 }}とか

 {{ foo2|safe }}とか

 {{ foo3.func('bar') }}とか

などと書かれたテンプレートを解析して、

foo1とかfoo2とかfoo3を抽出したい、というような場合。

※需要、ないなあ・・・。



パッと思いつくのはpreg_matchとかで

文字列解析する方法ですが、

テンプレートエンジンの場合、

タグの開始・終了文字(*1)をユーザが自由に

変更できたりするなど、

あまり単純な方法ではダメなのではないか、と思い。



でも、twigの場合、parser,lexerが外から操作できたり

簡単に拡張できたりするので、それでやってみよう、と。



・・・ということをやってみました。



抽出する関数
function getAssignVarsFrom($stream)
{
$ret = array();
$bIn = false;
$bInFirst = false;
while(! $stream->isEOF())
{
// get current node
$curr = $stream->getCurrent();

switch ($curr->getType()) {
case Twig_Token::VAR_START_TYPE:
$bIn = true;
$bInFirst = true;
break;
case Twig_Token::NAME_TYPE:
if ($bInFirst) {
$ret[$curr->getValue()] = $curr->getLine();
}
$bInFirst = false;
break;
case Twig_Token::VAR_END_TYPE:
$bIn = false;
$bInFirst = false;
break;
default:
break;
}

// next
$stream->next();
}
return $ret;
}



呼び出し側
$loader = new Twig_Loader_Filesystem('/path/to/template/');
$twig = new Twig_Environment( $loader,
array(
'cache' => '/path/to/cache',
'auto_reload' => true,
)
);
$escaper = new Twig_Extension_Escaper(true);
$twig->addExtension($escaper);
$stream = $twig->tokenize($twig->getLoader()->getSource('sample2.html'), 'sample2.html');
$assigned_vars = getAssignVarsFrom($stream);

※かなり手抜きです。
 "Twigの使い方"みたいなヤツのサンプルを簡単にイジっただけなので、
 余計な処理がテンコ盛りだと思います。
 (コンパイルしてないからcacheいらないんじゃないか、とか。
  extenssionは関係ないんじゃないか、とか。)



tokenize()が返してくるstreamの中にtokenが格納されているので、

NAME_TYPEだけ引っこ抜く、と。



それだけだと、safeとかfuncだとかも引っこ抜いてきてしまうので、

取り敢えず、VAR_START_TYPEからVAR_END_TYPEの間で

最初に出てきたNAME_TYPEだけ引っこ抜く、と。



これで本当によいのかどうか、かなり怪しいところですが、

取り敢えず、ちゃんとfoo1,foo2,foo3だけ返してきてます。



ちなみに、Twigのバージョンは、0.9.6-DEVを使いました。

2010年5月6日木曜日

Twig?

PHP向けテンプレートエンジンである、Twig。

その出自から、symphonyというフレームワークと

相性がいいとは思うのですが、

別にsymphonyでなくとも使いたいなあと思い、

最近、少し研究しています。



サンプルを見ていると、

変数をassignしてrenderする方法はたくさん見つかりますが、

クラスのインスタンスをassignして

テンプレート側でクラスメソッドを実行するのって

あまりサンプルを見かけることがなかったのですが、

直感的に出来るハズだと思い、やってみました。


呼ばれるクラス。
class vivatest
{
    public function find($param = 0)
    {
        echo "this is vivatest's find method. ( $param ) <br />";
    }
}



クラスのインスタンスをテンプレートに埋め込む処理。
    $testcls = new vivatest();

(・・色々、省略。詳しくは、Twigのサイトでサンプル拾ってください・・)

    $template = $twig->loadTemplate('samplehtml');
    echo $template->render(array('vivatest' => $testcls));



テンプレート。
<html>
<title>title</title>
</html>
<body>
<p>{{ vivatest.find() }} {{ vivatest.find(1) }} {{ vivatest.find('x') }}</p>
</body>



実行結果。
this is vivatest's find method. ( 0 )
this is vivatest's find method. ( 1 )
this is vivatest's find method. ( x )




・・・別に、何のことはなかったですね。



直感的に「こうするんじゃないかな?」と思った方法で、

ちゃんと実行することが出来ました。

2010年5月4日火曜日

log4phpのLoggerConfiguratorPhp.php

LoggerConfiguratorPhpでLoggerAppenderRollingFileを使えるよう、
修正してみました。
@@ -85,8 +85,6 @@
                    
                }
                
-                // added by viva(2010.05.04)
-                $this->_validateApender($appender, $appenderProperties);
            }
            
        }
@@ -131,21 +129,6 @@
        }
        
        return true;
-    }
-
-    //
-    // added by viva(2010.05.04)
-    //
-    protected function _validateApender($appender, $appenderProperties)
-    {
-        $validater = new LoggerReflectionUtils($appender);
-        foreach ($appenderProperties as $pk => $pv) {
-            if ($pk == 'class' || $pk == 'layout') {
-                continue;
-            }
-            $validater->setProperty($pk, $pv);
-        }
-        $validater->activate();
    }
    
}


定義ファイルは次のようにPHP配列の形で書きます。
<?php
return array(
        'threshold' => 'ALL',
        'rootLogger' => array(
            'level' => 'INFO',
            'appenders' => array('default'),
        ),
        'loggers' => array(
            'dev' => array(
                'level' => 'DEBUG',
                'appenders' => array('default'),
            ),
        ),
        'appenders' => array(
            'default' => array(
                'class' => 'LoggerAppenderRollingFile',
                'layout' => array(
                    'class' => 'LoggerLayoutPattern',
                    'conversionPattern' => "%d [%p]: %m (remote_ip_address=[%X{ip_address}] uri=[%X{uri}])%n",
                ),
                'file' => 'logging.log',
                'MaxFileSize' => '100k',
                'MaxBackupIndex' => 3,
            ),
        ),
    );
?>

LoggerConfiguratorPhpを使って便利なのは、
たとえばlog出力先を絶対パス指定や
"../hoge/"のようなあまり使いたくない形式の相対パス指定で
書かずに、"$logpath/log.txt"のように変数指定できるので、
設定を動的に変更することが容易になる
ことが挙げられます。


ちなみに、呼び出しは、次のようにします。
        LoggerMDC::put('ip_address', $_SERVER['REMOTE_ADDR']);
        LoggerMDC::put('uri', $_SERVER['REQUEST_URI']);

        Logger::configure('configurator_php.php', 'LoggerConfiguratorPhp');
        $logger = Logger::getRootLogger();
        $logger->info("logging start");


とは言え、大して需要があるとも思えませんので、
覚書程度に書き残している次第です。

2010年4月20日火曜日

SoyCMS

SoyCMSの内部は、SOY2フレームワークという

自作のフレームワークで動かしているそうです。

いま、ここで解説されてます。



その中で、次の点は、個人的には特に白眉だと思いました。

SOY CMSで採用したパターンは
  1. V:リクエストからどのVを表示するか自動的に決定
    C:Vの中で必要に応じてロジックを呼び出す
  2. V:表示
のようにView内部に全ての処理を行うパターンです。




個人的には、これからこういう方向に進むのではないかと思っていたので、

それを既にしっかり形にしてウリにしてる点で、「先駆者」と感じています。

2010年4月13日火曜日

ヤリタイコト

一人親方になろうと決めて、色々と活動するようになって以来、

自分で何がしたいのか自分でも測りかねていて、

そのために、「何かやりたい」みたいな漠然とした思いだけを抱えて

それでもメシ食っていくために全然違うことをしてきた気がします。



そのため、トンチンカンなことをしては、自分で苦しんできた気がします。



それが、今日(ついさっき)、少し見えてきた気がしました。

自分が本当にやりたかったことは何なのか。



ザックリと企画書を書いて、色々な人に見てもらいに行って、

カネになるかどうか、カネになるようにするにはどうしたらいいか、

相談するようなところから再スタートを切りたい心境です。



・・・って言うか、ええい、やっちゃえ。(笑



少し遅すぎる感はありますが、ここに至るまでには、きっと、

自分を追い込む期間が必要だったのだろうと考えることにします。(^^)

2010年4月9日金曜日

不況に思う

不況の中、自社の状況を変えたいと真剣に考える会社は

昨年の内から仕込みを始めていて、

今年、それが結実するように

動いていたように見えます。



しかし、不況はやはり甘くはなく、

仕込みが甘かったところは淘汰されているように見えます。



不況による「change」とは、

弱いところが消えていき、強いところが息を吹き返す、

そういう種類の変化であるように見えます。



こういう時期に、中長期戦略の変更を余儀なくされて

いる会社は、ひょっとしたら、少し考えたほうがいい

のかも知れません。



中小企業はどこも大変かも知れませんが、

勢いをつけている会社も散見されることを鑑み、

焦らず、くさらず、確実に仕留めにいくことが

いまの時期は重要だと思われます。

2010年3月26日金曜日

DOMMUNE

いま何だか話題らしいです。
http://www.dommune.com/


ちなみに、WEBサイトはflashが一杯でした。

flashはすべて一旦ブロックしている私のブラウザ画面では、

↓このように見えます。

2010年3月25日木曜日

HTML5

IE9: HTML5で新スタート! XPサポートなし

どうでしょう、いよいよHTML5は本格化していくのでしょうか?

いずれにせよ、HTML5だろうが何だろうが、
お客さんには関係ないっちゃ関係ないですよね。。。

2010年3月23日火曜日

これは・・・?

ネットで↓こんなものを見かけました。

Blog Keyword Visualizer

個人的には、非常に面白いとは思うんですけど、
残念ながら、いまこういうのを見ても、
「ああ、この手のやつ」っていう認識になって
しまうのかも知れませんね。。。

2010年3月17日水曜日

PHPで書かれたMVCフレームワーク

表題の件、軽く一覧にまとめてあるサイトがありました。

まだまだ記載されていないものもあるでしょうが、

それでも、考えられないほどたくさんありますよね。。。

2010年3月15日月曜日

PHP5.3以降

PHP5.3以降では、POSIX拡張正規表現構文を実装する

ereg関数がdeprecatedになるらしい。。。



PHPって言語とお付き合いするのも、

もういい加減疲れますよね。。。

radiko.jp

『パソコンがそのままラジオ受信機となる

 「IP(Internet Protocol)サイマルラジオ」(radiko)の

 実用化試験配信を開始』

・・・だそうです。

ラジオの聴取環境が、近年、著しく悪化しているらしく、

こういった難聴取を解消することも目指している、らしいです。



結構、良い音質ですね。

私のようにラジオ受信機を持っていない人間からすれば、

これは有難いサービスです。



地域限定なので、東京・大阪だけらしいですが、

全国に広まるといいですね。

2010年3月14日日曜日

OSC神戸 ~Magento聞いてきました~

久し振りに、本当に久し振りに、神戸に行ってきまして、

OSC神戸で、magentoの話を聞いてきました。

オープンソースのECサイト構築向けCMS。


=================================================
1.機能
=================================================
☆マルチサイト対応

☆多言語(通貨も含めて)

☆BTO,ダウンロード販売,ドロップシッピング対応

などなど、非常に豊富な機能が最初から標準であり、

さらに、2,000とも3,000とも言われるプラグインを

導入することで、さらに色々できる。


=================================================
2.有償/無償
=================================================
有償のエンタープライズ版と

無償のコミュニティ版がある。

が、メインの開発者たちは、もうあまり無償版には

口や手を入れていない、らしい。


=================================================
3.デザイン変更
=================================================
デザインを柔軟に変更できるように、

「レイアウトXML」ファイルでデザイン配備を設定。

ただ、記述内容にmethod="$this->setCategoryName()"

といったように、Blockオブジェンクトのpublicな

メソッドを思い切り書くようなことができるため、

デザイナがレイアウト変更するのは、至難の業で

あろうことが容易に読み取れる。

※実際、デザイナと協業する場合には、
 デザイナ=css,js,画像の変更を担当
 プログラマ=レイアウト変更,PGカスタマイズなど
 のように進めるらしい。。。

※って言うか、そもそも、テンプレートは
 header(); ?>的な、
 いわゆるPHPテンプレートらしい。。。orz
 逆に、だからこそ柔軟に変更できるんだろう
 とは思いつつ。。。ブロックの中に別の
 ブロックを入れることとか出来るらしい。


=================================================
4.処理速度
=================================================
スゲー重いらしい。

共用レンタルサーバーとかだと遅すぎて

使えないんじゃないかって話すら。。。



・・・いずれにせよ、経験者の話というのは、

非常に有用だと改めて感じました。



magentoに対して期待が大きかっただけに、

話聞き終わってから、やっぱりそうかと思いつつ、

でも、でも、やっぱり落胆も大きく・・・。orz

2010年3月10日水曜日

オフィススイート製品

私は、現在、Microsoft Officeを持っていません。
PCにもインストールされていません。

私は、Microsoft Officeではなく、
オープンソース製品であるOpen Officeを使っています。
これは、Microsoft Officeとの互換性を目指した
オフィススイート製品ということになります。

このOpenOfficeは、実際には、特に操作性の面で、
Microsoft Officeとの違いに戸惑うことが多いです。

今日、お客様のところへお打ち合わせに行った際に
お客様のPCにて、久し振りにMicrosoft Officeを
使わせていただいたのですが、指が操作を覚えて
いたのか知りませんが、妙にシックリとくる感じを
覚えました。

たまに、各種セミナーなどで見かけるのですが、
OSSに魅せられたユーザーさんが社内で使用する
オフィススイート製品をすべてOpenOfficeに
入れ替えたいと提案するんだけれども、社内の
反対にあって断念する場面があるようです。

これは、致し方ないと思います。

”慣れ”を超えることは、本当に、容易では
ないと自分でも感じます。

私は、世の中でMicrosoft離れがもっと進めば
いいなと思って、まず自分から
Microsoft Officeを使うのをやめていますが、
それでも、実際、Excelはやっぱり便利ですものね。

2010年3月9日火曜日

テンプレートエンジン

「PHPがテンプレート言語っぽい」とか、

最近、たまに見かけるのですが、

一体、誰が言ってるんでしょう?





先日、各CMSを比較しつつ紹介するようなセミナーに

参加してきました。


案件に応じて各CMSをどのようにカスタマイズするか

というようなお話の流れでした。


それぞれのCMSが、テンプレートをどうイジるかという

話に終始している中で、WordPressだけは、

どこにどういうPHPコードを埋め込むか、という話に

なってしまっていました。




休憩時間のエレベータの中で、誰が言い出すともなく

「WordPressだけPHPの話をしてた・・・」

とポツリとつぶやくと、そこにいた全員が笑っていたのが

なにか印象的でした。




デザイナさんばかりが集まっているようなセミナー

だったので、PHPの話をされても少々困惑された方も

中にはいらっしゃったかも知れません。





WEBシステムに関して言えば、

システム屋よりもデザイナさんの方が

お客様に近いところに居る場面があります。


その場合には、デザイナさんに優しいシステムの方が

結局はお客様にとって使いやすいシステムになるのだと

考えると、システム屋としては、そこを外さないほうが

いいに決まってると思うのですが、いかがでしょうか?

2010年3月8日月曜日

言葉

日常、仕事の中で耳にする言葉の中で、

幾つか、気持ちの悪いものがあります。
  • コミットする
  • オミットする
  • アサインする
  • アテンドする
などなど。

まあ、別に、いいんですけどね。。。

2010年3月1日月曜日

軽く、風邪引き

昨日日曜は、軽く風邪を引いてしまいました。

一人親方は、健康管理がとても重要ですので、

日曜ということもあって一日大事をとって寝て過ごしました。

お陰でだいぶ良くなりました。



メールを確認したら、引き合いの確認メールを頂戴して

おりましたので、慌ててお詫びとお返事をメールさせて

いただきました。



油断していたつもりはないのですが、

健康管理は本当に重要ですね。

色々と、大事に至らなければよいのですが。。。



季節の変わり目ですので、皆様もどうか

健康管理に気をつけましょう。

2010年2月27日土曜日

WEBでプレゼンテーション

WEB上でプレゼンテーションできるjsライブラリを探していたら、

qNoteというjqueryプラグインを見つけました。


誰が作ったのか知りませんが、

仕様を見るかぎり、とても素晴らしそうです。



基本的に、idタグを渡してそれに対して制御をかける感じなので、

プレゼンテーション用のページはidタグだらけになりますが、

そもそもプレーンなHTMLのみで構成されたWEBページを作ることが

今時はもうほとんど無くなってしまったので、全く問題ないと思います。


これは、またいつか是非試してみて、レポートしたいと思います。

2010年2月12日金曜日

アラーム、そして営業

半年程前に、とある集まりに参加して、
「メンバーになりませんか?」
と、お誘いを頂いてのですが、
少なくとも年内は集中したいことがあるから、と
お断りしておりました。

半年後。
「そろそろ、また来ませんか?」
のお誘いのお電話をいただきました。

丁度よさそうな頃合に、きっちりと、
こういうお電話をいただくと、
営業としてやることやってるな、と感じます。

参加したいのですが、残念ながら、
昨年秋頃から色々とペースを崩しており、
いま立て直し中なので、残念ながら
ちょっと参加できそうにありません。

2010年2月1日月曜日

「アイデア発想法」的なセミナー

先日、サンソウカンで「アイデア発想法」的なセミナーがあったので、
久しぶりにサンソウカンに行ってきました。

この手の話を見たり聞いたりするのが久しぶりだったので、
まず単純に面白かったです。

セミナー内容を私なりにまとめたものを画像でアップしておきます。

基本といふこと

先日、ある方とお話をさせていただいたとき、
試しに、とても漠然とした質問を投げてみました。

「WEBで何か面白いサービスを展開できないか考えているけど、
 思いつくものが片っ端からカネになりそうにない。
 カネになりそうなサービスって、どうやって思いつくの?」

いま改めて自分で書いてみて、フザケてんじゃねえかと
訝しく思うほどの質問ですが、いただいたお答えは
非常にまっとうなものでした。

「まずは、WEBで面白いサービスを展開してるなと思う企業の
 サービスを自分なりに分析してみて、その企業がまだ
 やっていないニッチな部分を探してみてはどうか?」

・・・基本、ですね。


同業者分析とか、異業者分析とか、そういうことは
やはり誰でも一度はやってることでしょうね。。。

ただ、この方もお話されていたのですが、
そうやってシリアルに発想していく方法論の他に、
ドーンと3段飛ばしするような発想法も
どこかで必要な気はします。

いずれにせよ、
 ・自分の足元をみる
 ・自分の周りをみる
 ・宇宙から世界を眺める
というように、幾つかの視点を同時に併せ持っていると
何かと強いんでしょうね。

2010年1月31日日曜日

私の休日の過ごし方

毎週日曜日、
・ウィルススキャン(ネットに繋いだことがないデバイスもすべて)
・ボットスキャン(同上)
のように徹底的なスキャンをかけているので、
正直、仕事になりません。

※定常的なスキャンは日々実施していますし、
 ウィルスガードをOFFにすることは、ありません。
 そういう日常的な対策を超えて、
 より徹底的にウィルス対策する日が日曜日なんです。



そのため、毎週日曜日は、
・水まわりのお掃除
をガッツリやることにしています。

あまり詳しくありませんが、以前TVで
『お金を貯めたかったら水まわりを常に
 清潔・整頓しておくこと』
というようなことを風水の先生が
言っていたような記憶がウッスラとありまして
そのためです。

トイレやお風呂をゴシゴシ磨いていると、
何かに頭(こうべ)を垂れるとか、
何かに奉仕するとか、
そういった心持ちに至ることがあります。

この心はきっと大事なんだろうと
思うことにしています。

一週間に一度くらい、徹底的に掃除してみると
とても気持ちが良いものです。

お勧めです。

2010年1月29日金曜日

一つの理想・指針

『士別れて三日、即ち更に刮目して相待すべし』
日々鍛錬している者は三日も会わなければ見違えるほど変わっているということ。転じて、いつまでも同じ先入観で物事を見ずに常に新しいものとして見よという意味


こうありたいと願う今日この頃です。

2010年1月25日月曜日

改めて・・・

年も改まって早一ヶ月が経とうとしています。



改めて、当方が展開したい事業の方向のひとつを書いてみますと、

【システム開発による作業効率化のお手伝い】

というのがあります。(2010年1月現在)



今まで数日かかっていた作業が1分で終わったりすると

やはりインパクトがあります。

数日かかることを前提にした作業の進め方と

1分で終わることを前提にした作業の進め方は

当然変わってくるものです。

作業のリズムというようなものが変わり、

今まで間延びしていたようなリズムで進んでいたものが、

テンポよくピッチの速いリズムで進むようになるものです。



やがて、その作業を1分で終わらせることが当たり前に

なった頃、私の仕事は完了なんだろうと思っています。



そして、それは、お客様の苦手な分野であればあるほど、

インパクトを持っていると思います。



WEBの分野は、まだまだ未開拓な部分も多く、

技術基盤自体が日進月歩しているような状態です。

今のような変化を求められている時代に、

こういった発展途上なものを自分の仕事に

使わざるを得ないお客様にとって、

WEBというのは、まだまだ、もっと便利になる

可能性を秘めていると、私は思っています。



その一例がCMSと呼ばれるシステムです。

CMS 【コンテンツマネジメントシステム】
CMSとは、Webコンテンツを構成するテキストや画像、レイアウト情報などを一元的に保存・管理し、サイトを構築したり編集したりするソフトウェアのこと。広義には、デジタルコンテンツの管理を行なうシステムの総称。
Webサイトを構築するには、テキストや画像を作成するだけでなく、HTMLやCSSなどの言語でレイアウトや装飾を行ない、ページ間にハイパーリンクを設定するなどの作業も行なう必要がある。これらの要素を分離してデータベースに保存し、サイト構築をソフトウェアで自動的に行なうようにしたものがCMSである。
(以上、e-wordsより転載)

専門知識とか無くても、WEBの更新や管理を簡単に行えるようになる、

ということです。



現在、CMSは、無料(オープンソース)のものから、有料なものまで、

とてもたくさんの種類の製品が世の中に出回っていて、

どれを選べばよいのか困るほどです。

新しいものが生まれては消えていったりすることもありますので、

迂闊に手を出すのは躊躇われます。



その中で、当方は、Xoops(ズープス)という製品を推しています。

これは、オープンソースのライセンスで開発が行われている、

無料のCMSです。



無料ですので、手取り足取り教えてくれることはありませんが、

オープンソースだし、日本でも長い間使われてきたので、

WEBで検索すれば、知りたい情報をたくさん得ることができます。



昨年くらいから、各種CMSの使われ方を探るべく、裏で情報を

取っていたのですが、Xoopsはまだ人気があるようです。

色々なCMSを横に並べて眺めていると分かるのですが、

イノベーション採用者カテゴリが必ずしも

分かりやすくキレイには当てはまりにくく、

最初の内は、イノベータ・初期採用者・初期多数者が

渾然となって、使い始めているようなところがあります。

 ・システム開発を生業とするような人たちが使う
  ⇒「こんなシステム開発技術を使っているらしい」
  ⇒「導入してみた」
  ⇒「機能の一部をネチネチと使ってみた」
  ⇒「デザインをこのように改造した」
  ⇒「機能の一部をこのように改造した」
  ⇒「機能の一部をこのように新しく作った」

 ・ビジネスに目を光らせている人の中で
  割とシステムに明るい方々が使う
  ⇒「こんな機能やあんな機能がビジネスで使える」
  ⇒「導入してみた」
  ⇒「機能の一部をネチネチと使ってみた」
  ⇒「デザインをこのように改造した」

 ・一般の新しいものがお好きな方々が使う
  ⇒「こんな機能やあんな機能が面白そう」
  ⇒「導入してみた」
  ⇒「機能の一部をネチネチと使ってみた」
  ⇒「デザインをこのように改造した」

それが、やがて、後期多数派やラガートへと伝播されていきます。

 ・フツーの人たちが使う
  ⇒「こんな機能やあんな機能があるらしい」
  ⇒「導入してみた」
  ⇒「機能の一部をネチネチと使ってみた」

いま、新しく出てきているCMSは、まだまだ前者のレベルにあって

その普及に腐心しているようなところが見受けられますが、

Xoopsは、既に、すっかり後者の領域に入っているようです。

導入事例も星の数ほど豊富にあります。

つまづくポイントとその対策も、もう出尽くしている感すらあります。



・・・と、ここまで説明して、改めて、

当方の事業の方向の一つを書いてみると、

【CMSによるサイト構築のお手伝いと
 CMS利用による効率的なサイト運営のお手伝い】


ということになろうかと思います。



今年は、この辺りをもう少し深く踏み込んで

事業展開していけたら、と考えています。



今年も宜しくお願いします。

2010年1月22日金曜日

干草と針

(goo辞書より)
(look for) a needle in a haystack
干し草の山の中の針(を探す)
((不可能な事, むだ骨などのたとえ))


以前から、PHPの関数リファレンスを参照していると、

引数名に $haystack とか $needle とか出てきて、

一体、何だろうとは思っていたのですが、

今日、やっと謎が解けた、という話です。

※例)strpos($haystack, $needle[, $offset = 0])



恐らく、PHPerにはよく知られた話なんだろうと推測しつつ。

まあ、どうでもいいことです。

2010年1月11日月曜日

Magento


・・・グイグイ来てるように見えます。「そのうち時間ができたら研究しておこう」リスト入りです。

2010年1月9日土曜日

XDebug

長らく、PHPプログラムのテストは

Zend Debuggerでやってましたが、

今日、諸事情により、XDebugに乗り換えました。

個人的に、一番参考になったのは、

日本語サイトじゃなくて、英語サイトでした。

Getting Xdebug to work with Apache/XAMPP to debug PHP



Zend Debuggerだと、XoopsCubeのテストしてるとき

管理画面に遷移したらコケる率が異様に高かったのでした。

XDebugはまだやっとセットアップと動作確認が終わった程度ですが、

今のところ、管理画面に遷移してもコケてないです。

期待大、です。



・・・えええっと、がんばります。

2010年1月7日木曜日

起業といふこと

「利用者視点の強い信念がなければ技術は育たない」 - 国策スパコン、復活の意義を問う:ITpro

なんだか、IT系(特に技術分野)で起業を考えている人にも通じるものを感じる記事でした。気になったところを好き勝手に抜き出してみます。

研究者による新たな技術や法則の発見などの成果の先には、そこから生まれる製品やビジネスがあり、それを活用する利用者が存在する。すべての研究成果がすぐに分かりやすい形で利用者の目に触れるとは限らないが、それでもこうした利用者目線に立ち、強い信念を持って研究する姿勢が、ビジネスやライフスタイルを変えるイノベーションの最大の推進力になるとわたしは考える。


利用者目線をすぐに忘れがちです。すぐに「作りたいから作る」という穴にハマりそうになります。「使う人から要求されているものを作る」という職業的仕事的目線と「作りたいから作る」という人間的技術者的目線とは分けて考えたほうがよくて、その両方をやっていくのがいいのかも知れない、というようなことに思いを馳せました。

活動資金は研究者にとって欠かせないが、利用者視点の強い信念がなければイノベーションの推進力になる技術は育たない。むしろ、資金がないときの方が、資金に頼ることなく、新たな発想やアイデアが生まれることも多いと割り切って考えることも必要だろう。その上で、活動資金のことを考えるべきだ。


お客さんが付いちゃうと、そのお客さんの意向を汲んでどうこうということが発生したりして、思うような方向に進みにくくなることがあるかと思います。そういうとき、どう考え、どう行動するか、というようなことに思いを巡らせてしまいました。

わたしはよく、「1から10を作る研究」と「0から1を作る研究」があるという表現をする。前者が既存の技術を洗練させてパフォーマンスを高めるための研究で、後者が全くのゼロから価値を生み出すための研究という意味で使っている。


これもバランスとタイミングの問題で、どちらか一方をやっていればよいというものでも無い気がします。起業家としては、「0から1を作る」ようなことを考えたくなりますが、「1から10を作る」ことが利用者視点で”新しい価値”を生むのならば、とても意味があることのように思えます。

ただ、弱者の戦略として、強者と同じフィールドで強者と同じ武器で戦いに向かうのは避けたほうがいい。そのとき、つまり方向性を変えて考えるとき、「0から1を作る」ような方向に向かうのか、「1から10を作る」ような事業を考えるのか、既にアイデアがあってそれに対するスキルの蓄積がないならば、これはもう「1から10を作る」ような事業に向かうのがいいんだと思います。

というような言い方をすると混乱しますが、本質は、「まだ世の中にない武器を持って戦いに行く」ということなんだと思います。

新しい武器を考えるときに、そのアイデアが武器になるかどうか、殺傷能力が高いかどうか、というようなことが分かる嗅覚は、持ち続け、磨き続けていきたいものだと思います。

普通、怒られますよね。。。

「GodMode」以外にもあった「Windows 7」の隠し機能--マイクロソフト幹部が自ら公開
ブロガーたちによって発見された、あらゆる管理機能を一元化するGodModeと同様、フォルダを新規作成して任意のフォルダ名(GodMode以外も可)の後に特定の文字列を追加することによって、他の隠し機能にも直接アクセスできる。


詳細な操作方法は分かりませんが、「開発者向け機能の一つ」だそうです。
Vistaにも実装されてるけど、Vistaの64ビット版ではコケるそうです。
でも、Microsoftは「再現しない」とか言ってるらしいです。
さすがです。
まあ、開発者向けということだし、時々コケても知らないよ、と
そういうことなんだと思います。

ただし、Windows Vistaで問題が起きているとの報告を考慮すると、試す場合はWindows 7搭載マシン(理想的にはテスト用マシン)でのみ行うべきだろう。動作させるには、任意の名前でフォルダを新規作成し、名前の後にピリオドと、以下に挙げる文字列の1つをフォルダ名に設定する。

 一例を挙げると、下記一覧の1行目の場合はフォルダ名を「thankscnet.{00C6D95F-329C-409a-81D7-C46C66EA7F33}」と設定すればいい。この際、ファイル名には「」内の文字列全部(ただし「」自体は除く)を使用する。

 以下に文字列の一覧を挙げる。

{00C6D95F-329C-409a-81D7-C46C66EA7F33}

{0142e4d0-fb7a-11dc-ba4a-000ffe7ab428}

{025A5937-A6BE-4686-A844-36FE4BEC8B6D}

{05d7b0f4-2121-4eff-bf6b-ed3f69b894d9}

{1206F5F1-0569-412C-8FEC-3204630DFB70}

{15eae92e-f17a-4431-9f28-805e482dafd4}

{17cd9488-1228-4b2f-88ce-4298e93e0966}

{1D2680C9-0E2A-469d-B787-065558BC7D43}

{1FA9085F-25A2-489B-85D4-86326EEDCD87}

{208D2C60-3AEA-1069-A2D7-08002B30309D}

{20D04FE0-3AEA-1069-A2D8-08002B30309D}

{2227A280-3AEA-1069-A2DE-08002B30309D}

{241D7C96-F8BF-4F85-B01F-E2B043341A4B}

{4026492F-2F69-46B8-B9BF-5654FC07E423}

{62D8ED13-C9D0-4CE8-A914-47DD628FB1B0}

{78F3955E-3B90-4184-BD14-5397C15F1EFC}

 なお、繰り返しになるが、GodModeフォルダを作成するには、以下の文字列を使用する。

{ED7BA470-8E54-465E-825C-99712043E01C}

2010年1月5日火曜日

お手軽テスト環境

要するに、xampp+eclipse(PDT)+zend debuggerということ。

・・・なのですが、現在、すべてUSBメモリに格納して

環境ごと持ち運びできるようにしています。

※今どき珍しくもないので、詳細は割愛します。



ただ、このとき、私の勘違いかも知れませんが、

PHP5.3系のxamppバージョンでzend debugger5.2系を使うと、

すぐに落ちてしまいます。



なので、環境を構築するときの順番としては、

・zend debuggerのバージョンを調べるのが先

・xamppは、それに応じたバージョンを落としてくる

というようになります。



ってことで、ここ最近のxamppの各バージョンをまとめておきます。

xamppapachePHP5PHP4MySQL
1.6.82.2.95.2.64.4.95.0.67
1.7.02.2.115.2.85.1.30
1.7.12.2.115.2.95.1.33
1.7.22.2.125.3.05.1.37
1.7.32.2.145.3.15.1.41


(cf.)Installing Zend Debugger on Windows

甘かった・・?

ふと思い立ち、帳簿の入力を再開しています。

会計ソフト(個人事業主用)を買ってきて、

セットアップしていましたところ、

「消耗品費」や「福利厚生費」として、

 □トイレ用品代
 □石鹸・洗剤代
 □蛍光灯・電球代
 □常備医薬品代
 □残業食事代
 □ゴミ袋代

とか、そんなものまでありました。

いやあ、ビックリしました。

ここまでみておくのが当然なのかも知れませんが、

ここまで細かくみていませんでした。

・・・少し、反省しました。

2010年1月4日月曜日

リサイクル

今朝のニュースモーニングビジネスで

家具分解サービスが米国で伸びていると伝えていました。

度々デフレの状態に陥ったりそれが長引いたりすれば、

やはりリサイクル関係のビジネスは伸びるのかも知れませんね。

私などは、少し壊れればすぐに捨てることを考えてしまいますが、

もっとリサイクルを考えるべきかも知れません。

あけましておめでとうございます

あけましておめでとうございます。

皆様は、今年、どんな一年にしたいでしょうか?

当方にとって、今年もまだまだチャレンジの年です。

いま出来ることを少しずつ積み上げて、

やがて大きな実を結ぶよう頑張りたいと思います。

本年も、どうか宜しくお願い致します。