最近お気に入りのPHPライブラリ開発手法
PEAR2/Pyrus ってどうなったんだっけ?
という話はとりあえず一旦置いておいて、最近わりかしカジュアルにPHPライブラリを開発して配布する方法がなんとなく自分の中で定着してきたので超ざっくりまとめておく。
ソースコードはGitHub、開発にはgitflow、配布はOpenpear
Openpear で世界征服の話はどうなったんだ、というのは置いておいて、ざっくり、上記の通り、
というのが一番楽だと思っている。
ソースコードはGitHub
Openpear はとっても便利なサービスで、SVNでのホスティングもサポートしているのだけど、今更SVNを使いたくもないし、Openpear で今後Gitをサポートする予定もない。
GitHubではGitによるfork/pull request のエコシステムが出来上がりつつあると思っていて、開発者もそこにいるし、GitHubでなんか作っておけば人にコード見てもらったり修正してもらったり、それを取り込んだりが非常にやりやすい環境が揃っている。
もうGitHubを使わない手はない。
配布はOpenpear
で、GitHubで開発したものを直接PEARパッケージ化して、PEARコマンドでインストールできるようにしたいわけだ。
だけど、GitHub登場以来何度かForumに登場しているPEARの公式サポートの件はまとまらないまま話が立ち消えたりして、なんともなっていない。
と、ここで登場するのがOpenpearだ。
Openpear は、上記の通りSVNリポジトリのホスティングはしているが、パッケージの設定で、外部のリポジトリ(SVN、Git、Mercurial)が指定できる。
つまり、ここに、ホスティング先のGitHubのリポジトリを指定すれば、それだけでPEARパッケージ化することができるし、以下のコマンドでインストール可能な形式で配布できる。
$ sudo pear install openpera/Git_Daily
ところで、OpenpaerでGitHubからリリースするにはちょっとした設定のコツ?がいるというか、注意すべき点があるので、一応それはここで説明しておく。
- public にアクセス可能なリポジトリURIを指定すること
- master からリリースされるため、master をリリース可能なバージョンとして作るようにリポジトリ運用をすること
- (Openpear 側に、リリース先のブランチを指定する機能がない...ということです)
- target dir に、リポジトリのルートからの相対パスを指定する
- 例えば、 上記の git-daily であれば、
- ルート: https://github.com/sotarok/git-daily/tree/master
- PEARリポジトリに入れたいディレクトリ: https://github.com/sotarok/git-daily/tree/master/src
- 従って、リリース設定は、 target dir を src とする
- 例えば、 上記の git-daily であれば、
- コマンドラインスクリプトをインストールするときはPEAR_PackageProjector2 の conf 形式で拡張設定をしなければいけない(この話はまた今度書くか)
以下参考:
開発ツールとしてgitflow を使う
gitflow は、上記Openpearの制約にぴったりなツールだ。
develop ブランチを開発用ブランチとして普段のやりとりにつかい、releaseブランチを経て、最終的にタグと共に master ブランチに merge される。master ブランチは、常に、安定してきた開発用のブランチからのマージコミットしか存在せず、つまり、master ブランチが、「配布して良いブランチ」となる。
参考:
- A successful Git branching model » nvie.com
- 見えないチカラ: A successful Git branching model を翻訳しました
- A successful Git branching model を補助する git-flow を使ってみた - Twisted Mind
あ、ちなみに、さっきから例に用いている git-daily というのは、gitflow に似たツールなんだけど、ライブラリ開発用というより、もっと頻繁に修正リリースとかが発生するようなウェブアプリ開発用のgit補助ツールであったりする。最近はいつも自分もコレを使ってウェブアプリの開発をしているわけだけど、これはこれで相当便利なのでまた今度話題にします。
一応参考:
具体的な手順
- 手元で、Gitでライブラリ開発を開始する
- git flow init して、develop で開発
- 適当なタイミングでGitHubにリポジトリを作ってpush
- developブランチでなんやかんやしてよしリリースやー、となったら git flow release start, -> … -> git flow release finish
- master にマージされるので、これをGitHubにpush
- Openpear にそのライブラリ用のパッケージを新規作成
- リポジトリ設定で、GitHubのURIを指定する
- リリース処理
- pear コマンドでインストール可能な形で配布完了
という感じです。あとはGitHubで開発継続、gitflowでmasterへマージ、Openpearで配布(リリース)を繰り返せばなんとなくうまくいく感じがしませんか。
Capistrano + rsync で省エネデプロイ
こんにちは。
タイトルの通りなんですが、Capistrano みんなつかってるよねー。
ってことで独自のデプロイシステムをもってなくてさすがにFTPでUPはしてませんって人は結構使ってるもんだと思ってるんですけど、Capistrano ってなんかデフォルト各サーバで vcs の update 的なことをするか、ローカルにソースツリーを用意してやる場合に使えるのは scp で、なんかエコじゃないよねと言う話で、いちいちソースツリー全部配布されてたら転送量も時間もかかってしょうがないので、まーrsyncがいいんだよね、ということで、そんな時は capistrano_rsync_with_remote_cache (なげえよ) を使えばいいよね!ってお話です。 *1
このご時世なんでも省エネがいいんです。
インストール
gem で適当にインストール。
$ gem install capistrano_rsync_with_remote_cache
今だと2.4.0ってやつが入りました。
使い方
deploy_via が重要なわけだけど、その他ももろもろ揃えておく。多分このツールのすごいところは、scm 的なところは既存のリポジトリの枠でそれを local cache として保持して、deploy_via で、deploy の strategy だけちゃんと切り替えられるところのような気がしている。
set :scm, :git set :deploy_via, :rsync_with_remote_cache set :git_enable_submodules, true set :repository, "." set :copy_exclude, %w( .git Capfile config/hogeohge.ini cache app/logs ) set :rsync_options, '-az --delete --delete-excluded --exclude=.git --exclude=' + copy_exclude.join(' --exclude=')
えーなんかこうですね、 :copy_exclude ってでデフォルトの Capistrano のオプションを指定しつつそれを :rsync_options に指定しちゃうところがオサレなかんじでしょうか?(ここの中身は適当に。)
でなんかこんなことにしておくと、よしなに rsync でremoteにあるディレクトリに差分でアップロードして、そこからrelease_pathにコピーして使ってくれる感じになります。
ちなみに deploy strategy にはデフォルトで :remote_cache っていう似てるっぽいやつがあるんですがこれはこれで全然違うやつで、 deploy -> remote の転送は普通に scm なやつで、remoteにリポジトリのコピーを1つもっておいて、そこからrelease_pathにコピーして使うんですよっていうやつです。
仕組み
超適当ですがこんなかんじの仕組みで動いてます。まぁあまり気合の入った図ではないんですが適当に感じ取ってください。
簡単に言うと、repository "." なので、そのディレクトリをすでに git リポジトリにしておくわけですが(いやこれはdeployサーバとか作ったらわりと普通ですよね?)、deploy時にはそこから一度 .rsync_cache ディレクトリに clone (次回以降はpull)されます。で、デプロイ先には shared ディレクトリに cached-copy というディレクトリができて、local の .rsync_cache から remote の cached-copy に rsync で差分アップロードされます。で、 cached-copy から release_path に日付でディレクトリ cp されて(いや実際はここも rsync です)、最後に symlink の貼替えが行われる、という流れです。
Git関連ツール開発中に手元で remote 関連の動作テスト
いやまあこんなことは、どうでもいいといえばいいのですが、意外と知らない人もいるかも意知れないと思ってメモ。
git-daily の開発とかでよく remote とのやりとりの動作確認とかが必要になるんだけど、そのテスト方法について。いちいち gitosis やら github やらの実際のサーバを用意しなくてもテストはできるんですよ、という話。
適当なリポジトリを用意
$ cd /path/to/tmp $ mkdir hoge $ cd hoge $ git init $ touch hoge.txt $ git add hoge.txt $ git commit -m "first commit"
remote 追加
hoge に戻って、相対パスで remote の追加&first push。
$ cd ../hoge $ git remote add origin ../fuga $ git push -u origin master Counting objects: 3, done. Writing objects: 100% (3/3), 231 bytes, done. Total 3 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (3/3), done. To ../fuga * [new branch] master -> master Branch master set up to track remote branch master from origin.
あとは適当にリモート操作
pushしたり
$ touch fuga.txt $ git add fuga.txt $ git commit -m "add fuga" [master 263204f] add fuga 0 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 fuga.txt $ git push Counting objects: 4, done. Delta compression using up to 2 threads. Compressing objects: 100% (2/2), done. Unpacking objects: 100% (3/3), done. Writing objects: 100% (3/3), 280 bytes, done. Total 3 (delta 0), reused 0 (delta 0) To ../fuga d3a54c5..263204f master -> master
clone もできます
$ cd .. $ ls fuga hoge $ git clone fuga piyo Cloning into piyo... done. $ ls fuga hoge piyo $ cd piyo $ git log commit 263204f294a67959a5978fbe5a862e2c05526e91 Author: Sotaro KARASAWA <sotarok@crocos.co.jp> Date: Wed Jul 13 22:22:47 2011 +0900 add fuga commit d3a54c5d76851286052d216db0925637460e6f03 Author: Sotaro KARASAWA <sotarok@crocos.co.jp> Date: Wed Jul 13 22:16:07 2011 +0900 first commit
結論
Git は簡単。
パーフェクトPHPが増刷されました (第3刷!)
こんにちは、もう夏のような毎日ですが皆様いかがお過ごしでしょうか。
さて、タイトルのとおりですが、昨年11月に発売された、パーフェクトPHPが増刷され、この7月に第3刷となりました!みなさまのおかげです。本当にありがとうございます。
第3刷での更新
以下のポイントが修正されています
- CSRF可能な脆弱性のあるコードの修正
- その他誤字脱字等の修正
ということで
PHP 5.4 alpha1 も出たりしてますます楽しくなってきている PHP ですが、パーフェクトPHPをこれからもよろしくお願いします。
- 作者: 小川雄大,柄沢聡太郎,橋口誠
- 出版社/メーカー: 技術評論社
- 発売日: 2010/11/12
- メディア: 大型本
- 購入: 32人 クリック: 1,065回
- この商品を含むブログ (59件) を見る
今すぐ Follow すべき PHP 界のスーパーエンジニア
流行に乗りました。反省してます...
順不同。PHP界隈の人で、PHP のこと結構つぶやく人中心に。そしてわりかし適当です。
- @moriyoshit , PHP
- @shin1x1 , CakePHP
- @yando , CakePHP Lithium
- @tokushima , rhaco
- @hidenorigoto , Symfony2
- @fivestr , Symfony2
- @heavenshell , ZF
- @rsky , Extension
- @yoya , Extension , SWF
- @nazo , rhaco , LOCAL
- @chobi_e, Extension
- @yohgaki , PHP, Security
- @koyhoge , Various
- @iteman , Piece , Testing
- @riaf , Various ...
- @brtriver , Symfony2
- @takagi , Documentation
- @mugeso , Agavi
- @hnw , 浮動小数点数
- @ethnyan , ?
もっと詳しい 2008 年版はこっちを参考に。なんか印象としては、3年前と比べると、PHP 最近書いてません or 興味なくなりました or もう書く時間ありませんみたいな人がちらほらいる気がする。
追記
今すぐ読むべき PHP 界のパーフェクト書籍はこちら:
- 作者: 小川雄大,柄沢聡太郎,橋口誠
- 出版社/メーカー: 技術評論社
- 発売日: 2010/11/12
- メディア: 大型本
- 購入: 32人 クリック: 1,065回
- この商品を含むブログ (59件) を見る
さらに追記
すいませんでした、大事な人書き忘れてたので追記しました。 @hnw
Time Capsule から任意のファイルを任意の場所に復元する
どうも、love++ の件で密かに話題になっているそうたろうです。Mac を買うたびに Mac ネタかって話ですが、タイトルのとおり、Time Capsule から任意の場所にバックアップされているファイルを復元する方法です。
今回、自分のマシンで問題になったのは、復元「先」が指定できない問題でした。Mac は Time Machine を使って Time Capsule に常にバックアップしていて、ファイルは存在しているのですが、今回新しい iMac を買って、構成が
と変更されました。ここで問題となったのは、 Primary ディスクかつ起動ディスクとなっているシステムのボリュームが 256 GB SSD の方になっていたことでした。
Time Capsule から以前のファイルを復元しようとしたところ、復元先を指定することができず、256 GB SSD のほうに復元されようとしてしまい、当然容量が足りない *1。
で、仕方なく OS インストールの際には、iTunes のディレクトリと iPhoto のディレクトリを除いて復元したのだが、後から復元できるかなーと思ったけど、「移行アシスタント」を使っても、同じ状況で復元先は指定できなかった....
もうだめや...
と思っていたが、要するに以下の要領で復元した。
- Time Capsule の Data ディレクトリをマウント
- 旧 iMac のバックアップファイル (.sparsebundle … スパース・ディスクイメージ・バンドル) をマウント
- そのマウントされたディレクトリの Latest ディレクトリから rsync
Data ディレクトリをマウント
これはもはや言及するまでもなく、Finder から Time Capsule を選択すれば勝手にマウントされる。
スパース・ディスクイメージ・バンドルをマウント
マウントされた Time Capsule の Data ディレクトリをひらいて、 .sparsebundle となっているファイルをダブルクリック。
rsync
基本的に Terminal.app とか iTerm とかで作業。
マウントされた .sparsebundle は、
$ ls /Volumes Backup of Monopoli <- バックアップファイル (これは Monopoli というマシン名) Data <- Time Capsule のディスク Macintosh HD <- ローカルの SSD Macintosh HD 2 <- ローカルの HDD
な場所にあるので、中身をとりあえず見てみる。
$ ls -la /Volumes/Backup\ of\ Monopoli total 16 drwxr-xr-x 6 sotarok staff 408 6 13 2010 . drwxrwxrwt@ 6 root admin 204 6 15 23:27 .. -rw-r--r--@ 1 sotarok staff 6148 9 4 2010 .DS_Store drwx------ 3 root staff 102 8 14 2009 .Spotlight-V100 d-wx-wx-wt 3 sotarok staff 102 6 15 23:27 .Trashes -rw-r--r-- 1 root staff 0 8 14 2009 .com.apple.timemachine.supported drwx------ 2 sotarok staff 102 6 15 23:29 .fseventsd drwxr-xr-x+ 3 root staff 102 9 13 2009 Backups.backupdb
Backups.backupdb ディレクトリが実体になってて、日付ごとのディレクトリ + Latest ディレクトリがある。
$ ls -la /Volumes/Backup\ of\ Monopoli/Backups.backupdb/Monopoli ... drwxr-xr-x@ 3 root staff 204 6 8 23:04 2011-06-08-230426 drwxr-xr-x@ 3 root staff 204 6 11 01:37 2011-06-11-013743 drwxr-xr-x@ 3 root staff 204 6 11 02:37 2011-06-11-023745 ... drwxr-xr-x@ 3 root staff 204 6 13 19:42 2011-06-13-194209 lrwxrwxrwx 1 root staff 17 6 13 19:42 Latest -> 2011-06-13-194209
で、要するに Latest がその中身なので、もう要するに以下のように吸いだした。復元先はもちろん Macintosh HD 2 ですよ。「/Volumes/Macintosh HD 2/Music/iTunes/iTunes Music/」 が新しい iTunes Music ライブラリのディレクトリ。
$ rsync -avP /Volumes/Backup\ of\ Monopoli/Backups.backupdb/Monopoli/Latest/Macintosh\ HD/Users/sotarok/Music/iTunes/iTunes\ Music/ /Volumes/Macintosh\ HD\ 2/Music/iTunes/iTunes\ Music/
みたいなかんじ。結構時間かかるけどめでたしめでたし(多分。今転送中)
というか
みんなどうやって復元しているのだろうか。もっと簡単な方法があるのか? rsync とか使えないような人ってどうしてるんだろうな。
余談
Time Capsule のディスクを単純にマウントするなら、
$ mount_afp afp://user:password@ip addr of time capsule/Data /path/to/mount
的な感じでできます。
これはこれで、前起動ディスクが死んだときに、OS DVDディスクから起動してターミナル起動してバックアップとってなかったディレクトリを Time Capsule に転送するときに役に立った。
*1:あ、もちろんもとのディスクで 500 GB 中 256 GB 以下しか使っていない場合は別
退職のお知らせ&〜
今週の 5/18 日をもって、グリー株式会社を退職しました。
昨年院を卒業し、新卒で入社して1年と1ヶ月、短い間でしたが、これまでの人生の中で最も濃密な1年間だったと思います。
グリーでは、色々端折りますが、PHP 5化、APC 化、Git 化、コーディング規約の策定、バックエンドフレームワークの作成と導入など、自分の望む通りアプリ寄りのインフラの仕事をすることができました。それから、これらの課題を解決してくるにあたっては、当然僕1人の力でどうにかなる問題ではないものもたくさんあり、そういうなかで同じインフラのチームの皆さんや、サービス開発をされてるみなさんが力になってくれたおかげで色々すすめることができたと思います。
最後の数ヶ月では、新プロダクトのサービス開発もしました。新しいバックエンドフレームワークの導入やGit化というミッションをかかえつつ、プロダクト制作の一部始終を体験することができたのは、これまた自分にとってかけがえのない経験でした。
それから、エンジニアブログの立ち上げができたのも嬉しかったです。入社してすぐに色々言って立ち上げたのですが、最初は、かきませんかとお願いしていたブログも、今では書きたいという人が各所から出てきてくれたりなんかして、そういうものにできたというのはやっぱり嬉しいですね。
これからも面白い記事が上がってくるのを楽しみにしています!
グリーで働いてよかったことは、なにより、世界が注目する急成長をしている会社真っ只中で働けたことです。他では得難い体験をしたと思っています。勢いがあって実際に成長している会社の中身はこんなことになってんだなーというのをこの時期に自分の身をもって感じることができる人というのは限られていると思います。
退職の理由らしきものはこれといってないのですが、という某氏の言葉を借りますが、そうですね、しいて言えば、もう少し小さいところで小さい会社からやってみたいと思ったこと、そしてその思いに呼応するように、人と出会い、チャンスに出会い、これはやるしかない、と思えることに出会えたことかと思います。
最後に、いつも、言いたくても言えないし、言ってもどうにも本気にされないのですがw、一緒に働いた藤本さんや梶原さんをはじめとする皆様には、感謝の気持ちでいっぱいです。考えると色々な思いが溢れてきますが、言葉では表しきれないです。本当にありがとうございました。
これから
6月1日付けで株式会社クロコスに入社します。
岡元さんとおざーんに声をかけていただいた数名の仲間と、新しい会社を作り、新しいサービスを作るためにジョインを決めました。
「これまでの人生の中で最も濃密な1年間だったと思います」と書きましたが、これからはそれよりもさらに濃密な時間にすべく頑張っていきます。
これからも色々な面でウェブ開発に携わっていきますし、これからもガツガツやってまいります。
皆様には、これからもお世話になります。よろしくお願いいたします。