ぷぎがぽぎ このページをアンテナに追加 RSSフィード

2008-10-31

[][] symfony1.2に向けて前進

I have committed the new admin generator for 1.2 today. I will update

Chapter 14 of the book to reflect the changes very soon. It won't be

that difficult as the new admin generator behaves very much like the old

one. As a matter of fact, the generator.yml configuration is quite the same.

About the new admin generator - symfony developers | Google グループ

だそうです。

勉強会id:tuskimiyaさんが発表されていたようにsymfony1.2のリリースが遅れている原因の1つにアドミンジェネレータの開発が遅れているのが原因だったので、これでベータかRCへのリリースに向けて大きく前進したということでしょうか。

しかも、設定ファイルは以前のものと全く同じとのこと。ということは設定ファイルだけでカスタマイズしている人は何も問題なくアップデートできるというわけですね。すばらしい。

また、Propelを選択する場合は国際化されたメッセージファイルが標準で含まれるようになりました。もちろん日本語も含まれています。

もう、自前でファイルを用意する必要はなくなりました。

今のところ8カ国語に標準で対応できるようです。

Doctrineでも対応してくれる。。よね。。

2008-10-30

[][] 皆でリファラーを残してsensiolabsに暗黙のアピールを!

We spoked (with cups of beer) about the possibility if we will be able to ask people from sensiolabs and/or other experts for similar symfony conference in near future.

秋元@赤仮面シャア ? The second symfony study meeting Tokyo

秋元さんが昨日開催された第2回symfony勉強会の様子を英語でレポートしてくれています。そして、レポートの最後にリードデベロッパーであるFabienが所属するsensiolabsのウェブサイトへのリンクと「CakePHPカンファレンス東京でGarrettに講演してもらったようにsymfonyでもFabienに来てもらえたら」という熱いメッセージが込められています。

リンク先のsensiolabsのサイトにgoogle analyticsのタグが入っているのを確認したので、皆でリンク先をクリックしてリファラーを沢山残せばsensiolabsの中の人も日本からのラブコールにきっと気づくはず!

英語が苦手な人も参加できますので是非足跡をのこしてみてください。

そうすれば本当に来日&講演というのも夢じゃないかもしれません。

2008-10-29

[][]symfony勉強会 発表内容

日付が変わってしまいましたが、第2回symfony勉強会がdinoで開催されました。


私自身はLTで話したのですが、時間が足らずにかなり早口だったと思います。すいません。

言いたかったことは

symfony1.1以降ではDSNとひな形生成アプリ署名部分を設定できるタスクがあるよー。

それだです。

ただ、単純なのですが、わざわざcpコマンドやmakeコマンドでファイルをごちゃごちゃ操作しなくても考慮されてるよってところがsymfonyらしいと思います。

なので、以下のスクリプトファイルを作っておけばちょっと幸せになれるかも。。というLTでした。(完)

init.sh

#!/bin/sh
./symfony configure:database \
    --name=main \
    --class=sfDoctrineDatabase \
    'mysql:host=localhost;dbname=askeet' \
    yourname yourpassword

./symfony configure:author \
    'hoge <hoge@example.com>'

ちなみに、LTでは説明しませんでしたがconfigure:databaseのDSNの記述部分はクォートしないと駄目です。helpコマンドで見える例文そのまま実行してもエラーになるという罠。ご注意をば。

[][][]使い分けはどうしてる?

LTで、「CakePHPsymfony両方つかってます」って言ったものだから「使い分けはどうしてるの?」という質問がありました。


PHPのバージョンの縛りさえなければ、完全な使い分けの判断基準となるラインはありません。

フレームワークはツールですので、「こっちでないと駄目!」という悩みもありません。

どちらでもやりたいことはできると思います。


逆に言うと、「Cakeは駄目」とか「symfonyは駄目」とかいう不満もありません。

どちらも良くできたフレームワークです。流行るだけのことがあります。


ただ、案件の規模や開発体制によって使いやすい使いづらいという違いはでてくると思います。

重要な点は「お客さんにとってはどちらで実装されても正しく動けば違いはない」ということです。

なので、開発サイドとしてどちらで開発することが適しているかという点で考えれば分かりやすいですね。

例えば、RoRに慣れている人員が多いとかJavaの開発に慣れている人員が多いとか。。


皆さんはFWの選定はどうやって決めていますか?

2008-10-27

[][]symfony1.2のリリースはまだ先。

The new admin generator.

Until that is ready the release will be delayed.

symfony 1.2 release date - symfony developers | Google グループ

symfony1.2のリリース予定は26日でしたが、1.2から一新されるアドミンジェネレータの機能開発が遅れているため、リリースは先送りされました。

リリースが遅れている間にsyfmony1.2でaskeetが完成すると良いんですが、無理そうです。(残り20日)

せっかくのリリース予定日だったので、おやぢ組のsymfony関連リンク集だけはまとめ直してみました。

symfonyリンク集

2008-10-25

[][]CakePHPカンファレンス東京

今日、CakePHPカンファレンス東京にスタッフとして参加してきました。

http://events.php.gr.jp/events/show/55

参加された皆さん、運営者の皆さん本当におつかれさまでした。


受付担当でしたので、一番後ろから発表を見させていただきました。

その中で特にGarrettのことを中心に自分の中で印象的だったことをまとめておきます。

テスト駆動開発の実例 by 岸田さん

コントローラーのテストは大変!

  • コントローラーにはコードをほとんど書かずモデル側にコードを書くのが良い。そうすればテストも楽になる by Garrett

「Structure gives you more freedom」by Garrett

フレームワークを使うことは制約を与えるため自由がなくなると理解するのではなく、(フレームワーク)で決まっていることについてはルールに従うだけで考える必要はないので、本当に考えるべき実装部分に時間をかけることができると。それだけ自由があるんだと。なるほど。

バグのチケットがあるままリリースしない」by Garrett

開発者本人だからこそ聞けたCakePHPのポリシーの1つだと思います。だからこそRC4まで必要になってくるんだろうし、そこが他のフレームワークと一番違うんだと。

CakePHPのロゴのCakeを満面の笑みで持つGarrettに十数人が囲んで写真をとってた件

下手な芸能人の記者会見よりもすごいと思いました。

すんごい貴重なシーンではあるのですが、状況を知らない人があれを見たら理解できないのは必死。



その他ではhaltさんのXoopsCube上で動くCakePHP ~CubeCake~ にCakePHPらしさを感じて多いに共感。

そうなんですよ。CakePHPはこういう使い方で他のアプリに組み込めてしまうんですよ。

Xoops以外のCMSでも同じようなコンセプトのブリッジがあります。

Drake(Drupal + CakePHP): http://dev.sypad.com/projects/drake/

Jake(Joomla + CakePHP): http://dev.sypad.com/projects/jake/

これらも管理画面からインストールするだけでCakePHPで画面が作れます。

過去にDrakeを検証してみたことがありましたがあっさりするぐらい簡単に導入できました。

でも、日本では圧倒的にXoopsが有名ですし、実例も多いですから、CubeCakeは待ち望まれていた機能だと思います。もちろん世界的にも。

CakePHP覚えればメジャーなCMSアプリと(苦労もあるけど)連動できちゃうよ!ってすごくないですか。



本当に充実した一日でした。

でも、ほとんどの人と話ができていなかったような。。

また今度あったときは宜しくお願いします!

[][]間に合うのか?

symfony1.2のリリース予定はマイルストーン上では明日です。

f:id:brtRiver:20081025213241p:image

深くは考えないようにする。

2008-10-24

[][] symfony1.2でaskeetのその後

TODO: askeetをsymfony1.2でやってみる」が進行中で、現在本家の3日目分まで終わりました。

http://www.exgear.jp/blog/category/%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9f%e3%83%b3%e3%82%b0/php/symfony/askeet-12/

Doctrineを使っていたりと遊び心満点なのですが、ある程度は理解できているとはいえ、かなり時間が掛かります。

本家のチュートリアル書き上げた人は神です。

よし、がんばるぞ。たかが後21日! ......orz

[php][symfony] Viewの役割ですから

皆はどうしてるんだろ?

symfonyに標準であるがjsファイルを読み込まないと使えない。

設定ファイルに記述する方法とアクション内で記述する方法がある。

view.ymlで

all:

javascripts: [%SF_PROTOTYPE_WEB_DIR%/js/prototype]

(app.yml や module.ymlではない)

または

$this->getResponse()->addJavascript(sfConfig::get('sf_prototype_web_dir').'/js/prototype');

ajax用のヘルパーを使用すると自動的に読み込まれるが、prototype.jsを使用する箇所は明示しておくべき

【symfony】prototype.jsを使う:株式会社センティリオンシステム

たしかに設定ファイルやアクションでも定義できますが、よほどのことがないとそのようにはコーディングしません。

私はjsファイルやスタイルシートの読み込みはテンプレートで行うようにします。

テンプレートか専用のレイアウトの先頭で

<?php use_javascript('prototype') ?>

とするのが自分の中では定石。

[10/25 訂正] echoしてましたが不要でした。

2008-10-23

[]events.php.gr.jpの参加者リストを名前でソートする

受付などで、参加者のリストを印刷して使いたい。でもそのままでなく名前でソートしたものを印刷するためのjQuery

<script type="text/javascript">
$(function(){
  // Member Object
  function Member(name, tr) {
    this.name = name;
    this.tr = tr;
  }
  // click action
  $("#sort_name").click(function(){
     var header;
     var lines = $("tr").filter(function(i){
        if (i == 0) header = this;
        return $(this).is(".odd") || $(this).is(".even") || $(this).is(".canceled");
      });
      var s = new Array();
      $.each(lines, function(i, n){
       s[i] = new Member($(n).children("td:first").text(), n);
      });
      s.sort(function(a, b){
        return a.name.toLowerCase().localeCompare(b.name.toLowerCase());
      });
      // add check and memo cols header
      $(header).find("th:first").before("<th>check</th>");
      $(header).find("th:last").after("<th>memo</th>");
      // append to table
      $("table").empty();
      $(header).appendTo("table");
      $.each(s, function(i, n){
        $(n.tr).find("td:first").before("<td></td>");
        $(n.tr).find("td:last").after("<td class='memo'></td>");
        $(n.tr).appendTo("table");
      });
    });

});
</script>

eventsページの参加者リストだけがtableなので、その部分を取得してガリガリしてます。

あとは、このJavascriptをトリガーするためのボタンを用意します。

<input type="button" value="名前で並び替え" id="sort_name">

もともとはエクセルで貼付けでいいやーと思ってたのですが、直前でキャンセルとかあった場合に、わからなくなるよとアドバイスを頂いたので、だったら直接書き換えちゃえばどうだろうと。


そして、ついでだから、チェック欄とメモ欄も作っちゃえと。


ただ、上記ソースをeventsのページに直接書き込むことができないので、ローカル環境でiframeを使ってtableタグだけをとって加工、表示するよにしました。

で、ローカルで実行した結果が以下。

f:id:brtRiver:20081023182927p:image

でも、どうやって開場直前に印刷するかを考えてなかった。。そっちのほうが大事なのに。

[] エクスギア Blog

http://www.exgear.jp/blog/

私が所属している会社がブログ開設しました。

内容は幅広くなると思いますが、CakePHP,symfonyなどのPHPtipsなどがメインになるかと思います。

私はとりあえずaskeetをsymfony1.2でやり直すという(途中で辞めてしまいそうな)記事でも書こうかと思っていますが。。

2008-10-20

[][]CakePHPでメソッドチェーン風にヘルパーを使う

<? php echo n(h(mb_convert_kana(mb_substr($text, 0, 100), 'a'))); ?>

..(略)...

結論から言えば、このクラスを利用することで、上記の処理は以下のように記述できます。

<?php fx($text)->mb_substr(0, 100)->mb_convert_kana('a')->h()->n()->e(); ?>
CakePHPのView内の関数処理を綺麗に記述する(邪道でしょうか?)

括弧の数が合わないというエラーから解放されます。

マジックメソッドを多用するので場合によっては速度面でボトルネックになるかもしれませんけどね。

2008-10-16

[] テンプレート中のPHPタグのインデント

symfonyCakePHPではテンプレート機能として素のPHPを使うのが基本となっています。

色々意見はあると思いますが、PHPそのものがHTMLに埋め込みやすいという点が大きいところです。

その中で気になる点があります。それはPHPタグのインデント方法についてです。

文章で説明するのもなんなので以下のHTMLを出力するPHPを考えてみてください。

<dl>
  <dt>title</dt>
  <dd>contents</dd>
  <dd>contents</dd>
  <dd>contents</dd>
  <dt>title</dt>
  <dd>contents</dd>
  <dd>contents</dd>
  <dd>contents</dd>
  <dt>title</dt>
  <dd>contents</dd>
  <dd>contents</dd>
  <dd>contents</dd>
</dl>

PHPに慣れている人であれば難しくは無いと思います。

おそらく以下のようなPHPを書くのではないでしょうか?

<dl>
<?php for($i=1; $i<=3; $i++): ?>
  <dt>title</dt>
  <?php for($p=1; $p<=3; $p++): ?>
  <dd>contents</dd>
  <?php endfor ?>
<?php endfor ?>
</dl>

dtとddをループさせるためfor構文を用いていることと、終了をendforを用いています。

そしてdtとddのためにforが入れ子になるため、インデントをつけて解りやすくしています。

ref: http://jp.php.net/manual/ja/control-structures.alternative-syntax.php


たしかに、これで実現できますし、表示上何も問題はありません。

しかし、実際に出力したHTMLのソースは以下のようになります。

<dl>
  <dt>title</dt>
    <dd>contents</dd>
    <dd>contents</dd>
    <dd>contents</dd>
    <dt>title</dt>
    <dd>contents</dd>
    <dd>contents</dd>
    <dd>contents</dd>
    <dt>title</dt>
    <dd>contents</dd>
    <dd>contents</dd>
    <dd>contents</dd>
  </dl>

見てすぐわかるようにソースのインデントは崩れています。原因はもうおわかりですよね。

PHPの入れ子になったforを見やすくするために入れたインデントのため、ソースに余計なインデントがついてしまったからです。

さきほども書きましたが、これでも表示上は何も問題ありません。

いまではFirebugなど便利なツールもあるので直接ソースを眺めて。。。という機会は減ってますしね。

しかし、次のような場合には少なからず違和感を覚える場合があると思います。

  1. HTMLではインデントしないというコーディングルールだった場合
  2. モバイルなどでパケット量を少しでも抑えるために努力しなければならない場合

というわけで、その場合の方法として以下のような方法がありかと思います。

<dl>
<?php for($i=1; $i<=3; $i++): ?>
  <dt>title</dt>
<?php     for($p=1; $p<=3; $p++): ?>
  <dd>contents</dd>
<?php     endfor ?>
<?php endfor ?>
</dl>

<?php のタグの中でインデントを行うようにすれば、ロジックの可読性もそれほど落とさずに余計なインデントがHTMLに含まれないようにすることができます。

とはいえ、タグのインデントだけで入れ子になっているのを判断できないのは決して見やすいとは思えませんね。。

2008-10-14

[][][] 両方のステータス更新するだけスクリプト

twitterではTwitterPod, wassrではwasacoを使ってます。ただ、発言するのに両方に入れるのも面倒なのと、そのためだけにクライアントソフトを乗り換えるのは面倒なんで両サービスのステータスを更新するスクリプトをrubyで作成。

ステータス更新だけが目的なんでレスポンスは無視してしまっていたり、冗長だったり、エラー処理などは無かったりと駄目駄目ですが。。

update_status.rb

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
## $ gem install mechanize
require 'rubygems'
require "mechanize"
##################################################
## setting
twitter_user = 'yourmail@example.com'
twitter_pass = 'password'
wassr_user = 'yourname'
wassr_pass = 'password'
source = "rb" ## source for wassr
##################################################
## get message
msg = ARGV[0]
if msg == nil
  puts "input status!!"
  exit(0)
end
##################################################
## for twitter
agent = WWW::Mechanize.new()
agent.auth(twitter_user, twitter_pass)
postdata = {"status" => msg}
page = agent.post("http://twitter.com/statuses/update.json", postdata)
puts "updated twitter ...\n"
##################################################
## for wassr
agent = WWW::Mechanize.new()
agent.auth(wassr_user, wassr_pass)
postdata = {"source" => "rb", "status" => msg}
page = agent.post("http://api.wassr.jp/statuses/update.json", postdata)
puts "updated wassr ...\n"
exit(0)

あとは

実行するのに必要なmechanizeをinstallして

$ gen install mechanize

実行権限をあたえて

$ chmod +x update_status.rb

引数でステータスを渡すと。

$ ./update_status.rb "更新"

rubyをよくわかってないけど楽しい。

2008-10-12

[][]sfFormのメッセージの日本語化

以下のようなメッセージファイルを<アプリケーション>/i18n/form.ja.xmlに用意し

<xliff version="1.0">
  <file orginal="global" source-language="en_US" datatype="plaintext">
    <body>
      <trans-unit>
        <source>Required.</source>
        <target>未入力の必須項目があります</target>
      </trans-unit>
      <trans-unit>
        <source>Invalid.</source>
        <target>入力した値を再度確認してください</target>
      </trans-unit>
      <trans-unit>
        <source>CSRF attack detected.</source>
        <target>画面遷移が確認できませんでした</target>
      </trans-unit>
      <trans-unit>
        <source>"%value%" does not match the date format (%date_format%).</source>
        <target>"%value%"が日付のフォーマット (%date_format%)に一致しません</target>
      </trans-unit>
      <trans-unit>
        <source>The date must be before %max%.</source>
        <target>日付は %max% より前を指定してください</target>
      </trans-unit>
      <trans-unit>
        <source>The date must be after %min%.</source>
        <target>日付は %min% より後を指定してください</target>
      </trans-unit>
      <trans-unit>
        <source>"%value%" must be less than %max%.</source>
        <target>"%value%" は %max% より小さい値を指定してください</target>
      </trans-unit>
      <trans-unit>
        <source>"%value%" must be greater than %min%.</source>
        <target>"%value%" は %min% より大きい値を指定してください</target>
      </trans-unit>
      <trans-unit>
        <source>Unexpected extra form field named "%field%".</source>
        <target>"%field%" という不明のフィールドがあります</target>
      </trans-unit>
      <trans-unit>
        <source>"%value%" is too long (%max_length% characters max).</source>
        <target>入力文字数がオーバーしています (%max_length%文字以下)</target>
      </trans-unit>
      <trans-unit>
        <source>"%value%" is too short (%min_length% characters min).</source>
        <target>入力文字数が不足しています (%min_length%文字以上)</target>
      </trans-unit>
      <trans-unit>
        <source>"%value%" does not match the time format (%time_format%).</source>
        <target>"%value%"が時刻のフォーマット (%time_format%)に一致しません</target>
      </trans-unit>
      <trans-unit>
        <source>An object with the same "%column%" already exist.</source>
        <target>既に登録されています</target>
      </trans-unit>
    </body>
  </file>
</xliff>

フォームクラスで

 $this->widgetSchema->getFormFormatter()->setTranslationCatalogue('form');

とすればメッセージを日本語化できます。

ただし、getErrorSchema()をechoしたものは日本語化されないですね。

また、細かなメッセージ制御は難しいのが現状。テンプレート側で制御した方が良い印象。

このあたりをメッセージファイルだけでやりとりするのは限界かな。

ただ、とりあえず動くものを作りたいのであればこの部分だけ日本語化しておくだけでも印象は違うかも。(気持ち的なことなんですけどね)

2008-10-10

[][][] ローカルでのコミットを1つにまとめてSubversionにコミットする方法

個人のリポジトリならいいんですが、共有しているリポジトリではコミットはある程度"意味のある単位"で行った方が親切です。

「もう帰るけど作業は途中。とりあえずコミット」をされて、そうとは知らずに、中途半端な動かないソースでアップデートしちゃったもんだからアプリが動かないとか悲しすぎます。

だから、ローカルに自分専用のミラー(ローカルリポジトリ)を作成し、そこにはガンガンコミットしておいて、タスクが終わったらまとめてサーバー側にコミットするという作業に意味があります。

また、ネットワークにつながっていなくてもガッツリと開発が行うことができるのも魅力です。

イメージとしては以下のような感じです。

<これまでの管理>
コミット => (サーバーのリポジトリ)

<分散管理>
コミット => (ローカルのリポジトリ) => コミット => (サーバーのリポジトリ)

ツールとしては分散リビジョンシステムとして有名な svkgitがあります。

これらを使ってSubversionのリポジトリに綺麗にコミット?する方法をメモ。

インストール

ローカルの環境はmacbookです。基本portで管理してるのですが、SVNPerlライブラリでエラーがでてしまうので、それぞれdmgからインストールしました。

svk

以下のサイトで勉強し参考にさせていただきました。

ref: http://mono.kmc.gr.jp/~yhara/w/?SvkTutorial


構成

構成は以下のとおり。ローカルにミラーを作ります。

サーバーとミラーを同期とるのがsync。ミラーからブランチに更新内容をとってくるのがpull。あとはsvnのときと同じでupdateで更新。

また、最後のまとめてコミット(smerge or push)はローカルのミラーに対して行えばよく、通常はローカルのブランチにコミット(commit)を繰り返します。

つまり、ブランチに行う作業はSubversionの管理となんらかわりません。

サーバー側と同期をとったり、まとめてコミットする部分(sync, pull, smerge, push)を理解すれば良いということになります。

svn+ssh://hogehoge@example.com/home/svn/repos/prj/trunk (サーバー側本番)
 ↓(sync)     ↑
//mirror/prj/trunk (ローカルのミラー)
 ↓(pull)     ↑(svk smerge)(svk push -l --verbatim)
//prj/branches/hogehoge (ローカルの作業用ブランチ)
 ↓(update)    ↑(svk commit)
準備
$ svk depotmap --init
  • ミラー(//mirror/prj/trunk)の準備
$ svk mirror //mirror/prj/trunk svn+ssh://hogehoge@example.com/home/svn/repos/prj/trunk
  • ミラーをサーバーと同期させる
$ svk sync //mirror/prj/trunk
  • 作業用のブランチ(//prj/branches/user)を作る
$ svk copy -p //mirror/prj/trunk //prj/branches/hogehoge
  • ブランチ(//prj/branches/hogehoge)から作業領域(/Users/hogehoge/prj)にcoする
$ svk co //prj/branches/hogehoge /Users/hogehoge/prj
通常作業
  • ミラーとブランチを最新の状態にする
$ svk sync //mirror/prj/trunk
$ svk pull //prj/branches/hogehoge
  • 作業領域を最新の状態にアップデートする
$ svk update
  • ブランチにコミット
$ svk ci -m "commit!"
まとめてコミット

smergeかpushで行う。詳しくは svk helpで。

コメントをつける事ができるsmergeのほうが便利?

  • smerge (sm)
$ svk sm //prj/branches/hogehoge //mirror/prj/trunk -m 'new commit log'
  • push
$ svk push -l --verbatim //prj/branches/hogehoge

git

以下のサイトで勉強し参考にさせていただきました。

ref: http://www8.atwiki.jp/git_jp/pub/Documentation.ja/user-manual.html#id2544723

構成

構成は以下のとおり。

SVKと同じようにローカルに環境を作りますが、svkではミラーと呼んでいたものがgitの場合はgitへ変換されたローカルのmasterという名前のブランチになる点でが異なります。

そして作業用のブランチを作成する点は同じです。

svn+ssh://hogehoge@example.com/home/svn/repos/prj/trunk (サーバー側本番)
 ↓(svn clone)     ↑(svn dcommit)
//master (ローカルのマスターブランチ)
 ↓(branch branch-git)↑(merge --squash, commit)
//branch-git (ローカルの作業用ブランチ)
 ↓(svn rebase)    ↑(add)

準備
  • gitの初期化(masterブランチの作成)
$ git svn clone svn+ssh://hogehoge@example.com/home/svn/prj/trunk /Users/hogehoge/prj
  • 作業用のブランチ(branch-git)を作る
$ git branch branch-git
  • 作業用のブランチ(branch-git)に移動
$ git checkout branch-git
( git branch で現在使用中のブランチに*マークがつく )
通常作業
  • 作業用ブランチを最新の状態にアップデートする
$ git svn rebase
  • 更新通知(add)と作業用ブランチ(commit)にコミット
$ git add .
$ git commit
まとめてコミット

マスターのブランチに移動し、マージ処理とローカルへのコミット、Subversionへのコミットを行う

  • マスターのブランチに移動
$ git checkout master
  • マスターのブランチに戻り作業ブランチ(branch-git)をマージ(merge)する
$ git merge --squash branch-git
  • ローカルへのコミット(commit)とサーバーへのコミット(svn dcommit)
$ git commit
$ git svn dcommit
  • 不要になったブランチ(branch-git)の削除
$ git branch -d branch-git

感想

慣れているツールを使うのが一番ですが、gitのほうがシンプルな印象を受けました。

ただし、Subversionと連携させたいという目的から考えるとsvkのほうが相性はいいかもしれません。

2008-10-07

[][] symfony1.2は今月リリース?

予定ではsymfony1.2は10/26にリリースされる予定なんですが、1.0から1.1に移行するときにように1.1から1.2にアップグレードするときにどう変更がされているかについてのドキュメント(UPGRADE_TO_1_2)が附属しています。

せっかくなのでリリース前に現在のリビジョンのものを超訳したものをアップしましたので1.2でどうなるのか気になる方は一読してみてはいかがでしょう。

http://code.google.com/p/symfony-doc-ja/wiki/Upgrade_from_1_1_to_1_2

主にリファクタリングがメインのような内容です。

一番大きいのは、PropelのPDO対応のための変更点についてでしょうか。

また、1.2から用意された新しい機能(ルーティングの拡張、フィルタリング(検索フォーム)の生成タスクプラグインの動的読み込み等)の説明もありますし、実はかなーりのボリュームだったりします。

いずれはDefinitive Guideもこのバージョンに対応するんでしょうけど、完全に対応するまではバージョンの違いでドキュメント探しも苦労しそうな予感が。。

2008-10-05

[] ネットワークが不安定な場合の対処

何が原因かはわかりませんが、まれにゲストから外部への接続が不安定になるときがあります。一時的なものだったらいいのですが、どうも一旦調子が悪くなるとホストを再起動させないと駄目なようです。

標準で用意されているboot.shで再起動する手順メモ。

mac$ cd /Library/Application\ Support/VMware\ Fusion/
  • boot.shをrestartさせることでVmware Fusionのネットワークデーモンを再起動させる
mac$ sudo ./boot.sh --restart


参照: http://javaflavor.cocolog-nifty.com/blog/2007/06/vmware_fusion_b_7de9.html

2008-10-03

[][]symfony 1.1.4 released

symfonyの1.1系がリリースされています。

セキュリティfixなので1.1系以上を使っている人はお忘れなく。

ref:http://www.symfony-project.org/blog/2008/10/03/symfony-1-1-4-released-security-fix

ちなみにどこが問題かというとsfFormのValidatorで利用できるパラメータの一部がHTMLエスケープされないため、エラー時にXSSが実行される可能性があったというものです。

おもしろいのが、このバグが見つかった経緯です。

前日にファビアンがセキュリティについてのブログを書きました。

ref: http://www.symfony-project.org/blog/2008/10/03/security-must-be-taken-seriously

「セキュリティには十分注意しなければならない」といった記事です。

Railsで定義外の値をうけとっても処理してしまうといった記事を例*1にsymfonyではsfFormで定義していないパラメータは標準でうけとらないし、もしそういう値があればエラーになります。そして受け取りたかったらallow_extra_fieldsオプションを使えばいいから大丈夫なんだよといった内容でした。

すると、そのコメントに今回のXSSの脆弱性について指摘があり*2速攻でリリースされたというわけです。

結局フレームワークを使うから必ず安全という考えはないってことです。フレームワークに限らず開発言語を選択するときもそうなんですけどね。

[]特定のDIV内のアンカーがクリックされたらDIV自身を非表示

次のようなHTMLがあって

<body>
<div class="panel">
  <div>
    <a href="#">test1</a>
    <a href="#">test2</a>
    <a href="#">test3</a>
  </div>
</div>
<div class="panel">
  <a href="#">test4</a>
  <a href="#">test5</a>
  <a href="#">test6</a>
</div>
<div class="panel">
  <a href="#">test7</a>
  <a href="#">test8</a>
  <a href="#">test9</a>
</div>
<div class="panel">
  <a href="#">test10</a>
  <a href="#">test11</a>
  <a href="#">test12</a>
</div>
</body>

アンカーがクリックされたときにそのアンカーが含まれるpanelというクラス名のdivを非表示にしたい場合にjQueryでどうかくの?

最初

<script type="text/javascript">
$(document).ready(function(){
    $("div[@class=panel] a").click(function(){
        $(this).parent().hide();
    });
});
</script>

と書いてみたものの、divが入れ子になってしまっているとparent()じゃ入れ子のdivが非表示になってしまいpanelクラスのdivは非表示にできない。

というわけで、以下が正解?

<script type="text/javascript">
$(document).ready(function(){
    $("div[@class=panel]").each(function(){
        var target = this;
        $(this).find("a").click(function(){
            $(target).hide();
        });
    });
});
</script>

結局var targetとしてそこに一旦Xpathで指定した要素をつっこんで解決と。

他にもっとスマートな方法ってありそうな気がしつつ寝る。

*1:詳しくないのと全部目を通していないので違ったら指摘してください

*2:追記:後に知りましたがこのコメントを投稿されたtocさんは日本の方でした。

2008-10-01

[][] コンポーネントやパーシャルの呼び出しが便利になっている件

多用することがいいかどうかは別として、symfony1.1からはコントローラー内から簡単にパーシャルやコンポーネントのレンダー結果を取得することができるようになりました。

つまり、次のようなメソッドが用意されたということです。

// in action
public function executeIndex($request)
{
  // なんか処理
  $component_result = $this->getComponent('モジュール名', 'コンポーネント名', array('渡したい変数'));
  $partial_result = $this->getPartial('テンプレート名', array('渡したい変数'));
}

一番の使い道はメールの本文をテンプレートを使って作成する方法でしょうね。

今までは別のアクションにforwardさせたりしないと分離できないという悲しい方法しかありませんでしたがこれですっきりできます。万歳。


また、テンプレートを共通化するという方法でも利用場面はありそうです。この場合レンダーの結果を変数ではなく出力するメソッド(renderComponent, renderPartial)も用意されているのでこれらを使うと便利です。

たとえば、Ajaxで同じ部品を何度も再描画するような場面ではコンポーネントを作っておいてテンプレートからは

// in template
<?php include_component('ajax', 'update') ?>

としておき、Ajaxでリクエストされるアクションでは

// in action
public function executeUpdate($request)
{
 return $this->renderComponent('ajax', 'update');
}

とすれば簡単に処理をコンポーネントに共通化できスッキリします。

また、symfony1.1からはアクションにある実行メソッドには引数として$requestを常に渡すようになりました。

これはコンポーネントの実行メソッドでも同様ですので、コンポーネントでsfRequestオブジェクトにアクセスするのはこれを使うようにすることをお忘れなく。

// in template
<?php include_component('ajax', 'update') ?>

// in component
public function executeUpdate($request)
{
  $hoge = $reuqest->getParameter('hoge');
}

このようにsymfony1.0系で不満だった部分が解消されています。

2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2015 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |