Commit b85b82f01201a8ddf930c2491d8ed87292af6814
1 parent
7232b692
Exists in
master
and in
2 other branches
Formating according to SBC template for SBQS 2017
Showing
26 changed files
with
3170 additions
and
0 deletions
Show diff stats
... | ... | @@ -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 | + | ... | ... |
... | ... | @@ -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'. | ... | ... |
... | ... | @@ -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 | + | ... | ... |
... | ... | @@ -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 | + | ... | ... |
... | ... | @@ -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 | + | ... | ... |
... | ... | @@ -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 | + | ... | ... |
... | ... | @@ -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}. | ... | ... |
... | ... | @@ -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. | ... | ... |
... | ... | @@ -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. | ... | ... |
... | ... | @@ -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 | + | ... | ... |
... | ... | @@ -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 | + | ... | ... |
... | ... | @@ -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 | + | ... | ... |
... | ... | @@ -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 | ... | ... |
39.2 KB
... | ... | @@ -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> | ... | ... |
109 KB
88.4 KB
99 KB
14.4 KB
No preview for this file type
48.9 KB
... | ... | @@ -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} | ... | ... |
... | ... | @@ -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} | ... | ... |
... | ... | @@ -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} | ... | ... |
... | ... | @@ -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 | + | ... | ... |
... | ... | @@ -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} | ... | ... |