Commit 923402b8214532b62bb64fa1836f6fa31428faec
1 parent
74eef960
Exists in
master
and in
2 other branches
my improvement suggestions
(several things, can't really summarize here)
Showing
7 changed files
with
441 additions
and
118 deletions
Show diff stats
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. |
39.2 KB
| @@ -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> |