<?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>DEV Community: Andre Racz</title>
    <description>The latest articles on DEV Community by Andre Racz (@andreracz).</description>
    <link>https://dev.to/andreracz</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%2F689588%2F042419ee-06fb-4e89-9590-7453246976e9.jpeg</url>
      <title>DEV Community: Andre Racz</title>
      <link>https://dev.to/andreracz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/andreracz"/>
    <language>en</language>
    <item>
      <title>Arquitetura Evolutiva: a chave para o sucesso da Agilidade</title>
      <dc:creator>Andre Racz</dc:creator>
      <pubDate>Wed, 29 Sep 2021 18:45:52 +0000</pubDate>
      <link>https://dev.to/andreracz/arquitetura-evolutiva-a-chave-para-o-sucesso-da-agilidade-51a4</link>
      <guid>https://dev.to/andreracz/arquitetura-evolutiva-a-chave-para-o-sucesso-da-agilidade-51a4</guid>
      <description>&lt;p&gt;Como tratar atividades de arquitetura em projetos Ágeis? Tradicionalmente, em metodologias Waterfall, conforme imagem abaixo, as atividades de arquitetura se concentram até a fase de design. É o que é tradicionalmente chamado de BDUF (Big Design Up Front).&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%2F4g78qocbcb7hymz2m02t.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%2F4g78qocbcb7hymz2m02t.png" alt="image"&gt;&lt;/a&gt;&lt;br&gt;
Metodologia Waterfall - fonte: &lt;a href="https://martinfowler.com/bliki/WaterfallProcess.html" rel="noopener noreferrer"&gt;Martin Fowler - Waterfall process&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nesse tipo de metodologia, temos todo o desenho funcional e de arquitetura sendo feito antes de se iniciar o desenvolvimento e é fácil ver como as atividades de arquitetura se encaixam no projeto.&lt;/p&gt;

&lt;p&gt;Contudo, hoje a maior parte das organizações já está adotando metodologias ágeis, em grande parte pois perceberam que as metodologias em cascatas demoram muito para entregar valor às organizações, gasta-se um grande tempo em desenho de uma solução, que quando fica pronta, normalmente não atende às novas demandas do mercado, que evolui muito rápido.&lt;/p&gt;

&lt;p&gt;Isso nos deixa com a pergunta que abre esse artigo: como tratar as atividades de arquitetura em metodologias ágeis? &lt;/p&gt;

&lt;p&gt;E complemento: Como tratar as atividades de arquitetura em metodologias ágeis se o foco é na entrega de valor e o backlog é determinado por um product owner com uma visão excelente de negócio, mas com pouca visão técnica?&lt;/p&gt;

&lt;h1&gt;
  
  
  Abordagens
&lt;/h1&gt;

&lt;p&gt;O mercado tem adotado duas abordagens principais quando fala de arquitetura em projetos Ágeis:&lt;/p&gt;

&lt;p&gt;A primeira abordagem, vinda da metodologia SAFE (Scaled Agile Framework que é voltada para iniciativas de maior porte e com múltiplos times colaborando), ela é chamada de &lt;a href="https://www.scaledagileframework.com/architectural-runway/" rel="noopener noreferrer"&gt;Architecture Runway&lt;/a&gt;, que pode ser traduzida como "Pista de arquitetura" ou "Passarela de Arquitetura". &lt;/p&gt;

&lt;p&gt;Nesta abordagem, é montada uma equipe de arquitetura com um Arquiteto como Product Owner. Este time trabalha em funcionalidades que habilitam os outros times a entregarem valor para o negócio.&lt;/p&gt;

&lt;p&gt;A segunda abordagem mais utilizada é dar autonomia completa às equipes para tomada de decisão, e deixar as atividades de arquitetura como parte das sprints. Para essa abordagem ser bem sucedida é necessário um time com maior senioridade e um PO que consiga ver valor em atividades mais técnicas, visto que em geral essa abordagem tente a gerar necessidades mais frequentes de refatoração.&lt;/p&gt;

&lt;p&gt;Ambas as abordagens tem benefícios e desafios, e irei no futuro fazer um artigo sobre elas, mas como bom Arquiteto, não poderia deixar de falar da parte técnica. Qual a chave para fazer uma arquitetura evolutiva?&lt;/p&gt;

&lt;h1&gt;
  
  
  A chave da Arquitetura Evolutiva
&lt;/h1&gt;

&lt;p&gt;Independente da abordagem, a chave para obter uma arquitetura evolutiva é diminuir o acoplamento nos sistemas. Pensando em um cenário padrão de aplicações, como visto abaixo, o desacoplamento deve ser feito em vários níveis. &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%2Fd9lfbdxeqaxoif1fygcf.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%2Fd9lfbdxeqaxoif1fygcf.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tipos de desacoplamento&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Desacoplamento dentro de um módulo: Desacoplar as funcionalidades dentro de um módulo do sistema&lt;/li&gt;
&lt;li&gt;Desacoplamento dentro de um sistema: Desacoplar os diversos módulos dos sistemas&lt;/li&gt;
&lt;li&gt;Desacoplamento entre sistemas: Desacoplar os diversos sistemas dentro da empresa&lt;/li&gt;
&lt;li&gt;Desacoplamento com entes externos: Desacoplar sistemas externos á nossa empresa&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para cada um desses níveis, existem técnicas para obter o desacoplamento, irei criar uma série de artigos abordando individualmente esses tipos de desacoplamento, então fique de olho!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Rodando um servidor de minecraft no Azure</title>
      <dc:creator>Andre Racz</dc:creator>
      <pubDate>Thu, 02 Sep 2021 10:15:05 +0000</pubDate>
      <link>https://dev.to/andreracz/rodando-um-servidor-de-minecraft-no-azure-5f8f</link>
      <guid>https://dev.to/andreracz/rodando-um-servidor-de-minecraft-no-azure-5f8f</guid>
      <description>&lt;p&gt;Para inaugurar o meu blog aqui no dev.to, decidi escrever um artigo mais leve, unindo duas grandes paixões: Minecraft e Containers!&lt;/p&gt;

&lt;p&gt;Eu comecei a jogar Minecraft ainda na versão beta, em 2010, por indicação do meu amigo Thiago Duarte. Na época joguei um pouco, mas acabei perdendo o interesse. Na época paguei 5 dólares pela licença. &lt;/p&gt;

&lt;p&gt;Com a pandemia, e buscando atividades para fazer com meu filho, lembrei que tinha conta no Minecraft, e começamos a jogar em familia, eu, ele e minha esposa, mas sempre tinhamos o problema de quem ia rodar o servidor, acabava que alguém sempre um de nós tinha que deixar o servidor aberto no computador, mesmo que não quisesse jogar.&lt;/p&gt;

&lt;p&gt;Para resolver isso, resolvi subir um servidor de Minecraft na Azure, aproveitando o benefício de ser MCT (Microsoft Certified Trainer) e ter alguns créditos todos os meses. &lt;/p&gt;

&lt;p&gt;Inicialmente, subi o servidor em uma VM, baixando localmente o servidor, o Java e rodando tudo manual, mas o processo é muito lento e manual, então, sendo um grande fã de containers, fui correr atrás de como rodar ele em containers. Por sorte, temos uma ótima imagem docker para rodar um servidor de minecraft, com todas as opções possíveis, que pode ser visto neste excelente repositório do github: &lt;a href="https://github.com/itzg/docker-minecraft-server" rel="noopener noreferrer"&gt;itzg/docker-minecraft-server&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse container permite rodar o servidor de minecraft com poucas configurações, e é fácil rodar a versão tradicional (vanilla), assim como várias opções com mods. &lt;/p&gt;

&lt;p&gt;Inicialmente, aproveitei a VM que tinha, instalei o docker e comecei a rodar lá o container, mas sempre ficou a idéia de como rodar ele no &lt;a href="https://azure.microsoft.com/pt-br/services/container-instances/" rel="noopener noreferrer"&gt;Azure Container Instances (ACI)&lt;/a&gt;. Como não achei nenhum tutorial fácil de como fazer isso, resolvi escrever esse artigo, e aproveitei para aprender um pouco sobre o &lt;a href="https://github.com/Azure/bicep" rel="noopener noreferrer"&gt;bicep&lt;/a&gt;, nova linguagem para fazer o deploy na Azure.&lt;/p&gt;

&lt;p&gt;Para rodar o servidor do minecraft no ACI, e manter os dados salvos quando baixamos ele, precisamos de 2 recursos, um Container Group que vai rodar o servidor e uma Storage Account, que vai guardar os arquivos entre as paradas do servidor.&lt;/p&gt;

&lt;p&gt;O primeiro recurso que temos é a storage account, onde declaramos apenas o tipo, localidade, nome e SKU (desculpem pela falta de syntax highlight, o dev.to não suporta ainda a linguagem bicep):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;resource storageAccount 'Microsoft.Storage/storageAccounts@2021-04-01' = {
  name: 'exemplominestorage'
  location: 'brazilsouth'
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Além disso, precisamos declarar um storage share (compartilhamento do Azure Files), que será anexado ao container. Esse share depende da storage account, e declara o nome do share apenas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;resource storageShare 'Microsoft.Storage/storageAccounts/fileServices/shares@2019-06-01' = {
  name:  'exemplominestorage/default/minecraftdata'
  dependsOn: [ 
    storageAccount 
  ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por fim declaramos o ContainerGroup, ele depende do storage share, declara um container e liga o storage share nele, alem de colocar algumas variaveis de ambiente mais comuns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var whitelist = ''//coloque aqui seus usuarios separados com ,

resource containerGroup 'Microsoft.ContainerInstance/containerGroups@2019-12-01' = {
  name: 'exemplomine'
  location: 'brazilsouth'
  dependsOn: [
    storageShare 
  ]
  properties: {
    containers: [
      {
        name: 'exemplomine'
        properties: {
          image: 'itzg/minecraft-server'
          environmentVariables: [
            {
                name: 'WHITELIST' // Lista de jogadores que podem conectar
                value: whitelist
            }
            {
                name: 'OPS' // Lista de jogadores que podem dar comandos
                value: whitelist
            }
            {
                name: 'MAX_PLAYERS' // Quantidade maxima de jogadores
                value: '2'
            }
            {
                name: 'ENABLE_COMMAND_BLOCK'
                value: 'true'
            }
            {
                name: 'MOTD' // Mensagem mostrada no server
                value: 'Ola da Azure'
            }
            {
                name: 'MEMORY' // Memoria alocada no java
                value: '3G' // Usar menos memoria que a disponivel no container, não funciona se for o mesmo
            }
            {
              name: 'EULA' // é obrigatorio o aceite do EULA do minecraft
              value: 'true'
            }
            {
              name: 'VERSION' // Versao do minecraft a ser rodada
              value: 'LATEST'
            }

          ]
          resources: {
            requests: { // CPU e memória alocada para o minecraft
              cpu: 1 
              memoryInGB: 4
            }
          }
          ports: [
            {
              port: 25565 // Liberar a porta para acesso publico
            }
          ]
          volumeMounts: [ // Ligar o volume de dados no container
            {
              name: 'acishare'
              mountPath: '/data'
              readOnly: false
            }
          ]
        }
      }
    ]
    osType: 'Linux'
    ipAddress: { // Liberar a porta no firewall e dar um nome publico pra ele
      type: 'Public'
      ports: [
        {
          protocol: 'TCP'
          port: 25565
        }
      ]
      dnsNameLabel: 'exemplomine'
    }
    restartPolicy: 'Never'
    volumes: [
      { // Ligacao com o fileshare criado
        name: 'acishare'
        azureFile: {
          readOnly: false
          shareName: 'minecraftdata' // nome do share
          storageAccountName: storageAccount.name // account
          storageAccountKey: listKeys(storageAccount.name, storageAccount.apiVersion).keys[0].value // obtem dinamicamente a chave de acesso para o account
        }
      }
    ]
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto, depois disso é só compilar o bicep e transformá-lo em ARM template, e de posse do ARM, importar ele como template na Azure.&lt;/p&gt;

&lt;p&gt;Se você preferir usar um ARM pronto, é só clicar nesse botão, preencher as variáveis e fazer o deploy:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2Fandreracz%2Fminecraft-on-azure%2Fmaster%2Fvanilla-aci.json" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Faka.ms%2Fdeploytoazurebutton" alt="Deploy to Azure"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Depois de terminado o deploy, entre no recurso criado, obtenha o FQDN:&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%2Ft3hp0ofr4luovwam03bb.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%2Ft3hp0ofr4luovwam03bb.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Acesse no modo multiplayer do minecraft, em Add Server, digite o nome e a URL do seu servidor, clique em Done:&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%2Fg55zhf8saggghj2y0ba2.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%2Fg55zhf8saggghj2y0ba2.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pronto, seu server está pronto para iniciar. Happy Mining!&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%2Fu17l0txi4vq5i6bhcztx.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%2Fu17l0txi4vq5i6bhcztx.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Não esqueça de parar o servidor quando não estiver usando, para não gastar seus créditos! &lt;/p&gt;

&lt;p&gt;Deixo aqui também o link pro github que criei com esse projeto, já com parametros para facilitar a nossa vida: &lt;a href="https://github.com/andreracz/minecraft-on-azure" rel="noopener noreferrer"&gt;andreracz/minecraft-on-azure&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Se você quer ver mais posts, sobre como rodar servidores com MODs, como automatizar a subida e a descida to Container, ou outros sobre Minecraft, deixe seu like e comente neste post!&lt;/p&gt;

</description>
      <category>azure</category>
      <category>minecraft</category>
      <category>docker</category>
      <category>containers</category>
    </item>
  </channel>
</rss>
