Commit 0115b8d880aac568b9b3d53e3a429e709017a03e
1 parent
84ce26e8
Exists in
master
and in
1 other branch
Adding CBSoft industry track proposal
Showing
12 changed files
with
2235 additions
and
0 deletions
Show diff stats
@@ -0,0 +1,15 @@ | @@ -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 @@ | @@ -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,59 @@ | @@ -0,0 +1,59 @@ | ||
1 | +\section*{Introdução} | ||
2 | +\label{sec:intro} | ||
3 | + | ||
4 | +O Software Público Brasileiro (SPB) é um programa do Governo Federal Brasileiro | ||
5 | +para promover o compartilhamento e a colaboração em soluções de software | ||
6 | +livre\footnote{Neste texto, usamos o termo software livre como referente à Free | ||
7 | +and Open Source Software (FOSS).} para a administração pública. Um Software | ||
8 | +Público Brasileiro é considerado um bem público e o governo federal assume | ||
9 | +algumas responsabilidades relacionadas ao seu uso, mas tem os mesmos princípios | ||
10 | +de desenvolvimento de software livre, tal qual a tendência à descentralização | ||
11 | +na tomada de decisões, o compartilhamento de informações e do desenvolvimento | ||
12 | +(código), e a interação contínua com seus usuários. Em 2007, o governo federal | ||
13 | +lançou o portal SPB com o objetivo de compartilhar projetos de software livre | ||
14 | +desenvolvidos pelo governo brasileiro. Adicionalmente, a Instrução Normativa | ||
15 | +(IN 04/2012) determina que os agentes públicos devem priorizar as soluções | ||
16 | +disponíveis no Portal SPB. Em suma, a aquisição de uma solução proprietária | ||
17 | +deve ser explicitamente justificada ao demonstrar que não há alternativa | ||
18 | +adequada no Portal SPB. | ||
19 | + | ||
20 | +Entretanto, desde 2009, o Portal SPB teve vários problemas técnicas. O código | ||
21 | +original da plataforma não estava mais sendo desenvolvido, e havia uma grande | ||
22 | +quantidade de dívidas técnicas para superar. Depois de alguns eventos e | ||
23 | +encontros para coletar os requisitos via os agentes do governo federal e da | ||
24 | +sociedade, foi desenvolvida, entre janeiro de 2014 e junho de 2016, uma nova | ||
25 | +plataforma para o Portal SPB, pela Universidade de Brasília (UnB) e a | ||
26 | +Universidade de São Paulo (USP) em parceria com o Ministério de Orçamento, | ||
27 | +Planejamento e Gestão (MP). Este foi projetado como uma plataforma integrada | ||
28 | +para desenvolvimento de software colaborativo, e inclui funcionalidades para | ||
29 | +redes sociais, listas de discussão, sistema de controle de versão e | ||
30 | +monitoramento de qualidade de código-fonte. Para coordenar e desenvolver esse | ||
31 | +projeto durante 30 meses, a UnB recebeu do Governo Federal Brasileiro um total | ||
32 | +de 2.619.965,00 reais. | ||
33 | + | ||
34 | +O projeto foi desenvolvido por uma equipe de 3 professores, 2 estudantes de | ||
35 | +mestrado e cerca de 50 alunos de graduação (não todos ao mesmo tempo), | ||
36 | +juntamente com 2 designers profissionais e 6 desenvolvedores sêniors da | ||
37 | +comunidade software livre. Os professores e todos os estudantes de graduação | ||
38 | +eram da UnB e os mestrandos eram da USP. Quanto aos designers e desenvolvedores | ||
39 | +seniores, 7 dos 8 viviam fora de Brasília. Em outras palavras, nós tínhamos uma | ||
40 | +equipe trabalhando em um ambiente virtual colaborativo e distribuído. | ||
41 | + | ||
42 | +Todo o desenvolvimento foi feito de forma aberta, e as mudanças que | ||
43 | +precisávamos nas ferramentas foram devolvidas às suas respectivas comunidades. | ||
44 | +Nosso processo foi baseado em práticas ágeis e nos mecanismos empíricos das | ||
45 | +comunidades de software livre. Definimos ciclos de desenvolvimento e lançamos 5 | ||
46 | +versões do novo SPB Portal. A primeira versão (beta) foi disponibilizada em | ||
47 | +setembro de 2014, apenas 9 meses desde o início do projeto. O antigo portal foi | ||
48 | +desligado em setembro de 2015. Por fim, a última versão foi entregue em junho | ||
49 | +de 2016. | ||
50 | + | ||
51 | +Neste relato temos como agenda apresentarmos uma visão geral dessa nova geração | ||
52 | +do Portal SPB, bem como, compartilharmos nossa metodologia e processo de | ||
53 | +desenvolvimento desse projeto ao trabalharmos com o governo federal brasileiro | ||
54 | +para cumprir suas exigências, ao mesmo tempo ser o mais fiel possível às | ||
55 | +comunidades de software livre envolvidas. Além disso, discutiremos várias | ||
56 | +lições aprendidas para fornecer um ambiente virtual colaborativo e distribuído, | ||
57 | +envolvendo uma grande equipe de estudantes de graduação e desenvolvedores | ||
58 | +sêniors remotos. | ||
59 | + |
@@ -0,0 +1,69 @@ | @@ -0,0 +1,69 @@ | ||
1 | +\section{Visão geral do novo portal SPB} | ||
2 | +\label{sec:architecture} | ||
3 | + | ||
4 | +Com base na extensa lista de requisitos funcionais definidos pelo Governo | ||
5 | +Federal do Brasil, selecionamos alguns sistemas livres compor a solução | ||
6 | +proposta para o novo SPB. Avaliamos os sistemas que juntos poderiam fornecer o | ||
7 | +maior sub-conjunto possível dos requisitos. Nós também estávamos convencidos de | ||
8 | +que seria impossível fornecer todas as funcionalidade com uma única ferramenta. | ||
9 | + | ||
10 | +Do ponto de vista da arquitetura, dois requisitos eram importantes para a nova | ||
11 | +plataforma: | ||
12 | + | ||
13 | +\begin{enumerate} | ||
14 | +\item \textit{Integrar sistemas livres existentes}, com diferenças mínimas de suas versões originais; | ||
15 | +\item \textit{Fornecer uma interface de usuário unificada} entre os diferentes sistemas, bem como a autenticação centralizada. | ||
16 | +\end{enumerate} | ||
17 | + | ||
18 | +A adoção de sistemas livres existentes e a minimização de mudanças feitas | ||
19 | +localmente tiveram como objetivo ser capazes de atualizar para versões mais | ||
20 | +recentes do software original, nos beneficiando pelas melhorias e manutenção feitas | ||
21 | +pelas comunidades de projetos existentes. Proporcionar uma interface de usuário | ||
22 | +consistente em cima dessas diferentes ferramentas era necessária para fazer a | ||
23 | +transição entre os diferentes sistemas sem a percepção do ponto de vista dos | ||
24 | +usuários, ou seja, sem confundí-lo através de interfaces completamente | ||
25 | +diferentes ao interagir com o portal. | ||
26 | + | ||
27 | +Para o primeiro requisito, identificamos quatro sistemas principais que exigiam | ||
28 | +equipes especializadas para o trabalho no processo de integração. As equipes | ||
29 | +aprenderam a desenvolver para os sistemas designados e contribuíram para as | ||
30 | +comunidades originais, de modo que a versão que usamos não era | ||
31 | +significativamente diferente do original. | ||
32 | + | ||
33 | +Ao final do projeto, o portal SPB foi composto por mais de dez sistemas, como | ||
34 | +Colab, Noosfero, Mezuro, Gitlab, Mailman, Postfix e Munin. A seguir | ||
35 | +apresentamos os mais relevantes, bem como como eles foram integrados na | ||
36 | +plataforma. | ||
37 | + | ||
38 | +\begin{itemize} | ||
39 | + | ||
40 | +\item \textbf{Colab\footnote{\url{https://github.com/colab}}:} é uma plataforma | ||
41 | +de integração de sistemas para aplicações web. Um de seus objetivos é permitir | ||
42 | +que diferentes aplicações sejam combinadas de tal forma que um usuário não note | ||
43 | +a mudança entre as aplicações. Para isso, o Colab oferece autenticação | ||
44 | +centralizada, consistência visual, retransmissão de eventos entre aplicações e | ||
45 | +mecanismo de busca integrado. | ||
46 | + | ||
47 | +\item \textbf{Noosfero\footnote{\url{http://noosfero.org}}:} é um software para | ||
48 | +redes sociais e de colaboração. Além dos recursos clássicos de redes sociais, | ||
49 | +ele também fornece recursos de publicação de conteúdo, como blogs e CMS | ||
50 | +(\textit{Content Management System}) de propósito geral. A maioria das | ||
51 | +interações do usuário com o novo SPB são através do Noosfero: registro do usuário, | ||
52 | +páginas do projeto e de documentação e formulários de contato. | ||
53 | + | ||
54 | +\item \textbf{Gitlab\footnote{\url{http://gitlab.com}}:} é um gerenciador web | ||
55 | +de repositórios Git com páginas wiki e recursos de \textit{issue tracker}. O | ||
56 | +Gitlab é uma plataforma livre e se concentra em oferecer uma solução para | ||
57 | +desenvolvimento colaborativo em torno do repositório. | ||
58 | + | ||
59 | +\item \textbf{Mezuro\footnote{\url{http://mezuro.org/}}:} é uma plataforma para | ||
60 | +coletar métricas de código-fonte com o objetivo de monitorar a qualidade | ||
61 | +interna de projetos de software livre escrito em C, C ++, Java, Python, Ruby ou | ||
62 | +PHP. | ||
63 | + | ||
64 | +\end{itemize} | ||
65 | + | ||
66 | +Do ponto de vista prático, a plataforma SPB foi implantada em 7 máquinas | ||
67 | +virtuais com diferentes | ||
68 | +funções\footnote{\url{https://softwarepublico.gov.br/doc/arquitetura.html}}. | ||
69 | + |
@@ -0,0 +1,175 @@ | @@ -0,0 +1,175 @@ | ||
1 | +\section{Processo e organização do desenvolvimento} | ||
2 | +\label{sec:process} | ||
3 | + | ||
4 | +A nossa equipe de desenvolvimento era composta por profissionais com diferentes | ||
5 | +níveis e habilidades, sendo a maioria deles estudantes de graduação de | ||
6 | +engenharia de software (a partir do 4º semestre de curso). Uma vez que os | ||
7 | +alunos não podiam dedicar muitas horas por semana ao projeto, eles sempre | ||
8 | +tiveram a flexibilidade para negociar seus horários de trabalho durante o | ||
9 | +semestre, a fim de não prejudicar a sua formação. Sua rotina de trabalho diária | ||
10 | +no projeto incluiu programação e tarefas de DevOps (contabilizando 16 | ||
11 | +horas-semanais). | ||
12 | + | ||
13 | +O desenvolvimento do projeto SPB exigiu uma vasta experiência, que os alunos de | ||
14 | +graduação geralmente ainda não têm. Por essa razão, alguns desenvolvedores | ||
15 | +sênior se juntaram ao projeto para ajudar com as questões mais difíceis e | ||
16 | +transferir conhecimento aos alunos. Sua principal tarefa era fornecer soluções | ||
17 | +para problemas complexos. Como esses profissionais são muito hábeis e o projeto | ||
18 | +não poderia financiar um trabalho de tempo integral, eles trabalharam | ||
19 | +parcialmente no projeto (20 horas-semanais). Além disso, eles viviam em estados | ||
20 | +diferentes espalhados pelo Brasil, ou até outros países, o que levou muita da | ||
21 | +comunicação a ser on-line. | ||
22 | + | ||
23 | +Em resumo, nosso processo de trabalho foi baseado em práticas de | ||
24 | +desenvolvimento de software livre e colaborativo. O processo de | ||
25 | +desenvolvimento foi definido com base na adaptação de diferentes práticas ágeis e de software livre, destacando o alto grau de automação | ||
26 | +resultante das práticas de DevOps. Assim, o processo de trabalho foi executado | ||
27 | +de forma cadenciada e contínua. | ||
28 | + | ||
29 | +Finalmente, o último grupo de participantes desse projeto foi composto por | ||
30 | +funcionários do Ministério | ||
31 | +do Planejamento, Desenvolvimento e Gestão (MP). Todas as decisões do projeto, | ||
32 | +validações e definições de escopo foram feitas com eles. Dessa forma, | ||
33 | +desenvolvemos produtos de software de forma incremental, com lançamentos | ||
34 | +alinhados aos objetivos estratégicos do negócio. Como se pode ver, o projeto | ||
35 | +tinha muitos tipos diferentes de \textit{stakeholders} que tinham de ser | ||
36 | +organizados e sincronizados. | ||
37 | + | ||
38 | +\subsection{Organização da equipe} | ||
39 | + | ||
40 | +Aproximadamente 70\% das equipes de desenvolvimento foram compostas por | ||
41 | +estudantes de engenharia de software da UnB e que trabalharam fisicamente no mesmo | ||
42 | +laboratório. Cada aluno tinha seu próprio horário baseado em suas aulas, o que | ||
43 | +complicava a implementação da programação em pares. Os desenvolvedores sênior | ||
44 | +tentavam sincronizar sua agenda com os alunos em sua sub-equipe. Para lidar com | ||
45 | +esse ambiente, tivemos algumas regras básicas que guiaram a organização do | ||
46 | +projeto: | ||
47 | + | ||
48 | +\begin{enumerate} | ||
49 | +\item As aulas têm alta prioridade para estudantes de graduação; | ||
50 | +\item Trabalhe em pares sempre que possível (local com os demais estudantes ou | ||
51 | + remotamente com um sênior). | ||
52 | +\item Deve haver uma manhã ou uma tarde por semana quando \emph{todos} deverem | ||
53 | + estar juntos fisicamente no laboratório (exceto, é claro, os membros da | ||
54 | + equipe remota, mas que estarão on-line). | ||
55 | +\item A cada 2 ou 3 meses, os desenvolvedores sêniors (residentes no Brasil) | ||
56 | + voaria e trabalharia ao lado dos alunos por uma semana. | ||
57 | +\end{enumerate} | ||
58 | + | ||
59 | +Com as regras acima, dividimos todo o projeto em quatro equipes diferentes: | ||
60 | +Colab, Noosfero, Design e DevOps. Cada equipe tinha um líder (\textit{coach}) | ||
61 | +responsável por reduzir o problema de comunicação com as outras equipes e | ||
62 | +ajudar os membros a se organizar da melhor maneira para todos (sempre | ||
63 | +respeitando seu tempo de trabalho). O \textit{coach} sempre foi um dos alunos | ||
64 | +que trabalhava como desenvolvedor na equipe com o dever extra de registar as | ||
65 | +tarefas atuais desenvolvidas na iteração (\textit{sprint}) e com a | ||
66 | +responsabilidade de conversar com outras equipes. Uma coisa importante a | ||
67 | +observar é a mutabilidade da equipe e do \textit{coach}, pois durante o projeto | ||
68 | +muitos alunos mudaram de equipes para tentar ter diferentes experiências em | ||
69 | +diversas áreas. | ||
70 | + | ||
71 | +Uma característica das equipes foi a presença de (pelo menos) um sênior por | ||
72 | +equipe. Isso era essencial, porque as decisões difíceis e os problemas | ||
73 | +complexos, geralmente, foram resolvidos ao consultá-los. Essa dinâmica | ||
74 | +incentivamos aos demais alunos a terem o mesmo compartamento do \textit{coach} | ||
75 | +mesmo sem serem. Por fim, os desenvolvedores sêniors trabalharam diretamente | ||
76 | +com os alunos, e isso foi importante para dar ao graduando a oportunidade de | ||
77 | +interagir com profissionais experientes em sua área e manter o conhecimento | ||
78 | +fluindo no projeto. | ||
79 | + | ||
80 | +Por fim, tivemos ainda dois últimos elementos da organização da equipe que | ||
81 | +foram essenciais para a harmonia do projeto: o \textit{meta-coach} e | ||
82 | +professores. O primeiro era um engenheiro de software recentemente graduado | ||
83 | +(nossos ex-alunos) e que queria continuar trabalhando no projeto; estes últimos | ||
84 | +eram professores que orquestraram todas as interações entre todos os membros do | ||
85 | +projeto, inclusive do governo federal. O \textit{meta-coach} normalmente | ||
86 | +trabalhava em uma equipe específica e tinha a tarefa extra de conhecer o estado | ||
87 | +atual de todas as equipes. Os professores e \textit{meta-coach} trabalharam | ||
88 | +juntos para reduzir o problema de comunicação entre todas as equipes (o que | ||
89 | +tornava-se mais complexo conforme a evolução do volume de trabalho). Por | ||
90 | +último, todas as tarefas burocráticas, como a elaboração de relatórios sobre o | ||
91 | +progresso do projeto para o Ministério, foi tratada pelos professores, mas com | ||
92 | +o envolvimento de toda a equipe. | ||
93 | + | ||
94 | +\subsection{Comunicação e gestão das tarefas} | ||
95 | + | ||
96 | +Nossa equipe tinha muitas pessoas trabalhando em conjunto, e a maioria dos | ||
97 | +sêniors trabalhavam remotamente. Além disso, tentamos manter nosso trabalho | ||
98 | +completamente transparente para o governo brasileiro e os cidadãos interessados | ||
99 | +em seguir o projeto. Para lidar com esses casos, usamos um conjunto de | ||
100 | +ferramentas de comunicação e outras para gerenciar o projeto. | ||
101 | + | ||
102 | +Quando um aluno tinha que trabalhar em par com um sênior, normalmente, eles | ||
103 | +usavam o hangout do Google para a comunicação e eles compartilhavam uma sessão | ||
104 | +de terminal GNU/Linux com o tmate, o que lhes permitia compartilhar o mesmo | ||
105 | +editor, com ambos digitando e vendo a tela. Para perguntas e discussão rápida, | ||
106 | +usamos o IRC. Para a notificação geral, usamos as listas de discussão. | ||
107 | + | ||
108 | +Para a gestão do projeto utilizávamos o próprio portal SPB; Primeiro para | ||
109 | +validá-lo por nós mesmos, e também porque ele tem todas as ferramentas | ||
110 | +necessárias para o nosso projeto. Basicamente, criamos uma página Wiki, no | ||
111 | +Gitlab integrado ao SPB, com um mapeamento entre as visões estratégica, tática | ||
112 | +e operacional. Do ponto de vista prático, um ``milestone'' no GitLab era uma | ||
113 | +``História de Usuário" (funcionalidade) e um ou mais ``issues'' no GitLab era | ||
114 | +as tarefas para o desenvolvimento da funcionalidade em questão. Com essa | ||
115 | +abordagem, conseguimos dois objetivos importantes: manter toda a gestão o mais | ||
116 | +próximo possível do código-fonte e acompanhar cada funcionalidade desenvolvida | ||
117 | +durante o projeto (uma vez que nós mesmo nos tornamos usuários reais da | ||
118 | +plataforma). | ||
119 | + | ||
120 | +\subsection{Acompanhamento e gerenciamento de projeto de alto nível} | ||
121 | + | ||
122 | +O governo brasileiro costuma trabalhar com o desenvolvimento de software de uma | ||
123 | +forma mais tradicional, diferentemente de nós com métodos ágeis e software | ||
124 | +livre. Essa dissonância nos causou um ruído de comunicação com o governo. Foi | ||
125 | +especialmente difícil convencê-los a aceitar a ideia de escopo aberto e | ||
126 | +desenvolvimento ágil. Entretanto, depois de meses de trabalho e mostrando | ||
127 | +resultados, eles deixaram de resistir aos métodos empíricos. | ||
128 | + | ||
129 | +Definimos algum nível de granularidade de reunião para evitar gerar demasiada | ||
130 | +sobrecarga para os desenvolvedores. Tínhamos reuniões estratégica mensal e | ||
131 | +reuniões planejamento e revisão a cada 15 dias. Na reunião estratégica, | ||
132 | +geralmente, definimos as prioridades e as funcionalidades importantes para o | ||
133 | +governo. Normalmente, os professores, os \textit{coaches} de cada equipe, os | ||
134 | +\textit{meta-coaches} e alguns analistas do Ministério do Planejamento | ||
135 | +participavam dessa reunião. Em geral, discutíamos o que a equipe já produziu | ||
136 | +desde nossa última reunião e definíamos as funcionalidades para a próxima | ||
137 | +versão. Observe que apenas parte da equipe participava dessas reuniões | ||
138 | +estratégicas, mas todos os estudantes interessados estavam convidados a | ||
139 | +participar (pois muitos estudantes quiseram essa experiência durante o | ||
140 | +projeto). | ||
141 | + | ||
142 | +Depois dos encontros estratégicos com os principais atores envolvidos do | ||
143 | +governo, tínhamos um turno de planejamento com todas as equipes juntas. Nessa | ||
144 | +parte, cada equipe trabalhava junto para converter os requisitos em partes | ||
145 | +menores (histórias de usuário) que era representadas como ``Épicos'' da | ||
146 | +``release'' em desenvolvimento. Cada \textit{coach} era responsável pela | ||
147 | +condução do planejamento, e depois a equipe toda a registrava na página wiki do | ||
148 | +projeto (wiki fornecido pelo Gitlab do SPB). Baseado nos ``épicos'', a cada 15 | ||
149 | +dias a equipe gerava um o planejamento da iteração/ciclo de desenvolvimento | ||
150 | +(com os pequenos passos dos problemas mapeados). Para manter o governo | ||
151 | +brasileiro sempre atualizado, convidávamos-os a trabalhar conosco para validar | ||
152 | +as funcionalidades em desenvolvimento. Para isso, tínhamos uma reunião a cada | ||
153 | +15 dia. E para manter nosso fluxo de gestão de tarefas, usando a própria | ||
154 | +plataforma do SPB, especialmente o Gitlab, tínhamos: | ||
155 | + | ||
156 | +\begin{enumerate} | ||
157 | + | ||
158 | +\item Temos uma organização com muitos repositórios para cada ferramenta | ||
159 | +integrada e sub-sistema; | ||
160 | + | ||
161 | +\item Cada \textit{milestone} foi usado para registrar uma história de usuário; | ||
162 | + | ||
163 | +\item Cada \textit{release} tem uma página no wiki com a compilação da reunião | ||
164 | +estratégica e o mapeamento sistemático das funcionalidades planejadas; | ||
165 | + | ||
166 | +\item Para cada \textit{milestone} (história de usuário) tem um conjunto de | ||
167 | +\textit{issues} (tarefas) específicas, que também são mapeadas na wiki da | ||
168 | +\textit{release}, indicando qual dupla de desenvolvedores está trabalhando na | ||
169 | +\textit{issue} em questão. | ||
170 | + | ||
171 | +\end{enumerate} | ||
172 | + | ||
173 | +Em suma, esse fluxo de trabalho proporcionou a nós e aos participantes pelo | ||
174 | +governo brasileiro uma rastreabilidade completa e uma visão de alto nível de | ||
175 | +cada funcionalidade (requisito) até para o nível mais baixo (código). |
@@ -0,0 +1,116 @@ | @@ -0,0 +1,116 @@ | ||
1 | +\section{Lições Aprendidas} | ||
2 | +\label{sec:lessons} | ||
3 | + | ||
4 | +\textbf{Envolver alunos de graduação em projetos do mundo real, interagindo com clientes reais.} | ||
5 | +% | ||
6 | +Nossa equipe foi composta principalmente de estudantes de graduação em | ||
7 | +engenharia de software, que tiveram a oportunidade de interagir com | ||
8 | +desenvolvedores sênior e designers dentro da equipe, bem como com a equipe de | ||
9 | +técnicos e gerentes do governo brasileiro. | ||
10 | +% | ||
11 | +Eles interagiram com profissionais que possuíam diversos conhecimentos e foram | ||
12 | +capazes de participar em todos os níveis do processo de desenvolvimento de | ||
13 | +software. Isto contribuiu para uma grande oportunidade de aprendizado, e para | ||
14 | +a maioria deles esta foi a sua primeira experiência profissional. | ||
15 | + | ||
16 | +\textbf{A participação de profissionais experientes é crucial para o sucesso do projeto.} | ||
17 | +% | ||
18 | +Um fator importante para os alunos foi a composição das equipes com a | ||
19 | +participação de profissionais experientes. No lado técnico, os desenvolvedores | ||
20 | +sênior e designers lidavam com as decisões técnicas mais difíceis, criando | ||
21 | +um ambiente de trabalho onde os alunos poderiam desenvolver suas habilidades de | ||
22 | +forma didática e sem pressão. No lado gerencial, a participação ativa dos | ||
23 | +professores - que são, no final, os responsáveis pelo projeto - é | ||
24 | +crucial para garantir que a participação dos alunos seja conduzida de forma | ||
25 | +saudável e seja um exemplo de liderar pelo exemplo. | ||
26 | + | ||
27 | +\textbf{Uma relação equilibrada entre academia e indústria.} | ||
28 | +% | ||
29 | +A experiência do projeto SPB levou o LAPPIS/UnB a desenvolver um estilo de trabalho que | ||
30 | +demonstrou ser apropriado para um ambiente educacional que reúne academia e | ||
31 | +indústria. A maior prioridade do ponto de vista da universidade são os alunos. | ||
32 | +Diante disso, as atividades do projeto nunca foram priorizadas em detrimento | ||
33 | +das aulas e outras atividades pedagógicas. Em resumo, tínhamos alunos | ||
34 | +trabalhando em horários diferentes, a tempo parcial, localmente, | ||
35 | +sempre respeitando suas condições individuais, mas fazendo o trabalho de | ||
36 | +maneira coletiva, colaborativa e aberta. E mesmo sob um ambiente potencialmente | ||
37 | +adverso, o projeto entregou a solução desejada com sucesso. | ||
38 | +% | ||
39 | +Ao final do projeto, notamos que as habilidades desenvolvidas pelos alunos | ||
40 | +estavam no estado da arte da prática de engenharia de software. Depois que o | ||
41 | +projeto terminou, tivemos membros da equipe que abraçaram com sucesso | ||
42 | +oportunidades em organizações públicas, privadas, nacionais e internacionais, | ||
43 | +além dos estudantes que entraram no empreendedorismo e abriram suas próprias | ||
44 | +empresas. No início do projeto, as partes interessadas do governo brasileiro | ||
45 | +tinham certas expectativas sobre o desenvolvimento de projetos que, digamos, | ||
46 | +não correspondiam exatamente ao nosso trabalho baseado em práticas ágeis e de | ||
47 | +software livre. Tivemos que desenvolver estratégias que apoiassem diferentes | ||
48 | +culturas organizacionais. Conforme relatado na seção\ref{sec:process}, o Ministério do Planejamento é | ||
49 | +organizado em uma estrutura organizacional hierárquica, tipicamente, | ||
50 | +um paradigma de desenvolvimento tradicional. Portanto, tivemos que criar um | ||
51 | +processo de ``tradução'' entre nossa equipe e os analistas do MP que gerenciaram o | ||
52 | +projeto do lado deles. | ||
53 | + | ||
54 | +\textbf{Gerenciar separadamente os objetivos de nível estratégico e de nível operacional.} | ||
55 | +% | ||
56 | +Durante a fase inicial do projeto, a equipe de MP costumava trazer discussões | ||
57 | +estratégicas para reuniões técnicas/operacionais, onde deveríamos discutir | ||
58 | +decisões práticas e técnicas. | ||
59 | +% | ||
60 | +Isso resultou em um ambiente de comunicação e gerenciamento altamente complexo, | ||
61 | +sobrecarregando os professores, uma vez eles eram responsáveis por | ||
62 | +manter o alinhamento estratégico do MP sincronizado com os planejamentos de | ||
63 | +implementação da equipe de desenvolvimento, especialmente à luz do | ||
64 | +desmembramento cultural acima mencionado. A mistura de ambas as preocupações | ||
65 | +nas mesmas discussões causava confusão em ambos os lados. Para o meio e fim do | ||
66 | +projeto, conseguimos manter essas preocupações separadas, o que facilitou o | ||
67 | +trabalho de todos os envolvidos. | ||
68 | + | ||
69 | +\textbf{Não aceitar más decisões técnicas por questões políticas.} | ||
70 | +% | ||
71 | +Nas fases iniciais do projeto, por motivação política e pessoal, os principais | ||
72 | +atores do governo brasileiro, envolvidos na época, impuseram o uso da Colab | ||
73 | +para orientar o desenvolvimento da nova plataforma SPB. Nossa equipe estava | ||
74 | +totalmente contra a essa ideia, porque já sabíamos que o Colab era um projeto | ||
75 | +muito experimental e sua adoção poderia aumentar dramaticamente a complexidade | ||
76 | +do projeto. Mesmo nós fornecendo as razões técnicas para não utilizar Colab, MP | ||
77 | +foi inflexível e tivemos de gerir este problema. Fizemos mudanças maciças e, ao | ||
78 | +final do projeto, reescrevemos completamente o Colab e o tornamos estável (o | ||
79 | +transformando em um Sistema de Sistema em camada de aplicação). É importante | ||
80 | +notar que o MP nos obrigou a aceitar uma questão técnica baseada apenas em | ||
81 | +interesses políticos, sem considerar todos os recursos que seriam gastos devido | ||
82 | +a essa decisão. Ao final do projeto, verificamos que a Colab de fato consumiu a | ||
83 | +maior quantidade do orçamento e aumentou a complexidade do projeto. | ||
84 | + | ||
85 | +\textbf{Considerar a sustentabilidade desde o início.} | ||
86 | +% | ||
87 | +No processo de implantação da plataforma SPB na estrutura do MP, tivemos que | ||
88 | +interagir com os técnicos do MP. Fizemos vários workshops, treinamento e uma | ||
89 | +documentação meticulosa descrevendo todos os procedimentos necessários para | ||
90 | +atualizar a plataforma, no entanto, percebemos que os técnicos do MP | ||
91 | +constantemente evitavam essa responsabilidade. Depois de notar essa situação, | ||
92 | +nós organizamos uma equipe de DevOps específica que automatizou completamente | ||
93 | +todo o procedimento de implantação. Nós simplificamos toda a implantação da | ||
94 | +plataforma para algumas etapas: (1) configurações iniciais (apenas configuração | ||
95 | +SSH) e (2) a execução de comandos simples para atualizar completamente a | ||
96 | +plataforma. Ao final do projeto, observamos que os técnicos do MP sempre dependiam | ||
97 | +do nosso apoio para atualizar a plataforma, mesmo com toda a automação | ||
98 | +fornecida por nós. Ficamos tristemente com um sentimento de incerteza sobre o | ||
99 | +futuro da plataforma após o término do projeto. Em retrospectiva, percebemos | ||
100 | +que o MP dedicou analistas de sistemas e gerentes para o projeto, mas não | ||
101 | +técnicos de operações e desenvolvedores, que deveria ter sido envolvido com o | ||
102 | +processo para que pudessem, pelo menos, de forma confortável, fazer a manutenção | ||
103 | +da infra-estrutura plataforma. | ||
104 | + | ||
105 | +Por fim, o novo portal do Software Público Brasileiro está disponível em | ||
106 | +\url{https://softwarepublico.gov.br}. Toda a documentação, incluindo a | ||
107 | +arquitetura detalhada e os manuais de operação, também estão disponíveis em | ||
108 | +\url{https://softwarepublico.gov.br/doc}. Todas as ferramentas integradas são | ||
109 | +software livre e nossas contribuições foram publicadas em repositórios abertos, | ||
110 | +disponíveis no próprio portal SPB. Também contribuímos com funcionalidades e | ||
111 | +melhorias para as respectivas comunidades dos projetos integrados: que | ||
112 | +beneficiam essas comunidades, assim como nós, pois podemos compartilhar o | ||
113 | +desenvolvimento futuro e o esforço de manutenção com outras organizações que | ||
114 | +participam de seus projetos. | ||
115 | + | ||
116 | + |
@@ -0,0 +1,37 @@ | @@ -0,0 +1,37 @@ | ||
1 | +\section*{Audiência} | ||
2 | + | ||
3 | +Entendemos que lançamos uma plataforma sem precedentes para o governo | ||
4 | +brasileiro, aplicando métodos colaborativos de desenvolvimento de software. | ||
5 | +Este caso pode ajudar outros projetos a superar desafios similares de | ||
6 | +engenharia de software no futuro, bem como demonstra como as universidades | ||
7 | +podem melhorar a experiência de mundo real de seus alunos por meio desse tipo | ||
8 | +de projeto. É um relato que atende uma ampla audiência, de estudantes à | ||
9 | +professores, bem como, de desenvolvedores à gerentes de projetos. | ||
10 | + | ||
11 | +\section*{Biografia} | ||
12 | + | ||
13 | +{\bf Paulo Meirelles} é professor do Bacharelado em Engenharia de Software da | ||
14 | +Universidade de Brasília. É pesquisador-colaborador do Centro de Competência em | ||
15 | +Software Livre da Universidade de São Paulo (USP). Atualmente, está realizando | ||
16 | +seu pós-doutorado no Departamento de Ciência da Computação no Instituto de | ||
17 | +Matemática e Estatística da USP (IME-USP). Em 2013, concluiu seu doutorado em | ||
18 | +Ciência da Computação no IME-USP, na área de Sistemas de Software. Foi | ||
19 | +pesquisador visitante na Southern Illinois University Carbondale, Estados | ||
20 | +Unidos, em 2011. Tem um amplo histórico de colaboração com a comunidade | ||
21 | +software livre brasileira, entre outras, ministrando dezenas de palestras e | ||
22 | +parcipando de vários paineis em eventos nacionais e internacionais nas últimas | ||
23 | +duas décadas. Mais recentemente, coordenou a Evolução do Portal do Software | ||
24 | +Público Brasileiro e foi consultor do projeto Participa.Br, da Secretaria-Geral | ||
25 | +da Presidência da República, para o desenvolvimento de uma plataforma de | ||
26 | +participação social com software livre. | ||
27 | +\\ | ||
28 | +\\ | ||
29 | +{\bf Hilmer Neri} é professor do Bacharelado em Engenharia de Software da | ||
30 | +Universidade de Brasília. Atualmente, está realizando | ||
31 | +seu doutorado na COOPE-UFRJ... | ||
32 | + | ||
33 | +... | ||
34 | + | ||
35 | +... | ||
36 | + | ||
37 | +... |
@@ -0,0 +1,164 @@ | @@ -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 @@ | @@ -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 @@ | @@ -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,33 @@ | @@ -0,0 +1,33 @@ | ||
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{Lições aprendidas no desenvolvimento do novo portal do Software Público Brasileiro} | ||
16 | + | ||
17 | +\author{Paulo Meirelles\inst{1}, Hilmer Neri\inst{1}} | ||
18 | + | ||
19 | +\address{Laboratório de Produção, Pesquisa e Inovação em Sofware(LAPPIS)\\ | ||
20 | + Faculdade UnB Gama (FGA) -- Universidade de Brasília (UnB) | ||
21 | +% Área Especial de Indústria Projeção A, Setor Leste -- Gama - DF -- Brasil | ||
22 | + \email{\{paulormm,hilmer\}@unb.br} | ||
23 | +} | ||
24 | + | ||
25 | +\maketitle | ||
26 | + | ||
27 | +\input{content/01-introduction} | ||
28 | +\input{content/04-architecture} | ||
29 | +\input{content/07-process} | ||
30 | +\input{content/09-lessons} | ||
31 | +\input{content/10-finals} | ||
32 | + | ||
33 | +\end{document} |