<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>DQNEO起業日記</title>
        <link>http://dqn.sakusakutto.jp/</link>
        <description>ど素人プログラマの挑戦。</description>
        <language>ja</language>
        <copyright>Copyright 2010</copyright>
        <lastBuildDate>Fri, 04 Dec 2009 16:42:19 +0900</lastBuildDate>
        <generator>http://www.sixapart.com/movabletype/</generator>
        <docs>http://www.rssboard.org/rss-specification</docs>
        
        <item>
            <title>[Perl]猿でもわかるクロージャ超入門</title>
            <description><![CDATA[<a href="http://dqn.sakusakutto.jp/2009/01/javascript_5.html"> [JavaScript]　猿でもわかるクロージャ超入門</a>という記事が好評だったので、今回はPerl編です。<br />
上記のJavaScript版の記事を読んだという前提で解説させていただきます。<br />

<h4>問題</h4>
<strong>呼び出すたびに、1,2,3,...を返すような関数f(　)を定義せよ。</strong><br/>
<pre><code>f();  //  1 
f();  //  2
f();  //  3
</code></pre>

<h4>クロージャ その１</h4>
JS版のクロージャに似せて書くとこうなります。<br />
<code><pre>#!/usr/bin/perl

use strict;
use warnings;

sub outer {
    my $i = 1;

    return  sub {
        print "$i\n";
        $i++;
    };

}

my $f = outer();

$f->(); # 1
$f->(); # 2
$f->(); # 3
</pre></code>
<br />
JS版とそっくりですね～。<br />
<br />
関数のリファレンスを使っているので、呼び出し方法が$f->()のような形になっちゃいますが、そこはご愛嬌ということで。<br />

<h4>クロージャ  その２</h4>
JSと違ってPerlでは中カッコ{}でスコープを作ることができるので、より簡潔に書けます。<br />
<br />
<code><pre>#!/usr/bin/perl

use strict;
use warnings;

my $f;
{
    my $i = 1;

    $f = sub {
        print "$i\n";
        $i++;
    };

}

$f->(); # 1
$f->(); # 2
$f->(); # 3
</pre></code>

<h4>クロージャ  その３</h4>
Perlではローカルスコープ内で宣言した関数を、スコープ外から参照することができます。<br />
これを利用すると、さらに短く書けます。<br />
<br />
<code><pre>#!/usr/bin/perl
use strict;
use warnings;

{
    my $i = 1;

    sub f {
        print "$i\n";
        $i++;
    }

}

f();
f();
f();

</pre></code>
以上、Perlでのクロージャの作り方でした。<br />
他にもいろいろ書き方があると思います。<br />
<br />
Perlってサイコー！！
<h4>クロージャの使われどころ</h4>
PerlにはClass::AccessorやClass::Data::Inheritablenaといった、オブジェクト指向をより便利にするための定番モジュールがあります。<br />
これらのモジュールでは、クロージャを使うことによってアクセサを実現しています。<br />
<br />
<h5>参考</h5>
<ul>
<li>
<a href="http://anond.hatelabo.jp/20071101181442">はてな匿名ダイアリー：PerlのClass::Data::Inheritableの解析 
</a><br />
軽妙な語り口でClass::Data::Inheritableの実装を解説してくれる。もはやこれは文学だ。
</li>
<a href="http://d.hatena.ne.jp/naoya/20060109/1136812096">Perl のクロージャ - naoyaのはてなダイアリー
</a><br />
クロージャの応用方法について深堀したい方はこちら。
</ul>
]]></description>
            <link>http://dqn.sakusakutto.jp/2009/12/perl_9.html</link>
            <guid>http://dqn.sakusakutto.jp/2009/12/perl_9.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Perl</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">クロージャ</category>
            
            <pubDate>Fri, 04 Dec 2009 16:42:19 +0900</pubDate>
        </item>
        
        <item>
            <title>[Perl]DBIの使い方入門</title>
            <description><![CDATA[PerlでDBIモジュールを使ってDB操作を行うためのかんたんなサンプルコードです。<br />
<br />
「都道府県マスタ」テーブルを作って、CRUD(レコード追加、読み取り、変更、削除)を行います。<br />
<br />
注：<br />
<ul>
	<li>コマンドラインから実行することを想定しています。</li>
	<li>ユーザ名、パスワード、DB接続情報などは環境に合わせて変更してくださいね。</li>
	<li>サンプルではMySQLを使用していますが、他のRDBMSにも使えると思います。</li>
</ul>
<br />

<pre><code> #!/usr/bin/perl
 
 use strict;
 use warnings;
 use DBI;
 
 my $user = 'username';
 my $passwd = 'pass';
 my $host = 'localhost';
 my $dbname = 'mysample';
 my $dbh = DBI->connect("DBI:mysql:$dbname:".$host, $user, $passwd);
 
 my $sql;
 my $sth;
 
 # CREATE TABLE
 $sql = "CREATE TABLE prefmaster ( id INT , name VARCHAR(255) ) ";
 $dbh->do($sql);
 
 # INSERT
 $sql = " INSERT INTO prefmaster (id,name) values (1, 'hokkaido') ";
 $dbh->do($sql);
 $sql = " INSERT INTO prefmaster (id,name) values (2, 'akita') ";
 $dbh->do($sql);
 
 # SELECT
 $sql = "SELECT * FROM prefmaster";
 
 $sth = $dbh->prepare($sql);
 $sth->execute;
 
 print "SELECT\n";
 while(my @a = $sth->fetchrow_array){
     print "@a\n";
 }
 print "\n";
 
 # UPDATE
 $sql = " UPDATE prefmaster SET name = 'iwate' WHERE id = 2 ";
 $dbh->do($sql);
 
 # DELETE
 $sql = " DELETE FROM prefmaster WHERE id = 1 ";
 $dbh->do($sql);
 
 # SELECT AGAIN
 $sql = "SELECT * FROM prefmaster";
 
 $sth = $dbh->prepare($sql);
 $sth->execute;
 
 print "SELECT\n";
 while(my @a = $sth->fetchrow_array){
     print "@a\n";
 }
 print "\n";
 
 
 # DROP TABLE
 $sql = " DROP TABLE prefmaster ";
 $dbh->do($sql);
 
 
 $sth->finish;
 $dbh->disconnect;</code></pre>]]></description>
            <link>http://dqn.sakusakutto.jp/2009/11/perldbi.html</link>
            <guid>http://dqn.sakusakutto.jp/2009/11/perldbi.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">MySQL</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">Perl</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">Perl再入門</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">DBI</category>
            
            <pubDate>Thu, 05 Nov 2009 21:13:45 +0900</pubDate>
        </item>
        
        <item>
            <title>Ubuntu9.04でPECL版Memcachedを入れようとしたらphpizeエラーが出る場合の対処法</title>
            <description><![CDATA[Ubuntu9.04のPECL版memcachedクライアントを入れようとしたらphpizeでエラーが出ます。
<pre><code>userdqn@colinux:~$ sudo pecl install memcached
downloading memcached-1.0.0.tgz ...
Starting to download memcached-1.0.0.tgz (22,281 bytes)
........done: 22,281 bytes
4 source files, building
running: phpize
sh: phpize: not found
ERROR: `phpize' failed</code></pre>
<br />
この場合は、php5-devをインストールすればOK。
<pre><code> $ sudo apt-get install php5-dev</code></pre>




]]></description>
            <link>http://dqn.sakusakutto.jp/2009/11/ubuntu904peclmemcachedphpize.html</link>
            <guid>http://dqn.sakusakutto.jp/2009/11/ubuntu904peclmemcachedphpize.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">PHP</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">Ubuntu</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">Memcached</category>
            
            <pubDate>Thu, 05 Nov 2009 14:54:05 +0900</pubDate>
        </item>
        
        <item>
            <title>CoLinux - Ubuntu9.04を9.10にアップグレードしたら起動しなくなった。</title>
            <description><![CDATA[みなさん要注意ですよ！！

CoLinux(0.7.4) 上の Ubuntu9.04をUbuntu9.10にアップグレードしたら、このようなエラーメッセージを吐いてお亡くなりになりました。

<span class="mt-enclosure mt-enclosure-image"><a href="http://dqn.sakusakutto.jp/2009/11/05/colinux-error.JPG"><img alt="colinux-error.JPG" src="http://dqn.sakusakutto.jp/2009/11/05/colinux-error-thumb-426x389.jpg" width="426" height="389" class="mt-image-left" style=" margin: 0 20px 20px 0;"/></a></span>
<br style="clear:both;" />

CoLinuxが悪いんじゃないんです。
Ubuntuが悪いんじゃないんです。

バックアップをとっておかなかった私が悪いんです。

というわけで、みなさんも<strong><big>Ubuntuをアップグレードする際はバックアップをとりましょう！！</big></strong>


<a href="http://www.ubuntulinux.jp/getubuntu/upgrading910">Ubuntu公式サイト</a>にもちゃんとそう書いてあります。


<h5>アップグレードの前に</h5>

<ul>
	<li>    Ubuntu 9.04からUbuntu 9.10へは直接アップグレードができます（UpgradeNotes（英語）を見てください）</li>
	<li>   <strong> アップグレードの前にUbuntu 9.04における全パッケージのアップデートを必ず実施してください。</strong> </li>
</ul>

<h5>追記</h5>

同じ目に会った人が何人かいるようです。。。
今のところ解決策は見つかっていません。

私はあきらめて、Ubuntu9.04をインストールしなおしました。

]]></description>
            <link>http://dqn.sakusakutto.jp/2009/11/colinux_ubuntu904910.html</link>
            <guid>http://dqn.sakusakutto.jp/2009/11/colinux_ubuntu904910.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Linux</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">Ubuntu</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">coLinux</category>
            
                <category domain="http://www.sixapart.com/ns/types#tag">ubuntu</category>
            
            <pubDate>Thu, 05 Nov 2009 12:13:57 +0900</pubDate>
        </item>
        
        <item>
            <title>【秀丸マクロ】現在開いているファイルのパス名(フルパス)を取得するマクロ</title>
            <description><![CDATA[秀丸を使っていて、今開いているのファイルのフルパス名を取得したいことがよくあります。<br />
コマンドからやる方法がわからなかったので、マクロを作りました。<br />
<br />
<ul>
<li>下記の内容のテキストファイルを作って、"getFullPath.mac"というファイル名で、秀丸本体と同じ場所に保存してください。</li><pre><code>setclipboard filename;</code></pre>
WindowsXPの場合は"C:&yen;program Files&yen;Hidemaru&yen;"になります。<br />（他の場所でもＯＫです。）
<li>メニュー＞マクロ＞マクロ登録<br />
で、タイトル名に「フルパス取得」など入力。ファイル名の欄で、"getFullPath.mac"を選択すればＯＫです。</li>
</ul>


]]></description>
            <link>http://dqn.sakusakutto.jp/2009/09/post_42.html</link>
            <guid>http://dqn.sakusakutto.jp/2009/09/post_42.html</guid>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">秀丸</category>
            
            <pubDate>Sat, 19 Sep 2009 21:04:18 +0900</pubDate>
        </item>
        
        <item>
            <title>Ethnaでアクションからのビュー名指定を間違えると画面が真っ白になる場合の対処法</title>
            <description><![CDATA[Ethnaでは、アクションクラス内でreturn 'user_login' などと書くと、対応するビュークラスを呼び出して画面表示してくれる。<br/>
<br/>
ここで、スペルミスでreturn 'user_loginnn'など存在しないビュー名を書くと、ブラウザの画面が真っ白になることがある。<br/>
Ethna初心だった頃の私は、よくこの真っ白画面に出くわして途方にくれた。<br/>
何が原因かさっぱりわからず、ビュー名の指定ミスだと気付くまでに数時間かかったりした。

<br/>
そこで簡単な対処法を紹介します。<br/>
<br/>
Ethna_Controller.phpの1545行目あたりで、
<pre><code>$this->logger->log(LOG_DEBUG, 'view class is not defined for [%s] -> use default [%s]', $forward_name, $class_name);
</code></pre>
となっている行があります。<br/>
この下に、下記のように１行追加してやればＯＫ。
<pre><code>$this->logger->log(LOG_DEBUG, 'view class is not defined for [%s] -> use default [%s]', $forward_name, $class_name);
<span style="color:red;">trigger_error( sprintf( 'view class is not defined for [%s] -> use default [%s]', $forward_name, $class_name) );</span>
</code></pre>
こうすると、
「ビュークラスが見つかりませんでした」的な警告がブラウザに表示されます。<br/>
<br/>

※他にもっと良いやり方があったら教えてください。]]></description>
            <link>http://dqn.sakusakutto.jp/2009/09/ethna_4.html</link>
            <guid>http://dqn.sakusakutto.jp/2009/09/ethna_4.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Ethna</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">PHP</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">Ethna</category>
            
            <pubDate>Sat, 05 Sep 2009 15:33:46 +0900</pubDate>
        </item>
        
        <item>
            <title>世界で一番？設置が簡単なWikiシステムを作ってみました。</title>
            <description><![CDATA[<h4>世界一インストールが簡単なWikiシステム「JSWikiMini」</h4>
 (ただし Windows+IE 限定)<br/>
<br/>
JSWikiMini 1.0.1をリリースしました。<br/>
<a href="http://dqn.sakusakutto.jp/wiki/jswikimini.html">JSWikiMini - YukiWikiMiniのJavaScript移植版</a><br/>
このWikiツールは、おそらく世界一インストールが簡単です。<br/>
なぜ世界一簡単かというと、<br/>
"index.html"ファイルただ１個で動くからです。<br/>
上記リンク先から、ZIPファイルをダウンロードして解凍したら、インストール完了です。<br/>
実際にストップウォッチ片手に測ってみたところ、ダウンロードから使用開始までの所要時間は１０秒ほどでした。
<br/>
<br/>
<img src="http://dqn.sakusakutto.jp/Wiki/JSWikiMini-1.JPG"  alt="JSWikiMini-1.JPG" width="207" height="200"><br/>
<strong>ZIPフォルダを解凍した中身。index.htmlを開くだけで動く</strong>
<h4>YukiWikiMiniのJavaScript移植版</h4>
中身は、<a href="http://www.hyuki.com/yukiwiki/mini/index.html">YukiWikiMini</a>をJavaScriptで再実装したものです。
<br/>
画面の操作方法は本家YukiWikiMiniとまったく同じです。<br/>
<br/>
<a href="http://dqn.sakusakutto.jp/Wiki/JSWikiMini-2.html" onclick="window.open('http://dqn.sakusakutto.jp/Wiki/JSWikiMini-2.html','popup','width=638,height=456,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://dqn.sakusakutto.jp/Wiki/JSWikiMini-2-thumb-250x178.jpg" width="250" height="178" alt="JSWikiMini-2.JPG" style=" margin: 0 20px 0px 0;" /></a><br/>
<strong>YukiWikiMiniそのままのシンプルデザイン</strong>
<br/>
<br/>
最大の違いは、<br/>
<ul>
	<li>YukiWikiMini：Webサーバに設置して公開して使う。(もしくは社内Web等で使う)</li>
	<li>JSWikiMini：ローカルPCに置いて自分ひとり(もしくは共有フォルダにおいて仲間内だけで)で使う</li>
</ul>
<br/>

自分ひとりだけで使うような場合、YukiWikiMiniだと自分のPCにApacheとActivePerlをインストールする必要があり、初心者には少し敷居が高いです。<br/>
このインストールの手間を省くために今回JavaScript版を作りました。<br/>
<br/>
<h4>動作もサクサク超高速</h4>
これはWebアプリではなくデスクトップアプリなので、Webサーバとの通信が発生しません。<br/>
なので動作が超絶速いです。<br/>


<h4>USBメモリ、SDカードに入れても動く</h4>
「フォルダ」がある場所ならどこにでも置けます。<br/>
SDカード、USBメモリ、ネットワーク上の共有フォルダなどに置いて使うことができます。<br/>
<br/>
Wikiを使ってみたいけど公開したくない、勝手に編集されたくない、ちょっとだけ試してみたい、そんな人にはぴったりです。<br/>
超簡単に設置できるので、ぜひ試してみてください。<br/>
感想をコメントでいただけたらうれしいです。


]]></description>
            <link>http://dqn.sakusakutto.jp/2009/08/yukiwikiminijscript.html</link>
            <guid>http://dqn.sakusakutto.jp/2009/08/yukiwikiminijscript.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">JavaScript</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">JScript</category>
            
                <category domain="http://www.sixapart.com/ns/types#tag">Wiki</category>
            
            <pubDate>Thu, 13 Aug 2009 17:11:57 +0900</pubDate>
        </item>
        
        <item>
            <title>「インターネットにある大きな機会はすべて利用し尽くされた、と誰もが考えた時に、そもそもルール自体を変えてしまうような企業が登場する」</title>
            <description><![CDATA[かつてイーマキュリーという会社(現mixi)が、mixiの企画を発案したのが2003年10月。<br/>
ITバブルがはじけて、日経平均が8000円を割り込んだ年。<br/>

<br/>
この頃、mixiの原型が生まれた。

<blockquote>　インターネットは変化が激しく、チャンスも生まれやすい土壌ですが、そうはいってももしかしたらこれが残り少ない非常に大きなチャンスのひとつかもしれないという気持ちは捨てられませんでした。<br/>
これに賭けてみたいとミーティングでメンバーを説得していきました。<br/>
<br/>
　FriendsterのCEOだったTim Koogle氏が以前、CNETの記事で<br/>
「インターネットにある大きな機会はすべて利用し尽くされた、と誰もが考えた時に、そもそもルール自体を変えてしまうような企業が登場する」<br/>
と発言していましたが、それと同じ気持ちでした。<br/>
2003年当時も、あらゆるサービスが出尽くした感がありましたが、SNSは市場のルールを変えることができる革命性のあるサービスであり、やらない手はないと考えたんです。 <br/>
<a href="http://japan.cnet.com/interview/story/0,2000055954,20257167,00.htm">なぜmixiはこれほど成功したのか--笠原社長が明かす開発秘話</a><br/>
</blockquote>
<br/>
いま、この言葉を思い出すべきではないだろうか。<br/>
<br/>
振り返って2009年。<br/>
<br/>
Webフレームワーク、仮想化技術、SSD、クアッドコア、Memcached、iPhone、ネットブック<br/>
<br/>
当時手に入らなかったものが、そこらじゅうに溢れている。<br/>
次の時代の覇者が産声を上げるのは、きっとこういう時だ。<br/>
<br/>
これは大いなるチャンスではないか。<br/>





]]></description>
            <link>http://dqn.sakusakutto.jp/2009/07/post_41.html</link>
            <guid>http://dqn.sakusakutto.jp/2009/07/post_41.html</guid>
            
            
            <pubDate>Sat, 04 Jul 2009 00:48:08 +0900</pubDate>
        </item>
        
        <item>
            <title>Ethnaの魅力を語る</title>
            <description><![CDATA[<h4>自由度が高い</h4>
Ruby On Railsのように縛りがきつくないので、自由に自分の規約を作ったり、自作ライブラリと組み合わせて使うことができます。<br/>
また、そのような開発スタイルに向いています。<br/>
<br/>例えばADODBをラップして自作OR/Mapperを作るとか、<a href="http://dqn.sakusakutto.jp/2009/01/php_limetdd.html">lime.phpと組み合わせてPerl風のTDD開発</a>をやるとか、そんな楽しみ方があります。<br/>他のフレームワークではなかなか体験できないと思います。
<h4>ソースコードが読みやすい</h4>
フレームワークを開発している人がみな日本人で、コメントが日本語です。<br/>
私のような素人プログラマには、これはものすごく大きい。<br/>
<br/>
また、ファイルやクラスの数が多くないので、印刷して電車の中で読めちゃいます。


<h4>あのGreeが使っている</h4>
上司や取引先を説得するときに、この一言は強いです。<br/>
「あのGree(時価総額１千億円）も使ってるんですよ！」と言えば、経営者層は安心します。<br/>
Ruby On RailsとかCakePHPとか言っても、プログラマじゃない人にはピンとこないですから。

<h4>覚えることが少ない</h4>
一つ目と関係しますが、学習コストが低いです。<br/>
個人的な体験ですが、プロジェクトの途中で新しいプログラマが参加してきたとき、１日ペアプログラミングで教えたら、２日目からはその人ひとりで開発できるようになっていました。<br/>
（その方がたまたま優秀だったという要因はありますが。）]]></description>
            <link>http://dqn.sakusakutto.jp/2009/06/ethna_3.html</link>
            <guid>http://dqn.sakusakutto.jp/2009/06/ethna_3.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Ethna</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">Ethna</category>
            
            <pubDate>Wed, 17 Jun 2009 02:18:06 +0900</pubDate>
        </item>
        
        <item>
            <title>Ethnaのソースコードを読み解く　第７回 Ethna_Controller::_trigger_WWW 要約版</title>
            <description><![CDATA[_trigger_WWWは長いので、ばっさり要約してみます。<br/>
<a href="http://sourceforge.jp/projects/ethna/svn/view/ethna/tags/ETHNA_2_3_6/class/Ethna_Controller.php?view=markup&root=ethna">Ethna_Controller::_trigger_WWW</a> (要約版)<br/>
<br/>
<code><pre>
function _trigger_WWW($default_action_name = "", $fallback_action_name = "")
{
    // アクション名の取得
    $action_name = $this->_getActionName(
            $default_action_name, $fallback_action_name
    );

    // アクション定義の取得
    $action_obj =& $this->_getAction($action_name);

    $this->action_name = $action_name;

    $backend =& $this->getBackend();

    // アクションフォームを呼び出し
    $form_name = $this->getActionFormName($action_name);
    $this->action_form =& new $form_name($this);
    $this->action_form->setFormVars();

    $backend->setActionForm($this->action_form);

    // セッションスタート
    $session =& $this->getSession();
    $session->restore();

    // アクション実行
    $forward_name = $backend->perform($action_name);

    // ビュー呼び出し・実行
    if ($forward_name != null) {
        $view_class_name = $this->getViewClassName($forward_name);

        $this->view =& new $view_class_name(
            $backend, $forward_name, $this->_getForwardPath($forward_name)
        );

        $this->view->preforward();
        $this->view->forward();
    }

    return 0;
}
</pre></code>
実際には使用されていないコードを切り捨て、本質的なところだけ残すとこのようになります。<br/>
すごいシンプルになりましたね。<br/>
これがEthnaの「背骨」にあたる部分です。<br/>
<br/>
要約版とは言っても、このコードの状態で十分りっぱに機能します。<br/>
実際私が携わっている商用Webサイトでは、この状態でも完全に動きます。
<br/>
<br/>
さて、_trigger_WWW内で行われていることが、より明確に見えてきましたね。<br/>
<br/>
<ul>
<li>アクションフォームの呼び出し(インスタンス化)、初期化</li>
<li>アクションクラスの呼び出し、実行</li>
<li>ビュークラスの呼び出し（インスタンス化）、実行</li>
<li>プログラム全体の終了</li>
</ul>
<br/>
Ehtna_Controllerはこのくらいにして、次回以降、個別のクラスの中をのぞいて見ましょう。


                 ]]></description>
            <link>http://dqn.sakusakutto.jp/2009/06/ethna_ethna_controller_trigger_1.html</link>
            <guid>http://dqn.sakusakutto.jp/2009/06/ethna_ethna_controller_trigger_1.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Ethna</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">Ethna</category>
            
            <pubDate>Wed, 17 Jun 2009 01:43:54 +0900</pubDate>
        </item>
        
        <item>
            <title>[PHP]コマンドライン(cli)でFatal error: Call to undefined function pg_connect() の対処法</title>
            <description><![CDATA[PHPをコマドライン(cli)から起動すると、表題のようなエラーが出ることがあります。<br/>

<pre><code>Fatal error: Call to undefined function pg_connect() </code></pre>
ブラウザから動かしたらちゃんと動くのにおかしいなーと思っていろいろ調べたら、原因がわかりました。
<h4>原因</h4>
phpは、Apacheと連動して動く場合と、コマンドライン(cli)から起動して動く場合で、別々のphp.iniファイルを参照しているようです。<br/>
<br/>
私の場合は、
<ul>
<li>Apacheモジュールとして動作する場合:  c:\windows\php.ini</li>
<li>コマンドラインのコマンドとして動作する場合:  c:\php5\php.ini</li>
</ul>
となっていたようです。<br/>
前者ではphp_pgsql.dll(PostgreSQL接続用モジュール)が読み込まれる設定になっていたのに、後者では何も設定していなかったので、上記のエラーが出た次第です。

<h4>対処法</h4>
<strong>コマンドライン(cli)用のphp.ini</strong>を、下記のように書き換えれば、動くと思います。
<pre><code>;extension=php_pgsql.dll
↓
extension=php_pgsql.dll
</code></pre>


<h4>php_pgsql.dllが読み込まれているかを確認する方法</h4>
コマンドラインから、
<pre><code>&gt;php -i</code></pre>
と打って、"PostgreSQL"または"pgsql"という文字が出てくればOKです。

]]></description>
            <link>http://dqn.sakusakutto.jp/2009/06/phpclifatal_error_call_to_unde.html</link>
            <guid>http://dqn.sakusakutto.jp/2009/06/phpclifatal_error_call_to_unde.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">PHP</category>
            
            
            <pubDate>Sun, 14 Jun 2009 23:16:31 +0900</pubDate>
        </item>
        
        <item>
            <title>Fatal error: Call to a member function execute() on a non-object in Ethna_DB_ADOdb.php on line 210</title>
            <description><![CDATA[Windows上で、Ethna+PostgresqlでWebアプリを作っていて、コマンドライン用のアクションスクリプトを生成して、さあ実行しようとすると、こんなエラーが出ることがあります。<br/>
<h4>エラー</h4>
<pre><code>&gt;php -f foo.php
Fatal error: Call to a member function execute() on a non-object in Ethna_DB_ADOdb.php on line 210
</code></pre>

<h4>原因</h4>
Ethnaのせいではありません。<br/>
<br/>
恐らく、コマンドラインから起動したPHPで、pg_connect()が使えないのが原因です。<br/>
それは、<strong>コマンドライン用のphp.ini(Web用のphp.iniとは別物)</strong>の中で"php_pgsql.dll"が読み込まれていないのが原因です。<br/>
解決法はこちら↓

]]></description>
            <link>http://dqn.sakusakutto.jp/2009/06/fatal_error_call_to_a_member_f.html</link>
            <guid>http://dqn.sakusakutto.jp/2009/06/fatal_error_call_to_a_member_f.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Ethna</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">Ethna</category>
            
            <pubDate>Sun, 14 Jun 2009 22:33:38 +0900</pubDate>
        </item>
        
        <item>
            <title>Fatal error: Cannot redeclare class Ethna in ... Ethna.php　エラーの対処法</title>
            <description><![CDATA[Ethnaコマンドを使おうとすると、こんなエラーが出ることがあります。<br/>
私の場合は必ずこれが出ます。
<br/>
これが出ると、add-actionとか何もできなくなって一瞬憂鬱になりますが、簡単に回避できるのでご安心を。
<h4>エラー</h4>
<pre><code>&gt;ethna add-action ...なんとかかんとか
Fatal error: Cannot redeclare class Ethna in ... Ethna.php on line 424 </code></pre>
<h4>原因</h4>
Ethnaのライブラリ一式が、同じコンピュータ内に２重で存在している。
<br/>
私の場合、
<ul>
<li>PEARチャンネルでインストールしたEthna (C:\php5\PEAR\Ethnaみたいな場所にある)
<li>既に作ったプロジェクトのlibフォルダ内のEthna (C:\www\myproject\lib\Ethna)
</ul>
という形で、Ethnaのソースコードが複数の場所に存在していたのが原因のようです。

<h4>対処法</h4>
ethnaコマンドの実体であるethna.batを書き換えたら動きました。<br/>
環境によって違うので、あくまでも参考ということでお願いします。<br/>
<br/>
"rem"というのはコメントアウトのことです。(phpでの"//"に相当)<br/>
<br/>
<pre><code>@echo off

rem
rem   ethna.bat
rem
rem   simple command line gateway
rem
rem   $Id: ethna.bat 457 2007-02-07 11:14:39Z ichii386 $
rem

if "%OS%"=="Windows_NT" @setlocal

if NOT "%PHP_PEAR_INSTALL_DIR%" == "" (
rem set DEFAULT_ETHNA_HOME= %PHP_PEAR_INSTALL_DIR%\Ethna
set DEFAULT_ETHNA_HOME=.\lib\Ethna
) ELSE (
set DEFAULT_ETHNA_HOME=%~dp0
)

goto init
goto cleanup

:init

if "%ETHNA_HOME%" == "" set ETHNA_HOME=%DEFAULT_ETHNA_HOME%
set DEFAULT_ETHNA_HOME=

if "%PHP_COMMAND%" == "" goto no_phpcommand
if "%PHP_CLASSPATH%" == "" goto set_classpath

goto run
goto cleanup

:run
rem IF EXIST "C:\php5\pear\Ethna" (
rem %PHP_COMMAND% -d html_errors=off -qC "C:\php5\pear\Ethna\bin\ethna_handle.php" %1 %2 %3 %4 %5 %6 %7 %8 %9
rem ) ELSE (
%PHP_COMMAND% -d html_errors=off -qC "%ETHNA_HOME%\bin\ethna_handle.php" %1 %2 %3 %4 %5 %6 %7 %8 %9
rem )
goto cleanup

:no_phpcommand
set PHP_COMMAND=php.exe
goto init

:set_classpath
set PHP_CLASSPATH=%ETHNA_HOME%\class
goto init

:cleanup
if "%OS%"=="Windows_NT" @endlocal
REM pause
</code></pre>

ポイントは、"C:\php5\PEAR\Ethna"のような場所を見に行かないようにすること、"C:\www\myproject\lib\Ethna\bin\ethna_handle.php"を起動するように強制させることです。<br/>
<br/>
なお、この書き方の場合は、必ずコマンドプロンプト上のカレントディレクトリを"C:\www\myproject\"にしてからEthnaコマンドを叩く必要があります。(ちょっと不便)<br/>
なぜこのようにしてるかというと、PC内にEthnaプロジェクトが３つも４つもあるからです。<br/>
<br/>どんだけEthna漬けやねん。。

]]></description>
            <link>http://dqn.sakusakutto.jp/2009/06/fatal_error_cannot_redeclare_c.html</link>
            <guid>http://dqn.sakusakutto.jp/2009/06/fatal_error_cannot_redeclare_c.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Ethna</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">Ethna</category>
            
            <pubDate>Sun, 14 Jun 2009 22:21:48 +0900</pubDate>
        </item>
        
        <item>
            <title>Ethnaのソースコードを読み解く　第６回 Ethna_Controller::_trigger_WWW</title>
            <description><![CDATA[<a href="http://sourceforge.jp/projects/ethna/svn/view/ethna/tags/ETHNA_2_3_6/class/Ethna_Controller.php?view=markup&root=ethna">Ethna_Controller::_trigger_WWW</a><br/>
<br/>
<pre><code>

function _trigger_WWW($default_action_name = "", $fallback_action_name = "")
{
    // アクション名の取得
    $action_name = $this->_getActionName($default_action_name, $fallback_action_name);

    // マネージャ実行チェック
    $this->_ethnaManagerEnabledCheck($action_name);

    // アクション定義の取得
    $action_obj =& $this->_getAction($action_name);
    if (is_null($action_obj)) {
        if ($fallback_action_name != "") {
            $this->logger->log(LOG_DEBUG, 'undefined action [%s] -> try fallback action [%s]', $action_name, $fallback_action_name);
            $action_obj =& $this->_getAction($fallback_action_name);
        }
        if (is_null($action_obj)) {
            return Ethna::raiseError("undefined action [%s]", E_APP_UNDEFINED_ACTION, $action_name);
        } else {
            $action_name = $fallback_action_name;
        }
    }

    // アクション実行前フィルタ
    for ($i = 0; $i < count($this->filter_chain); $i++) {
        $r = $this->filter_chain[$i]->preActionFilter($action_name);
        if ($r != null) {
            $this->logger->log(LOG_DEBUG, 'action [%s] -> [%s] by %s', $action_name, $r, get_class($this->filter_chain[$i]));
            $action_name = $r;
        }
    }
    $this->action_name = $action_name;

    // 言語設定
    $this->_setLanguage($this->language, $this->system_encoding, $this->client_encoding);

    // オブジェクト生成
    $backend =& $this->getBackend();

    $form_name = $this->getActionFormName($action_name);
    $this->action_form =& new $form_name($this);
    $this->action_form->setFormVars();

    // バックエンド処理実行
    $backend->setActionForm($this->action_form);

    $session =& $this->getSession();
    $session->restore();
    $forward_name = $backend->perform($action_name);

    // アクション実行後フィルタ
    for ($i = count($this->filter_chain) - 1; $i >= 0; $i--) {
        $r = $this->filter_chain[$i]->postActionFilter($action_name, $forward_name);
        if ($r != null) {
            $this->logger->log(LOG_DEBUG, 'forward [%s] -> [%s] by %s', $forward_name, $r, get_class($this->filter_chain[$i]));
            $forward_name = $r;
        }
    }

    // コントローラで遷移先を決定する(オプション)
    $forward_name = $this->_sortForward($action_name, $forward_name);

    if ($forward_name != null) {
        $view_class_name = $this->getViewClassName($forward_name);
        $this->view =& new $view_class_name($backend, $forward_name, $this->_getForwardPath($forward_name));
        $this->view->preforward();
        $this->view->forward();
    }

    return 0;
}


</code></pre>

この関数こそがEthnaのメイン処理の部分です。<br/>
Ethnaのプログラムの流れがすべてここに凝縮されています。<br/>
<br/>
ここでは、次のような重要なことが行われています。<br/>
<ul>
<li>アクションフォームの呼び出し(インスタンス化)</li>
<li>アクションクラスの呼び出し（インスタンス化）</li>
<li>ビュークラスの呼び出し（インスタンス化）</li>
<li>プログラム全体の終了</li>
</ul>
<br/>
ここを読み解けば、Ethnaの全体像を把握することができます。<br/>
Ethnaで作ったアプリが動かないときは、ここでecho('hello')とか仕込んでおけば、プログラムがどこまで実行されたかわかります。<br/>
<br/>
なお、この関数は最後に０を返しますが、この０はどこにも行きません。<br/>
呼び出し元のtrigger()関数のなかで空しく捨てられます。<br/>
そしてプログラム全体が終了します。<br/>
<br/>
まとめると、<br/>
<p><strong>Ethnaのプログラム実行処理は、index.phpから始まって、trigger()で終わる。</strong></p>
と言えます。<br/>
そしてほとんどの処理は_trigger_WWW()の中で行われています。<br/>
<br/>
次回以降、この_trigger_WWW()を詳しく見ていきましょう。




                 ]]></description>
            <link>http://dqn.sakusakutto.jp/2009/06/ethna_ethna_controller_trigger.html</link>
            <guid>http://dqn.sakusakutto.jp/2009/06/ethna_ethna_controller_trigger.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Ethna</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">Ethna</category>
            
            <pubDate>Thu, 11 Jun 2009 00:01:48 +0900</pubDate>
        </item>
        
        <item>
            <title>簡単！coLinuxとUbuntu7.10を10分でインストールする方法(初心者向け)</title>
            <description><![CDATA[<h4>coLinuxとは</h4>
coLinuxは、Windows上でLinuxを動かせるツールです。<br/>
Ubuntu、Debianなどの本物のLinuxを、あなたが今お使いのWindowsの上で動かすことができます。<br/>
ノートPCなどに入れれば、自分専用のLinuxを持ち運べて快適です。<br/>
<br/>
近所のカフェでLinuxをバリバリ使う自分を想像してみてください。<br/>
かっこよくないですか？<br/>
<br/>
そんな環境が、たったの１０分で手に入るのです。<br/>
すごくないですか？<br/>
<br/>
そう思ったら、レッツトライ！
<h4>coLinuxをダウンロード</h4>
<ul>
<li><a href="http://www.colinux.org/">http://www.colinux.org/</a> coLinuxのサイトに行きます。</li>
<span class="mt-enclosure mt-enclosure-image"><a href="http://dqn.sakusakutto.jp/2009/06/10/colinux-01.JPG"><img alt="colinux-01.JPG" src="http://dqn.sakusakutto.jp/2009/06/10/colinux-01-thumb-426x480.jpg"   style=" margin: 0 20px 20px 0;"/></a></span><br/>
<li>"Downloads (binary and source)"というページに行きます。</li>
<br/><img alt="colinux-02.JPG" src="http://dqn.sakusakutto.jp/2009/06/10/colinux-02-thumb-426x137.jpg"　style=" margin: 0 20px 20px 0;"/><br/>
<br/>
<li>"coLinux-stable"の"download"をクリックします。</li>
<li>filenameが"coLinux-0.7.4.exe"というのをダウンロードしてください。</li>
<li>普通に実行してインストールが始まります。</li>
</ul>
<h4>coLinuxをインストール</h4>
<ul>
<li>インストール先は"C:&yen;colinux"に設定。（デフォルトのままでもOKです。）</li>
<li>Root Filesystem Image Downloadのところにチェックを入れて、Ubuntuを選択。</li>
<li>TAP-Win32 というドライバをインストールするか聞かれるので、インストール。</li>
<li>Ubuntuのイメージファイル(Ubuntu-7.10.ext3.2GB.7z)がダウンロードされたことを確認</li>
</ul>
<h4>Ubuntuイメージファイルを解凍</h4>
<li>7zファイルを解凍するには、"7zip"というツールが必要です。</li>
<li><a href="http://sevenzip.sourceforge.jp/download.html">http://sevenzip.sourceforge.jp/download.html </a>から入手してインストール。</li>
<li>先ほどの"Ubuntu-7.10.ext3.2GB.7z" を解凍します。</li>
<li>解凍すると"Ubuntu-7.10.ext3.2gb.fs"と"swap128.fs"という２つのファイルができるので、それらをcoLinuxフォルダに移動</li>
</ul>
<h4>confファイルを作る</h4>
<ul>
<li>coLinuxフォルダにある、example.confをコピーしてubuntu.confに名前変更</li>
<li>ubuntu.confを開いて、下記のように書き換えます。</li>
<br/>
20行目付近
<pre><code>cobd0="c:\coLinux\root_fs"

↓(Ubuntuイメージファイルを指定)

cobd0="c:\coLinux\Ubuntu-7.10.ext3.2gb.fs"
</code></pre>
23行目付近
<pre><code>#cobd1="c:\coLinux\swap_device"

↓(コメントを外す)

cobd1="c:\coLinux\swap_device"
</code></pre>
23行目付近
<pre><code>#eth1=tuntap

↓

eth0=tuntap
</code></pre>
</ul>

<h4>起動！</h4>
コマンドプロンプロでこのように入力します。<br/>
<pre><code>C:\coLinux>colinux-daemon.exe @ubuntu.conf</code></pre>
Cooperative Linux Consoleが立ち上がります。<br/>
<br/>
<img alt="colinux-03.JPG" src="http://dqn.sakusakutto.jp/2009/06/10/colinux-03-thumb-426x307.jpg" width="426" height="307"  style=" margin: 0 20px 20px 0;"/><br/>
"ubuntu login:"と出たら、rootでログインします。パスワードもrootです。<br/>
<br/>
<img alt="colinux-04.JPG" src="http://dqn.sakusakutto.jp/2009/06/10/colinux-04-thumb-426x392.jpg" width="426" height="392" style=" margin: 0 20px 20px 0;"/><br/>
見事ログインできたら成功です。<br/>
ね、簡単でしょ？
<br/>
おめでとう！！<br/>
あたなも今日からLinuxユーザです。<br/>
<br/>
<br/>
※ネットワークの設定は後日解説します。]]></description>
            <link>http://dqn.sakusakutto.jp/2009/06/colinuxubuntu71010.html</link>
            <guid>http://dqn.sakusakutto.jp/2009/06/colinuxubuntu71010.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Linux</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">Ubuntu</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">coLinux</category>
            
            <pubDate>Wed, 10 Jun 2009 01:41:16 +0900</pubDate>
        </item>
        
    </channel>
</rss>
