rhaco0.93用の簡易チュートリアル

2006年10月31日(火) 03:23 この記事をクリップ!

 

Django勉強会 Disc1の打ち合わせ時に、phpのフレームワーク使うんならrhacoだよ、と言いまくってしまったので、簡単な使い方説明をします。

---- 2007/02/15 追記
現場の若いのが、Rhaco1.0.1用に書き直しました
---- 2007/02/15 追記ここまで


rhacoの利点等

    どうやらphpのフレームワークの場合、あまりO/R等はメジャーではないようです。
    → rhacoにはバリデータ込みのO/Rマッパーがあります。


    どうやらphpのフレームワークはPear等の別ライブラリが必要なことが多いようです。
    → rhacoは他のライブラリを必要としません(djangoみたい!)。mb_系は入っていると便利ですが。


    どうやらphpのフレームワークはTemplateのextendsができないようです。
    → rhacoはブロックという単位のincludeと、ブロックという単位のextendsに対応しています(extendsは0.93から)。


    どうやらphpのフレームワークは、phpであるにもかかわらずshellの利用が必要な場合があるようです。
    → rhacoはブラウザとテキストエディタがあれば開発できます(TrueStudio推奨)。



開発の進め方

    rhacoのページからダウンロードリンク(Quick Link → release)を辿って、rhacoの最新版をダウンロードします(sourceforge)。
    (その際、goesbyというサンプルアプリケーションもダウンロードすると、使い方のサンプルになります。goesbyはhttp://www.goesby.com/で動作しているソーシャルブックマークアプリケーションです)


    ダウンロードしたrhaco.zipを解凍し、rhacoディレクトリをapacheが読み込み可能な場所に配置します。
    Document rootより下に置く必要はありません(今回の例ではapacheの直下におきました)。

    Document rootの下にプロジェクト用のディレクトリを作成します(root直下で使いたい場合は不要)。


    rhacoディレクトリの直下にあるsetup.phpを、プロジェクト用のディレクトリの中にコピーします。
    setup.phpのコピー
    setup.phpのコピー posted from フォト蔵


    それでは、setup.phpを表示してみましょう。
    rhacoのpathを入力する用に要求されます。
    rhacoを配置したディレクトリを指定してください。
    rhacoのpathを設定する
    pathを設定する posted from フォト蔵


    「設定ボタン」をクリックすると、追加入力画面へ遷移します。
    テンプレートのキャッシュ等いろいろな設定がありますが、今回は一番したの囲み「アプリケーション」にある「サンプルアプリケーション」にだけチェックを入れて「生成する」ボタンをクリックしてください(権限がありませんというメッセージが表示されたら、apacheがプロジェクトディレクトリに書き込み可能な権限を付与してください)。
    サンプルアプリケーションにチェックを入れる
    サンプルアプリケーションにチェックを入れる posted from フォト蔵


    プロジェクトディレクトリの中身を見てください。setup.php以外にファイルやディレクトリが生成されているはずです。
    setupディレクトリの中には、project.xmlというファイルがあります。
    生成されたディレクトリ
    生成されたディレクトリ posted from フォト蔵
    このファイルにプロジェクトに関する内容を設定します。
    サンプルアプリケーションとして、index.phpというファイルができています。
    index.phpをブラウザで呼び出してみてください。入力フィールドが並んでいるはずです。
    値を入力してサブミットすると、同じ画面に戻ってくるというだけのものですが、入力した値を保持しているはずです(0.93はcheckboxとradioの動作がおかしい?)。
    これは、index.phpとresources/templates/index.htmlで動作しています。


    次に、setup/project.xmlをいじってみましょう。下記のように記述してください。(もし利用するデータベースにアプリケーションから接続するデータベースユーザを作成していない場合には作成しておいてください)

            <project rhacovar="0.9.3">
              <database name="test">
                <table name="bbs">
                  <column name="id" type="serial" />
                  <column name="name" type="string" size="20" require="true" />
                  <column name="comment" type="string" size="100" />
                </table>
              </database>
            </project>
          


    再びsetup.phpをブラウザで開いてください。今度は中間あたりにデータベースの設定が増えているはずです。
    データベースの設定
    データベースの設定 posted from フォト蔵
    利用するデータベースを選択し、データベース接続ユーザやパスワード等を埋め、テーブル作成にチェックを入れて「生成する」ボタンをクリックしてください(テーブル接頭語は一つのデータベースで複数のアプリケーションを動作可能とするための便利機能です)。


    library/dataディレクトリにたくさんのファイルができているはずです。O/Rで利用するクラス群です。
    O/Rのファイル群が生成される
    O/Rのファイル群が生成される posted from フォト蔵


    index.php/index.htmlをそれぞれ次のように修正してください。

    <?php
    require_once("./__init__.php");
    Rhaco::import("tag.HtmlParser");
    Rhaco::import("network.http.Request");
    Rhaco::import("database.data.Criteria");
    
    
    Rhaco::importLibrary("DbUtilTest.php");
    Rhaco::importLibrary("data.Bbs");
    
    
    $request 	= new Request();
    $htmlParser	= new HtmlParser();
    
    $dbUtil = DbUtilTest::instance();
    
    if($request->isPost()) {
      if(false == $dbUtil->insert($request->toObject(new Bbs()))) {
        $htmlParser->setVariable($request->getVariable());
      }
    }
    $object_list = $dbUtil->select(new Bbs(), new Criteria());
    
    $htmlParser->setVariable("object_list",$object_list);
    
    $htmlParser->write("index.html");
    
    ?>
          

    <html>
    <head>
    	<title>index</title>
    </head>
    <body>
    <form method="post">
    	name:<input type="text" name="name" reference="true" /><br />
    	comment:<textarea name="comment" reference="true"></textarea>
    	<input type="submit" value="submit" />
    </form>
    <ul>
    <rt:loop param="object_list" var="msg">
      <li>{$formatter.escape($msg.name)} :<br />
      {$formatter.escape($msg.comment)}</li>
    </rt:loop>
    </ul>
    </body>
    </html>
          


    では、index.phpを表示してみましょう。
    入力フォームがありますので、何も入力せずに「submit」ボタンをクリックしてみましょう。
    何もおきませんよね。では、comment欄にだけ文字を入力して「submit」ボタンをクリックしてみましょう。入力がのこったまま元に戻ってきましたよね?
    これは、project.xmlに設定したrequired="true"が効いているため、バリデータに止められてもとのページに戻ってきたのです。本来であれば、各入力フォーム毎にエラーメッセージの表示を行うのですが、やり方を忘れてしまったのではしょりました:)
    では、nameとcommentに値を入力して「submit」ボタンをクリックしてください。メッセージが表示されましたね?操作を繰り返すとどんどん増えていきます。
    complete
    complete posted from フォト蔵
    今回はページング等の実装はしませんでしたが、countやoffset、limit、も容易に扱えるので(SQL文はたいていの場合書く必要はありません。unionまでO/Rで扱えますよ)、goesbyのソースを眺めたり、rhac-jaメーリングリストに質問をしたりしてrhacoを楽しんでみてください。

 検索広告

2006年10月28日(土) 00:18 この記事をクリップ!

 

最近は検索広告がはやっているようで、どうやら「つづきはWebで」とやられると3割くらいの人が見てしまうとか。
#注意:検索広告について論じませんよ。

で、3割の仲間入りをした訳です。
つまり、これが面白かったと。どうでもいいんですが。

 PS3ほしぃー

2006年10月16日(月) 23:52 この記事をクリップ!

 

「ゲーム機は性能ではない」?


その昔、Windows3.1普及より前の時代 FM-Towns というPCがありました。
CD-ROMを標準搭載、32000色同時出力、基本搭載メモリ2MBという豪勢なマシンでした。
Towns Gearという今で言うHTMLのようなハイパーリンクベースのインタラクティブツールがついていたり、富士通がフリーソフトウェアをCD-ROMに焼いて定期的に原価販売したりして、かなり楽しい先進的なものでした。

当時、PC98の世界は640kbのメモリ(EMSとかいろいろあったようですが、基本はね)で4096色中16色表示とかいう時代でした。お宅の友人は4MBのメモリを積んでることを聞き、「そんなの何に使うの?」と言ったものでした。

私はJ-Phoneの携帯電話をずっと使っています(Vodaになってソフトバンクになりましたが)。DocomoのPDCはJ-PhoneやKDDIの帯域の半分で通話を行っていました。Docomoユーザと通話をすると会話が聞き取りにくく嫌でした。

家にはブラウン管のハイビジョンテレビがあります。結婚する際に実家から強奪して持って出たものなので、古いですが、BS-Hiを見ると非常にきれいです。
テレビなんてコンテンツが見えればいいんだと言った友人がいました。いまはハイビジョン液晶で地デジを見ています。一度地デジを見ると地上はなんて見る気にならないと言います。

実際に成功するか否かは、様々な戦略やタイミングによって決まるのは確かでしょう。
しかし、実際の根拠無く、感情だけ(としかおもえない)で「PS3は駄目、ゲーム機は性能ではない」とゲーマーやテクノロジリテラシの高いと思われるブロガー達が喧伝するのはどうでしょう。
プラットフォームの性能は力です。性能無くしては作れないものがあります。
モノクロ時代の映画が良かった?良い映画だけが残され伝えられているだけです。
容量なんてそんなに必要ない?youtube見るのやめてアニメGif見ますか?私はStage6がいいです。

サムソンと組んでいる間はゲーム関係以外のソニー製品は買いませんけどね(ソニーには自分たちがなんであるのかをきちんと見直してほしい)。

なんて言っても、PS3が燃えたら終わりか。。。。
新ソニックやりてー。XBox360版と同時発売か。画質をフルハイビジョンで見比べてみたいなぁ。HDMI端子付き降るスペックハイビジョン欲しー

 ちょこっとだけカスタムなマニピュレータ

2006年10月12日(木) 00:36 この記事をクリップ!

 

ブログに「質問と答え」という仕組みを導入しました。せっかくなので仕組みを公開してみます (django.contrib.Commentは使用していませんので注意してください)。

まず始めに、「質問と答え」とはなにか?

コメントスパムよけです。
ブログのエントリ毎に「そのエントリにコメントする人ならわかるであろう質問と答え」を設定し、機械的なコメントスパムを防ごうと導入したものです。
エントリ毎に設定することによって、様々なエントリに対応できるはずです(英語のエントリなら英語でとか)。
しかしながら、もしかしたら質問と答えを導入しないエントリもあるかもしれません。短いとか質問を思いつかないとかいろいろな理由で。なのでかならずバリデートするものではありません。

ここまででコメントの登録に必要なmanipulatorを整理してみましょう。

  • ・コメントのModel定義にある必須項目や最大長、URLをバリデートする
  • ・コメントが登録されようとしているエントリに「質問」が設定されていたら入力された「答え」とエントリに設定してある「答え」が一致しているかをバリデートする
  • ・manipulator.save(data)で保存する


カスタムマニピュレータ? 面倒です。Modelに記述したものをもう一度記述し直す気にはなりません。
なので、動的に生成してみる。

#さきにバリデータを作成します。
#本来のバリデータは第一引数にselfがきますが・・
def is_valid_answer(data, form) :
    #formには事前にvalid_answerを追加しておきます
    if form.get('valid_answer').upper() != data.upper() :
        raise validators.ValidationError, _('Your answer is not correct. Try it again!')

def add_comment(request, year, month, day, code) :
    #通常通りAddManipulatorを生成します。
    manipulator = Comment.AddManipulator()
    entry = getEntry(year, month, day, code)

    if request.method == 'POST' :
        new_data = request.POST.copy()

        #入力データに無理矢理データを追加します
        new_data.update({'entry': entry.id, 'valid_answer': entry.answer})

        #もし「質問」がエントリに設定されていたら・・・
        if entry.riddle :
            #manipulatorに無理矢理フィールドを追加します!
            manipulator.fields += [forms.TextField(_('answer'), maxlength=50, is_required=True, validator_list=[is_valid_answer])]

        #あとは通常通り
        errors = manipulator.get_validation_errors(new_data)
        if not errors :
            manipulator.do_html2python(new_data)
            manipulator.save(new_data)
            entry.comment_count += 1
            entry.save()
            return HttpResponseRedirect('somewhere')
    else :
        errors = new_data = {}

    #GETやバリデーションエラーがあった場合にはコメント入力画面に戻します
    form = forms.FormWrapper(manipulator, new_data, errors)
    return render_to_response('djablog/comment_form.html', {'form': form, 'object': entry})

あれ?意外に簡単?
#manipulatorって近々大幅に変更されるかもしれませんが。

 リニューアル

2006年10月09日(月) 23:31 この記事をクリップ!

 

見た目とかをリニューアルしました。
テンプレートは全面改訂をして、テンプレートディレクトリの位置自体も変わったためいろいろ不具合があると思います。
気づいた人はコメントとかで教えてください。コメントについてもコメントスパム対策で、「質問と答え」という考えを導入してみました。画像に書いてある文字は私自身が読めなくて苛つくので嫌いなのでした。
CSSもつぎはぎで書きなぐったので、やっぱりきれいにしたいです(CSSやマークアップの構成も、CSSの記述も、見た目も)。
写真の機能も付けてみましたが、いまのところフォト蔵と連携できていません(手動でしてたりはする)。
一応、画面のレイアウトは今風ということで(日本じゃ見かけないけど)。

 DevCam2006夏、行ってきました

2006年10月01日(日) 23:31 この記事をクリップ!

 

2泊3日の Python Developers Camp in 富士市 に行ってきました。通称デブキャンですが、これではありません:)
終了後、噂のかき揚げと格闘し、東名高速ではなくシタミチで帰宅したりして疲れました。
まるで高速のような国道一号バイパスを通ってきたので「行き-2000円+箱根で一服:)=行き+1時間」。選択は間違いではなかったようです。+1時間は国道134号線の平塚西側〜平塚東側にかかった時間分です。

キャンプのプログラム自体は、目指していった「Pythonのオブジェクト指向再入門」含め、非常に有意義な3日間になったと思います。しかし、もう一つ目指していった「Twisted」の学習がなおざりになっている感が残っているので、きちんと遊んでおきたいと思っています(Twistedのスプリントをしていたはずがいつの間にかDjangoスプリントになっていました)。

ymasudaさんのDjangoスプリント成果発表(というかDjango入門)の動画を貼付けておきます。携帯電話でとったものなので写りが今イチでスライドなどは殆ど見ることができません。20分/150MBでdivx再生環境が必要です。stage6にあげようとしましたが、OSXではまだできないとらしく、youtubeにあげようとしましたが10分まででかつ100MBまでという制限があるようなのであきらめました。会社に行ったらstage6に4倍サイズでアップするかもしれません(結局スライドは見えません)。

追記:
私の成果物も貼り付けました。Twistedのスプリントをやっていたはずが、いつの間にやらDjangoオンリーとなってしまいました。
チャットの内容から参考コンテンツを動的に持ってくるようなものをTwistedを混ぜて作りこんでいこうと思いましたが、きっとやらないのでいじらずに公開します。

さらに追記:
山下さん素敵

 
ponybadge

Powered by

Feedbacks

Tweets

Tags

Calendar