Hatena::ブログ(Diary)

Copy/Cut/Paste/Hatena

2012-06-04

「ふつうのform」のためにFuzzy plugin for CakePHPを作ってみた

| 18:27 | 「ふつうのform」のためにFuzzy plugin for CakePHPを作ってみたを含むブックマーク 「ふつうのform」のためにFuzzy plugin for CakePHPを作ってみたのブックマークコメント

ふつうのformをつかいたい - はまちや2 - ニコニコ超会議2012を見て「確かになー」と思うところが多々あったので、

「ふつうのform」を作るための簡単なユーティリティをまとめる目的でFuzzy pluginを作ってみた。


k1LoW/Fuzzy ? GitHub


Fuzzy pluginって何?

Fuzzy pluginは主に何をするかというと、「ユーザの入力を決められたルールに従って調整するために変換/分割」する(AdjustableBehavior)。

各フィールドに

などの調整のためのルールを設定することで、CakePHPのバリデーションチェック前にユーザの入力をシステム側の都合に合わせたフォーマットに変換できる。

詳しい使い方はテストケースを参照。


入力の分割ロジック

気になる分割のロジックは、

だったりするので利用は自己責任で。


今後

「システム側の都合」はもう少しいろいろあると思うので、ぼちぼち対応していってみたい。

2012-03-29

CakePHP勉強会@東京 2012春「プラグインバトルロワイヤル」で発表してきた

23:10 | CakePHP勉強会@東京 2012春「プラグインバトルロワイヤル」で発表してきたを含むブックマーク CakePHP勉強会@東京 2012春「プラグインバトルロワイヤル」で発表してきたのブックマークコメント

完全に遅レスですが。


というわけで、いくつか自作のCakePHP Pluginを紹介してきた。

自分では常時使っているものだけれども、やっぱりPluginの紹介エントリとか適当に書くもんだから知られていなかった。


プラグインバトルロワイヤル k1LoW side | ZENPRE


意外に人気だったのが、Escape Plugin。「怠惰の極み」で作ったものだけれども意外に実用に足るので検討の価値はあると思う。


ちなみに社内にはもう一人「怠惰」な奴がいて、そいつが作ったのが「スキーマを見て最低限必要なバリデーションを勝手につける」というPlugin。


どっちも対テスター用という。別にテスターが怖いわけじゃないよ。

2012-03-19

「Emacs実践入門」をEmacs初心者に渡して観察してみた

| 22:38 | 「Emacs実践入門」をEmacs初心者に渡して観察してみたを含むブックマーク 「Emacs実践入門」をEmacs初心者に渡して観察してみたのブックマークコメント

Emacs実践入門 ?思考を直感的にコード化し、開発を加速する (WEB+DB PRESS plus)

Emacs実践入門 ?思考を直感的にコード化し、開発を加速する (WEB+DB PRESS plus)

Emacs初心者/初級者にお勧め」と話題の「Emacs実践入門」を献本していただきました!

id:tomoyaさんありがとうございます!

自分で読んだ感想

いろいろなところで言われているけれども、まさに「初心者/初級者」のための本。だと思う。

自分自身Emacsを普及すべく、Emacs Bootcampなどをしてみたけれども、

「北風と太陽」ではないけれども、この本のように「優しく丁寧に」教えるのもいいのかなと思ってしまった。

「知っておかないと後で面倒な」ことをしっかりと抑えつつ、着実にEmacsを使えるようにしていけるような本。

特に「Emacs初心者なプログラマ」にぴったり。一度導入しようとして挫折した人には最良だと思う。

個人的に少し残念だったのが、最初のほうのid:tomoyaさんの「Emacsへの熱い思い」もやさしくなっているところ。

レーサーレプリカのエントリーの再掲を期待していただけに。

いや、でも、うまく初心者の気持ちをとらえるには熱くなりすぎるのもいけないか。

というかcake.elが掲載されたのがうれしすぎる!

Emacsどっぷりな自分が感想を述べてもしょうがないので、Emacs初心者に渡してみてその行動を観察してみた。

スペックとしては、

という感じ。

Emacs実践入門」を渡してみた

  • 「ふーん」と目次をパラパラとみて、「全部見なくていいや」と「はじめに」を読み始める。と思ったら、いきなりQuickSilverからEmacs.appを起動しはじめた。
  • 見た目が気に食わないらしく、早速目次からフォントの設定方法を探し出しMacの中のフォントGoogleでよさげなフォントを物色。その後設定しようとinit.elをいじろうとしてキーバインドを覚えておらず3章に戻る。(見た目は重要なんだなー)
  • 「ファイルを開く(find-file)」「ファイルを保存(save-buffer)」を何度か繰り返したあと、フォント設定をトライ&エラーで開始。「本見てたら簡単にできた」と設定成功。
  • 覚えた(find-file)でメモを作りだし、覚えたキーバインドをメモ。ただし「C-k」ではなく「Ctrl k」と記述(わかりにくいらしい)。
  • 「ファイルを消すにはどうするの?」と質問してくる。「普通のエディタでもファイルを消す機能はないでしょ」というと納得する。diredでファイルを消す機能を覚える。
  • ウィンドウの分割がC-x 2、C-x 3であることに疑問を持つ。
  • 「どうなるんだろ」と(fine-file)でPDFを開いてバイナリを表示。その後画像も開いて綺麗に表示されるのを見て驚く。
  • 困った時のC-gをだけ覚えた。」と安心する。事実何かあったらC-gを押して切り抜ける。
  • 「なんか設定したら○○ができるようになります!って章ないのかな。」と言う。

というわけで

なかなか面白い結果が出た。

  • 最初のモチベーションを上げるのは重要っぽい。
  • 目次がEmacs初心者にもわかりやすいっぽい。
  • 「困ったときのC-g」はかなり良いプラクティス。意識していなかったけど確かにそうだと思う。
  • 「なんでも1つでできる」というのを「効率を上げる方法」と捉えているのは「ショートカット」を多用している人の特徴かも。と勝手に思った。

とりあえず、かつて挫折したころよりは進んでいるっぽい。


このままEmacsを常用しはじめたらEmacs実践入門はよっぽどすごい本だと思う。

2012-02-28

CakePHP CLI Package Installer 'recipe' を開発中

| 23:12 | CakePHP CLI Package Installer 'recipe' を開発中を含むブックマーク CakePHP CLI Package Installer 'recipe' を開発中のブックマークコメント

CakePHP勉強会 2012春 @東京が、定員を増やしては上限オーバー、定員を増やしては上限オーバーと何回も繰り返した結果、大変な人数になってきている。


はじめは40人程度じゃなかったっけ?


当日たまたま東京にいるので、気軽に参加表明したら「プラグインバトルロワイヤル」というガチンコなCakePHP Plugin発表セッションに参戦することに。


おそらく「おれのかんがえたさいきょうのぷらぐいん」の発表大会みたいなことなりそうなので、ある意味メタ的に、その「さいきょうのぷらぐいん」をインストール(設置)できるパッケージインストーラを作ってみた(開発中)。


recipe - CakePHP CLI Package Installer -


もともとRailsのBunderのもっと簡易的なものが欲しかったのと、社内で使っていた独自インストーラが1.3までしか対応していなかったので、改めて設計をし直している。まだ仕様は確定していない。と思う。

今のところの特徴としては


  1. 実行は1つphpファイルをダウンロードして実行するだけ(Pluginですらない)。そのくせ、CakePHPのShellクラスを利用するので見た目がbakerにも優しい。
  2. デフォルトのパッケージリストの他に、独自にパッケージリストを指定可能
  3. パッケージの一括インストールリストの指定も可能
  4. CakePHPのPluginに限らず、PHPライブラリを任意のディレクトリに設置可能
  5. GNUコマンドを使いまくっているのでLinuxのみ対応( Windows?なにそれ? )

2と3を指定するための設定ファイルを便宜上「レシピ」と呼んでいるのだけれども、

2と3のおかげで、「社内のクローズドな環境にあるPluginやライブラリを設置できたり」「いつも使うライブラリを一括インストールできる」レシピを作成できる。

また、レシピはリモートファイルを指定できるので、

php recipe.php -r https://raw.github.com/gist/1929041/536e6ac9735956d2f69af15e585be3a5907b22d0/myrecipe.php

なんてことも可能。そのうちCakePHPで作ったCMSみたいなシステムのアップデータみたいなものにも使えるようになるかもしれない。


まだ、実現したい機能を全て実装できていないので、まずは日々の業務に耐えられるように拡張していきたい。


何か良いアイデアがあれば教えてください。

2011-12-06

CakePHPでの管理者機能の分け方いろいろ[CakePHP Advent Calendar 2011 Day6]

| 18:24 | CakePHPでの管理者機能の分け方いろいろ[CakePHP Advent Calendar 2011 Day6]を含むブックマーク CakePHPでの管理者機能の分け方いろいろ[CakePHP Advent Calendar 2011 Day6]のブックマークコメント

CakePHP Advent Calendar 2011の6日目です。

前回は@kachiokaさんでした。

CakePHPにおける複数形はCakePHP自体がどう判定するのかがInflectorクラス次第ですからね。

ちなみにcake.elはInflectorクラスをEmacs Lispインプリメントして利用しているので安心です。


さて、本題です。

システムを作っていると、一般ユーザ側と管理者側の機能に分かれることが多いですよね。

で、一般ユーザの機能と管理者側機能は「似ているけど異なる」という微妙な感じになるのもよくあることです。

ただ、微妙とはいえ一般ユーザと管理者とではできることが違うので、それぞれの機能を何かしらの形で明確に分ける必要があります。

周りをみているといろいろ方法があるのでちょっとまとめてみました。

分離したいものはURLだったり「機能」だったり「親クラス」だったりしますが、そこはあえて限定しないで考えてみます。

ちなみに諸事情によりCakePHP1.3系を対象とします。


1.action内で条件分岐で分ける

例えばモデルのUser.admin_flgなどを見て機能を分ける方法があります。

これは「機能」のみを分けることになります。

簡単ですが、機能の乖離がでてくると条件分岐がでてきて面倒だったりします。

個人的にはあまりお勧めしません。


2.Routing.prefixesを利用してactionごとに分ける

app/config/core.php

<?php
Routing.prefixes = array('admin');

と書けば、PostsController::admin_add()がadmin/posts/addにルーティングされるというCakePHPの機能ですね。

これはURL「機能」を分けることになります。

ソースのコメントに"admin"とあることから、ある程度管理機能などに使うことを想定しているのでしょうか。


3.AdminAppControllerクラスをつくって継承することで分ける

AdminAppControllerクラスをapp/app_controller.phpに記述したり、libsに入れてそれを呼びだして継承したりする手法ですね。

AppControllerを継承しているのか、AdminAppControllerを継承しているのかで渡すパラメータや共通処理などを変えたりします。

これは「機能」「親クラス」を分けることになります。


4.Controller prefix pluginを利用してコントローラごとに分ける

拙作のController prefix pluginを利用することで、

従来のaction名ではなくコントローラ名でルーティングができるようになります。

例えば、route.php

<?php
App::import('Lib', 'ControllerPrefix.ControllerPrefixRoute');
Router::connect('/admin/:controller/:action/*',
                array('controllerPrefix' => 'admin'), array('routeClass' => 'ControllerPrefixRoute'))

と設定することで、admin_posts_controller.phpのAdminPostsController::add()がadmin/posts/addにルーティングされます。

これはURL「機能」を分けることになります。3と併用すれば「親クラス」も分けることができますね。



5.プロジェクトフォルダ(appフォルダ)ごとに分ける

大規模なプロジェクトになると結構これが良かったりします。

App::build()を利用してComponentやPluginなどをまとめてしまう方法ですね。

これはURL「機能」を分けることになります。


まとめ

一般ユーザ側と管理者側の機能の分離方法について考えてみました。

どれが最適なのかは「そのシステムによりけり」なのでしょうけど、

いろいろ方法のアイデアを知っておくと後々便利だと思います。

他にもいろいろ方法があると思うので是非教えてください。


さて、明日は@msngさんです。お楽しみに。