--- /dev/null
+\mode<presentation>
+{
+ \usetheme[hideallsubsections]{Hannover}
+ %\useoutertheme[hideallsubsections]{debiansidebar}
+ \setbeamercovered{transparent}
+}
+
+
+\usepackage{rotating}
+\usepackage{multirow}
+\usepackage[english]{babel}
+\usepackage[utf8x]{inputenc}
+\usepackage{ucs}
+\usepackage{textcomp}
+\usepackage[T1]{fontenc}
+\usepackage[draft]{fixme}
+\usepackage{amsfonts}
+\usepackage{wasysym}
+\usepackage{tikz}
+\usepackage[absolute,overlay]{textpos}
+\usepackage{hyperref}
+\usepackage[normalem]{ulem}
+\usepackage{Sweave}
+
+\logo{\includegraphics[width=2cm]{figures/openlogo.pdf}}
+\author{Don Armstrong}
+\title{Debbugs}
+\subtitle{New developments in the ongoing struggle against bugs}
+%\date{August 11th, 2008}
+\titlegraphic{\includegraphics[height=0.3\textheight,keepaspectratio]{figures/openlogo-crop.pdf}}
+\subject{BTS}
+
+% State of the BTS: new features, changes and tips
+%
+% The bug tracking system is where all bugs that affect Debian are
+% filed. New features, including the affects, summary, and local debbugs
+% mirror will be presented and demonstrated. Some of the underlying
+% architectural changes to the codebase in debbugs to make it more
+% maintainable and deployable are also outlined. Finally, a set of tips
+% and tricks that can be used to make the BTS easier to use are
+% presented.
+%
+% - New Features
+% - affects
+% - summary
+% - local debbugs mirror for offline work
+% - New SOAP
+% - full text search
+% - filtering bugs
+% - multi-distribution/arch status
+% - control changes at submit@ time
+% - Code Architecture Changes
+% - Modularization
+% - Control abstraction
+% - release to experimental
+
+
+<<load.libraries,echo=FALSE,results="hide",error=FALSE,message=FALSE>>=
+library(lattice)
+library(xtable)
+library(ggplot2)
+@
+
+
+\begin{document}
+
+%\setbeamercolor{frametitle}[bg=-red!90!green!10,fg=black]
+
+\frame[plain]{\titlepage
+ Source available at \url{http://git.donarmstrong.com/debbugs-presentations.git/}
+}
+
+% \begin{frame}{Debbugs}
+% \tableofcontents[subsectionstyle=hide]
+% \end{frame}
+
+\section{Introduction to Debbugs}
+
+\subsection{Introduction}
+\begin{frame}{Goals of this talk}
+ \begin{columns}
+ \column{0.5\textwidth}
+ \begin{itemize}
+ \item Introduction to Debbugs
+ \item New features
+ \item Tips and Tricks
+ \item Planned features
+ \item Places you can help
+ \end{itemize}
+ \column{0.5\textwidth}
+ \includegraphics[width=\textwidth,keepaspectratio]{figures/rc_buggy_big}
+ \end{columns}
+\end{frame}
+\begin{frame}{Goals of the BTS}
+ \begin{columns}
+ \column{0.4\textwidth}
+ \includegraphics[width=\textwidth,keepaspectratio]{figures/not_a_bug_but_a_feature}
+ \column{0.6\textwidth}
+ \begin{itemize}
+ \item Reporting of \only<1>{Features}\only<2>{Bugs}
+ \item Evolution of \only<1>{Features}\only<2>{Bugs}
+ \item Fixing of \only<1>{Features}\only<2>{Bugs}
+ \item Reducing impact of \only<1>{Features}\only<2>{Bugs}
+ \end{itemize}
+\end{columns}
+\end{frame}
+
+\subsection{Reporting, Tracking, and Fixing Bugs}
+\begin{frame}{How many bugs do we have?}
+ \begin{center}
+ \only<1>{\includegraphics[width=\textwidth,height=0.4\textheight,keepaspectratio]{figures/politicial_pictures_bill_gates_list_bugs}}
+ \only<2>{
+<<bug.growth,fig=TRUE,echo=FALSE,fig.width=6,fig.height=6>>=
+bug.growth <- read.table("data/sorted_bug_growth_for_r_every_500.txt",stringsAsFactors=FALSE);
+colnames(bug.growth) <- c("time","bugs")
+bug.growth <- bug.growth[pmax(bug.growth$bugs) <= as.numeric(bug.growth$bugs),]
+bug.growth$date <-
+ as.POSIXct(ISOdatetime(1970,1,1,0,0,0)+as.numeric(bug.growth$time))
+print(ggplot(bug.growth[bug.growth$date > as.POSIXct(ISOdatetime(2005,1,1,0,0,0)),],aes(x=date,y=bugs))+
+ xlab("Time")+ylab("Bugs filed in Debian")+
+ geom_point()+stat_smooth(method="lm")+
+ ggtitle("Bug growth versus time"))
+@
+}
+\end{center}
+\end{frame}
+
+\begin{frame}
+ \begin{center}
+<<bugs.filed,fig=TRUE,echo=FALSE,fig.width=6,fig.height=6>>=
+print(ggplot(bug.growth[bug.growth$date > as.POSIXct(ISOdatetime(2013,1,1,0,0,0)),],aes(x=date,y=bugs))+
+ xlab("Time")+ylab("Bugs filed in Debian")+
+ geom_point()+stat_smooth(method="lm")+
+ ggtitle("Christian Perrier's Plot"))
+bugs.filed.per.day <-
+ lm(bugs~date,bug.growth)$coeff[2]*3600*24
+@
+\end{center}
+We average roughly \Sexpr{format(bugs.filed.per.day,digits=1)} bugs filed per day.
+\end{frame}
+
+
+\begin{frame}
+ \begin{center}
+<<bugs.closed,fig=TRUE,echo=FALSE,width=7,height=5>>=
+bug.closed.series <- read.table("data/bug_closed_time_series.txt")
+bug.closed.ts <- ts(bug.closed.series,start=1,frequency=7)
+plot(bug.closed.ts,xlab="Weeks since 2008",ylab="Bugs archived per week",main="Bug closure rate over time")
+lines(loess.smooth(1:NROW(bug.closed.ts),bug.closed.ts),col="red",lwd=2)
+bugs.closed.per.day <- mean(bug.closed.ts)
+@
+ \end{center}
+We close roughly \Sexpr{format(bugs.closed.per.day,digits=1)} bugs per day.
+\end{frame}
+
+\begin{frame}
+ \begin{center}
+<<rc.bugs,fig=TRUE,echo=FALSE,width=7,height=7>>=
+rc.bugs <-
+ read.table(file="data/rc_bugs.txt",
+ header=1)
+rc.bugs <- data.frame(rc.bugs)
+rc.bugs <- rc.bugs[,c(-5,-7)]
+rc.bugs$date <-
+ as.POSIXct(strptime(rc.bugs$date,
+ format="%Y%m%d%H%M"))
+rc.bugs.long <-
+ reshape(rc.bugs,
+ direction="long",
+ idvar="date",
+ timevar="type",
+ times=colnames(rc.bugs)[-1],
+ varying=colnames(rc.bugs)[-1],
+ v.names="bugs")
+complicated.figure <-
+ xyplot(bugs~date,groups=type,type='l',main="RC Bugs in the past year",
+ rc.bugs.long[rc.bugs.long$date >
+ strptime("2009-08-01",
+ format="%Y-%m-%d"),],
+ auto.key=list(space="bottom"))
+print(complicated.figure)
+@
+\end{center}
+ \setbeamercolor{postit}{fg=black,bg=yellow}
+ \begin{textblock}{4}(6,4)
+ \begin{onlyenv}<2>
+ \begin{beamercolorbox}[sep=1em,wd=5cm]{postit}
+ \centering \huge Too many RC bugs!
+ \end{beamercolorbox}
+ \end{onlyenv}
+ \end{textblock}
+
+\end{frame}
+
+\subsection{Debbugs Structure and Infrastructure}
+
+\begin{frame}{BTS system Diagram}
+ \begin{center}
+ \includegraphics[width=\textwidth,height=\textheight,keepaspectratio]{figures/bug_global_layout}
+ \end{center}
+\end{frame}
+
+\begin{frame}{Debbugs Box Diagram}
+ \begin{center}
+ \input{debbugs_layout}
+ \end{center}
+\end{frame}
+
+
+\section{New(ish) Features}
+\begin{frame}{New Changes}
+ \begin{itemize}
+ \item CVE linkified (eg, \href{http://bugs.debian.org/570743}{\#570743})
+ \item status caching
+ \item reverse status lookup
+ \item forcemerge does the right thing
+ \end{itemize}
+\end{frame}
+
+\begin{frame}{Status Caching}
+ \begin{itemize}
+ \item Cache status of bugs (presence/absence at all distributions)
+ \item Speed up display of \url{http://bugs.debian.org/src:linux-2.6}
+ \item Allows for reverse status lookup
+ \begin{itemize}
+ \item Enables finding bugs which are present in testing or unstable
+ \item Eventually replace functionality of \url{bts.turmzimmer.net}
+ \end{itemize}
+ \end{itemize}
+\end{frame}
+
+\subsection{Affects}
+\begin{frame}{Affects}
+ \begin{itemize}
+ \item Bugs in Package A causes problem in package B
+ \item Reduce duplicates filed in package B by showing bug in package
+ B's list
+ \item \url{http://www.debian.org/Bugs/server-control\#affects}
+ \item \texttt{bts affects 12345 foopkg;}
+ \end{itemize}
+\end{frame}
+
+\begin{frame}{Affects: Implemented}
+ \includegraphics[width=\textwidth,height=\textheight,keepaspectratio]{figures/affects}
+\end{frame}
+
+\subsection{Summary}
+
+\begin{frame}{Summary}
+ \begin{itemize}
+ \item Short indication of what the bug was about
+ \item Long discussion, summarized into a single paragraph
+ \item Extract the first non-control, non-psuedoheader, non-quoted
+ paragraph from a nominated message
+ \item \url{http://www.debian.org/Bugs/server-control\#summary}
+ \item \texttt{bts summary 12345 30}
+ \end{itemize}
+\end{frame}
+
+\begin{frame}{Summary: Implemented}
+ \includegraphics[width=\textwidth,height=\textheight,keepaspectratio]{figures/summary}
+\end{frame}
+
+
+\subsection{Local Mirror}
+
+\begin{frame}{local-debbugs}
+ \begin{itemize}
+ \item Ability to run a full local copy of debbugs
+ \item Select bugs interested in based on a configurable query
+ \item By default selects unarchived bugs
+ \begin{itemize}
+ \item In maintained packages
+ \item Correspondend with
+ \item Submitted
+ \item RC
+ \end{itemize}
+ \item Currently takes about 2G for me (most of which is indixes)
+ \item Part of experimental debbugs package (in the archive)
+ \end{itemize}
+\end{frame}
+
+\begin{frame}{local-debbugs demo}
+ \begin{itemize}
+ \item Update mirror: \texttt{local-debbugs \--\--mirror}
+ \item Start daemon: \texttt{local-debbugs \--\--daemon}
+ \item See bug \#441151: \texttt{local-debbugs \--\--show 441151}
+ \item See bugs in lilypond: \texttt{local-debbugs \--\--search lilypond}
+ \item See critical bugs: \texttt{local-debbugs \--\--search severity:critical}
+ \end{itemize}
+\end{frame}
+
+\begin{frame}{local-debbugs issues}
+ \begin{columns}
+ \column{0.5\textwidth}
+ \begin{itemize}
+ \item Suboptimal missing bug handling
+ \item Size of mirror large
+ \item Could be faster to sync
+ \item Needs better documentation
+ \end{itemize}
+ \column{0.5\textwidth}
+ \includegraphics[width=\textwidth,keepaspectratio]{figures/happy_bug}
+ \end{columns}
+\end{frame}
+
+
+
+%\subsection{More SOAP}
+
+
+
+% \section{Tips and Tricks}
+% % - Tips and Tricks
+%
+% % - Full text search
+% \begin{frame}{Full Text Search}
+% \begin{itemize}
+% \item Using HyperEstraier
+% \item \url{http://bugs.debian.org/cgi-bin/search.cgi}
+% \item Searching for ``lp0 on fire''
+% \item Searching for memory leaks in iceweasel
+% \end{itemize}
+% \end{frame}
+%
+% % - Using the new options limits
+% \begin{frame}{CGI Options}
+% \begin{itemize}
+% \item Bugs in debbugs which aren't tagged pending or wontfix owned by me
+% \item Bugs in debbugs tagged help
+% \item Bugs in debbugs whose title mentions cgi
+% \end{itemize}
+% \end{frame}
+
+% \begin{frame}{Silly Symbols}
+% \begin{tabular}{c c c c}
+% Merged & = & Fixed Versions & \smiley \\
+% Blocked & ♙ & Blocks & ♔ \\
+% Forwarded & ↝ & Archived & ♲ \\
+% Affects & ☣ & wontfix & \frownie \\
+% patch & + & moreinfo & M \\
+% unreproducible & R & security & S \\
+% pending & P & fixed & F \\
+% help & H & fixed-upstream & U \\
+% upstream & u & & \\
+% \end{tabular}
+% \end{frame}
+
+\begin{frame}{Silly Symbols}
+ \begin{center}
+ \begin{tabular}{c c c c}
+ Merged & = & Fixed Versions & \smiley \\
+ Blocked & \includegraphics[height=0.5cm,keepaspectratio]{figures/blocked} & Blocks & \includegraphics[height=0.5cm,keepaspectratio]{figures/blocks} \\
+ Forwarded & ↝ & Archived & \includegraphics[height=0.5cm,keepaspectratio]{figures/archived} \\
+ Affects & \includegraphics[height=0.5cm,keepaspectratio]{figures/affects_icon} & wontfix & \frownie \\
+ patch & + & moreinfo & M \\
+ unreproducible & R & security & S \\
+ pending & P & fixed & F \\
+ help & H & fixed-upstream & U \\
+ upstream & u & & \\
+ \end{tabular}
+\end{center}
+\end{frame}
+
+\section{Planned features}
+
+\begin{frame}{Planned features}
+ \begin{itemize}
+ \item<alert@2> Control Commands in Submit
+ \item<3-> Mail to nnn@bugs.debian.org goes to submitter
+ \item<4-> Uservalues
+ \item<6-> b.d.o/libc6 $\rightarrow$ b.d.o/src:eglibc
+ \begin{itemize}
+ \item<6-> in future, make binary-only views more difficult to get (?)
+ \end{itemize}
+ \end{itemize}
+
+ \definecolor{peach}{rgb}{1,0.9,0.7}
+ \setbeamercolor{controlcmd}{fg=black,bg=peach}
+ \begin{textblock}{6}(7,7)
+ \begin{onlyenv}<2>
+ \begin{beamercolorbox}[sep=1em,wd=5.5cm]{controlcmd}
+ \begin{tabular}{l}
+ To: submit@bugs.debian.org\\
+ From: foo@example.com\\
+ \\
+ Package: blah\\
+ Control: user foo@debian.org\\
+ Control: usertag 0 bleargh\\
+ Control: clone 0 -1\\
+ Control: reassign -1 blah\\
+ \end{tabular}
+ \end{beamercolorbox}
+ \end{onlyenv}
+ \begin{onlyenv}<5>
+ \begin{beamercolorbox}[sep=1em,wd=5.5cm]{controlcmd}
+ \begin{tabular}{l}
+ To: control@bugs.debian.org\\
+ From: foo@example.com\\
+ \\
+ user foo@debian.org\\
+ uservalue 12345 priority 30\\
+ uservalue 12345 vcs-commit \textbackslash \\
+ \ http://q.fr/b/r1432 \\
+ uservalue 12345 difficulty 10\\
+ \end{tabular}
+ \end{beamercolorbox}
+ \end{onlyenv}
+ \end{textblock}
+\end{frame}
+
+\begin{frame}{More planned features}
+ \begin{columns}
+ \column{0.5\textwidth}
+ \begin{itemize}
+ \item Merging of merged bug reports
+ \item Threading in report
+ \item Usercategory duplication and replay
+ \item Remote Attachments
+ \item New Spool Storage Format
+ \item Backend index using postgresql
+ \item Usertags visibility
+ \item Smarter CGI options
+ \end{itemize}
+ \column{0.5\textwidth}
+ \includegraphics[width=\textwidth,keepaspectratio]{figures/oh_hai_bug}
+ \end{columns}
+\end{frame}
+
+\begin{frame}{Statistics}
+% \begin{columns}
+% \column{0.5\textwidth}
+% \column{0.5\textwidth}
+ \begin{itemize}
+ \item Track status changes over time
+ \item Bugs found/fixed/absent in stable/testing/unstable over time
+ \item Bug submission times
+ \item Bug closure times
+ \item Bug mail rates
+ \item Per package, severity, maintainer tracking of the above
+ \end{itemize}
+ \begin{center}
+ \includegraphics[width=\textwidth,height=0.35\textheight,keepaspectratio]{figures/surprised_bugs_life}
+ \end{center}
+% \end{columns}
+\end{frame}
+
+
+\begin{frame}{Action Required Sorting}
+ \begin{center}
+ \begin{tabular}{c | c | c}
+ & Care about & Don't care \\
+ \hline
+ \multirow{3}{*}{\begin{sideways}\parbox{12mm}{Triage}\end{sideways}} & No response & Active responses \\
+ & Ancient found versions & found in multiple versions \\
+ & Incomplete report & Complete report \\
+ \hline
+ \multirow{3}{*}{\begin{sideways}\parbox{12mm}{Maint.}\end{sideways}} & has a patch & pending/fixed \\
+ & moreinfo+response & just moreinfo \\
+ & high priority & wontfix \\
+ \hline
+ \multirow{3}{*}{\begin{sideways}\parbox{12mm}{Submit.}\end{sideways}} &
+ moreinfo & moreinfo+response \\
+ & mail from maintainer & no response \\
+ & bug is fixed & bug isn't fixed \\
+ \end{tabular}
+ \end{center}
+ \begin{itemize}
+ \item Sorting by a combination of priority and action required
+ \item Minimize time wasted finding a bug
+ \item Maximize productivity
+ \end{itemize}
+ \end{frame}
+
+
+\subsection{Upstream and Downstream Integration}
+
+\begin{frame}
+ \begin{itemize}
+ \item Sharing state between upstream, downstream and sidestream
+ \item Sharing comments between the same
+ \item Distributed bug tracking
+ \item Distributed version/commit tracking
+ \end{itemize}
+\end{frame}
+
+
+\section{Places you can help}
+
+\begin{frame}{\sout{5} \sout{6} 7 tasks seeking contributors}
+ \begin{itemize}
+ \item Documentation of Usercategories
+ \item Implementation of rss feeds for packages and bugs
+ \item CGI options on pkgreport.cgi for usertags et al. \#536378)
+ \item Documentation of multipe-package reassign and when it or
+ affects should be used
+ \item Mailto link with subject, references, etc. all filled in
+ \item Documentation for local-debbugs configuration file (behaves
+ like bts select)
+ \end{itemize}
+\end{frame}
+
+\begin{frame}{Getting started on these tasks}
+ \begin{itemize}
+ \item Upstream branches: \url{http://bugs.debian.org/debbugs-source/}
+ \begin{itemize}
+ \item mainline (upstream debbugs): bzr clone \url{http://bugs.debian.org/debbugs-source/mainline}
+ \item debian (debian branch): bzr clone \url{http://bugs.debian.org/debbugs-source/debian}
+ \end{itemize}
+
+ \item My branches: \url{http://bzr.donarmstrong.com/debbugs/branches}
+ \item Mailing list debian-debbugs@lists.debian.org
+ \item IRC \#debbugs or \#debian-bugs on irc.debian.org; I'm dondelelcaro
+ \end{itemize}
+\end{frame}
+
+\begin{frame}{Setting up a BTS mirror for development}
+ \begin{itemize}
+ \item \url{http://svn.donarmstrong.com/don/trunk/projects/debbugs/local_mirror.sh}
+ \begin{itemize}
+ \item Set SPOOL and VERSIONS appropriately
+ \item mkdir -p /path/to/spool/{db-h,archive} /path/to/versions;
+ \item touch /path/to/spool/by-reverse.idx
+ \end{itemize}
+ \item \url{http://svn.donarmstrong.com/don/trunk/projects/debbugs/setup_config.sh}
+ \begin{itemize}
+ \item<2> Will exist suddenly (not there now)
+ \end{itemize}
+ \end{itemize}
+\end{frame}
+
+
+% - Tips and Tricks
+% - Full text search
+% - Using the new options limits
+% - Usertags
+% - Getting users to triage their bugs
+
+
+% * Overview of how the BTS works
+% o process, service
+% o web frontends
+% o soap, etc.
+% * New features
+% o user values
+% o action-required sorting (maintainer and submitter views)
+% + priority sorting (uservalue)
+% o merging of merged bug reports and threaded view
+% o control in messages to submit@ and nnn@
+% o usertag/uservalue/usercategory duplication/replay
+% o rss feeds for packages and bugs
+% o remote attachments
+% o new spool storage format
+% o better statistics
+% * Old features that may be unfamiliar
+% o fun with bts select
+% o full text searching with HE
+% o local-debbugs
+% * A bald plea for more assistance
+
+
+
+% Bugs the BoF
+%
+% Upcoming improvements:
+%
+% * control@ commands in submit
+% * status caching
+% * reverse status lookup
+% * forcemerge
+% * b.d.o/libc6 -> b.d.o/src:eglibc
+%
+%
+% Proposed To-do:
+%
+% * web-based mail submission
+% ** needed due to blocking of port 25
+%
+% * queue runs
+% ** cannot be synchronous
+% ** but may run queue on demand
+%
+% * per-arch buildd tags (or pseudopackages)
+%
+% * search by uploader
+%
+%
+% Other technical suggestions:
+%
+% * notification to blockees when blocking bugs are killed off
+% * documentation consistency? (e.g. reassign; could use clarification)
+% ** response: needs love; currently in WML
+%
+% Social Improvements:
+%
+% * Better statistics
+% ** Tells us:
+% *** What packagers need help
+% *** Which bug triagers should be recognized. Currently these people
+% receive no recognition; would like to encourage them to continue
+% this work.
+%
+% Discussion - whether mass-filed bugs should be included?
+%
+% * Common triager mistake: emailing the bug number instead of the submitter.
+% Don: Plan to address this via the reply list.
+%
+% Please configure mailing list subscriptions not to bounce/spam the owner.
+%
+% Q: Limit on size of attachments to BTS? ~200MB
+%
+% Idea: RFC exists that supports remote/offline attachments.
+%
+% How to perform debbugs development?
+% * see debbugs-local package
+% * can rsync the entire bugs database to local box
+% * apache configuration simple, mail setup somewhat more involved
+% * help: debbugs@l.d.o, #debbugs
+% * code is in bzr
+% ** see armstrong branches for work in progress
+%
+% How do you use the BTS?
+%
+% Problems:
+% * 200-300 open bugs: difficult to keep track of bugs already seen
+% * idea: improve documentation regarding user-tags/categorization features
+% * idea: display of possible set of user-tags via JavaScript - "make user-tags pretty"
+% * idea: user authention to allow management of tags
+%
+% * switch index from flat-files to Postgres; borrow from UDD
+%
+% Q: Complaints regarding email addresses on webpage. Should we obfuscate these?
+% ** Is there any hard data on which types of obfuscation work?
+% ** Can we blackhole robots? Use a honeypot? Issue is that bugs are
+% archives to the ML. Discussion around configuration on Ian Jackson's
+% site.
+%
+% Q: List of needs for new debbugs contributors?
+% * See how to help on the wiki.
+%
+% Q: Can you get a list of user-tags for an email address w/out the bug reports?
+% * Should be pretty easy. May be a patch for comand-line 'bts' tool in devscripts.
+%
+% What's next?
+%
+% Slides: http://svn/donarmstrong.com/don/trunk/projects/debian/debconf10/bugs_the_bof/
+% Contact Don with questions.
+%
+%
+% For spam questions, reach out to Blars Blarson
+
+\begin{frame}{The Debbugs Team}
+ \begin{itemize}
+ \item Current team
+ \begin{itemize}
+ \item Don Armstrong
+ \item Blars Blarson
+ \item Colin Watson
+ \end{itemize}
+ \item Emeritus Developers
+ \begin{itemize}
+ \item Steiner Gunderson
+ \item Adam Heath
+ \item Josip Rodin
+ \item Anthony Towns
+ \end{itemize}
+ \item You!
+ \end{itemize}
+\end{frame}
+\end{document}
+
+
--- /dev/null
+\pgfdeclarelayer{background layer}
+\pgfsetlayers{background layer,main}
+
+
+
+
+\begin{tikzpicture}
+ \tikzstyle{getstyle}=[fill opacity=1,draw opacity=1]
+ \tikzstyle{programnode}=[minimum height=0.75cm, text width=2cm, text centered, draw=black,fill opacity=0.8];
+ \useasboundingbox (0,-4) rectangle (10,3);
+ %\draw (8,2.5) node[name=keywords,style=programnode,anchor=west,text width=2cm,fill=yellow!90] {\small Keywords};
+ \draw (2,1) node[name=mail_in,style=programnode,style=getstyle,anchor=west,fill=blue!60] {\small Mail In};
+ \draw (2,0) node[name=spamscan,style=programnode,style=getstyle,anchor=west,fill=green!60] {\small spamscan};
+ \draw (2,0) node[name=spam,style=programnode,style=getstyle,anchor=west,fill=red!60] {\small spam};
+ \draw (2,-1) node[name=processall,style=programnode,style=getstyle,anchor=west,fill=green!60] {\small processall};
+ \draw (0.75,-2) node[name=service,style=programnode,style=getstyle,anchor=west,fill=green!60] {\small service};
+ \draw (3.25,-2) node[name=process,style=programnode,style=getstyle,anchor=west,fill=green!60] {\small process};
+ \draw[style=getstyle,-stealth,line width = 1pt] (mail_in.-90) -- (spamscan.90);
+ \draw[style=getstyle,-stealth,line width = 1pt] (spamscan.-90) -- (processall.90);
+ \draw[style=getstyle,-stealth,line width = 1pt] (processall.-120) -- (service.60);
+ \draw[style=getstyle,-stealth,line width = 1pt] (processall.-60) -- (process.60);
+
+ \draw (6,-2) node[name=db-h,style=programnode,style=getstyle,anchor=west,fill=yellow!60] {\small db-h};
+ \draw[style=getstyle,-stealth,line width = 1pt] (process.-90) |- (6.9,-2.75) -- (db-h.-120);
+ \draw[style=getstyle,-stealth,line width = 1pt] (service.-90) |- (7.35,-3) -- (db-h.-60);
+ \draw (6,-1) node[name=indexes,style=programnode,style=getstyle,anchor=west,fill=yellow!60] {\small indexes};
+ \draw[style=getstyle,-stealth,line width = 1pt] (db-h.90) -- (indexes.-90);
+ \draw (6,0) node[name=cgi,style=programnode,style=getstyle,anchor=west,fill=blue!20] {\small cgi/...};
+ \draw[style=getstyle,-stealth,line width = 1pt] (indexes.90) -- (cgi.-90);
+
+
+ % \draw (2,1) node[name=parse_ncbi,style=programnode,style=parsestyle,anchor=west,fill=red!60] {\small parse\_ncbi\_results};
+ % \draw (2,0) node[name=parse_genecard,style=programnode,style=parsestyle,anchor=west,fill=red!60] {\small parse\_genecard\_results};
+ % \draw (2,-1) node[name=parse_harvester,style=programnode,style=parsestyle,anchor=west,fill=red!60] {\small parse\_harvester\_results};
+ % \draw[-stealth,style=parsestyle,line width = 1pt] (get_harvester) -- (parse_harvester);
+ % \draw[-stealth,style=parsestyle,line width = 1pt] (get_ncbi) -- (parse_ncbi);
+ % \draw[-stealth,style=parsestyle,line width = 1pt] (get_genecard) -- (parse_genecard);
+ % \draw (1,0) node[name=combine_results,style=programnode,style=combinestyle,anchor=center,fill=green!40,rotate=90,text width=3cm] {\small combine\_results};
+ % \draw[-stealth,style=combinestyle,line width = 1pt] (parse_harvester.west) -- (combine_results);
+ % \draw[-stealth,style=combinestyle,line width = 1pt] (parse_ncbi.west) -- (combine_results);
+ % \draw[-stealth,style=combinestyle,line width = 1pt] (parse_genecard.west) -- (combine_results);
+ %
+ % \draw (2,-2) node[name=expert_judgement,style=programnode,style=expertstyle,anchor=west,fill=blue!20!red!20] {\small Expert Information};
+ % \draw[-stealth,line width = 2pt,style=expertstyle] (combine_results.north) -| (0.25,-2) -- (expert_judgement.west);
+ %
+ % \draw (7,-2) node[name=snp_selection,style=programnode,style=snpselectionstyle,anchor=west,fill=blue!20!red!20] {\small SNP Selection};
+ % \draw[-stealth,style=snpselectionstyle,line width = 1pt] (expert_judgement) -- (snp_selection);
+\end{tikzpicture}
+
+% Use only<>{} to get the above to change appropriately
\ No newline at end of file