CakePHP3チュートリアルの「Restricting Bookmark Access」実装後のページアクセス制限について

f:id:saj_kz:20150215190732p:plain
最近RC2も出て、そろそろいじってみようかな?といったタイミングでしたので、CakePHP3のBoomarkerTutorialをやってます。
チュートリアルパート2にて、ログイン、ログアウトの実装後に、ログイン状態によって特定のページ以外へのアクセスを制限する「Restricting Bookmark Access」の項があります。
ここで、AppControllerに対して

public function isAuthorized($user)
{
    return false;
}

の追加と、

public function initialize() {
...
$this->loadComponent('Auth', [
        'authorize'=> 'Controller',
...

の設定を行っていますが、これにより全てのControllerにてページへのアクセスが制限されてしまいます。
チュートリアル内では、BookmarksController.php の isAuthorized() を実装して、ログイン状態によってブックマークページへのアクセスを行えるようにしていますが、ユーザ一覧ページ (http://対象サーバ/users)等のブックマーク以外のページはアクセスできないままなので、他のControllerにも、isAuthorized() を実装してみました。

UsersController

ファイルの場所 : /src/Controller/UsersController.php

public function isAuthorized($user)
{
    $action = $this->request->params['action'];
    // index, add, login, logoutページは誰でも見れる
    if (in_array($action, ['index', 'add', 'login', 'logout'])) {
        return true;
    }
    // All other actions require an id.
    if (empty($this->request->params['pass'][0])) {
        return false;
    }
    // リクエストされたページのUser idと
    // ログイン中のUser idが一致する場合はその他のアクションも許可する
    $id = $this->request->params['pass'][0];
    $current_user = $this->Users->get($id);
    if ($current_user->id == $user['id']) {
        return true;
    }
    return parent::isAuthorized($user);
}

TagsController

ファイルの場所 : /src/Controller/TagsController.php

public function isAuthorized($user)
{
    $action = $this->request->params['action'];
    // 想定される全てのページへのアクセスを許可する
    if (in_array($action, ['index', 'add', 'edit', 'view', 'delete'])) {
        return true;
    }
    return parent::isAuthorized($user);
}

これで、ユーザ、タグページの各種操作は問題なく行えます。

ちなみにisAuthorized() の処理は、
/vendor/cakephp/cakephp/src/Auth/ControllerAuthorize.php
の authorize() から呼ばれているようですので、興味があれば見てみてください。

VMWare内からVirtual BoxでCentOSを立ち上げようとすると失敗してしまう

状況

VMWare上のCentOS(6.6)環境で、さらにVirtualBoxVagrantを使用してCentOSを立ち上げた際に以下のエラーが発生しました。

f:id:saj_kz:20150201214431p:plain


VT-x/AMD-V hardware acceleration is not available on your system.
Your 64-bit guest will fail to detect a 64-bit CPU and will not be able to boot.

VMWare上で動いているCentOSは64bit版なので問題なさそう。

解決方法

「VT-x/AMD-V hardware acceleration is not available」の部分が胆でした。

  1. VMWare上のCentOSを一度シャットダウン
  2. ホストOSのVMWareプレイヤー上から対象のCentOSを選択し「仮想マシン設定の編集」を選択
  3. 仮想マシンの設定」画面が出たら「ハードウェア」タブを選択
  4. 表示された画面の左側から「プロセッサ」を選択し、右画面の「Intel VT-x/EPTまたは AMD-V/RVIを仮想化」をチェックする
  5. 設定変更後、再度VMWareCentOSを起動し、さらにVirtualBox、Virgrantを使用してCentOSを立ち上げる。

f:id:saj_kz:20150201214527p:plain

これで、「VT-x/AMD-V hardware acceleration is not available on your system ...」が出なくなります。
参考までに。

2014年に読んだ本まとめ

1. テスト駆動開発入門

テスト駆動開発入門

テスト駆動開発入門

  • 作者: ケントベック,Kent Beck,長瀬嘉秀,テクノロジックアート
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2003/09
  • メディア: 単行本
  • 購入: 45人 クリック: 1,058回
  • この商品を含むブログ (161件) を見る
感想記事: 「テスト駆動開発入門」を読みました - saj_kzの日記

2. リーン・スタートアップ

リーン・スタートアップ

リーン・スタートアップ

感想記事: リーン・スタートアップは「小さく、細かく、早く」 - saj_kzの日記

3. リーン開発の現場

リーン開発の現場 カンバンによる大規模プロジェクトの運営

リーン開発の現場 カンバンによる大規模プロジェクトの運営

勉強会にも行ってきました: 「Scrum Boot Camp The Book x リーン開発の現場 - なぜ現場の実践本が必要なのか」に行ってきた - saj_kzの日記

4. Railsレシピブック

Rails3レシピブック 190の技

Rails3レシピブック 190の技

感想記事:
RailsレシピブックとMVCについて少し - saj_kzの日記

5. メタプログラミングRuby

メタプログラミングRuby

メタプログラミングRuby

感想記事:
「メタプログラミングRuby」感想 - saj_kzの日記

6. 強いチームはオフィスを捨てる

強いチームはオフィスを捨てる: 37シグナルズが考える「働き方革命」

強いチームはオフィスを捨てる: 37シグナルズが考える「働き方革命」

感想記事: 「強いチームはオフィスを捨てる」感想 - saj_kzの日記

7. Git逆引き入門

開発効率をUPする Git逆引き入門

開発効率をUPする Git逆引き入門

  • 作者: 松下雅和,船ヶ山慶,平木聡,土橋林太郎,三上丈晴
  • 出版社/メーカー: シーアンドアール研究所
  • 発売日: 2014/04/09
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログ (6件) を見る
仕事で使っているSVNは理解していましたが、Gitの使い方がいまいちわからなかったので購入。
Git使用時に「こうゆう時どうしよう」という場面がある度に助けられています。

8. これからの「標準」を身につける HTML+CSSデザインレシピ

自宅開発で作っていた、Webコンテンツも見た目かっこよくしたいなと思い、HTML + CSSの常套手段を学ぼうと購入。「こういう時はここをいじるといいよ」的な書き方で内容はわかりやすく、よかった。
ただ、Kindleの白黒画面では色調整等している部分はまったくわからないので、デザインレイアウトの勉強は書籍でやるべきだなと思いました。。。

9. SQLアンチパターン

SQLアンチパターン

SQLアンチパターン

管理したいデータに応じて、データベースを設計する。その際に陥りやすいアンチパターンをまとめた書籍。
ウェブ系エンジニアへの転職を目指していた際に、「そもそもデータベース設計とはなんぞや?」といった状態だったので、さすがにまずいなと思い読んだ一冊。
データ管理の設計は恐ろしくも楽しいと思った一冊でした。

10. パーフェクトPHP

パーフェクトPHP (PERFECT SERIES 3)

パーフェクトPHP (PERFECT SERIES 3)

仕事でPHPを使うことになったので、自主勉強対象の言語をPHPにシフトした際に購入。
PHPの文法の基本からセキュリティ対策まできっちりまとめてくれています。仕事ではフレームワークを使用する予定ですが、こちらも読んでおいてよかった。

11. 入門Chef Solo - Infrastructure as Code

入門Chef Solo - Infrastructure as Code

入門Chef Solo - Infrastructure as Code

自宅でChefをいじる前に読んでみようと購入。
世の中のエンジニアの開発効率はみるみる改善されていくんだなと感じました。Chefすごい!vagrant, chef-solo等、実際に環境をいじりながら読むのがおすすめです。

12. 大手を蹴った若者が集まる知る人ぞ知る会社

大手を蹴った若者が集まる知る人ぞ知る会社

大手を蹴った若者が集まる知る人ぞ知る会社

国内の注目のベンチャー企業とそのメンバーにフォーカスした内容です。
ベンチャー企業で自身のキャリアをスタートさせる若い人達の考え、価値観を感じれる一冊。

13. How Google Works

How Google Works (ハウ・グーグル・ワークス)  ―私たちの働き方とマネジメント

How Google Works (ハウ・グーグル・ワークス) ―私たちの働き方とマネジメント

自分、Google大好きなんで読みました。
Googleの重役達が如何に優秀な人材の採用を重視しているか、そしてそれによってGoogle自身の質を保っているんだなぁと感じた一冊でした。

14. 就活「後ろ倒し」の衝撃―「リクナビ」登場以来、最大の変化が始まった

もう学生ではないですが、リクルート系の業界について勉強したかったので、購入。
今後始まる就活後ろ倒しによって大手企業、中小企業、就活生にそれぞれ生じる影響(というかデメリット)と著者の考える対策をまとめた本。
自分はとうの昔に就活を終えてはいますが、この本読んで、業界全体の影響を考えると、学生さんのために何かしてあげたいなぁと思ってしまいます。「みんながんばれ」

まとめ

前半は、Ruby, Rails を中心に掘り下げて勉強。
後半は未経験言語、ツール、業界等、幅を広げる本選びをしてました。
読書ペースは遅いですが、目標だった月1冊は達成できて安心。

octokit.rbを使って、githubの情報を見てみた

octokit.rb とは

Ruby toolkit for the GitHub API.

rubyからGithub APIを使う仕組みを提供してくれます。


自分のGithub戦闘力(戦闘力54..)を測った際に興味が湧いたので、いじってみました。

■使用例) ユーザのリポジトリの情報を取得、出力する

github_scouter/github_scouter.rb at master · eiel/github_scouter · GitHub
を参考にして書いてみました。

事前準備

対象環境にoctokitをインストールします。

gem install octokit

コード

require 'octokit'

# github user name
@name = "kazuhirosaji"

options = {
  auto_paginate: true,
  access_token: nil, # 必要に応じて入力する
}

# Clientオブジェクトを生成
@client = Octokit::Client.new(options)

# Repositories情報を取得
repos = @client.repositories(@name)

# リポジトリ情報の出力
repos.each do |repo|
  puts "name: #{repo.name}, language: #{repo.language}"
  puts "url: #{repo.url}"
# puts "repository info = #{repo.attrs}"
  puts ""
end

これで、kazuhirosajiアカウントが持っているリポジトリの名前、使用言語と、URLの一覧が表示されます。

■repositories()で取得したデータについて

上記コードの

repos = @client.repositories(@name)

にて、reposにはリポジトリの情報配列が入ります。


Octokitのドキュメントによるとrepositories()は

- (Array<Sawyer::Resource>) repositories(user = nil, options = {}) 
(also: #list_repositories, #list_repos, #repos)
List user repositories.

となっており、配列の中身は "Sawyer::Resource" クラスのオブジェクトが入っています。この"Sawyer::Resource"はユーザ情報等を取得した際にも使用されているようです。

取得したreposにはどんなデータが入っているか?

ここからが今回悩んだポイント。url(リポジトリのURL)やlanguage(リポジトリの言語情報)の他には何が入っているのでしょうか?Octokitのドキュメントを見ただけではわからず、、ちょっと調べてみたのでまとめます。

結論

先に結論から。GitHub API v3に対象データの情報もまとめられていました。
Repositoriesの情報はこちらからurl, language情報の他にfork数等も取得できることがわかります。ちなみに、Usersの情報だったらこちらから。

Github APIページを見つけるまでの話

以下はGithub APIのページに情報があることに気づくまでの四苦八苦の話。

先に書いた通り、配列の中身は"Sawyer::Resource"オブジェクトとなっているようなのでSawyer::Rsourceのソースを覗いてみました。
。。。よくわかりませんでしたが、Class Resourceの中に、

attr_reader :attrs

と記載があったので、こちらが属性一覧に違いない!使ってみたところ、url、languageを含めたデータの中身の一覧を見れました。先の例のコードのrepos.each の箇所を変更することで、repoの属性一覧を閲覧できます。

repos.each do |repo|
  puts "name: #{repo.name}, language: #{repo.language}"
  puts "url: #{repo.url}"
  puts "repository info = #{repo.attrs}"  # 有効にする!
  puts ""
end

実行結果(一部抜粋)

.
.
url: https://api.github.com/repos/kazuhirosaji/testapp
repository info = {:id=>12173584, :name=>"testapp", :full_name=>"kazuhirosaji/testapp", :owner=>{:login=>"kazuhirosaji"....

さらにOctokit内で、Sawyerを生成している箇所を調べたところ、どうやらjson形式で受けとったデータをSawyerオブジェクトに格納しているようであることがわかり、ようやく、Github APIに欲しい情報があることに気づけました。


情報の見方はわかったので、次はoctokit使って何かおもしろいもの作りたいなと思います。

個人の活動が記録できる"My Study log"を作った

何で作ったの?

かれこれ1年以上、帰宅後週5回は勉強するぞ! と勉強を続けており、その達成度を確認するために自宅のカレンダーに記録を付けています。
f:id:saj_kz:20140806223729j:plain
自宅のカレンダー、「P」はプログラミング、「E」は英語です。

どうせな勉強も兼ねてRailsでカレンダー記録帳を作ろうと考え、作成してみました。

イメージ図

f:id:saj_kz:20140806232642p:plain

こんな感じで個人活動内容を記録できます。

使い方

1. http://shrouded-plains-8033.herokuapp.com/ へ移動
2. 「Sign Up now!」ボタンをクリックして、アカウントを作成
3. ユーザページに遷移したら「Add new subject」の下のテキストボックスに活動内容(例: 英語)を入力して、「create」ボタンをクリックする
f:id:saj_kz:20140806232843p:plain
4. 右側にカレンダーが表示されること、左側の「select subject」の欄に作成した活動内容が表示されていることを確認
f:id:saj_kz:20140806232926p:plain
5. 活動を行った日をクリックして、カレンダーに活動内容を付ける
6. 左側の「Save Event」ボタンをクリックして活動内容を記録する
f:id:saj_kz:20140806232957p:plain

7. 次回以降は、ログインした際にSaveした内容が反映されたカレンダーが表示されます。

開発内容について

開発期間

おおよそ3か月かかりました。Railsチュートリアルをやった後に作成を始めたのが5月の中旬で、6月中ぐらいには形になるかなと思ってたのですが、開発中に発生した問題対処等行っていたら、8月までかかってしまいました。。

もう少し詳しく

Railsチュートリアルで紹介されていたアプリを勉強したから作ったので、ログイン機能などはチュートリアルの内容を使わせてもらっています。
カレンダー表示部分は、以前紹介したfullcalendar-railsを使用しています。

今後の課題

現状の出来ではまだカレンダー手書きのが便利なレベルなので、今後は統計機能等の欲しい機能の追加、見た目、パフォーマンスの改善を行っていこうと思います。

よかったらいじってみてください。

「強いチームはオフィスを捨てる」感想

強いチームはオフィスを捨てる: 37シグナルズが考える「働き方革命」

強いチームはオフィスを捨てる: 37シグナルズが考える「働き方革命」

読みました。

原題の"Remote: Office Not Required"の通り、著者の企業で進めているリモートワークのメリットと、如何にしてリモートワークを取り込んでいくかのコツがまとめられていました。 僕は「毎日の通勤が省かれるなんてなんて素晴らしいんだ!」と思いつつも、プロジェクトを進めるうえでは、顔を合わせて簡単に話せる状況が良いプロジェクトには必要考えているので、リモートワークには消極的です。

しかし、彼らはリモートワークでの効率を最大限にするために、方法の検討、ツールの導入、無駄の排除等を積極的に進めており、 「顔を突き合わせている開発現場」でも同じようなTipsを導入していけば、 無駄な会議、情報伝達のロス、ボトルネックなどは改善していけるのではと思いました。

本書で紹介されていた「無駄な待ち時間をなくすためにボトルネックをなくす」、「承認等のしくみをやめて、自分の判断で行動できるようにする」、 「みんないつでも必要な情報にアクセスできるようにする」等は普段の仕事でも意識していきたいです。

以下、本文より引用

重要な変化はいつだって苦労の多いものだ。みんなが一丸となって本気でとりくめば、いまの文化を変えることはできる。大切なのは、その信頼を信じることだ。

プロジェクトマネジメントをする上での「改善し続けること」の大変さ、重要さ、楽しさを考えさせられました。読みやすいのでちょいと時間のある方はお勧めです。

「メタプログラミングRuby」感想

読みました。

メタプログラミングRuby

メタプログラミングRuby

  • クラスの再オープンによる既存クラスの変更や機能の追加、
  • コードの実行時に呼び出すメソッドを決められるsend、
  • 定義されていないメソッドを処理するためのmethod_missing

等々、どれもすごい威力でした。まさに魔術!

その分使い方を誤ると、メンテナンス不可能コードにも発展しがち。 その点は本書でも紹介されていた、Matz氏の言葉にもある通り「Rubyは"使う人を信じる"」がポリシーだからこそできる柔軟性なんだろうなと思いました。Rubyっておもしろいなーとつくづく感じながら読めました。

でも後半の特異クラスあたりは挫折してしまったので、またどこかで読み直したいなと。。

本書の流れについて、2人の登場人物が章ごとにその日の課題を受け取り、解き方の検討(考え方の解説)、問題を共に考え、最後に回答(解説)を読ませる流れになっているから、「~な問題」、「~なコード」にぶち当たった時はこんな解き方がある!と頭に入りやすく、苦手な大型本だったのですがとっても読みやすかったです。

固い?安全な?コードが書きたい人も、オープンソースやライブラリで他人が書いた魔術を読めるようになるためには本書はお勧め。