[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[debian-users:16496] Visualized Release-critical Bugreport for July 2, 1999
= Wichert が debian-devel-announce@lists.debian.org に Release
= critical buglistを先月くらいからポストしているので、プロットす
= るためのスクリプトを書いてみました。
少し直しました。あいかわらず稚拙ですが。
perlスクリプト``wak2tab''は、WichertのMailを表形式に展開します。
こんな感じで使います。
perl wak2tab < Wichert's_Mail > 19990702.table
こんな出力が得られます。
40295 930891840 abiword
40125 930891840 acroread
37069 930891840 adduser
:
shスクリプト``tab2gp''これらの表をまとめて、gnuplot 用のデータ
ファイルとgnuplot スクリプトを生成し、gnuplot を呼びます。
生成されたファイルは、明に指定されない限り自動的に消えます。
こんな感じで使います。
sh - tab2gp *.table
Postscriptを吐かせたい場合には、こんな感じ。
sh - tab2gp --Postscript 'landscape color solid' --yrange '0:450' *.table
x軸を経過日数として、次の5つのグラフを書きます。
a. 新規発生バグの累積
前週には存在せず、今週には現われているバグの数を足し込
んでいったもの
b. バグ修正数の累積
前週には存在したが、今週はなくなっているバグの数を足し
込んでいったもの
c. 修正されずに残ったバグ数の遷移
前週にも今週にも存在するバグの数
d. 今週の時点での全 Release-critical Bug数
WichertのMailの冒頭で、``Total number of release-
critical bugs:''と示されているものと同じ
e. 全バグ数の累積
plot開始時点での全Release-critical Bug数に、新規発生バ
グを足し込んでいったもの
ある一時点に置いて、次の等式が成立します。
a + c = b + d = e
やはりb.の傾きは一定しているようですね。毎週だいたい20くらい。
このあたりが、Release-critical Bugに対する現在のDebian Project
のスループットということでしょうか。
例によってgzipped PSをつけておきます。
-.- . -. -.
Ken Nakagaki <kenn@xxxxxxxxxxxxxxxxx>
``By All Means Today, For Souls Tomorrow.''
wak2tab:
-------------------------------------------
#!/usr/bin/perl
require 'timelocal.pl';
##
## 1999 2000 --> timegm()
## masked 99 00 946684799 946684800
## -1900 99 100 946684799 946684800
##
## ... works fine.
##
$/ = "\n\n";
# Read a paragraph each time.
%monthn2d = (
'Jan', 1,
'Feb', 2,
'Mar', 3,
'Apr', 4,
'May', 5,
'Jun', 6,
'Jul', 7,
'Aug', 8,
'Sep', 9,
'Oct', 10,
'Nov', 11,
'Dec', 12,
'HEY!!', 0
);
$Year = (gmtime)[5];
#print STDERR "Note: year is [$Year]?\n";
while (<>){
## ``Date: Fri, 25 Jun 1999 00:15:08 -0500''
if (/\ndate:\s+([a-z][a-z][a-z],\s+)?(\d+)\s+([a-z][a-z][a-z])\s+(\d+)\s+(\d+):(\d+):(\d+)\s+([-+\d]+)/i){
@date = ($4, $monthn2d{$3}, $2+0, $5-int($8/100), $6+0, $7+0);
$date[0] -= 1900 if $date[0] > 1900;
## (99, 6, 25, 5, 15, 8)
next
}
## ``Bug stamp-out list for Jun 25 00:04 (CST)''
if (/list for\s+([A-Z][a-z][a-z])\s+(\d+)\s+(\d+):(\d+)\s+.([A-Z][A-Z]T)/){
@date = ($Year, $monthn2d{$1}, $2+0, $3+0, $4+0, 0);
## (99, 6, 25, 0, 4, 0)
$date[3] -= (-5); # FIXME!!! What's ``CST''?
next
}
if (/^Package:\s+(\S+)/){
$pkgname = $1;
$ts = timegm($date[5], $date[4], $date[3], $date[2], $date[1]-1, $date[0]);
@btsr = split('\n');
for ($i = 1; $i <= $#btsr; $i++){
print "$1\t$ts\t$pkgname\n" if $btsr[$i] =~ /^\s+(\d+)/;
}
# next
}
}
-------------------------------------------
tab2gp:
-------------------------------------------
#!/bin/sh -
B="`basename $0`"
Dir="/tmp/$B.$$"
Fix="$Dir/fix"
New="$Dir/new"
Nof="$Dir/nof"
makecomm()
{
: {$2?}
${isbegin:-false} || cat < "$2" > "$1"
sort -n < "$1" > "$1.sort"
while [ $# -gt 1 ]; do
rt="`expr $2 - $BEGIN`"
sort -n < "$2" > "$2.sort"
comm -23 "$1.sort" "$2.sort"|wc -l|(read lc; echo "$rt $lc") >> "$Fix"
comm -13 "$1.sort" "$2.sort"|wc -l|(read lc; echo "$rt $lc") >> "$New"
comm -12 "$1.sort" "$2.sort"|wc -l|(read lc; echo "$rt $lc") >> "$Nof"
shift
done
}
accum()
{
awk '{ Days = $1 / 86400; Sum += $2; print Days, Sum }' < "$1"
}
accum2()
{
paste "$1" "$2" | awk '
{
Days = $3 / 86400
if (NR == 1){
Sum = $2 + $4
}else{
Sum += $4
}
print Days, Sum
}
'
}
noaccum()
{
awk '{ Days = $1 / 86400; print Days, $2 }' < "$1"
}
total()
{
paste "$1" "$2" | awk '{ T = $4 - $2; print $1, T }'
}
while [ $# -gt 0 ]; do
case "$1" in
--P*) shift; PSopt="$1" ;;
--yrange) shift; YRange="$1" ;;
-b*|--b*) isbegin=true ;;
-c*|--c*) isbegin=false ;;
-d*|--d*) doplot=false ;;
-p*|--p*) doplot=true ;;
-f*|--f*) shift; Fi="$1" ;;
-ne*|--ne*) shift; Ne="$1" ;;
-no*|--no*) shift; No="$1" ;;
-t*|--t*) shift; To="$1" ;;
-T*|--T*) shift; Ta="$1" ;;
-s*|--s*) shift; Gp="$1" ;;
-|--) shift; break ;;
-*) echo "Usage:
$B [option(s)] bugtable ...
options:
--begin|--continued
--do-not-plot|--plot
--fixedbug-file _fliename_
--notfixedbug-file _fliename_
--newbug-file _fliename_
--totalbugs-file _fliename_
--Totalbugs-file _fliename_
--script-of-gnuplot _fliename_
--Postscript _psoptions_
--yrange m:n
Default: \"$B --plot --continued\"
" >&2 ; exit;;
*) break ;;
esac
shift
done
: ${Fi:="$Dir/fix-out"}
: ${Ne:="$Dir/new-out"}
: ${No:="$Dir/notfix-out"}
: ${To:="$Dir/total-out"}
: ${Ta:="$Dir/Total-out"}
: ${Gp:="$Dir/gp-out"}
umask 077
trap "rm -rf \"$Dir\"; exit" 0 1 2 3 13 15
mkdir "$Dir" || exit
: > "$Dir/00" || exit
cat "$@"| while read bugid ts remain; do
echo "$bugid $remain" >> "$Dir/$ts"
done
BEGIN=`(cd "$Dir" && ls [0-9]*[0-9]|sed -n 2p)`
Begin="`perl -e \"print scalar(gmtime($BEGIN))\"`"
(cd "$Dir" && makecomm `ls [0-9]*[0-9]`)
accum "$Fix" > "$Fi"
accum "$New" > "$Ne"
noaccum "$Nof" > "$No"
accum2 "$Nof" "$New" > "$Ta"
total "$Fi" "$Ta" > "$To"
(
test "$PSopt" && echo "set terminal postscript $PSopt"
echo "set title \"Bug stamp-out list.\" 0,0"
echo "set xlabel \"days since ${Begin}.\" 0,0"
echo "set ylabel \"\" 0,0"
test "$YRange" && echo "set yrange [$YRange]"
echo -n "plot "
echo -n "\"$Ne\" title \"New bugs(accumulation)\" with lines, "
echo -n "\"$Fi\" title \"Fixed bugs(accumulation)\" with lines, "
echo -n "\"$No\" title \"Not-fixed bugs\" with lines, "
echo -n "\"$To\" title \"Total bugs\" with lines, "
echo -n "\"$Ta\" title \"Total bugs(accumulation)\" with lines"
echo ""
test "$PSopt" || echo "pause -1"
) > "$Gp"
${doplot:-true} || exit 0
exec < /dev/tty
gnuplot "$Gp"
exit
-------------------------------------------
begin 664 19990702.ps.gz
M'XL(""^A?#<``S$Y.3DP-S`R+G!S`)U8R6[;2!"]\RMJ#@&4`^7>N/D6.Q/,
MP0D$Q]#%R8$2:8D8FA1(RHDA^-^G>A5)+58&L45U]7M5KZJ[B^U\^&OVW?^4
MU8O<9U/B??APV^1I5S?7L*JVF[+NT/2Y7FZ?\ZK[4E==>PW_Y.5+WA7+%*=N
MZFV5%=7JIOY]#0%1/X&`*)*N9NDJ1_PD[?(J^XB&OZOLMGZ6KEKO"OUGQ;(#
M04`]L_S)L[9%OBHJ[^JV+NL&NF:;J]FK[W599+TQPLNBRG\56;>&8$H(T?:7
M=ET\=>"+4(^S$G:4P/.V?-.&]:8#3J>!@0]&7V'W7&."]1LLBBK3QCO8R4A#
MXSWLFD/H'*V'6(S!0`9B4H93P6`]M-VUZ_H7[&"Y;1JLTZ8NJ@[:KJG_S>&K
M!T#`)'</"FD2NG^'EFTW<H@KI8NUJ3=0Y:OCSF[_AS.?X2J^'/?W&:L'>BUW
M;=XUJ\52#?1R[B3]\><;%$^8'<YG:;N&-T]/V-\S6#G*RS:WX6YD."-WL$-T
MF9&U-QG*I],4F=4QRNP4Y1CX[F&!:!3V^!-URW]8$S>7XAPJ>*2`&Q4CEC][
MA=#P?MD<CR!O9GS2D4]JYD3?IX3U0<R`Y#QP!:('ZK@!*77JE!C8T)<PL,`&
MA$$Z=`0/^OJX@UL1XW3"OM+]AW")#>'1<?B8B%&F?$2-WZ,>1,>2V-^]H]E^
M=SSVEA-/CSE5!WMLNS`'_``PMY[L>3KN&QTMZ\VKZC)IEBEOLKNH<VZ><V5Q
M(X.0X_D`.X=E6;?Y)I4;6H5"Z,P=EQ,")%/E(=N4;&[S?;X'760L[1Y4/R0N
M7<38$WT^X?SW<JW<R=AJT"^!D>*RUR%Z`M=VFKR3]NT)&>?CKTWGMQ+.U,/*
MN.^1QHO_\/[BTRG5K>[8+O#I--2S=O7UB+BQ1>Z!QZMB%7U'12;Z)[C51GSA
MZ_?]K,&>M3*7@6MYLD<O^56;ON2>OCIT35JU)5X7/#*E^#+7G^TR+7,O(=#4
MG9H#/R!B@)956#7IJW?E+B?PA._>)[RQ`!7&AQHA4CX]/%PR(0_;KQ=&#'A`
ML58A2R)5BKV)@!!1C"9LXGTDUSC&A5PQSS>&((X-8D(^@GHO*U8LDG=8&C$)
M!C3*\1)SFH=/&BO+!$LU(,9"7$@<1D3DN?QZ1#:,R&)^+L4^<1B1<WYACGP8
MD<?\PASY,*+@_,(<Q3"BB-F%.8I1CF8O(7"NMA0-$(5;61E4^:C=-.K^Y=&(
MO4?#IPB"0*^^Y;$HHI?SF./QF/T!CSN>B"-R.4\X7I"P/^`%CA<F87(Y+]SS
M#@^Y.]K^P;F_D_4@$*DUR=+7%MJB6F*GKBOXFKX"_CE!HVO"K[%!T21)IKTR
MHENI$8DWVQ5VS/1YX]?;#LJB[1P.KV]>*.(01,CD[I]\RW_!8KMJ?TS2)?Z]
MM<7.5M35CX]N%P589P-F`1MU*1Y&0(,$;1$/L.6Y;Q%1WP0P9FV<Q>9;A`=/
MS_+8VD2LFQTU\N0'ROM2_,ZS"P1J^'&!";$*2#Q2*E"ITYRX;]RJI[&UZ3SP
M\FKTZ08Y^59W_I/3.-2D(7U-5(2A$>4[5?Z^;#:L3_>21^H$!"*RMD!KXD83
M(TK3`[ZPRB-Z]/0)/6'BY+CU9%9/X%2XU0Q)9&ODZL:,'F'TD'"DY_P::O@)
M?4=W66AK<GR7687C769N$ZLF;[NZR=6U0>K8X&4![PP/35J4>;/_KP3J_0?`
'?8NWL!``````
`
end