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 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 9 \end{abstract}
... ...
OSS-2017/01-introduction.tex
1 1 \section{Introduction}
2 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 58 \begin{figure}[hbt]
29 59 \centering
30   - \includegraphics[width=.8\linewidth]{figures/arquitetura.png}
  60 + \includegraphics[width=.6\linewidth]{figures/arch.png}
31 61 \caption{SPB Portal Architecture.}
32 62 \label{fig:architecture}
33 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 3 The integration of collaborative environments goes beyond functional aspects.
4 4 Offering the population an unified experience across these environments has
5 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 7 to provide a transparent navigation and to reach users with different profiles.
8 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 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 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 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 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 @@
  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>
... ...