サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
猫
ngtn.hatenadiary.org
Readabilityのリストって非公開だと思っていませんか?自分は勝手に非公開だと思っていましたが違うようです。 事の発端は「ReederのReadability連携が便利!」という以下の記事を見て、Reederではなくlivedoor Readerを普段使いしている自分も、ReadabilityのリストをRSSリーダで読む方法はないかなと探してみたところから。 Twitterで気になった記事を「Readability」に送って「Reeder」で読むように設定するとRSSリーダーが超進化する。 | 男子ハック ググってみると、Readability側でRSSが用意されているのを見つけました。 Desk.com - Site Not Found (Subdomain Does Not Exist) しかし、説明を見るとフィードのURLが https://www.readability.co
昨日11/07にATNDBK(アテンドバック)というサービスをリリースしました。 http://atndbk.org/ 名前から想像がつくようにATNDがらみのサービスで、ATNDで開催されたイベントにトラックバック機能を提供するサービスです。 トラックバックを受け付けるWebサービスと、受け取ったトラックバックの表示を行うブラウザ拡張機能(Chrome版、Firefox版)とで構成しています。 作った目的や使うことのメリット イベントの主催者が、参加者の書いた記事を一つ一つ手でまとめてリストアップした記事を作って「抜けがあったら連絡くださーい」と言っている光景をたまに見かけるのですが、その手間は参加者一人一人が書いたことを通知する先があれば減らせるんじゃないかな、それっていわゆるトラックバックだよなー、という発想から作りました。 イベント参加者からのフィードバックを埋もれさせないために参
これは便利! CakePHP規約ワードメーカー WordMaker for CakePHP Conventions - CPA-LABテクニカル CakePHP関連の情報を検索していた時に偶然見つけた記事ですが、 こちらの方が公開している『CakePHP 規約ワードメーカー WordMaker for CakePHP Conventions』は 入力した単語からCakePHPの命名規約に従ってモデルやコントローラーのクラス名、ファイル名を教えてくれるというもの。 普段 bakeを使っている分には命名規約はあまり気にしなくても勝手に命名されるからいいけど、 いざ自分の手でファイルやクラス名の名前をつけようとした時に、 単数形or複数形?UpperCamelCase?アンダーバー必要?といったことをよく忘れてしまっている自分には重宝しそうです。 説明によると、 CakePHPのInflecto
Eclipse PDTでは、PHPネイティブの関数にカーソルをあててマウスの右クリック⇒「PHP マニュアルを開く」を選択するとPHPマニュアルのページを開くことが出来ます。 関数の使い方を忘れた時などに重宝するので、知っておくとちょっと便利です。 ただ、デフォルトでは英語のサイトが開いてしまうので、そこを日本語のサイトが開くようにする設定のご紹介。 設定方法 メニューバーの「ウィンドウ」⇒「設定」を選択 設定画面の左側の「PHP」⇒「PHP マニュアル」を選択 設定画面の右側上部で「新規」で表示されるウィンドウに以下を入力 「名前:」に適当な値。(例えば"PHP.net(ja)") 「Remote Site(URL):」に日本語のマニュアルサイト"http://www.php.net/manual/ja"を入力。 「OK」ボタンをクリック 設定画面の右側の一覧に追加したものが表示されるの
生StrutsのActionクラスではsaveMessagesメソッドを使えば、ビューへメッセージを渡せますが、SAStrutsではどうやって渡すのか調べてみたら、ActionMessagesUtilというユーティリティクラスが用意されていました。 Actionクラスでの使い方は以下のような感じ。 public class HogeAction { public HttpServletRequest request; // 中略 @Execute(input = "index.jsp") public String submit() { ActionMessages messages = new ActionMessages(); messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("xxxxxx")); // xxx
前回の記事の続きです。 指定した言語の翻訳が存在しない場合は引数の値(msgid)がそのまま表示される 指定した言語のlocaleのフォルダやpoファイルがない、対訳が存在しない等の場合、__()関数の第1引数の値(msgid)そのものが表示されます。 なので、引数のメッセージには意味の通る文章を必ず入れるのがベストです。 __()関数以外にも翻訳関数が存在する cake\basics.phpを覗くと、__()関数以外にも __d() __c() __n() __dn() __dc() __dcn() といった翻訳関数が存在します。 これらの関数名には意味があり、関数名にdが含まれる関数は「ドメインの指定」、cが含まれる関数は「カテゴリーの指定」、nが含まれる関数は「複数形への対処の指定」が出来るようになっています。 例えば、__d()は「ドメインの指定が出来る翻訳関数」、__dc()は「
引き続き多言語対応で分かったことのメモ。 コア部分の翻訳ファイルは存在した 1.2系の多言語対応メモ(1) - Writing Some Codeでコア部分を含めた翻訳ファイルの作り方を紹介しましたが、日本のフォーラムのhttp://cakephp.jp/modules/newbb/viewtopic.php?viewmode=flat&topic_id=289&forum=11を見たところ、既にコア部分の翻訳というのは行われていました。 ただ、最新の1.2Beta(1.2.0.6311)をダウンロードしても翻訳ファイルは含まれていないので、https://trac.cakephp.org/browser/trunk/cake/1.2.x.x/cake/locale?rev=4387の一番下にある「Zip Archive」のリンクからダウンロードして、解凍したものをapp/localeにコ
1.2系の多言語機能を使って、URLベースで言語の切り替えをするサンプルを書いてみた。 サンプルでは日本語と英語に対応するアプリを作る場合を想定。 app\config\routes.phpに以下の2行を追加。 Router::connect('/ja/:controller/:action/*', array()); Router::connect('/en/:controller/:action/*', array()); AppController(app\controllers\app_controller.php)のbeforeFilterにURLから言語を抜き出してConfigureに書き込む処理を追加。 <?php class AppController extends Controller { function beforeFilter(){ // URLから言語を抜き出す
「Hot Deploy」「Hot Deploy」連呼によって、今までで一番長いタイトル。。 気を取り直して本題を。 SeasarのHot Deploy機能はアプリケーションサーバーの再起動不要で修正コードがすぐに反映されるという便利な反面、ちょっとフレームワークの拡張をした時に「Hot Deployでは動くのにCool Deployでは動かない」(またはその逆)といったことにハマることが多いように思います。 S2Container本体やHot Deploy機能の理解が浅いせいもあって、自分も何回泣かされたことか。。。 今回もSAStrutsを使っていて遭遇してしまいました。 Hot Deploy対象外クラス(RequestProcessorやtaglibなど)内で、HotDeploy対象のServiceクラスやDtoクラスをgetComponentするような以下のコードを書くとClassC
同じjspを使う場合であってもurlが/employeeと/employee/indexなどとカレントパスが異なる場合があるので、jsp内でcssファイルなどを相対パスでベタ書きした場合には、どちら一方は正しくないパスとなってしまいます。 なにかSAStruts側で用意されていないか調べてみたらありました。 aタグのhref要素などを設定するときに、コンテキストルートを自動的に補完させる場合は、 f:url()を使います。パスを/ではじめた場合は、コンテキストルートからみたパスになります。パスが/ではじまっていない場合は、JSPからみたパスになります。 こんな感じで書けます。 <link rel="stylesheet" type="text/css" href="${f:url("/css/hoge.css")}">パスを/ではじめるのがミソですね。 これを知らなかったら、 <link
1.2系で追加されたAuthComponentは、認証関連の処理を一手に担ってくれる強力なコンポーネントですが、 AuthComponentのパスワード暗号化。登録注意点。CakePHP1.2b - CPA-LABテクニカル http://blog.ne2ma2.com/archives/161 等で紹介されているように、パスワードが自動で暗号化されるために注意が必要です。 上記のサイトでは暗号化の処理の注意点、暗号化される値の事前の算出方法などが紹介されていますが、今回は暗号化自体をしない方法はないかを探ってみました。 暗号化の回避方法 AuthComponentのソースを追ってみたところ、独自の暗号化処理を組み込める仕組みが用意されていました。 AuthComponentのauthenticateプロパティに、hashPasswordsというメソッドを持つオブジェクトをセットすれば、暗
『Executeアノテーションでつけられるroles属性によって、ユーザのロールによってアクセス制御をかけることができる』ということは、 マニュアルを見れば一目瞭然なのですが、DBを使ってユーザー認証をした後にロールをどうやってセットすればよいのかが分かりませんでした。 調べた結果、自分でセットできるものではなく、サーブレットコンテナに任せた認証を使う必要があるとのこと。 しかし、今までのアプリの認証は全て自前でカスタムしたものばかりで、 「サーブレットコンテナの認証って何?」 という状態だったので、チュートリアルの設定をみたり、ブログをあさってみたりと手探り状態で、 答えにたどり着くまでに随分時間がかかってしまいました。 orz JDBCレルムを使った認証というのがあるんですね。全く知りませんでした。 [参照]http://www.jajakarta.org/tomcat/tomcat5
1.1系ではHtmlHelperにあったinputメソッドが、1.2系ではFormHelperに移っています。 使い方としては <?php echo $form->input('field_name', array('type' => 'textarea' /* テキストエリア指定 */)); ?> などといった感じで、オプション指定の配列にtypeを指定することで、テキストエリアやセレクトボックスなどの種類を指定できるのですが、単純に <?php echo $form->input('field_name'); ?> と、フィールド名の指定をしただけでも、自動的にテキストエリアになったり、セレクトボックスになったりすることがあります。 どんな自動判別をしているのか気になったので、調べて分かったことをまとめてみます。(バージョンはBeta 1.2.0.6311) type指定がない場合の決
1.1系ではModel::generateList()メソッドを使えば、モデルから指定した列のkeyとvalueがペアとなった配列が取得でき、selectタグを作るのに便利でした。 1.2系ではそのgenerateList()は非推奨メソッドとなり、 「1.2系ではgenerateList()の代わりにModel::find('list')を使う」 という情報は色々なところで見つかったのですが、keyとvalueに使われる列を自分で指定する方法が分からなかったので調べてみました。 今回分かったのは2通りのやり方です。(Beta 1.2.0.6311で確認) 方法1:displayFieldプロパティを設定して、Model::find('list')を呼ぶ方法 こちらの方法はkeyに使われる列はモデルの主キー(通常であれば'id')固定になります。 モデルのdisplayFieldプロパティ
『はてなレビュー』というブラウザ拡張を作ってみました。 Chrome拡張版とFirefoxアドオン版を用意しています。 何を提供するもの? Amazonの商品ページに、カスタマーレビュー以外の情報収集の手段として、その商品について言及しているエントリーを人気と新着に分けて表示します。 商品を見ながらはてな上での評判や関連情報を見れるので、情報収集が捗ることを期待しています。 Amazonのカスタマレビューはそのレビュアーがどういった見識を持っているのかが見えないのでイマイチ信頼性がはかれない、そういった点も解決できないかなーと思っています。 よく訓練されたはてなーであれば、言及しているユーザのidを見るだけでその人のことはある程度知っているでしょうし。 知らないAmazonレビュアーが付けた5つ星の評価よりも、はてな上での評判のほうが参考になる、そう思うはてなーにオススメのブラウザ拡張です
常識かもしれませんが、明言されている記事が見つからなかったのでエントリー。 動作確認バージョンは毎度のBeta 1.2.0.6311です。 queryとfind、findAllでの返り値の違い 例えばfindAllとqueryのそれぞれを使って全件取得した結果の違いを見比べてみます。(DBMSはMySQLを使用) まずfindAllを使う場合。 $this->User->findAll(); の結果は Array ( [0] => Array ( [User] => Array ( [id] => 1 [username] => aaa [password] => xxx ) ) [1] => Array ( [User] => Array ( [id] => 2 [username] => bbb [password] => yyy ) ) )となります。 次にqueryを使った場合。
1.2系での話です。(バージョンはBeta 1.2.0.6311) 通常 PostsControllerのhogeメソッドにアクセスする時のURLは http://localhost/posts/hogeとなります。 ここに何かしらのパラメータを渡そうとするとhogeメソッドに <?php funcion hoge($param1 , $param2){ // 処理 } ?> と引数を受け取れるように定義した上で http://localhost/posts/hoge/10/20というURLにアクセスすると、hogeメソッドの引数$param1に10、$param2に20がセットされます。 パラメータの数がいつも変わらなければこの方法で十分なのですが、パラメータの個数が不特定の場合に困ってしまいます。 そんな悩みを解消するのが次の方法です。 名前付きのパラメータとして受け取る方法 先ほどと
今回は、はてなダイアリーのURLのようにドメイン名に続いてユーザー固有のIDで始まるURL(自分のでいうとhttp://d.hatena.ne.jp/ngtn/)をCakePHPでどのように実現するかを考えてみました。 まず仮に app/controllers/diaries_controller.phpファイルに定義された、DiariesControllerクラスのdisplayメソッドがユーザー固有のページを表示するものだと仮定します。 このメソッドは引数$userNameをとり、それがユーザーを識別するはてなIDのようなものだとします。 以降は$userNameの値を仮に'ngtn'として話をします。 <?php class DiariesController extends AppController { function display($userName){ //指定された$u
まず1.1系では 例えば HogeComponent にアクセスしたいヘルパーに $this->view->controller->HogeComponent->method(); というように書けば、HogeComponent の method にアクセスできる。 CakePHP ヘルパーからコンポーネントへのアクセス方法 | Sun Limited Mt. というように書くことが出来ます。 1.1系ではヘルパーにはビュークラスのインスタンス($view)、ビューにはコントローラクラスのインスタンス($controller)がセットされていたので上記が可能でした。 1.2系では 一方、1.2系(Beta 1.2.0.6311)では、 ヘルパーにはビュークラスのインスタンスがセットされていない。 ビューにはコントローラクラスのインスタンスがセットされていない。 というように変更されていたの
1.2系で色々と便利になっているvalidation機能ですが、エラーメッセージ出力については「DRYじゃない」と感じる点があります。 今回はそれを解消することを試みてみました。(バージョンはBeta 1.2.0.6311) 「DRYじゃない」と感じる点 同じruleのメッセージを何度も書かなくてはいけない 例えば、同じruleが複数登場する場合、モデル内の$validate配列が <?php var $validate = array( 'field1' => array( array('rule' => VALID_NOT_EMPTY , 'message' => '必ず入力してください。'), array('rule' => array('minLength', 5), 'message' => '5文字以上で入力してください。' ), array('rule' => array('
「継承は is-a の関係」というのはオブジェクト指向の基本ですが、最近は何でも安易に継承を使ってしまうことが多かった自分を戒めてくれたのがこちらの本。 アジャイルプラクティス 達人プログラマに学ぶ現場開発者の習慣 作者: Venkat Subramaniam,Andy Hunt,木下史彦,角谷信太郎出版社/メーカー: オーム社発売日: 2007/12/22メディア: 単行本(ソフトカバー)購入: 35人 クリック: 995回この商品を含むブログ (291件) を見る 本書の「32 取り決めを守ってコードを置き換える」(p.129〜)に次のようにあり、継承か委譲か判断の指針になります。 新しいクラスが既存のクラスと置き換え可能で、かつ両者の関係がis-a (である)の場合は、継承を使う。 既存のクラスを新しいクラスで使いたいだけで、両者の関係がhas-a (持つ)またはuses-a (使う
CakePHPの1.2系から多言語機能が充実しています。 多言語対応の方法としては、翻訳テキストを使う方法(gettextを利用する場合と同等の方法)とDBを使う方法の2種類がありますが、今回の話は前者のほう。 まず失敗談 Bakeryのコチラの記事によると、コンソール機能を使ってソース(*.php,*ctp)の中で __() 関数を使っている箇所を元にpotファイルを作成する方法があるようだったので、この記事のstep3の通り、 > cake extractとコマンドを入力するとエラーとなって、結局原因が分からないままpoファイルの作成はpoedit(翻訳用のエディタ)に任せて、その場を凌いだのがつい2日前。 そんな時にタイミングよくCakePHP1.2の簡単国際化: CakePHP のおいしい食べ方の記事がアップされていて謎が解消しました。 Bakeryの記事は古い情報だったようで、実
空メール送信での会員登録や、メールに添付されたファイルをサーバに自動でアップロードなど、メール受信からのスクリプト実行というのは様々なシーンで用途があると思います。 今回はそれをCakePHP 1.2系のシェル機能を使って実現してみました。(1.2.0.6311-betaで確認) 使用するもの メールサーバはqmail、メールの解析処理はPEARのMail_mimeDecodeを使用します。 PEARを使用できるようにセットアップ まずapp/vendorsの下にPEARフォルダを作り、PEARのコアクラス(PEAR.php)とMail_Mimeパッケージのクラスを置く。 次に、以下のソースをapp/vendors/pear_ini.phpとして保存。 <?php define('PEAR_PATH', dirname(__FILE__) . DS . 'PEAR'); set_inclu
Eclipse PDTを使う理由の1つは、その強力なコード補完機能です。 CakePHPを使った開発でもそれを最大限に活かさないのはもったいない!ということで、各所で既出な情報ではありますが、自分の備忘録を兼ねて書きます。 知らない人は今すぐ設定することをオススメします。この設定をすると開発効率は格段にあがると思います。 Viewファイルのコンテンツタイプの設定 Viewファイル(1.1系だと.thtml、1.2系だと.ctpが拡張子のファイル)は、デフォルトではただのテキストファイルとして扱われ、phpコードの補完機能が使えません。 これらはコンテンツタイプの設定をすることで、phpコンテンツとしてEclipseでは認識され、コードの補完もできるようになります。 その設定方法はというと、以下の通り。 メニューバーの「ウィンドウ」⇒「設定」を選択 設定画面の左側の「一般」⇒「コンテンツ・タ
Eclipse PDTで開発していて、bakeしたくなった時にコマンドプロンプト開いてcdして、ってのが煩わしい。 何かいい方法がないか探してみた所、「Eclipse Platform Extensions」というEclipseプラグインを見つけた。 早速、更新サイトhttp://opensource.trajano.net/をEclipseに登録して、プラグインのインストールを実行。 インストールすると、Eclipseのエクスプローラ上で適当なフォルダ(もしくはファイル)を右クリックすると、左のスクリーンショットのように「フォルダーを開く」というメニューが表示され、そこからコマンドプロンプトが開けるようになる。 appフォルダを右クリックしてプロンプトを開けば、cdしなくてもすぐにbakeできるのでなかなか便利。 コマンドプロンプト以外にもWindowsのエクスプローラで開けたりするので
このページを最初にブックマークしてみませんか?
『Writing Some Code』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く