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" を実行
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
問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
問10
>awk -F"," '{if($3 >= 10) print $3 }' hoge.log | sort -u
他の人の解答:
弊チーム新人!
http://blog.livedoor.jp/tattyamm/archives/4116667.html
http://d.hatena.ne.jp/sasaplus1/20120727/1343382701
http://ngsw.jp/2012/07/28/serv/940.html
Ocaml
http://d.hatena.ne.jp/hideshi_o/20120728/1343454674
perl
http://www.songmu.jp/riji/archives/2012/07/awkperl.html
http://d.hatena.ne.jp/celitan/20120728/1343494399
awk力が高い!
http://anond.hatelabo.jp/20120727180525
bashのみ
http://tsekine.blogspot.jp/2012/07/blog-post.html
SQL
http://anond.hatelabo.jp/20120728192522
python ワンライナーktkr http://kk6.hateblo.jp/entry/2012/07/28/%E3%82%B7%E3%82%A7%E3%83%AB%E6%93%8D%E4%BD%9C%E8%AA%B2%E9%A1%8C%E3%82%92Python%E3%81%A7%E3%82%84%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F
PowerShell
http://winscript.jp/powershell/251
http://pastebin.com/aX4pp4ij
Yacq
http://www.yacq.net/wiki/Ja%3AParseLogWithYacq
シェル操作課題 (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