id:officel(@raki) 主催の これから始めるPHPerのJenkinsでCIやってみよう(DevHub西新宿) #DevHub0128 に参加してきました。共催というか。
まあ今回は会場提供だけ、の予定だったのですが、前日にちょっと予習をしようと思って、というかうちの会社のメンバーをハンズオンでサポートするつもりでいたので、コンテンツを聞いてみた。
するとハンズオンの教材が自作ではなくてありものだという。そうか。良かろう。
でそのありもの教材がこれ: Template for Jenkins Jobs for PHP Projects
おいおい英語かよ、と。いうのはともかく実はこれをそのまま追って行くと結構不親切。そもそもJenkinsのインストール書いてないじゃん!!
というわけで前日にがっつり予習をすることにした。
まあこれはありがちで仕方ないのだが wgetとか言われてもあるわけがない。このjenkins-cli.jarについては、jenkinsの管理→Jenkins CLIのメニューからダウンロードするのが確実。
次に「Required PHP Tools」の部分については今回のtemplateで、これが必要、というわけではなくて、全然これでは不十分。実際にはphplocやらなんやらいろいろなツールをインストールする必要がある。なぜこれだけやり方が載っている・・・
次のbuild.xml については何がヤバいって、「これを何処に置くべきか」がわからないこと。実際にはプロジェクトを作成すると、ワークスペースがないのでビルドせいと言われるので、ビルドしてできたworkspaceの直下に配置。
ここでjenkinsからビルドをかけると、エラーになる。一発目のエラーは、srcのフォルダがないこと。なんでー?と思って調べるとlintのタスクでsrcフォルダ以下にphpファイルがある想定らしい。その上で、src以下の全てのファイルに、php -l コマンドを投げるの意と認識。
ここから先は、どうやらこのフォルダにて手動でantコマンドを叩きながら、ある程度のエラーをつぶしながらやったほうが効率的ということに気づき、方針転換。さよならjenkins(ぉ
phplocのタスクでどハマる。どうやらcreateProcessでエラーになってるよとか言われている。(これはビルドのコンソールでエラーメッセージを見るのが良い)何。意味分かんない。
ここでphplocをコマンドとして叩いてみたが正常に実行されていることから、そもそもantからなぜかphplocが叩けないことに問題があると認識。phplocをよく見ると、batファイル... ということで、つまりコマンドとしては "cmd /c phploc"を実行しないといけない。
antではこれを以下のように書く。
<target name="phploc" description="Measure project size using PHPLOC"> <exec executable="cmd"> <!-- ここが修正点 --> <arg line="/c phploc" /> <!-- ここが修正点 --> <arg value="--log-csv" /> <arg value="${basedir}/build/logs/phploc.csv" /> <arg path="${basedir}/src" /> </exec> </target>
ていうかantの勉強になってるよ!!
とまあこんなところが予習のハマりポイントでした。
ということで、とにかくなんかまとめてビルドのコマンドの中でチェックコマンドとかを作っておいて、jenkinsから叩かせればいいのだと認識して、PHPのもろもろのコマンドを全部確認するとかめんどくさいので放棄。
まあ友達の勉強会では発表して盛り上げるのは当然だよね!ってことでここからとりあえず定番(謎)「やってみた」シリーズの仕込み。まあJenkinsに対してイメージしていたのはSVNから持ってきて、ビルドして、通知、ってことだったので、さわりはじめて数時間でこれに取り組んでみた。
ま、とにかく失敗させて(かつ、既存のphpcsとかではなく)エラーを通知させたらどうなるんだろう?という一連のタスクが作れたということで満足。
というわけで、この1ページのハンズオン用コンテンツは、2.5時間コースだなこれは・・・と認識。
また、Windowsの人はWindowsだからこそハマるポイントが明らかにある!と思ったので即、グループ分けはOSでわけた方がいいのではないかと提案。そのままWindowsのチームは自分が面倒を見る覚悟を決める。
えっ...ハンズオン1時間予定だって・・・?!無理無理!
というわけで @rakiのJenkins/CI/PHPのインスペクションについてのもろもろ発表が1時間。内容としては概要をざーっとという感じで、知ってる人は知ってるし、知らない部分があればふーん、ってなる内容。各インスペクションコマンドについて実行例がついてるとよりわかりやすかったように思う。
その後ハンズオンが一時間で、ワールドカフェが一時間との予定とのこと。ワールドカフェのファシリテーションも難しそうなので、とりあえずどうなるか楽しみにしていた
が、ハンズオンがやっぱり・・・時間を食ってしまったのと、その「止めるタイミング」が見つからないまま流れて行ってしまう...しかもMacのグループは途中でワールドカフェならぬCIについてもろもろを議論しているではないか!
というのを横目にWindowsのグループは割としっかり進捗。特に自分がポイントだと思ったのは、「antの手動実行した方がいいよ」と「エラーが出たらコンソール見るといいよ」っていうのを伝えたことによって「自分でトラブルシュートしやすい状況」を作れたことと思っている。ハンズオンの運営のコツの一つは「多分〜な環境の人が〜なポイントでハマるのではないか」というのを相当数想定しておくことで、かつ、「困ったときにはどういうプロセスで調べるか(単にググるではなく)」ということ、また、「そもそも今やっている作業にはどういう意味がある」ということを明確にして行くことなのではないかと思う。
コンテンツの流れとしては例えば「〜をするために〜します、具体的には〜なことで、このようにやってみてください、細かいリファレンスはここです」って感じ。
ちなみに懇親会ではこんなコメントももらった
講師の人数が少なかった、とまでは思わなかったが、やっぱり教材の丁寧さ、というのは当然講師への質問の絶対数を減らすので、その分、講師の少なさ感は減るのかもしれない。やっぱハンズオンって難しいですよ!
今回Zussarで募集をかけたのですが、珍しくキャンセルもかなり少なかった。(20人の募集で4名。しかも最終的には20人ちょうどを収容。)20人が基本定員の部屋だったので、キャンセルがあると思っていた分ちょっと窮屈になってしまった。
また、個人持ち出しのWi-Fiルータが途中で接続しづらくなってしまうなどの問題があり、回線費用の足しのカンパ的に100円いただいているのですが、それに応えるサービスレベルが提供できなかったのがちょっと残念だった。会社所有のイーモバも動員すればよかったのかもしれないが、もしかしたら他の人もWiMAXを持ってきて起動していたことが、電波障害を起こしていたのかもしれない。
解決できる課題じゃないのかもしれないけど・・・悩ましいなあ。
あと・・・アンケート取るって言ってなかったっけ?
2011年は、アウトプットの年、だった気がする。
仕事上の目標設定が、アウトプット重視に評価項目がうつったから、というのもあるような気がするが、結果的に、「目を引くこと」に重点をおいたものが多かった。それが良いことかどうかはともかくとして。
先日の納会にて社長が独断と偏見で選んだ今年の10大ニュース、にて自分が仕事で強く関わった項目が一位に選ばれた。そういう意味でも、インパクトの大きい仕事ができて、昨年一年間は会社になじんで自分らしいことができた、という一年だったのに対し、ようやく、自分にしかできない(なんてことはないけど、より、それらしい)仕事をしっかりとアウトプットできた気がする。
そんなわけで、ある意味ここから先は一度「やりたいこと・今後を見据えてやっていくべきだと思うこと」に重点を置いた活動にも、10月以降取り組んで行くことができた。具体的には統計関連の学習。仲間を増やして継続して行くことを選んだ結果、自分がゴールとして行くべきところまで到達することはできなかったけど、さらに広く深く、という部分の学習ができて、さらに自身の課題が明らかになってきた。これは来年も最低半年は継続して行かないといけないテーマになるのだろうなあと思っている。
対して今年もっともうまくいかなかったのは、人を巻き込んでの活動。これが全般的に中途半端になってしまった。特に「自分がやりたいことがはっきりしている場合」には、それを他の人とは合致しなければそのテーマで突き進むことはできないし、「みんながこれ必要かな?」と思っている項目については、それを気にしている場合じゃないな、とつい思ってしまうシーンもいくつか。それによって毎月勉強会を開催しようと思っていてもできなかったりした。
来年重視したいことは、今年数ヶ月やってきて気づいた継続。
会社のメンバーがやっていた懸垂とか、筋トレの継続はほんとに中期にわたって大きく成果が出るものだし、研修講師に教わった朝の30分勉強、などなど、継続していた期間中に自身にも少しの結果を与えてくれたものがいくつかあった。
継続は本当に少しでもしなくなると終わってしまうので、どういうプレッシャーを自身にかけるかによるかもしれないけれど、継続して行く、ということをやって行きたいと思う。
とかかな・・・。
おそらく今年最後のR入門記録記事です。
今回は下記のような五教科の点数を個人ごとに記録したデータを使います。
(実際のデータ量はもっと多いです)
> csv kokugo syakai suugaku rika eigo 1 35 24 4 10 43 2 39 74 30 43 61 3 70 94 33 33 85 4 49 42 33 22 88 5 7 8 13 5 33 6 24 56 24 10 62 7 57 74 36 43 87
それぞれのデータについて平均を引いて標準偏差で割った値を用いて、princomp を用いて分析を行います(引数cor=FALSEの場合)
> pc = princomp(~kokugo+syakai+rika+suugaku+eigo, data=csv)
> pc
Call:
princomp(formula = ~kokugo + syakai + rika + suugaku + eigo,
data = csv)
Standard deviations:
Comp.1 Comp.2 Comp.3 Comp.4 Comp.5
1.8781853 0.7837910 0.6922202 0.5242323 0.3226508
5 variables and 28 observations.
ここでのstandard deviationsは固有値を表す。(二乗すると固有値になる)
固有ベクトルは
> unclass(loadings(pc))
Comp.1 Comp.2 Comp.3 Comp.4 Comp.5
kokugo -0.4198966 0.70995590 0.1388390 0.4041950 -0.3701346
syakai -0.4718859 0.26678238 0.3007108 -0.6091145 0.4946750
rika -0.4164392 -0.54803399 0.5499553 0.4560857 0.1255873
suugaku -0.4797564 -0.34643834 -0.2123652 -0.4176329 -0.6559710
eigo -0.4443227 -0.06655078 -0.7367136 0.2883999 0.4150022
固有値は
> pc$sd^2 Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 3.5275799 0.6143283 0.4791688 0.2748195 0.1041036
で表されるため、固有値の総和のうちの割合である寄与率を計算すると
> pc$sd^2/sum(pc$sd^2)
Comp.1 Comp.2 Comp.3 Comp.4 Comp.5
0.70551599 0.12286565 0.09583376 0.05496389 0.02082071
したがって、Comp.1, Comp.2 を持つデータを主成分であると判断できる。
この時の固有ベクトルは、Comp.1 に対してはすべてマイナスの0.4程度。これらは総合的な点数を表していると解釈できます。また、Comp.2 に対しては、国語と社会、理科と数学、で明らかにプラスとマイナスが分かれているのでこれは理系科目・文系科目の指標と言えます。
主成分スコアはデータと、固有ベクトルの積なので、
> a = data.matrix(csv)
> b = data.matrix(unclass(loadings(pc))[,1:2])
> a %*% b
Comp.1 Comp.2
[1,] 2.8477916 0.87904740
[2,] -1.0166761 -0.68571105
[3,] -2.4577717 0.86931935
[4,] -0.4767560 -0.32676212
これらに基づいてプロットすると
> plot(a %*% b) > grid(10,10)
下記のような散布図になります。
最も右下に位置したデータは5番目のデータで、性質上理系科目が強く現れていることを示します。
なお、この分析結果をbiplotを使って描画すると下記のように示されますが、データの軸がすべて出てしまっていて、どの成分が・・・というのはちょっとよくわからないです。(不勉強だから)...これは実際は5次元のデータなんだよね・・・
回帰分析とかいろいろやっていく中で便利だなーって思ったのが
> csv month degree amount 1 1月 5.1 772 2 2月 6.7 948 3 3月 9.8 1251 4 4月 13.6 1211 5 5月 19.0 1287 6 6月 22.5 1653 7 7月 25.6 1559 8 8月 27.5 2389 9 9月 23.5 1189 10 10月 19.5 1155 11 11月 14.4 1271 12 12月 9.5 1045
このような(前にも使った)データに対して、回帰分析を実施すると
> res = lm(csv$amount ~ csv$degree)
> res
Call:
lm(formula = csv$amount ~ (csv$degree))
Coefficients:
(Intercept) csv$degree
612.44 42.61
ってな感じで、
回帰式= 612.44 + 42.61 * degree
と求められるんだけど、
これをそのまま
csv[,4] = 612.44 + 42.61 * csv$degree
とかすると
> csv month degree amount V4 1 1月 5.1 772 829.751 2 2月 6.7 948 897.927 3 3月 9.8 1251 1030.018 4 4月 13.6 1211 1191.936 5 5月 19.0 1287 1422.030 6 6月 22.5 1653 1571.165 7 7月 25.6 1559 1703.256 8 8月 27.5 2389 1784.215 9 9月 23.5 1189 1613.775 10 10月 19.5 1155 1443.335 11 11月 14.4 1271 1226.024 12 12月 9.5 1045 1017.235
こんな具合に、xの値を配列(R的にはなんて言うんだっけ?)で与えるとそれに応じた値を全部同じ配列で返してくれるみたい。便利だ−。
最近演習問題もみんなでやってるので進みが遅くて新しいテーマが出来てませんが、そのぶん基礎力はついてる。
完全自分用メモ
作ったファイルのドキュメントみたいと思ったのですがWindowsだとPydocってコマンドではないので...
Python2.7の場合、以下、インストールフォルダがc:\Python27だった場合で、メソッドlenを調べたいときは下記のように実行
C:>python c:\Python27\lib\pydoc.py len
Help on built-in function len in module __builtin__:
len(...)
len(object) -> integer
Return the number of items of a sequence or mapping.
PYTHON_HOMEとかこのインストールフォルダに権限をつけといて、バッチを作るのがいいみたい、といろいろ調べてみたところによると。
この記事のフォルダ構成はバージョンによって異なるので注意が必要そうだ。