ラベル 備忘録 の投稿を表示しています。 すべての投稿を表示
ラベル 備忘録 の投稿を表示しています。 すべての投稿を表示

2012年11月5日月曜日

rhodecode1.4.4を試してみた #tokyomercurial

世の中GithubEnterpriseでpullrequest方式での開発が
一部では標準化しているんじゃないかと思われる今日この頃いかがお過ごしでしょうか?

とは言うものの、いくら有用性を語ってもそうそう導入されるような世界じゃないですよね?高いし。
せめてGithub/Bitbucketの有料アカウントを…と思ってもそれもねぇ…って世界ですよね(´;ω;`)

そんな僕達がPullRequest方式で開発したい!!そうだRhodeCodeがあるじゃないか!!
という私やあなたみたいな方にお届けするエントリーですw

あ、ちなみに件名に#tokyomercurial を追記した理由は特にありません。
あえていうなら、このツイートがあったので…ぐらいかな?



あ、ちなみに長いのでご注意ください


試した環境はこんな感じ

  • CentOS6.3 64bit minimal状態から
  • VirtualBox上で

すげー大雑把にやりますので、必要な部分は適宜脳内補完でお願いします

実験用なのでselinux/iptablesは無視

最初は…
とりあえず入れましょう。
使わないのもあるけど。


python周り入れましょう。
最初から入っているのは2.6系のはずですし、別にそのまま使ってもいいですが…
pythonbrewという流行りに乗っかっておきましょう。
→ それだったら pythonz で入れろって話しなんでしたっけ?
下記はちょっと時間かかるので、コーヒでも入れましょう。


おまたせ、rhodecodeです。時間かかります。
なぜならいっぱい一緒に入りますから。当然Mercurialもこの時入りますので。
さっき作ったコーヒでも飲みましょう。


使用するwebサーバでも入れましょう。
rhodecodeのドキュメントにはapacheとnginxのサンプル設定が乗ってますので、テキトーに。
ここではnginx入れます





さて、rhodecodeの設定をやりましょう。
まあrhodecodeのドキュメントままといえばそれまでですが…



これで設定ファイルができたので…試しに動かしてみます


ブラウザで確認するとこうなっているかと。
/etc/hosts にvm2って名前で仮想マシンのip書いているのでurlはそんな感じ


さっき作ったadminユーザでログインしてみます

とりあえず3名ほどユーザを追加してみましょう
まあLDAPが使えれば、こんなこといらないんだろうけど…
Admin > Users > Add New User




時にログイン画面の下に小さくDon't have an account? という項目ありますが、
こちらから誰でもアカウント作成が可能です。
が、こちらで作ると初期の状態だとログイン出来ません。
 管理者にActiveにしてもらう必要性があります。


 各自が作成した時に最初からActiveにするためには
Adminユーザで
Admin > permissions で Registration を変更すればいけます。


次にとりあえずAdminユーザでrepository groupを作っておきます。
実際に仕事で使う…とかになると、プロジェクト単位で切ることになるのかな?
もちろん作らなくてもOKですが、とりあえず。

Admin > repositories groups > ADD NEW GROUP


作ったらパーミッションを設定します。
ここでは太郎くんにadmin権限を渡してみます。


さて、太郎くんでログインしてテキトーに作ります

ご丁寧にQuick Start ってありますね。



この通りやってみましょう。


結果

当然反映してますね。

続いて二郎くんでフォークしてプルリクエストを出してみます。
まず二郎くんでログイン
そしてhellorepoを選択し OptionsからForkを選びます

すると、repositoryを作成した時のような画面になります。

Fork結果

fork-hellorepo-jiroの詳細を見てみるとClone urlってありますね。

手元にcloneして作業してみます。


作業に満足したらプルリクエストしましょう
Options > Open new pull request を選択します



結果こんな感じ


ソースにコメントも可


実際にレビューした結果を選択
change status にチェックを入れて、レビュー結果OKかどうか選択しましょう。

全員がレビューしたと仮定


あとは誰かがComment and closeを押せばいいわけですが…
現状で自動でこのリクエストは取り込まれない…よね?
→間違っていたらご指摘ください。
なので手動で太郎くんがpullしてマージしてpushすることになります。


うーん、メンドイ。
何よりせっかくApproved とフラグをつけた内容なのに、結局fork元repository上では当然それがなくなっているわけで…
更にPullRequestを取り込んだからといって、PullRequestが閉じられるわけでもない。
→ Forkしたrepositoryを閉じれば(削除すれば)消えます。
もっというと手動で取り込む=結局approved/reject関係なく取り込む人次第なので、
このへんは運用ルールでどうにかするしか無さそうです。

ちなみに上記はbranch切ってやりましたが、別にbookmarkでもいけます

その辺も運用ルール次第なのかな?

ただBitbucketみたいに、「こう言うふうにコマンド叩いて取り込めるよ!!」とかの表記がないので、
リビジョン指定よりもブランチ/ブックマークで取り込むことを前提とした運用のほうが無難だと思います。


多分gitでもそんなに操作変わらんだろう
ということで次。

まずnginxを使ってアクセスできるようにしましょう

ってもドキュメントのサンプルから大きく逸脱しなければ大丈夫なはずです


あくまで動作確認なので自分は本当にほぼ上記ドキュメントのまま。



このあと service nginx start で ipaddressであたりにいけるはずです


clone url もport番号がなくなったのが確認できるはず。

なおこの段階で、rhodecodeの設定ファイルであるproduction.iniのhostを「127.0.0.1」に直しても問題ありません。
nginxで飛ばすわけだしね。
むしろしたほうが、ipaddress:5000でアクセスできなくなるし、いいんじゃまいか。

ただし
full_stack = false
にすると、repositoryをcloneする際にこの症状にハマります。
まあ httpのままでなければいいのかもしれないけど…

また
static_files = false
にすると、自分の場合web表示が崩れました。



あとはサービス化
このあたりを参考にしました
きっとこんなのを作ればいいんだろう…




シェルスクリプトとか詳しくないし、このへんはそんなに突っ込まないでほしいw

あとは
chkconfig rhodecode on
で登録しておけばOKですね。

とりあえずこれで「最低限」使うことは可能になると思います。
ローカル内でしかアクセスされないなら、まあセキュリティとかそこまで考えなくてもいいでしょうし、
レビューツールとしてはありだと思います。

ただ、その他のツールと連携していくこととか考えたらここでAPI見てなんか書いたり、
もしくはincoming hook書いて直接repoの中においてきたり…とかになるんでしょうか。

rhodecodeを使うとなると、issue trackerを外部に依存することになるでしょうし、
それ+CIサーバと連携…とか考えると、ちょっとめんどいですね。
個人でやる分には多少失敗しようがそれなりに動けばいいんですけど…ってか
個人だったらGithub/Bitbucketで事足りるし、ウムム…
この手の構築が好きで得意な人がいるような会社だったら、検討の余地は十分あると思います。

そういえばLDAP連携で @usaturnさんが悩んでいた記憶が…



つまり @usaturnさんがrhodecodeを使った素晴らしい開発環境構築を年内にまとめてくれるはず…!?


Admin > Settings に hgsubversion extension を設定できる箇所が有りました。
これにチェックを入れたら、最初にrepository作るときのclone先にsvnのrepositoryを指定できるかも?




補足 会社でrhodecode使い始めました。
Gitに関して追加設定が必要だったり、HGで日本語コメントがちゃんとrhodecode上で表示されるようにしたり…
みたいな設定をお隣の席の人がやってくれました
詳細は以下
http://htn.to/TAKNVB




2012年9月10日月曜日

Scalaのカリー化とか部分適応とかの俺メモ

別になんにも難しい or 怖いお話はありません



上記は問題ない。
全く問題ない。

問題は下



一旦部分適応やらで作成したメソッドを再度カリー化したり
一旦カリー化されたメソッドを更に部分適応したりするときは _ が不要
というかつけると怒られる

とりあえずはそういうものって覚えればいい?

環境は
Scala2.9.2
MacOSX10.7


2012/09/12 追記
defで宣言した関数名の後ろに「_」をつけると、「関数オブジェクト」になる
なので、一回関数オブジェクトに変わっている → 次は変える必要はない(というか既に変換済み)
ということでいいんでしょうか?


2012/09/13 追記
http://togetter.com/li/154007
このあたりかな?

2012年9月6日木曜日

Intellij Idea で eclipse の saveアクション的なことをする

参考URLというか答え
http://stackoverflow.com/questions/946993/intellij-reformat-on-file-save

マクロにやりたい処理を追加して、そのマクロにショートカットキーを割り当てるだけ

saveアクション的なことをするためには、
Command+sに保存処理を含んだマクロを割り当てればまさにそれっぽい


でもこれVimPlugin使っている俺はどうやって割り当てればいいんだろうねぇ…
(とりあえずCommand+sに割り当てたけど…)

マクロの存在に気がつけたのでまあいいやw

2012年2月27日月曜日

Mac Book Air 初期化後やったことメモ

単なるメモです。誰(@ngsw_taro くん)と無く向けたメモですけど
なんかほしいって言ってたしw

というよりも3月1日にも恐らく下記作業ヤル気がするので俺メモ…

win→mac乗り換え数ヶ月の今なら下記のように最初作業するかなぁ… というかしたんですけどね。

  • まずは無線LANに接続
  • 環境設定でキーボードとトラックパッドの設定(CapsLockはしねばいい)
  • ここ http://3a3k.blogspot.com/2011/10/dsstore.html
  • お好みのブラウザインストール(Chromeとか)
  • お好みのエディタインストール(MacVimとか)
  • ソフトウェアアップデートを何回か…
  • AppStoreからXcodeインストール
  • XcodeからCLIをインストール
  • XcodeがCLI分離したため注意しないとHomeBrewとかで困る http://mogutan.wordpress.com/2012/02/18/trouble-installing-xcode4-3/
  • JavaRuntimeインストール → コマンドでjava -h とか打てばインストールする?って聞かれるはず
  • PATHが気に入らないので書き換え → /usr/local/bin を先頭に (多分.bash_profileとかを生成して頑張る系)
  • HomeBrewとかインストール
    • 好きなだけ必要なものをお入れください
    • 例
      • git(CLIにいるけど最新入れたいから入れる)
      • hg(無いと生きていけない)
      • zsh(既にいるけど最新じゃないし…)
      • …てかほしいもの探せばだいたいあるんじゃねーのな感じでだらだらと…
  • お好みのシェルに切り替え(zshとか)
  • sshキー作ってgithubやらbitbucketやら自分のサーバやらに登録
  • 好きな統合開発環境(eclipseやらIntelljやら?)入れて一段落?

こんな感じ?
あとは必要時に適当でなんとか(多分忘れ事は多いけど…)なる気がする、俺の使い方だとw

あ、Twitterクライアントも入れないと生きていけないですね。

2012年2月19日日曜日

#StartupGroovy に行ってきた

件名の通り昨日行って行きました



らしいです。つまり俺のStartupGroovyは終わっていない(違

と、言いましても既に多くの方がまとめられていますし、詳細はそちらとかを

http://d.hatena.ne.jp/absj31/20120218/1329636558
http://d.hatena.ne.jp/grimrose/20120219/1329619718
http://tomykaira.hatenablog.com/entry/2012/02/19/155237
http://d.hatena.ne.jp/orangeclover/20120219


私の超素直な一言感想



普段Java(つーかAndroidっつーか)をメインで触っているとScalaにしてもGroovyにしても
確かに超短くなりますし、便利だなーって思います。
→すみません、その程度の認識です。こまけーこたーいいんだよ

そんな俺の結果。いいのか悪いのかは正直よくわかんないけど。
https://bitbucket.org/daneko/startupgroovy


でも楽しかったです。また有るなら参加したいですね〜

生 @kyon_mm さん見れたし。


以下重要


後日模範解答がでるのと

Android + JUnit + Robolectric + Gradle

な環境構築に関してまとめてくれるそうです。


Android + JUnit + Robolectric + Gradle

な環境構築に関してまとめてくれるそうです。

大切なことなので2回書きます。

やっぱり言ってみるものですね。


ということでSpockやらGradleやら触ってみたい項目がTODOに積まれるわけですが、他にも積んでいるものがあるわけで…
いつになったら消化できるんだこれ…




2012年1月15日日曜日

qguardを使ってみた #TokyoMercurial の感想込

TokyoMercurialへ行って来ました。

内容は意外なことに、個々でモクモク。
たまに来る質問に対して盛り上がる系でした。

@modal_soulさんによるTweetのまとめはこちら
#TokyoMercurial #1 まとめ その1
#TokyoMercurial #1 まとめ その2

次回は2/25

感想
変態や神の多い勉強会で楽しかったw




そんな質問->盛り上がるのなかで「qguard」という単語が出てきました。
知らなかったので使ってみた。

てかそもそもqguardってなんやねん。

$ hg -v help qguard
hg qguard [-l] [-n] [PATCH] [-- [+GUARD]... [-GUARD]...]

パッチのガード設定ないし表示

    「ガード」はパッチ適用の可否を制御します。 ガードが設定されていない
    パッチは常に適用されます。 「正」のガード(例: "+foo")が設定された
    パッチは、 "hg qselect" によって当該ガードが設定されている場合に限り
    適用されます。 「負」のガード(例: "-foo")が設定されているパッチは、 "hg
    qselect" によって当該ガードが設定されている場合は適用されません。

    引数指定が無い場合、 現在のガード選択状況を表示します。
    引数が指定された場合、 指定パッチに対するガード選択を設定します。

    備考:
       「負」のガード設定には、 ガード指定の前に '--' 指定が必要です。

    現行パッチ以外にガードを設定するには:

      hg qguard 対象パッチ名 -- +2.6.17 -stable

    成功時のコマンド終了値は 0 です。

らしい。

とりあえず試してみる。

@  チェンジセット:   3:f8c4733a0105
|  タグ:             tip
|  ユーザ:           dnk
|  日付:             Sat Jan 14 22:57:24 2012 +0900
|  要約:             4th
|
o  チェンジセット:   2:38ad6ad44a14
|  ユーザ:           dnk
|  日付:             Sat Jan 14 22:56:26 2012 +0900
|  要約:             third
|
o  チェンジセット:   1:22ff7bf5abb1
|  ユーザ:           dnk
|  日付:             Sat Jan 14 22:55:21 2012 +0900
|  要約:             second
|
o  チェンジセット:   0:bbd7202921cd
   ユーザ:           dnk
   日付:             Sat Jan 14 22:54:47 2012 +0900
   要約:             first
とりあえずこんな感じのものを用意。
上記の状態の準備すらメンドイ人向けに https://bitbucket.org/daneko/qguardtest1 に配置しました

一旦全部パッチ化

$ hg qimport -r 1 -r 2 -r 3
$ hg qguard -l
1.diff: unguarded
2.diff: unguarded
3.diff: unguarded

1,2にマイナスのガードを追加
これ個別にしか指定できないのかなぁ…

$ hg qguard 1.diff -- -hoge
$ hg qguard 2.diff -- -hoge
$ hg qguard -l
1.diff: -hoge
2.diff: -hoge
3.diff: unguarded
$ hg qpop -a

$ hg qselect hoge //ガードを選択
ガード設定の変更により、 適用除外パッチ数が 3 から 1 になりました

$ hg qpush -a
3.diff を適用中
適用中の最上位パッチは 3.diff です
$ hg glog
@  チェンジセット:   1:45ac9d559036
|  タグ:             3.diff
|  タグ:             qbase
|  タグ:             qtip
|  タグ:             tip
|  ユーザ:           dnk
|  日付:             Sat Jan 14 22:57:24 2012 +0900
|  要約:             4th
|
o  チェンジセット:   0:bbd7202921cd
   タグ:             qparent
   ユーザ:           dnk
   日付:             Sat Jan 14 22:54:47 2012 +0900
   要約:             first

素晴らしい!

とりあえず元に戻しましょう。

$ hg qselect -n // guard を外す
$ hg qpop // 3.diffだけ設定されているので一度外す
$ hg qpush -a

次はプラス側のガードを試してみる

$ hg qguard 1.diff +hoge
$ hg qguard 2.diff +hoge
$ hg qguard 3.diff +huga
$ hg qguard -l
1.diff: +hoge
2.diff: +hoge
3.diff: +huga
$ hg qselect hoge
$ hg qpush -a
1.diff を適用中
2.diff を適用中
3.diff を抑止 - ガード '+huga' が適用されました
適用中の最上位パッチは 2.diff です

上手に使えばseriesファイルを直接弄っていたあんなシチュエーションやこんなシチュエーションが減りそうです(ぇ


qguardが出てきたのは下記のような話題が出たからでした。

A->B
とコミットしてしまったが
A->C->B
とすべきだった(したほうが後々見直す上でよかった)ときにどうするか?
ここでCはA->Bの中間生成物的なものとする
recordはちょっと使えないというシチュエーション


あくまで下記は俺が覚えている(というかうろ覚え)範囲なので、間違っているかもしれないし
当然他の方法だっていっぱいあると思います。

とりあえずその記憶を下記にメモ

$ hg glog
@  チェンジセット:   1:9cd39df9c615
|  タグ:             tip
|  ユーザ:           dnk
|  日付:             Sun Jan 15 00:01:38 2012 +0900
|  要約:             second
|
o  チェンジセット:   0:1e8e287648f5
   ユーザ:           dnk
   日付:             Sat Jan 14 23:59:47 2012 +0900
   要約:             first

まず状態Cを手動で作る
(現状の状態から必要なだけ削ってコミット)

$ hg glog
@  チェンジセット:   2:8ee095d38d45
|  タグ:             tip
|  ユーザ:           dnk
|  日付:             Sun Jan 15 00:12:35 2012 +0900
|  要約:             third
|
o  チェンジセット:   1:9cd39df9c615
|  ユーザ:           dnk
|  日付:             Sun Jan 15 00:01:38 2012 +0900
|  要約:             second
|
o  チェンジセット:   0:1e8e287648f5
   ユーザ:           dnk
   日付:             Sat Jan 14 23:59:47 2012 +0900
   要約:             first

というわけで
A->C->Bを作る前に
A->B->Cを作ったということになります。

上記の状態の準備すらメンドイ人向けに https://bitbucket.org/daneko/qguardtest2 に配置しました


$ hg qimport -r 1 -r 2 // CとBをパッチ化
$ hg diff -r 0 -r 2 > X.diff // A->Cの差分作成
$ hg diff -r 2 -r 1 > Y.diff // C->Bの差分作成
$ hg qimport X.diff Y.diff  // 追加
$ hg qpop -a
2.diff の適用解除
1.diff の適用解除
全てのパッチの適用が解除されました

$ hg qguard 1.diff -- -hoge
$ hg qguard 2.diff -- -hoge
$ hg qselect hoge
ガード設定の変更により、 適用除外パッチ数が 4 から 2 になりました
$ hg qpush -a
X.diff を適用中
Y.diff を適用中
適用中の最上位パッチは Y.diff です


あとはパッチをリビジョン化すればOK
1.diff 2.diff の削除も同時にやればおしまいというところでしょうか?



さて次回に向けて勉強しないと白い目で見られそうです
mercurialのソース少し読んで見ることにします(白目



2012年1月1日日曜日

GAE for Pythonをちょっとだけ触ってみた

あけましておめでとうございます。
正月からやること無い大晦日からちょこちょこ触った結果を記録に…

対象はこんな感じ
  • Pythonの文法くらいはわかっている(要は俺)
  • Google主催の勉強会行く度にAppEngine触ってなくて肩身狭い気がする(要は俺)
  • 正月なのにコーディング以外やること無い(要はお…)
  • AptanaとかでGAEのPython2.7やりたい


環境はこんな感じ


まあAptanaでもEclipseにAptanaPluginでもいいんですけどね。
エディタでもいいんですけど、俺みたいなゆとりプログラマはIDEじゃないと…



Aptanaを適当に立ち上げ、File→New→OtherでAppEngineを選ぶ

プロジェクト名に適当な(ここではhelloworld)名前を入力し、次へを押すとこうなる

とりあえずBrowseを押してみるとdev_appserver.pyとかがあるディレクトリ指定しろとある。


でまあこれMacだと多分以下ディレクトリを指定するんですが…このエクスプローラーから選択する方法がわかりません(ぇ
下記ディレクトリを直接指定します。

/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/

すると以下のような画面になるので、チェックを入れてOKを押下


そうするとこうなるのでnextを押下



そしてとりあえずEmpty Projectを選択

あとはスタートガイドに沿って…



残念ながら今回の目的の2.7は日本語での情報はありません…
とはいうものの暫くはサクサク進むかと。



きっとUsing Templatesまではさくっと進みます。
いざUsing Templatesまで進むと

2.5の時はDjangoだったのに、時代は変わったんですね。ホムホム
とかなんとか考えて入力するとこうなる。


補完を信じると
import jinja2
にならない…

まあ単純にjinja2インストールしてない、していてもプロジェクトにパス通ってないからなんですけどね。
(2.5の時はサンプルがDjangoなんですが、インストールした記憶無いけど動いてた記憶が…)

ちなみにwebapp2_extrasのjinja2をImportしても、中ではjinja2呼んでいるので、Using Templateの項目の
jinja_environment = jinja2.Environment(
    loader=jinja2.FileSystemLoader(os.path.dirname(__file__)))
のEnvironmentが見つかんねーよって言われます。


という訳でjinja2をInstallしていない人はinstall
詳細はこちらとか
私はeasy_installにてインストールしました

そしてApatan側でもそのパスを通します。多分この辺に居る筈です。
/Library/Python/2.7/site-packages/Jinja2-2.6-py2.7.egg

プロジェクトのプロパティからjinja2のパスを追加してあげるだけ。



これでめでたく補完が効きます。



あとは動かしてみるとこんな感じ。
localでもちゃんと動く



とか思っていたら、こんなログ出てた
ERROR    2012-01-01 04:43:59,290 dev_appserver_import_hook.py:1319] Third party package markupsafe was enabled in app.yaml but not found on import. You may have to download and install it.

こちらのjinja2翻訳サイトによると、Markupsafeでより高速になるっぽい。
まあ無くても実害はなさそうですが…一応入れてみる。
でもError扱いはなんか違うんじゃ…

まずMarkupsafeをDLしてきて、解凍。
あとは python setup.py install で終わり。

再度動作させてみると、ログも綺麗に。


faviconが無いのはまあいいでしょ…

ということで今年は去年よりもいっぱいpython触りたいと思います〜

2011年12月3日土曜日

tortoiseHgでrebaseしてみた

12月ということで各所で「Advent Calendar」やってますね。
リンク先は各所のカレンダーをまとめてくれているブログの記事となっています。
お陰で毎朝仕事にならない勉強になります。
ちなみにこの記事はそれとは全然関係なく、通常運転ですがw


ケーススタディで学ぶMercurialのRebase拡張(Mercurial Advent Calendar 2011 1日目)

を見て、そういや「tortoiseHg」でもできるんかな?と思い実行。
結果から言うとできたり出来なかったり。
いや出来たんですがやや反則な気が…



まず拡張設定を有効にしないとなんにも始まらないので「mercurial.ini」を編集。
多分C:\User\PC名\ の下にいると思われます。
普通に「.hgrc」に書くのと一緒。先日行われたらしいSCMBCのMercurialの資料に
おすすめ「hgrc」ってのがあったので、参考にするのがいいかと。

こんな感じ?

[extensions]
graphlog =
color =
mq =
hgext.purge=
rebase =
…


graphlogとかcolorとかtortoiseHg使うだけなら不要な気がしますが、tortoiseHgを入れるとなんとHgコマンドがDos窓からも実行できる!(tortoiseHg以外でHg入れていないから多分あっている)
ついでに言うとcygwinからも使えるようになっている気がします。
なので設定しておいて損はないかと。


before

after 履歴修正とか増えている




個人的にはstripがWorkbenchのグラフからできるって素晴らしいと思う。



さていざrebase
(さきほどのケーススタディで学ぶMercurialのRebase拡張で公開されているex1-1-basicで
実行した場合)


…ってrebase元と先が一緒じゃん…

当然上記で実行しても意味無いです。当たり前ですが。

多少試行錯誤した結果、destとしたいリビジョンにupdateし、
かけたいリビジョンのグラフ上で
・右クリック→履歴修正→リベース
で目的は大体果たせそうです…

ってなんか違う…

コマンドライン的に書くと

hg rebase --source グラフ上で右クリックしたリビジョン --dest 今のリビジョン

という動作以外できないようです。(きっと)

ダイアログ上でリビジョン指定できればいいのに…と思いますが、
そもそも拡張機能&タダで使わせていただいているので文句はいいません。


結局細かいことをやろうと思ったらコマンドラインからやるしかなさそうなんですが、
それでも tortoiseHg は凄かった。



Workbenchから 表示→コマンドログ を選択すると、画面下にコマンドログが表示されます。
が、これ表示だけじゃなくて、入力できる。




このコマンドログ上でコマンド叩くのが楽。
グラフも見やすいし、コマンド実行直後にグラフに結果が反映するしで
色々と捗る気がします。

なんか反則な気がするけど、無理にツール上のメニューを探さなくてもいいし、
これが一番な気がする。



なおmacでおすすめするHgのGUIツールはEclipseのプラグイン(EclipseMercurial)です。
そしてsourcetreeとかMacHgよりターミナルからコマンド叩くほうが楽な気がするのは俺だけ…?


2011年11月18日金曜日

PHPUnit vfsStream メモ

PHPを触りだして3日。
サポートのはずなのになんか気が付いたら俺主体なんだけど…

という訳でメモ

なんだかんだでテスト系は情報無いよなぁ…

最初使い方に詰まったvfsStreamですが、これは使いやすいのでは?
重要なのはvfsStreamで生成したファイルをvfsStreamのディレクトリにちゃんと登録することw

// setup 何も指定しなければvfs://root というディレクトリがある前提になるはず
vfsStream::setup();
// rootの取得
$root = vfsStreamWrapper::getRoot();
// rootディレクトリパスの取得 実際にis_dirがtrueを返す
$rootDirPath = vfsStream::url($this->root->getName().DIRECTORY_SEPARATOR);

//モックファイルの生成と登録
$file = vfsStream::newFile("hoge.txt");
$root->addChild($file); // これに気が付かなくてチョットハマった

//モックファイルパス
$path = $rootDirPath.$file->getName();

//あとはこのpathをテストしたい奴に渡して何かしら処理させた後
//$fileの中身を見たりすればOKな感じ?

とりあえず動作確認



Gistを初めて使うけどまさかPHPで使用するとは思わなかったよw
でもGistいいかも?

2011年11月17日木曜日

MACに PDT + PHPUnit + XAMPP + MakeGood 環境を構築してみた

前回に引き続き、今度はphp関連の開発環境を構築してみました。

まるで環境構築マニアみたいですが、phpはちょっと必要に駆られてなので…

本末転倒ですが別にエディタでもいいとは思います。
めんどいし。
もっというとXAMPPじゃなくて個別にインストールしたほうが
後々いいかもしれません。なんとなく。
だってどうせサーバ上ではXAMPPじゃないでしょ。

とはいうもののPHP書いたこと無いし、vimさんだけで生きて行けるほど強くないし、
IDE無いとミスっていることにすら気が付かないし(ぇ



◯以下をとりあえずDL
PDTはプラグインだけでもOKですが、
なんとなくこれ以上プラグインを追加したくなかったので、
All IN One (eclipse-php?)を落としました。

XAMPPは上記サイトに従って動作確認までは余裕かと。



◯XAMPP上にPHPUnitをインストール

とりあえず以下をターミナルで実行
パスからも想像出来るようにルート権限必要です。

#cd /Applications/XAMPP/xamppfiles/bin
#sudo ./pear upgrade-all
#sudo ./pear channel-discover pear.phpunit.de
#sudo ./pear install phpunit/PHPUnit
インストールされている気配が無かったので再度実行
#sudo ./pear install phpunit/PHPUnit
Unknown remote channel: pear.symfony-project.com
と出たので
#sudo ./pear channel-discover pear.symfony-project.com
#sudo ./pear install phpunit/PHPUnit
#./phpunit --version
バージョン表記されてメデタシ(2011年11月15日 3.6.3でした)

依存関係をまとめてinstallできるpearのコマンドオプションがあった気がするけど
メモ忘れました…



◯XAMPP上にtestrunner
#cd /Applications/XAMPP/xamppfiles/bin
#sudo ./pear channel-discover pear.piece-framework.com
#sudo ./pear install piece/stagehand_testrunner



◯ /Applications/XAMPP/xamppfiles/bin にパスを通す
先にやればよかった…



◯他

またDB関連もテストするなら下記も入れておくといいかも

#sudo pear install phpunit/DbUnit

http://www.phpunit.de/manual/3.6/ja/database.html



◯PDT関連
makegood追加(help → install new software)
http://eclipse.piece-framework.com/
-clean で再起動



◯これは正直いいのかわかんない
PDT使ってPHP作ってローカルで動作確認したいのに、
当たり前といえば当たり前なんだけど、/Applications/XAMPP以下が軒並み読取り専用です。
結果としてリンク先にあるように最初から準備されているドキュメントルートに、
Eclipseがファイル配置出来なかったりします。
なので、httpd.confをいじって適当な場所にドキュメントルートを移動させるか、
最初から配置されている場所に書き込めるようにするかの2択だと思います。

ちなみに後者のhttpd.confを弄ってちゃんとうまく動くかは確認していません。

そして本当に読取り専用じゃなくしてしまっていいのかは知りませんw

まあ一番最初にpear実行段階で管理者権限でファイルイジりまくっているから
いいっちゃいいんでしょうけど…

なおeclipse-phpのPreferences → PHP → PHP Server → Edit Server に
Path Mapping ってあるんですけど、これうまく動いている気がしない。
これが動けば別にどこに配置したっていいんでしょうけどねぇ…



◯とりあえず作ってみる

まず悩みながら下記パスにワークスペースを作成

新規作成→PHPプロジェクト→hellophp.php / hellophpTest.phpを作成
環境設定でpearの設定を入れておく
(多分php.iniとかにinclude_pathを追加で指定しても一緒)



一応マニュアルを日本語のURL指定にしてみる。
まあしたんだけど英語しか出ないのはなぜなんだろ…

phpのパス指定

以下「個別プロジェクト」で設定
phpunit.xmlは指定しなくてもOK
下のテストフォルダの追加を忘れずに



include pathにさっき追加したpearを追加

上記で設定は終わり
hellophp.php

hellophpTest.php
assertEquals("hoge", $hello->hoge());
    }
}
?>
phpunit.xml



    
        
        
    


んで右クリック→すべてのテストを実行すると

やった!グリーンだね!

ちなみにこやつは設定次第では保存時に毎回全テストを実行してくれるので、
知らず知らずのうちにデグレが避けれる?
まあなんかうざい時もあるけど、ちょっとしたCI気分が味わえます。

なお、phpunit.xmlを上記のように設定していると
テスト完了後に指定したパス(ここでは/tmp/hello_report)以下にコードカバレッジ結果も。
phpunit.xmlは色々と設定ができそうで面白そうです。
Jenkinsなんかと合わせ安いんじゃなかろうか。
Jenkins使ったこと無いんで想像で書いてますが。そして使ってみたいけど…
上記を抜けなくやったのに、テストが実行されない場合は
一旦eclipse-phpを再起動するとなぜか動く場合も…

その前にコマンドラインでPHPUnitが使用可能かは確認してもいいかも。

まあこんだけやったけど、俺がPHPを書くのって多分今だけな気がする…
(てかなんでPHP書く事になったんだっけ…)