<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Guilherme Thomas</title>
    <description>The latest articles on Forem by Guilherme Thomas (@guithomas).</description>
    <link>https://forem.com/guithomas</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F853327%2Fcdadaf40-c2ea-412d-87e2-23d070c8eb53.jpg</url>
      <title>Forem: Guilherme Thomas</title>
      <link>https://forem.com/guithomas</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/guithomas"/>
    <language>en</language>
    <item>
      <title>Aprendizado baseado em soluções</title>
      <dc:creator>Guilherme Thomas</dc:creator>
      <pubDate>Sat, 09 Jul 2022 14:30:09 +0000</pubDate>
      <link>https://forem.com/guithomas/aprendizado-baseado-em-solucoes-3ac5</link>
      <guid>https://forem.com/guithomas/aprendizado-baseado-em-solucoes-3ac5</guid>
      <description>&lt;p&gt;Eu gosto muito de ler, principalmente livros. As vezes prefiro ler as legendas de um vídeo do que propriamente ficar olhando o mesmo.&lt;/p&gt;

&lt;p&gt;Porém para aprender, sinto um pequeno gap apenas com leitura, falta algo. E com programação, esse gap fica muito grande. É preciso "colocar a mão na massa" além da teoria.&lt;/p&gt;

&lt;p&gt;O que tem me ajudado muito a aprender Rust e Java, é escolher um problema para resolver, e deixar esse problema me impulsionar para aprender sobre novos conceitos e técnicas.&lt;/p&gt;

&lt;p&gt;Isso faz com que eu aprenda essas técnicas novas quando faz sentido aplica-lás. A "hierarquia" da aprendizagem fica um pouco ao contrário da escola, que é como geralmente estudamos. Não é nos apresentado um conteúdo e dito "isso é importante", e sim o contrário, precisamos do material para resolver um determinado problema.&lt;/p&gt;

&lt;p&gt;No trabalho atual que desenvolvo com Java, é "fácil" aprender pois tenho tarefas a serem desenvolvidas que os cliente precisam. Então tenho direcionado meu problema para resolver, me baseio em soluções parecidas, busco novas, e resolvo.&lt;/p&gt;

&lt;p&gt;Já para aprender Rust, preciso encontrar esses problemas. Comecei pelo clássico aplicativo de To-do. Vi algumas soluções, entendi os motivos de usarem determinadas coisas e tentei fazer o meu. Mas é muito vago, cheguei a usar uma crate de Rust sem ao menos saber exatamente o que ela fazia.&lt;/p&gt;

&lt;p&gt;Um caminho que experimentei e deu certo é:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Entender e definir o problema;&lt;/li&gt;
&lt;li&gt;Explorar o que já se sabe sobre e tentativas anteriores de solução;&lt;/li&gt;
&lt;li&gt;Determinar as necessidade (conhecimento, ferramentas) para solucionar;&lt;/li&gt;
&lt;li&gt;Explorar diferentes opções de solução;&lt;/li&gt;
&lt;li&gt;Resolver o problema;&lt;/li&gt;
&lt;li&gt;Avaliar pontos de melhoria.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E olha só, &lt;strong&gt;nada disso é novidade&lt;/strong&gt;. Vários métodos de aprendizagem falam sobre vários desses mesmos pontos. Explorar, definir, entender, avaliar. Nada é novo ou muito complicado, sempre partimos do básico bem feito.&lt;/p&gt;

&lt;p&gt;Agora falta eu achar um problema bacana para resolver com Rust. &lt;/p&gt;

</description>
    </item>
    <item>
      <title>Rust e o "empréstimo" de propriedade</title>
      <dc:creator>Guilherme Thomas</dc:creator>
      <pubDate>Thu, 30 Jun 2022 16:37:00 +0000</pubDate>
      <link>https://forem.com/guithomas/rust-e-emprestimo-de-propriedade-cb2</link>
      <guid>https://forem.com/guithomas/rust-e-emprestimo-de-propriedade-cb2</guid>
      <description>&lt;p&gt;Um conceito fundamental de Rust é sua base de como a linguagem lida com dados. A ideia de ownership em Rust é literalmente definir um 'dono" para cada valor, se o dono do valor sai de escopo, este valor é 'solto'. Essa regra faz com que o compilador de Rust evite erros como de apontador pendente, onde um ponteiro aponta para um local inválido na memória, ou outros erros de comportamento como liberar o mesmo endereço de memória mais de uma vez como o uso de &lt;code&gt;free()&lt;/code&gt; da linguagem C.&lt;br&gt;
Mesmo com suas regras mais estritas, Rust oferece certa flexibilidade com recursos extras de gerenciamento. &lt;/p&gt;

&lt;p&gt;Um desses recursos é o empréstimo de propriedade, ou ownership borrowing em inglês. &lt;br&gt;
Temporariamente, um valor pode ser emprestado para outra variável durante seu ciclo de vida sem a necessidade da troca de proprietário. &lt;br&gt;
Isso é possível com o que Rust chama de referência, muito parecido com um &lt;code&gt;pointer&lt;/code&gt; de C/C++, uma referência aponta para o endereço de memória onde esta o valor armazenado, a diferença para um &lt;code&gt;pointer&lt;/code&gt; é que a referência sempre aponta para um endereço válido.&lt;br&gt;
Isso é feito com o uso do &lt;code&gt;&amp;amp;&lt;/code&gt; (conhecido como E comercial ou ampersand em inglês). &lt;/p&gt;



&lt;p&gt;Funciona assim, vamos declarar a função main, com a variável &lt;code&gt;i&lt;/code&gt; que contém a String "String exemplo", realizamos a impressão de &lt;code&gt;i&lt;/code&gt; e fechamos o escopo.&lt;br&gt;
Sem realizar o empréstimo de &lt;code&gt;i&lt;/code&gt;, usando o &lt;code&gt;&amp;amp;&lt;/code&gt;, não seria possível realizar a impressão de &lt;code&gt;i&lt;/code&gt; dentro da função empréstimo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fn main() {
    let i = String::from("String exemplo");
    emprestimo(&amp;amp;i);
    println!("Valor em main: {}", i);
}
fn emprestimo(i: &amp;amp;String) {   
    println!("Valor emprestado: {}", i);
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Porém, como indicamos isso com &lt;code&gt;&amp;amp;&lt;/code&gt;, então é possível compilar e ter a impressão de &lt;code&gt;i&lt;/code&gt; realizada em ambas funções sem a necessidade da troca de proprietário (&lt;code&gt;i&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiop5ywvbh31m8cmb0n0n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiop5ywvbh31m8cmb0n0n.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sem realizar esse empréstimo de valor, o compilador já nos orientaria o norte correto. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fegv4n6nx3aqyf1s33p95.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fegv4n6nx3aqyf1s33p95.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Uma dificuldade que pode ser encontrada nesse tipo de empréstimo do valor é não ser possível a alteração do valor em questão, &lt;strong&gt;por padrão&lt;/strong&gt;, variáveis são &lt;strong&gt;imutáveis&lt;/strong&gt; em Rust, logo referências também serão imutáveis. &lt;br&gt;
Por isso, assim como é possível tornar variáveis mutáveis, referências idem, com o uso da keyword &lt;code&gt;mut&lt;/code&gt; junto a &lt;code&gt;&amp;amp;&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Tornando uma referência mutável, ao emprestar o valor, o proprietário temporário pode exclusivamente alterar esse valor. &lt;br&gt;
Importantíssimo notar que enquanto tenho uma referência mutável ativa, não se pode ter qualquer outro tipo de empréstimo no dado valor.&lt;/p&gt;

&lt;p&gt;Isso previne erros do tipo "data race", um problema da programação multitarefa onde uma tarefa ou processo precisa acessar um valor compartilhado e desprotegido, e geralmente situações imprevisíveis acontecem com o resultado. &lt;/p&gt;

&lt;p&gt;Uma data race seria duas tarefas que escrevem um valor na nossa variável &lt;code&gt;i&lt;/code&gt;, digamos 30 na tarefa A, e 5 na tarefa B, e depois realizam um cálculo que retorna o valor de &lt;code&gt;i&lt;/code&gt;.&lt;br&gt;
O valor retornado pode ser tanto 30, como 5, ou até então um valor quebrado. &lt;/p&gt;

&lt;p&gt;Isso não acontece em Rust justamente pela proteção de somente existir uma mutabilidade ocorrendo no valor em determinado período. &lt;/p&gt;

</description>
      <category>rust</category>
      <category>codenewbie</category>
      <category>beginners</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Rust e a segurança de memória</title>
      <dc:creator>Guilherme Thomas</dc:creator>
      <pubDate>Wed, 22 Jun 2022 11:14:11 +0000</pubDate>
      <link>https://forem.com/guithomas/rust-e-seguranca-de-memoria-7k</link>
      <guid>https://forem.com/guithomas/rust-e-seguranca-de-memoria-7k</guid>
      <description>&lt;p&gt;&lt;strong&gt;Problemas de segurança&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Durante o desenvolvimento de um software, o controle de memória é, ou deveria ser, um dos fatores mais relevantes para garantir tanto performance quanto segurança.&lt;/p&gt;

&lt;p&gt;Diferentes linguagens de programação lidam de maneiras diferentes com o controle da memória. Linguagens como C e C++ dão o controle da memória na mão de quem escreve o código, linguagens como Java e .NET possuem o "Coletor de Lixo" (Garbage Collector, GC) que realiza o gerenciamento da memória, liberando-a e preparando-a para novas alocações.&lt;/p&gt;

&lt;p&gt;O custo de ter um &lt;em&gt;GC&lt;/em&gt; administrando a memória é, em geral, velocidade e custo energético. Com a Linguagem C é possível definir quando alocar a memória, quando liberar, quanto alocar, em C alguns comportamentos não são definidos. Acessar o elemento 12 de uma array com 10 elementos gera erros em diversas linguagens, já em C ele irá acessar o que estiver disponível na array, caso contrário, onde conseguir na memória. Basicamente, se não for explicitamente dito o que C deve fazer, ele irá &lt;strong&gt;fazer o mais simples.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Essa velocidade na operação vem com o custo de &lt;strong&gt;segurança da memória.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Um dos engenheiros da Microsoft, Matt Miller, disse em 2019 que da última década, &lt;a href="https://msrc-blog.microsoft.com/2019/07/18/we-need-a-safer-systems-programming-language/" rel="noopener noreferrer"&gt;70% dos erros&lt;/a&gt; corrigidos em patchs do Windows eram relacionados a erros de memória. No iOS e macOS, idem, de &lt;a href="https://langui.sh/2019/07/23/apple-memory-safety/" rel="noopener noreferrer"&gt;60 a 70% dos erros&lt;/a&gt; eram relacionados a memória. Android? &lt;a href="https://security.googleblog.com/2019/05/queue-hardening-enhancements.html" rel="noopener noreferrer"&gt;90% dos erros&lt;/a&gt; eram relacionados a memória.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F72q5vaooejewrx7q6d2y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F72q5vaooejewrx7q6d2y.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Isso não significa em momento algum que C ou C++ sejam ruins. Porém, software (ainda) é escrito por humanos, e humanos erram. O tempo todo, por diversos motivos, de diversas formas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quanto mais complexo é um software, mais suscetível a erros também.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No livro Code Complete, Steve McConnell realizou algumas pesquisas e cogita que para cada 1000 linhas de código, existam entre 1-25 erros. Software extremamente complexo como um Sistema Operacional pode ir muito além da casa dos milhões de linhas. Um OS com 1 milhão de linhas poderia ter até &lt;strong&gt;25 mil erros&lt;/strong&gt; escritos seguindo a pesquisa de McConnell. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefícios e limitações&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Obviamente durante os anos, C e C++ evoluíram. Smart pointers, C++ moderno, &lt;a href="https://llvm.org/docs/LibFuzzer.html" rel="noopener noreferrer"&gt;Fuzzers&lt;/a&gt;, &lt;a href="https://clang.llvm.org/docs/AddressSanitizer.html" rel="noopener noreferrer"&gt;Sanitizers&lt;/a&gt; ajudam imensamente a escrever código com mais segurança de memória. Mas mesmo assim eles continuam ocorrendo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rust&lt;/strong&gt; surge como um projeto pessoal de um funcionário da Mozilla, e em 2009-10 ganha tração com apoio da empresa. Rust 1.0 foi lançado em 2015.&lt;/p&gt;

&lt;p&gt;Sua base é:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Segurança de memória sem uso de coletor de lixo; &lt;/li&gt;
&lt;li&gt;Concorrência sem disputa dos dados;&lt;/li&gt;
&lt;li&gt;Abstração sem processamento ou armazenamento em excesso;&lt;/li&gt;
&lt;li&gt;Estabilidade sem estagnação.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como dito antes, muitas linguagens que garantem segurança à memória possuem um GC. Rust gerencia a memória de maneira diferente, utilizando um conceito chamado de &lt;strong&gt;ownership&lt;/strong&gt; (propriedade). &lt;/p&gt;

&lt;p&gt;A ideia de ownership vem de Sistema do tipo subestrutural. Mas que caralho é isso, né?&lt;br&gt;
Sistema do tipo subestrutural é um conceito para que seja mantido um histórico das mudanças de estado na memória, arquivos e recursos do sistema para garantir que não hajam &lt;strong&gt;estados inválidos.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A maneira que ownership atua na linguagem Rust é garantida pelo seu compilador, &lt;strong&gt;rustc&lt;/strong&gt;. Existem três regras que rustc exige:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Cada valor em Rust, tem uma variável que é seu proprietário;&lt;/li&gt;
&lt;li&gt;Somente pode existir um proprietário por vez;&lt;/li&gt;
&lt;li&gt;O valor é descartado quando o proprietário sai de escopo.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Pra quem está aprendendo sobre Rust como eu, esse conceito pode ser um dos degraus mais elevados da Linguagem. Compartilhar dados entre o código pode se tornar um "problema". &lt;/p&gt;

&lt;p&gt;Um exemplo da atuação do compilador para garantir que as regras sejam seguidas é a seguinte:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuuafmgfmcqouv3pu85fe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuuafmgfmcqouv3pu85fe.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Declaramos a marca de chocolate dentro de main, e encerramos o escopo, ao tentar acessar a marca do chocolate, rustc não compilará pois não consegue acessar o valor da marca de chocolate. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzviljy81qhv6xcf9cukc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzviljy81qhv6xcf9cukc.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Escrevendo assim, tudo parece mil maravilhas. Se mais de 70% dos erros são problemas na memória, e Rust surge como uma linguagem de mesma velocidade que C e C++ e que ainda gerencia lindamente a memória, é só reescrever todos os sistema em Rust, certo?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Não&lt;/strong&gt;. Nossa, nem fudendo. &lt;/p&gt;

&lt;p&gt;Inclusive tenho certeza que o objetivo de Rust não seja reescrever nada, e sim criar. E isso já está acontecendo: &lt;a href="https://www.zdnet.com/article/rust-in-the-linux-kernel-why-it-matters-and-whats-happening-next/" rel="noopener noreferrer"&gt;Rust foi incluída como linguagem oficial do Linux&lt;/a&gt;, onde drivers vão começar a serem escritos na nova Linguagem. &lt;/p&gt;

&lt;p&gt;Atualmente temos um &lt;a href="https://riversagile.com/developers-deficit/" rel="noopener noreferrer"&gt;deficit de pessoas desenvolvedoras&lt;/a&gt; gigantesco, e que segundo previsões só tende a aumentar. Negócios hoje dependem de &lt;strong&gt;software para quase tudo&lt;/strong&gt;: Análise, gerenciamento, vendas, comunicação. &lt;/p&gt;

&lt;p&gt;Soma-se isso a curva de aprendizado relativamente mais difícil de Rust e seu tempo curto de presença no mercado, ou seja, temos poucas pessoas desenvolvedoras, e menos ainda em Rust. &lt;/p&gt;

&lt;p&gt;Outro fator com muita influência é em relação à investimento, tanto de tempo quanto dinheiro. Para implementar um novo sistema em qualquer linguagem nova dentro de uma empresa, é necessário um investimento tanto em tempo para criação desse sistema ou ferramenta por parte da equipe de devs, e esse tempo vai ter variáveis como nível de maturidade da equipe, complexidade da tarefa, que são variáveis que impactam nos resultados do projeto, bem como dinheiro em forma de contratação de pessoas para atuar com uma nova linguagem. &lt;/p&gt;

&lt;p&gt;De qualquer maneira, o futuro de Rust parece ser inegavelmente consolidado. &lt;br&gt;
Desde 2016 a Linguagem é &lt;a href="https://fossbytes.com/stack-overflow-most-loved-dreaded-wanted-programming-languages-in-2020/" rel="noopener noreferrer"&gt;eleita como a mais amada&lt;/a&gt; em diversas pesquisas. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fptvglfnhm225rom9rsn8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fptvglfnhm225rom9rsn8.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mas não só de amor vive uma Linguagem, muitas empresas tem interesse genuíno em Rust:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/pt/blogs/opensource/why-aws-loves-rust-and-how-wed-like-to-help/" rel="noopener noreferrer"&gt;Why &lt;strong&gt;AWS&lt;/strong&gt; loves Rust, and how we’d like to help&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://opensource.googleblog.com/2021/02/google-joins-rust-foundation.html" rel="noopener noreferrer"&gt;&lt;strong&gt;Google&lt;/strong&gt; joins the Rust Foundation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cloudblogs.microsoft.com/opensource/2021/02/08/microsoft-joins-rust-foundation/" rel="noopener noreferrer"&gt;&lt;strong&gt;Microsoft&lt;/strong&gt; joins the Rust Foundation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://engineering.fb.com/2021/04/29/developer-tools/rust/" rel="noopener noreferrer"&gt;A brief history of Rust at &lt;strong&gt;Facebook&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.figma.com/blog/rust-in-production-at-figma/" rel="noopener noreferrer"&gt;Rust in Production at &lt;strong&gt;Figma&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://discord.com/blog/why-discord-is-switching-from-go-to-rust" rel="noopener noreferrer"&gt;Why &lt;strong&gt;Discord&lt;/strong&gt; is switching from Go to Rust&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.infoworld.com/article/3651503/the-rise-of-webassembly.html" rel="noopener noreferrer"&gt;The rise of &lt;strong&gt;WebAssembly&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Definitivamente é uma Linguagem que deve estar no seu radar. &lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>rust</category>
      <category>beginners</category>
      <category>security</category>
    </item>
    <item>
      <title>Riscos Tecnológicos com uso de Machine Learning</title>
      <dc:creator>Guilherme Thomas</dc:creator>
      <pubDate>Wed, 15 Jun 2022 16:54:09 +0000</pubDate>
      <link>https://forem.com/guithomas/riscos-tecnologicos-com-uso-de-machine-learning-161m</link>
      <guid>https://forem.com/guithomas/riscos-tecnologicos-com-uso-de-machine-learning-161m</guid>
      <description>&lt;p&gt;Segundo pesquisa publicada na revista Harvard Business Review, aproximadamente 47% dos dados recentemente criados contém no mínimo um erro crítico que pode influenciar o trabalho desenvolvido em um modelo ML e trazer impactos financeiros. A coleta de informações é parte essencial da aplicação, sendo ela que conterá o necessário para uma análise bem fundamentada. O risco da coleta de informações ter dados de qualidade não aceitável (I.E baixa qualidade de imagens, amostras não randomizadas) faz a tomada de decisões enfraquecer, ocorre a perda de tempo analisando dados desnecessários além de elevar o gasto para executar as ações de análise e possível reexecução da coleta de dados.&lt;/p&gt;

&lt;p&gt;Quanto mais complexa a tarefa a ser executada, mais complexo é o processo de organizar e preparar os dados, processo esse que pode &lt;a href="WILDNER-JAMES,%20Edd.%20Breaking%20Down%20Data%20Silos.%20Analytics%20and%20Data%20Science%20-%20HBR,%20[s.%20l.],%205%20dez.%202016.%20Dispon%C3%ADvel%20em:%20&amp;lt;https://hbr.org/2016/12/breaking-down-data-silos.%20Acesso%20em:%206%20jun.%202022&amp;gt;.%20Acesso%20em:%2005%20jun.%202022."&gt;chegar a 80% do tempo&lt;/a&gt; de desenvolvimento segundo E. Wildner-James.&lt;br&gt;
A melhor maneira de minimizar riscos no desenvolvimento é ter um objetivo claro da finalidade do modelo de ML.&lt;br&gt;
Se um processo não precisa tomar decisões melhores, apenas reduzir o custo, possivelmente os dados que já existem são suficientes para isso, porém se o objetivo é diminuir ou remover completamente um viés de um processo, a possibilidade desse viés já estar nos dados é alta. &lt;br&gt;
Também é necessário a alta disponibilidade de dados para um aprendizado eficiente, em um exemplo de carros autônomos, antes de usar um carro na rua, é imprescindivel que o modelo já tenha passado por milhares de imagens de treinamento em ambiente controlado e fontes externas, para só então estar pronto a identificar placas e linhas de sinalização. &lt;/p&gt;

&lt;p&gt;Outro risco existente se encontra no âmbito dos Recursos Humanos, a quantidade de dados sendo gerada é altíssima, e é criada a cada segundo por nossos celulares, sistemas embarcados e diversos outros aparelhos, nosso poder computacional tem aumentado desde 1965 com o dobro de transistores a cada dois anos, seguindo a linha da Lei de Moore, porém existe um déficit de pessoas para trabalhar com análise de dados em geral, em cargos que vão de Cientista de Dados, Engenheiro de Dados, Analistas e Engenheiros de Visão Computacional. &lt;a href="https://www2.deloitte.com/us/en/insights/industry/technology/data-analytics-skills-shortage.html"&gt;Em 2020 por exemplo, segundo pesquisa da Deloitte Insights&lt;/a&gt;, o número de vagas abertas na área de Análise supera pelo quarto ano seguido as vagas abertas nas áreas de Marketing, Customer Experience, Administrativos e Engenharias. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--35umblhc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j8p7vfftvqmuned7ne5z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--35umblhc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j8p7vfftvqmuned7ne5z.png" alt="Image description" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Todo ano se fala mais sobre o uso de Machine Learning e de Inteligência Artificial em si, mas ainda teremos muitos problemas com dados de baixa qualidade aliadas a falta de profissionais capacitados para realizar a análise desses dados gerados, o caminho ainda é longo. &lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>braziliandevs</category>
      <category>datascience</category>
    </item>
    <item>
      <title>Contextualização sobre Orientação a Objetos</title>
      <dc:creator>Guilherme Thomas</dc:creator>
      <pubDate>Tue, 07 Jun 2022 18:26:02 +0000</pubDate>
      <link>https://forem.com/guithomas/contextualizacao-sobre-orientacao-a-objetos-gfn</link>
      <guid>https://forem.com/guithomas/contextualizacao-sobre-orientacao-a-objetos-gfn</guid>
      <description>&lt;p&gt;Esse texto é parte do conceito de aplicativo que criei para a faculdade, disponível &lt;a href="https://dev.to/guithomas/conceito-de-app-para-gerenciamento-de-equipamentos-31lg"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paradigmas de Programação&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Um paradigma de programação nada mais é que a forma como o programador e equipe conduziram a construção do sistema ou módulo programado, é uma maneira de padronizar e determinar uma visão para aquilo que vai ser construído. Conforme as tecnologias foram evoluindo, podemos observar também a evolução constante das linguagens e seus paradigmas: Os primeiros computadores eram programados somente através de código binário, fomos evoluindo para o Assembly, Algol, Linguagem B, Linguagem C, C++, C#, Java, Python, Go e de diversas maneiras. Importante deixarmos claro que não existe uma linha de sucessão entre as linguagens, mas sim que foram sendo criadas conforme necessidades diferentes surgiam, e poderes de processamento maior são mais disponíveis. &lt;/p&gt;

&lt;p&gt;O Python por exemplo é uma linguagem com a sintaxe derivada do C, e inclusive sua implementação funciona por C, hoje a linguagem é usada principalmente para Análise de dados como Machine Learning e Data Science e também no desenvolvimento de projetos web. Cada linguagem citada possui atualizações recentes e continua em uso em determinadas funções, devemos sempre ver a linguagem como uma ferramenta que vai nos ajudar a alcançar o objetivo desejado. &lt;/p&gt;

&lt;p&gt;O paradigma de orientação a objetos é um entres os quatro (4) paradigmas de programação, ele se baseia na interação entre diversas unidades que chamamos de objetos. É uma maneira de aproximar o mundo real do mundo da computação, facilitando a interpretação de conceitos para introdução em sistemas.&lt;/p&gt;

&lt;p&gt;Com a Orientação a Objetos, a classe é uma estrutura fundamental e será nosso molde das estruturas, um exemplo básico do funcionamento:&lt;/p&gt;

&lt;p&gt;Em um sistema de estoque de vendas de carros, um carro certamente estará em nosso sistema como uma classe, pois todos os carros possuem um padrão mais ou menos definido: eles têm quatro (4) rodas, um volante, aceleram, etc. Além de outras características como a Marca, o Nome do Modelo, ano de fabricação. &lt;/p&gt;

&lt;p&gt;Podemos declarar então, usando Java no exemplo, o ano de fabricação e a marca do veículo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;public class Carro {&lt;br&gt;
                  public int ano;&lt;br&gt;
                            public String marca; &lt;br&gt;
                                           }&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Com isso, podemos definir as características dos veículos em nosso sistema, declarando agora os objetos que usarão essas características da seguinte maneira:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Carro boxter = new Carro();&lt;br&gt;
                boxter.ano = 2005&lt;br&gt;
                boxter.marca = “porsche”&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nOS5faOH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dmy7h1fjkj3v1eyes0ye.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nOS5faOH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dmy7h1fjkj3v1eyes0ye.jpeg" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora temos como uma instância da class Carro, o objeto boxter, com seus atributos de marca e ano, e podemos definir muitas outras instâncias usando a mesma classe anterior. Os objetos também podem ter ações em nosso sistema, como por exemplo de um carro, acelerar e frear. Em Orientação a Objetos a ação será chamada de Método, e podemos declarar esse método como:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;public void acelerar() {&lt;br&gt;
                     System.out.println(“De zero a cem em 5 segundos!”);&lt;br&gt;
                                              }&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Logo, criar sistemas e aplicativos utilizando linguagens Orientadas a Objeto traz vantagens como ser mais rápido em criar algo pois podemos reutilizar o código, utilizando dos objetos que já criamos, não sendo necessário criar nada do zero; É fácil de realizar alterações pois podemos alterar métodos e classes, ou criar novas, que impactam todo o sistema; além de ser mais fácil de ser entendido por outro programador que estiver lendo um código já existente. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/guithomas/conceito-de-app-para-gerenciamento-de-equipamentos-31lg"&gt;&lt;strong&gt;Usando POO no conceito de app&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Herança é um dos conceitos principais quando tratando-se de linguagens Orientadas a Objeto, trata-se da possibilidade de criar uma classe nova em nosso sistema, a partir de uma classe que já existe previamente, criando-se uma subclasse. &lt;/p&gt;

&lt;p&gt;Em nosso aplicativo, a nossa chamada superclasse ou classe "mãe" será a Usuarios, e nossas subclasses serão a Professores e Administradores.&lt;/p&gt;

&lt;p&gt;A superclasse Usuário terá a informação de ID para o aplicativo, a subclasse Professores terá então por definição o ID embarcado, e as opções de acesso a reserva de equipamento e reserva de sala, por sua vez, a subclasse Administradores será uma subclasse de Professores, contendo ID, os métodos de reserva de equipamentos e também o acesso a alterar, incluir e excluir professores e equipamentos no nosso banco de dados SQL. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ly2WhZt1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kf3hpx1aox3xoshbda39.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ly2WhZt1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kf3hpx1aox3xoshbda39.png" alt="Image description" width="570" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em Kotlin, podemos realizar essas operações de herança declarando no cabeçalho da classe após dois pontos (Classes em Kotlin ficam ao final). A estrutura então se define assim:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;open class Usuario()&lt;br&gt;
           class Professor() : Usuario()&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>oop</category>
      <category>java</category>
      <category>computerscience</category>
    </item>
    <item>
      <title>Conceito de app para Gerenciamento de equipamentos</title>
      <dc:creator>Guilherme Thomas</dc:creator>
      <pubDate>Thu, 02 Jun 2022 19:26:27 +0000</pubDate>
      <link>https://forem.com/guithomas/conceito-de-app-para-gerenciamento-de-equipamentos-31lg</link>
      <guid>https://forem.com/guithomas/conceito-de-app-para-gerenciamento-de-equipamentos-31lg</guid>
      <description>&lt;p&gt;O objetivo que tinha em mente ao desenvolver essa pesquisa era solucionar o case de um colégio, de transformar o atual sistema de reservas de equipamentos de informática e vídeo em algo digital e que facilite o uso, traga agilidade e seja confiável, com base no uso das matérias do bimestre do meu curso de Análise e Desenvolvimento de Sistemas, sendo elas Economia e Mercado, Engenharia de Software II, Projeto de Interface com Usuários e Programação Orientada a Objetos I, justificando motivos e razões que fomentaram as decisões em torno do case fornecido. &lt;/p&gt;

&lt;p&gt;Foram aplicadas na criação de um aplicativo, dinâmicas das matérias nas formas de criação de gastos teóricos para a realização do serviço, prazos de entrega, requisitos do software como qualidade e usabilidade, acessibilidade das interfaces desde fontes até treinamentos necessários.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Mercado&lt;/strong&gt;&lt;br&gt;
   Para haver em primeiro lugar um Mercado onde haja negociações, é necessário que existam &lt;strong&gt;agentes econômicos&lt;/strong&gt; dispostos a realizar trocas e transações. Podemos considerar que agentes econômicos são aqueles que criam uma determinada demanda de serviço ou produto, aqueles que ofertam produtos ou serviços ou mesmo entidades que realizem a regulamentação de algum desses processos.&lt;/p&gt;

&lt;p&gt;Existem 3 principais agentes econômicos citados na teoria econômica que são as &lt;strong&gt;Famílias, Empresas e o Governo&lt;/strong&gt;. Famílias são unidades consumidoras e também podem ser detentoras de fatores de produção (como terrenos e o trabalho, e em nosso projeto, o colégio); Empresas são as que produzem serviços e bens, e para isso usam os fatores de produção acima citados (terrenos, mão de obra); Temos também o Governo atuando na tentativa de diminuir desigualdades econômicas e na manutenção e eficiência do sistema econômico como um todo.&lt;/p&gt;

&lt;p&gt;Definimos então que os agentes econômicos em nosso projeto serão nossa empresa de Desenvolvimento de Software como uma Empresa oferecendo um produto e o colégio composto por unidades de Família que necessitam deste produto. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Viabilidade Econômica&lt;/strong&gt;&lt;br&gt;
   A necessidade do estudo da viabilidade econômica origina-se do intuito de projetar o retorno financeiro do mesmo, se haverá prejuízo ou lucro e no caso de possível lucro, quantificar o tempo necessário para tal. &lt;br&gt;
É importante salientar que, como citado por Machado (2016) a microeconomia buscará o equilíbrio entre o mercado de bens e serviços na formação de preços entre oferta e demanda, buscando um meio termo entre acessibilidade de valores para quem compra, contrata e maximiza a renda de quem oferece.&lt;/p&gt;

&lt;p&gt;O primeiro passo então é calcularmos qual será o custo de desenvolvimento desse software, quanto tempo levará para termos ele usável, quais imprevistos podem surgir durante seu desenvolvimento bem como riscos (por exemplo um funcionário abandonar o projeto, desistência ou quebra de contrato por parte da contratante, etc). &lt;/p&gt;

&lt;p&gt;Um exemplo rápido, quem sabe meio raso: nosso custo por hora para dois desenvolvedores seria R$ 52,80, e com um prazo de 20 dias úteis teríamos um gasto de R$ 9.292,00 no desenvolvimento desse app, e projetando para somente o sistema do Colégio ao menos 40 horas de manutenção ao mês, o gasto mensal seria R$ 5.640,00 (Administrativo, impostos e as 40 horas de manutenção do software).&lt;br&gt;
    Com dois desenvolvedores dedicados a criar esse sistema do zero, e devido a sua complexidade razoavelmente baixa, podemos definir como prazo de entrega dois meses mais aproximadamente sete dias para realizar testes com ela já implementada.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Engenharia de Software: Qualidade&lt;/strong&gt;&lt;br&gt;
   Antes de se iniciar o desenvolvimento de um software, é interessante, até mesmo essencial, ter em mãos informações que garantem que o projeto do software irá atender exatamente o que é esperado. Para isso existem normas tanto nacionais quanto internacionais que norteiam a direção para existir uma mínima qualidade na entrega e manutenção de software. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZCm_hpOE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/71djwqv0elhu3p5yfbds.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZCm_hpOE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/71djwqv0elhu3p5yfbds.jpg" alt="Imagem com os atributos de um software de qualidade: Funcionalidade; Confiabilidade; Usabilidade; Eficiência; Manutenibilidade e Portabilidade" width="728" height="546"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Podemos listar algumas como a - &lt;strong&gt;ISO/IEC 9126&lt;/strong&gt; que foca na qualidade do software e propõe seis (6) atributos, sendo elas: Funcionalidade; Confiabilidade; Usabilidade; Eficiência; Manutenibilidade e Portabilidade. Incluem subcaracterísticas dentro de cada desses atributos, a norma ISO/IEC 9126 permite visualizar o que seria necessário para definir essa qualidade empregada.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;ISO/IEC 12207&lt;/strong&gt; que estabelece uma estrutura comum para os ciclos de desenvolvimento de software, essa estrutura consiste em processos modulares que são categorizados pelo seu objetivo no dito ciclo, sendo quatro (4) categorias, em resumo: Processos Fundamentais (envolvem aquisição, fornecimento e desenvolvimento); Processos de Apoio (envolvem documentação, configurações, validações e auditoria); Processos Organizacionais (envolvem a gerência, infraestrutura e recursos humanos) e Processos de Adaptação (que envolvem atividades básicas como linguagem usada e organização).&lt;/p&gt;

&lt;p&gt;Além de outras normas ISO como &lt;strong&gt;ISO 10011&lt;/strong&gt; (que trata do processo de auditoria para sistemas), &lt;strong&gt;IEEE P1061&lt;/strong&gt;(Metodologia de métricas para produtos de software) e também um modelo chamado &lt;strong&gt;CMM&lt;/strong&gt; que apesar de não ser uma norma ISO, é uma avaliação de qualidade do processo de desenvolvimento de software muito bem aceita no mercado. &lt;/p&gt;

&lt;p&gt;CMM que significa em português Modelo de Maturidade em Capacitação, é resumido como um complicado das melhores práticas de desenvolvimento presentes em outras normas e avaliações. O mesmo trata os níveis de maturidade em uma escala de 5 (cinco) itens, sendo o Nível 1 ou Inicial, e na sequência os níveis Repetíveis, Definidos, Gerenciados Quantitativamente e Em Otimização. &lt;br&gt;
   Quero pontuar também algo escrito na própria guideline do CMM, página 14, seção 1.6 &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“...Sound judgment is necessary to use the CMM correctly and with insight. Intelligence, experience and knowledge must shape an appropriate interpretation of the CMM in a specific environment. That interpretation should be based on the business needs and objectives of the organization and the projects. A rote, checklist-oriented application of the CMM has the potential to harm an organization rather than help it…” &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Em tradução resumida, o &lt;strong&gt;bom senso&lt;/strong&gt; é necessário para se usar o CMM, e a aplicação passo a passo do CMM pode ser mais prejudicial a uma empresa do que o contrário. &lt;/p&gt;

&lt;p&gt;Para basear a criação da nossa empresa fictícia de desenvolvimento de software, usaremos então com bom senso as orientações do CMM como norte. Sendo assim, podemos concluir que iniciaremos como Nível de Maturidade um (1), com as práticas de desenvolvimento do software em si alcançando o nível dois (2), pois estaremos já demonstrando o básico em gerenciamento de custos e da qualidade do software entregue. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Requisitos&lt;/strong&gt;&lt;br&gt;
   Requisitos funcionais e não funcionais de um software, de forma simplificada são uma descrição do que o mesmo deve realizar para atender a necessidade do negócio ou cliente. &lt;/p&gt;

&lt;p&gt;Também atualmente são utilizados conceitos diferentes de requisitos para definir os objetivos de um sistema, conceitos como &lt;strong&gt;OKRs&lt;/strong&gt; (Objectives and Key Results), método que ficou famoso por ter apoiado o crescimento do Google e que foi criado pelo ex-CEO da Intel, onde os objetivos são qualitativos, e os resultados quantitativos; &lt;strong&gt;BDD&lt;/strong&gt; (Behavior Driven Development) que é uma técnica para desenvolver software de maneira ágil baseada na integração de regras de negócio com a linguagem de programação, focando os testes no comportamento do software e alinhando a comunicação entre time e cliente final; Bem como conceitos de “Produto” e Métricas para Produto e “User History”. &lt;/p&gt;

&lt;p&gt;É importante utilizarmos os requisitos demonstrados em Engenharia de Software II para montar uma base do necessário em nosso sistema de Gerenciamento de Estoque Tecnológico para o Colégio, e coletarmos feedbacks dos nossos usuários para poder ter uma melhora constante desse app.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ah2E7FhT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mcw8p6704eq3ovkz5mdo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ah2E7FhT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mcw8p6704eq3ovkz5mdo.png" alt="Imagem com os requisitos desse conceito de app, informando a necessidade dos professores de poderem reservar equipamento, reservar sala." width="595" height="286"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Já os requisitos não Funcionais funcionam como uma parte do escopo do nosso produto, sendo qualidades ou restrições específicas a nossa implementação, necessários para expressar a qualidade dentro do contexto do case. Podemos categorizar os requisitos não funcionais em partes, como Requisitos do Produto, Requisitos Organizacionais e até Requisitos Internos. Um exemplo claro e moderno é de um software que lida com informações sensíveis, a fim de atender os requerimentos da LGPD. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DjkX4TUB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ftnggdq66nme0rofud16.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DjkX4TUB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ftnggdq66nme0rofud16.png" alt="Requisitos não funcionais, qual a linguagem, que o software deve ser leve." width="394" height="242"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Regra de Negócio&lt;/strong&gt;&lt;br&gt;
   Em 1989 a IBM anunciou um sistema para gerir o desenvolvimento de software chamado de &lt;a href="https://www.ibm.com/docs/en/tdw/8.5.1?topic=elements-dimension-entity"&gt;AD/Cycle&lt;/a&gt; para sua SSA (Systems Application Architecture), sendo definido como &lt;em&gt;“um requisito sobre as condições ou manipulações de dados expressos em termos de empresa comercial ou domínio de aplicação"&lt;/em&gt; criando o conceito de regra de negócio onde é necessário um agente e uma condição. Regras de Negócio são um conjunto de operações condicionais ligadas a um resultado de dados; e &lt;strong&gt;dados são a essência dos sistemas de informação empresariais&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Juntamente aos Requisitos Funcionais e Não Funcionais, as Regras de Negócio constroem o conceito de Requisitos de Software, aliando o necessário aos usuários para que trabalhem na ferramenta, com premissas do desenvolvimento de software e critérios do próprio negócio que precisam ser atendidos.&lt;/p&gt;

&lt;p&gt;Algumas das regras de negócio do nosso case envolvem o gerenciamento de material tecnológico do colégio, hoje o gerenciamento é realizado de maneira manual, levando tempo e mais suscetível a erros. As regras que já temos para essa organização são garantir que os equipamentos e salas que são reservados pelos professores estejam corretamente organizadas no dia para impedir que mais de um equipamento ou sala seja reservada no mesmo horário por professores diferentes, por exemplo.&lt;/p&gt;

&lt;p&gt;Vamos então classificar nossas necessidades e caminhos que o software irá percorrer para permitir a reserva de uma sala ou equipamento, bem como seus avisos de confirmação e erro.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---U-m09Nz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0s2k64jl50nz3wcim2kn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---U-m09Nz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0s2k64jl50nz3wcim2kn.png" alt="Image description" width="687" height="566"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Interface do app&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Segundo Rocha e Baranauskas (2003) o conceito da Interface ser responsável apenas pela comunicação com o usuário, hardware e software evoluiu e devemos hoje levar em consideração mais aspectos humanos durante essa comunicação, logo, Interação e Interface são duas coisas que caminham juntas para criar o melhor ambiente possível. &lt;/p&gt;

&lt;p&gt;Para criar nossa Interação, levamos em consideração muitos aspectos da usabilidade, principalmente as definidas pelas NBR ISO/IEC 9126-1 onde usabilidade é a “capacidade do software de ser compreendido, aprendido, operado e atraente ao usuário, quando usado sob condições específicas" (ABNT, 2003, p. 7).&lt;/p&gt;

&lt;p&gt;A começar pela tela de Login, com espaços claros para inserir nome de usuário e senha, bem como requisitar acesso em algum caso específico do Professor ainda não ter sido incluído, e a opção de Redefinir a senha em caso de esquecimento. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4FjZAl3j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aliu8wu6zd38iqaczd1k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4FjZAl3j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aliu8wu6zd38iqaczd1k.png" alt="Tela de login do app, descrita no texto." width="306" height="545"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O foco do menu principal é ter uma produtividade veloz na hora de realizar a reserva do equipamento ou sala necessária, sendo essas opções as primeiras disponíveis na aplicação, o que garante também uma curva de aprendizagem muito baixa, afinal segundo (FERRÉ et al., 2001) os usuários não podem gastar muito tempo aprendendo como os sistemas trabalham, além de escolhas mais óbvias como garantir um menu em português e botões de tamanho médio pra grande.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZDAicipa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7e9bs94qjygg6r1jqtae.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZDAicipa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7e9bs94qjygg6r1jqtae.png" alt="Tela de menu do app, com as opções de reservar equipamento, reservar sala, editar perfil." width="326" height="585"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Entrada de Dados, Processamento e Saídas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para o funcionamento fluido do nosso aplicativo, bem como de qualquer sistema, é necessário que sejam fornecidas informações a ele. Todo algoritmo vai precisar de um "input", seja ele um sensor, um botão, um campo para escrever e a partir disso as operações e cálculos serão realizados.&lt;/p&gt;

&lt;p&gt;O conceito mais básico de programação e sistemas é o modelo IPO, que significa &lt;strong&gt;Input-Process-Output&lt;/strong&gt;, funcionando como exemplos do mundo real como o Sistema Respiratório, onde é feito o “Input” de Oxigênio, a Hematose pode ser considerada o “process”, onde é realizada as operações com o oxigênio garantindo a oxigenação das células, e o “output” sendo o gás carbônico antes presente no sangue sendo expirado. &lt;/p&gt;

&lt;p&gt;O mesmo acontece em diversas fases do aplicativo, na tela de Login é necessário que o usuário preencha as informações de conta e senha, onde o sistema irá verificar se a conta e senha batem com informações já armazenadas, então mostrando uma saída de informação booleana baseada nisso: se as informações estão corretas, o usuário é levado ao menu principal, e se não estiverem corretas, uma mensagem de erro é exibida na tela. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Tela de Reservas - Usuário escolhe as opções disponíveis da lista fornecida, apenas clicando sobre a mesma (input), o processamento é realizado por nosso código e as informações são salvas numa base de dados SQL, usando. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tela de Horários - Usuário determina o horário inicial da sua reserva com data e hora, por padrão o sistema assume o uso por duas horas mas o usuário pode selecionar mais horas de uso. Ao clicar em “Salvar Horários" as informações são enviadas a base de dados SQL e a mensagem com “Reserva Confirmada!” seguida da data e horários selecionados aparece na tela, acompanhadas de duas opções: Voltar ao Menu Inicial ou checar o Calendário.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tela de Salas - Mostra todas as salas disponíveis de ambos os Prédios 1 e 2, nomeando cada sala, mostrando qual está sob reserva do usuário logado, o mesmo pode alterar a sala (input) e salvar sua sala com horário inicial informado também podendo ser alterado, e as informações novamente são salvas e o output será a mensagem de confirmação de reserva informando o horário inicial e final da reserva. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A estrutura básica de entrada, processamento e saída de dados do aplicativo se manterá dessa maneira. Com a interface pensada em produtividade, eliminamos boa parte dos problemas que podem comprometer o uso pelo usuário, como necessitar de diversos treinamentos; não lembrar de funcionalidades pouco utilizadas; não aprender todas as funcionalidades; levar tempo demais para realizar a tarefa desejada. &lt;/p&gt;

&lt;p&gt;Para concluir, fica claro a necessidade de levar em conta a organização de tempo para a entrega satisfatória, a organização financeira para que o desenvolvimento tenha lucro e seja atrativo ao investimento por parte do Colégio; Atenção aos detalhes durante a produção do mesmo para garantir com que todos os Requisitos sejam cumpridos, o principal sendo a reserva de equipamentos por parte dos professores, cuidados ao elaborar os requisitos não funcionais e de negócio, pois apesar de estarem “fora” do uso dos professores ainda assim serão parte fundamental das estratégias de desenvolvimento. &lt;/p&gt;

&lt;p&gt;Os processos de desenvolvimento de Interface, começando por um desenho básico em lápis e papel, até ser levado a um programa próprio a isso, organizar logicamente as etapas de telas, cores e fontes que tragam bem estar ao uso do aplicativo, bem como acessibilidade em questões de daltonismo ou visão prejudicada até a parte de Linguagem de Programação, em sua escolha, definição das regras de Heranças e Classes, entendimento do paradigma proposto para que seja possível usar esses recursos da melhor maneira, tudo isso é possível de se observar durante as etapas definidas do projeto, atendendo aos pontos principais do case e entregando o aplicativo. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7bNRrifP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gtbo3f08xjzo821c42m1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7bNRrifP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gtbo3f08xjzo821c42m1.png" alt="Image description" width="800" height="548"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Principais telas do app, podem ser vista em alta resolução &lt;a href="https://drive.google.com/file/d/1CUDBgpb6xZ8gFNiKmEwSiQrV7-uslDK5/view"&gt;neste link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Referências&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SILVA, Maria Valesca Damásio de C. Introdução às teorias econômicas. Salvador: UFBA, 2016.&lt;/p&gt;

&lt;p&gt;CARDOSO, Rodrigo Pinheiro. Objectives and Key Results (OKR) Aplicado a uma empresa industrial: Um estudo de caso. Porto, Portugal: FEP, 2020.&lt;/p&gt;

&lt;p&gt;GRADY, Jeffrey. System Engineering Planning and Enterprise Identity. Florida: CRC Press, 1995. &lt;/p&gt;

&lt;p&gt;LEWIS, John. Java Software Solutions: Foundations of Program Design. 6 Edicao. Londres: Pearson, 2008.&lt;/p&gt;

&lt;p&gt;Websites&lt;br&gt;
CUNHA, Fernando. &lt;a href="https://mestresdaweb.com.br/tecnologias/requisitos-funcionais-e-nao-funcionais-o-que-sao/"&gt;Requisitos funcionais e não funcionais: o que são?&lt;/a&gt; Mestres da Web, 2022.&lt;/p&gt;

&lt;p&gt;GOMES, Vanessa. &lt;a href="https://www.tiespecialistas.com.br/metricas-de-qualidade-de-software/"&gt;Métricas de Qualidade de Software.&lt;/a&gt; TI Especialistas, 2016. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.glassdoor.com.br/Sal%C3%A1rios/java-developer-sal%C3%A1rio-SRCH_KO0,14.htm?clickSource=searchBtn"&gt;Salários de Java Developer em Brasil&lt;/a&gt;. Glassdoor, 2021.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.ibm.com/common/ssi/cgi-bin/ssialias?appname=skmwww&amp;amp;htmlfid=897%2FENUS290-529&amp;amp;infotype=AN&amp;amp;mhq=service%20initializer&amp;amp;mhsrc=ibmsearch_a&amp;amp;subtype=CA"&gt;AD/CYCLE: IBM'S SAA Application Development Solution. &lt;/a&gt;IBM, 1990.     &lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/aela/cores-em-ui-um-guia-r%C3%A1pido-para-usar-em-seus-projetos-31ccffe3e16b"&gt;Cores em UI: Um Guia Rápido Para Usar em Seus Projetos.&lt;/a&gt; AELA, 2020. &lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>android</category>
      <category>kotlin</category>
      <category>ux</category>
    </item>
    <item>
      <title>Básico sobre Visão Computacional</title>
      <dc:creator>Guilherme Thomas</dc:creator>
      <pubDate>Fri, 27 May 2022 12:59:39 +0000</pubDate>
      <link>https://forem.com/guithomas/visao-computacional-129m</link>
      <guid>https://forem.com/guithomas/visao-computacional-129m</guid>
      <description>&lt;p&gt;Introdução básica em Visão Computacional, um dos campos dentro de IA e Aprendizado de Máquina, responsável por permitir que essas aplicações possam obter informação de imagens, vídeos e qualquer fonte visual, e com essa informação tomar decisões. Como em carros autônomos lendo em tempo real imagens da câmera, instalada geralmente no para-brisa, e detectando faixas de trânsito, placas, sinalizações e pessoas e reagindo a essas informações, alertando o motorista ou até agindo no lugar dele para evitar um acidente.&lt;/p&gt;

&lt;p&gt;A vantagem principal de um sistema Aprendizado de Máquina focado em Visão Computacional são suas capacidades de, com um modelo bem treinado, analisar milhares de fontes visuais em tempo menor do que a capacidade humana é capaz.&lt;br&gt;
Em 2015, a aplicação ResNet criada por Kaiming He e equipe, venceu a competição ILSVRC (ImageNet Large Scale Visual Recognition Challenge) com um projeto com melhor performance que um humano, para classificação, localização e detecção de imagens, usando um conjunto de 15 milhões de dados para treinar, validar e testar seu modelo.&lt;/p&gt;

&lt;p&gt;Uma aplicação de ML para Visão Computacional irá rotular uma imagem em níveis de pixel, e então realizar uma convolução (operação matemática, dentro da área de análise funcional, onde dadas duas funções, resulta em uma terceira) e classificar a imagem de acordo com os rótulos. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Imagem Digital&lt;/strong&gt;&lt;br&gt;
   Uma imagem digital pode ser do tipo de raster ou do tipo vetorial. Uma imagem vetorial é criada com o uso de figuras geométricas básicas como linhas e curvas, organizadas de maneira a representar a imagem desejada. Já as Imagens digitais do tipo raster são representacoes bi-dimensionais precisas, de conjuntos finitos de pontos expressos por números, criando uma matriz, onde cada ponto é um pixel e cada pixel pode ter uma cor específica. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--u2ccAdKK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/co2soyeaxu9aumkoeys6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--u2ccAdKK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/co2soyeaxu9aumkoeys6.png" alt="Image description" width="634" height="254"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Existem algumas fases para o processamento de uma Imagem Digital, fases essas apresentadas no livro Digital Image Processing e resumidas da seguinte maneira:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Aquisição: Capturar a imagem com um sensor e então converter para uma entidade tangível.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Aprimoramento: Extrair detalhes não perceptíveis, melhoria geral da qualidade da imagem.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Restauração: Falhas como ruído, borrões ou desfocagem são removidas para ter a imagem mais limpa possível.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cor: Lidar com as cores de imagens em diversos formatos como RGBA ou RGB.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Onduleta: Fundamento para representar imagens em diversos níveis de resolução.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Compressão e descompressão:  Alterações de resolução ou tamanho da imagem.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Processamento morfológico: Definir estruturas e formas do objeto presente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Segmentação: Identificação de características específicas na imagem através da segmentação da mesma.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Representação e descrição:  Extrair os atributos que resultam em uma informação quantitativa de interesse do processo, visualizar os dados processados.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reconhecimento: Rotular o determinado objeto de acordo com suas descrições.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
    <item>
      <title>Resumo sobre UML</title>
      <dc:creator>Guilherme Thomas</dc:creator>
      <pubDate>Fri, 20 May 2022 01:18:06 +0000</pubDate>
      <link>https://forem.com/guithomas/resumo-sobre-uml-3bi0</link>
      <guid>https://forem.com/guithomas/resumo-sobre-uml-3bi0</guid>
      <description>&lt;p&gt;&lt;strong&gt;UML - Unified Modeling Language&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;UML é em sua essência uma linguagem de propósito geral, usada majoritariamente com o intuito de prover à modelagem de software um modelo visual semanticamente e sintaticamente rico para a arquitetura, design e implementação de sistemas complexos tanto em estrutura como em comportamento.&lt;br&gt;
Seu pontapé foi em 1994 num esforço para unificar métodos de duas empresas. Em 2000 a organização OMG (Object Management Group) junto com outras empresas internacionais aprovou a UML como um padrão para o desenvolvimento em paradigmas de Orientação a Objetos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxhsrv2mqfggyewrwfn4o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxhsrv2mqfggyewrwfn4o.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tipos de Diagramas de UML&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para desenvolver a representação gráfica de softwares, precisamos representar tanto as estruturas quanto o comportamento dos objetos pertencentes.&lt;br&gt;
Os diagramas de estrutura irão representar a visão estática do sistema, sendo sua estrutura "main". Essa estrutura principal é composta por classes, objetos, interfaces, componentes e nós. Dentre a lista dos diagramas de estrutura, existem algumas que são mais comuns, são elas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Diagramas de classe - Representam a visão orientada a objeto do sistema, estática por natureza. Composta por classes, interfaces, associações e colaboração.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Diagramas de componente - Representam como cada componente age durante a execução do sistema, mostram também os módulos de código presentes, geralmente usados na modelagem de "sub sistemas" em sistemas mais complexos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Diagrama de objeto - Mostra uma visão completa ou parcial de uma estrutura do sistema em um momento específico. Similar ao diagrama de classe exceto que demonstra a instância das classes no sistema, retratando o comportamento do objeto.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Diagrama de implementação - Retratam os aspectos físicos do sistema, nos mostram quais os componentes de hardware existem e qual software está executando nele. Muito usados em sistemas embarcados.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Já os diagramas de comportamento são usados para visualizar, especificar ou capturar os aspectos dinâmicos do sistema, retratando o mesmo enquanto está sendo executado ou operado. Os mais comuns de uso são:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Diagrama de casos de uso - Descreve a sequência de ações para que o sistema traga resultados visíveis. Mostra a interação com o usuário per si. Em suma é constituído de atores e casos de uso.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Diagrama de sequência - Representa a interação entre objetos em uma determinada ordem, ou seja, na ordem que acontecem no sistema. Também chamados de diagramas de evento ou cenários.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Diagrama de estado de transição - Modela o comportamento dinâmico de uma classe visto uma mudança externa, representando a condição do sistema ou de parte dele em um momento finito do tempo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Diagrama de atividade - Demonstram as interconexões entre as atividades e as ações do sistema, como uma versão mais complexa de um fluxograma.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ainda sobre UML, Grady Booch recentemente comentou que usa a linguagem e que é possível demonstrar 80% do design de um projeto usando apenas 20% de UML, sendo ainda uma forma consistente de comunicação visual, essa é a mesma opinião de Ivar Jacobson, ambos criadores declaram que UML não é a bala de prata como foi anunciada 20 anos atrás, mas obviamente não é ruim como alguns acadêmicos e agilistas comentam.&lt;/p&gt;

</description>
      <category>uml</category>
      <category>braziliandevs</category>
      <category>draft</category>
    </item>
    <item>
      <title>Arquitetura Baseada em Modelos</title>
      <dc:creator>Guilherme Thomas</dc:creator>
      <pubDate>Wed, 18 May 2022 12:21:15 +0000</pubDate>
      <link>https://forem.com/guithomas/arquitetura-baseada-em-modelos-28pm</link>
      <guid>https://forem.com/guithomas/arquitetura-baseada-em-modelos-28pm</guid>
      <description>&lt;p&gt;Arquitetura baseada em orientação a modelos, com objetivo de lidar melhor com a complexidade e interdependência de sistemas complexos.&lt;br&gt;
Sem levar em conta o objetivo final do sistema, o processo em si consiste em criar um modelo independente de plataforma expresso pela UML, que depois é transformado em algo mais específico para uma plataforma como .NET, JEE2, SOAP.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AoauwxUX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1smr87y08n9vgfdekzcl.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AoauwxUX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1smr87y08n9vgfdekzcl.gif" alt="Image description" width="319" height="328"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O processo em si consiste em criar um CIM que irá contér o “core” do negócio, mostrando requisitos que o sistema necessita mas sem detalhar estrutura, passamos então a criação do PIM, ainda em um alto nível de abstração, descrevendo o sistema de software sem entrar em detalhe de nenhuma tecnologia, para então irmos ao PSM que usa a tecnologia como base para o desenvolvimento, sendo transformado em código. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CIM - Modelo de Computação Independente&lt;/strong&gt;&lt;br&gt;
Referido também como modelo de negócio ou domínio, apresenta exatamente o que se espera que o sistema realize, mas mantém escondida toda a parte de informação referente a tecnologia, permanecendo assim independente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PIM - Modelo Independente de Plataforma&lt;/strong&gt;&lt;br&gt;
Irá demonstrar apenas o suficiente em termos de independência, para que o mapeamento a outras plataformas se torne possível. É atingido criando alguns serviços de maneira a abstrair detalhes técnicos. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PSM - Modelo Específico de Plataform&lt;/strong&gt;a&lt;br&gt;
Aqui o Modelo Independente será incluído junto a detalhes que uma plataforma específica necessita para executar. &lt;/p&gt;

&lt;p&gt;Em resumo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Etapa 1 Construção do modelo o mais abstrato possível.&lt;/li&gt;
&lt;li&gt;Etapa 2 Modelo é transformado em algo mais específico de uso e em termos de implementação.&lt;/li&gt;
&lt;li&gt;Etapa 3 Modelo virá código.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Um padrão que transcende as noções de CIM/PIM/PSM, são dois conceitos chave do MDA: modelos e transformações. &lt;br&gt;
Transformação dentro do assunto MDA é a atividade de produzir diferentes modelos, ideias ou artefatos, geralmente de uma representação a outra, como um PIM se transforma em vários PSM. O conceito ou ideia inicial do PIM se mantém, porém no PSM terá outra forma (mobile, desktop, cloud).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jt7yvfbp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/donx8eo3s3gskqyfhmvc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jt7yvfbp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/donx8eo3s3gskqyfhmvc.png" alt="Image description" width="552" height="77"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pontos fortes&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Produtividade: Modelo específico precisa ser definido apenas uma vez. (PSM)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Portabilidade: Modelo independente (PIM) pode gerar divisões específicas para diferentes plataformas&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Interoperabilidade: Os diferentes PSM podem trabalhar em conjunto com diversas plataformas, pois o modelo independente "cria" pontes através das especificações técnicas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adaptação e mudanças são os principais aspectos da engenharia orientada a modelo, a evolução do software, na literatura onde é chamada de maintenance, tem três principais razões para acontecer:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Razão 1 -  Correção - Indica uma alteração no sistema para solucionar um processo, performance ou implementação;&lt;br&gt;
Razão 2 - Adaptiva - Alteração engatilhada por motivos técnicos ou regras de negócio;&lt;br&gt;
Razão 3 - Perfectiva - Realizada para melhorar qualidade (Eficiência de processamento, aperfeiçoamento de performance, etc) e da mantenabilidade do sistema.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Pontos fracos&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Manutenção do modelo UML;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Alteração geralmente requerem intervenções manuais e tediosas, o modelo UML precisa refletir as mudanças para cada instância na qual o padrão ou regra arquitetural é usado.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Problemas de arquitetura - Segurança, transações, modelos de persistência não são bem encapsulados, sendo difícil a abstração e o reuso em diferentes plataformas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Proliferação de middleware - Quase impossível depender de apenas um sistema de middleware e padronizar, com o tempo e a evolução constante, fica cada vez mais difícil e mais caro realizar uma migração.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reuso - O design de padrões pode levar ao desenvolvimento de modelos inadequados à tarefa proposta pela regra de negócio.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esse é um resumo que criei enquanto estudava sobre a arquitetura baseada em modelos, pois é a arquitetura que estou desenvolvendo hoje junto a empresa que atuo. &lt;/p&gt;

&lt;p&gt;Referências:&lt;br&gt;
"The Fast Guide to Model Driven Architecture" por Frank Truyen;&lt;br&gt;
"Object Management Group Model Driven Architecture (MDA) MDA Guide rev. 2.0" disponível no site da OMG.&lt;/p&gt;

</description>
      <category>mda</category>
      <category>architecture</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>GIT Server usando um Raspberry PI &amp; Pendrive</title>
      <dc:creator>Guilherme Thomas</dc:creator>
      <pubDate>Mon, 25 Apr 2022 22:42:54 +0000</pubDate>
      <link>https://forem.com/guithomas/git-server-usando-um-raspberry-pi-pendrive-48a9</link>
      <guid>https://forem.com/guithomas/git-server-usando-um-raspberry-pi-pendrive-48a9</guid>
      <description>&lt;p&gt;GIT completou 17 anos esse mês, ele é um sistema de controle de versões de código iniciado pelo Linus Torvalds, inicialmente feito para controle do desenvolvimento do kernel do Linux, e hoje usado de diversas maneiras (mas ainda principalmente no desenvolvimento de software).&lt;/p&gt;

&lt;p&gt;Existem diversas razões para querer ter um GIT server próprio, acredito que a maior delas seja a segurança do seu código, se ele possui dados sensíveis ou seja proprietário, pode ser uma boa ideia não usar serviços populares como Github ou Bitbucket.&lt;/p&gt;

&lt;p&gt;Enquanto não tenho oportunidade de comprar um Raspberry Pi 4, resolvi usar meu Model 3 pra brincar um pouco e decidir criar um servidor de GIT com ele. O processo é bem simples.&lt;/p&gt;

&lt;p&gt;O que usei foi:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Raspberry Pi Model 3&lt;/li&gt;
&lt;li&gt;Pendrive (FAT)&lt;/li&gt;
&lt;li&gt;OS &lt;a href="https://www.raspberrypi.com/software/"&gt;Raspbian &lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YXctgGWq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uwbr0h6osff06barr1ty.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YXctgGWq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uwbr0h6osff06barr1ty.jpg" alt="Image description" width="800" height="1424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como falamos de segurança, a primeira coisa a fazer é criar um usuário separado para usar, pois usaremos uma chave SSH para "publicar" no nosso server, você pode sim usar o usuário root mas não é aconselhável de jeito nenhum.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tIDmgTMF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4zkysb9vnmoj09advgng.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tIDmgTMF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4zkysb9vnmoj09advgng.png" alt="Image description" width="586" height="184"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Criei um user chamado gitsv e dei uma senha pra ele, agora voce pode acessar o user com&lt;/p&gt;

&lt;p&gt;&lt;code&gt;su gitsv&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;após&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cd&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Se tudo deu certo a gente já pode acessar por outra máquina na rede local.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ssh "user@endereco"&lt;/code&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EBUJHmfc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fdd78dic3tkwj8oyy1fg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EBUJHmfc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fdd78dic3tkwj8oyy1fg.png" alt="Image description" width="800" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Digite agora &lt;code&gt;ssh-keygen&lt;/code&gt; e siga os passos, agora envie essa public key para o server com &lt;code&gt;ssh-copy-id -i [local]/unique_key.pub gitsv@[endereco]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Agora pra garantir, manda um&lt;br&gt;
&lt;code&gt;sudo apt-get update&lt;/code&gt;&lt;br&gt;
&lt;code&gt;sudo apt-get upgrade&lt;/code&gt;&lt;br&gt;
&lt;code&gt;sudo reboot&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Acesse novamente o Raspberry por SSH e instale o GIT&lt;br&gt;
&lt;code&gt;sudo apt-get install wget git&lt;/code&gt; Depois disso pode desligar o PI que vamos deixar pronto o pendrive.&lt;/p&gt;

&lt;p&gt;Pode plugar o pendrive e iniciar o PI, logue nele e pode usar o comando &lt;code&gt;mkdir nome&lt;/code&gt; no meu, usei &lt;em&gt;pdrivedir&lt;/em&gt; como nome. Depois, vamos usar o comando &lt;code&gt;blkid&lt;/code&gt; que vai listar nossos blocks com um identificador único (UUID), o system type (TYPE) e rótulo de volume (LABEL). No meu caso, foi assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--W_lMF93H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ooa4k51nmflhp6mf3b17.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--W_lMF93H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ooa4k51nmflhp6mf3b17.png" alt="Image description" width="800" height="43"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Precisamos agora dizer pro PI que nossos arquivos irão pro diretório que criamos (pdrivedir).&lt;br&gt;
Pra isso, usamos  &lt;code&gt;nano /etc/fstab&lt;/code&gt; e adicionamos ao final do arquivo: &lt;code&gt;/dev/sda1 /home/pi/pdrivedir vfat uid=pi,gid=pi,umask=0022,sync,auto,nosuid,rw,nouser 0 0&lt;/code&gt;&lt;br&gt;
Lembrando de substituir o /dev/sda1 pela info do seu pendrive. Mete aquele CTRL-X, Y e Reboot.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dNFLW9Oh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/31d1ytsuj5phszpq0xqp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dNFLW9Oh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/31d1ytsuj5phszpq0xqp.png" alt="Image description" width="800" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bora criar agora uma pasta com final .git que vai ser nosso repositorio:&lt;br&gt;
&lt;code&gt;mkdir pdrivedir/projeto.git&lt;/code&gt;&lt;br&gt;
&lt;code&gt;cd pdrivedir/projeto.git&lt;/code&gt;&lt;br&gt;
E dentro da pasta, vamos iniciar o git, com:&lt;br&gt;
&lt;code&gt;git init --bare&lt;/code&gt;&lt;br&gt;
&lt;a href="https://www.geeksforgeeks.org/bare-repositories-in-git/"&gt;Inclusive recomendo esse link pra entender os repos bare e non-bare&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8g-cLMHh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5v2kzf2quviyxxtxokw3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8g-cLMHh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5v2kzf2quviyxxtxokw3.png" alt="Image description" width="800" height="28"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quer saber como dar o primeiro commit? Então:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ucmc7U14--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g3m1lkbcp6lt231gqxby.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ucmc7U14--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g3m1lkbcp6lt231gqxby.jpg" alt="Image description" width="480" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Precisamos fazer com que nosso git local esteja ciente desse repositório que criamos, bora com:&lt;br&gt;
&lt;code&gt;git remote add origin gitsv@endereco:/local/projeto.git&lt;/code&gt;&lt;br&gt;
"origin" pode ser qualquer nome de sua escolha. E agora o último passo é "pushar" o projeto para esse repositório, se for pra branch "master" o comando será esse &lt;code&gt;git push origin master&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Finalizado! O repo GIT está prontíssimo no seu servidor local, sendo armazenado no pendrive.&lt;/p&gt;

&lt;p&gt;Se quiser, podemos também deixar esse Raspberry Pi online, definindo um endereço de IP fixo e redirecionando uma porta (nesse caso a 22).&lt;/p&gt;

</description>
      <category>raspberrypi</category>
      <category>beginners</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Interligação de Redes por VPN</title>
      <dc:creator>Guilherme Thomas</dc:creator>
      <pubDate>Mon, 25 Apr 2022 18:41:00 +0000</pubDate>
      <link>https://forem.com/guithomas/interligacao-de-redes-por-vpn-4am8</link>
      <guid>https://forem.com/guithomas/interligacao-de-redes-por-vpn-4am8</guid>
      <description>&lt;p&gt;Projeto multidisciplinar desenvolvido para o curso tecnólogo de Análise e Desenvolvimento de Sistemas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Introdução&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O crescimento tecnológico é quase uma obrigação de todas as empresas que esperam prosperar. De diversos ramos a diversas propostas de mercado, a utilização de sistemas cada&lt;br&gt;
vez melhores, serviços mais inteligentes, conteúdo mais diversificado e principalmente mais velocidade em suas atividades é fundamental, ainda mais no caso da nossa empresa fictícia 2SHOW.IE que trabalha justamente com Marketing Digital e suas modalidades. &lt;br&gt;
Apresentamos nesse Projeto Integrado Multidisciplinar, uma proposta de Interconexão de suas redes Matriz e Sucursal, levando para a mesma, soluções que contemplem não só a&lt;br&gt;
velocidade suficiente para atender como a segurança e escalabilidade para o negócio prosperar ainda mais usando tecnologias recentes e bem projetadas de acordo com seus&lt;br&gt;
espaços físicos, sem deixar de lado o custo benefício para uma empresa em constante crescimento, portando, constante gastos em diversas de suas áreas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Empresa&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Contextualização do Case - Temos a empresa 2SHOW.IE, empresa de marketing digital, a mesma atua em mídias e plataformas digitais oferecendo a seus clientes soluções adequadas em cada contexto de atividade, serviços esses que incluem mas não somente, reconhecimento das marcas, adequação e direcionamento de tráfego para sites, portais e vitrines virtuais, qualificação, gerenciamento e crescimento de leads. (Lead no contexto de marketing e vendas é todo aquele usuário que deixou opções de contato, como email e telefone, para uma possível prospecção.). No último trimestre, o aumento da carteira de clientes e serviços da empresa 2SHOW.IE, tivemos também uma expansão física com a ajuda de um parceiro no segmento de publicidade, agora oferecendo mais serviços de mídia como gamificação, inbound marketing, redes sociais, performance digital, SEO, PPC, entre outros.&lt;br&gt;
   Iniciamos então uma proposta de estruturação de interconexão da rede da empresa, fazendo com que todos os dispositivos de seu escritório principal, aqui chamado Matriz, e sua nova sucursal, distante 60 km, se comuniquem e compartilhem documentos e serviços entre todos seus funcionários e pessoas licenciadas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Matriz:&lt;/strong&gt;&lt;br&gt;
A seguir, apresentamos a distribuição a atual dos dispositivos tanto em Matriz como&lt;br&gt;
Sucursal:&lt;br&gt;
1 Servidor DNS, arquivos de usuários, diretórios, servidor de impressão, Microsoft&lt;br&gt;
Project Server e antivírus: Kaspersky;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 Servidor software e aplicativos;&lt;/li&gt;
&lt;li&gt;1 Servidor de páginas de internet;&lt;/li&gt;
&lt;li&gt;35 Hosts, distribuídos em desktops e notebooks;&lt;/li&gt;
&lt;li&gt;5 Impressoras em rede&lt;/li&gt;
&lt;li&gt;1 Access Point&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Sucursal&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 Servidor com arquivos de usuários e server de impressão;&lt;/li&gt;
&lt;li&gt;20 Hosts, distribuídos em desktops e notebooks;&lt;/li&gt;
&lt;li&gt;3 Impressoras em rede&lt;/li&gt;
&lt;li&gt;1 Access Point&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No total &lt;strong&gt;69 dispositivos&lt;/strong&gt;, sendo 44 dispositivos na Matriz e 25 dispositivos em sua sucursal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conceito de Rede&lt;/strong&gt;&lt;br&gt;
   Partindo de uma ideia genérica, entendemos Rede como a interligação entre objetos ou pessoas com o intuito de circular materiais ou imateriais entre si. Quando vamos para o contexto da informática, entendemos Rede como a comunicação digital de um ou mais dispositivos eletrônicos, que comumente são guiados por regras, nesse caso, protocolos de rede, a fim de compartilhar entre si informações, recursos físicos e lógicos, utilizando meios confinados ou não confinados.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Virtual Private Network&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Segundo Ferguson (1998), uma Virtual Private Network, ou VPN na sigla em inglês, nada mais é que uma rede privada mantida na infraestrutura de uma rede pública, como a Internet.&lt;br&gt;
Existem diversas motivações para a utilização de uma rede privada, a principal com certeza sendo a virtualização de parte, ou todas, as comunicações de uma organização ou&lt;br&gt;
comunidade, no nosso case, as comunicações internas da 2SHOW.IE, deixando essas informações 'invisíveis' para pessoas externas enquanto se aproveita de uma infraestrutura já existente.&lt;br&gt;
   A ideia de utilizarmos a rede VPN como solução no case da 2SHOW.IE vem de algumas vantagens desse sistema, para nomear algumas:&lt;/p&gt;

&lt;p&gt;Escalabilidade - Num cenário como em 2020 de pandemia pelo coronavírus, diversas empresas adotaram o sistema de home office para seus colaboradores, uma solução VPN facilitaria o acesso desses colaboradores na rede da empresa sem estar fisicamente presente na mesma. Como também falamos de uma empresa com potencial ainda maior de crescimento, a escalabilidade do VPN é bem vinda com sua forma relativamente fácil de adicionar e remover novos usuários e ‘setar’ níveis de acesso.&lt;/p&gt;

&lt;p&gt;Segurança - O tráfego entre a filial, sua matriz e qualquer funcionário remoto agora é criptografado, garantindo que os recursos da empresa, seus dados, fiquem resguardados de  possíveis tentativas de invasão. Além disso, de acordo com a Lei no 12.965, Marco Civil da Internet, Artigo terceiro, tem dois princípios extremamente importantes que protegeremos:&lt;/p&gt;

&lt;p&gt;II - proteção da privacidade;&lt;br&gt;
III - proteção dos dados pessoais, na forma da lei;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2LerOtNt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3rfqs1oa3ikp4p1nbwrf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2LerOtNt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3rfqs1oa3ikp4p1nbwrf.png" alt="Image description" width="550" height="375"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;&amp;gt; Fig. 1 Exemplo básico de conexão VPN  usando a internet como infraestrutura.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IPSec e SSL&lt;/strong&gt;&lt;br&gt;
   Ambos modelos de protocolos são os mais usados na implementação de uma rede VPN e atuam em diferentes camadas da arquitetura OSI. O IPSec que usaremos em nosso case e nas&lt;br&gt;
simulações do Cisco Packet Tracer atua na camada de rede, que é a terceira camada, já o SSL atua na camada de aplicações, que é a sétima camada do modelo OSI.&lt;br&gt;
   A escolha do modelo IPSec se dá pela disponibilidade permanente entre as redes de Matriz e Sucursal e por eventuais acessos remotos necessários.&lt;/p&gt;

&lt;p&gt;De forma resumida, usaremos um conjunto de padrões (IPSec) em nossa VPN garantindo que as informações sejam enviadas de forma segura (criptografadas) mesmo sendo enviadas&lt;br&gt;
em um meio não seguro, como em nosso caso, a Internet.&lt;br&gt;
O gerenciamento de chaves utilizado pelo IPSec é chamado de IKE (Internet Key Exchange), e sua comunicação é realizada em duas fases:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;No meio inseguro (Internet) é estabelecido um canal seguro onde serão realizadas as operações ISAKMP.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No canal seguro criado, é definido a Associação de Segurança, ou SA, que será responsável pela proteção da conexão usando algoritmos de criptografia (DES, 3DES, AES), algoritmos de autenticação (MD5, SHA-1) e configurado o tempo de vida dessa SA.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Importante salientar que não é uma escolha de IPSec sobre o SSL, pois o SSL também pode fazer parte do ecossistema de segurança VPN. Enquanto com a configuração IPSec é&lt;br&gt;
necessário um client sendo usado por nossos hosts, a configuração SSL é ‘browser based’ ou seja, pode ser usada somente pelo navegador, em comparação com a IPSec, podemos garantir que o acesso por SSL seja somente a determinadas partes ou serviços da nossa rede.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9SMij4ER--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/coud5hls4smobmg7spqz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9SMij4ER--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/coud5hls4smobmg7spqz.png" alt="Image description" width="661" height="329"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Fig.2 Exemplo de rede com IPSec entre escritório principal e escritório secundário, com uso de rede SSL por usuário remoto.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Topologia&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A topologia vem do grego topos, "lugar", e logos, "estudo", e em nossa matéria de Fundamentos de Rede de Dados, classificamos o termo para definir a forma como será a&lt;br&gt;
estrutura da rede, como hubs, computadores e switches serão posicionados. A forma dessa organização influenciará em sua qualidade e estabilidade.&lt;br&gt;
Complementando, temos a topologia Física e Lógica;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Topologia Física - Literalmente a forma física com que cabos e dispositivos serãoconectados.&lt;/li&gt;
&lt;li&gt;Topologia Lógica - Como será feita a conexão virtual de cada nó da rede e disposição da transmissão de dados entre eles.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Existem diferentes tipos de topologias físicas, com finalidades e funcionamentos variados.&lt;br&gt;
Para adequar nossa rede, descreveremos resumidamente algumas das principais elencando as razões para a tomada de decisão.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;ol&gt;
&lt;li&gt;Barramento - Uma das topologias ainda mais comuns, todos os dispositivos são ligados a uma barra física e todos os dados fluem por uma única linha. É uma topologia extremamente econômica e de rápida implementação.&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;&lt;ol&gt;
&lt;li&gt;Estrela - Caracterizada por um elemento central que gerencia o fluxo de dados para cada nó da rede. A informação enviada é recebida primeiro por esse elemento central, e só então destinada aos outros hosts.&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;&lt;ol&gt;
&lt;li&gt;Anel - Nesse tipo de topologia, os dispositivos são conectados uns aos outros em forma de circuito fechado, as informações são enviadas unidirecionalmente e cada nó envia e recebe informações apenas em sua vez.&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;&lt;ol&gt;
&lt;li&gt;Árvore - Baseada em uma estrutura de hierarquia entre vários hosts, são criados ramos entre os nós, os mesmos são conectados em uma barra central e switch e roteadores fazem a conexão das redes subsequentes.&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Além dessas listadas, também temos topologias do tipo Malha (todos interligados), topologia do tipo Híbrida (duas ou mais topologias misturadas) e Peer to Peer (um nó conectado ao outro).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1IJkT2gA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9iyvv573ddhqjpymuy5m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1IJkT2gA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9iyvv573ddhqjpymuy5m.png" alt="Image description" width="627" height="310"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Fig. 3 Ilustrações dos diferentes tipos de topologia.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Iremos usar como padrão a Topologia Estrela para basear nossa estrutura física da Matriz e Sucursal. Teremos os switchs tanto de Matriz quanto Sucursal que serão responsáveis pelo gerenciamento do fluxo de dados da rede, evitando que os dados passem por todos os hosts, e sim com que sejam recebidos e enviados somente aos hosts solicitados.&lt;/p&gt;

&lt;p&gt;Algumas das vantagens claras em usar a Topologia de Estrela em nosso case serão a alta confiabilidade da Rede, pois a má função de um dispositivo ou cabo afetará somente aquela determinada parte da Rede, ajudando ainda na manutenção pois será mais simples de se achar o local com problema de conexão.&lt;/p&gt;

&lt;p&gt;Além disso, a performance desse tipo de Rede é excelente, pois não há ‘colisão’ de informações que estão trafegando, tornando a resposta mais rápida.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cabeamento&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fibra Ótica&lt;br&gt;
   Cabos de Fibra Ótica foram cabos criados com o intuito de conduzir luz, imagens ou impulsos codificados. A transmissão é realizada pelo lançamento de um feixe de luz em uma das extremidades, e pelas características reflexivas do mesmo, esse feixe percorre o cabo em velocidades altíssimas chegando a casa de 40Gbps. A transmissão de dados se dá pela conversão de sinais elétricos em pulsos de luz que representam os dígitos binários 0 e 1.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--v-I87_rf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kbrhy35qd5ahfbmm15yu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--v-I87_rf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kbrhy35qd5ahfbmm15yu.png" alt="Image description" width="423" height="231"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Fig. 4 Como se dá a reflexão de luz dentro do cabo.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Para realizar a conexão confinada entre roteadores e switchs, tanto na Matriz quanto Sucural, utilizaremos a Fibra Ótica Multi Modo, pois segundo Oliveira (2004) é comum o uso&lt;br&gt;
da Fibra MultiModo em LANs de pequeno a médio porte como prédios e escritórios.&lt;br&gt;
   Isso auxilia-nos no custo benefício pois comparada a Fibra Monomodo, é uma fibra de menor custo portanto menos impacto no orçamento da empresa, sem que haja malefícios a construção da rede.&lt;/p&gt;

&lt;p&gt;Cabo Trançado&lt;br&gt;
   Para a conexão confinada entre switchs e hosts tanto da Matriz quanto Sucursal, utilizaremos cabos de par trançado, sem blindagem, chamados de UTP da sigla em inglês&lt;br&gt;
Unshielded Twisted Pair. Serão usados cabos da Categoria 5 ‘enhanced’, o mesmo é uma versão melhorada dos cabos cat5, e permitem conexões de até 1000 Mpbs em uma distância máxima de 100 metros.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--n9pqtFgA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xn24g64qy8e5s62co18h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--n9pqtFgA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xn24g64qy8e5s62co18h.png" alt="Image description" width="605" height="348"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Fig. 5 Comparativo entre algumas das categorias de cabos.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;O cabo cat5e é constituído de condutores de cobre isolados em termoplástico, e protegidos por uma capa anti-chama. Ele é uma das categorias de transmissão regulamentada pela ANSI&lt;br&gt;
e TIA. Além disso, por ser uma versão melhorada da cat5, seus quatro pares de cabos trançados reduzem bastante o nível de interferência, evitando a diafonia entre cabos próximos&lt;br&gt;
ou outras fontes de campos eletromagnéticos.&lt;br&gt;
Como vantagem final para o uso do cabo cat5e temos seu custo benefício, sendo hoje o cabo mais barato para a criação de redes com até 100 metros de distância.&lt;/p&gt;

&lt;p&gt;TCI/IP&lt;br&gt;
   Existem diversas estruturas usadas para realizar a comunicação entre dispositivos, uma dessas estruturas é chamada de TCP/IP, um conjunto de padrões de comunicação que são hoje a base da Internet que usamos. Essa estrutura é dividida em algumas camadas, cada qual com sua função, e inicialmente o modelo básico possuia quatro camadas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Aplicação - Grupo de software ou aplicativos que precisam de comunicação com a rede, como email, é a camada que o usuário interage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Transporte - Estabelece um meio de transmissão dos dados em forma de pacotes, e garante que sejam enviados e reconhecidos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Internet - Controla o movimento dos pacotes pela rede.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enlace - Controla a parte física da movimentação de pacotes, usando cabos, conexões sem fio, etc.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Endereçamento IP&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Endereços IP são organizados em algumas classes, e essas classes irão determinar quantos bits serão usados para caracterizar uma rede e quantos bits serão usados para caracterizar o dispositivo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---brswScF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ztitwjns6yv3xrv3g5u4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---brswScF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ztitwjns6yv3xrv3g5u4.png" alt="Image description" width="606" height="172"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Fig. 6 Esquema simples exemplificando as classes e suas diferentes funções.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Iniciaremos com uma configuração de Classe B, geralmente empregada em redes de médio porte (máximo de 65.534 hosts por rede). De todos os milhões de endereços que podem ser usados, algumas faixas podem ser usadas apenas para redes privadas. No caso da empresa 2SHOW.IE iremos usar a faixa 172.16.0.0 que contempla até 172.31.255.255, número suficiente para trabalhar tanto em Matriz quanto Sucursal e qualquer outra unidade que esteja em planos futuros.&lt;br&gt;
Nossa matriz usará a Classe B, faixa 172.16.0.0, com Servidores indo de 172.16.0.1 até 172.16.0.5, máscaras 255.255.255.0, e os hosts seguintes utilizarão os endereços 172.16.0.10 até 172.16.0.99.&lt;br&gt;
   Nossa Sucursal então seguirá no caminho da faixa 172.16.1.0, com Servidores indo de 172.16.1.1 até 172.16.1.5 e hosts seguintes nos endereços 172.16.1.10 até 172.16.1.99.&lt;br&gt;
Em ambas Matriz e Sucursal, reservamos uma faixa de IP 115 à 233 para futuros projetos, garantindo o encaixe de dispositivos na rede. Ambos roteadores usarão a faixa de IP 254.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--i6yaSUzs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2bl9hj4lvgw0cdqz12md.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--i6yaSUzs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2bl9hj4lvgw0cdqz12md.png" alt="Image description" width="610" height="240"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Fig. 7 Esquema montado no Cisco Packet Tracer da estrutura teorizada.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--r3-O-PBt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dlaoeq98zm7zp5dgfdgo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--r3-O-PBt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dlaoeq98zm7zp5dgfdgo.png" alt="Image description" width="615" height="73"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Fig. 8 Teste de envio de pacotes entre Servidor de Matriz e Host na Sucursal, Host na Matriz para Impressora na Sucursal e Host na Sucursal para Impressora na Matriz, realizado no Cisco Packet Tracer.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusão&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Empresas bem administradas e em pé com a realidade e necessidade do mercado, tem chances valiosíssimas de crescer financeiramente, aumentar seu número de serviços, seu&lt;br&gt;
número de funcionários e consequentemente se expandindo fisicamente. O crescimento em todos os níveis da empresa fictícia em nosso case, 2SHOW.IE levou a inauguração de uma&lt;br&gt;
sucursal sua. E esse crescimento também a leva a necessidade de se aprimorar em questões tecnológicas.&lt;br&gt;
   Levamos então a presente estrutura para sua Matriz e Sucursal fazendo com que funcionários e pessoas de ambas as unidades tenham acessos aos arquivos e serviços disponíveis, para tanto, usamos dos conhecimentos das matérias 'Fundamentos de Redes de Dados e Comunicações', 'Matemática para Computação', 'Metodologia Científica', 'Ética e Legislação Profissional' e 'Laboratório de Arquitetura e Redes de Computadores' e criamos uma Rede Privada Virtual, usando a Internet como base e fazendo com que ambas as unidades se conversem, mantendo um nível aceitável de segurança para os arquivos e pessoas envolvidas, deixando claro quais endereçamento de redes seriam utilizados, até quais cabos serão usados na rede física, levando em consideração não somente o crescimento já estabelecido da empresa, como pensando em possíveis ocorrências de acessos remotos levados por trabalhadores home-office como foi o caso de muitas empresas durante o período de pandemia, e também pensando no crescimento físico da empresa no caso de outra sucursal ou unidade tanto na mesma média de distância da Sucursal atual (60km) ou até mesmo unidades internacionais.&lt;br&gt;
   Apesar das diversas opções que hoje o mercado oferece para redes empresariais, concluímos que a VPN foi a melhor escolha em nosso case pelas características já apresentadas: Escalabilidade e segurança. Conseguimos então apresentar uma solução de rápida implementação e custo benefício excelentes.&lt;/p&gt;

</description>
      <category>vpn</category>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
