PHPでクラスのフィールド(プロパティ)に関数オブジェクトを入れる

会社で「クラスのフィールドに無名関数入れられん><」って言ってる人がいたので、
「あれ?なんかできなかったっけ???」って思った。

一旦、ローカル変数に入れれば使える。

なんで $this->func(); って呼べないんじゃろね…

git flow でのチーム開発ワークショップ資料

この記事は会社内の別チームの方に、
僕の今のチームで git をどう運用してるかを
ワークショップ形式で説明するための資料である。

事前準備

git と git-flow を入れておくこと

参考資料(Macでgitとgit-flowインストール)

- xcode cli toolインストール 
-- https://daw.apple.com/cgi-bin/WebObjects/DSAuthWeb.woa/wa/login?appIdKey=d4f7d769c2abecc664d0dadfed6a67f943442b5e9c87524d4587a95773750cea&path=%2F%2Fdownloads%2Findex.action
- homebrew のインストール 
-- https://github.com/mxcl/homebrew/wiki/installation
- brew で git と git-flow のインストール
-- >brew install git
-- >brew install git-flow

参考資料(Windowsでgitとgit-flowインストール:msysgist編)

- msysgistのインストール
-- http://code.google.com/p/msysgit/downloads/list?q=full+installer+official+git
- git-flowのために、util-linuxからgetopt.exeとlibintl3.ddlを入手
-- http://gnuwin32.sourceforge.net/packages/util-linux-ng.htm#download から「Complete package, except sources」 でダウンロードしインストール
-- インストールディレクトリ(「C:\Program Files (x86)\GnuWin32」)の「bin\getopt.exe」と「bin\libintl3.ddl」をmsysgit のインストールディレクトリのbin(「C:\Program Files (x86)\Git\bin」)にコピー
- git clone git://github.com/nvie/gitflow.git する
-- >cd gitflow
-- > git clone git://github.com/nvie/shFlags.git
-- 管理者権限で、contrib\msysgit-install.cmd "C:\Program Files (x86)\Git" を実行
 

前提

うちのチームの前提
- リリースは週1ぐらいを想定
- チームサイズは10人程度
- リモートリポジトリは各人もったりしないで一個

リリースサイクル早かったり人数多いと運用は変わるだろう。

git-flow とは

Vincent Driessen氏がブログに書いた"A successful Git branching model" というブランチモデルの導入を簡単にする git プラグインである
(日本語訳 http://keijinsonyaban.blogspot.jp/2010/10/successful-git-branching-model.html)

A successful Git branching model とは
http://d.hatena.ne.jp/Voluntas/20101223/1293111549
から引用すると

master ブランチは tag 専用とする
新機能開発は feature ブランチで行う
細かい開発は develop ブランチで行う
release ブランチはタグを打つための作業を行う
hotfix ブランチはバグフィックスを行う専用のブランチで develop と master に反映する

というモデルである.

git flow コマンドは上記モデルを助けるためのツールなので、
なるべく上記モデルを理解し、
git flowコマンドが裏側で何をやっているのかも理解しながら行なって欲しい

注釈
git flowが本当に何をやってるか詳しく知りたい人は、ソースを読もう。
https://github.com/nvie/gitflow
git プラグインは基本的にはシェルスクリプトだ。
例えばgit flow feature finishが何をやってるか見たければ
このソースの
https://github.com/nvie/gitflow/blob/develop/git-flow-feature
cmd_finishを見ればいい

git flow の初期化

まずは二人一組になって欲しい。はーい。あぶれた人は先生と組みましょうね。
二人の名前はアリスとボブと名づける
(二人一組になれない人は一人二役でcloneするディレクトリをAliceとBobと2つに分けて実行しよう。ScreenとかでWindowわけておくといいのでは)

アリスもボブもgit cloneをしてローカルにリポジトリをクローンしよう

次にアリスもボブもgit flow initで、リポジトリの初期化を行なっておこう
色々と聞かれるが、git flowのFeatureブランチの名前などを聞かれている
基本はデフォルトで良い

#git flow init

Which branch should be used for bringing forth production releases?
   - master
Branch name for production releases: [master] 
Branch name for "next release" development: [develop] 

How to name your supporting branch prefixes?
Feature branches? [feature/] 
Release branches? [release/] 
Hotfix branches? [hotfix/] 
Support branches? [support/] 
Version tag prefix? [] 

git flow init -d を使うとすべてデフォルトの設定のままでコマンドが終わる

このときgit branchコマンドを実行するとdevelopブランチで作業してることになっているはずである

# git branch
* develop
  master

注記
ほんとうにまっさらなgitリポジトリでやってると、developブランチがremoteにないのでこの後の説明で怒られるので、
git push origin developしておこう。
(ワークショップのとき、まっさらなリポジトリでやったので怒られた><)

アリスが新しい機能の作成を行うために Feature ブランチを切る

さて、新しい機能を作成しよう。

アリスはコマンドラインから数値を受け取って、数値にしたがって、FizzBuzzを表示するタスクをやって欲しいと言われた。
(ワークショップなのでプログラムの内容は適当)

チケット番号は TSK48 とする。

まずは機能を作成する前に、Feature branchを切る。

Feature branchとは、将来に向けた機能を開発するためのブランチである。
日々の開発は基本的にはFeature branch上で行うことになる。

brach名には「チケット番号_簡単な説明」としている。
アリスは以下のようにgit flow start コマンドを実行しよう。

# git flow feature start TSK48_fizzbuzz
Switched to a new branch 'feature/TSK48_fizzbuzz'

Summary of actions:
- A new branch 'feature/TSK48_fizzbuzz' was created, based on 'develop'
- You are now on branch 'feature/TSK48_fizzbuzz'

Now, start committing on your feature. When done, use:

     git flow feature finish TSK48_fizzbuzz

この時点で何が行われているかというと、feature/TSK48_fizzbuzzというブランチが作成され、
そのbranchがチェックアウトされた状態になっている。

アリスがgit branchすると以下のようになる。

# git branch                                      
  develop
* feature/TSK48_fizzbuzz
  master

feature/TSK48_fizzbuzzが作られチェックアウトされている。

>>
注記
git を使うときは、しつこいぐらいに git branch , git status , git status -s,git status -bコマンドを使うべき。
自分がどこにいるかを確認しないとダメだからだ。
僕はzshコマンドプロンプトにブランチの状態と、statusの状態を自動で表示するようにしている。

日本におけるハッカーのビジネス、またはSotarokと僕

  • 2年ぐらい前のパーフェクトPHP出版記念かなんかの勉強会で出会う
  • LINKIN PARK のライブのチケット余ってるってTwitterで言ってたので、Twitterでコンタクトとって一緒にライブに行く
  • PHPカンファレンス2011かなんかでも会ったような気がする
  • Crocosもsotarokもすげーなって思う

あわせて読みたい
http://blog.livedoor.jp/kensuu/archives/54119909.html
http://blog.sugyan.com/entry/2012/09/04/004759

以上

シェル操作課題 (cut, sort, uniq などで集計を行う) 解答編

さて先日の設問編
http://d.hatena.ne.jp/Yamashiro0217/20120727/1343371036
の解答例です。

はてブとかトラックバックで解答例もらってて、あきらかに俺の解答よりよかったり面白かったりするので、
最後にまとめたので見てみると面白いと思う。

他の人の解答見てたらsortコマンドがファイルを受け取れるということに気づいた2012年夏。
uniq -c 使ってる人あんまりいない印象。

問1

>cat hoge.log

問2

>cat hoge.log | cut -d, -k1,4

問3

>grep server4 hoge.log

問4

>cat hoge.log | wc -l

問5

>cat hoge.log | sort -k1,1 -k3,3n -t, | head -5

問6

>cat hoge.log | sort -u | wc -l

問7

>cat hoge.log | cut -d, -f3 | sort -u | wc -l

問8

>cat hoge.log | cut -d, -f4 | sort | uniq -c | sort -r | head -1

問9

>sed -e s/server/xxx/ hoge.log | cut -f1 -d, | sort | uniq -c

シェル操作課題 (cut, sort, uniq などで集計を行う) 設問編

この記事は弊チームの新人の方にシェル操作に慣れてもらうために作った課題である。
皆様のチームの新人にやってもらってもいいですね。
あとで解答編を書く。

もちろん他の方も解いてもらって構わない。
というか僕の解答以上の解答がきっとあるはずなので、それを教えて欲しい。

はてブで解答でも面白解答お待ちしてます。


さて本題。
Webアプリケーションを作っていると偉いさんとか、いわゆる企画の人とかから
「ちょっと○○がどうなってるかログから数字だせない?」
とさらっとお願いされたりする。

そこで「いや、ちょっと手が空いてなくて(こっちは忙しいんだよ糞がっ)」と答えたくなるかもしれないが、
そこは「じゃあさくっとやっておきますよ!僕にかかればちょろいっすよ!」と答えらればかっこいい。
(あまりさくっとやりすぎるとそういう細々依頼がたくさんくる諸刃の剣)


例えば以下のようなログファイルがあったとする。
ファイルの形式は、カンマ区切りで「サーバー名,unixtime,ユーザーID,アクセス先」。

server1,1343363124,30,/video.php
server2,1343363110,20,/profile.php
server3,1343363115,7,/login.php
server1,1343363105,8,/profile.php
server2,1343363205,35,/profile.php
server2,1343363110,20,/profile.php
server3,1343363205,30,/login.php
server4,1343363225,12,/video.php
server1,1343363265,7,/video.php

追記:ブログ書きながら色々元ファイル修正してたらミスってました。想定解答が違ったりして皆様に迷惑かけました。ごめんなさい。

以下に、このファイルを元にやってほしい作業を書くのでターミナルで作業して想定期待結果を表示して欲しい。
ヒントが書いてあるが、ヒント通りにやらなくてもいい。
もちろんヒントはググっていいし、>man cat とかでマニュアルも見よう。
いっそpythonワンライナーで実行したらカッコイイと思うw

え。Windows?まさか???cygwin入れたり、vmでやってみたり、開発サーバーで作業すればいいんじゃないっすか(ホジホジ)


ヒント:cat,パイプ,sort,cut,uniq,wc,sed,perl,awk,grep,head,tail,date,and so on

問1 このファイルを表示しろ

想定期待結果はファイル全体の表示

問2 このファイルからサーバー名とアクセス先だけ表示しろ

想定期待結果:

server1,/video.php 
server2,/profile.php
server2,/login.php  
server1,/profile.php 
server2,/profile.php 
server2,/profile.php
server3,/login.php 
server4,/video.php 
server1,/video.php 

問3 このファイルからserver4の行だけ表示しろ

想定期待結果:

server4,1343363225,12,/video.php 

問4 このファイルの行数を表示しろ

想定期待結果: 9

問5 このファイルをサーバー名、ユーザーIDの昇順で5行だけ表示しろ

想定期待結果:

server1,1343363265,7,/video.php 
server1,1343363105,8,/profile.php 
server1,1343363124,30,/video.php 
server2,1343363115,7,/login.php  
server2,1343363110,20,/profile.php

問6 このファイルには重複行がある。重複行はまとめて数え行数を表示しろ

想定期待結果: 8
補足:

hoge,30
foo,20
hoge,30 

だったら2行と数える。

問7 このログのUU(ユニークユーザー)数を表示しろ

想定期待結果: 6

問8 このログのアクセス先ごとにアクセス数を数え上位1つを表示しろ

想定期待結果:3 /video.php

追記:Twitterで指摘されましたが間違ってました…これも元データブログ書いてる最中にいじったせいです。すいません><
想定期待結果: 4 /profile.php

問9 このログのserverという文字列をxxxという文字列に変え、サーバー毎のアクセス数を表示しろ

想定期待結果:

    3 xxx1
   3 xxx2
   2 xxx3
   1 xxx4

追記:上記想定結果も最初書いたのと変えました。元データが(ry すいませんでした><

問10 このログのユーザーIDが10以上の人のユニークなユーザーIDをユーザーIDでソートして表示しろ

想定期待結果:

12
20
30
35

ログが数十Gだったら?

Hadoop使っとけ

あるいはExcelは大171億7986万9184件のデータが使えるのでExcel使えばいいのでは
http://itpro.nikkeibp.co.jp/article/NEWS/20120725/411322/

Serialize周りのテストが、SBTでテストするとClassNotFoundが出るときの対応

Intellij IDEAからテストすると大丈夫なんだけど、SBTから実行すると ClassNotFoundException が出る。


「sbt ClassNotFoundException」あたりでググる
https://github.com/harrah/xsbt/issues/89

「fork := true」を設定せよと。

動かない。

よくよく調べると「fork とか test のとき効かないぜばーか(意訳)」。

どうすればいいねん。
独自 ObjectInputStream 使ってねー。だってぉ。
https://github.com/harrah/xsbt/issues/163