新しいブログに移転しました。独自ドメインだけど見ての通りtumblrでございます。理由はこのへんとか参照頂けると幸いです。
このブログについては、記事を少しずつ移しながら、最終的には廃止してポートフォリオ的なサイトに切り替えたいと目論んでおります。個別記事のリダイレクトはしないつもりなのでそれは本当に申し訳ございませんです。
複数バージョンのrubyを共存させるツールとして、過去にはRVMを使っていたが少し前にrbenvに変えた。
Rails3世代になり、RVMのgemsetはbundlerで代替可能になったので、RVMの豊富な機能が少し邪魔に感じたので。同時に、サーバーサイドでも管理が簡単なのでrbenvを使うようにした。あまり推奨はされてないようだけど。
rbenvの通常インストール方法はsstephenson/rbenv – GitHubにあるのでそちらを参照するとよい。
また、rbenvで使うrubyインストーラーであるsstephenson/ruby-build – GitHubも一緒に使うとすごく便利。
以下、サーバーで行った作業のログをメモ。
# rbenvインストール $ git clone git://github.com/sstephenson/rbenv.git /usr/share/rbenv # profile.dにrbenvの設定を追加 $ vi /etc/profile.d/rbenv.sh # ここから export PATH="/usr/share/rbenv/bin:$PATH" export RBENV_VERSION=ree-1.8.7-2011.12 export RBENV_DIR=/usr/share/rbenv export RBENV_ROOT=/usr/share/rbenv eval "$(rbenv init -)" # ここまで # /etc/profile.d/rbenv.shに実行権限を与える $ chmod 755 /etc/profile.d/rbenv.sh # 一旦上記設定を読み込む $ source /etc/profile.d/rbenv.sh # ruby-buildインストール $ git clone git://github.com/sstephenson/ruby-build.git $ cd ruby-build $ ./install.sh # 今回はREE1.8.7をインストール $ rbenv install ree-1.8.7-2011.12 # REE1.8.7をデフォルトで使用する $ rbenv global ree-1.8.7-2011.12
と、ここまででrbenvのセットアップは完了。動作確認のために、一度シェルを再起動した上でrubyのバージョンを確認してみる。
$ ruby -v ruby 1.8.7 (2011-12-28 MBARI 8/0x8770 on patchlevel 357) [i686-linux], MBARI 0x8770, Ruby Enterprise Edition 2011.12
正しくREEが使われることが確認できた。あとは、gemでrailsとunicorn_railsをインストールすればよい。
rbenv上のREEでunicornを起動するには、以下のようなスクリプトを作ればよい。
app_root=/var/www/rails_application rbenv_bin=/usr/share/rbenv/versions/ree-1.8.7-2011.12/bin cd $app_root && $rbenv_bin/bundle exec $rbenv_bin/unicorn_rails -c $app_root/config/unicorn.conf.rb -e production $app_root/config.ru
普段はUpstartで自動起動などをしているが、その場合 /etc/init/以下に次のような設定ファイルを作ればいい。これは、アプリケーションごとに1つのファイルになるので、例えばアプリケーション名がRailsAppならばRailsApp.confなどとする。
#!/bin/sh description "Rails Application" start on runlevel [2345] script app_root=/var/www/rails_application rbenv_bin=/usr/share/rbenv/versions/ree-1.8.7-2011.12/bin cd $app_root && $rbenv_bin/bundle exec $rbenv_bin/unicorn_rails -c $app_root/config/unicorn.conf.rb -e production $app_root/config.ru >> /tmp/upstart.log 2>&1 end script respawn
このアプリケーションの起動や終了はLinuxの場合ディストリビューションによって変わるが、大体の場合以下のようなコマンドで実行できるので自分の環境に最適なものを選択する。
# 起動 $ sudo service railsapp start # または $ sudo initctl start railsapp # 終了 $ sudo service railsapp stop # または $ sudo initctl stop railsapp
UpstartはUbuntu10.04、CentOS6、Amazon Linuxなどで使える。従来の/etc/init.d/以下にあるようなスクリプトよりだいぶシンプルに書けるので積極的に使っている。他にもいろいろとメリットがあるらしいが、正直よくわからない。
ここ1年ぐらい、Githubとか漁って熱心にスパムしてるヘッドハンティング業者がいる。未だ見ぬpull-requestかとwktkしながらメールを開くとこんなのが届くのだからタチが悪い。たとえヘッドハンターからのメールだとしても、的を得た内容でこういう話が来るのは技術者として嬉しいことなのだが、僕のリポジトリにはロクなものが上がってないので可能性は皆無だ。
汎用テンプレートで全く同じ文面のメールが、github経由で届いたと思ったら個人用のメールアドレスに2通も3通も届くのだから、まともな管理もされていないのだろう。エンジニアを採用する立場にもある僕には、この業者は絶対に依頼したくないスパム業者に見える。
将来的にはWANTEDLYのようなサービスによって、スパムなんかより人と人とのつながりの方が遥かに効率のよい人材採用方法になるといい、なんて切に願っております。
はじめまして、●●●●の●●でございます。
突然のメールで失礼致します。Githubを拝見させて頂いてメールさせて頂いております。
私どもは外資系ヘッドハンティングファームでございます。外資系IT企業、コンサルティングファーム、国内IT企業のエンジニアポジションをご紹介しております。
現在私どもでは、クライアントの強いご希望でアプリケーションエンジニア、ネットワーク系のエンジニア、ゲームエンジニアの方を急務で探しておりまします。
そこで、hirohide Sano様のご経歴を拝見させていた頂きまして非常に興味を持っております。是非、1度お電話で構いませんのでお話させていただけないでしょうか??
もし、お話させていただける場合は
○電話番号
○ご連絡ができるお時間
をご記載の上ご返信いただけますと幸いでございます。
hirohide Sano様とお話できることを楽しみにしております。
何卒、よろしくお願いします。
Xxxxxxxx Xxxxxxx
(●● ●●●)
Researcher
●●●●
ちょっと頼まれごとして掲題のような環境いじったんだけどいろいろ惜しすぎてアレだったので書きなぐる。
ムシャクシャして書いたので読み返すとよく意味がわからないけど、反省はしていない。
これだけ書いてアレなんだけど、Windows Serverに詳しい人にとってはHyper-V+SCVMMはすごくいいプロダクトなのかもしれない。EnterpriseなVM Wareとか触った事無いので他との比較はできないけど、稼働中のサーバーをオンラインでP2Vしてシームレスに統合できるってすごいと思った。
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はこちら。
今は仕事で使いたいもの、かつ実装が容易なものから優先的に作っているんですが、今後はもう少し大きなもの、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点ほど問題があって、
と取り急ぎ自己満足レベルにしかなってないんだけど、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