2 %\usepackage{libertine}
4 \setmainfont[Ligatures=TeX]{FreeSerif}
5 \setsansfont[Ligatures=TeX]{FreeSans}
7 \usepackage[Symbols]{ucharclasses}
8 \newfontfamily{\defaultfont}{FreeSerif}
9 %\newfontfamily{\symbolfont}{FreeSerif}
10 \newfontfamily{\sansfont}{FreeSans}
11 \setDefaultTransitions{\bgroup\defaultfont}{\egroup}
15 \usepackage[bf]{caption}
21 \usepackage{tcolorbox}
23 \BeforeBeginEnvironment{minted}{\begin{tcolorbox}}%
24 \AfterEndEnvironment{minted}{\end{tcolorbox}}%
25 % \usepackage{multirow}
28 \usepackage[backend=biber,natbib=true,hyperref=true,style=nature]{biblatex}
29 \addbibresource{references.bib}
30 % \usepackage[nomargin,inline,draft]{fixme}
31 % \newcommand{\DLA}[1]{\textcolor{red}{\fxnote{DLA: #1}}}
32 % \usepackage[hyperfigures,bookmarks,colorlinks,citecolor=black,filecolor=black,linkcolor=black,urlcolor=black]{hyperref}
36 \usepackage{zref-xr,zref-user}
37 \renewcommand*{\bibfont}{\tiny}
38 \usepackage[absolute,overlay]{textpos}
42 \usetheme{Montpellier}
43 %\useoutertheme[hideallsubsections]{debiansidebar}
44 % \setbeamercovered{transparent}
47 \setbeamertemplate{navigation symbols}{}%remove navigation symbols
49 \usepackage[nomargin,inline,draft]{fixme}
53 \logo{\begin{tikzpicture}% Pale figure
54 {\node[opacity=0.3] {\includegraphics[width=2cm,keepaspectratio]{figures/openlogo-crop.pdf}};}%
56 \author{Don Armstrong}
58 \subtitle{22 Years of Bugs}
59 \date{August 10th, 2017}
60 \titlegraphic{\includegraphics[height=0.2\textheight,keepaspectratio]{figures/openlogo-crop.pdf}}
63 \setbeamercolor{postit}{fg=black,bg=yellow}
65 % State of the BTS: new features, changes and tips
67 % The bug tracking system is where all bugs that affect Debian are
68 % filed. New features, including the affects, summary, and local debbugs
69 % mirror will be presented and demonstrated. Some of the underlying
70 % architectural changes to the codebase in debbugs to make it more
71 % maintainable and deployable are also outlined. Finally, a set of tips
72 % and tricks that can be used to make the BTS easier to use are
78 % - local debbugs mirror for offline work
82 % - multi-distribution/arch status
83 % - control changes at submit@ time
84 % - Code Architecture Changes
86 % - Control abstraction
87 % - release to experimental
90 <<load.libraries,echo=FALSE,results="hide",error=FALSE,message=FALSE,cache=FALSE>>=
97 opts_chunk$set(dev="cairo_pdf",out.width="\\textwidth",out.height="0.8\\textheight",out.extra="keepaspectratio",fig.width=6/1.2,fig.height=4/1.2)
98 opts_chunk$set(cache=TRUE, autodep=TRUE)
99 options(device = function(file, width = 6/1.2, height = 4/1.2, ...) {
100 cairo_pdf(tempfile(), width = width, height = height, ...)
105 <<scientific_format,echo=FALSE>>=
106 scientific_10 <- function(x) {
107 parse(text=gsub("e", " %*% 10^", scientific_format()(x)))
113 %\setbeamercolor{frametitle}[bg=-red!90!green!10,fg=black]
115 \frame[plain]{\titlepage
116 Code and slides are here:
117 \qrcode[padding]{https://dla2.us/p/debbugs2017}
118 \url{https://dla2.us/p/debbugs2017}
122 % \begin{frame}{Debbugs}
123 % \tableofcontents[subsectionstyle=hide]
126 \section{Introduction to Debbugs}
128 \subsection{Introduction}
129 \begin{frame}{Goals of this talk}
131 \column{0.5\textwidth}
135 \item How you can help
136 \item Answer questions/discussion
138 \column{0.4\textwidth}
139 \includegraphics[width=\textwidth,keepaspectratio]{images/rc_buggy}
142 \begin{frame}{Goals of the BTS}
144 \column{0.4\textwidth}
145 \includegraphics[width=\textwidth,keepaspectratio]{images/not_a_bug}
146 \column{0.6\textwidth}
148 \item Reporting of \only<1>{Features}\only<2>{Bugs}
149 \item Evolution of \only<1>{Features}\only<2>{Bugs}
150 \item Fixing of \only<1>{Features}\only<2>{Bugs}
151 \item Reducing impact of \only<1>{Features}\only<2>{Bugs}
156 \section{Bugs in Debian}
157 \subsection{Bug Reporting Rate}
158 \begin{frame}{Bugs from the beginning of time}
160 <<bug.growth,fig=TRUE,echo=FALSE,cache.extra=file.info("data/sorted_bug_growth_for_r_every_500.txt")[,"mtime"]>>=
161 bug.growth <- fread("data/sorted_bug_growth_for_r_every_500.txt")
162 colnames(bug.growth) <- c("time","bugs")
163 bug.growth <- bug.growth[pmax(bugs) <= as.numeric(bugs),]
164 bug.growth <- bug.growth[order(time),]
165 while (bug.growth[,any(c(0,diff(bugs)) < 0)]) {
167 bug.growth[c(0,diff(bugs))>=0,]
170 as.POSIXct(ISOdatetime(1970,1,1,0,0,0)+
171 as.numeric(bug.growth$time))]
172 bug.growth[,`bugs per day`:=c(0,diff(bugs)/
173 as.double(diff(date),"days"))
175 print(ggplot(bug.growth,#[date > as.POSIXct(ISOdatetime(2005,1,1,0,0,0)),],
177 xlab("Time")+ylab("Bugs filed in Debian")+
178 scale_y_continuous(labels = scientific_10)+
184 \begin{frame}[fragile]{Bug Growth Rate}
185 <<bug_growth_rate,echo=FALSE>>=
186 print(ggplot(bug.growth[date > as.POSIXct(ISOdatetime(2014,1,1,0,0,0)),],
187 aes(x=date,y=`bugs per day`))+
188 xlab("Time")+ylab("Bugs filed per day")
189 + scale_y_log10(breaks=c(60,100,200,400,800))
190 + geom_line()+stat_smooth(method="lm")
191 + geom_label(data=data.table(date=as.POSIXct(ISOdatetime(2015,04,25,0,0,0)),"bugs per day"=400),label="Jessie",color="red")
192 + geom_label(data=data.table(date=as.POSIXct(ISOdatetime(2017,06,17,0,0,0)),"bugs per day"=400),label="Stretch",color="purple")
197 \begin{frame}[fragile]{Is the bug filing rate decreasing?}
199 <<bug_growth_rate_over_time>>=
200 summary(lm(log(`bugs per day`)~date,bug.growth[date > "2014-01-01 PST",]))
203 Not significantly decreasing.
206 \begin{frame}{My entries into Christian's game}
208 \column{0.5\textwidth}
210 <<bugs.filed,fig=TRUE,echo=FALSE,warning=FALSE,fig.width=3,fig.height=3>>=
211 print(ggplot(bug.growth[date > as.POSIXct(ISOdatetime(2015,1,1,0,0,0)),],
213 xlab("Time")+ylab("Bugs filed in Debian")+
214 scale_y_continuous(labels = scientific_10)+
215 geom_point()+stat_smooth(method="lm"))
216 bugs.filed.per.day <-
217 lm(bugs~date,bug.growth)$coeff[2]*3600*24
218 temp.lm <- lm(date~bugs,bug.growth[date > as.POSIXct(ISOdatetime(2015,1,1,0,0,0)),])
220 as.POSIXct(ISOdatetime(1970,1,1,0,0,0)+as.numeric(predict(temp.lm,data.frame(bugs=880000,date=NA))))
222 as.POSIXct(ISOdatetime(1970,1,1,0,0,0)+as.numeric(predict(temp.lm,data.frame(bugs=900000,date=NA))))
224 as.POSIXct(ISOdatetime(1970,1,1,0,0,0)+as.numeric(predict(temp.lm,data.frame(bugs=1000000,date=NA))))
227 \column{0.5\textwidth}
228 Roughly \Sexpr{format(bugs.filed.per.day,digits=1)} bugs are filed per
229 day. The 880000th bug will be filed at \Sexpr{bug.880000}, the
230 900000th bug will be filed at \Sexpr{bug.900000}, and bug one million will be filled
236 \subsection{Bug Fixing Rate}
239 <<bugs.closed,fig=TRUE,echo=FALSE,width=7,height=5,warning=FALSE,error=FALSE,cache.extra=file.info("data/bug_closed_time_series.txt")[,"mtime"]>>=
240 bug.closed.series <- fread(file="data/bug_closed_time_series.txt")
241 colnames(bug.closed.series) <- c("archived.bugs","year.week")
242 bug.closed.series[,week:=
243 gsub("(\\d+)-(\\d+)","\\2",year.week)]
244 bug.closed.series[,year:=
245 gsub("(\\d+)-(\\d+)","\\1",year.week)]
246 bug.closed.series[,doy:= as.numeric(week)*7]
247 bug.closed.series[,year.doy:=
248 paste(sep="-",year,doy)]
249 bug.closed.series[,date:=
250 as.POSIXct(strptime(year.doy,
253 # bug.closed.ts <- ts(bug.closed.series[,1],start=1,frequency=7)
255 print(ggplot(bug.closed.series[date > as.POSIXct(ISOdatetime(2008,1,1,0,0,0)),],
256 aes(x=date,y=archived.bugs/7))+geom_line()+stat_smooth(method="lm")+
257 ylab("Bugs archived Per Day")+xlab("Time"))
258 bugs.closed.per.day <-
259 bug.closed.series[,sum(archived.bugs)]/
260 as.numeric(bug.closed.series[nrow(bug.closed.series),date]-
261 bug.closed.series[1,date])
264 Roughly \Sexpr{format(bugs.closed.per.day,digits=1)} bugs are closed per day.
268 \begin{frame}{RC Bugs in the Past Year}
270 <<rc.bugs,fig=TRUE,echo=FALSE,warning=FALSE,cache.extra=file.info("data/rc_bugs.txt")[,"mtime"]>>=
272 data.table(read.table(file="data/rc_bugs.txt",
273 header=TRUE,fill=TRUE))
275 as.POSIXct(strptime(date,
276 format="%Y%m%d%H%M"))]
277 rc.bugs[,unknown:=NULL]
278 rc.bugs[,unknown.1:=NULL]
280 rc.bugs <- rc.bugs[c(0,diff(total)) > -1000,]
283 data.table(melt(rc.bugs,id="date"))
284 print(ggplot(rc.bugs.long[date >
285 as.POSIXct(ISOdatetime(2016,08,1,0,0,0)),]
286 ,aes(x=date,y=value,color=variable))+
288 ylab("# of Release Critical Bugs")+xlab("Time")+
289 theme(legend.position="top")+
290 scale_color_discrete("Measure"))
295 \section{Debbugs Structure and Infrastructure}
297 \subsection{BTS System Diagram}
298 \begin{frame}{BTS system Diagram}
300 \includegraphics[width=\textwidth,height=\textheight,keepaspectratio]{figures/bug_global_layout}
304 \subsection{Debbugs Box Diagram}
305 \begin{frame}{Debbugs Box Diagram}
307 \input{debbugs_layout}
311 \section{New Features}
313 \subsection{Database}
315 \subsubsection{Perl Database Infrastucture}
316 \begin{frame}{Perl Database Infrastructure}
319 \item DBIx::Class::Schema::Loader -- SQL schema to DBIx::Class
320 \item DBIx::Class::DeploymentHandler -- Upgrades of Schema
321 \item Debbugs::DB -- Debbugs SQL Module
326 \subsubsection{SQL Loading}
327 \begin{frame}[fragile]{SQL Loading}
332 debbugs-loadsql bugs;
333 debbugs-loadsql bugs archive;
335 \item Load Versioning information
337 debbugs-loadsql versions;
338 debbugs-loadsql debinfo;
343 \subsubsection{Fun Queries}
345 \begin{frame}[fragile]{Messages to bugs}
348 SELECT count(*),c.addr FROM
349 message_correspondent mc
350 JOIN correspondent c ON mc.correspondent=c.id
351 WHERE correspondent_type='from'
352 GROUP BY mc.correspondent,c.addr
353 ORDER BY count DESC LIMIT 5;
357 -------+---------------------------------
358 5123 | bubulle@debian.org
359 4346 | joeyh@debian.org
360 4214 | biebl@debian.org
361 3875 | tbm@cyrius.com
362 3632 | ftpmaster@ftp-master.debian.org
366 \begin{frame}[fragile]{Single-message correspondents}
369 SELECT count (*) FROM
370 (SELECT count(*),c.addr
371 FROM message_correspondent mc
372 JOIN correspondent c ON
373 mc.correspondent=c.id
374 WHERE correspondent_type='from'
375 GROUP BY mc.correspondent,
377 HAVING count(*) = 1) AS foo;
388 \begin{frame}[fragile]{More fun queries}
390 SELECT count(*),t.tag
392 JOIN bug_tag bt ON b.id=bt.bug
393 JOIN tag t on bt.tag=t.id
394 GROUP by bt.tag,t.tag
395 ORDER by count DESC LIMIT 5;
399 --------+----------------
404 25566 | fixed-upstream
408 \subsection{Database status caching}
409 \begin{frame}[fragile]{Status caching ``working''}
411 SELECT count(*),status
412 FROM bug_status_cache bsc
413 JOIN suite s ON bsc.suite=s.id
414 WHERE s.suite_name='unstable'
426 \subsection{Work still needed for SQL}
427 \begin{frame}{Work Still needed for SQL}
429 \item Integration into CGI (\texttt{bugreport.cgi} and
430 \texttt{pkgreport.cgi})
431 \item Database loading/update is slow in some cases
432 \item Some corrupted bugs have been exposed by the loading (#167851
433 and #280931); likely others
434 \item Testing (Mainly of queries)
439 \section{New(ish) Features}
441 \subsection{New Changes}
442 \begin{frame}{New Changes}
444 \column{0.5\textwidth}
446 \item Format-flowed messages are wrapped
447 \item https links everywhere
448 \item etag caching support everywhere
449 \item a11y (accessibility, ♿) tag
450 \item newcomer (⎈) tag
451 \item Usercategories now selectable (Categorize/order using)
453 \column{0.5\textwidth}
454 \includegraphics[width=\textwidth,keepaspectratio]{images/telegraph_bug}
458 \section{Contributing to Debbugs}
460 \begin{frame}{7 tasks seeking contributors}
462 \item Documentation of Usercategories
463 \item Implementation of rss feeds for packages and bugs
464 \item CGI options on pkgreport.cgi for usertags et al. \#536378)
465 \item Documentation of multiple-package reassign and when it or
466 affects should be used
467 \item Documentation for local-debbugs configuration file (behaves
472 \begin{frame}{Getting started on these tasks}
474 \item Upstream branches: \url{https://bugs.debian.org/debbugs-source/}
476 \item master (upstream debbugs): git clone \url{https://bugs.debian.org/debbugs-source/debbugs.git}
477 \item debian (debian branch): git clone -b debian \url{https://bugs.debian.org/debbugs-source/debbugs.git}
478 \item Checked out branches are also available at
479 \url{https://bugs.debian.org/debbugs-source/master} and
480 \url{https://bugs.debian.org/debbugs-source/debian}
482 \item My branches: \url{https://git.donarmstrong.com/debbugs.git}
483 \item Mailing list debian-debbugs@lists.debian.org
484 \item IRC \#debbugs or \#debian-bugs on irc.debian.org; I'm dondelelcaro
488 \begin{frame}[fragile]{Using \texttt{local-debbugs} to work on these tasks}
492 https://bugs.debian.org/debbugs-source/debbugs.git
495 ./bin/local-debbugs --mirror
497 ./bin/local-debbugs --daemon
498 # show some of my bugs (use your own search here)
499 ./bin/local-debbugs --search bugs.debian.org
501 ./bin/local-debbugs --stop
503 ./bin/local-debbugs --daemon
504 ./bin/local-debbugs --show 614351
508 \begin{frame}{The Debbugs Team}
516 \item Emeritus Developers
518 \item Steiner Gunderson
527 \begin{frame}{Questions?}
529 \includegraphics[height=0.8\textheight,keepaspectratio]{images/relevant_xkcd}