Scientific Linux6のapacheで、DocumentRootのDirectoryIndexだけ表示できなくて困った。サブディレクトリ以下のDirectoryIndexはきちんと表示されてるので何のことやらさっぱりだ。このSL6は仮想マシン上で動いてるのでパーミッションの問題にハマったのかと思いきや、デフォルトで用意されてるconfにそういう記述があるだけだった。

問題のconfはこれで、DocumentRootだけDirectoryIndexを許可しないようにしていた。

# /etc/httpd/conf.d/welcome.conf
<LocationMatch "^/+$">
  Options -Indexes
  ErrorDocument 403 /error/noindex.html
</LocationMatch>

なぜこれがここにあるのかよくわからないので削除して見なかったことにした。
検証してないけどきっとCentOS6でも同じなのではないかと思われる。
apacheに限らず、設定ファイル全般はRHEL系よりDebian系、特にUbuntuがわかりやすくて整理されてる気がする。

そもそもなぜDirectoryIndexが必要かというと、主にPHP開発のとき、作業ディレクトリをDocumentRootにして、各プロジェクトはサブディレクトリでブラウザから見れるようにしてあるので、DocumentRootのDirectoryIndexはそのままプロジェクト一覧として使えるのです。

 

emacsでいうanything.elのvim版がUnite.vimです。これは、開いているバッファの一覧やヤンク履歴が見れたり、ファイルエクスプローラ的な使い方もできる大変便利なプラグインです。インストール方法などはBundle使ってたりするといろいろ違うので自分の環境に合うインストール方法を選択してください。

ここでは、最小限の設定でUnite.vimの恩恵を受けるための方法を紹介します。

バッファ一覧を表示する

バッファ=今開いているファイルの一覧を表示するショートカットを設定します。

" バッファ一覧
noremap <C-U><C-B> :Unite buffer<CR>

この設定をすると、[Ctrl+U][Ctrl+B]を押すことでさらっとバッファ一覧が表示されます。もちろん、表示されたバッファ一覧は上下キーで選択し切り替えることができます。

現在のバッファがあるディレクトリのファイル一覧を表示する

現在のバッファ=今開いているファイルがあるディレクトリ中のファイル一覧を表示するショートカットを設定します。

" ファイル一覧
noremap <C-U><C-F> :UniteWithBufferDir -buffer-name=files file<CR>

この設定をすると、[Ctrl+U][Ctrl+F]を押すことでファイル一覧が表示されます。ディレクトリ移動をせずにファイル一覧を開くことができるのでおすすめの設定です。

最近使ったファイルの一覧を表示する

最近使ったファイルの一覧を表示するショートカットを設定します。

" 最近使ったファイルの一覧
noremap <C-U><C-R> :Unite file_mru<CR>

この設定をすると、[Ctrl+U][Ctrl+R]を押すことで最近使ったファイル一覧が表示されます。

レジスタ一覧を表示する

レジスタ一覧=ヤンク履歴を表示するショートカットを設定します。

" レジスタ一覧
noremap <C-U><C-Y> :Unite -buffer-name=register register<CR>

この設定をすると、[Ctrl+U][Ctrl+Y]を押すことでレジスタの中身を一覧表示することができます。

まとめ

現在のところ、上記の設定とそれをいくつか組み合わせて以下のような設定で落ち着いています。

"------------------------------------
" unite.vim
"------------------------------------
" 入力モードで開始する
let g:unite_enable_start_insert=0
" バッファ一覧
noremap <C-U><C-B> :Unite buffer<CR>
" ファイル一覧
noremap <C-U><C-F> :UniteWithBufferDir -buffer-name=files file<CR>
" 最近使ったファイルの一覧
noremap <C-U><C-R> :Unite file_mru<CR>
" レジスタ一覧
noremap <C-U><C-Y> :Unite -buffer-name=register register<CR>
" ファイルとバッファ
noremap <C-U><C-U> :Unite buffer file_mru<CR>
" 全部
noremap <C-U><C-A> :Unite UniteWithBufferDir -buffer-name=files buffer file_mru bookmark file<CR>
" ESCキーを2回押すと終了する
au FileType unite nnoremap <silent> <buffer> <ESC><ESC> :q<CR>
au FileType unite inoremap <silent> <buffer> <ESC><ESC> <ESC>:q<CR>

これでだいぶ快適なvim生活が送れるはず!

 

エキスパートPython読書会で話題になったので。
ついでにtabをスペースに変換も。


" 保存時に行末の空白を除去する
autocmd BufWritePre * :%s/\s\+$//ge
" 保存時にtabをスペースに変換する
autocmd BufWritePre * :%s/\t/ /ge

これだけです。

 

何度か紹介してるCakePHP向けcakephp-pjax-pluginについて、やっとCakePHP2.0対応させたのでお知らせ。ついでにCakePHP2.0の命名規約に従い、名前をCamelCaseに変えて、CakePjaxというプロジェクトにしました。DEMOはこちら。

sanojimaru/CakePjax – GitHub

今は仕事で使いたいもの、かつ実装が容易なものから優先的に作っているんですが、今後はもう少し大きなもの、CakeだけじゃなくPHP全般の役に立つものが作りたいなと思います。

 

gihyo.jpさんにPHP Matsuri 2011のレポートが2本とも掲載され、やっと俺の祭りが終わった。結局締め切りギリギリになってしまいとても反省しています。

少し振り返ってみると、祭りが終わった直後からものすごい勢いでモチベーションが上がっていて、心の中で悶々としてたものが一気に整理がついたように思う。それは、yandoさんの行動力や日々進化していくhyoshiokさんの生き様を目の当たりにして、ハッカーとは何たるかが少しだけわかった気がするからでもある。ここ2年ぐらい、スーツとギークの狭間で葛藤していた気持ちがやっと晴れた感じがしてとても心地よい一方、仕事や社会生活において自分も「ハッカー」としてアウトプットしていかなきゃならないなと少しプレッシャーを感じてもいる今日この頃。

さて、PHP Matsuriでは一応cakephp-pjax-pluginという、CakePHPに簡単にpushstate+ajaxを実装できるプラグインを書いて発表した。pjaxはgithubなんかで使われてる素敵技術(このへんの説明がわかりやすい)なので興味があったら使ってやってください、デモはこちら。ただ、pjax_railsというrailsプラグインのパクリで、数行で出来てしまう簡単なものだったので欲求不満気味。しかも、CakePHP2.0を実際に動かした事が無かったのでCakePHP1.3対応というお粗末さ。

そこでこんなの作ってみた。一応のデザインを入れたり、Flickr APIとスライドショーライブラリのドキュメントと睨めっこしつつも7,8時間ぐらいで出来たのでハッカソンで作っても間に合うぐらいの規模感。もともとはひたすら猫の画像見続けるサイトが欲しいねって友達と話していてドメインだけ取っていたものなんだけど、PHP Matsuriを期にFlickrを使い始めたこともあり、Flickrのタグ検索に当たった写真をスライドショーにできるサービスにしてみた。それだけだと面白くも何ともないので、youtubeにアップされている動画のURLを一緒に登録することでBGMを流せるようにした。これでPHP Matsuri参加者には響くサービスになったんですよきっと!

というわけで、Flickrにアップした写真に”phpmatsuri2011″のタグを付けると上のサンプルにも追加されるはず。

まだ4点ほど問題があって、

  1. 最新のchromeとfirefoxでしか確認してない
  2. スライドショーのjavascriptがパフォーマンス的に厳しくて今は写真の枚数を30枚までに制限してる
  3. 肝心のスライドショーを作ったり管理したりの機能を作り込んでないのでまだ公開できるレベルじゃない
  4. IE爆発しろ

と取り急ぎ自己満足レベルにしかなってないんだけど、CakePHP2.0で何か作るっていう目的は達成できたし、とりあえず真新しいサービスでもないのでゆっくりやることにします。あと、これ作るついでにTwitterBootstrapをCake用にゴニョゴニョしたCakeBootstrapというプラグインも作りました。最初Themeとして作ってたのでREADMEが完全に間違ったままだったりしますが意外と便利なので良かったらどうぞ。特にCSS周りは荒削りなのでpull request貰えると泣いて喜びます。

 

CakePHP2.0でApp::importの代替として追加されたApp::usesで起きた勘違い。

// 使い方
App::uses('クラス名', 'パッケージ名');

// 間違い
App::uses('AuthComponent', 'Controller¥Component');

// 正しくは
App::uses('AuthComponent', 'Controller/Component');

Grahamさんのプレゼンでも名前空間ぽいみたいなこと言ってたしPSR-0の話もしてたから、てっきりパッケージはバックスラッシュ区切りかと思った。

この件についてTipshareにも投稿してみたので良かったらどうぞ。
CakePHP2.0のApp::usesの使い方 | tipshare.info

 

DSC05701

PHP Matsuri 2011 #phpmatsuri に参加してきました。
参加は去年に引き続き2度目で、両方ともスタッフとして参加しましたが、これほどエキサイティングなPHPのイベントは他に無いんじゃないかと思うぐらい楽しめました。
今も余韻に浸っており、頭の中はEpic sax guy 10 hoursで一杯です。

プログラムの最後を飾る大LT大会では、次点賞として「Titanium Mobileで開発するiPhone/Androidアプリ」を頂きました。監修の増井さん(@masuidrive)にサインまで頂いてしまい大満足です。

さて、イベントレポートは後日書くとして、参加者の共通認識的に何かがこみ上げてくるポイントをいくつか紹介します。

参加者を次々と中毒に陥れたEpic sax guy

サブリミナル的に脳髄に埋め込まれたnyancat

Japanese Ninjaが大阪の夜を闇に包んだり

DSC05698

外国人がJapanese Ninjaにおびえてたり

DSC05701

でも仲間になったり

DSC05794

よしおかさん(@hyoshiok)がLTに失敗したり

DSC_0464

まとめ

コタツ(笑)の写真が撮れなかったのが残念ですが大変熱い二日間でした。
来年は福岡(!)開催かと思いますがまたお会いしましょう!

PS,
2日間のイベントレポートはレポート:PHP Matsuri 2011 レポート|gihyo.jp … 技術評論社にアップされる予定です。お楽しみに!

 

すごく違和感のある挙動に遭遇したのでメモ。
例えば、以下のようなhas_manyな関係を持つ2つのクラスがある。

class Parent < ActiveRecord::Base
  has_many :children
  accepts_nested_attributes_for :children
end

class Child < ActiveRecord::Base
  belongs_to :parent
end

Formからネストしたパラメータが渡ってきた場合など、以下のようにする場合が多いと思う。
親データ1件と、その子データ3件を同時に作成する場合。
この場合、p.children.empty?はtrueを返すが、実際にp.childrenを出力すると、期待通りChildクラスのインスタンスが3つ入っている。
しかも、p.childrenを一度出力した後に再度p.children.empty?を呼ぶとfalseが帰ってくるという不思議仕様。

p = Parent.new({
  name: 'parent',
  children: [
    { name: 'child1' },
    { name: 'child2' },
    { name: 'child3' },
  ]
})
p.children.empty?
=> true

p.children
=>[#<Child name:'child1'>,#<Child name:'child2'>,#<Child name:'child3'>]

p.children.empty?
=> false

ちなみに、上記とデータ構造は全く同じだが、一度Parentのインスタンスを作成してから、Childを1つずつ追加していくと、p.children.empty?はきちんとfalseを返し、p.childrenの出力も期待通りChildクラスのインスタンスが3つ入っている。

p = Parent.new({ name: 'parent' })
p.children << Child.new({ name: 'child1' })
p.children << Child.new({ name: 'child2' })
p.children << Child.new({ name: 'child3' })
p.children.empty?
 => false

p.children
=>[#<Child name:'child1'>,#<Child name:'child2'>,#<Child name:'child3'>]

これってlazy loading的な何かがあるので仕方ないですよとか言われたら納得しちゃうかもしれないけど単純にバグな気がするのでちょっと頑張る

 

Rails3時代の認証システムはRestful Authenticationからdeviseに変わったみたいですが、このdeviseという認証システムには以下のような非常に豊富な機能が付いており、殆どのアプリケーションに対してオーバースペックな気がします。

  • Sign in
  • Sign out
  • Registration
  • Confirmation
  • Forget password
  • Lock/Unlock account

とはいえ、わざわざDeviseのControllerをオーバーライドして不要なアクションを削除したりするのはとてもメンドクサイので、Routingを編集することで当該機能にアクセスできないようにしちゃます。

deviseのroutesを定義しているdevise_forメソッドは、resourcesに使うような標準オプションも受け入れてくれるので以下のようにすればOKです。

# RAILS_ROOT/config/routes.rb
# デフォルトはこんな感じ
devise_for :users

# 全部無効化
devise_for :users, only: :none

# ログイン、ログアウトだけ有効化
devise_for :users, only: [:sign_in, :sign_out, :session]

# 小さいアプリではこんな感じで使ってます
devise_for :users, only: [:session] do
  get '/sign_in', :to => 'devise/sessions#new', :as => :new_user_session
  get '/sign_out', :to => 'devise/sessions#destroy', :as => :destroy_user_session
end

RailsもDeviseも非常に大きなシロモノになっていて、ちょっとしたアプリを作るには面倒なことが増えてきたので最近はPadrinoを勉強してます。すごくいいのでぜひどうぞ。

 

Ruby on Rails 3.1.0が正式リリースされたので、早速3.1.0RCで作っていたアプリをアップデートしたところproduction環境でassets pipelineが上手く動かなくなったので。

現象としては、stylesheet_link_tagやjavascript_include_tagで出力されるファイルのURLが、RC6だと

<link href="/assets/application-9bfec9e77b13d0aae452fa8f1b785be2.css" media="screen" rel="stylesheet" type="text/css" />
<script src="/assets/application-773d7f39b6aab9114a3b3b034fe6ac17.js" type="text/javascript"></script>

だったのが、stableだと

<link href="/assets/application.css" media="screen" rel="stylesheet" type="text/css" />
<script src="/assets/application.js" type="text/javascript"></script>

になってしまうため、assets:precompileで予めassetsファイルを作る設定であったproduction環境において、cssファイルもjsファイルも見つからずにかわいそうなことになるわけです。
それどころかrake assets:precompileもコケる事態になってました。

これは、3.1.0RC8あたりでassets pipelineに関する変更がいくつか取り込まれた関係で設定項目が増え、デフォルトの挙動が変更になったからですね。詳細はgithubのrailsリポジトリのissuesを見てください。

肝心の修正方法ですが、config/environments/production.rbの14~17行目あたりを以下のように変えるだけでOKでした。

# Don't fallback to assets pipeline if a precompiled asset is missed
config.assets.compile = true

# Generate digests for assets URLs
config.assets.digest = true

さて、3.1.0がリリースされて2日目ですが、早くもpjax_railsが取り込まれると噂の3.2.0が待ちどおしいです。

© 2011 sanojimaru.com Suffusion theme by Sayontan Sinha