Commit b85b82f01201a8ddf930c2491d8ed87292af6814

Authored by Paulo Meireles
1 parent 7232b692

Formating according to SBC template for SBQS 2017

sbqs2017/Makefile 0 → 100755
... ... @@ -0,0 +1,15 @@
  1 +TARGET=spb
  2 +
  3 +all: $(TARGET).tex
  4 + pdflatex $(TARGET).tex
  5 + bibtex $(TARGET)
  6 + pdflatex $(TARGET).tex
  7 + pdflatex $(TARGET).tex
  8 + evince $(TARGET).pdf &
  9 +
  10 +edit:
  11 + gedit Makefile *.bib *.tex &
  12 +
  13 +clean:
  14 + rm -f $(TARGET).pdf *.out *.aux *.log *.blg *.bbl *.dvi *.ps *.toc *.lot *.lof *.idx *~
  15 +
... ...
sbqs2017/caption2.sty 0 → 100644
... ... @@ -0,0 +1,406 @@
  1 +%%
  2 +%% This is file `caption2.sty',
  3 +%% generated with the docstrip utility.
  4 +%%
  5 +%% The original source files were:
  6 +%%
  7 +%% caption2.dtx (with options: `package')
  8 +%%
  9 +%% Copyright (C) 1994-2002 Axel Sommerfeldt (caption@sommerfeldt.net)
  10 +%%
  11 +%% --------------------------------------------------------------------------
  12 +%%
  13 +%% It may be distributed and/or modified under the
  14 +%% conditions of the LaTeX Project Public License, either version 1.2
  15 +%% of this license or (at your option) any later version.
  16 +%% The latest version of this license is in
  17 +%% http://www.latex-project.org/lppl.txt
  18 +%% and version 1.2 or later is part of all distributions of LaTeX
  19 +%% version 1999/12/01 or later.
  20 +%%
  21 +\NeedsTeXFormat{LaTeX2e}[1994/12/01]
  22 +\ProvidesPackage{caption2}
  23 + [2002/08/03 v2.1 Customising captions (AS)]
  24 +\newcommand*\captionfont{}
  25 +\newcommand*\captionlabelfont{}
  26 +\newcommand*\captionlabeldelim{}
  27 +\newcommand*\captionlabelsep{}
  28 +\newcommand*\captionsize{}
  29 +\newdimen\captionmargin
  30 +\newdimen\captionwidth
  31 +\newif\ifcaptionwidth
  32 +\newdimen\captionindent
  33 +\newif\ifcaptionlabel\captionlabeltrue
  34 +\newif\ifonelinecaptions
  35 +\newif\ifignoreLTcapwidth
  36 +\newcommand*\setcaptionmargin{%
  37 + \captionwidthfalse
  38 + \setlength\captionmargin}
  39 +\newcommand*\setcaptionwidth{%
  40 + \captionwidthtrue
  41 + \setlength\captionwidth}
  42 +\newcommand*\normalcaptionparams{%
  43 + \let\captionsize\@empty
  44 + \renewcommand*\captionfont{\captionsize}%
  45 + \let\captionlabelfont\@empty%
  46 + \renewcommand*\captionlabeldelim{:}%
  47 + \renewcommand*\captionlabelsep{\space}%
  48 + \setcaptionmargin\z@\setlength\captionindent\z@
  49 + \onelinecaptionstrue}
  50 +\newcommand*\caption@eh{%
  51 + If you do not understand this error, please take a closer look\MessageBreak
  52 + at the documentation of the `caption2' package.\MessageBreak
  53 + \@ehc}
  54 +\newcommand*\defcaptionstyle[1]{%
  55 + \@namedef{caption@@#1}}
  56 +\newcommand*\newcaptionstyle[1]{%
  57 + \expandafter\ifx\csname caption@@#1\endcsname\relax
  58 + \expandafter\defcaptionstyle
  59 + \else
  60 + \PackageError{caption2}{Caption style `#1' already defined}{\caption@eh}%
  61 + \expandafter\@gobbletwo
  62 + \fi
  63 + {#1}}
  64 +\newcommand*\renewcaptionstyle[1]{%
  65 + \expandafter\ifx\csname caption@@#1\endcsname\relax
  66 + \PackageError{caption2}{Caption style `#1' undefined}{\caption@eh}%
  67 + \expandafter\@gobbletwo
  68 + \else
  69 + \expandafter\defcaptionstyle
  70 + \fi
  71 + {#1}}
  72 +\newcommand*\dummycaptionstyle[2]{%
  73 + \defcaptionstyle{#1}{%
  74 + \expandafter\ifx\csname caption@@\caption@style\expandafter\endcsname%
  75 + \csname caption@@#1\endcsname
  76 + \PackageError{caption2}{You can't use the caption style `#1' directy}{%
  77 + The caption style `#1' is only a dummy and does not really exists.%
  78 + \MessageBreak You have to redefine it (with \protect\renewcaptionstyle)
  79 + before you can select\MessageBreak it with \protect\captionstyle.
  80 + \space\caption@eh}%
  81 + \else
  82 + #2\usecaptionstyle{\caption@style}%
  83 + \fi}}
  84 +\newcaptionstyle{normal}{\caption@makecaption{normal}}
  85 +\newcaptionstyle{center}{\caption@makecaption{center}}
  86 +\newcaptionstyle{centerlast}{\caption@makecaption{centerlast}}
  87 +\newcaptionstyle{flushleft}{\caption@makecaption{flushleft}}
  88 +\newcaptionstyle{flushright}{\caption@makecaption{flushright}}
  89 +\newcaptionstyle{hang}{\caption@makecaption{hang}}
  90 +\newcaptionstyle{hang+center}{\caption@makecaption{hang@center}}
  91 +\newcaptionstyle{hang+centerlast}{\caption@makecaption{hang@centerlast}}
  92 +\newcaptionstyle{hang+flushleft}{\caption@makecaption{hang@flushleft}}
  93 +\newcaptionstyle{indent}{\caption@makecaption{indent}}
  94 +\newcommand*\captionstyle[1]{%
  95 + \expandafter\ifx\csname caption@@#1\endcsname\relax
  96 + \PackageError{caption2}{Undefined caption style `#1'}{\caption@eh}%
  97 + \else
  98 + \def\caption@style{#1}%
  99 + \fi}
  100 +\DeclareOption{normal}{\captionstyle{normal}}
  101 +\DeclareOption{center}{\captionstyle{center}}
  102 +\DeclareOption{centerlast}{\captionstyle{centerlast}}
  103 +\DeclareOption{flushleft}{\captionstyle{flushleft}}
  104 +\DeclareOption{flushright}{\captionstyle{flushright}}
  105 +\DeclareOption{anne}{\ExecuteOptions{centerlast}}
  106 +\DeclareOption{hang}{\captionstyle{hang}}
  107 +\DeclareOption{hang+center}{\captionstyle{hang+center}}
  108 +\DeclareOption{hang+centerlast}{\captionstyle{hang+centerlast}}
  109 +\DeclareOption{hang+flushleft}{\captionstyle{hang+flushleft}}
  110 +\DeclareOption{isu}{\ExecuteOptions{hang}}
  111 +\DeclareOption{indent}{\captionstyle{indent}}
  112 +\DeclareOption{scriptsize}{\g@addto@macro\captionsize\scriptsize}
  113 +\DeclareOption{footnotesize}{\g@addto@macro\captionsize\footnotesize}
  114 +\DeclareOption{small}{\g@addto@macro\captionsize\small}
  115 +\DeclareOption{normalsize}{\g@addto@macro\captionsize\normalsize}
  116 +\DeclareOption{large}{\g@addto@macro\captionsize\large}
  117 +\DeclareOption{Large}{\g@addto@macro\captionsize\Large}
  118 +\DeclareOption{up}{\g@addto@macro\captionlabelfont\upshape}
  119 +\DeclareOption{it}{\g@addto@macro\captionlabelfont\itshape}
  120 +\DeclareOption{sl}{\g@addto@macro\captionlabelfont\slshape}
  121 +\DeclareOption{sc}{\g@addto@macro\captionlabelfont\scshape}
  122 +\DeclareOption{md}{\g@addto@macro\captionlabelfont\mdseries}
  123 +\DeclareOption{bf}{\g@addto@macro\captionlabelfont\bfseries}
  124 +\DeclareOption{rm}{\g@addto@macro\captionlabelfont\rmfamily}
  125 +\DeclareOption{sf}{\g@addto@macro\captionlabelfont\sffamily}
  126 +\DeclareOption{tt}{\g@addto@macro\captionlabelfont\ttfamily}
  127 +\DeclareOption{oneline}{\onelinecaptionstrue}
  128 +\DeclareOption{nooneline}{\onelinecaptionsfalse}
  129 +\newcommand*\caption@package[1]{\@namedef{caption@pkt@#1}}
  130 +\DeclareOption{float}{\caption@twozerofalse\caption@package{float}{1}}
  131 +\DeclareOption{longtable}{\caption@twozerofalse\caption@package{longtable}{1}}
  132 +\DeclareOption{subfigure}{\caption@twozerofalse\caption@package{subfigure}{1}}
  133 +\DeclareOption{none}{\caption@twozerofalse
  134 + \caption@package{float}{0}\caption@package{longtable}{0}%
  135 + \caption@package{subfigure}{0}}
  136 +\DeclareOption{all}{\ExecuteOptions{float,longtable,subfigure}}
  137 +\DeclareOption{ruled}{}
  138 +\DeclareOption{ignoreLTcapwidth}{\ignoreLTcapwidthtrue}
  139 +\DeclareOption{debug}{\caption@debugtrue}
  140 +\newif\ifcaption@debug
  141 +\newif\ifcaption@twozero
  142 +\normalcaptionparams
  143 +\ExecuteOptions{none,normal}
  144 +\caption@twozerotrue
  145 +\ProcessOptions*
  146 +\ifcaption@twozero
  147 + \PackageInfo{caption2}{Running in caption2 v2.0 compatibility mode}
  148 +\fi
  149 +\def\captionof{\@ifstar{\caption@of{\caption*}}{\caption@of\caption}}
  150 +\newcommand*\caption@of[2]{\def\@captype{#2}#1}
  151 +\@ifundefined{abovecaptionskip}{%
  152 + \newlength\abovecaptionskip\setlength\abovecaptionskip{10\p@}}{}
  153 +\@ifundefined{belowcaptionskip}{%
  154 + \newlength\belowcaptionskip\setlength\belowcaptionskip{0\p@}}{}
  155 +\newdimen\captionlinewidth
  156 +\renewcommand\@makecaption[2]{%
  157 + \vskip\abovecaptionskip
  158 + \captionlinewidth\hsize
  159 + \def\captionlabel{#1}%
  160 + \def\captiontext{#2}%
  161 + \usecaptionstyle{\caption@style}%
  162 + \vskip\belowcaptionskip}
  163 +\newcommand*\usecaptionstyle[1]{%
  164 + \ifx\captiontext\relax
  165 + \PackageError{caption2}{You can't use \protect#1
  166 + in normal text}{The usage of \protect#1 is only
  167 + allowed inside code declared with\MessageBreak \protect\defcaptionstyle,
  168 + \protect\newcaptionstyle \space or \protect\renewcaptionstyle.
  169 + \space\caption@eh}
  170 + \else
  171 + \@ifundefined{caption@@#1}%
  172 + {\PackageError{caption2}{Caption style `#1' undefined}{\caption@eh}}%
  173 + {\@nameuse{caption@@#1}}
  174 + \fi}
  175 +\newcommand*\caption@makecaption[1]{%
  176 + \ifcaptionlabel
  177 + \def\caption@label{{\captionlabelfont\captionlabel\captionlabeldelim}\captionlabelsep}%
  178 + \else
  179 + \let\caption@label\@empty
  180 + \fi
  181 + \usecaptionmargin\captionfont
  182 + \onelinecaption{\caption@label\captiontext}%
  183 + {\@nameuse{caption@@@#1}}}
  184 +\newcommand*\caption@@@normal{%
  185 + \caption@label\captiontext\par}
  186 +\newcommand*\caption@@@center{%
  187 + \centering\caption@label\captiontext\par}%
  188 +\newcommand*\caption@centerlast{%
  189 + \advance\leftskip by 0pt plus 1fil%
  190 + \advance\rightskip by 0pt plus -1fil%
  191 + \parfillskip0pt plus 2fil\relax}
  192 +\newcommand*\caption@@@centerlast{%
  193 + \caption@centerlast\caption@label\captiontext\par}
  194 +\newcommand*\caption@@@flushleft{%
  195 + \raggedright\caption@label\captiontext\par}%
  196 +\newcommand*\caption@@@flushright{%
  197 + \raggedleft\caption@label\captiontext\par}%
  198 +\newcommand*\caption@@@hang{%
  199 + \sbox\@tempboxa{\caption@label}%
  200 + \hangindent\wd\@tempboxa\noindent
  201 + \usebox\@tempboxa\caption@hangplus\captiontext\par}
  202 +\newcommand*\caption@hangplus{}
  203 +\newcommand*\caption@@@hang@center{%
  204 + \let\caption@hangplus\centering\caption@@@hang}
  205 +\newcommand*\caption@@@hang@centerlast{%
  206 + \let\caption@hangplus\caption@centerlast\caption@@@hang}
  207 +\newcommand*\caption@@@hang@flushleft{%
  208 + \let\caption@hangplus\raggedright\caption@@@hang}
  209 +\newcommand*\caption@@@indent{%
  210 + \hangindent\captionindent\noindent
  211 + \caption@label\captiontext\par}
  212 +\newcommand\onelinecaption[1]{%
  213 + \let\next\@firstofone
  214 + \ifonelinecaptions
  215 + \sbox\@tempboxa{#1}%
  216 + \ifdim\wd\@tempboxa >\captionlinewidth
  217 + \else
  218 + \def\next{{\centering\usebox{\@tempboxa}\par}\@gobble}%
  219 + \fi
  220 + \fi\next}
  221 +\newcommand*\usecaptionmargin{%
  222 + \ifcaptionwidth
  223 + \leftskip\captionlinewidth
  224 + \advance\leftskip by -\captionwidth
  225 + \divide\leftskip by 2
  226 + \rightskip\leftskip
  227 + \captionlinewidth\captionwidth
  228 + \else
  229 + \leftskip\captionmargin
  230 + \rightskip\captionmargin
  231 + \advance\captionlinewidth by -2\captionmargin
  232 + \fi}
  233 +\renewcommand*\caption@package[3]{%
  234 + \if1\@nameuse{caption@pkt@#1}%
  235 + \@ifundefined{#2}%
  236 + {\let\next\AtBeginDocument}%
  237 + {\let\next\@firstofone}%
  238 + \else
  239 + \ifcaption@twozero
  240 + \@ifundefined{#2}{#3\let\next\@gobble}{%
  241 + \PackageWarning{caption2}{%
  242 + The `#1' package will be supported without explicit option %
  243 + (v2.0 compatibility issue)}%
  244 + \let\next\@firstofone}%
  245 + \else
  246 + #3\let\next\@gobble
  247 + \fi
  248 + \fi
  249 + \expandafter\let\csname caption@pkt@#1\endcsname\undefined
  250 + \ifcaption@debug
  251 + \ifx\next\@gobble\PackageInfo{caption2}{#1 => gobble}%
  252 + \else\ifx\next\@firstofone\PackageInfo{caption2}{#1 => firstofone}%
  253 + \else\ifx\next\AtBeginDocument\PackageInfo{caption2}{#1 => AtBeginDocument}%
  254 + \else\PackageInfo{caption2}{#1 => ???}\fi\fi\fi
  255 + \fi
  256 + \next}
  257 +\caption@package{float}{floatc@plain}{}{%
  258 + \ifx\floatc@plain\relax
  259 + \PackageWarning{caption2}{%
  260 + Option `float' was set but there is no float package loaded}
  261 + \else
  262 + \PackageInfo{caption2}{float package v1.2 (or newer) detected}
  263 + \newcommand\caption@floatc[3]{%
  264 + \ifx\captionlabelfont\@empty
  265 + \let\captionlabelfont\@fs@cfont
  266 + \fi
  267 + \captionlinewidth\hsize
  268 + \def\captionlabel{#2}%
  269 + \def\captiontext{#3}%
  270 + \usecaptionstyle{#1}}
  271 + \renewcommand*\floatc@plain{\caption@floatc{\caption@style}}
  272 + \@ifpackagewith{caption2}{ruled}{%
  273 + \dummycaptionstyle{ruled}{\onelinecaptionsfalse\setcaptionmargin{\z@}}%
  274 + }{%
  275 + \newcaptionstyle{ruled}{%
  276 + \ifcaptionlabel
  277 + {\@fs@cfont\captionlabel}\space%
  278 + \fi\captiontext\par}%
  279 + }
  280 + \renewcommand*\floatc@ruled{\caption@floatc{ruled}}
  281 + \renewcommand*\caption@of[2]{\def\@captype{#2}%
  282 + \@ifundefined{fst@#2}{}{%
  283 + \@nameuse{fst@#2}%
  284 + \@ifundefined{@float@setevery}{}{\@float@setevery{#2}}%
  285 + \let\caption@fs@capt\@fs@capt
  286 + \let\@fs@capt\caption@of@float}
  287 + #1}
  288 + \newcommand\caption@of@float[2]{\egroup
  289 + \vskip\abovecaptionskip
  290 + \normalsize\caption@fs@capt{#1}{#2}%
  291 + \vskip\belowcaptionskip
  292 + \bgroup}%
  293 + \fi}
  294 +\caption@package{longtable}{LT@makecaption}{}{%
  295 + \ifx\LT@makecaption\relax
  296 + \PackageWarning{caption2}{%
  297 + Option `longtable' was set but there is no longtable package loaded}
  298 + \else
  299 + \PackageInfo{caption2}{longtable package v3.15 (or newer) detected}
  300 + \dummycaptionstyle{longtable}{}
  301 + \renewcommand\LT@makecaption[3]{%
  302 + \LT@mcol\LT@cols c{\hbox to\z@{\hss\parbox[t]\hsize{%
  303 + \ifignoreLTcapwidth
  304 + \else
  305 + \setcaptionwidth\LTcapwidth
  306 + \fi
  307 + \captionlinewidth\hsize
  308 + \captionlabelfalse#1\captionlabeltrue
  309 + \def\captionlabel{#2}%
  310 + \def\captiontext{#3}%
  311 + \usecaptionstyle{longtable}%
  312 + \endgraf\vskip\baselineskip}%
  313 + \hss}}}
  314 + \fi}
  315 +\newcommand*\setsubcapstyle{%
  316 + \@ifundefined{subcapraggedrightfalse}{%
  317 + \newif\ifsubcapraggedright}{}%
  318 + \ifsubcaphang
  319 + \ifsubcapcenter
  320 + \subcapstyle{hang+center}%
  321 + \else\ifsubcapcenterlast
  322 + \subcapstyle{hang+centerlast}%
  323 + \else\ifsubcapraggedright
  324 + \subcapstyle{hang+flushleft}%
  325 + \else
  326 + \subcapstyle{hang}%
  327 + \fi\fi\fi
  328 + \else\ifsubcapcenter
  329 + \subcapstyle{center}%
  330 + \else\ifsubcapcenterlast
  331 + \subcapstyle{centerlast}%
  332 + \else\ifsubcapraggedright
  333 + \subcapstyle{flushleft}%
  334 + \else
  335 + \subcapstyle{normal}%
  336 + \fi\fi\fi\fi}
  337 +\newcommand\caption@makesubcaption[2]{%
  338 + \renewcommand*\captionfont{\subcapsize\subcapfont}%
  339 + \renewcommand*\captionlabelfont{\normalfont\subcapsize\subcaplabelfont}%
  340 + \let\captionlabeldelim\subcaplabeldelim
  341 + \let\captionlabelsep\subcaplabelsep
  342 + \ifsubfigcapwidth\captionwidthtrue\else\captionwidthfalse\fi
  343 + \setlength\captionmargin\subfigcapmargin
  344 + \setlength\captionwidth\subfigcapwidth
  345 + \captionindent\subcapindent
  346 + \ifsubcapnooneline\onelinecaptionsfalse\else\onelinecaptionstrue\fi
  347 + \hbox to\@tempdima{%
  348 + \caption@subfig@hss\parbox[t]{\@tempdima}{%
  349 + \captionlinewidth\@tempdima
  350 + \captionlabeltrue
  351 + \def\captionlabel{#1}%
  352 + \def\captiontext{\ignorespaces #2}%
  353 + \usecaptionstyle{\caption@substyle}}%
  354 + \caption@subfig@hss}}
  355 +\caption@package{subfigure}{@makesubfigurecaption}{%
  356 + \let\setsubcapstyle\undefined
  357 + \let\caption@makesubcaption\undefined}{%
  358 + \ifx\@makesubfigurecaption\relax
  359 + \PackageWarning{caption2}{%
  360 + Option `subfigure' was set but there is no subfigure package loaded}
  361 + \let\setsubcapstyle\undefined
  362 + \let\caption@makesubcaption\undefined
  363 + \else
  364 + \ifx\subcapfont\undefined
  365 + \PackageInfo{caption2}{subfigure package v2.0 detected}
  366 + \let\subcapfont\@empty
  367 + \newcommand*\subfigcapwidth{\z@}
  368 + \newcommand*\setsubcapmargin{%
  369 + \subfigcapwidthfalse
  370 + \renewcommand*\subfigcapmargin}
  371 + \newcommand*\setsubcapwidth{%
  372 + \subfigcapwidthtrue
  373 + \renewcommand*\subfigcapwidth}
  374 + \newcommand*\subcaplabelsep{\space}
  375 + \let\caption@subfig@hss\hfil
  376 + \else
  377 + \PackageInfo{caption2}{subfigure package v2.1 (or newer) detected}
  378 + \newdimen\subfigcapwidth
  379 + \newcommand*\setsubcapmargin{%
  380 + \subfigcapwidthfalse
  381 + \setlength\subfigcapmargin}
  382 + \newcommand*\setsubcapwidth{%
  383 + \subfigcapwidthtrue
  384 + \setlength\subfigcapwidth}
  385 + \newcommand*\subcaplabelsep{\hskip\subfiglabelskip}
  386 + \let\caption@subfig@hss\hss
  387 + \fi
  388 + \newif\ifsubfigcapwidth
  389 + \newdimen\subcapindent
  390 + \newcommand*\subcaplabeldelim{}
  391 + \newcommand*\subcapstyle[1]{%
  392 + \expandafter\ifx\csname caption@@#1\endcsname\relax
  393 + \PackageError{caption2}{Undefined caption style `#1'}{\caption@eh}%
  394 + \else
  395 + \def\caption@substyle{#1}%
  396 + \fi}
  397 + \setsubcapstyle
  398 + \renewcommand*\@thesubfigure{\thesubfigure}
  399 + \renewcommand*\@thesubtable{\thesubtable}
  400 + \let\@makesubfigurecaption\caption@makesubcaption
  401 + \let\@makesubtablecaption\caption@makesubcaption
  402 + \fi}
  403 +\let\caption@package\undefined
  404 +\endinput
  405 +%%
  406 +%% End of file `caption2.sty'.
... ...
sbqs2017/content/00-abstract.tex 0 → 100644
... ... @@ -0,0 +1,13 @@
  1 +\begin{abstract}
  2 +The Brazilian Public Software is a program by the Brazilian Federal
  3 +Government to foster the sharing and collaboration on FOSS solutions for
  4 +the public administration. In this paper, we present an integrated
  5 +development platform that was developed for the program. The development
  6 +of this platform used several FOSS applications and contributed
  7 +features back to them. We discuss the development methodology, platform
  8 +architecture, and the user experience efforts carried out.
  9 +
  10 +\textbf{Keywords:} Brazilian Public Software, Free/Libre/Open Source Software, Software Evolution, Integrated Platform
  11 +
  12 +\end{abstract}
  13 +
... ...
sbqs2017/content/01-introduction.tex 0 → 100644
... ... @@ -0,0 +1,50 @@
  1 +\section{Introduction}
  2 +\label{sec:intro}
  3 +
  4 +During the last few decades, the Brazilian Federal Government has
  5 +improved its software adoption and development processes. In 2003, the
  6 +recommendation to adopt Free/Open Source Software (FOSS) become a public
  7 +policy. In 2007, the Brazilian Government released a portal called
  8 +Brazilian Public Software (\textit{Software Público Brasileiro} -- SPB,
  9 +in Portuguese), with the goal of sharing FOSS projects developed by, or
  10 +for, the Brazilian Government.
  11 +
  12 +The Brazilian legal instrument on software contracting
  13 +(\textit{Instrução Normativa} 04/2012) mandates that public management
  14 +must consult the SPB Portal to adopt a software solution. The
  15 +acquisition of a proprietary solution must be explicitly justified by
  16 +demonstrating that there is no suitable option in the SPB Portal.
  17 +
  18 +Since 2009, however, the SPB Portal was having several technical issues.
  19 +The original codebase was not being developed anymore, and there was a
  20 +large amount of technical debt to overcome. The system was a modified
  21 +version of an existing FOSS platform that was not being developed
  22 +anymore, and the portal maintenance was becoming harder and harder.
  23 +
  24 +From January 2014 to June 2016, a new platform for the SPB Portal was
  25 +designed and developed by the University of Brasília (UnB) and the
  26 +University of São Paulo (USP) in a partnership with the Brazilian
  27 +Ministry of Budget, Planning, and Management(MP). This new Portal was
  28 +designed as an integrated platform for collaborative software
  29 +development. It includes functionality for social networking, mailing
  30 +lists, version control system, and source code quality monitoring. In
  31 +this paper, we present an overview of this new generation of the SPB
  32 +Portal.
  33 +
  34 +The project was developed by a team of 3 professors, 6 professionals, 2
  35 +masters students, and approximately 40 undergraduate students (not all of
  36 +them at the same time, though -- graduations and other events triggered
  37 +changes in the team).
  38 +
  39 +\begin{figure*}[hbt]
  40 + \centering
  41 + \includegraphics[width=.9\linewidth]{figures/home-SPB.png}
  42 + \caption{The new SPB Portal.}
  43 + \label{fig:spb}
  44 +\end{figure*}
  45 +
  46 +Figure \ref{fig:spb} shows the home page of this integrated platform.
  47 +The development tried to be as faithful as possible to FOSS development.
  48 +All development was done in the open, and the changes we needed in the
  49 +tools were contributed back to their communities.
  50 +
... ...
sbqs2017/content/02-spb.tex 0 → 100644
... ... @@ -0,0 +1,60 @@
  1 +\section{Free/Open Source Software and Brazilian Public Software}
  2 +\label{sec:spb}
  3 +
  4 +FOSS is a phenomenon that has gained notoriety in recent years and has been
  5 +attarcting the interest of academia. However, since the beginning of computing
  6 +the majority of developers worked in the way that we now identify as free
  7 +software, that is, sharing code openly. This feature makes the code available
  8 +for inspection, modification, and use by any person or organization
  9 +\cite{kon2012}, \cite{hippel2003}.
  10 +
  11 +The elements that distinguish FOSS from other types of software are the
  12 +reasoning about the development process, the economic context, the relationship
  13 +between developers and users, as well as the ethical and legal characteristics
  14 +that relate to the software. In the context of FOSS, user freedom is promoted
  15 +and its development is based on open collaboration and development practices.
  16 +%TODO: Colocar referências sem ser nós mesmo e sem ser em PT-Br
  17 +
  18 +From the economic point of view, unlike what happens with proprietary software,
  19 +FOSS promotes the establishment of several suppliers that compete with each
  20 +other based on the same software. This stronger competition among suppliers
  21 +brings benefits to users because it gives better assurances regarding the
  22 +evolution of the system and induces a reduction in prices. These freedoms and
  23 +assurances on software are guaranteed in Brazil by Law 9610/98 (copyright law).
  24 +Most of the time, this protection from the law complies with the terms
  25 +conferred by a contract related to certain software. This contract is called
  26 +``license''. A software license determines a list of rights that are
  27 +given to, and duties that are imposed on a user of the software. In particular,
  28 +what differentiates FOSS from proprietary software is just the way they are
  29 +licensed\cite{sabino2009}. The FOSS licenses guarantee the right to execute,
  30 +study, adapt, and improve the software. Example of common FOSS licenses are
  31 +the \textit{GPL (GNU General Public License)}, the Apache license, the MIT
  32 +license, and the BSD license.
  33 +
  34 +The SPB portal has been designed in 2005 and released in 2007. In a practical
  35 +view, it is a web system that has consolidated itself as a software project
  36 +sharing environment. It provides a space (community) for each software.
  37 +Therefore, the current platform for SPB was designed to include tools that
  38 +promote collaboration and interaction in communities (by managers, users, and
  39 +developers) of the projects, according to the practices used in FOSS
  40 +communities. This includes e-mail lists, discussion forums, issue trackers,
  41 +version control systems, and social networking environments.
  42 +
  43 +Initially, the purpose of the portal was only to share the software developed
  44 +in the Brazilian government, to reduce the costs of hiring software. However
  45 +it was observed that when softwares were released, their communities were
  46 +formed around those software with several people collaborating and sharing the
  47 +results obtained through the use of those solutions. In this way, some software
  48 +development cooperatives and private companies have shown an interest in making
  49 +their software available on the SPB platform.
  50 +
  51 +The concept of Brazilian Public Software goes beyond FOSS. In addition to being
  52 +licensed under a FOSS license, a Brazilian Public Software needs to have
  53 +explicit guarantees that it is a public good, and that project must be
  54 +available in the SPB. Being a true public good assumes requirements that can
  55 +not be met solely by means of FOSS licensing. For example, there must be a
  56 +relaxed trademark usage policy by the original vendor that do not stop eventual
  57 +competitors from adversiting services for that same software. Inclusion in the
  58 +SPB also has extra requirements, such as having a public version control
  59 +system, installation manual, hardware requirements specification, etc.
  60 +
... ...
sbqs2017/content/03-requirements.tex 0 → 100644
... ... @@ -0,0 +1,136 @@
  1 +\section{Requirements}
  2 +\label{sec:requirements}
  3 +
  4 +In 2013, the SPB Portal had more than 600 thousand unique visitors, generating
  5 +more than 16 million page views with about 50 million hits. By evaluating only
  6 +the main projects, there were more than 15 thousand downloads and 4 thousand
  7 +messages exchanged in their forums. This data illustrates the potential of the
  8 +SPB Portal, even with some limitations in the past.
  9 +
  10 +By preparing the evolution project described in this paper, the Brazilian
  11 +government promote 3 events to collect the requirements, in particular from
  12 +society point of view: (i) an online form to collect general ideas; (ii) a
  13 +face-to-face meeting with society in general; (iii) a workshop to review the
  14 +SPB concepts and requirements with IT stakeholders from the Brazilian
  15 +government and public organizations.
  16 +
  17 +After these 3 rounds discussing the new SPB platform, the Brazilian government listed
  18 +about 145 requirements and developed a mind
  19 +model\footnote{\url{https://softwarepublico.gov.br/social/spb/gallery/mapaconceitual.png}}
  20 +to guide the SPB portal evolution. In this scenario, the 10 most voted
  21 +requirements are, for example:
  22 +
  23 +\begin{enumerate}
  24 +
  25 +\item Source code repository with public access.
  26 +\item Visit community pages without login.
  27 +\item Distributed version control system.
  28 +\item Scores of users and developers collaboration.
  29 +\item Search software by features.
  30 +\item Integration with social networks.
  31 +\item Repository for future ideas and requirements.
  32 +\item Friendly URL to access a public software community page.
  33 +\item User feedback about a public software.
  34 +\item Report of the experience about the use of a public software.
  35 +
  36 +\end{enumerate}
  37 +
  38 +\begin{figure}[hbt]
  39 + \centering
  40 + \includegraphics[width=.6\linewidth]{figures/technological-requirements.png}
  41 + \caption{Technological requirements overview.}
  42 + \label{fig:requirements}
  43 +\end{figure}
  44 +
  45 +
  46 +Moreover, there were other requirements based on the experience of the IT
  47 +stakeholders from the Brazilian government and from the Brazilian FOSS
  48 +community (that UnB and USP were representing too in this project). The new
  49 +platform just could work properly if there is a unique authentication to use
  50 +the provided tools. Additionally, a unified
  51 +interface was an important non-functional requirement to make easy the user
  52 +experience into the new platform.
  53 +
  54 +At the first moment, we wish to release an initial version to replace the old
  55 +SPB portal. For that, the first version must have some features such as:
  56 +
  57 +\begin{enumerate}
  58 +
  59 +\item Organized public software catalog.
  60 +\item Social network environment (profiles for users, software pages, and community pages).
  61 +\item Content Management Systems (CMS) features.
  62 +\item Web-based Git repository manager with wiki and issue tracking features.
  63 +\item Mailing lists and discussion forums.
  64 +
  65 +\end{enumerate}
  66 +
  67 +Other requirements also were planned during the conception phase of the SPB
  68 +evolution project such as an integrated search engine and a web-based source
  69 +code static analysis monitor. Therefore, by analyzing all of these
  70 +requirements, we propose the technological requirements overview, as
  71 +illustrated in Figure \ref{fig:requirements}, to guide the development of the
  72 +new SPB platform. In other words, we have designed the SPB evolution project
  73 +based on existing FOSS tools. However, the integration of several existing
  74 +systems that already was implemented in different programming language and
  75 +frameworks, adding features such as a unique authentication, a unified
  76 +interface, and a search engine, as well as, other back-end features, is not a
  77 +trivial work.
  78 +
  79 +The new SPB platform is fully an integrated environment, as we can see in
  80 +Figure \ref{fig:requirements}, being very advanced comparing to other related
  81 +projects and initiatives. For example, the USA government has a platform
  82 +designed to improve access to the federal government developed
  83 +software\footnote{\url{https://code.gov}}. Code.gov is an interface to
  84 +organize the USA government projects and, in short, make easy that their users
  85 +and developers obtain some information and access their source code
  86 +repositories at GitHub. However, there are not social networking and CMS
  87 +features, as well as, other communication resources provided by that platform.
  88 +
  89 +Also, there are two initiatives in Europe:
  90 +OSOR\footnote{\url{https://joinup.ec.europa.eu/community/osor}} and
  91 +OW2\footnote{\url{http://ow2.org}}. The Open Source Observatory (OSOR) is a
  92 +community hosted in the JoinUp platform powereded by the European Commission.
  93 +OSOR aims exchanging information, experiences and best practices around FOSS
  94 +solutions for use in public administrations. Summarily, it helps to find a FOSS
  95 +made available by other public administrations, providing access to information
  96 +such as news, events, studies and solutions related to implementation of open
  97 +source software. It also offers forum discussions and community mailing lists,
  98 +but it does not have an integrated source code repository manager and for the
  99 +each project has a link to its own external repository (or its tarball file).
  100 +%
  101 +OW2 is a FOSS community to promote the development of FOSS middleware, generic
  102 +business applications, cloud computing platforms and foster a community and
  103 +business ecosystem. In short, it aims to support the development, deployment
  104 +and management of distributed applications with a focus on FOSS middleware and
  105 +related development and management tools.
  106 +%
  107 +Moreover, from the European Commission in 2007 until 20011, there were the
  108 +QualiPSo project that aims to provide to FOSS users, developers, and consumers,
  109 +quality resources and expertise on the various topics related to FOSS. The
  110 +QualiPSo project also had planned to develop a platform called QualiPSo
  111 +Factory but it was not fully completed.
  112 +
  113 +In Latin American has an initiative based on the SPB project called Software
  114 +Publico Regional\footnote{\url{http://softwarepublicoregionalbeta.net}}. From
  115 +the practical point of view, it provides a customized Gitlab instance to share
  116 +the source code and documentation of the project from the involved countries.
  117 +%
  118 +Such as Brazil, Chile has its own portal also called Software
  119 +Publico\footnote{\url{http://www.softwarepublico.gob.cl}}. The user can create
  120 +content in the communities (news items, documents, wiki pages), but all
  121 +repository is available at the Bitbucket
  122 +platform\footnote{\url{https://bitbucket.org/softwarepublico}}.
  123 +
  124 +The Brazilian government needed to evolute the SPB project that exists since
  125 +2005. In 2013, when we started this project, the SPB Portal had about 200
  126 +thousand registered users. We could not just contact these users and ask them
  127 +to register an account at Github as well. Moreover, after the Edward Snowden
  128 +case, the Brazilian government approved a specific law decree (8.135/2013) to
  129 +rule its communication service. Summarily, services like Gmail, Google Drive,
  130 +Dropbox, Live, Outlook, iCloud, as well, Google Groups, Github, etc do not
  131 +could be used by a Brazilian public agent as tool for your work. To use these
  132 +kinds of services the Brazilian government needs to provide them to itself.
  133 +Thus, we developed our own solution to cover all the requirements, producing a
  134 +complete governmental integrated platform for collaborative software
  135 +development.
  136 +
... ...
sbqs2017/content/04-architecture.tex 0 → 100644
... ... @@ -0,0 +1,184 @@
  1 +\section{Architecture}
  2 +\label{sec:architecture}
  3 +
  4 +Based on the great list of functional requirements desired by Brazilian Federal
  5 +Government we decided to select some FOSS systems that already contemplate some
  6 +of them and improve these systems. And bringing the idea of community, it is
  7 +undoable build a platform to be used by communities, which is a complex
  8 +scenario, using just one tool.
  9 +
  10 +At the point of view of the architecture, two main requirements was brought by
  11 +the Brazilian Federal Government for the new platform:
  12 +
  13 +\begin{enumerate}
  14 + \item \textit{Integrate existing FOSS systems}, with minimal differences from
  15 + their original versions;
  16 + \item \textit{Provide a consistent user interface} across the different
  17 + systems, as well as centralized authentication.
  18 +\end{enumerate}
  19 +
  20 +Adopting existing FOSS systems by the government could bring the benefit of
  21 +improvements done by the upstream communities, and the maintenance effort. On
  22 +the other hand, integrating different tools with distinct intent, it is not an
  23 +easy task and it was important to have a consistent user interface which
  24 +justifies the last requirement.
  25 +
  26 +For the first requirement, we identified four main systems that required
  27 +specialized teams for work in the integration process. The teams learned how to
  28 +develop for their assigned systems and contributed to the original
  29 +communities, so that the version we used were not significantly different from
  30 +the original.
  31 +
  32 +At the end of the project, SPB portal was composed of more than ten systems
  33 +among them we can highlight: Colab, Noosfero, Mezuro, Gitlab, Mailman, Postfix,
  34 +Munin, and so forth. The following sections explained a little bit of Colab,
  35 +Noosfero, Mezuro, and Gitlab (the main tools which we contributed). Below, we
  36 +described how we integrated those tools and conclude with the deployment.
  37 +
  38 +\subsection{Colab}
  39 +
  40 +Colab integrates web applications as its main goal, the user of this composed
  41 +system should not notice the change between the integrated applications. Colab
  42 +was designed to use one plugin for each system under its domain, this is
  43 +guaranteed by four levels of integration:
  44 +
  45 +\begin{itemize}
  46 + \item Authentication
  47 + \item Visual
  48 + \item Events
  49 + \item Data and search engine
  50 +\end{itemize}
  51 +
  52 +The aforementioned integrations levels were possible, because Colab works as a
  53 +reverse proxy, therefore all external requests pass through it.
  54 +
  55 +Single Sign-On (SSO) is used to login users throughout all integrated
  56 +applications. REMOTE\_USER HTTP header is sent to the applications and we
  57 +expect that they know how to handle it, since this is a common authentication
  58 +mechanism. The integrated applications should be on a local network to avoid
  59 +security issues. With this the user will be able to navigate through the
  60 +platform applications and will not be asked for authentication credentials.
  61 +
  62 +As Colab\footnote{\url{https://github.com/colab}} is a reverse proxy, it makes
  63 +some HTML transformations in the HTTP response of integrated applications to
  64 +provide a unified interface. Allows one to define some default templates to be
  65 +used by all applications and overwrite when needed in its plugin. This approach
  66 +allowed us to reuse some HTML pages which facilitates maintenance.
  67 +
  68 +A publish-subscribe implementation was used to handle events in the platform.
  69 +Thus, if some application want to trigger some action in case that other
  70 +application do something is possible. A registration of the desired events and
  71 +implementation of the handlers must be done in the plugin of each application.
  72 +This bring us many options to innovate in these integrations.
  73 +
  74 +A integrated search engine is provided by Colab. Each plugin specify which data
  75 +will be indexed and will became available for the users, just need an simple
  76 +implementation of how should perform the collection of data.
  77 +
  78 +Initially, Colab had support for a small set of applications (Trac, GNU
  79 +Mailman, and Apache Lucene) and all of them was hard-coded. Our team evolved
  80 +Colab so that it can now receive plugins to add support for new applications
  81 +with minimal changes to its existing core. We developed plugins to be used in
  82 +the SPB platform: Noosfero, GitLab, and Mezuro.
  83 +
  84 +\subsection{Noosfero}
  85 +
  86 +Noosfero\footnote{\url{http://noosfero.org}} is a software for building
  87 +social and collaboration networks. Besides the classical social
  88 +networking features, it also provides publication features such as blogs
  89 +and a general-purpose CMS (Content Management System). Most of the user
  90 +interactions with SPB is through Noosfero: user registration, project
  91 +home pages and documentation, and contact forms.
  92 +
  93 +\subsection{Gitlab}
  94 +
  95 +GitLab\footnote{\url{http://gitlab.com}} is a web-based Git repository manager
  96 +with wiki pages and issue tracking features. On the one hand, Github is the
  97 +most famous and used Git repository manager. On the other hand, it is not a
  98 +FOSS. Gitlab is a FOSS platform and focuses on delivering a holistic solution
  99 +that will see developers from idea to production seamlessly and on a single
  100 +platform. Thus, we have worked on it to integrated to Colab.
  101 +
  102 +Moreover, Gitlab has several features working properly than Github that is
  103 +interesting in SPB context such as free for private projects, built-in
  104 +continuous integration and continuous deployment with best practices, more
  105 +control during downtime and upgrade, flexible permissions, Work-in-Progress
  106 +protection, move issues between projects, Group-level milestones, Create new
  107 +branches from issues, Issue board, Time tracking, as well new features and
  108 +improvements every month on the 22nd.
  109 +
  110 +\subsection{Mezuro}
  111 +
  112 +Mezuro\footnote{\url{http://mezuro.org/}} is a platform to collect source code
  113 +metric to monitor the internal quality of softwares written in C, C++,
  114 +Java, Python, Ruby, and PHP. GNU Mailman is used for mailing lists.
  115 +
  116 +In general, source code metric tools also do not present a friendly way to
  117 +interpret its results and, even more, do not follow a standardization between
  118 +them. Mezuro brings and presents these results to
  119 +the end user, specially, by analyzing source code metric history during its
  120 +life cycle.
  121 +
  122 +The Mezuro platform provides a single interface
  123 +grouping available tools, allows selection and composition of metrics in a
  124 +flexible manner, stores the metrics evolution history, presents
  125 +results in a friendly way, as well as, allows users to customize the given
  126 +interpretation accordingly to their own context.
  127 +
  128 +\subsection{System unification}
  129 +
  130 +\begin{figure}[hbt]
  131 + \centering
  132 + \includegraphics[width=.5\linewidth]{figures/arch.png}
  133 + \caption{SPB architecture overview.}
  134 + \label{fig:architecture}
  135 +\end{figure}
  136 +
  137 +The conceptual architecture of the platform is presented in Figure
  138 +\ref{fig:architecture}. Colab initially handles all user interaction,
  139 +directing requests to one of the integrated applications. It
  140 +post-processes responses from the applications to apply a consistent
  141 +visual appearance, manages authentication, and provides a unified search
  142 +functionality: instead of using the redundant restricted search
  143 +functionality of each application, a search in the SPB portal might
  144 +return content from any of the applications, be it web pages, mailing
  145 +list posts, or source code.
  146 +
  147 +% Falar do devops
  148 +\subsection{Deploy}
  149 +
  150 +The SPB platform was deployed in 7 virtual machines with different functions,
  151 +as we can see in Figure \ref{fig:architecture2}.
  152 +
  153 +\begin{figure*}[hbt]
  154 + \centering
  155 + \includegraphics[width=.8\linewidth]{figures/arch2.png}
  156 + \caption{Instanciation view of the SPB architecture.}
  157 + \label{fig:architecture2}
  158 +\end{figure*}
  159 +
  160 +The \textit{reverseproxy} handles the HTTP requests and redirects them to the
  161 +\textit{integration}, the \textit{email} sends and receives e-mails on behalf
  162 +of the platform and the \textit{monitor} keeps the entire environment tracked.
  163 +These three \textit{VMs} mentioned - \textit{reverseproxy}, \textit{email} and
  164 +\textit{monitor} - are accessible via Internet and the other ones are only
  165 +available in the local network created between them.
  166 +
  167 +\textit{Integration} works as a second layer of proxy beneath
  168 +\textit{reverseproxy}, any request to the platform will be handled by it. The
  169 +Colab service provides interface, authentication and search engine integration
  170 +among all the services. When a request is received to a specific service,
  171 +Colab authenticates the user in the target tool, sends the request and makes a
  172 +visual transformation in the HTML page which is the content of the response.
  173 +Another user-oriented feature is the integrated search engine, when the user
  174 +want to find something in the platform Colab will perform the search in the
  175 +whole databases. Colab itself provides a web interface for GNU Mailman and we
  176 +have two others integrated tools in \textit{integration}: Gitlab and Prezento.
  177 +Gitlab provides web interface for Git repositories and issues tracker, and
  178 +Prezento is a front-end for source code static analysis.
  179 +
  180 +The source code static analysis is performed by \textit{mezuro}. It runs some
  181 +static analysis tools on source code stored in repository and provide this data
  182 +to Prezento. A social network and CMS (Content Manager System) is provided by
  183 +Noosfero in \textit{social}, and the databases of all tools with a cache
  184 +service are in \textit{database}.
... ...
sbqs2017/content/05-features.tex 0 → 100644
... ... @@ -0,0 +1,73 @@
  1 +\section{Features}
  2 +\label{sec:spb}
  3 +
  4 +The new generation of the SPB portal combines adapted features of existing collaborative softwares
  5 +and features developed by the SPB team. Whenever possible, new functions
  6 +(newly developed or partially modified) were sent to official repositories, as a contribution.
  7 +
  8 +As a result, we have a platform that integrates and harmonizes different features such as
  9 +social networking, mailing list, version control system, content management and
  10 +source code quality monitoring. Our aim was to develop functionalities by reusing
  11 +functions of collaborative softwares already integrated to the platform. In
  12 +addition, we tried to keep this integration transparent to end users.
  13 +
  14 +\subsection{Software and Software Community}
  15 +
  16 +In the new SPB portal, each software has a standard set of pages and tools.
  17 +Besides accessing support pages (such as FAQ and installation guide) within the platform, users will be able to download
  18 +different versions of the software and find several mechanisms of software development management.
  19 +
  20 +Focusing on the collaborative development, the Mailman was integrated to the platform in order to allow
  21 +the dialogue and communication between developers, users and
  22 +enthusiasts of a determined software. The software has its own mailing list whose privacy
  23 +can be configured/set by administrators.
  24 +
  25 +The software has a social interface area (aka "software community") where users can find other users, blogs,
  26 +summary of recent activities, or any other relevant community-produced content.
  27 +Users logged to the platform can request membership to different software communities
  28 +and each community member can access and edit restricted content. For this purpose,
  29 +many Noosfero features related to social network and content management was integrated to the portal.
  30 +
  31 +To assist decision-making, the new SPB has acquired assessment and statistical
  32 +tools. Now, users will be able to rate the software and make comments and all
  33 +information will be avaiable to other users. Moreover, the software has a section
  34 +containing its statistical data, where values are calculated through data
  35 +provided by users and the system.
  36 +
  37 +The role of the administrator will be present in the software and in its community. The
  38 +administrator is responsible for moderating content, memberships and user
  39 +comments. He is also the one who can make changes in the software homepage
  40 +content.
  41 +
  42 +\subsection{Software Catalog and global search}
  43 +
  44 +The platform also provides a search tool called Software Catalog,
  45 +which allows users to find softwares available in its directory.
  46 +In this catalog, some search options were developed to make the navigation easier,
  47 +such as filters (by type of software or category), sorting and score.
  48 +
  49 +In order to expand the searching scope and cover more types of content, the SPB team
  50 +developed the global search tool. This tool unifies search mechanisms
  51 +provided by the mentioned collaborative softwares. Any user can
  52 +find a public content in the context of social network, mailing list and
  53 +software development.
  54 +
  55 +\subsection{Software development tools}
  56 +
  57 +The new SPB also provides
  58 +tools to encourage developers to keep each source code and its
  59 +developments within the platform. Any created software has, by default, a
  60 +related git repository with wiki pages and issues tracking. These tools are
  61 +supplied by the integration of Gitlab into the platform.
  62 +
  63 +Developers can also evaluate the software source code to measure software
  64 +quality. With Mezuro, they can schedule the analysis of the source-code and follow its
  65 +metric results evolution over time. Results of each metric analysis are
  66 +public, which allows greater transparency between the developer and the
  67 +community that uses the software. Thereby, the maintainers can decide if the
  68 +given solution meets the source code quality requirements.
  69 +
  70 +Thus, the SPB becomes a platform to stimulate the openness of the source code;
  71 +dialogue between users and the development team; and also
  72 +maintenance and evolution of the software, which will provide more
  73 +transparency in government investments.
... ...
sbqs2017/content/06-ux.tex 0 → 100644
... ... @@ -0,0 +1,33 @@
  1 +\section{User eXperience evolution}
  2 +
  3 +The integration of collaborative environments goes beyond functional aspects.
  4 +Offering the population an unified experience across these environments has
  5 +been the key to encourage the use of the platform as it reduces the perception
  6 +of complexity. Thus, the SPB Portal information architecture was redesigned
  7 +to provide a transparent navigation and to reach users with different profiles.
  8 +A process of harmonization has been employed on the interaction models of each
  9 +tool to reduce the learning curve. At the same time, a new visual style was
  10 +created to unify the navigation experience and to comply with the guidelines of
  11 +the digital communication identity standard established by the Federal
  12 +Government.
  13 +
  14 +With the increase in system features and the addition of new tools, the
  15 +visual style has steadily evolved to keep the navigation unified. Moreover,
  16 +tools from different backgrounds, which in many cases provide similar
  17 +functionality, prompted the development of an unified interface. Some
  18 +features, such as search and user profile editing were eliminated from
  19 +the individual applications, and implemented centrally to ensure a
  20 +consistent look and feel.
  21 +
  22 +Another challenge was responsive web design. The integrated applications
  23 +had varying degrees of support for responsiveness, and the common
  24 +interface had to adapt for each individual scenario. In particular
  25 +Noosfero did not yet have a responsive design; we engaged in its
  26 +development and contributed towards that goal.
  27 +
  28 +After the initial release of the new SPB Portal in 2014, several
  29 +validations activities were implemented in 2015 and 2016. The aim was to
  30 +provide the most wanted features by casual users (such as public
  31 +servants interested in downloads and documentation) immediately, while
  32 +allowing more experienced users (such as developers) to easily drill down
  33 +to the details.
... ...
sbqs2017/content/07-process.tex 0 → 100644
... ... @@ -0,0 +1,166 @@
  1 +\section{Development Organization and Process}
  2 +\label{sec:process}
  3 +
  4 +The SPB team was composed of a variety of professionals with different levels
  5 +and skills, where most of them were undergraduate students with major in
  6 +software engineering (from 4th semester or upper). Since the students could
  7 +not dedicate many hours per week to the project, they always had the
  8 +flexibility to negotiate their work schedule during the semester in order not
  9 +to cause any damage to their grades. Their daily work routine in the project
  10 +included programming and devops tasks.
  11 +
  12 +The development of SPB project required a vast experience and background that
  13 +usually undergraduate students do not have yet. For this reason, some senior
  14 +developers have joined to the project to help with hard issues and to transfer
  15 +knowledge to the students. Their main task was to provide solutions for complex
  16 +problems, in other words, they worked as a developer. As these professionals
  17 +are very skillful and the project could not fund a full time work for them,
  18 +some of them worked partially on the project. In addition, they lived in a
  19 +different states spread around Brazil which led much of the communication to be
  20 +made via Internet.
  21 +
  22 +In short, our work process was based on open and collaborative software
  23 +development practices. The development process was defined based on the
  24 +adaptation of different agile and FOSS communities practices, highlighting the
  25 +high degree of automation resulting from DevOps practices. Thus, the work
  26 +process was executed in a cadenced and continuous way.
  27 +
  28 +Finally, the last group of actors of this project was composed of employees
  29 +formally working for the Brazilian government, in the Ministery of Planning,
  30 +Development, and Management (MP is the Brazilian acronyms). All the project
  31 +decisions, validations, and scope definitions were made by them. In this way we
  32 +developed software product increments, releases, aligned with business
  33 +strategic objectives. As can be seen, the project had many kinds of profiles
  34 +that had to be organized and synchronized.
  35 +
  36 +\subsection{Teams organizations}
  37 +
  38 +Approximately 70\% of the development teams were composed of software
  39 +engineering undergraduate students from UnB and they worked physically in the
  40 +same laboratory in the opposite of the senior. Each student had their own
  41 +scheduler based on their class, it made complicated to implement pair
  42 +programming. Also, they had a different area of interests. To cope with those
  43 +diversity, we had two basic rules which guided the project organization:
  44 +
  45 +\begin{enumerate}
  46 + \item Classes have to be the high priority for undergraduate students;
  47 + \item Always work in pair (locally or remotely).
  48 +\end{enumerate}
  49 +
  50 +With the aforementioned rules we divided all the project into four different
  51 +teams: Colab, Noosfero, Design, and DevOps. Each team had one coach responsible
  52 +for reducing the communication problem with the other teams and help the
  53 +members to organize itself in the best way for everyone (always respecting the
  54 +work time). The coach, was a normal student working in some of the teams with
  55 +the extra duty of register the current tasks developed in the sprint and with
  56 +the responsibility to talk with other teams. One important thing to notice is
  57 +the mutability of the team and the coach, during the project many students
  58 +changed between the teams to try different areas.
  59 +
  60 +One characteristic of the teams was the presence of (at least) one senior per
  61 +team. This was essential, because hard decisions and complex problems were
  62 +usually addressed to them, this relieved the coach duty to take a complicated
  63 +technical decisions and encouraged students to be a coach. Lastly, the senior
  64 +had to respect a rule number two and work with students, this was important to
  65 +gave the undergraduate the opportunity to interact with a savvy professional in
  66 +his area and keeping the knowledge flow in the project.
  67 +
  68 +Finally, we had to add two last elements of the team organization, that was
  69 +essential for the project harmony: the meta-coach and professors. The former
  70 +was a software engineer recently graduated and which wanted to keep working on
  71 +the project, the latter were professors that orchestrated all the interactions
  72 +between all members of the project. The meta-coach usually worked in one
  73 +specific team and had the extra task of knowing the current status of all
  74 +teams. Professors and meta-coaches worked together to reduce the communication
  75 +problem between all the teams. Lastly, all the bureaucracy tasks was
  76 +centralized in the professors.
  77 +
  78 +\subsection{Meetings}
  79 +
  80 +Brazilian government used to work with software development in a very
  81 +traditional way, frequently they claim on documents and does not focus on what
  82 +really matter (running software). This way of thinking caused to us a
  83 +communication noise with MP, because they constantly tried to leverage on our
  84 +work style. It was especially hard to convince them to accept the idea of open
  85 +scope and agile development, but after months of labor and showing results they
  86 +stopped resisting.
  87 +
  88 +We defined some level of meeting granularity to avoid to generate overheads to
  89 +the developers. We had a strategical and validating meeting with MP (the
  90 +former once in a month and the latter each 15th day), release plaining with the
  91 +entire team (one per month), and finally a sprint planning (one each 15th day).
  92 +Figure \ref{fig:meeting} is a diagram that represents our meeting organization.
  93 +
  94 +\begin{figure}[hbt]
  95 + \centering
  96 + \includegraphics[width=.75\linewidth]{figures/meeting_flows.png}
  97 + \caption{Meetings cycles}
  98 + \label{fig:meeting}
  99 +\end{figure}
  100 +
  101 +In the strategical meeting we usually defined the priorities and new features
  102 +with the Brazilian government (we always had to negotiate next steps with
  103 +them). Normally the professors, the coach of each team, the meta-coach, and
  104 +some employees of the MP join in this meeting. We usually discussed what the
  105 +team already produced since our last meeting, and we establish the new features
  106 +for the next release. Notice that just part of the team join in this meeting
  107 +to avoid generating unnecessary overhead to the developers, but all the
  108 +students interested to participate was allowed to join (many students wanted
  109 +this experience during the project).
  110 +
  111 +After the strategical meeting with Brazilian government agents, we had a
  112 +planning turn with all teams together. In this part, each team worked together
  113 +to convert the MP wishes into small parts which was represented by the epics of
  114 +the release. Each coach was responsible for conducting the planning, and after
  115 +that register it on the project wiki (the wiki provided by Gitlab). With this
  116 +epic, each 14th day the team have generated their sprint scheduler (with small
  117 +achievements mapped in issues).
  118 +
  119 +To keep the Brazilian government always updated, we invited them to work with
  120 +us to validate the new features in progress. Normally we had a meeting each
  121 +15th day. Basically, this was our work flow, we always kept everything
  122 +extremely open to the MP (our way of work and open source projects) and to the
  123 +team.
  124 +
  125 +To keep the track of all of those things we used the SPB, especially the
  126 +Gitlab. Basically, we had:
  127 +
  128 +\begin{enumerate}
  129 + \item Project repository: We have one organization with many repositories
  130 + \item Milestones: Each milestone is used to register a release
  131 + \item Wiki: Each release has one page on wiki with the compilation of
  132 + strategical meeting
  133 + \item Issues: Each sprint planning generated issues, which we associated to
  134 + the specific milestone and updated the wiki with the issue number related
  135 + with them. Finally each developer assigned the issue to itself.
  136 +\end{enumerate}
  137 +
  138 +Notice that this workflow gave to us and to the Brazilian government agents a
  139 +full traceability from high view of the feature to the low view (code). This
  140 +provided to them a way to validate all worked done and proof the concept that
  141 +work with open source project can give a proper view to them check.
  142 +
  143 +\subsection{Tools for communication and management}
  144 +
  145 +Our team had many people worked together, and most of the seniors worked in a
  146 +different city remotely. Also, we tried to keep our work completely clear to
  147 +the Brazilian government and citizens interested in follow the project. To
  148 +handle those cases, we used a set of tools to communication and other to manage
  149 +the project.
  150 +
  151 +For communication between member in different places, we used: google-talk with
  152 +tmate, IRC, and mailing-list. When one student had to work in pair with a
  153 +senior, normally, they used google-hangout for communication and they shared a
  154 +session with tmate which allow them to share the same terminal. For questions
  155 +and fast discussion, we used IRC. For general notification, we used the
  156 +mailing-list.
  157 +
  158 +For managing the project we used the SPB Portal to validate it by ourselves and
  159 +because it had all the required tools. We basically create one wiki page per
  160 +release in Gitlab, one milestone per sprint, and one or more issues for address
  161 +one user history. With this approach we achieve two important things: keep all
  162 +the management close to the source code and tracked every feature developed by
  163 +the project.
  164 +
  165 +%TODO: Ainda falta adicionar a parte da visita dos seniors e o turno sagrado
  166 +
... ...
sbqs2017/content/08-contributions.tex 0 → 100644
... ... @@ -0,0 +1,49 @@
  1 +\section{Contributing with Free Software Communities}
  2 +\label{sec:contributions}
  3 +
  4 +%- projeto feito do jeito certo com relação ao software livre (contribuições upstream etc)
  5 +%* Colab -> RevProxy
  6 +%* Colab, atualização do python/django
  7 +%* Contribuições para o GitLab (autenticação)
  8 +%* Noosfero, atualização do Rails, preparação para federação, nova interface ...
  9 +%* Coper, empacotamentos (obs), omniauth
  10 +
  11 +
  12 +During the execution of this project we made several contributions from
  13 +different levels to the communities we interacted with. This occurred due to
  14 +our development process aligned with those of the respective communities. We
  15 +used to discuss with upstream the features and bug fixes that we was working
  16 +on, this kind of discussion improve the developers' technical solutions and
  17 +allowed upstream to accept our contribution more easily.
  18 +
  19 +In Colab we helped upstream to redesign the entirely architecture, enabling the
  20 +development of plugins to integrate new tools. We also added a feature that
  21 +allowed Colab to run asynchronous tasks, which was a major improvement for us
  22 +since we were developing a complex system. A migration to the latest Django
  23 +version was made (web framework used by Colab). Moreover, we worked on RevProxy
  24 +(the greatest Colab dependency) to put it in a good shape, fixing many bugs.
  25 +
  26 +Gitlab was the tool that we made the least number of modifications. We
  27 +contributed with some improvements related with configuration files and we
  28 +developed a new omniauth plugin, which enables the user authentication in
  29 +Gitlab via REMOTE\_USER HTTP header. This omniauth plugin was needed because
  30 +Colab uses this mechanism to manage the authentication.
  31 +
  32 +Noosfero was the tool that contemplated several functional requirements,
  33 +therefore we made a large number of contributions with upstream. We helped to
  34 +migrate to the latest Rails version (web framework used by Noosfero), enable
  35 +the federation implementation (federation with other social networks), decouple
  36 +the interface and the back-end, and so forth.
  37 +
  38 +We also contributed with some DevOps tools as well during the project. Some
  39 +member of our team took the maintenance of some python libraries that we used
  40 +to support our scripts to upload our packages to OBS (Open Build Service).
  41 +Since we were composed by many teams with large number of developers we had
  42 +some problems related with the tracking of our per team/software releases, the
  43 +DevOps team did not know when was the right time to package that software or
  44 +not. Thus we developed a tool called copr-status to keep tracked the version
  45 +packaged and the version finished by the developers, basically this is a web
  46 +interface that helps you to visualize the status of that package/software.
  47 +
  48 +%TODO: Mezuro
  49 +
... ...
sbqs2017/content/09-lessons.tex 0 → 100644
... ... @@ -0,0 +1,77 @@
  1 +\section{Lessons Learned}
  2 +\label{sec:lessons}
  3 +
  4 +The multidisciplinary composition of the development teams, mainly software
  5 +engineers and designers, is necessary for the development of good software
  6 +products, which naturally aim to meet the users needs. In the context of the
  7 +SPB project, there were also stakeholders from different areas who composed the
  8 +team of technicians and managers of the MP, as well as the administrative teams
  9 +of UnB. This interaction with different professionals brought a great learning
  10 +opportunity for the students, who had their first professional experience, even
  11 +during their graduation course. On the other hand, the different perceptions of
  12 +stakeholders generated high complexity of communications and expectations
  13 +management, burdening too much the professors who were responsible for project
  14 +management.
  15 +
  16 +The use of the Colab tool was a requirement required by the MP. They argueed
  17 +that this tool presented functionalities that would allow MP managers to
  18 +stimulate the participation of SPB service providers with gamefication
  19 +practices. As we said, in order for Colab to perform the expected behavior in
  20 +SPB its architecture had to be completely redefined and this caused in
  21 +practice, (i) the considerable increase in the architectural complexity of the
  22 +SPB and (ii) it was the subsystem that consumed the most effort and budget
  23 +during development.
  24 +
  25 +Due to the computational complexity related to the SPB deployment, associated
  26 +with the Brazilian government needs for product support, we made an effort to
  27 +provide complete automation of the entire deployment procedure, a result of
  28 +DevOps activities. In this way, we encapsulate all this complexity and enable
  29 +the deployment of new SPB releases through the execution of few commands, as
  30 +registered in the project documentation. Although we have provided a high
  31 +degree of automation, training workshops for the MP technical team, and a
  32 +meticulous description of the procedures in the documentation, we observed that
  33 +the MP technical staff invariably depended on our support to perform these
  34 +procedures.
  35 +
  36 +From the point of view of management and development processes, we had to
  37 +develop management strategies that would accommodate different organizational
  38 +cultures. As reported, the MP has a functional hierarchical organizational
  39 +culture, strongly supported by process management, typical of the traditional
  40 +development paradigm. The UnB teams use a process based on agile manifest
  41 +values and FOSS and agile community practices. So we created a process of
  42 +"translation" of work done to communicate with MP managers who manage their
  43 +portfolio based on the PMBoK processes. On the one hand, in the intermediary
  44 +and final project's phases we have matured this process, mainly due to the
  45 +perception of the results by MP, on the other hand, in the initial phase we had
  46 +a lot of intervention in our work style, which ended up focusing strategic
  47 +discussions for operational discussions. Again there was an overload in
  48 +professors, who were responsible for maintaining the strategic alignment of the
  49 +MP with the day to day development of the UnB team.
  50 +
  51 +Another importance factor for the students and maturing of the software
  52 +engineering practices used in the project was the composition of the teams with
  53 +the participation of experienced professionals from the FOSS communities. These
  54 +professionals together with the professors promoted a work environment where
  55 +the students could develop their skills in a didactic and practical way without
  56 +being transferred the pressures for them. In addition, these experienced
  57 +professionals were responsible for the most relevant technical decisions
  58 +related to the SPB software product.
  59 +
  60 +% * Gestão dos recursos: Fizemos mais por menos (2.6M de 3.2M) --- sem os dados
  61 +%% (escopo, custo, tempo e qualidade) bem discutidos é difícil sustentar essa
  62 +%% afirmação, embora eu e Paulo consigamos perceber isso.
  63 +
  64 +The experience of the SPB project led UnB to develop a model of team
  65 +composition and work style that proved to be appropriate to the cararteristics
  66 +of an education environment, bringing the academy closer to the industry. The
  67 +highest priority from the university's point of view is the students.
  68 +Considering this, the activities of the project were never prioritized to the
  69 +detriment of the classes and other didactic-pedagogical activities. In short we
  70 +had students working at different times, part time, remotely or presential,
  71 +always respecting their individual conditions, but doing the work in a
  72 +collective, collaborative and open way. At the end of the project we realized
  73 +that the skills developed by the students empowered them with the state in the
  74 +practice of software engineering. The members of the teams got opportunities to
  75 +work in public, private, national and international organizations, in addition
  76 +to those students they preferred entrepreneurship, opening their own companies.
  77 +
... ...
sbqs2017/content/10-finals.tex 0 → 100644
... ... @@ -0,0 +1,32 @@
  1 +\section{Final remarks}
  2 +
  3 +The portal is available at \url{softwarepublico.gov.br}. All
  4 +documentation, including detailed architecture and operation manuals are
  5 +also available\footnote{\url{https://softwarepublico.gov.br/doc/}
  6 +(in Portuguese only at the moment)}).
  7 +%
  8 +All the integrated tools are FOSS and our contributions were published
  9 +in open repositories, available on the SPB Portal itself. We also
  10 +contributed these features back to the respective communities: that
  11 +benefits those communities, as well as us since we can share future
  12 +development and maintenance effort with other organizations that
  13 +participate in their projects.
  14 +
  15 +
  16 +%* utilização do projeto para formação de recursos humanos (alunos)
  17 +
  18 +%* dados da verificação dos repositório para a análise da qualidade dos código via Mezuro e CodeClimate
  19 +
  20 +%* o que achamos que irá acontecer com o SPB no futuro breve (acabar)
  21 +
  22 +%* 69 projetos marcados como SPB, de 81 no total na plataforma.
  23 +
  24 +%* 47\% é desenvolvido em PHP.
  25 +
  26 +% foi constatado que aproximadamente 75\% dos softwares \textbf{não} possuem seus códigos-fonte versionados nesta ferramenta. Realizado algumas pesquisas, foi encontrado o código-fonte em outros serviços (Github, Bitbucket).
  27 +
  28 +% Foram adicionados 31 softwares do SPB em ambas as ferramentas (Mezuro e Code Climate), desenvolvidos em PHP e Python. Estas adições resultaram na análise descrita nos próximos parágrafos. No Mezuro, dos 31 softwares adicionados, somente 4 obtiveram sucesso na avaliação. No Code Climate, 16 softwares realizaram a \textit{build} da avaliação com sucesso. Nos que falharam, alguns dos erros foram encontrados em três das \textit{engines}: ora em \textit{duplication}, ora na \textit{phpmd}, ora na \textit{eslint}.
  29 +
  30 +% também foram inseridos no Mezuro para avaliação, 5 projetos dos 17 desenvolvidos em Java, com o intuito de ser um contraponto ao Code Climatepor esta não compreender a análise de projetos em Java, C, ou C++. Infelizmente nenhuma das \textit{builds} resultou em resultados concretos.
  31 +
  32 +%* Debater economia de recursos em orgão públicos
... ...
sbqs2017/figures/arch.png 0 → 100644

39.2 KB

sbqs2017/figures/arch.svg 0 → 100644
... ... @@ -0,0 +1,302 @@
  1 +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
  2 +<!-- Created with Inkscape (http://www.inkscape.org/) -->
  3 +
  4 +<svg
  5 + xmlns:dc="http://purl.org/dc/elements/1.1/"
  6 + xmlns:cc="http://creativecommons.org/ns#"
  7 + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  8 + xmlns:svg="http://www.w3.org/2000/svg"
  9 + xmlns="http://www.w3.org/2000/svg"
  10 + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
  11 + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
  12 + width="1024"
  13 + height="480"
  14 + viewBox="0 0 270.93333 126.99987"
  15 + version="1.1"
  16 + id="svg8"
  17 + inkscape:version="0.92.1 r15371"
  18 + sodipodi:docname="arch.svg"
  19 + inkscape:export-filename="/home/terceiro/research/papers/2017/spb/OSS-2017/figures/arch.png"
  20 + inkscape:export-xdpi="96"
  21 + inkscape:export-ydpi="96">
  22 + <defs
  23 + id="defs2">
  24 + <marker
  25 + inkscape:stockid="Arrow1Lend"
  26 + orient="auto"
  27 + refY="0"
  28 + refX="0"
  29 + id="marker5935"
  30 + style="overflow:visible"
  31 + inkscape:isstock="true">
  32 + <path
  33 + id="path5933"
  34 + d="M 0,0 5,-5 -12.5,0 5,5 Z"
  35 + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
  36 + transform="matrix(-0.8,0,0,-0.8,-10,0)"
  37 + inkscape:connector-curvature="0" />
  38 + </marker>
  39 + <marker
  40 + inkscape:isstock="true"
  41 + style="overflow:visible"
  42 + id="marker5359"
  43 + refX="0"
  44 + refY="0"
  45 + orient="auto"
  46 + inkscape:stockid="Arrow1Lend"
  47 + inkscape:collect="always">
  48 + <path
  49 + transform="matrix(-0.8,0,0,-0.8,-10,0)"
  50 + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
  51 + d="M 0,0 5,-5 -12.5,0 5,5 Z"
  52 + id="path5357"
  53 + inkscape:connector-curvature="0" />
  54 + </marker>
  55 + <marker
  56 + inkscape:stockid="Arrow1Lend"
  57 + orient="auto"
  58 + refY="0"
  59 + refX="0"
  60 + id="marker5019"
  61 + style="overflow:visible"
  62 + inkscape:isstock="true">
  63 + <path
  64 + id="path5017"
  65 + d="M 0,0 5,-5 -12.5,0 5,5 Z"
  66 + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
  67 + transform="matrix(-0.8,0,0,-0.8,-10,0)"
  68 + inkscape:connector-curvature="0" />
  69 + </marker>
  70 + <marker
  71 + inkscape:stockid="Arrow1Lend"
  72 + orient="auto"
  73 + refY="0"
  74 + refX="0"
  75 + id="marker4863"
  76 + style="overflow:visible"
  77 + inkscape:isstock="true"
  78 + inkscape:collect="always">
  79 + <path
  80 + id="path4861"
  81 + d="M 0,0 5,-5 -12.5,0 5,5 Z"
  82 + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
  83 + transform="matrix(-0.8,0,0,-0.8,-10,0)"
  84 + inkscape:connector-curvature="0" />
  85 + </marker>
  86 + <marker
  87 + inkscape:stockid="Arrow1Lend"
  88 + orient="auto"
  89 + refY="0"
  90 + refX="0"
  91 + id="Arrow1Lend"
  92 + style="overflow:visible"
  93 + inkscape:isstock="true">
  94 + <path
  95 + id="path4580"
  96 + d="M 0,0 5,-5 -12.5,0 5,5 Z"
  97 + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
  98 + transform="matrix(-0.8,0,0,-0.8,-10,0)"
  99 + inkscape:connector-curvature="0" />
  100 + </marker>
  101 + </defs>
  102 + <sodipodi:namedview
  103 + id="base"
  104 + pagecolor="#ffffff"
  105 + bordercolor="#666666"
  106 + borderopacity="1.0"
  107 + inkscape:pageopacity="0.0"
  108 + inkscape:pageshadow="2"
  109 + inkscape:zoom="1.0104167"
  110 + inkscape:cx="335.34021"
  111 + inkscape:cy="240"
  112 + inkscape:document-units="mm"
  113 + inkscape:current-layer="g6086"
  114 + showgrid="false"
  115 + units="px"
  116 + inkscape:window-width="1366"
  117 + inkscape:window-height="704"
  118 + inkscape:window-x="0"
  119 + inkscape:window-y="27"
  120 + inkscape:window-maximized="1" />
  121 + <metadata
  122 + id="metadata5">
  123 + <rdf:RDF>
  124 + <cc:Work
  125 + rdf:about="">
  126 + <dc:format>image/svg+xml</dc:format>
  127 + <dc:type
  128 + rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
  129 + <dc:title></dc:title>
  130 + </cc:Work>
  131 + </rdf:RDF>
  132 + </metadata>
  133 + <g
  134 + inkscape:label="Layer 1"
  135 + inkscape:groupmode="layer"
  136 + id="layer1"
  137 + transform="translate(0,-170.0001)">
  138 + <g
  139 + id="g6086"
  140 + transform="translate(0,79.375004)">
  141 + <g
  142 + transform="matrix(0.78525619,0,0,0.78525619,-49.623926,77.658487)"
  143 + id="g4513">
  144 + <rect
  145 + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:#555753;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
  146 + id="rect4504"
  147 + width="72.343452"
  148 + height="24.587317"
  149 + x="79.908783"
  150 + y="145.22058" />
  151 + <text
  152 + xml:space="preserve"
  153 + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.05688667px;line-height:28.67301178px;font-family:Cantarell;-inkscape-font-specification:Cantarell;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.14692044px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  154 + x="82.755447"
  155 + y="163.29472"
  156 + id="text4508"><tspan
  157 + sodipodi:role="line"
  158 + id="tspan4506"
  159 + x="82.755447"
  160 + y="163.29472"
  161 + style="stroke-width:1.14692044px">Noosfero</tspan></text>
  162 + </g>
  163 + <g
  164 + id="g4521"
  165 + transform="matrix(0.78525619,0,0,0.78525619,44.313728,28.743922)">
  166 + <rect
  167 + y="145.22058"
  168 + x="79.908783"
  169 + height="24.587317"
  170 + width="72.343452"
  171 + id="rect4515"
  172 + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:#555753;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
  173 + <text
  174 + id="text4519"
  175 + y="163.19838"
  176 + x="96.076134"
  177 + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.05688667px;line-height:28.67301178px;font-family:Cantarell;-inkscape-font-specification:Cantarell;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.14692044px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  178 + xml:space="preserve"><tspan
  179 + style="stroke-width:1.14692044px"
  180 + y="163.19838"
  181 + x="96.076134"
  182 + id="tspan4517"
  183 + sodipodi:role="line">Colab</tspan></text>
  184 + </g>
  185 + <g
  186 + transform="matrix(0.78525619,0,0,0.78525619,12.608456,78.877338)"
  187 + id="g4529">
  188 + <rect
  189 + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:#555753;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
  190 + id="rect4523"
  191 + width="72.343452"
  192 + height="24.587317"
  193 + x="80.408913"
  194 + y="143.66841" />
  195 + <text
  196 + xml:space="preserve"
  197 + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.05688667px;line-height:28.67301178px;font-family:Cantarell;-inkscape-font-specification:Cantarell;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.14692044px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  198 + x="95.870644"
  199 + y="161.64621"
  200 + id="text4527"><tspan
  201 + sodipodi:role="line"
  202 + id="tspan4525"
  203 + x="95.870644"
  204 + y="161.64621"
  205 + style="stroke-width:1.14692044px">Gitlab</tspan></text>
  206 + </g>
  207 + <g
  208 + id="g4537"
  209 + transform="matrix(0.78525619,0,0,0.78525619,129.65802,78.713424)">
  210 + <rect
  211 + y="143.87715"
  212 + x="90.852165"
  213 + height="24.587317"
  214 + width="72.343452"
  215 + id="rect4531"
  216 + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:#555753;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
  217 + <text
  218 + id="text4535"
  219 + y="161.64621"
  220 + x="99.913902"
  221 + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.05688667px;line-height:28.67301178px;font-family:Cantarell;-inkscape-font-specification:Cantarell;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.14692044px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  222 + xml:space="preserve"><tspan
  223 + style="stroke-width:1.14692044px"
  224 + y="161.64621"
  225 + x="99.913902"
  226 + id="tspan4533"
  227 + sodipodi:role="line">Mezuro</tspan></text>
  228 + </g>
  229 + <g
  230 + id="g4545"
  231 + transform="matrix(0.78525619,0,0,0.78525619,126.12242,40.111281)">
  232 + <rect
  233 + y="193.03581"
  234 + x="15.603492"
  235 + height="24.587317"
  236 + width="72.343452"
  237 + id="rect4539"
  238 + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:#555753;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
  239 + <text
  240 + id="text4543"
  241 + y="211.01361"
  242 + x="22.292139"
  243 + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.05688667px;line-height:28.67301178px;font-family:Cantarell;-inkscape-font-specification:Cantarell;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.14692044px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  244 + xml:space="preserve"><tspan
  245 + style="stroke-width:1.14692044px"
  246 + y="211.01361"
  247 + x="22.292139"
  248 + id="tspan4541"
  249 + sodipodi:role="line">Mailman</tspan></text>
  250 + </g>
  251 + <g
  252 + transform="translate(-17.596701,-1.6758763)"
  253 + id="g4573">
  254 + <path
  255 + style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:#888a85;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
  256 + d="m 105.30904,123.67103 c 0,3.13366 -7.096307,5.15651 -7.096307,5.15651 0,0 -0.634831,10.34294 -4.763388,12.39652 -4.128557,2.05358 -14.837858,-1.9901 -14.837858,-1.9901 0,0 -10.290461,6.46437 -16.590428,6.46437 -6.299966,0 -16.088912,-7.96891 -16.088912,-7.96891 0,0 -8.034554,4.71236 -12.163111,2.65878 -4.128557,-2.05359 -6.435105,-10.39045 -6.435105,-10.39045 0,0 -3.752876,-3.69458 -3.752875,-6.82824 1e-6,-3.13366 5.758939,-5.49087 5.758939,-5.49087 0,0 -2.348532,-8.4531 1.754298,-10.55761 5.633102,-2.88945 17.512605,-0.51748 17.512605,-0.51748 0,0 7.114196,-6.29719 13.414161,-6.29719 6.299965,0 14.25002,6.13002 14.25002,6.13002 0,0 13.885563,-1.53611 18.01412,0.51748 4.128557,2.05358 5.097733,9.72176 5.097733,9.72176 0,0 5.926108,3.86175 5.926108,6.99541 z"
  257 + id="path4549"
  258 + inkscape:connector-curvature="0"
  259 + sodipodi:nodetypes="scscscscscscscscs" />
  260 + <text
  261 + xml:space="preserve"
  262 + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12.60877037px;line-height:22.51565933px;font-family:Cantarell;-inkscape-font-specification:Cantarell;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.90062636px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  263 + x="43.804577"
  264 + y="125.93317"
  265 + id="text4519-3"><tspan
  266 + sodipodi:role="line"
  267 + id="tspan4517-6"
  268 + x="43.804577"
  269 + y="125.93317"
  270 + style="stroke-width:0.90062636px">internet</tspan></text>
  271 + </g>
  272 + <path
  273 + sodipodi:nodetypes="csc"
  274 + inkscape:connector-curvature="0"
  275 + id="path4575"
  276 + d="m 89.299838,121.99515 c 0,0 41.636142,-2.8699 41.912782,9.30257 l 0.20948,9.21731"
  277 + style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#Arrow1Lend);enable-background:accumulate" />
  278 + <path
  279 + inkscape:connector-curvature="0"
  280 + id="path4859"
  281 + d="m 131.24135,164.86986 -87.987992,24.8855"
  282 + style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker4863);enable-background:accumulate" />
  283 + <path
  284 + inkscape:connector-curvature="0"
  285 + id="path5015"
  286 + d="m 143.33679,164.86986 87.98803,24.8855"
  287 + style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker5019);enable-background:accumulate" />
  288 + <path
  289 + sodipodi:nodetypes="cc"
  290 + style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker5359);enable-background:accumulate"
  291 + d="m 134.80714,164.86986 -24.36704,24.8855"
  292 + id="path5355"
  293 + inkscape:connector-curvature="0" />
  294 + <path
  295 + inkscape:connector-curvature="0"
  296 + id="path5931"
  297 + d="m 138.22112,164.86986 24.36704,24.8855"
  298 + style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker5935);enable-background:accumulate"
  299 + sodipodi:nodetypes="cc" />
  300 + </g>
  301 + </g>
  302 +</svg>
... ...
sbqs2017/figures/arch2.png 0 → 100644

109 KB

sbqs2017/figures/home-SPB.png 0 → 100644

88.4 KB

sbqs2017/figures/mapaconceitual.png 0 → 100644

99 KB

sbqs2017/figures/meeting_flows.png 0 → 100644

14.4 KB

sbqs2017/figures/technological-requirements.odg 0 → 100644
No preview for this file type
sbqs2017/figures/technological-requirements.png 0 → 100644

48.9 KB

sbqs2017/mezuro.tex 0 → 100644
... ... @@ -0,0 +1,207 @@
  1 +\documentclass[12pt]{article}
  2 +
  3 +\usepackage{sbc-template}
  4 +\usepackage{graphicx,url}
  5 +\usepackage[brazil]{babel}
  6 +\usepackage[utf8]{inputenc}
  7 +\usepackage{float}
  8 +\usepackage{setspace}
  9 +
  10 +\usepackage{tabularx}
  11 +\usepackage{cite}
  12 +
  13 +\begin{document}
  14 +\sloppy
  15 +\title{Mezuro - Coleta, interpretação e exibição automatizadas de métricas estáticas de código-fonte}
  16 +
  17 +\author{Rafael R. Manzo\inst{1}, Diego de A. M. Camarinha\inst{1},\\
  18 + Alessandro Palmeira\inst{1}, Fellipe S. Sampaio\inst{1},\\
  19 + Renan Fichberg\inst{1}, Paulo Meirelles\inst{2}}
  20 +
  21 +\address{Instituto de Matemática e Estatística -- Universidade de São Paulo (USP)\\
  22 + Rua do Matão, 1010 -- 05508-090 -- Cidade Universitária -- São Paulo -- SP -- Brasil
  23 +\nextinstitute
  24 + Faculdade de Engenharia -- UnB Gama (FGA)\\
  25 + Gama -- DF -- Brasil
  26 + \email{manzo@ime.usp.br,\{diego.camarinha,alessandro.palmeira\}@usp.br}
  27 + \email{\{renan.fichberg,fellipe.sampaio\}@usp.br,paulo@softwarelivre.org}
  28 +}
  29 +
  30 +\maketitle
  31 +\begin{abstract}
  32 + In this article, we present the motivation, main characteristics, architecture and a use case of the Mezuro free software project. The motivation behind the project will be presented through the problem of analyzing code metrics, making a brief comparison with other solutions avaliable in the market. We enumerate the main characteristics that distinguish Mezuro from it's competitors and why it's use can be more advantageous compared to other web services for source code analysis.
  33 +
  34 +\textbf{Keywords:} free software, source code analysis, source code metrics, web services.
  35 +\\
  36 +\textbf{Youtube video link:} \url{http://youtu.be/_am9noS0ICw}
  37 +\end{abstract}
  38 +
  39 +\begin{resumo}
  40 + Neste artigo, apresentaremos a motivação, as principais características, arquitetura e um caso de uso do projeto de \textit{software} livre Mezuro. A motivação por trás do projeto será apresentada por meio da dificuldade inerente à análise de métricas de código, fazendo um breve comparativo com outras soluções disponíveis no mercado. Enumeraremos as principais características que diferenciam o Mezuro de seus concorrentes e porque seu uso mostra-se mais vantajoso em comparação a outros serviços web de análise de código-fonte.
  41 +
  42 +\textbf{Palavras-chave:} \textit{software} livre, análise de código fonte, métricas de código, serviços \textit{web}.
  43 +\end{resumo}
  44 +
  45 +
  46 +\section{Introdução} \label{sec:intro}
  47 +Métricas de código-fonte estático são medidas extraídas a partir das análises léxica e sintática deste sem compilá-lo ou executá-lo e podem ser primitivas ou compostas, ou seja, formadas pela composição de uma ou mais métricas primitivas. Sua principal função é fornecer informações sobre complexidade, compreensão, testabilidade, manutenibilidade e evolução do código\cite{m13}.
  48 +
  49 +Exemplos de métricas podem ser simples como linhas de código e quantidade de métodos por classe ou complexas como conexões aferentes de uma classe.
  50 +Hoje existem diversas ferramentas para a simples extração de métricas como pylint\footnote{\url{http://www.pylint.org/}} (Python), metric\_fu\footnote{\url{https://github.com/metricfu/metric_fu}} (Ruby) e Analizo\footnote{\url{http://www.analizo.org/}} (C/C++ e Java), cada uma com diferentes graus de usabilidade, padrões e conjuntos de métricas, sendo necessária a criação de uma plataforma que reúna, organize e apresente essas informações para o usuário.
  51 +
  52 +\section{Motivação}\label{sec:motivacao}
  53 +Por meio da avaliação de métricas de código-fonte podemos definir como está a qualidade do \textit{software} e pensar em estratégias interessantes para lidar com a chamada ``crise do \textit{software}'' \cite{nr68}. Esta afirma que, com o crescimento da capacidade computacional, mais problemas difíceis passam a ter solução viável, mas que, por outro lado, a complexidade da interface para uso dos novos equipamentos (\textit{hardware}) e do processo de desenvolvimento atuais combinados com a complexidade dos problemas exacerbam falhas do \textit{software}. Assim, o controle da qualidade de um \textit{software} durante sua evolução no tempo torna-se uma ferramenta para identificar e prevenir tais falhas.
  54 +
  55 +Porém, incorporar esta avaliação às metodologias de desenvolvimento de \textit{software} não pode ser um processo manual em razão do risco desta prática cair em desuso. Isto se deve ao fato de que as ferramentas de extração de métricas, em geral, não apresentam uma interface amigável para seres humanos lerem seus resultados e muito menos um padrão entre si.
  56 +Neste contexto, uma ferramenta com as seguintes características se faz necessária para a introdução deste tipo de avaliação constante às metodologias:
  57 +\begin{itemize}
  58 + \item interface que agrupe as diversas ferramentas disponíveis;
  59 + \item permita seleção e composição de métricas de forma flexível;
  60 + \item manutenção de um histórico de evolução;
  61 + \item exiba os resultados de forma amigável.
  62 +\end{itemize}
  63 +
  64 +Por último, como explicado por Meirelles \cite{m13}, ainda não existe um consenso sobre qual conjunto de métricas é relevante para se avaliar a qualidade do código e muito menos quais valores destas supostas métricas são bons ou ruins. Portanto, mais uma característica interessante para uma ferramenta neste campo é que permita aos usuários especialistas definirem tais parâmetros, viabilizando estudos estatísticos que nos aproximem de uma conclusão.
  65 +
  66 +\section{Ferramentas similares}
  67 +Foram levantadas informações básicas sobre duas ferramentas similares já consolidados dentre desenvolvedores de \textit{software} para que possamos avaliá-las brevemente com respeito aos critérios definidos na motivação (seção \ref{sec:motivacao}).
  68 +
  69 +A primeira delas e mais próxima do idealizado, o SonarQube\footnote{\url{http://www.sonarqube.org/}} é um \textit{software} livre, licenciado como LGPLv3, que oferece uma plataforma de gerenciamento de qualidade de código. Por meio de \textit{plugins} disponíveis através de uma biblioteca\footnote{\url{http://docs.codehaus.org/display/SONAR/Plugin+Library/}}. Em sua versão básica ele classifica problemas encontrados no código e calcula métricas simples de cobertura de testes e divida técnica em várias linguagens. Entretanto, seus melhores \textit{plugins} tem código fechado e pago como, por exemplo, o para análise de C/C++\footnote{\url{http://www.sonarsource.com/products/plugins/languages/cpp/}}.
  70 +
  71 +Por sua vez, o Code Climate\footnote{\url{https://codeclimate.com/}} é uma ferramenta que fornece análise de códigos JavaScript ou Ruby (da versão 1.8 em diante) que estejam disponíveis em um servidor Git.
  72 +
  73 +O \textit{software} procura por ``\textit{code smells}'' no programa do usuário e os classifica como mais ou menos problemáticos levando em consideração o tamanho dos métodos e duplicação de blocos. Conforme os encontra, o programa atribui valores ao código para no final determinar uma nota de \textit{A} a \textit{F} com base no somatório dos valores encontrados. Note que a análise feita não necessariamente indica um problema real, uma vez que aquela pode ter sido a implementação escolhida pelo programador.
  74 +
  75 +Recentemente, o Code Climate iniciou uma análise estatística preliminar de todos os projetos que já foram analisados por este. Publicada informalmente em uma simples publicação em sua página\footnote{\url{http://blog.codeclimate.com/blog/2014/05/21/does-team-size-impact-code-quality/?utm_source=Code+Climate&utm_campaign=69c024549d-newsletter-NI-2014-05-22&utm_medium=email&utm_term=0_672a7f5529-69c024549d-317410425}}.
  76 +
  77 +\section{Mezuro}
  78 +O projeto Mezuro\footnote{\url{http://mezuro.org}}, com forte viés acadêmico, visa ser uma interface que permita, de forma flexível, a extração e análise de métricas estáticas de código-fonte, licenciado como \textit{Affero General Public License} versão 3 (AGPLv3). Nele, o usuário é o responsável por definir o conjunto de métricas a ser utilizado para realizar cálculos, com a possibilidade de armazenar os resultados para comparações futuras. Seu objetivo é:
  79 +\begin{itemize}
  80 + \item Aproximar-se de um consenso acerca de quais métricas devem ser empregadas na análise da qualidade de um código-fonte;
  81 + \item Buscar os valores destas métricas que definem a qualidade de um código-fonte.
  82 +\end{itemize}
  83 +
  84 + \subsection{Arquitetura}
  85 + Com o objetivo de ser agradável para o desenvolvedor, buscamos criar um sistema de simples manutenção que incorpore outras funcionalidades facilmente. Para isto, visamos:
  86 + \begin{itemize}
  87 + \item Minimizar a quantidade de código a ser mantida;
  88 + \item Testar e garantir a qualidade do código;
  89 + \item Modularizar a aplicação em diversos serviços independentes.
  90 + \end{itemize}
  91 +
  92 + No presente momento, a arquitetura está em reformulação tanto estruturalmente quanto no quesito da linguagem de programação.
  93 +
  94 + A figura \ref{fig:architecture-1} especifica seu atual estado:
  95 + \begin{figure}[H]
  96 + \centering
  97 + \includegraphics[width=\textwidth]{images/mezuro-architecture-actual.png}
  98 + \caption{Arquitetura atual do sistema.}
  99 + \label{fig:architecture-1}
  100 + \end{figure}
  101 + As elipses são os diferentes \textit{softwares} envolvidos e os paralelogramos as interfaces de comunicação entre eles. Na base do Mezuro existe o Kalibro, que está sendo reescrito
  102 + de Java para Ruby e segmentado em três entidades menores, como ilustrado na figura \ref{fig:architecture-2}:
  103 + \begin{figure}[H]
  104 + \centering
  105 + \includegraphics[width=\textwidth]{images/mezuro-architecture-predicted.png}
  106 + \caption{Arquitetura futura do sistema.}
  107 + \label{fig:architecture-2}
  108 + \end{figure}
  109 + O objetivo pretendido a com quebra da estrutura monolítica do Kalibro é que sua manutenção e evolução torne-se mais fácil, sem que todo o sistema seja comprometido.
  110 +
  111 + \subsection{Diferenciais} \label{subsec:motivacao}
  112 + As principais motivações para o surgimento de uma ferramenta como o Mezuro são os seguintes problemas:
  113 + \begin{itemize}
  114 + \item Não há parâmetros de comparação consolidados entre projetos;
  115 + \item Existem estudos, mas poucos dados empíricos;
  116 + \item Ainda é dada pouca importância ao monitoramento de código.
  117 + \end{itemize}
  118 +
  119 + \subsection{Por que usar o Mezuro?} \label{sec:projeto-mezuro}
  120 + Idealizado como uma plataforma de métricas de código, um dos diferenciais do Mezuro reside na possibilidade de gerar informação sobre o código-fonte de forma contínua: o usuário decide quando analisar novamente o projeto e acompanha detalhadamente a evolução das notas ao longo do tempo. Os resultados de cada análise são públicos, o que permite uma maior transparência entre o desenvolvedor e a comunidade que utiliza aquele \textit{software}. Assim, ela pode decidir se aquela solução atende ou não às suas necessidades e se deve depositar confiança na qualidade do \textit{software} desenvolvido.
  121 +
  122 + \subsection{Principais funcionalidades}\label{sec:princ-funcionalidades}
  123 + No Mezuro, as funcionalidades podem ser divididas em dois grupos:
  124 + \begin{itemize}
  125 + \item Projeto
  126 + \begin{itemize}
  127 + \item \textit{Download} do código-fonte a partir de repositórios (Git, Subversion, Bazaar etc) ou via arquivo compactado;
  128 + \item Escolha da periodicidade do processamento do código (1 dia, 2 dias, semanal, quinzenal e mensal);
  129 + \item Escolha de qual configuração de métricas cada repositório irá utilizar;
  130 + \item Nota de cada métrica da configuração para cada arquivo do repositório;
  131 + \item Análise gráfica de cada arquivo do repositório por meio de um gráfico de pontos com notas ao longo do tempo;
  132 + \item Resultados públicos e acessíveis à comunidade.
  133 + \end{itemize}
  134 + \item Configuração
  135 + \begin{itemize}
  136 + \item Criação de configuração e a possibilidade de clonagem;
  137 + \item Estatísticas sobre as configurações mais populares dentro da comunidade;
  138 + \item Criação de intervalos qualitativos associados aos valores das métricas;
  139 + \item Criação de grupos de leitura para a interpretação textual dos resultados das métricas;
  140 + \item Combinações de métricas nativas para criação de análises compostas e mais complexas.
  141 + \end{itemize}
  142 + \end{itemize}
  143 +
  144 + \subsection{A rede social}\label{sec:user-potencial}
  145 + O Mezuro tem o formato de uma rede social, no qual os participantes podem ver a produção de terceiros por meio da avaliação dos projetos ou do clone das configurações. Essa interação mútua e aberta pode ser interessante para desenvolvedores, gerentes de projeto, auditores de \textit{software} e até mesmo uma equipe de desenvolvimento inteira. O objetivo final é criar uma comunidade que veja o valor de tais metodologias e como isso pode contribuir para o sucesso do seu projeto.
  146 +
  147 + \subsection{Casos de uso}
  148 + Apresentaremos a seguir as duas principais funcionalidades da ferramenta ilustradas por meio de capturas de telas. Em todas elas, utilizamos uma conta já cadastrada no sistema (único privilégio necessário para realizá-las).
  149 +
  150 + \subsubsection{Criação de configuração}
  151 + \begin{figure}[H]
  152 + \centering
  153 + \includegraphics[width=\textwidth]{images/choose-metric.png}
  154 + \caption{Interface para escolha de ferramenta extratora de métrica e escolha de uma métrica nativa para adicionar a uma configuração.}
  155 + \label{fig:choose-metric}
  156 + \end{figure}
  157 +
  158 + Criar uma configuração envolve 5 telas do sistema em 4 passos básicos:
  159 + \begin{enumerate}
  160 + \item Acessar a página de listagem de configurações;
  161 + \item Clicando em ``New configuration'', preencher o formulário de criação de configuração e salvá-lo;
  162 + \item Clicando em ``Add metric'', escolher a ferramenta de extração e qual métrica a ser usada (figura \ref{fig:choose-metric});
  163 + \item Preencher o formulário (detalhado a seguir) e salvá-lo.
  164 + \end{enumerate}
  165 +
  166 + Os passos 3 e 4 devem ser repetidos para cada métrica adicionada à configuração. O formulário de métrica (passo 4) é complexo se comparado ao de configuração mas, assim como os demais, cada campo possui detalhes sobre sua utilização. Aqui, destacamos os menos evidentes:
  167 + \begin{itemize}
  168 + \item \textbf{Aggregation Form:} Maneira com a qual o resultado de uma métrica será agregado (média, mediana, máximo, etc);
  169 + \item \textbf{Reading Group:} Conjunto de intervalos usado para dar significado prático ao resultado calculado.
  170 + \end{itemize}
  171 +
  172 + \subsubsection{Criação de projeto e avaliação de repositório}
  173 + Criar um projeto envolve 2 passos básicos:
  174 + \begin{enumerate}
  175 + \item Acessar a página de listagem de projetos;
  176 + \item Clicando em ``New project'', escolher o nome, a descrição e salvá-lo.
  177 + \end{enumerate}
  178 +
  179 + \begin{figure}[H]
  180 + \centering
  181 + \includegraphics[width=\textwidth]{images/new-repository.png}
  182 + \caption{Interface para criação de um novo repositório.}
  183 + \label{fig:new-repository}
  184 + \end{figure}
  185 +
  186 + Ao clicar em ``New repository'' entramos na criação do repositório a ser avaliado (figura \ref{fig:new-repository}). Alguns campos merecem destaque:
  187 + \begin{itemize}
  188 + \item\textbf{Type:} Tipo do repositório (também pode ser um zip ou tarball) onde o código está hospedado;
  189 + \item\textbf{Address:} Endereço do repositório remoto ou o caminho absoluto no sistema de arquivos;
  190 + \item\textbf{Process Period:} Periodicidade com a qual o código deve ser analizado pela ferramenta (diariamente, semanalmente etc);
  191 + \item\textbf{Configuration:} Configuração de métricas que o usuário deseja utilizar para medir o código (pode ser escolhida dentre todas as configurações criadas pelos usuários).
  192 + \end{itemize}
  193 + Após preencher todos os campos e salvar o repositório, seu primeiro processamento será automaticamente ativado e o usuário será redirecionado para a página que exibe os resultados. Nela, ele poderá conferir dados do processamento (tempo gasto para o término de cada uma de suas fases) e navegar na árvore de módulos gerada, para que possa visualizar a nota, os resultados das métricas e suas interpretações para cada um deles (figura \ref{fig:results}). Além disso, ao clicar no nome de uma métrica calculada, um gráfico que representa a evolução dos seus valores ao longo do tempo será exibido.
  194 +
  195 + \begin{figure}[H]
  196 + \centering
  197 + \includegraphics[width=\textwidth]{images/new-repository-results.png}
  198 + \caption{Tela de visualização dos resultados do processamento do repositório.}
  199 + \label{fig:results}
  200 + \end{figure}
  201 +
  202 +\section{Conclusão}
  203 +O Mezuro surge como uma potencial resposta para a falta de monitoramento e padronização de código-fonte e a necessidade de avaliação do mesmo, considerando que é um \textit{software} livre, altamente customizável, com suporte para muitas linguagens computacionais, interface amigável, que fornece histórico de processamentos e também com uma arquitetura planejada para incorporar novas funcionalidades.
  204 +
  205 +\bibliographystyle{sbc}
  206 +\bibliography{mezuro}
  207 +\end{document}
... ...
sbqs2017/sbc-template.sty 0 → 100644
... ... @@ -0,0 +1,164 @@
  1 +% LaTeX definitions for SBC 2001 style
  2 +%
  3 +% Created by Jomi Hubner & Rafael Bordini, june 2001
  4 +% updated march 2005
  5 +
  6 +\NeedsTeXFormat{LaTeX2e}
  7 +\ProvidesPackage{sbc-template}[2001/06/09]
  8 +
  9 +% margem sup 3.5 cm: há 1,5 cm para header, + 2 cm para top
  10 +% margem inf 2.5 cm: há 1,5 cm para foot, + 1 cm para bottom
  11 +% margem esq/dir 3 cm
  12 +\RequirePackage[a4paper,top=3.5cm,left=3cm,right=3cm,bottom=2.5cm]{geometry}
  13 +
  14 +\parindent 1.27cm
  15 +\parskip 6pt
  16 +
  17 +\flushbottom
  18 +
  19 +% captions
  20 +\RequirePackage[bf,sf,footnotesize,indent]{caption2}
  21 +\setlength{\captionmargin}{0.8cm}
  22 +\renewcommand{\captionfont}{\sffamily\footnotesize\bfseries}
  23 +\renewcommand{\captionlabeldelim}{.}
  24 +
  25 +% font
  26 +\RequirePackage{times}
  27 +
  28 +\renewcommand{\normalsize}{\@setfontsize\normalsize\@xiipt\@xivpt}
  29 +\newcommand{\XIIIPT}{\@setfontsize\xiiipt{13}{17}}
  30 +\newcommand{\XVIPT}{\@setfontsize\xvipt{16}{20}}
  31 +
  32 +% new commands
  33 +\newcounter{instn}
  34 +\setcounter{instn}{1}
  35 +\newcommand{\instnum}{\arabic{instn}}
  36 +\newcommand{\inst}[1]{\ensuremath{^{#1}}}
  37 +\newcommand{\nextinstitute}{\\\mbox{}\\[-6pt] \addtocounter{instn}{1}\inst{\instnum}}
  38 +\newcommand{\email}[1]{\\\mbox{}\\[-6pt]\footnotesize\texttt{#1}}
  39 +\renewcommand{\and}{, }
  40 +
  41 +% to avoid [...] in the bibliography
  42 +% \item[] instead of \item[\@biblabel{#1}\hfill]
  43 +\def\@lbibitem[#1]#2{\item[]\if@filesw
  44 + {\let\protect\noexpand
  45 + \immediate
  46 + \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces}
  47 +\renewenvironment{thebibliography}[1]
  48 + {\section*{\refname
  49 + \@mkboth{\MakeUppercase\refname}{\MakeUppercase\refname}}%
  50 + \list{\@biblabel{\@arabic\c@enumiv}}%
  51 + {\settowidth\labelwidth{\@biblabel{#1}}%
  52 + \leftmargin\labelwidth
  53 + \advance\leftmargin\labelsep
  54 + %% changed!
  55 + \itemindent -\leftmargin
  56 + \itemsep 6pt
  57 + %%%%%%%%%%%
  58 + \@openbib@code
  59 + \usecounter{enumiv}%
  60 + \let\p@enumiv\@empty
  61 + \renewcommand\theenumiv{\@arabic\c@enumiv}}%
  62 + \sloppy
  63 + \clubpenalty4000
  64 + \@clubpenalty \clubpenalty
  65 + \widowpenalty4000%
  66 + \sfcode`\.\@m}
  67 + {\def\@noitemerr
  68 + {\@latex@warning{Empty `thebibliography' environment}}%
  69 + \endlist}
  70 +
  71 +
  72 +% itens
  73 +\setlength\leftmargini {1.27cm}
  74 +\setlength\leftmargin {\leftmargini}
  75 +\setlength\leftmarginii {\leftmargini}
  76 +\setlength\leftmarginiii {\leftmargini}
  77 +\setlength\leftmarginiv {\leftmargini}
  78 +\setlength \labelsep {.5em}
  79 +\setlength \labelwidth {\leftmargini}
  80 +\addtolength\labelwidth {-\labelsep}
  81 +\def\@listI{\leftmargin\leftmargini
  82 + \parsep 0\p@ \@plus1\p@ \@minus\p@
  83 + \topsep 0\p@ \@plus2\p@ \@minus4\p@
  84 + \itemsep0\p@}
  85 +\let\@listi\@listI
  86 +\@listi
  87 +\def\@listii {\leftmargin\leftmarginii
  88 + \labelwidth\leftmarginii
  89 + \advance\labelwidth-\labelsep
  90 + \topsep 0\p@ \@plus2\p@ \@minus\p@}
  91 +\def\@listiii{\leftmargin\leftmarginiii
  92 + \labelwidth\leftmarginiii
  93 + \advance\labelwidth-\labelsep
  94 + \topsep 0\p@ \@plus\p@\@minus\p@
  95 + \parsep \z@
  96 + \partopsep \p@ \@plus\z@ \@minus\p@}
  97 +
  98 +
  99 +% sections
  100 +\renewcommand\section{\@startsection{section}{1}{\z@}%
  101 + {-6\p@ \@plus -4\p@ \@minus -4\p@}%
  102 + {0\p@ \@plus 4\p@ \@minus 4\p@}%
  103 + {\normalfont\XIIIPT\bfseries\boldmath
  104 + \rightskip=\z@ \@plus 8em\pretolerance=10000 }}
  105 +
  106 +\renewcommand\subsection{\@startsection{subsection}{2}{\z@}%
  107 + {-6\p@ \@plus -4\p@ \@minus -4\p@}%
  108 + {0\p@ \@plus 4\p@ \@minus 4\p@}%
  109 + {\normalfont\normalsize\bfseries\boldmath
  110 + \rightskip=\z@ \@plus 8em\pretolerance=10000 }}
  111 +
  112 +%\renewcommand{\thesection}{\arabic{section}.}
  113 +%\renewcommand{\thesubsection}{\thesection\arabic{subsection}.}
  114 +%\renewcommand{\thesubsubsection}{\thesubsection\arabic{subsubsection}.}
  115 +
  116 +\RequirePackage{titlesec}
  117 +\titlelabel{\thetitle.\hspace{1ex}}
  118 +
  119 +% first page
  120 +
  121 +\pagestyle{empty}
  122 +
  123 +\newcommand{\authortag}[1]{$^{#1}$}
  124 +
  125 +\def\address#1{\gdef\@address{#1}}
  126 +
  127 +\def\@maketitle{\newpage
  128 + %\null % isso dava um espaco extra antes do title
  129 + \begin{center}
  130 + %\vglue -6pt
  131 +% \vspace*{12pt}
  132 +\vspace*{-.7cm}
  133 + {\XVIPT\bf\@title\par}
  134 + \vglue 6pt plus 3pt minus 3pt
  135 + {\normalsize
  136 + \textbf{\begin{tabular}[t]{c}\@author\end{tabular}}\par}
  137 + \vglue 6pt plus 3pt minus 3pt
  138 + {\normalsize
  139 + \begin{tabular}[t]{c}\inst{\instnum}\@address\end{tabular}\par}
  140 + \vglue 6pt plus 3pt minus 3pt
  141 + \end{center}\par
  142 +}
  143 +\let\maketitleOLD\maketitle
  144 +\renewcommand{\maketitle}{\maketitleOLD\thispagestyle{empty}}
  145 +
  146 +\renewenvironment{abstract}{%
  147 + \list{}{\advance\topsep by6pt\relax%\small
  148 + \leftmargin=0.8cm
  149 + \labelwidth=\z@
  150 + \listparindent=\z@
  151 + \itemindent\listparindent
  152 + \rightmargin\leftmargin}\item[\hskip\labelsep
  153 + \bfseries\itshape Abstract.]\itshape}%
  154 + {\endlist}
  155 +
  156 +\newenvironment{resumo}{%
  157 + \list{}{\advance\topsep by6pt\relax%\small
  158 + \leftmargin=0.8cm
  159 + \labelwidth=\z@
  160 + \listparindent=\z@
  161 + \itemindent\listparindent
  162 + \rightmargin\leftmargin}\item[\hskip\labelsep
  163 + \bfseries\itshape Resumo.]\itshape}%
  164 + {\endlist}
... ...
sbqs2017/sbc.bst 0 → 100644
... ... @@ -0,0 +1,1103 @@
  1 +%% copy of "apalike" for SBC (no comma before year in citation label)
  2 +
  3 +% BibTeX `apalike' bibliography style (24-Jan-88 version)
  4 +% Adapted from the `alpha' style, version 0.99a; for BibTeX version 0.99a.
  5 +% Copyright (C) 1988, all rights reserved.
  6 +% Copying of this file is allowed, provided that if you make any changes at all
  7 +% you name it something other than `apalike.bst'.
  8 +% This restriction helps ensure that all copies are identical.
  9 +% Differences between this style and `alpha' are generally heralded by a `%'.
  10 +% The file btxbst.doc has the documentation for alpha.bst.
  11 +%
  12 +% This style should be used with the `apalike' LaTeX style (apalike.sty).
  13 +% \cite's come out like "(Jones, 1986)" in the text but there are no labels
  14 +% in the bibliography, and something like "(1986)" comes out immediately
  15 +% after the author. Author (and editor) names appear as last name, comma,
  16 +% initials. A `year' field is required for every entry, and so is either
  17 +% an author (or in some cases, an editor) field or a key field.
  18 +%
  19 +% Editorial note:
  20 +% Many journals require a style like `apalike', but I strongly, strongly,
  21 +% strongly recommend that you not use it if you have a choice---use something
  22 +% like `plain' instead. Mary-Claire van Leunen (A Handbook for Scholars,
  23 +% Knopf, 1979) argues convincingly that a style like `plain' encourages better
  24 +% writing than one like `apalike'. Furthermore the strongest arguments for
  25 +% using an author-date style like `apalike'---that it's "the most practical"
  26 +% (The Chicago Manual of Style, University of Chicago Press, thirteenth
  27 +% edition, 1982, pages 400--401)---fall flat on their face with the new
  28 +% computer-typesetting technology. For instance page 401 anachronistically
  29 +% states "The chief disadvantage of [a style like `plain'] is that additions
  30 +% or deletions cannot be made after the manuscript is typed without changing
  31 +% numbers in both text references and list." LaTeX sidesteps the disadvantage.
  32 +%
  33 +% History:
  34 +% 15-sep-86 (SK,OP) Original version, by Susan King and Oren Patashnik.
  35 +% 10-nov-86 (OP) Truncated the sort.key$ string to the correct length
  36 +% in bib.sort.order to eliminate error message.
  37 +% 24-jan-88 (OP) Updated for BibTeX version 0.99a, from alpha.bst 0.99a;
  38 +% apalike now sorts by author, then year, then title;
  39 +% THIS `apalike' VERSION DOES NOT WORK WITH BIBTEX 0.98i.
  40 +
  41 +ENTRY
  42 + { address
  43 + author
  44 + booktitle
  45 + chapter
  46 + edition
  47 + editor
  48 + howpublished
  49 + institution
  50 + journal
  51 + key
  52 +% month not used in apalike
  53 + note
  54 + number
  55 + organization
  56 + pages
  57 + publisher
  58 + school
  59 + series
  60 + title
  61 + type
  62 + volume
  63 + year
  64 + }
  65 + {}
  66 + { label extra.label sort.label }
  67 +
  68 +INTEGERS { output.state before.all mid.sentence after.sentence after.block }
  69 +
  70 +FUNCTION {init.state.consts}
  71 +{ #0 'before.all :=
  72 + #1 'mid.sentence :=
  73 + #2 'after.sentence :=
  74 + #3 'after.block :=
  75 +}
  76 +
  77 +STRINGS { s t }
  78 +
  79 +FUNCTION {output.nonnull}
  80 +{ 's :=
  81 + output.state mid.sentence =
  82 + { ", " * write$ }
  83 + { output.state after.block =
  84 + { add.period$ write$
  85 + newline$
  86 + "\newblock " write$
  87 + }
  88 + { output.state before.all =
  89 + 'write$
  90 + { add.period$ " " * write$ }
  91 + if$
  92 + }
  93 + if$
  94 + mid.sentence 'output.state :=
  95 + }
  96 + if$
  97 + s
  98 +}
  99 +
  100 +FUNCTION {output}
  101 +{ duplicate$ empty$
  102 + 'pop$
  103 + 'output.nonnull
  104 + if$
  105 +}
  106 +
  107 +FUNCTION {output.check}
  108 +{ 't :=
  109 + duplicate$ empty$
  110 + { pop$ "empty " t * " in " * cite$ * warning$ }
  111 + 'output.nonnull
  112 + if$
  113 +}
  114 +
  115 +% apalike needs this function because
  116 +% the year has special punctuation;
  117 +% apalike ignores the month
  118 +FUNCTION {output.year.check}
  119 +{ year empty$
  120 + { "empty year in " cite$ * warning$ }
  121 + { write$
  122 + " (" year * extra.label * ")" *
  123 + mid.sentence 'output.state :=
  124 + }
  125 + if$
  126 +}
  127 +
  128 +FUNCTION {output.bibitem}
  129 +{ newline$
  130 + "\bibitem[" write$
  131 + label write$
  132 + "]{" write$
  133 + cite$ write$
  134 + "}" write$
  135 + newline$
  136 + ""
  137 + before.all 'output.state :=
  138 +}
  139 +
  140 +FUNCTION {fin.entry}
  141 +{ add.period$
  142 + write$
  143 + newline$
  144 +}
  145 +
  146 +FUNCTION {new.block}
  147 +{ output.state before.all =
  148 + 'skip$
  149 + { after.block 'output.state := }
  150 + if$
  151 +}
  152 +
  153 +FUNCTION {new.sentence}
  154 +{ output.state after.block =
  155 + 'skip$
  156 + { output.state before.all =
  157 + 'skip$
  158 + { after.sentence 'output.state := }
  159 + if$
  160 + }
  161 + if$
  162 +}
  163 +
  164 +FUNCTION {not}
  165 +{ { #0 }
  166 + { #1 }
  167 + if$
  168 +}
  169 +
  170 +FUNCTION {and}
  171 +{ 'skip$
  172 + { pop$ #0 }
  173 + if$
  174 +}
  175 +
  176 +FUNCTION {or}
  177 +{ { pop$ #1 }
  178 + 'skip$
  179 + if$
  180 +}
  181 +
  182 +FUNCTION {new.block.checkb}
  183 +{ empty$
  184 + swap$ empty$
  185 + and
  186 + 'skip$
  187 + 'new.block
  188 + if$
  189 +}
  190 +
  191 +FUNCTION {field.or.null}
  192 +{ duplicate$ empty$
  193 + { pop$ "" }
  194 + 'skip$
  195 + if$
  196 +}
  197 +
  198 +FUNCTION {emphasize}
  199 +{ duplicate$ empty$
  200 + { pop$ "" }
  201 + { "{\em " swap$ * "}" * }
  202 + if$
  203 +}
  204 +
  205 +INTEGERS { nameptr namesleft numnames }
  206 +
  207 +FUNCTION {format.names}
  208 +{ 's :=
  209 + #1 'nameptr :=
  210 + s num.names$ 'numnames :=
  211 + numnames 'namesleft :=
  212 + { namesleft #0 > }
  213 + { s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't := % last name first
  214 + nameptr #1 >
  215 + { namesleft #1 >
  216 + { ", " * t * }
  217 + { numnames #2 >
  218 + { "," * }
  219 + 'skip$
  220 + if$
  221 + t "others" =
  222 + { " et~al." * }
  223 + { " and " * t * }
  224 + if$
  225 + }
  226 + if$
  227 + }
  228 + 't
  229 + if$
  230 + nameptr #1 + 'nameptr :=
  231 + namesleft #1 - 'namesleft :=
  232 + }
  233 + while$
  234 +}
  235 +
  236 +FUNCTION {format.authors}
  237 +{ author empty$
  238 + { "" }
  239 + { author format.names }
  240 + if$
  241 +}
  242 +
  243 +FUNCTION {format.key} % this function is just for apalike
  244 +{ empty$
  245 + { key field.or.null }
  246 + { "" }
  247 + if$
  248 +}
  249 +
  250 +FUNCTION {format.editors}
  251 +{ editor empty$
  252 + { "" }
  253 + { editor format.names
  254 + editor num.names$ #1 >
  255 + { ", editors" * }
  256 + { ", editor" * }
  257 + if$
  258 + }
  259 + if$
  260 +}
  261 +
  262 +FUNCTION {format.title}
  263 +{ title empty$
  264 + { "" }
  265 + { title "t" change.case$ }
  266 + if$
  267 +}
  268 +
  269 +FUNCTION {n.dashify}
  270 +{ 't :=
  271 + ""
  272 + { t empty$ not }
  273 + { t #1 #1 substring$ "-" =
  274 + { t #1 #2 substring$ "--" = not
  275 + { "--" *
  276 + t #2 global.max$ substring$ 't :=
  277 + }
  278 + { { t #1 #1 substring$ "-" = }
  279 + { "-" *
  280 + t #2 global.max$ substring$ 't :=
  281 + }
  282 + while$
  283 + }
  284 + if$
  285 + }
  286 + { t #1 #1 substring$ *
  287 + t #2 global.max$ substring$ 't :=
  288 + }
  289 + if$
  290 + }
  291 + while$
  292 +}
  293 +
  294 +FUNCTION {format.btitle}
  295 +{ title emphasize
  296 +}
  297 +
  298 +FUNCTION {tie.or.space.connect}
  299 +{ duplicate$ text.length$ #3 <
  300 + { "~" }
  301 + { " " }
  302 + if$
  303 + swap$ * *
  304 +}
  305 +
  306 +FUNCTION {either.or.check}
  307 +{ empty$
  308 + 'pop$
  309 + { "can't use both " swap$ * " fields in " * cite$ * warning$ }
  310 + if$
  311 +}
  312 +
  313 +FUNCTION {format.bvolume}
  314 +{ volume empty$
  315 + { "" }
  316 + { "volume" volume tie.or.space.connect
  317 + series empty$
  318 + 'skip$
  319 + { " of " * series emphasize * }
  320 + if$
  321 + "volume and number" number either.or.check
  322 + }
  323 + if$
  324 +}
  325 +
  326 +FUNCTION {format.number.series}
  327 +{ volume empty$
  328 + { number empty$
  329 + { series field.or.null }
  330 + { output.state mid.sentence =
  331 + { "number" }
  332 + { "Number" }
  333 + if$
  334 + number tie.or.space.connect
  335 + series empty$
  336 + { "there's a number but no series in " cite$ * warning$ }
  337 + { " in " * series * }
  338 + if$
  339 + }
  340 + if$
  341 + }
  342 + { "" }
  343 + if$
  344 +}
  345 +
  346 +FUNCTION {format.edition}
  347 +{ edition empty$
  348 + { "" }
  349 + { output.state mid.sentence =
  350 + { edition "l" change.case$ " edition" * }
  351 + { edition "t" change.case$ " edition" * }
  352 + if$
  353 + }
  354 + if$
  355 +}
  356 +
  357 +INTEGERS { multiresult }
  358 +
  359 +FUNCTION {multi.page.check}
  360 +{ 't :=
  361 + #0 'multiresult :=
  362 + { multiresult not
  363 + t empty$ not
  364 + and
  365 + }
  366 + { t #1 #1 substring$
  367 + duplicate$ "-" =
  368 + swap$ duplicate$ "," =
  369 + swap$ "+" =
  370 + or or
  371 + { #1 'multiresult := }
  372 + { t #2 global.max$ substring$ 't := }
  373 + if$
  374 + }
  375 + while$
  376 + multiresult
  377 +}
  378 +
  379 +FUNCTION {format.pages}
  380 +{ pages empty$
  381 + { "" }
  382 + { pages multi.page.check
  383 + { "pages" pages n.dashify tie.or.space.connect }
  384 + { "page" pages tie.or.space.connect }
  385 + if$
  386 + }
  387 + if$
  388 +}
  389 +
  390 +FUNCTION {format.vol.num.pages}
  391 +{ volume field.or.null
  392 + number empty$
  393 + 'skip$
  394 + { "(" number * ")" * *
  395 + volume empty$
  396 + { "there's a number but no volume in " cite$ * warning$ }
  397 + 'skip$
  398 + if$
  399 + }
  400 + if$
  401 + pages empty$
  402 + 'skip$
  403 + { duplicate$ empty$
  404 + { pop$ format.pages }
  405 + { ":" * pages n.dashify * }
  406 + if$
  407 + }
  408 + if$
  409 +}
  410 +
  411 +FUNCTION {format.chapter.pages}
  412 +{ chapter empty$
  413 + 'format.pages
  414 + { type empty$
  415 + { "chapter" }
  416 + { type "l" change.case$ }
  417 + if$
  418 + chapter tie.or.space.connect
  419 + pages empty$
  420 + 'skip$
  421 + { ", " * format.pages * }
  422 + if$
  423 + }
  424 + if$
  425 +}
  426 +
  427 +FUNCTION {format.in.ed.booktitle}
  428 +{ booktitle empty$
  429 + { "" }
  430 + { editor empty$
  431 + { "In " booktitle emphasize * }
  432 + { "In " format.editors * ", " * booktitle emphasize * }
  433 + if$
  434 + }
  435 + if$
  436 +}
  437 +
  438 +FUNCTION {format.thesis.type}
  439 +{ type empty$
  440 + 'skip$
  441 + { pop$
  442 + type "t" change.case$
  443 + }
  444 + if$
  445 +}
  446 +
  447 +FUNCTION {format.tr.number}
  448 +{ type empty$
  449 + { "Technical Report" }
  450 + 'type
  451 + if$
  452 + number empty$
  453 + { "t" change.case$ }
  454 + { number tie.or.space.connect }
  455 + if$
  456 +}
  457 +
  458 +FUNCTION {format.article.crossref}
  459 +{ "In" % this is for apalike
  460 + " \cite{" * crossref * "}" *
  461 +}
  462 +
  463 +FUNCTION {format.book.crossref}
  464 +{ volume empty$
  465 + { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
  466 + "In "
  467 + }
  468 + { "Volume" volume tie.or.space.connect
  469 + " of " *
  470 + }
  471 + if$
  472 + "\cite{" * crossref * "}" * % this is for apalike
  473 +}
  474 +
  475 +FUNCTION {format.incoll.inproc.crossref}
  476 +{ "In" % this is for apalike
  477 + " \cite{" * crossref * "}" *
  478 +}
  479 +
  480 +FUNCTION {article}
  481 +{ output.bibitem
  482 + format.authors "author" output.check
  483 + author format.key output % special for
  484 + output.year.check % apalike
  485 + new.block
  486 + format.title "title" output.check
  487 + new.block
  488 + crossref missing$
  489 + { journal emphasize "journal" output.check
  490 + format.vol.num.pages output
  491 + }
  492 + { format.article.crossref output.nonnull
  493 + format.pages output
  494 + }
  495 + if$
  496 + new.block
  497 + note output
  498 + fin.entry
  499 +}
  500 +
  501 +FUNCTION {book}
  502 +{ output.bibitem
  503 + author empty$
  504 + { format.editors "author and editor" output.check
  505 + editor format.key output
  506 + }
  507 + { format.authors output.nonnull
  508 + crossref missing$
  509 + { "author and editor" editor either.or.check }
  510 + 'skip$
  511 + if$
  512 + }
  513 + if$
  514 + output.year.check % special for apalike
  515 + new.block
  516 + format.btitle "title" output.check
  517 + crossref missing$
  518 + { format.bvolume output
  519 + new.block
  520 + format.number.series output
  521 + new.sentence
  522 + publisher "publisher" output.check
  523 + address output
  524 + }
  525 + { new.block
  526 + format.book.crossref output.nonnull
  527 + }
  528 + if$
  529 + format.edition output
  530 + new.block
  531 + note output
  532 + fin.entry
  533 +}
  534 +
  535 +FUNCTION {booklet}
  536 +{ output.bibitem
  537 + format.authors output
  538 + author format.key output % special for
  539 + output.year.check % apalike
  540 + new.block
  541 + format.title "title" output.check
  542 + new.block
  543 + howpublished output
  544 + address output
  545 + new.block
  546 + note output
  547 + fin.entry
  548 +}
  549 +
  550 +FUNCTION {inbook}
  551 +{ output.bibitem
  552 + author empty$
  553 + { format.editors "author and editor" output.check
  554 + editor format.key output
  555 + }
  556 + { format.authors output.nonnull
  557 + crossref missing$
  558 + { "author and editor" editor either.or.check }
  559 + 'skip$
  560 + if$
  561 + }
  562 + if$
  563 + output.year.check % special for apalike
  564 + new.block
  565 + format.btitle "title" output.check
  566 + crossref missing$
  567 + { format.bvolume output
  568 + format.chapter.pages "chapter and pages" output.check
  569 + new.block
  570 + format.number.series output
  571 + new.sentence
  572 + publisher "publisher" output.check
  573 + address output
  574 + }
  575 + { format.chapter.pages "chapter and pages" output.check
  576 + new.block
  577 + format.book.crossref output.nonnull
  578 + }
  579 + if$
  580 + format.edition output
  581 + new.block
  582 + note output
  583 + fin.entry
  584 +}
  585 +
  586 +FUNCTION {incollection}
  587 +{ output.bibitem
  588 + format.authors "author" output.check
  589 + author format.key output % special for
  590 + output.year.check % apalike
  591 + new.block
  592 + format.title "title" output.check
  593 + new.block
  594 + crossref missing$
  595 + { format.in.ed.booktitle "booktitle" output.check
  596 + format.bvolume output
  597 + format.number.series output
  598 + format.chapter.pages output
  599 + new.sentence
  600 + publisher "publisher" output.check
  601 + address output
  602 + format.edition output
  603 + }
  604 + { format.incoll.inproc.crossref output.nonnull
  605 + format.chapter.pages output
  606 + }
  607 + if$
  608 + new.block
  609 + note output
  610 + fin.entry
  611 +}
  612 +
  613 +FUNCTION {inproceedings}
  614 +{ output.bibitem
  615 + format.authors "author" output.check
  616 + author format.key output % special for
  617 + output.year.check % apalike
  618 + new.block
  619 + format.title "title" output.check
  620 + new.block
  621 + crossref missing$
  622 + { format.in.ed.booktitle "booktitle" output.check
  623 + format.bvolume output
  624 + format.number.series output
  625 + format.pages output
  626 + address output % for apalike
  627 + new.sentence % there's no year
  628 + organization output % here so things
  629 + publisher output % are simpler
  630 + }
  631 + { format.incoll.inproc.crossref output.nonnull
  632 + format.pages output
  633 + }
  634 + if$
  635 + new.block
  636 + note output
  637 + fin.entry
  638 +}
  639 +
  640 +FUNCTION {conference} { inproceedings }
  641 +
  642 +FUNCTION {manual}
  643 +{ output.bibitem
  644 + format.authors output
  645 + author format.key output % special for
  646 + output.year.check % apalike
  647 + new.block
  648 + format.btitle "title" output.check
  649 + organization address new.block.checkb
  650 + organization output
  651 + address output
  652 + format.edition output
  653 + new.block
  654 + note output
  655 + fin.entry
  656 +}
  657 +
  658 +FUNCTION {mastersthesis}
  659 +{ output.bibitem
  660 + format.authors "author" output.check
  661 + author format.key output % special for
  662 + output.year.check % apalike
  663 + new.block
  664 + format.title "title" output.check
  665 + new.block
  666 + "Master's thesis" format.thesis.type output.nonnull
  667 + school "school" output.check
  668 + address output
  669 + new.block
  670 + note output
  671 + fin.entry
  672 +}
  673 +
  674 +FUNCTION {misc}
  675 +{ output.bibitem
  676 + format.authors output
  677 + author format.key output % special for
  678 + output.year.check % apalike
  679 + new.block
  680 + format.title output
  681 + new.block
  682 + howpublished output
  683 + new.block
  684 + note output
  685 + fin.entry
  686 +}
  687 +
  688 +FUNCTION {phdthesis}
  689 +{ output.bibitem
  690 + format.authors "author" output.check
  691 + author format.key output % special for
  692 + output.year.check % apalike
  693 + new.block
  694 + format.btitle "title" output.check
  695 + new.block
  696 + "PhD thesis" format.thesis.type output.nonnull
  697 + school "school" output.check
  698 + address output
  699 + new.block
  700 + note output
  701 + fin.entry
  702 +}
  703 +
  704 +FUNCTION {proceedings}
  705 +{ output.bibitem
  706 + format.editors output
  707 + editor format.key output % special for
  708 + output.year.check % apalike
  709 + new.block
  710 + format.btitle "title" output.check
  711 + format.bvolume output
  712 + format.number.series output
  713 + address output % for apalike
  714 + new.sentence % we always output
  715 + organization output % a nonempty organization
  716 + publisher output % here
  717 + new.block
  718 + note output
  719 + fin.entry
  720 +}
  721 +
  722 +FUNCTION {techreport}
  723 +{ output.bibitem
  724 + format.authors "author" output.check
  725 + author format.key output % special for
  726 + output.year.check % apalike
  727 + new.block
  728 + format.title "title" output.check
  729 + new.block
  730 + format.tr.number output.nonnull
  731 + institution "institution" output.check
  732 + address output
  733 + new.block
  734 + note output
  735 + fin.entry
  736 +}
  737 +
  738 +FUNCTION {unpublished}
  739 +{ output.bibitem
  740 + format.authors "author" output.check
  741 + author format.key output % special for
  742 + output.year.check % apalike
  743 + new.block
  744 + format.title "title" output.check
  745 + new.block
  746 + note "note" output.check
  747 + fin.entry
  748 +}
  749 +
  750 +FUNCTION {default.type} { misc }
  751 +
  752 +MACRO {jan} {"January"}
  753 +
  754 +MACRO {feb} {"February"}
  755 +
  756 +MACRO {mar} {"March"}
  757 +
  758 +MACRO {apr} {"April"}
  759 +
  760 +MACRO {may} {"May"}
  761 +
  762 +MACRO {jun} {"June"}
  763 +
  764 +MACRO {jul} {"July"}
  765 +
  766 +MACRO {aug} {"August"}
  767 +
  768 +MACRO {sep} {"September"}
  769 +
  770 +MACRO {oct} {"October"}
  771 +
  772 +MACRO {nov} {"November"}
  773 +
  774 +MACRO {dec} {"December"}
  775 +
  776 +MACRO {acmcs} {"ACM Computing Surveys"}
  777 +
  778 +MACRO {acta} {"Acta Informatica"}
  779 +
  780 +MACRO {cacm} {"Communications of the ACM"}
  781 +
  782 +MACRO {ibmjrd} {"IBM Journal of Research and Development"}
  783 +
  784 +MACRO {ibmsj} {"IBM Systems Journal"}
  785 +
  786 +MACRO {ieeese} {"IEEE Transactions on Software Engineering"}
  787 +
  788 +MACRO {ieeetc} {"IEEE Transactions on Computers"}
  789 +
  790 +MACRO {ieeetcad}
  791 + {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"}
  792 +
  793 +MACRO {ipl} {"Information Processing Letters"}
  794 +
  795 +MACRO {jacm} {"Journal of the ACM"}
  796 +
  797 +MACRO {jcss} {"Journal of Computer and System Sciences"}
  798 +
  799 +MACRO {scp} {"Science of Computer Programming"}
  800 +
  801 +MACRO {sicomp} {"SIAM Journal on Computing"}
  802 +
  803 +MACRO {tocs} {"ACM Transactions on Computer Systems"}
  804 +
  805 +MACRO {tods} {"ACM Transactions on Database Systems"}
  806 +
  807 +MACRO {tog} {"ACM Transactions on Graphics"}
  808 +
  809 +MACRO {toms} {"ACM Transactions on Mathematical Software"}
  810 +
  811 +MACRO {toois} {"ACM Transactions on Office Information Systems"}
  812 +
  813 +MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"}
  814 +
  815 +MACRO {tcs} {"Theoretical Computer Science"}
  816 +
  817 +READ
  818 +
  819 +FUNCTION {sortify}
  820 +{ purify$
  821 + "l" change.case$
  822 +}
  823 +
  824 +INTEGERS { len }
  825 +
  826 +FUNCTION {chop.word}
  827 +{ 's :=
  828 + 'len :=
  829 + s #1 len substring$ =
  830 + { s len #1 + global.max$ substring$ }
  831 + 's
  832 + if$
  833 +}
  834 +
  835 +% There are three apalike cases: one person (Jones),
  836 +% two (Jones and de~Bruijn), and more (Jones et~al.).
  837 +% This function is much like format.crossref.editors.
  838 +%
  839 +FUNCTION {format.lab.names}
  840 +{ 's :=
  841 + s #1 "{vv~}{ll}" format.name$
  842 + s num.names$ duplicate$
  843 + #2 >
  844 + { pop$ " et~al." * }
  845 + { #2 <
  846 + 'skip$
  847 + { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
  848 + { " et~al." * }
  849 + { " and " * s #2 "{vv~}{ll}" format.name$ * }
  850 + if$
  851 + }
  852 + if$
  853 + }
  854 + if$
  855 +}
  856 +
  857 +FUNCTION {author.key.label}
  858 +{ author empty$
  859 + { key empty$
  860 + { cite$ #1 #3 substring$ }
  861 + 'key % apalike uses the whole key
  862 + if$
  863 + }
  864 + { author format.lab.names }
  865 + if$
  866 +}
  867 +
  868 +FUNCTION {author.editor.key.label}
  869 +{ author empty$
  870 + { editor empty$
  871 + { key empty$
  872 + { cite$ #1 #3 substring$ }
  873 + 'key % apalike uses the whole key
  874 + if$
  875 + }
  876 + { editor format.lab.names }
  877 + if$
  878 + }
  879 + { author format.lab.names }
  880 + if$
  881 +}
  882 +
  883 +FUNCTION {editor.key.label}
  884 +{ editor empty$
  885 + { key empty$
  886 + { cite$ #1 #3 substring$ }
  887 + 'key % apalike uses the whole key, no organization
  888 + if$
  889 + }
  890 + { editor format.lab.names }
  891 + if$
  892 +}
  893 +
  894 +FUNCTION {calc.label}
  895 +{ type$ "book" =
  896 + type$ "inbook" =
  897 + or
  898 + 'author.editor.key.label
  899 + { type$ "proceedings" =
  900 + 'editor.key.label % apalike ignores organization
  901 + 'author.key.label % for labeling and sorting
  902 + if$
  903 + }
  904 + if$
  905 + " " % these three lines are
  906 + * % for apalike, which
  907 + year field.or.null purify$ #-1 #4 substring$ % uses all four digits
  908 + *
  909 + 'label :=
  910 +}
  911 +
  912 +FUNCTION {sort.format.names}
  913 +{ 's :=
  914 + #1 'nameptr :=
  915 + ""
  916 + s num.names$ 'numnames :=
  917 + numnames 'namesleft :=
  918 + { namesleft #0 > }
  919 + { nameptr #1 >
  920 + { " " * }
  921 + 'skip$
  922 + if$ % apalike uses initials
  923 + s nameptr "{vv{ } }{ll{ }}{ f{ }}{ jj{ }}" format.name$ 't := % <= here
  924 + nameptr numnames = t "others" = and
  925 + { "et al" * }
  926 + { t sortify * }
  927 + if$
  928 + nameptr #1 + 'nameptr :=
  929 + namesleft #1 - 'namesleft :=
  930 + }
  931 + while$
  932 +}
  933 +
  934 +FUNCTION {sort.format.title}
  935 +{ 't :=
  936 + "A " #2
  937 + "An " #3
  938 + "The " #4 t chop.word
  939 + chop.word
  940 + chop.word
  941 + sortify
  942 + #1 global.max$ substring$
  943 +}
  944 +
  945 +FUNCTION {author.sort}
  946 +{ author empty$
  947 + { key empty$
  948 + { "to sort, need author or key in " cite$ * warning$
  949 + ""
  950 + }
  951 + { key sortify }
  952 + if$
  953 + }
  954 + { author sort.format.names }
  955 + if$
  956 +}
  957 +
  958 +FUNCTION {author.editor.sort}
  959 +{ author empty$
  960 + { editor empty$
  961 + { key empty$
  962 + { "to sort, need author, editor, or key in " cite$ * warning$
  963 + ""
  964 + }
  965 + { key sortify }
  966 + if$
  967 + }
  968 + { editor sort.format.names }
  969 + if$
  970 + }
  971 + { author sort.format.names }
  972 + if$
  973 +}
  974 +
  975 +FUNCTION {editor.sort}
  976 +{ editor empty$
  977 + { key empty$
  978 + { "to sort, need editor or key in " cite$ * warning$
  979 + ""
  980 + }
  981 + { key sortify }
  982 + if$
  983 + }
  984 + { editor sort.format.names }
  985 + if$
  986 +}
  987 +
  988 +% apalike uses two sorting passes; the first one sets the
  989 +% labels so that the `a's, `b's, etc. can be computed;
  990 +% the second pass puts the references in "correct" order.
  991 +% The presort function is for the first pass. It computes
  992 +% label, sort.label, and title, and then concatenates.
  993 +FUNCTION {presort}
  994 +{ calc.label
  995 + label sortify
  996 + " "
  997 + *
  998 + type$ "book" =
  999 + type$ "inbook" =
  1000 + or
  1001 + 'author.editor.sort
  1002 + { type$ "proceedings" =
  1003 + 'editor.sort
  1004 + 'author.sort
  1005 + if$
  1006 + }
  1007 + if$
  1008 + #1 entry.max$ substring$ % for
  1009 + 'sort.label := % apalike
  1010 + sort.label % style
  1011 + *
  1012 + " "
  1013 + *
  1014 + title field.or.null
  1015 + sort.format.title
  1016 + *
  1017 + #1 entry.max$ substring$
  1018 + 'sort.key$ :=
  1019 +}
  1020 +
  1021 +ITERATE {presort}
  1022 +
  1023 +SORT % by label, sort.label, title---for final label calculation
  1024 +
  1025 +STRINGS { last.label next.extra } % apalike labels are only for the text;
  1026 +
  1027 +INTEGERS { last.extra.num } % there are none in the bibliography
  1028 +
  1029 +FUNCTION {initialize.extra.label.stuff} % and hence there is no `longest.label'
  1030 +{ #0 int.to.chr$ 'last.label :=
  1031 + "" 'next.extra :=
  1032 + #0 'last.extra.num :=
  1033 +}
  1034 +
  1035 +FUNCTION {forward.pass}
  1036 +{ last.label label =
  1037 + { last.extra.num #1 + 'last.extra.num :=
  1038 + last.extra.num int.to.chr$ 'extra.label :=
  1039 + }
  1040 + { "a" chr.to.int$ 'last.extra.num :=
  1041 + "" 'extra.label :=
  1042 + label 'last.label :=
  1043 + }
  1044 + if$
  1045 +}
  1046 +
  1047 +FUNCTION {reverse.pass}
  1048 +{ next.extra "b" =
  1049 + { "a" 'extra.label := }
  1050 + 'skip$
  1051 + if$
  1052 + label extra.label * 'label :=
  1053 + extra.label 'next.extra :=
  1054 +}
  1055 +
  1056 +EXECUTE {initialize.extra.label.stuff}
  1057 +
  1058 +ITERATE {forward.pass}
  1059 +
  1060 +REVERSE {reverse.pass}
  1061 +
  1062 +% Now that the label is right we sort for real,
  1063 +% on sort.label then year then title. This is
  1064 +% for the second sorting pass.
  1065 +FUNCTION {bib.sort.order}
  1066 +{ sort.label
  1067 + " "
  1068 + *
  1069 + year field.or.null sortify
  1070 + *
  1071 + " "
  1072 + *
  1073 + title field.or.null
  1074 + sort.format.title
  1075 + *
  1076 + #1 entry.max$ substring$
  1077 + 'sort.key$ :=
  1078 +}
  1079 +
  1080 +ITERATE {bib.sort.order}
  1081 +
  1082 +SORT % by sort.label, year, title---giving final bibliography order
  1083 +
  1084 +FUNCTION {begin.bib}
  1085 +{ preamble$ empty$ % no \etalchar in apalike
  1086 + 'skip$
  1087 + { preamble$ write$ newline$ }
  1088 + if$
  1089 + "\begin{thebibliography}{}" write$ newline$ % no labels in apalike
  1090 +}
  1091 +
  1092 +EXECUTE {begin.bib}
  1093 +
  1094 +EXECUTE {init.state.consts}
  1095 +
  1096 +ITERATE {call.type$}
  1097 +
  1098 +FUNCTION {end.bib}
  1099 +{ newline$
  1100 + "\end{thebibliography}" write$ newline$
  1101 +}
  1102 +
  1103 +EXECUTE {end.bib}
... ...
sbqs2017/spb.bib 0 → 100644
... ... @@ -0,0 +1,48 @@
  1 +@book{kon2012,
  2 + title={Software Livre e Propriedade Intelectual: Aspectos Jur{\'\i}dicos, Licen{\c{c}}as e Modelos de Neg{\'o}cios},
  3 + author={Kon, Fabio and Lago, Nelson and Meirelles, Paulo and Sabino, Vanessa},
  4 + journal={http://ccsl. ime. usp. br/files/slpi. pdf>. Acesso em},
  5 + volume={2},
  6 + pages={12},
  7 + year={2012}
  8 +}
  9 +
  10 +@article{hippel2003,
  11 + author = {Hippel, Eric von and Krogh, Georg von},
  12 + title = {Open Source Software and the "Private-Collective" Innovation Model: Issues for Organization Science},
  13 + journal = {Organization Science},
  14 + issue_date = {March 2003},
  15 + volume = {14},
  16 + number = {2},
  17 + month = mar,
  18 + year = {2003},
  19 + issn = {1526-5455},
  20 + pages = {209--223},
  21 + numpages = {15},
  22 + url = {http://dx.doi.org/10.1287/orsc.14.2.209.14992},
  23 + doi = {10.1287/orsc.14.2.209.14992},
  24 + acmid = {970585},
  25 + publisher = {INFORMS},
  26 + address = {Institute for Operations Research and the Management Sciences (INFORMS), Linthicum, Maryland, USA},
  27 + keywords = {Incentives, Innovation, Open source software, User innovation, users, collective action},
  28 +}
  29 +
  30 +@phdthesis{meirelles2013,
  31 + title={Monitoring Source Code Metrics in Free Software Projects},
  32 + author={Meirelles, Paulo Roberto Miranda},
  33 + year={2013},
  34 + school={Department of Computer Science -- Institute of Mathematics and Statistics of University of S{\~a}o Paulo},
  35 + note = {[in portuguese]},
  36 + url={http://www.teses.usp.br/teses/disponiveis/45/45134/tde-27082013-090242/en.php}
  37 +}
  38 +
  39 +@mastersthesis{sabino2009,
  40 + title={A systematic study on Free Software License},
  41 + author={Vanessa Sabino},
  42 + year={2009},
  43 + school={Department of Computer Science -- Institute of Mathematics and Statistics of University of S{\~a}o Paulo},
  44 + note = {[in portuguese]},
  45 + url={http://www.teses.usp.br/teses/disponiveis/45/45134/tde-14032012-003454/en.php}
  46 +
  47 +}
  48 +
... ...
sbqs2017/spb.tex 0 → 100644
... ... @@ -0,0 +1,52 @@
  1 +\documentclass[12pt]{article}
  2 +
  3 +\usepackage{sbc-template}
  4 +\usepackage{graphicx,url}
  5 +%\usepackage[brazil]{babel}
  6 +\usepackage[utf8]{inputenc}
  7 +\usepackage{float}
  8 +\usepackage{setspace}
  9 +
  10 +\usepackage{tabularx}
  11 +\usepackage{cite}
  12 +
  13 +\begin{document}
  14 +\sloppy
  15 +\title{Brazilian Public Software Portal: an integrated platform for collaborative development}
  16 +
  17 +\author{Paulo Meirelles\inst{1,2}, Antonio Terceiro\inst{3}, Hilmer Neri\inst{1},\\
  18 + Melissa Wen\inst{3}, Rodrigo Siqueira\inst{2}, Lucas Kanashiro\inst{2}}
  19 +
  20 +\address{Faculdade UnB Gama (FGA) -- Universidade de Brasília (UnB)\\
  21 + Gama -- DF -- Brasil
  22 + \email{\{paulormm,hilmer\}@unb.br}
  23 +\nextinstitute
  24 + Instituto de Matemática e Estatística -- Universidade de São Paulo (USP)\\
  25 + Rua do Matão, 1010 -- 05508-090 -- Cidade Universitária -- São Paulo -- SP -- Brasil
  26 + \email{\{siqueira,lkd\}@ime.usp.br}
  27 +\nextinstitute
  28 + Cooperativa de Tecnologias Livre -- Colivre\\
  29 + Salvador -- BA -- Brasil
  30 + \email{\{terceiro,melissa\}@colivre.coop.br}
  31 +}
  32 +
  33 +\maketitle
  34 +
  35 +%------------------------------------------------------------------------------
  36 +\input{content/00-abstract}
  37 +%------------------------------------------------------------------------------
  38 +\input{content/01-introduction}
  39 +\input{content/02-spb}
  40 +\input{content/03-requirements}
  41 +\input{content/04-architecture}
  42 +\input{content/05-features}
  43 +\input{content/06-ux}
  44 +\input{content/07-process}
  45 +\input{content/08-contributions}
  46 +\input{content/09-lessons}
  47 +\input{content/10-finals}
  48 +
  49 +%------------------------------------------------------------------------------
  50 +\bibliographystyle{sbc}
  51 +\bibliography{spb}
  52 +\end{document}
... ...