この記事では、ファイルと文字列の関係のセクションでログを作成するプロセスについて説明します。つまり、生成されたビデオを使用して、ファイルを操作するアクティビティを示します。


猫を求めることに興味がある人。
記事では以下を使用します。
- Git -VCS
- code_swarm-リポジトリ履歴ビジュアライザー。
- gource-リポジトリ履歴のビジュアライザー。
- WindowsまたはUNIX OS上のエミュレーターLinux環境(git msysgitエミュレーターはすでに勝利を収めています)
- MEncoder-無料のビデオエンコーダー
- ffmpegの -コーデックのさまざまな方法を使って、ビデオを変換するためのソフトウェア。
完成した作業結果はこちらです。
code_swarmのログ生成スクリプト
code_swarmが履歴を分析できるようにするには、特定の形式で履歴を送信する必要があります。 xmlファイルの形式は次の形式です。実際、code_swarmでは、時間の経過とともに変化し、オブジェクト 、何か、およびアクションが実行されるサブジェクトを持つ統計を実証できます。 古典的なケースでは、code_swarmのログがアンロードされるとき 、たとえば、 showteamworkなどのプラットフォーム、オブジェクトはプログラマー、サブジェクトはファイルです。 この場合、オブジェクトはファイルであり、件名は追加または削除された行です。
<? 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 >
データもリポジトリからコミット古典的なファイルへのほとんどが類似している、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:+/-の後の不要なスペースをすべて削除し、シェルに対して安全な行にします。
#!/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を置き換えます。
- 文字列変換タイプ-このパラメータは文字列変換を担当し、上記の値を受け取りますが、その指示なしに、デフォルトでmd5タイプが使用されます。
- コミット数-表示されるコミットの数を制限するために、このパラメーターは差分生成関数に渡されます。次の構成を-numに渡す必要があります。ここで、numはコミットの数です。 そうでない場合、すべてのコミットが行われます。
実際、すべてが活動を生み出しています。$ 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 、さらに説明します
スクリプトgen_log
code_swarmだけでなくgourceでファイルを操作した結果を見るのは面白いので、ログを生成するスクリプトを作成しました。 これがきしむgen_log(と呼ばれているファイルの最新バージョン ):このスクリプトは、便利なeval関数を使用します。 コマンドラインに入力したかのようにテキストを実行します。 次のように入力文字列があるので、このアプローチは、このような場合に有用です:#!/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
ご存知のように、システムはこの行を処理し、5つの変数date 、 author 、 filename 、 action 、 commentを持っています (ありがとうbliznezz )。 これらの変数は次のファイル形式で満たされています:date ="1142998387000" author ="ajax/ajax.js" filename ="c9/sd/sd9db4/sd/sd/sdb945/sdb89a/sd/sd7/sd/sdfbfdf.04" action ="A" comment =""
確かに、gourceはすでにこの形式を構成できます。 ファイル処理形式は、ファイル{gource_home} /data/gource.styleにあります。date|author|action|filename
スクリプトの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メガバイトのファイルを取得します。
実行結果、md5世代タイプ
jqueryリポジトリからの私の結果を以下に示します。code_swarm
これはどういう意味ですか(モデル「アトラクション」):
- オブジェクトは被写体を引き付けます。
- オブジェクトは互いに反発します
- 同じ主題を使用する場合、オブジェクトは互いに引き付けられます。
- 頻繁に使用される被写体は、サイズと明るさが増加します。
ひょうきん
何がこの平均値(「ミツバチとハニカム」のモデル)を行います。
- オブジェクト-蜂
- 件名-ハニカム
- レッドの追加 - - 除去ミツバチは、ハニカム緑のビームを構築します。
まとめ
この記事では、code_swarmおよびgourceビジュアライザーを使用して、時間変数を持つ統計を処理できることを主に強調します。主なことは、これらの統計を正しく送信することです。もちろん、これはすべてゲームのようなものです。 私にとっては、少なくともそれはそれです。 これらのことは、プログラマーの仕事に多様性を加えると言ってみましょう。
かぶのクローンを作る
結果を私に非常に興味深い投稿します。$ git clone git://github.com/artzub/code_swarm-gource-my-conf.git test
文学
- 効果的なawkプログラミングは良いawkのものです。
- UNIX OSユーザーマニュアル
- 男のffmpeg
- MEncoderの使用の基本と MPlayerドキュメントの他の章
- git log-ログアップロードドキュメント
- エラーに対処する方法:cygwinヒープのメモリをコミットできませんでしたか?
- awkのXML解析
- シェル、文字列内のすべての文字をコードで置換