PSR-0 のクラスローダーは、PEARライブラリをロードできる

PSR、今日調べたのだけど、Webの解説記事が2010年で出尽くしていることを知った・・・。巡回して概要を把握できた。

やりたかったこと

  • composer / BEAR.Saturday 環境下でのPHPUnit 実行時に、BEARのクラスもcomposerのクラスもオートロードしたい

PSR-0 のクラスローダーは、PEARライブラリをロードできる

これも知らなくて、@koriym さんに教えて頂きました。感謝です。
stackoverflow の一部超訳メモ。

http://stackoverflow.com/questions/12828186/can-psr-0-class-autoloader-load-pear-library

Q. Can PSR-0 class autoloader, load PEAR library?

PSR-0 のクラスローダは、PEARライブラリをロードできるのか?

A1. PSR-0 should be able to work with both full-qualified namespaces and underscored classes. 
All you should need to do is replace the underscores with a directory seperator. A good example would be:

PSR-0 は、完全修飾したネームスペースと、アンダースコアの付いたクラス、どちらについても、動作することができるようにしなければならないのだよ。
やらなくちゃいけないのは、アンダースコアをDIRECTORY_SEPARATOR に置換することだけなのです。

A2. Should PSR-0 compatible class loader be able to load PEAR libs too?
Yes, PSR-0 is interoperable with the PEAR naming conventions of classes and files.
This is not publicly documented any longer, but it is commonly known.
||<<
PSR-0 準拠クラスローダは、PEARライブラリモロードすべきか?そうだよ。
PSR-0 はPEARのクラスとファイルの命名規約に相互運用対応している。

Ruby Hiroba P4D(Webデザインを学びたいRubyistのための)参加

開発コミュニティの独特の雰囲気に触れられて、良い一日でした。

参加前に思ったこととか

インターン先のRailsサービスは、フロントがSass/Haml 。自分は見慣れていない感じです。

Ruby HirobaP4D(デザイナー向けプログラム部)は、@machidaさんや @ayumikoさんがスタッフをされているそうで、ぜひ参加してみたいと思いました。

告知を見て、「前提知識は、Ruby、SassとCompassなのだろう」とあたりをつけた。

Ruby 環境はある。sass/compassは、無知・・・。→前日にドットインストールを見てさわりを理解した。

Ruby Hiroba P4D

こんなに可愛いステッカーを差し置いて、カツオのステッカーは残念ながらすでに売り切れ。

素敵スライドが公開されているので、本編についてはこちらには書きません。


以下、スライドには無い質疑のメモです。正確では無いかも。違っていたらすみません。

参加者による作品発表

その1:sendagaya.rb メンバー、京都からいらしている方より。Vim でデザインしたっぽいデザイン?!

→ ギラギラしてますね。
→ 色って、どうやって選べば良いの?

→ HUE/360
という便利なサイトがあります。これで選ぶと変な風にはならない。マンセル環。

RGB ベースで色を選ぶと、ギラギラした感じになりがちです。

詳しくはノンデザイナーのための配色理論

# 講師@ken_c_lo さんが「ノンデザイナーのための」の「のん」を打ち込んだら「飲んでいる」というサジェストが出てきて、おおっ!と思いました。

その2:Pankaku の方より。メインカラーが赤、黒背景のかっこいい作品。

→ 黒背景に赤のタイトル文字が沈んで見える?
→ メインカラーに lighten 5% かけるとどうだろう。
→ あんまり明るくしすぎると今度は下品になる。

参加者によるデザイン相談

その1:FBの人狼BBSサイトの中の人。@aileron さん。

汝は人狼なりや

Twitter Bootstrap 使用。どういったデザインアプローチがあるのか?

  • by いけのさん
    • 背景は、濃いブラウンあたりが良いかな。中世のゲームにあった雰囲気を出すと良い。ふきだしを、たとえば羊皮紙。英語を入れて筆記体にする。
  • by あかつかさん。
    • ヘッダ、ナビゲーション、コンテンツの配置はもうちょっとありがちな感じにまとめても良いか。
  • by まちださん。
    • Bootstrap のラップによる制作事例紹介。DEVLOVE2012。ヘッダタイトル文字、黄色なんだけれど、Gold に見せるスタイル。Herokuのタイトルでも使ってある。そのままスタイルコピペしたらできる。
    • 周りに暗い影をつける。RGBA とbox-shadow。素材を買わずに済むので手軽。
  • by くまごろうさん
    • ヘッダ見出しを serif や明朝系にすると目がいくようになる。
その2:DeckNotesの中の人。@fukajun さん

http://decknotes.com/
手軽にスライド作成。Qiita、Gist からインポートすることもできる。Slideshare にPDFでUPすることも可能。
プロっぽくするには?

  • by まちださん
    • TwitterBootstrap を、手間をかけずにカスタマイズしたい、とよく訊かれる(<私もちょうど、実務上知りたいところだったのでした)。


この日は、大先輩であるkwappaさんをお見かけしてご挨拶させて頂くこともできました。
スタッフの皆様、スポンサー企業様、ありがとうございました!

PHPで認可、権限管理(その1、ZfcRbacのサンプルを動かす)

はじめに

今まで、権限管理(認証から認可処理)をするときには、ZF1Zend_Aclで作っていた。設定箇所が多い実装をしていたので、もうちょっと何か無いかな、と感じていた。今回、仕事でまたまた要り用が出てきた。→ 他のライブラリを試してみることにした。

予備知識

権限管理のサンプルユースケース

  • 某ホームページの管理をしていると仮定。
  • 外部のライターさんが、ホームページ内の一部の枠を更新できるようなCMSツールを作る(よくある)。
  • ライターさんは下書きで登録して、ホームページの担当者が、事前に記事をチェックしてからProduction環境に公開する、という業務フローがある(よくある)。

ロール Create Read Update Delete
システム管理者
担当者 × × ×

ロール
Create
(下書きまで)
Read
Update
(下書きまで)
Delete
(下書きまで)
A社のライターさん

(A社記事のみ)

(A社記事のみ)

(A社記事のみ)

(A社記事のみ)
以下、B社、C社と複数想定。

ロールには継承関係がある。

システム管理者 > 担当者 > A社ライターさん・B社ライターさん

環境

  • PHP5.4。今回は、BEAR.Saturday にのせる形にしたい。

ライブラリ

今回は、ZfcRbacを試してみる。

1. ZfcRbacインストール

2. ZrfRbacサンプルを動かす

間違い1.

Extending and adding roles via instantiation. の
ソースコード16 行目
(誤) var_dump($rbac->hasRole('foo')); // true
(正)var_dump($rbac->hasRole($foo)); // true

間違い2.

Dynamic Assertions
Checking permission using isGranted() with a class implementing Zend\Permissions\Rbac\AssertionInterface. の
ソースコード25 行目
(誤)    return $this->userId == $article->getUserId();
(正)   return $this->userId == $this->article->getUserId();

Rbacでやれること

  • Roles
    • ロールを登録できるよ
  • Permissions
    • 認可を設定できるよ
<?php
 use Zend\Permissions\Rbac\Rbac;
 use Zend\Permissions\Rbac\Role;

 $rbac = new Rbac();

 $staff  = new Role('staff');
 $staff->addPermission('read.article');

 // ロールがパーミッションを持っているか
 var_dump($staff->hasPermission('read.article')); // true
 var_dump($staff->hasPermission('edit.article')); // false

 $rbac->addRole($staff);

 // 指定の権限を許可設定しているか
 $rbac->isGranted('staff', 'read.article'); // true
 $rbac->isGranted('staff', 'edit.article'); // false
  • Dynamic Assertions
    • Zend\Permissions\Rbac\AssertionInterfaceを実装したクラスと一緒に isGranted() を使えば、動的な認可判定をさせることもできるよ

動くようにした公式サンプルベースのコード

Dynamic Assertions

/**
*
* ZF-Commons のライセンスは下記です。
* 
* Commit Practices & Contributions
* All ZF-Commons modules are released under the 3-clause BSD license, unless otherwise stated. Contributions in the form of pull requests, feedback, and ideas are welcome from anyone.
* 
* Once a module reaches its first tagged release, the following rules shall apply:
* 
* All work should be done on feature / hotfix branches (NOT MASTER!) and pushed to your own fork.
* When a feature is ready to be merged, submit a pull request.
* Those with commit access must not push their commits directly to the canonical repository or merge their own pull requests.
* Each pull request should be peer-reviewed by other member in order to keep high code quality and prevent mistakes and ommisions. Once reviewed it is ready to be merged.
* 
* 
* http://framework.zend.com/manual/2.0/en/modules/zend.permissions.rbac.examples.html
* 上記公式サンプルコードを改変したものです。(kumamidori)
*/

use Zend\Permissions\Rbac\AssertionInterface;
use Zend\Permissions\Rbac\Rbac;
require_once('vendor/autoload.php');
class AssertUserIdMatches implements AssertionInterface
{
    protected $userId;
    protected $article;

    public function __construct($userId)
    {
        $this->userId = $userId;
    }

    public function setArticle($article)
    {
        $this->article = $article;
    }

    public function assert(Rbac $rbac)
    {
        if (!$this->article) {
            return false;
        }
        // edits his own article
        // can not edit another users article
        return $this->userId == $this->article->getUserId();
    }
}

//(略)
// User is assigned the foo role with id 5
// News article belongs to userId 5
// Jazz article belongs to userId 6

$rbac = new Rbac();
$user = $mySessionObject->getUser();
$news = $articleService->getArticle(5);
$jazz = $articleService->getArticle(6);

$rbac->addRole($user->getRole());
$rbac->getRole($user->getRole())->addPermission('edit.article');

$assertion = new AssertUserIdMatches($user->getId());
$assertion->setArticle($news);

//Determines if access is granted by checking the role and child roles for permission.

// bad!!! true always - bad !!! 
if ($rbac->isGranted($user->getRole(), 'edit.article')) {
    // hacks another users article
    // NG!!!
    p('1. This is BAD!!! sample. another users article');
}

// true for user id 5, because he belongs to write group and user id matches
if ($rbac->isGranted($user->getRole(), 'edit.article', $assertion)) {
    // edits his own article
    p('2. This is GOOD Sample. edits his own article');
}

$assertion->setArticle($jazz);

// false for user id 5
if ($rbac->isGranted($user->getRole(), 'edit.article', $assertion)) {
    // can not edit another users article
} else {
    p('3. This is GOOD Sample. can not edit another users article');
}

TODO(今後の課題)

  • BEAR.Saturday で rbacで上記ユースケースについて実装してみる (今日ここまでいかなかった・・・)
    • DB設計まではやってあるのでもうちょっと。できたらこのエントリーを更新する。
  • BEARのAnnotationで実装した場合とよくある方の実装との比較
  • ZF2 の方のZend-Permission-Acl との比較
  • Another way:silex/SecurityServiceProvider

情報源メモ

p.s.

今回、@koriymさんと @futurista999さんから、ライブラリ情報を教えて頂きました。ありがとうございました!

Ubuntu Server 12.04 LTS Server版で Guest Additions をインストール

久々のブログが細かい話題でかなしい。

環境

現象

Virtualbox上のメニューから[デバイス]⇒guest Additionsのインストールを選んだのですが、強制マウントを解除しますかとだけ聞かれて解除したら使えるのかと思ったら使えなかった次第です。
https://forums.ubuntulinux.jp/viewtopic.php?id=13601

対処方法

2年前に解決方法が出ていた・・・。

VirtualBoxのGuest AdditionsをUbuntu Serverにインストールする方法

不慣れなので助かりました。感謝。

手順記録

Installing Guest Additions in VirtualBox for an Ubuntu Server Guest

$sudo mount /dev/sr0 /mnt
$cd /mnt
$sudo ./VBoxLinuxAdditions.run

・・・
※makeのエラーが出る
※gcc のエラーが出る
※X のエラーが出る

$sudo apt-get install make
$sudo apt-get install gcc
$sudo apt-get install  xserver-xorg xserver-xorg-core

$sudo apt-get install build-essential linux-headers-`uname -r`

$sudo ./VBoxLinuxAdditions.run

メモ

学習週:Ruby文法の復習

先週は作業週だったのですが、何もできませんでした・・・。

今週は学習週。本を読むより、何か実際に作りながら公式マニュアルや本にあたる方が身に付く段階だな、と考えて、Rubyで簡単なものを作ってみることにした。
apacheのログ集計用スクリプトなんて、実務でたまにPHPで書いてきたよな。時間帯別アクセス数とか。」
と思って、その仕様を思い出して書いてみました。

https://github.com/kumamidori/ruby_tutorial_my_sample/blob/master/accesslog_houly.rb

メチャクチャ簡単なスクリプトだけれど、いろいろつっかかってしまった。ハッシュ、クラス、正規表現、etc。すごい勢いで文法を忘れていたことに気づく・・・。明日以降も文法をやろう。


以下は関係無い、ただの日記です。

ここ数年、週末はmixiコミュニティのオフ会みたいな、趣味サークルの活動(音楽)ばかりやっていました。この4月をもって、そういうのをほとんど辞めました。今後は、週末に家にいることができるようになります。今まであまりできていなかったこと、インターンとか、本を読むとかを、いろいろやっていけたら良いな、と思います。

プログラミングも、音楽も、上には上がいて。中級の下の方から、中級の上の方に行く間に、ぶ厚い壁があるように思われます。

作業週:ページングの変更

ここ1週間くらい、あまり何もできていませんでした・・・今週は久しぶりに時間が取れたので、怖話のページング変更作業をやりました。ものすごく簡単な変更をやっているはずなのに、ずいぶん時間がかかってしまいました。Railsの基本のところが、学習不足なんだな〜。

今回の変更にあたり、本を読んだ箇所について、だいぶ端折った粗いメモ。

ルーティングの基本

  • 複数のリソースに対するルーティング定義
  resources :entries

これだけで、CRUDがデフォルトで定義される。

  • 単一のリソースに対するルーティングの定義
  resource :session
  • ルート一覧
rake routes

これで、一番左の列に出てくるのが、「名前付きルート」。

  • カスタマイズやネストももちろん書ける

デバッグの超基本

p 変数名

これ、どこに出るの?コンソールに出るんだよ。コンソールって何?って聞いたらだんなにキレられました。サーバログのところに出るのですね。

Gitの取り消し作業

やっていると、けっこう取り消したいこと多し。おもしろいまとめを発見↓。
http://d.hatena.ne.jp/keisukefukuda/20111105/p1

reset や stash の便利さは分かったけれど、まだrebase を使えていない<今ココ。

作業週:ページングの変更(着手まで)

Rails の定番ページングライブラリの1つに、 kaminari(by amatsuda さん)があります。これの使い方のカスタマイズをやる(リロードでやっているページングをAjaxに変える)、というタスクを自分に入れてやってみることにした。

とりあえずググると、ご本人が回答されている。
http://stackoverflow.com/questions/5158532/ajax-pagination-with-the-kaminari-gem

Q. Does anyone have any hints or tutorials on how to do this? 
A. (略)could you take a look at the commits here on "ajax" branch? 
https://github.com/amatsuda/kaminari_example/commits/ajax
Hope this helps!

このkaminariのサンプルをまず動かして、使い方を理解することにした。


git clone で落としてくる。
rbenv でローカル環境を設定。

rbenv local 1.9.3-p327 

1. マニュアルのとおり、kaminari をインストール。私の場合、gem はグローバルを使わず、プロジェクトごとに落とすので、--path を指定。

bundle install --path vendor/bundle

2. db:migrate でデータを入れる。<ココが最初思いつかなかったのだけれど、Railsの常識過ぎていちいちドキュメントされないところだった。

bundle exec rake db:migrate

これでサンプルが動くようになった。

3. ページングの設定を変えてみる。

rails g kaminari:config 

して、デフォルトの設定を変えられる。

bundler 関係のトラブルシューティング

これは私の環境固有の問題なのだけれど、最初、

rails g kaminari:config 

すると、

Could not find generator kaminari:config.

とエラーになった。こんなときは、引数なしで、

rails g

として、自分の持っているジェネレータの一覧を見る。

Kaminari:
  kaminari:views

たしかにconfig が無いことが判明。公式ドキュメントと自分の環境に違いがあることが分かった。
ローカルのバージョン確認。

gem list kaminari                
*** LOCAL GEMS ***
kaminari (0.10.4)

リモートのバージョンを確認。

gem list kaminari -r
*** REMOTE GEMS ***
kaminari (0.14.1)
kaminari-admin-theme (0.0.1)
kaminari-bootstrap (0.1.3)
kaminari-i18n (0.1.3)

自分のは、古いな。ということで、

bundle update kaminari

したら、無事kaminari:configが入りました!

rbenv の bundle で、パスを指定していなかったのが間違い。私の場合、怖話や、各種サンプルで、それぞれ bundle を使うので、毎回プロジェクト毎にbundle のパスを切る方が、好都合なのでした(今まで、パス無しでbundle をやっていて、デフォルトのホームの下にごっちゃになった環境を作っていた)。

参考リンク