ほとんどの開発者は、
code_swarmビジュアライザー(
Googleコード )のような製品に精通しています。 少なくとも3人に1人はおそらくログをアップロードし、アプリケーション開発プロセスを視覚化するビデオを作成しました。これはプログラマーの活動を示しています。 そしてもちろん、毎秒この種のビデオを見ました。 これらのビデオのほとんどは、プログラマーとファイルの関係のコンテキストで作成されました。
この記事では、ファイルと文字列の関係のセクションでログを作成するプロセスについて説明します。つまり、生成されたビデオを使用して、ファイルを操作するアクティビティを示します。
猫を求めることに興味がある人。
記事では以下を使用します。
差分ファイル生成プロセスの説明はgitになりますが、必要に応じてスクリプトをやり直すことができますが、ここで私の経験を共有します。
完成した作業結果はこちらです。
code_swarmのログ生成スクリプト
code_swarmが履歴を分析できるようにするには、特定の形式で履歴を送信する必要があります。 xmlファイルの形式は次の形式です。
<? xml version ="1.0" ? > < file_events > < event date ="" author ="" filename ="" action ="" comment ="" /> </ file_events >
<? xml version ="1.0" ? > < file_events > < event date ="" author ="" filename ="" action ="" comment ="" /> </ file_events >
<? xml version ="1.0" ? > < file_events > < event date ="" author ="" filename ="" action ="" comment ="" /> </ file_events >
<? xml version ="1.0" ? > < file_events > < event date ="" author ="" filename ="" action ="" comment ="" /> </ file_events >
実際、code_swarmでは、時間の経過とともに変化し
、オブジェクト 、何か、およびアクションが実行される
サブジェクトを持つ統計を実証できます。 古典的なケースでは、code_swarmのログがアンロードされる
とき 、たとえば、
showteamworkなどのプラットフォーム、オブジェクトはプログラマー、サブジェクトはファイルです。 この場合、オブジェクトはファイルであり、件名は追加または削除された行です。
データもリポジトリからコミット古典的なファイルへのほとんどが類似している、diffファイルから取られたが、それに添付されます。 ファイルは次のようになります。
1142998387000:John Resig<br>&ajax/ajax.js<br>new file mode 100644<br> +// AJAX Plugin<br>+// Docs Here:<br>+// http://jquery.com/docs/ajax/<br>+if ( typeof XMLHttpRequest == 'undefined' && typeof window.ActiveXObject == 'function') {<br>+var XMLHttpRequest = function() {<br>+return new ActiveXObject((navigator.userAgent.toLowerCase().indexOf('msie 5') = 0) ?<br> -Microsoft.XMLHTTP : Msxml2.XMLHTTP);<br>-};<br>-} <br> +.xml = function( type, url, data, ret ) {<br>+var xml = new XMLHttpRequest();<br>+if ( xml ) {<br>+xml.open(type || GET, url, true);<br>+if ( data )<br>+xml.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');<br>+if ( ret )<br>+xml.onreadystatechange = function() {<br>
このファイルは次のコマンドによってアンロードされます。
git log -U0 --diff-filter=AMD --reverse --pretty= "%at000:%cn" -10 | \<br> grep -v "^\(-\{3\}\|+\{3\}\) " | \<br> grep -v "^[+-][ ]*$" | \<br> grep -v "^[+-]$" | \<br> grep -v "^[ ]*$" | \<br> sed -e "s/diff .* b\//\&/g" \<br> -e "s/^+[ ]\+/+/g" \<br> -e "s/^-[ ]\ + /-/g" \<br> -e "s/[ ]\+$//g" \<br> -e "s/^$//g" \<br> -e 's/\\/\\\\/g' \<br> -e "s/[\"\`<>$]//g"
ここで何と理由を説明する価値があると思います:
- log-ログを表示する
- -U0-コンテキスト行の0番目の行に差分変更を追加します。変更された行のみ
- --diff-フィルタ= AMDは -ステータスのAのファイルのみを表示する:追加、M:変更、D:削除されました。
- --reverse-日付による逆ソート。
- --pretty = "%at000:%cn" -ログ形式%at —日付、 %cn —コミッター名。
- -10-最後の10コミットのみ。
- grepは、3 +または-で始まる行、スペース、すべて空の行、+または-で始まるすべての行の出力を禁止しますが、それらは空です。
- sed convert lines:+/-の後の不要なスペースをすべて削除し、シェルに対して安全な行にします。
そして今の楽しみは、と呼ばれるbashに非常に便利なツールがあり
awkは漸進的構文解析し、入力ストリームを処理する言語であります- 。 それはすべて味です。 最初に標準のsed、cut、whileでアイデアを実装しましたが、パフォーマンスはひどいものでしたが、Awkのすべてをやり直したとき、3倍にしないと生成速度が2倍になりました。 実際には、不必要な単語が十分にあります。完全なスクリプトコード(
ファイルの最新バージョン )は次のとおり
です 。
#!/bin/sh
generate () {
if test -t 1 ; then
exec > $logfile
fi
echo -e "<?xml version=\"1.0\"?>\n<file_events>"
echo "generating ..." >& 2
awk - v typegen = $1 '
BEGIN {
split("\b\b\b\b\b. . . . . \b- \b\b- \b\b- \b\b- \b\b- \b= = = = =", st, " ")
ist=0
_ord_init()
typehash=0
if( typegen == "ch_code") {
typehash=1
}
else if( typegen == "crypt" ) {
typehash=2
}
}
function _ord_init(low, high, i, t)
{
low = sprintf("%c", 7)
if (low == "\a") {
low = 0
high = 127
} else if (sprintf("%c", 128 + 7) == "\a") {
low = 128
high = 255
} else {
low = 0
high = 255
}
for (i = low; i <= high; i++) {
t = sprintf("%c", i)
_ord_[t] = i
}
}
function ord(str, c) {
c = substr(str, 1, 1);
return _ord_[c];
}
/^[0-9]/ {
sub(/:.*/, "");
d=$0;
next;
}
/^&/ {
sub(/&/, "");
f=$0
substr($0, 2, length($0) - 1);
next;
}
/^\+/ { a="A"; }
/^-/ { a="D"; }
/^[\+-]/ {
sub(/[\+-]/, "")
str=""
if( typehash == 1) {
for(i=1; i<length($0); i++){
str = str "" ord(substr($0, i, 1))
}
gsub(/32|16/, "/sd", str)
str = substr(str, 0, length(str)-2) "." substr(str, length(str)-1, 2);
}
else {
cmd="echo \"" $0 "\" | md5sum | cut -f1 -d \" \" | sed -e \"s@[32|16]@/sd@g;\" -e \"s/\\(..\\)\$/.\\1/\""
if ( typehash == 2 )
cmd="C:/Perl/bin/perl -e \"print crypt($ARGV[0], $ARGV[1])\" \"" $0 "\" \"1/5l58j/jk\""
cmd | getline str;
close(cmd);
}
if (str != "")
print "<event date=\""d"\" author=\""f"\" filename=\""str"\" action=\""a"\" comment=\"\"/>"
system("echo -ne \"" st[ist++] "\" >&2")
if (ist > 16) ist=0
}
' $gitdiff
echo - ne "\b\b\b\b\b\b\b\b\b\b\b\bcompleted!" >& 2
echo "</file_events>"
rm $gitdiff
}
prepare_git () {
git log - U0 -- diff-filter = AMD -- reverse -- pretty = "%at000:%cn" $1 | \
grep - v "^\(-\{3\}\|+\{3\}\) " | \
grep - v "^[+-][ ]*$" | \
grep - v "^[+-]$" | \
grep - v "^[ ]*$" | \
sed -e "s/diff .* b\//\&/g" \
-e "s/^+[ ]\+/+/g" \
-e "s/^-[ ]\+/-/g" \
-e "s/[ ]\+$//g" \
-e "s/^$//g" \
-e 's/\\/\\\\/g' \
-e "s/[\"\`<>$]//g" > $gitdiff
}
fileaction = "$(date +%j%H%M%s)"
typehash = md5
[ -n "$1" ] && typehash = $1 || echo -e " " + \
" \n :\n" + \
"\t\tmd5 — -\n\t\tcrypt\n\t\tch_code\nusing: $0 crypt" >& 2
echo " : " $typehash >& 2
[ -n "$2" ] && countcommit = $2 || echo -e " \n" + \
"git log --help\n:\t-<n>\n\t\tLimits the number of commits to show.\nusing: $0 crypt -10" >& 2
echo -n " : " >& 2
[ -n "$2" ] && echo $2 ' ' >& 2 || echo " " >& 2
gitdiff = $fileaction ".temp"
logfile = $fileaction "actions.xml"
prepare_git $countcommit
generate $typehash
awkプログラムの仕組みについては詳しく説明しません。 一般的な用語でのみ言います:
- 行が理解し始めた場合、それは、コミットこの値を抽出して暗記して、すぐに次の行に移動していることを意味します
- 行が&記号で始まる場合、次の文字はファイル名であり、抽出して次の行に移動します
- 行が+記号で始まり、次にタイプAのアクションである場合、行の分析を続行します
- 行が-記号で始まる場合、タイプDのアクションを意味し、行の分析を続行します
- 行が-/ +記号で始まる場合は、その行を処理してSTDOUTに出力し、次の行に進みます
文字列(サブジェクト)がビジュアライザーによってダイジェストされるために、いくつかの方法で変換されます。
- md5 -md5sumユーティリティを使用すると、合計で32または16のすべての数字が/ sd文字に置き換えられ、最後の2つの前にドット記号が追加されます。 これは、ビジュアライザgourceにツリーを構築するものです
- crypt -perl crypt関数を使用して、着信キーを暗号化し、結果を返します。
- ch_codeは -単に数値内のすべての文字を変換し、すべての数字32または16文字/ SDを置き換えます。
スクリプトは2つのパラメーターを取ることができます。
- 文字列変換タイプ-このパラメータは文字列変換を担当し、上記の値を受け取りますが、その指示なしに、デフォルトでmd5タイプが使用されます。
- コミット数-表示されるコミットの数を制限するために、このパラメーターは差分生成関数に渡されます。次の構成を-numに渡す必要があります。ここで、numはコミットの数です。 そうでない場合、すべてのコミットが行われます。
データ出力は、自動的に作成されたファイルで行われます。 あなたがしたい場合でも、結論は他のファイルで行うことができます。 リポジトリのshからアクティビティログを生成する機能を実行するには、次のコマンドを実行します。
$ echo "{ } \$@" > /bin/genlogcs
実際、すべてが活動を生み出しています。
code_swarmの構成
さて、code_swarmの設定についてお話ししましょうまず、ソースからcode_swarmを収集し、結果のファイル
をここからダウンロードできます 。 distディレクトリのcode_swarmがあるディレクトリに配置します。
次の内容のmy.confというファイルを作成します。
#
ColorAssign1 = "DigitLetter" , ".*[0-9][az]" , 43 , 170 , 215 , 43 , 170 , 215
#
ColorAssign2 = "LetterDigit" , ".*[az][0-9]" , 255 , 134 , 51 , 255 , 134 , 51
#
ColorAssign3 = "LetterLetter" , ".*[az][az]" , 43 , 110 , 214 , 43 , 110 , 214
#
ColorAssign4 = "DigitDigit" , ".*[0-9][0-9]" , 41 , 242 , 185 , 41 , 242 , 185
Width = 1280
Height = 720
InputFile = data / my / data / actions . xml
PhysicsEngineConfigDir = physics_engine
PhysicsEngineSelection = PhysicsEngineOrderly
ParticleSpriteFile = src / particle . png
Font = Helvetica
FontSize = 16
BoldFontSize = 16
#MillisecondsPerFrame=2254085
MaxThreads = 4
Background = 0 , 0 , 0
TakeSnapshots = true
SnapshotLocation = data / my / png / cs - #####. png
DrawNamesSharp = true
DrawNamesHalos = true
DrawFilesSharp = false
DrawFilesFuzzy = true
DrawFilesJelly = false
ShowLegend = true
ShowHistory = true
ShowDate = true
ShowEdges = false
ShowDebug = false
EdgeLength = 36
EdgeDecrement = - 2
FileDecrement = - 1
PersonDecrement = - 1
FileSpeed = 7.0
PersonSpeed = 2.0
FileMass = 2.0
PersonMass = 10.0
EdgeLife = 250
FileLife = 200
PersonLife = 255
HighlightPct = 5
UseOpenGL = false
ShowUserName = true
IsInputSorted = false
このファイルは、今後役立つものになります。
アクティビティの可視化ビデオを生成するためのスクリプト
長い間、作成する場所と作成するディレクトリ構造を説明しないように、code_swarmのディレクトリで、データディレクトリに、
ここに示す構造のmyディレクトリを作成し
ます 。 以下を取ります:
- すべてのコンテンツを含むデータディレクトリ
- すべてのコンテンツを含むツールディレクトリ
- code_swarmのアクティビティファイルを生成するスクリプトを配置するgenerator_logsディレクトリ。 実際に、それはありますし、ご利用いただけます。
- ファイルgen_log 、後で説明します。このファイルは、code_swarmのログからgourceのログを生成します
- 上記のmy.config
- sort_log、gourceのログをソートするスクリプトです
- run.bat 、さらに説明します
また、2つの
pngおよび
結果ディレクトリを
作成する必要があり
ます 。
スクリプトgen_log
code_swarmだけでなくgourceでファイルを操作した結果を見るのは面白いので、ログを生成するスクリプトを作成しました。 これがきしむgen_log(と呼ばれている
ファイルの最新バージョン ):
#!/bin/sh
uses (){
echo -e 'using\n$0 file_codeswarm.xml'
}
generatelog (){
echo "genereting... "
state =( "\\" "|" "/" "—" )
i = 0
if [ -f "$1" ]; then
result = ${1%.*} '.log'
echo -n > $result
# event
grep -e "event " $1 | \
#
# <event />
sed -e "s/^[ ]*//;s/^<event //g;s|/>$||g" | \
while read line
do
date = ""
# , 4
eval $line ;
# date,
[ -n "$date" ] && [ "`echo -n $data | wc -c`" - gt "10" ] && date = `echo $data | sed -e "s/^\(.\{10\}\).*/\1/"`
[ -n "$date" ] && echo "$date|$author|$action|$filename" >> $result
# .
echo - ne "\b${state[$i]}"
(( i += 1 ))
[[ $i - eq 5 ]] && i = 0
done
echo - ne "\bcompleted!"
else
echo -e "file log code_swarm not exsits!\n$1"
fi
}
[ -n "$1" ] && generatelog $1 || uses
このスクリプトは、便利な
eval関数を使用します。 コマンドラインに入力したかのようにテキストを実行します。 次のように入力文字列があるので、このアプローチは、このような場合に有用です:
date ="1142998387000" author ="ajax/ajax.js" filename ="c9/sd/sd9db4/sd/sd/sdb945/sdb89a/sd/sd7/sd/sdfbfdf.04" action ="A" comment =""
ご存知のように、システムはこの行を処理し、5つの変数
date 、
author 、
filename 、
action 、
commentを持ってい
ます (ありがとう
bliznezz )。 これらの変数は次のファイル形式で満たされています:
date|author|action|filename
確かに、gourceはすでにこの形式を構成できます。 ファイル処理形式は、ファイル{gource_home} /data/gource.styleにあります。スクリプトのrun.bat
ここで、{code_swarm_home} /data/my/data/actions.xmlディレクトリに配置したgenlogcsコマンドを使用して生成したアクティビティファイルを処理する共通ファイルにすべてを収集します。
ここではその内容(ある
ファイルの最新版は ):
call sh gen_log ./data/actions.xml
call sh sort_log ./data/actions.log > data\gource.log
pushd png
del *.png
popd
pushd ..\..
call run.bat data\my\my.config
popd
pushd png
call "..\tools\nt\mencoder" mf://*.png -mf fps=19:type=png -ovc x264 -x264encopts pass=1:bitrate=1000 -oac copy -audiofile "..\data\audio.wav" -o "..\results\result.avi"
popd
pushd "tools\gource"
call gource.exe --hide filenames,dirnames --user-scale 2 --output-framerate 25 --stop-position 1 --highlight-all-users --seconds-per-day 1 --output-ppm-stream "..\..\results\resultgource.ppm" "..\..\data\gource.log"
popd
pushd "tools\nt"
call ffmpeg -y -b 9000K -f image2pipe -vcodec ppm -i "..\..\results\resultgource.ppm" -fpre "..\ll.ffpreset" -i "..\..\results\resultgource.ppm" -vcodec libx264 "..\..\results\resultgource.avi"
call mencoder "..\..\results\resultgource.avi" -ovc x264 -x264encopts pass=1:bitrate=10000 -ofps 19 -speed 2 -o "..\..\results\resultgource.fps"
call mencoder "..\..\results\resultgource.fps" -ovc x264 -x264encopts pass=1:bitrate=10000 -oac copy -audiofile "..\..\data\audio.wav" -o "..\..\results\resultgource.avi"
popd
del results\resultgource.ppm
del results\resultgource.fps
del data\actions.log
このスクリプトは次のアクションを実行します。
- ソート彼のチームソート-k1 -t「|」 、しかし、Windowsで実行しているため、別のファイルに配置しました。それ以外の場合は、Windowsで誓います。 gourceのみソートされていないデータで正しく動作するため、ソート必要。
- my.configで説明した構成でcode_swarmを実行します。 code_swarmの結果として、それは大きなコルバPNGファイルを生成します
- mencoderを使用してpngファイルをビデオに変換し、オーディオトラックをアタッチすると同時に、ビデオの継続時間をパラメーター-mf fps = 19:type = pngで調整できます。 しかし、私はそれが好きではないので、このために私が受け入れられる値を使用します。
- 次にgourceが開始し、ppmで結果をアンロードします。 ファイルが数ギガバイトで非常に大きくなるため、アップロードパスを指定してください。
- 次に、 ffmpegユーティリティを使用してこのppmファイルをaviファイルに転送しますが、非常に大きくて長いことがわかりました。 メンコーダーの助けを借りて、同じ19 fpsまで加速します。 そして、サウンドトラックをアタッチするために再びメンコーダーを起動します。 その結果、わずか数10メガバイトのファイルを取得します。
showteamworkフレームワークでビデオ変換を見ました。 作業の結果(私の場合、これは{code_swarm_home} / data / my / results)に指定したディレクトリ内のすべての手順を完了した後、アクティビティを視覚化した2つのビデオ。
実行結果、md5世代タイプ
jqueryリポジトリからの私の結果を以下に示します。
code_swarm
これはどういう意味ですか(モデル「アトラクション」):
- オブジェクトは被写体を引き付けます。
- オブジェクトは互いに反発します
- 同じ主題を使用する場合、オブジェクトは互いに引き付けられます。
- 頻繁に使用される被写体は、サイズと明るさが増加します。
ここで、最も明るいオブジェクトは、jsスクリプトでよく見られる中括弧です。 原則として、クローズは1行で行われ、md5sumはすべて同じです。 また、md5sumは複数の異なる行で一致する場合があります。 しかし、あなたはそれに耐えることができます。 あなたは、世代ch_codeの使用のタイプのより客観的な絵が必要な場合。
ひょうきん
何がこの平均値(「ミツバチとハニカム」のモデル)を行います。
- オブジェクト-蜂
- 件名-ハニカム
- レッドの追加 - - 除去ミツバチは、ハニカム緑のビームを構築します。
面白い写真がフラクタルに似ていることがわかります。 各ブランチはファイルである、ツリー上のすべての葉のカタログのようなものです。
まとめ
この記事では、code_swarmおよびgourceビジュアライザーを使用して、時間変数を持つ統計を処理できることを主に強調します。主なことは、これらの統計を正しく送信することです。
もちろん、これはすべてゲームのようなものです。 私にとっては、少なくともそれはそれです。 これらのことは、プログラマーの仕事に多様性を加えると言ってみましょう。
かぶのクローンを作る
$ git clone git://github.com/artzub/code_swarm-gource-my-conf.git test
結果を私に非常に興味深い投稿します。
文学
upd:誰もが黙っていますが、code_swarmのログ生成スクリプトにエラーがあります。または、正確な言い方さえわからないタイプミスです。 正規表現
/ ^ + /では、 +から
のエラーはこのようにエスケープする必要があります
/ ^ \ + / 。 奇妙なことは、すべてがWindowsで動作し、debian awk cursedの下で起動されることです! =)