Commit 923402b8214532b62bb64fa1836f6fa31428faec

Authored by Antonio Terceiro
1 parent 74eef960

my improvement suggestions

(several things, can't really summarize here)
OSS-2017/00-abstract.tex
1 \begin{abstract} 1 \begin{abstract}
2 -Brazilian Public Softwares have some differences from Open Source Softwares,  
3 -in particular the software is considered a public good and the Federal  
4 -Government assumes some responsibilities related to its use. Anyway, the  
5 -software development principles are the same: trend towards decentralization in  
6 -decision-making, information and development sharing, and feedback. In this  
7 -context, we have designed a platform based on the integration and evolution of  
8 -existing OSS tools. Nowadays, the Brazilian Public Software Portal provides  
9 -several modern features for software collaborative development. 2 +The Brazilian Public Software is a program by the Brazilian Federal
  3 +Government to foster the sharing and collaboration on FOSS solutions for
  4 +the public administration. In this paper, we present an integrated
  5 +development platform that was developed for the program. The development
  6 +of this platform used several FOSS applications, and contributed
  7 +features back to them. We discuss the development methodology, platform
  8 +architecture, and the user experience efforts carried out.
10 \end{abstract} 9 \end{abstract}
OSS-2017/01-introduction.tex
1 \section{Introduction} 1 \section{Introduction}
2 \label{sec:intro} 2 \label{sec:intro}
3 3
4 -Since last few decades, the Brazilian Federal Government has been improving its  
5 -software adoption and development processes. In 2003, the recommendation to  
6 -adopt Open Source Software (OSS) become a public policy. In 2007, the Brazilian  
7 -Government released a Portal to share projects like OSS called Brazilian Public  
8 -Software (\textit{Software Público Brasileiro} -- SPB). In short, it is a  
9 -website to share softwares developed by and for the Brazilian Government.  
10 -  
11 -On the one hand, the Brazilian legal instrument on software contracting  
12 -(\textit{Instrução Normativa} 04/2012) indicates that public managers must  
13 -consult the SPB Portal to adopt a software solution, as well as, justifying the  
14 -acquisition of a proprietary software if there is no a similar project  
15 -available in the SPB Portal. On the other hand, since 2009, the SPB Portal had  
16 -several technical problems because there was no development activities to  
17 -maintenance and evolve it. Thus, the initial SPB Portal version did not have  
18 -another release.  
19 -  
20 -From January 2014 until June 2016, a platform for the SPB Portal was designed  
21 -and developed by the University of Brasília (UnB) and the University of São  
22 -Paulo (USP). This new Portal was designed to be an integrated platform of  
23 -software collaborative development environments with social networking, mailing  
24 -list, control version system, and source code quality monitoring. In this  
25 -paper, we present this new generation of the SPB Portal. 4 +During the last few decades, the Brazilian Federal Government has
  5 +improved its software adoption and development processes. In 2003, the
  6 +recommendation to adopt Free/Open Source Software (FOSS) become a public
  7 +policy. In 2007, the Brazilian Government released a portal called
  8 +Brazilian Public Software (\textit{Software Público Brasileiro} -- SPB,
  9 +in Portuguese), with the goal of sharing FOSS projects developed by, or
  10 +for, the Brazilian Government.
  11 +
  12 +The Brazilian legal instrument on software contracting
  13 +(\textit{Instrução Normativa} 04/2012) mandates that public management
  14 +must consult the SPB Portal to adopt a software solution. The
  15 +acquisition of a proprietary solution must be explicitly justified by
  16 +demonstrating that there is no suitable option in the SPB Portal.
  17 +
  18 +Since 2009, however, the SPB Portal was having several technical issues.
  19 +The original codebase was not being developed anymore, and there as a
  20 +large amount of technical debt to overcome. The system was a modified
  21 +version of an existing FOSS platform that was not being developed
  22 +anymore, and the portal maintenance was becoming harder and harder.
  23 +
  24 +From January 2014 to June 2016, a new platform for the SPB Portal was
  25 +designed and developed by the University of Brasília (UnB) and the
  26 +University of São Paulo (USP) in a partnership with the Brazilian
  27 +Ministry of Budget, Planning, and Management. This new Portal was
  28 +designed as an integrated platform for collaborative software
  29 +development. It includes functionality for social networking, mailing
  30 +lists, version control system, and source code quality monitoring. In
  31 +this paper, we present an overview of this new generation of the SPB
  32 +Portal.
  33 +
  34 +The project was developed by a team of 3 professors, 6 professionals, 2
  35 +masters students, and approximately 40 undergrad students (not all of
  36 +them at the same time, though -- graduations and other events triggered
  37 +changes in the team).
  38 +
  39 +Figure \ref{fig:spb} shows the home page of this integrated platform.
  40 +The development tried to be as faithful as possible to FOSS development.
  41 +All development was done in the open, and the changes we needed in the
  42 +tools user were contributed back to their communities.
  43 +
  44 +\begin{figure}[hbt]
  45 + \centering
  46 + \includegraphics[width=.9\linewidth]{figures/home-SPB.png}
  47 + \caption{The new SPB Portal.}
  48 + \label{fig:spb}
  49 +\end{figure}
  50 +
OSS-2017/02-platform.tex
1 -\section{Platform for software collaborative development} 1 +\section{Architecture}
2 2
3 -First, according to the Brazilian Federal Government requirements, we needed an  
4 -application that integrates existing OSS systems and provides a similar  
5 -interface for each one, as well as, unique authentication. For that, we have a  
6 -web-based integration platform called Colab that also works as a reverse proxy.  
7 -We have developed its plug-in architecture to decouple already integrated  
8 -tools (Trac system, GNU Mailman, and Apache Lucene Solr) and integrate other  
9 -platforms such as Noosfero, GitLab, and Mezuro. Figure \ref{fig:spb} shows the  
10 -home page of this integrated platform. 3 +The two main requirements provided by the Brazilian Federal Government
  4 +for the new platform were:
  5 +%
  6 +1) \textit{Integrate existing FOSS systems}, with minimal differences
  7 +from their original versions. This way, the platform can benefit from
  8 +improvements done by the upstream communities that provide those
  9 +systems, and the maintenance effort that is specific for the SPB Portal
  10 +should be reduced;
  11 +%
  12 +and
  13 +2) \textit{Provide a consistent user interface} across the different
  14 +systems, as well as centralized authentication.
11 15
12 -\begin{figure}[hbt]  
13 - \centering  
14 - \includegraphics[width=.9\linewidth]{figures/home-SPB.png}  
15 - \caption{The new SPB Portal.}  
16 - \label{fig:spb}  
17 -\end{figure} 16 +The first requirement was accomplished by dedicating specialized teams
  17 +for each system that was being integrated. The teams would learn how to
  18 +develop their assigned systems, and contribute the necessary features
  19 +directly to the original communities, so that the version we used was
  20 +not significantly different from the original. Of course, at times
  21 +project deadlines forced us to use our own version before tho features
  22 +were fully reviewed and integrated upstream to the original projects,
  23 +but we managed to contribute the vast majority of the changes back.
  24 +
  25 +For the second requirement, we integrated a web integration platform
  26 +called Colab\footnote{\url{https://github.com/colab/colab}}. Colab
  27 +serves as a frontend for other web applications as a reverse proxy,
  28 +manages authentication, and can apply changes to the HTML provided by
  29 +the integrated applications in order to provide visual consistency.
  30 +Colab had support for an initial set of applications (Trac, GNU Mailman,
  31 +Apache Lucene) hard-coded; our team evolved Colab so that it can now
  32 +receive plugins to add support for new applications with minimal changes
  33 +to its existing core. We added support for the other applications used
  34 +in the SPB platform: Noosfero, GitLab, and Mezuro.
18 35
19 -Noosfero is a software to build social and collaboration networks, providing a  
20 -platform with blogs and CMS (Content Management System). It is the environment  
21 -with most SPB user interaction providing features since the user registration  
22 -until the project pages with documentation and contacts. GitLab is a web-based  
23 -Git repository manager with wiki pages and issue tracking features to support  
24 -the SPB software collaborative development. Mezuro is a platform to collect  
25 -source code metric to monitor the internal quality of softwares written in C,  
26 -C++, Java, Python, Ruby, and PHP. 36 +Noosfero\footnote{\url{http://noosfero.org/}} is a software for building
  37 +social and collaboration networks. Besides tha classical social
  38 +networking features, it also provides publication features such as blogs
  39 +and a general-purpose CMS (Content Management System). Most of the user
  40 +interactions with SPB is through Noosfero: user registration, project
  41 +home pages and documentation, and contact forms.
  42 +GitLab\footnote{\url{http://gitlab.com/}} is a web-based Git repository
  43 +manager with wiki pages and issue tracking features.
  44 +Mezuro\footnote{\url{http://mezuro.org/}} is a platform to collect source code
  45 +metric to monitor the internal quality of softwares written in C, C++,
  46 +Java, Python, Ruby, and PHP. GNU Mailman is used for mailing lists.
  47 +
  48 +The conceptual architecture of the platform is presented in Figure
  49 +\ref{fig:architecture}. Colab initially handles all user interaction,
  50 +directing requests to one of the integrated applications. It
  51 +post-processes responses from the applications to apply a consistent
  52 +visual appearance, manages authentication, and provides a unified search
  53 +functionality: instead of using the redundant restricted search
  54 +functionality of each application, a search in the SPB portal might
  55 +return content from any of the applications, be it web pages, mailing
  56 +list posts, or source code.
27 57
28 \begin{figure}[hbt] 58 \begin{figure}[hbt]
29 \centering 59 \centering
30 - \includegraphics[width=.8\linewidth]{figures/arquitetura.png} 60 + \includegraphics[width=.6\linewidth]{figures/arch.png}
31 \caption{SPB Portal Architecture.} 61 \caption{SPB Portal Architecture.}
32 \label{fig:architecture} 62 \label{fig:architecture}
33 \end{figure} 63 \end{figure}
34 64
35 -The new SPB Portal was deployed in 7 virtual machines with different functions,  
36 -as we can see in Figure \ref{fig:architecture}. The \textit{reverseproxy}  
37 -handles the HTTP requests and redirects them to the \textit{integration}, the  
38 -\textit{email} sends and receives e-mails on behalf of the platform and the  
39 -\textit{monitor} keeps the entire environment tracked. These three  
40 -\textit{VMs} mentioned - \textit{reverseproxy}, \textit{email} and  
41 -\textit{monitor} - are accessible via Internet and the other ones are only  
42 -available in the local network created between them.  
43 -  
44 -\textit{Integration} works as a second layer of proxy beneath  
45 -\textit{reverseproxy}, any request to the platform will be handled by it. The  
46 -Colab service provides interface, authentication and search engine integration  
47 -among all the services. When a request is received to a specific service, Colab  
48 -authenticates the user in the target tool, sends the request and makes a visual  
49 -transformation in the HTML page, which is the content of the response. Another  
50 -user-oriented feature is the integrated search engine, when the user want to  
51 -find something in the platform Colab will perform the search in the whole  
52 -databases. Colab itself provides a web interface for GNU Mailman and we have  
53 -two others integrated tools in \textit{integration}: Gitlab and Prezento (the  
54 -front-end of Mezuro).  
55 -  
56 -The source code static analysis is performed by \textit{mezuro}. It runs some  
57 -static analysis tools on source code stored in repository and provides this  
58 -data to Prezento. A social networking and CMS is provided by Noosfero in  
59 -\textit{social}, and the databases of all tools with a cache service are in  
60 -\textit{database}.  
OSS-2017/03-ux.tex
@@ -3,34 +3,31 @@ @@ -3,34 +3,31 @@
3 The integration of collaborative environments goes beyond functional aspects. 3 The integration of collaborative environments goes beyond functional aspects.
4 Offering the population an unified experience across these environments has 4 Offering the population an unified experience across these environments has
5 been the key to encourage the use of the platform as it reduces the perception 5 been the key to encourage the use of the platform as it reduces the perception
6 -of the complexity. Thus, the SPB Portal information architecture was redesigned 6 +of complexity. Thus, the SPB Portal information architecture was redesigned
7 to provide a transparent navigation and to reach users with different profiles. 7 to provide a transparent navigation and to reach users with different profiles.
8 A process of harmonization has been employed on the interaction models of each 8 A process of harmonization has been employed on the interaction models of each
9 -tool to reduce the learning curve. At the same time, a new visual style was 9 +tool to reduce the learning curve. At the same time, a new visual style was
10 created to unify the navigation experience and to comply with the guidelines of 10 created to unify the navigation experience and to comply with the guidelines of
11 -the digital communication identity pattern established by the Federal 11 +the digital communication identity standard established by the Federal
12 Government. 12 Government.
13 13
14 -With the increase of the system features and the addition of new tools, the 14 +With the increase in system features and the addition of new tools, the
15 visual style has steadily evolved to keep the navigation unified. Moreover, 15 visual style has steadily evolved to keep the navigation unified. Moreover,
16 -tools from different backgrounds, which in many cases run functionalities with  
17 -similar concepts, made us face the challenge of developing a transparent  
18 -interface that unifies various context. For each required feature, we often  
19 -have to conciliate data with distinct structure and information pattern from  
20 -each used tool. The interface was the meeting point for this data with links  
21 -that users will not notice. The most common features (i.e. search, display,  
22 -and edition of profile information and content) have been brought in line with  
23 -the structure and other existing features of the SPB Portal. 16 +tools from different backgrounds, which in many cases provide similar
  17 +functionality, prompted the development of an unified interface. Some
  18 +features, such as search and user profile editing were eliminated from
  19 +the individual applications, and implemented centrally to ensure a
  20 +consistent look and feel.
24 21
25 -The other challenge is related to responsive web design. The SPB Portal  
26 -interface and each of its pages were designed following the bounds of  
27 -responsiveness provided or supported by each tools. In particular, in the case  
28 -of Noosfero, which do not have any official branch dedicated to improve its  
29 -responsiveness, we needed to engage with the expansion of this platform, where  
30 -we made a lot of contributions and dialogues with the community and  
31 -maintainers. 22 +Another challenge was responsive web design. The integrated applications
  23 +had varying degrees of support for responsiveness, and the common
  24 +interface had to adapt for each individual scenario. In particular
  25 +Noosfero did not yet have a responsive design; we engaged in its
  26 +development and contributed towards that goal.
32 27
33 -In summary, after the release of the new SPB Portal in 2014, several  
34 -validations activities were implemented in 2015 and 2016. The aim was to bring  
35 -the users closer to features that they have more interest and designing a  
36 -navigation which deepens in accordance with the user's depth of knowledge. 28 +After the initial release of the new SPB Portal in 2014, several
  29 +validations activities were implemented in 2015 and 2016. The aim was to
  30 +provide the most wanted features by casual users (such as public
  31 +servants interested in downloads and documentation) immediately, while
  32 +allowing more experienced users (such as developers) to easily drill down
  33 +to the details.
OSS-2017/04-finals.tex
1 \section{Final remarks} 1 \section{Final remarks}
2 2
3 -The new SPB Portal was launched for approval in December 2014 and it is  
4 -available at \url{softwarepublico.gov.br}. All the integrated tools are OSS and  
5 -our contributions are published in open repositories, available on the SPB  
6 -Portal itself. We also returned these features to the respective communities.  
7 -Thus, it has reduced the costs of maintenance, which allowed us to carry out  
8 -the continued evolution of the platform in synergy with other organizations  
9 -that use the same tools.  
10 -  
11 -Providing a set of tools and improving the user experience in the portal is a  
12 -technical part of the SPB evolution process. Cultural and legal aspects of  
13 -network collaboration for an effective use of the new SPB Portal also was  
14 -matured. A study for licensing proposals and their impacts on the SPB was  
15 -conducted as a complement to what has been developed from the technological  
16 -point of view, generating a new legal instrument (\textit{Portaria} 46/2016  
17 -STI/MP) on software collaborative development. 3 +The portal is available at \url{softwarepublico.gov.br}. All
  4 +documentation, including detailed architecture and operation manuals are
  5 +also available\footnote{\url{https://softwarepublico.gov.br/doc/}
  6 +(in Portuguese only at the moment)}).
  7 +%
  8 +All the integrated tools are FOSS and our contributions were published
  9 +in open repositories, available on the SPB Portal itself. We also
  10 +contributed these features back to the respective communities: that
  11 +benefits those communities, as well as us since we can share future
  12 +development and maintenance effort with other organizations that
  13 +participate in their projects.
OSS-2017/figures/arch.png 0 → 100644

39.2 KB

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